Ticket #1282: remove-mac-app.darcs.patch

File remove-mac-app.darcs.patch, 212.6 KB (added by davidsarah, at 2010-12-26T02:40:26Z)

Remove unmaintained Mac GUI app.

Line 
12 patches for repository davidsarah@dev.allmydata.org:/home/darcs/tahoe/trunk:
2
3Sun Dec 26 02:05:08 GMT Standard Time 2010  david-sarah@jacaranda.org
4  * Remove unmaintained Mac GUI app. fixes #1282
5
6Sun Dec 26 02:08:58 GMT Standard Time 2010  david-sarah@jacaranda.org
7  * NEWS: remove unmaintained Mac GUI app. refs #1282
8
9New patches:
10
11[Remove unmaintained Mac GUI app. fixes #1282
12david-sarah@jacaranda.org**20101226020508
13 Ignore-this: b3613bf1abfd284d542bf7c753ec557a
14] {
15rmdir ./mac/macfuse
16rmfile ./src/allmydata/gui/__init__.py
17hunk ./src/allmydata/gui/amdicon.py 1
18-#----------------------------------------------------------------------
19-# This file was generated by encode_icons.py
20-#
21-from wx import ImageFromStream, BitmapFromImage
22-from wx import EmptyIcon
23-import cStringIO
24-
25-
26-def getData():
27-    return \
28-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\
29-\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x04\
30-\x1aIDATX\x85\xad\x97MLTW\x14\xc7\xff\xef\xbd\x997|\x8c\x86\xb1\x888\x0c\x06\
31-\x17\x80\x03\xa1\x8a\t\xa9\x8d5a\xd3t\xd3\xa4\xed\xae+\xe3\xa6\xe9\x02v\x8d\
32-\xdd\xb8\xd2%D\xb1\x06\x02]\xd9.\xba\xd0\xa4iBqaHHM\xcbnbGZeH\x8d\x16\xad\
33-\xed\x14\x91\xe1c\x98\xb9\xf7\xbdw\xcf\xe9\x02\x9c\xf2\xf1\xde\x9b7\xc8\x99L\
34-2\x99{\xce\xb9\xbfs\xee\xb9\xe7\xde\xabi\xba\x81\xa0\x12\x1eN2\xd9!\x90\x1d\
35-\xc2\xdb\x87\x92\xa8\xab\x8abY\xe41\xb34\x0b=\xec\xc00mX}\x19-\xb0C\x00\xd0t\
36-#\xd0\xd7\xb8\xde\xcd-\xa3\x1f\xf3\xcd\x99\t\xce\x895\xde*9\xb1\xc67g&\xb8e\
37-\xec#\x0e}u\x8a\x83\xfa\xd4t#\x18\x80q\xed4_\xb8s\x85\xcbIN\xac\xf1\x85;W\
38-\xd8\xb8v:0D\xf9\xc9\x87\xba\xf9\xfc\xc4eV;>S\xf3)\x9e\x9aO\xf1\xfdlf\xd7\
39-\xd8\xf9\x89\xcbl\\\xef\x0e\x06\xe1W\x03\xa1\x1b\x1d|&\xf6.\xee~:T\xfao\xe2\
40-\x8fi\\\xfci\x04\x7f\x15\x9e\x03:\x03\xa4!Q\xd3\x8c\xc1\xde>|\xd8z\xb6\xa4w\
41-\xe6\xdb\xcf\x90\x113\xb0\xfbg\xfdk\xa2\\\xea\xc7\x9fL\xf1\x92\xbd\xc8K\xf6"\
42-\x8f\xa4o\xb16\xd8\xc3\x91\xd1\xcem\xd1EF;Y\x1b\xec\xe1\x91\xf4\xad\x92\xee\
43-\xf8\x93\xa9@K\xa1\xfb\xc1\xc5\xab\xe2\xe8ij\x83$\x81\x97\xc5W\xb8to\x0cf\
44-\xb4\xb0\xab\xd2\xad\xbe\x8cfF\x0b\xb8to\x0c/\x8b\xaf I\xa0\xa7\xa9\r\xf1\
45-\xea\xb8\xff\x0e\x00\xbc\x01B7:\xf8\x9dD\x12\x92\x05$\x0b|\xf7p\x12y\xe4<\
46-\xb7\x99\xd5\x97\xd1\xf2\xc8\xe1\xc7\xc7\xd3%\x9bd\xfd1\x84\x87\x93\xbc\'\
47-\x00\x008z \x06I\x02\x92\x04rb\x15\x9a\xa1|\xa3\xd1\x0c\x85\xf9\x95l\xc9\xa6\
48-\xbd>\x01&\xff\x12\x08\xf9\r:\xec@\x92(\xfd\x0e"\x95\xda\x94\x01\xb0\xb78\
49-\xb3\x03\x02Tf\xe3\t\xa0\xa4\t\x87\x1d\x08*\x02\x00\xea\xa3Qt\x1e\xec\x00\
50-\xbe\xe9\xf0]\xd3\xfah\xb4d\xe3\xb0\x03%M_\x00\xd7>\xa0\r\x9e\xe2/\xce~\x82\
51-\x0f\xdaO\x96\x8d\xa0\x9c\xdc\x9d{\x80\xab\xd3?\x80/\xa6]\x8b\xc15\x03-\x07\
52-\xe3\xe8mm/\xa5\xf2M\xa4\xb7\xb5\x1d\xdf\xff\x16\xc7S\xa4]\xc7]\x01\xaa\xcd\
53-\xf0\xbeL\xbe\xd5\x9f\x97\xb8\x020\x13\xc4>\x020Se\x00\x04\x82do\x80\xb9\xec\
54-\x02&\x1feP\xb0,\xd4\x98&\xde\xef8\x81\xf6\xc6\x06O}B\xa5\x00L\xa5J\xde)\x0f\
55-\x9e\xfd\x83\xaf\x7f\xfe\x05\xe1\xda"\xec\xfeY-<\x9c\xe4\xfb\x93\x7f\xe2\xf3\
56-s\xef\xe1\xe4\xb1\xa3\xee\x00{\xca\x80\xcb\x12,;K\xb8\x9dJo;\x0f\xec\xfeY\
57-\xcd\x1c9\xc1\xb7S\xbf\xe2\xad\x06\x0bu\xa1\x18\xc2\xba\xb9\xcb\xdf\x1e\x00$\
58-\x14;X\xb0\xb3\xf8\xd7z\x81U\xb5\x02b\x85e\xa1\x83\xbf\xdc}\x18\xd9\x03\xd5<\
59-\x99\x1b\x07\x81P\xa5W\xe3p\xf8\x08\x8eW\xb5\xe1\x88\x19\xaf\x1c\x80\x99\xf0\
60-B>\xc3\xbc|\x0c\x8b,\x10\x14\x14\x13\x88\x15\x98j\\\x1d1i\x90,A\xacP\xa0u,\
61-\xda\x0bx\xb8\x9e\xc6a\xb3\x11k\x8ew}\xb8\x1eFy\xb5\x86\xb9\xe2\xef(\xa8\xf5\
62-\xcd\x83E\xc2\xa2\x8d\x13\xae\xb1Y\xc0\x18\xea\xda\xd6\r\x8d\xa1.\x8e5\xadl\
63-\xeaHX$7\xecX\xe2\xb9x\x8aU\xb5R\x19\xc0\xeb~.Y\xc2\xe2\xff\x9dY$\xd1p|\t\
64-\xb5Q\xa7\x04a\x0cuq\xa4V\xa2\xae\xe5\xefM\x1d\x01\x8b$\x1c\xb672\x06\xdf\
65-\xce\xed]\x03\x16I((\x10+\x106\xd2\xafX\x81\x0cB]3!\xff\xa8\x11\x00\xc0\xac\
66-\xe1@"\x0bG/\x80\xc9\x7f\xb2\xe0\x00\xbc\xd1\x07\x88is\xfd\xb7C\xd8\xac\xef\
67-\xd2/\x17iE\x00\xbc3\x03L\xdb\xb2\xe1\x90wk\xdd\x17\x00\x02C\x92\x00\x816\
68-\xa3W`\xe6=GY9\x00\x13,\x96\xbe\xa9%+\x04m\xa0\x9b\xc9\xaa\xec%\x16\x08\x80\
69-\xc1P\xec}\xff\x8b\xd4\xad"q.\xf5F\x13\xbf\x16\xd7mHN\xf0\x07k\x10\xf1\xf3\
70-\xe7\n\xa0\xa4\x89\xe2bl_&/.\xc6\xa0D\xc4s\xdc\xf3i\xa6\rt\xb3Q%\xa1\x87\xfc\
71-\xaf\xe2~B\x8e\x01%M\xcf\xeb\x18\x00\xfc\x07\x9aY\xdf_&\xed\xfd\xe8\x00\x00\
72-\x00\x00IEND\xaeB`\x82'
73-
74-def getBitmap():
75-    return BitmapFromImage(getImage())
76-
77-def getImage():
78-    stream = cStringIO.StringIO(getData())
79-    return ImageFromStream(stream)
80-
81-def getIcon():
82-    icon = EmptyIcon()
83-    icon.CopyFromBitmap(getBitmap())
84-    return icon
85-
86-
87rmfile ./src/allmydata/gui/amdicon.py
88hunk ./src/allmydata/gui/amdlogo.py 1
89-#----------------------------------------------------------------------
90-# This file was generated by /opt/local/lib/python2.4/site-packages/wx-2.6-mac-unicode/wx/tools/img2py.py
91-#
92-from wx import ImageFromStream, BitmapFromImage
93-from wx import EmptyIcon
94-import cStringIO, zlib
95-
96-
97-def getData():
98-    return zlib.decompress(
99-'x\xda\x01\n\x0f\xf5\xf0\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x006\x00\
100-\x00\x006\x08\x06\x00\x00\x00\x8cEj\xdd\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\
101-\x08d\x88\x00\x00\x0e\xc1IDATh\x81\xbd\x9ai\x90\\Wu\xc7\x7f\xe7\xde\xb7\xf42\
102-\xdd\xa3\x914\x92,\x8d$[\xdedIF62\x8b\xb0\xc16\xa0\x02C\xb1\x84J\xfc!T\xd9\
103-\x15\x12Ha\x96PT\x92\xa2\x12 \xa4(Hp\x80\xa2\x1c\x8aP\x10\x92\x94M\x9cJ\x11\
104-\x02$\x80C\x19\x8c\xcdb\xcb\x06\x83\xe5\x05!,dY\x8b5\xb24\x9a\x99\xee\xe9\
105-\xe5\xdd\xf7\xee\xbd\xf9\xf0^\xcf\xa6\x91=\xd3\x92y]\xb7\xdf\xed\xb7\x9cw\
106-\xfe\xf7\x7f\xce\xb9\xe7\xdc\xd7\xc2\x1d\xaf\xe4\x05\xdf\xbc\x03\xef\xf3\xbe\
107-\x00(\x10yA\x1f\x19\xbc`\x92m:\x80\xcb\xde\x80\xe8\x9daT=\xaf\x16\x96\x97\t\
108-\x12\xa6\xce\xb6\x1bfj\x8c\xb4{\x10\xf86A\xf8sD\x9f\xf3\xc7\x9f{`.\x1b\xc1\
109-\xd9?\xbct\xf9\x85\x7f\xbcs\xd5E\x97l]\xbe\x96-\xcb\xd6\xb1\xa2TE\x10\x8c\
110-\xb3\x1ci\x9db\xcf\xd8!\xf6\x8e\x8f~\xe4\x87\xc7\x1e\xffv\xa33\xf6/\x84\xa5o\
111-\x15t\x9e\x93M\xce\xa9)f\xc9\xf5C\xa5e\xb7\xdf\xb2\xf5\x8d#o\xbf\xe8%\x04\
112-\xda`|\x82\xb1\x19\xd6[<\xa0D\x08$ R\x01\x91\xaap\xa8\xd9\xe63{\xbe\xc3w\x9e\
113-~\xe0\xbfP\xfaOQ\xfa\xd4\xb9P\xe5\xdc\x01K;\xef\xbb~\xfdK?\xfb\xb1\x1do\rVWC\
114-\x1ai\x13\xeb=R\xb0\xe0\x8bo_|{\x1c\x16GY\x87D\xaa\xca\xcf\x8e\x8d\xf2\xe7\
115-\xbbo\xff\xf5d2y#:z\xecl\xd5\xd1\xbcm\xe3\xd9\xca\x80\xb4{\xcb\xef]x\xfd\xe7\
116-?\xb3\xf3F\x15\x06\x1d\x1aY\x1b\x07\x80\xc7b\xc9\xc8\xf0bq\xe2\xc8HI\xc9\nX\
117-\x8e\xae7\xb4|\x93\xf3\x87\xea\\\xb3z\xfb\xca\xdd\xc7\x0f\xbc\xb6\xd1\x9d\
118-\xb8\x0f\x15\x1c?\x1b\x95\xd49\x00\xf5\xa6\xab\xd7]\xf9\xb9O\xbc\xec\xad4\
119-\xdc\xb34l\x87\x8c\x0c\x83!\xa1K\x1c\x06\xd4\xc2A\xbc+\xd1\xcd4\xb1\xaa3\x18\
120-\r\xe2\xb5\xa3K\x17C\x8a\xc1r\xcc\x9cd\xdd\n\xf8\xe8\xcb\xdevq=\xaa\xfd;\xde\
121-V\xceF\xad\xb3c\xcc\xd9hYi\xd9]\xb7]s\xd3r\x82I\xda\xce\xe0p\xa4\xa4(-T\xf5\
122-\x10\x0f\x8f\x9e\xe4\x0b\x8f\xfe\xd0}\xf1W\xf7M\xde\xb9\xff\xa1\xd6\x0f\x0f\
123-\xef\xf3\xc7\xa7\xba\xd1\x05\xb5\x11\x06+!-\xdf"-\xd8\x9b\xb4S\\0\xb4\x8c5\
124-\xa5\x91U\xf7>\xfd\x88\xa0\x83{\xfaU\xed\xec|,3\x1f\xfc\xe4\xce?\xfa\xcc\xeb\
125-6\xad\xe7\xd9d\x0c\x10\x1c\x96\x81\xb0\xc2\xc4T\xc8\xc7v\xffw\xfa\xcb\x93\
126-\xfbo\xc5e_C\x07\xcf\x80dx[\xc3\xda\xcd\x95\xb8\xfe\xc1?\xb8\xf8\xea\xd7\xdd\
127-\xf4\xa2+9\xe9\x8e\xe1|\xe1\x7fb\x19\x94a>p\xf7\xb7\xba\xfb\xc7\x0f^\x82\x8e\
128-\x0e\xf7\xa3Z\xff\x8c9\xbblye\xc5W\xdf\xb3\xfd\x9a\xda\x94?E\x86\xc7\x92\x11\
129-\x06\x9a\xb1\xa6\xe6\xcf\xee\xbd\xe3\xe9\xdf\x8c\x1f|#Ax;:<\x8e\xa86\xa2\xba\
130-(=\x89\x0e\x7f\x9b\xfa\xec\xab{\x8e\xed\xed4\xd3\xf05\xd7\x8c\\(\xe3n\x1c\
131-\x8b#\x15\x8b\x0e\x1d\x1b\xe2\xf5\xc1=\x87\x9e8\x8aR\x0f\xf4\xa3^\xff>f\xd3K\
132-\xae[\xbbem\xb9\xech{S\xf8TBU\x86\xf8\xa7G\x7f\xdc<\xd28z\x13ai\xf7\x19\xe7&\
133-Q\x10\x97o\xfd\xc6\xbe{\xbf\xfc\xfd\x03\x07)G1F\x0c)\x19\'\xb3S\\\xbaf\x905\
134-\x03\xc37\xe1l_sm\xff\xc0T\xf0\xb2k\xd7]\xca\x94\x9f*\x02\x80!\nC\xee9\xf4\
135-\x14\xf7\x1e\xfa\xf9\x9dD\x95\x1f=\xbf\x10\x01\xa5\xfe\xea\xdb\xbf}\xf4H\xec\
136-\x06I\xa4\x9b\x0f\x907L\x05c\xac\xa9\xd6\xb7\xe1\xdc\xd6\xbe\xd4\xeb\xe7&\
137-\xbc\xa3\x1a\xd7^\xba\xb6^e\xd26HII0X\x0f\xdf=\xf8\x88G\xfc\x9d\x8b\x96\x15D\
138-\xa7\xf6\x9e:t\xc7\xc1\x93M\x02\xad\xc9\xb9\xcf\xe8\xaa6k\xebu\x85\xf7\x9b\
139-\xfaQ\xb1O`\x9e\x81\xa0t\x9e\x0e\x1d\x1d\xdf\xc5H\x8aQ\x06\xe3<\xe3\xdd\xce\
140-\tD\xedY\x92<k\x9e\xdc?~\x12\xad4\xdd\x02\x9aQ\t+\xaaU\xf0\xd4\xfaQ\xb1\xef\
141-\\QDTFF"\x06\xbc`\x8b\x8f\xc7w@\xd2%\t\xf3t\xdaiB&\n#\x06\x80\xc4\x1bJA\x00"\
142-}\xe9x6I\xb0O\xc90\xa4\xf8"\xcc\xa7d\x90G\x8b\xa5f\xb3\x82\xd0\xe3\n\x0f\xc4\
143-\x04\xb8\\=\xdf\x8frg\x95\xddgX\x12\x0cL\x03[\x1aQ\xb37\x87\xc3\xe0\x8a\x81\
144-\xcaA:4\xfdf\xfcg\t,O\x9d@a\xb1\xa4\x92\xf5-\xcb\xe31\xa4$\xa4 `$\xc0\x11\
145-\xf7-\xaf\x0f`\x1e\xbc\xc7{o32\x12RD\x14V2R\x9f\xe2\xbdsx\xdf\x9a\xae\x98\
146-\x17%\xd2w\x1d.\x0fB\x85\x8f\x194\x0e\x0b\xdew\xf1\xbe n\xf1\xec-\x11\x98\
147-\xbf\\\xbc~\xb7\x12U\x0e%\xdc\xe6\xc4c$A\xbc&##\xc3\x12H8\xac%\xbc\x03\x82\
148-\xdc.\x0b]\x9eC%\x0f\\\x18\x10\x90\x15\xf3\xa1 \x18\x02\x14\x9a\x80\xe8\x16\
149-\x91`W\xea\xd2\t\xc4\x7f\n\x91Ee\xfd\x8b\xcf\x15\xbd\xafT\xc2\xd2\x9e\xf7\
150-\xed|\xd5E\xa5\x18B\x89\x08\xeb\x1d\x8e\xfa\xc3(\x14\x19\x19\xcbe\x05As9m\
151-\xdb\xcdo\x91^\x15\x96\x7f\xfb9U\xd9\xac\xf3\xce\xb3\xacZ\xe6p\xe97\xb4\\\
152-\x1b\x00-\x8a\xf5\xc9%L\xb53D{\xa4U\xe1\x8b\x0f\xdc\xff\xe5n\x96\xbck1\xeb%\
153-\x8bg\xcc\xfbrIE\xab\xc2\x15\x934\xa3S8\x0f\xc6Z\x04\xe9ECF\xfd(zp\x14\xa4\
154-\x07c\xee\xc7\xf5z2\xef\x8cx\x8e:\x8b\xcf\x8b\xb8\xfc:\xef\xd8[\xfa%\xaa"X\
155-\x95\xb2\xa3\xbe\x93\x81\xa0\xb2\xa6\x9bv\x17\xb5\x10\xb4\x14S\xf4\x1e\x9f\
156-\xb5\xad\xa1e\xf3\xb9\xeb4\xd5\xc5\x93\xbaY\x00\x168?\x1b$\xf3\xfa\xa7\x01\
157-\xf7\x1eg=\xd6\xa5t2\x03\xf8EG\xa7%\x07\x8f\x9e\x1f\x80,8\xfan\xba\xfc\xef\
158-\xa9\t^f\xc3\x98\xcb\xde\x82\x80\xe6]\x97a\xc8XZ\xc4]2\xb0\xb4\x17\xe2E\x9d\
159-\xd1\xdc(\x94tx\x1c\xaeX\x1a\xf0 \x1e\xe7\x1d\xde\x83BOCu\xd3\x80`>\x7f9\xb0\
160-\x94\x0c\xfb\x02\x02\x13H%\xc5HZ\x98\xe2lEr\x10^ \x9fn\xf3y\xa9\x16\x94Y/\
161-\x1b\xf0I\x88\xb3\x1e\x15\x80\x89[\x1crG\xe8X\x83F\x9f\xc9p\xa7\x99\xcc\xc4\
162-\x90\xc9\x0b\t\x8c\x9c\xb1\x04\x83\xa0\xe6<|\xae\xff8P\x8e\r\xb2\x91\xf2\xe8\
163-\x08O\x1c\x18\xef\xec;1z\xa8\x9b\xa5\x9dZ\\\xaam[\xb3\xf6\x82\xcd\x9b\xd6\
164-\xa9c+\xf6q\xd8\x1e\x01\x9f\xe7\xe2\xc5\xd0\xcc2\xe1\xbc\x97\xfenL1\x9d\xce6\
165-\x98cF\xb3FYYv\xf8\x97\xb0\xfb\xa7\x1d\xee\x7f\xfa\xfe\x7f\xf5\xde|\n\xad\
166-\x9f\x02I\xc7\xba\x93\xa5\x83\xe3\xcf\\\x1e\xed+\xff\xed\x9b\xb6m\x7f\xfd\
167-\xa5WTx\xd8>B\xe4\xa3\x99\xfb\xe7\xc9LI\xb1K4\xc5%\x97-\xbd\xc4\xd7\x14&\x99\
168-\x17\x993\xad--\xce\xf7\x9bxhw\x92\xfd\xf4\xa9\'\xfe\xc4\x07\xfe\x1d\x84\xd1\
169->\x946(\xe5\xd1\xbaC\x18=dTv\xc3\xd7\xf7\xfc\xecS\x13\x8f\xad\xe4\xe2\xf0\
170-\x02Z\xd2\x99\x96\x99\x0f\xdd\x8c\xcc\x04C\xb6\xc4<ti\xc0|\xeec\x89\xf4\x96\
171-\x02z\xf9x\xae@\x87\x84\xc1p\x00\xf3\xf4\n~\xbc\xff\xf1\xcf\x13\x85_9\xf3\
172-\xd2\x80@(\x1f\xba\xeb\xd1}\xdf\r\x8f\x9e\x87U&\xaf\xed0\x18\xc9\xc8$\x9b\
173-\xf6\xe7\xbc\xf4\xfc\x1d\xf8\x98!\x9d\xf6\xb1\x9e? \x1e#\x86\r\xeer\x1e:0q\
174-\x14\xcdG\x9fW\x98(\x92\xac\xf5\xd9\x03\xbf\xed\xde`KN\x0e\x99ch\xad\xd1Z\
175-\x13\xe8\x800\xd4\xe8@c\x83l\xc9\xa6\xd8\xb7\x8f\tz\xba\xf2r\xde\xd1\xcd\x12\
176-&\x92\t\xa6:\xb0\xff\xd4\xb3\xf7\xa3usQ\x02\x95\xfc\xa81\x95=9\xe2\xd7_r\xc0\
177-\x1d!\xf3\x96\xe98!\xf9\x9a\x8f\x04\xc2\x94\x9aZR\x01\xd3\x17c\xa9d\x08\x9en\
178-\xdae\xb2\xdd\xa4c\xba\xb4M\x07/\x9e\xb6\xb1t2s\n\xb5H5D\xd2\xa9\xc4\x1c\xba\
179-\xc0\xd7.A1c\xb9\xc5\xde\x03\xdez\xb2^\xbe\xb5\xc8\xad/\xc6Nu\'\xe8\xb4\x12\
180-\x1a\x9d)\xbc\xf3\xd3\xcc\x89\x06\x15:B\xa5+\xc6g\x8b{\xb9\xe7=q\x10,K\x95\
181-\x99\x0bj^\x7f\xa9\xef\t\x17\x1f<D\x10\x81c\xa7\x9ee\xf4\xc4I&[\xcd\xdc\xbbt\
182-!E\xe5/.Me\x825\x03\x83\xdbX\xec\x08{\x7f\xf1P5\xdez\\?\x93\x83X\x80\xb5~\
183-\x8a\xe8%EE\xef=If\xf2\xbbzU\xfb\xbc\xf6\xb8\xec\xe1\xb2u\x83W\x90\xf9\x9b\
184-\x17\'4\xbc\xa5\xba*)?\xe9\x0e,(\xaf\xd7\xd4\x12\'\xa6%\xcfc\xa2\xe49\x158\
185-\x94\x8e\xd2]\xfb\x94lZ\xbe\xeeV\xb2l\xcbs\n3\xe9\x8d/\xdfx\xfe;\xcc\xc8A\
186-\x12\x9b\x9d&K\x04\x02%h\x05\x91,MU\x85\xcbXR\x19\xcf\x99A!\x80\x87_\x04\x0f\
187-\xb1cG\xb4j]m\xf8\xfb8\xf7\x16 \x9a\'\xa1\x8as7o^\xbd\xe1\xf6\xda\xb6\xd1\
188-\xfa\x83\xf6\xe1\x19\xb9\xcc\x00\x8a\x95\xa6\xac4\xe5~\x80\r\x95\x86rm\xb2dF\
189-r\xbf\xa0\n\x1fifm\xfe7\xfa\x1a\xaf\xb868o\xf3\xf0\x9aob\xed\x85sdX\xfb\xcam\
190-k\xd6\xfe\xdb\xc8\xd5\xc7\xe3{\xf4\xdd\xf9\xb8\x16\x7f$\x08\x95PR\x9a\x8a\
191-\xd2T\x94\xa2\xac4\x15Q\x8b\x07f\x13\xc8\xba\xa8\xdf\xbc\xe5N\xee\xde\xf59v\
192-\x0co\x81d\xe2y\xd9\x93y \xe6\xecg\xb5\xaeMyP\xdf\xcf\xb2\x81\xd8\xe2\x0b\
193-\x93\xef\xc9\xf6\xe8z5\xe4W\xea\t\xac\xf3(\x81PT\xc1N\x0ej\xba/\x8a\x8aR\x84\
194-\xa2xN\xcd\xbc\x83\xa4\xc1\x8e\xe1m|\xfd\xd5\x9fF\xad\x8c\x07y\xed\x9a\xab\
195-\xb8{\xd7m\xfc\xc5\x15\xef\x04g\xc0-\x90I\xf7\xa4>\x0f[\xd3{\x05\x01\x01\xd6\
196-\xb9\xa2\xba\xc9\xf2\x87\xbb\x0c\xbcx\xe7=\x91Dh\xc5i`\xcaJQ\x16\x9d\xb7\xe2\
197-X\xfc\\\xf1\xde\xa5\xe02>\xfc\xe2[\xf8\xc1\xae\xdbx\xdb\x86W\xcd\x04\x8f\xa1\
198-\xa8\xc6\xad;\xde\xcb\xdf]\xf5~b\x15\x805,h\x9a\xb3\x810o\xbf\xd0\xfc\x83@\
199-\xda\xe6\xca\x95\x97\xf1\x8d\xeb\xff\x9e\xd5\x95a\xb0\x1d\x04(\x89\xa2\xa4d\
200-\x06Laz%\xd13\xfd\x02Xx&S\xb4\t5]\xe2\x9f\xaf\xfe\x08\x1f\xbf\xf2]\x0c\x86U`\
201-\xd6\x04\xed\x8b7\xfc\x1f\xda\xfav^\xber\x0b7\xde\xf7\xd7\x9ch=\x0bau\x16]\
202-\xcf\x01j\xa1=\xd0\xb1\t\xdbV]\x9e\xdd\xf5\x9aO\xb3:\x1eb\xa4\xba\x8a7\xfc\
203-\xdf\x07l\xe6\xed\x1cv\x02\x84@\x84@)\xc2^_\x84P\x14\xa2\xdc\xc2>\x96\xb6X_\
204-\x1b\xe1?\xaf\xfd$;\x87\xe7\xbem\x9asuo\x01\xe5\xba\xd5Wr\xf7\xae\xdbx\xf1\
205-\xf0VH\x17H\xf9\x16\xf0\xa9\x85\x9a\x13\x8f\x88\xf0\x89\xed\xef\xde\xba:\x1c\
206-\xba\xcc\x18\xf3\xa2\xab\x96_z\xe9\x87\xb7\xbfk\x93\xb1)%Q\xd3&X\x99\xe3SE\
207-\xf0(\x98\xab(M4\xdf\x14\xcd\x14\xaf\x1d\xb9\x86\x9f\xdc\xf0%v\x0eo\xc5\xcf\
208-\x8b\rgL\xa9\xb6\x0f]\xc4\xf7v\xdd\xc6\x9b\xef\xf9K\x1ex\xe6A@Ci`f(\x16J\x7f\
209-\xe6\x1d\xd7J\x88t(\xc7\xf6\x1e\x1c\xf9\xc5A\xd5\xed8\x13\r\xe8R\xb7\xd1<q^\
210-\xb4,\x98ez\x8a\x00U0T0\x85B\x17\xbf\x95rD*_B \xeb\x02\x96\xb7n\xba\x81;\xaf\
211-\xf9\x1b\xcaA\x8cs\x0e\x99\x07\xfc\x8c\xc0\xbc\xf7\xac\x8c\x07\xf9\xc1\xae\
212-\x7f\xe4+\xfb\xff\x87\xbb\x8e>\x90\xed>\xb57\x17\x9e\x17\xcf\x0b\x9a\xa0\x00\
213-Z\xf2\t\xad\xa2\x02\x9c\xf5\xf2\x1f\x8f|\xef\xa2\x9f\xd8\xc1r\x8a\x0b#\xb4\
214-\xd9\x1b\x9e\xd8\xa8^\xa1(\xab\x80\xb2\xe4>\xd53\xbd@f\x9b\xa2"\x14A\xab\xfc\
215-\xbdK\xa4Bw\xe5\xca\xcd\xbcf\xddN\xfe\xe1\xc5\xef\xc9\xad\xc2-\x9c\xba=o\x12\
216-\\\xd6\x11\xef\xdd\xfc\xfb\xdc\xbc\xe9\x8d[\xae\xf8\xee\xcdq\xc7\xdb\x05}I\
217-\x04\x02\x99\x19u\xb0\x04\xde\xb3}d\xa5:p\xdd\xd8\xfb\x0f\xabg\x11\xc9\xff\
218-\xa73h\x85\xcd\xabVq\x18OE)b\xd1\xd3L\x05"\x04\xa89\xbf5\x1a\xe3\x12\xae^\
219-\xb9m\xe5\xd7\xae\xfd\xf8 0\tg\x06u\x1a\xb0YtF"Ru\xceU\xad\xb55o\xddUGN<s\
220-\xb9sN\xc9\xbc$U\x15\x0c\x85\xd2SF\x15\xca\x05L\xb81~5\xf2MJ\x1b\x03\x02a\
221-\x96\xb9)\x8exG\xcb6\xa9\xaa\x88h\xfa\x1eE\xa0\xa4`,?&\x80+\x1e\xa8\xad\xaci\
222-O\xb4\xde\x19V\xc2GD\xa9\x03Z\xeb)\x11i\x03m`\x0e\xca\x1e\xb0\x92snU\x9a\xa6\
223-\xf5$I\x96w:\x9dz\xab\xd5\x8a\x9b\xcd\xa6dY6X\n\xa2mO\x9e8\x14Yk\x85"WT\xc8\
224-\xb4\x0f\x04s\x80I\x11\xe1\x14\x81@\xc3\x8d\xd3\xf1s#]\xcf\xc4b\x15\x10\x8a\
225-\x9ecz\x81\xca\xef\x9f?\xd1(\xa5i6\x9a\xfa\xb1\xc7\x1f[S\xaeW\xaeK\x92d\xa8Z\
226-\xadR\xadV\xd3j\xb5\xda)\x97\xcb\xe3Q\x14\x8d\x07A0."\'\x03\xa0j\x8cyu\xa3\
227-\xd1\x18h4\x1a\xae\xd1h\xf8F\xa3\xe1\x9a\xcd\xa6o4\x1a\xb6\xd3\xe94W\xad\x18\
228-n\x9cl\x8f\r{\xed\xf1\x92\x9bb \xbeh\x85\t\xe2g\xd8\x12!\x14?\xcb4)\x02\x820\
229-;@\x04\xe2\xa6\xaf\x0b\x11\xb4\xf8\x82\xa1|\xeb\xc59G\x8a(\x8f1\t\xa3\xc7\
230-\x8f\xdb\xe4h\xf7\xe4T\xab\x95\x0e\x0e\x0e\xaaZ\xad\xa6\xeb\xf5z\xad^\xaf/\
231-\xab\xd7\xeb\x9b\xea\xf5\xba\x0c\x0c\x0c\xec\x0b\x00\xa3\x94:\x1cE\xd1\x868\
232-\x8eK\xa5RI\x8c1:MSo\x8c\x91$I\xd2\xb1\xb1\xb1_\xeb\x01\x1d\'>\x8d\xb6\x84\
233-\x1b9/.\x11\xf9`\xc6\x07z\x0e\xaf\x04=\xcb\x8cr\xff\x10B\xa5\x08\n\x8659@M\
234-\xce\x8c.\xda\xe9\xa9\xc0\xec\xf0\xed(\xf9\x01\x8cX\xdd\xedt\x9e\x9el5\x8e\
235-\xd5\xea5]*\x95T\xa9T\x92R\xa9$q\x1c\xfb8\x8em\x18\x86\x13\xc0\xa8\xf8\xfc%\
236-\x1e@\xd997\x94\xa6i\xd9\x183\x90$\xc9`\xb7\xdb\xad\xb4\xdb\xed\xb85\xd5R&1\
237-\xfa\x0b\x8d\xbbnzB\xff\xfa\xf5\x95(\x0e\x05\x01\xe7g\xe6\x0f\xef\xe7\x0c\
238-\xb4\xf4z\x02\xd2\xfb\xd7\xac\xe4g\xe6\xc4\x1e\x99\x03J$wt\x11\x11z\xcd{\xe7\
239-&Mbn\x90W}\xe9\xcd\x03/\xf9~X\x8d\x83J\xa5\x92V*\x95N\x1c\xc7SQ\x14M\x86a\
240-\xd8\t\xc3\xb0\xa9\x94\x1a\xf7\xde\xfbi`\xb3\'\xb8\\\x98\x87\xbc\x9c\x8c\x9d\
241-seA\xa241\xe1c\x13\x07\xd7g\xdeV\xc51d\xad\xad\xa7Y6`\x12S\xeb&\xddJ\x92$a\
242-\x92\x18mR#i\x9ab3+\xd6fX\xe7\xe6\xc8W"(\xad\t\x82\x80 \x08|\x18\x86>\x8a"\
243-\x17\xc7\xb1\x8d\xe38)\x94m*\xa5\xa6\xb4\xd6\xe3\x99\xb8F=\xa8\xb4/\x1f\xdax\
244-\xc4k\xb1\xa2\xa4\x0bt\x94Rf\xb6\xee\xbd\x81\x008\r\xd8\xec\xbd\xf7y\xe6\xe0\
245-\x9c#\x08\x02lf\tu\x98\x87\xc2\xccA\xa0f\x87\xfc*\x8e\xaa\xcf\xec\x80s\xae\
246-\x92eY\xd9Z\x1b9\xe7\x94sN\x9cs\xd2{\xb8R\xca+\xa5\x9cR\xcaj\xad;A\x10t\x95\
247-\xd6-D\x9ahZ\x90\xaf\x8ezc\x11\xa5 \x10|j\xb12W75\xaf\xacVJM\x03\xfb\x7f\xee\
248-r\xc9\xfc\x835!h\x00\x00\x00\x00IEND\xaeB`\x82`\xcd|Q' )
249-
250-def getBitmap():
251-    return BitmapFromImage(getImage())
252-
253-def getImage():
254-    stream = cStringIO.StringIO(getData())
255-    return ImageFromStream(stream)
256-
257-def getIcon():
258-    icon = EmptyIcon()
259-    icon.CopyFromBitmap(getBitmap())
260-    return icon
261-
262rmfile ./src/allmydata/gui/amdlogo.py
263hunk ./src/allmydata/gui/confwiz.py 1
264-
265-DEFAULT_SERVER_URL = 'https://www.allmydata.com/'
266-
267-BACKEND = 'native_client.php'
268-ACCOUNT_PAGE = 'account'
269-WELCOME_PAGE = 'welcome_install'
270-TAHOESVC_NAME = 'Tahoe'
271-WINFUSESVC_NAME = 'Allmydata SMB'
272-
273-CONVERGENCE_DOMAIN_TAG = "allmydata_root_cap_to_convergence_domain_tag_v1"
274-
275-import os
276-import re
277-import socket
278-import sys
279-#import time
280-import traceback
281-import urllib2
282-from urllib import urlencode
283-import webbrowser
284-import wx
285-
286-from allmydata.util.assertutil import precondition
287-from allmydata.util import hashutil, base32
288-from allmydata import uri
289-import allmydata
290-from allmydata.gui import amdlogo
291-
292-from foolscap.api import Tub
293-from twisted.python import usage
294-
295-class AuthError(Exception):
296-    pass
297-
298-def unicode_to_utf8(uobj):
299-    assert precondition(isinstance(uobj, unicode))
300-    return uobj.encode('utf-8')
301-
302-
303-def post(url, args):
304-    argstr = urlencode(args)
305-    conn = urllib2.urlopen(url, argstr)
306-    return conn.read()
307-
308-def get_root_cap(url, user, passwd):
309-    args = {
310-        'action': 'authenticate',
311-        'email': unicode_to_utf8(user),
312-        'passwd': unicode_to_utf8(passwd),
313-        }
314-    root_cap = post(url, args)
315-    if root_cap == '0':
316-        raise AuthError()
317-    elif not uri.is_uri(root_cap):
318-        raise ValueError('%r is not a URI' % (root_cap,))
319-    else:
320-        return root_cap
321-
322-def create_account(url, user, passwd, subscribe):
323-    args = {
324-        'action': 'create_account',
325-        'email': unicode_to_utf8(user),
326-        'passwd': unicode_to_utf8(passwd),
327-        'subscribe': subscribe and 'true' or 'false',
328-        }
329-    result_code = post(url, args)
330-    return result_code
331-
332-def record_install(url, user, passwd, nodeid, nickname):
333-    args = {
334-        'action': 'record_install',
335-        'email': unicode_to_utf8(user),
336-        'passwd': unicode_to_utf8(passwd),
337-        'nodeid': nodeid,
338-        'moniker': nickname,
339-        }
340-    result_code = post(url, args)
341-    return result_code
342-
343-def record_uninstall(url, nodeid):
344-    args = {
345-        'action': 'record_uninstall',
346-        'nodeid': nodeid,
347-        }
348-    result_code = post(url, args)
349-    return result_code
350-
351-def get_introducer_furl(url):
352-    return post(url, { 'action': 'getintroducerfurl' })
353-
354-def get_config(url, user, passwd):
355-    args = {
356-        'action': 'get_config',
357-        'email': unicode_to_utf8(user),
358-        'passwd': unicode_to_utf8(passwd),
359-        }
360-    config = post(url, args)
361-    return config
362-
363-def get_basedir():
364-    if sys.platform == 'win32':
365-        from allmydata.windows import registry
366-        return registry.get_base_dir_path()
367-    else:
368-        return os.path.expanduser('~/.tahoe')
369-
370-def write_config_file(filename, contents):
371-    basedir = get_basedir()
372-    path = os.path.join(basedir, filename)
373-    dirname = os.path.dirname(path)
374-    if not os.path.exists(dirname):
375-        os.makedirs(dirname)
376-    iff = file(path, 'wb')
377-    iff.write(contents)
378-    iff.close()
379-
380-def write_root_cap(root_cap):
381-    write_config_file('private/root_dir.cap', root_cap+'\n')
382-    convergence = base32.b2a(hashutil.tagged_hash(CONVERGENCE_DOMAIN_TAG, root_cap))
383-    write_config_file('private/convergence', convergence+'\n')
384-
385-def get_nodeid():
386-    CERTFILE = "node.pem"
387-    certfile = os.path.join(get_basedir(), "private", CERTFILE)
388-    tub = Tub(certFile=certfile)
389-    return tub.getTubID()
390-
391-def get_nickname():
392-    nick = None
393-    nnfile = os.path.join(get_basedir(), 'nickname')
394-    if os.path.exists(nnfile):
395-        try:
396-            fh = file(nnfile, 'rb')
397-            nick = fh.read().strip()
398-            fh.close()
399-        except:
400-            DisplayTraceback('Failed to read existing nickname file %s' % (nnfile,))
401-    if not nick:
402-        nick = socket.gethostname()
403-    return nick
404-
405-def maybe_write_file(filename, contents):
406-    fname = os.path.join(get_basedir(), filename)
407-    try:
408-        if not os.path.exists(fname):
409-            fh = file(fname, 'wb')
410-            fh.write(contents)
411-            fh.write('\n')
412-            fh.close()
413-    except:
414-        DisplayTraceback('Failed to write file %s' % (fname,))
415-
416-def configure(backend, user, passwd):
417-    _config_re = re.compile('^([^:]*): (.*)$')
418-    config = get_config(backend, user, passwd)
419-    config_dict = {}
420-    for line in config.split('\n'):
421-        if line:
422-            m = _config_re.match(line)
423-            if m:
424-                fname, contents = m.groups()
425-                config_dict[fname] = contents
426-    for fname, contents in config_dict.items():
427-        write_config_file(fname, contents+'\n')
428-
429-def start_windows_service(svc_name):
430-    try:
431-        import win32service
432-        import win32serviceutil as wsu
433-        if wsu.QueryServiceStatus(svc_name)[1] != win32service.SERVICE_RUNNING:
434-            wsu.StartService(svc_name)
435-    except:
436-        DisplayTraceback('Failed to start windows service "%s"' % (svc_name,))
437-
438-def maybe_start_services():
439-    if sys.platform == 'win32':
440-        start_windows_service(TAHOESVC_NAME)
441-        start_windows_service(WINFUSESVC_NAME)
442-
443-def DisplayTraceback(message):
444-    xc = traceback.format_exception(*sys.exc_info())
445-    wx.MessageBox(u"%s\n (%s)"%(message,''.join(xc)), 'Error')
446-
447-class ConfWizApp(wx.App):
448-    def __init__(self, server, open_welcome_page=False):
449-        self.server = server
450-        self.show_welcome = open_welcome_page
451-        wx.App.__init__(self, 0)
452-
453-    def get_backend(self):
454-        return self.server + BACKEND
455-
456-    def open_welcome_page(self):
457-        if self.show_welcome:
458-            args = {'v':    str(allmydata.__version__),
459-                    'plat': sys.platform,
460-                    }
461-            webbrowser.open(self.server + WELCOME_PAGE + '?' + urlencode(args))
462-
463-    def OnInit(self):
464-        try:
465-            wx.InitAllImageHandlers()
466-
467-            self.login_frame = WizardFrame(self, LoginPanel)
468-            self.login_frame.CenterOnScreen()
469-            self.SetTopWindow(self.login_frame)
470-            #self.SetExitOnFrameDelete(True)
471-            self.login_frame.Show(True)
472-
473-            return True
474-        except:
475-            DisplayTraceback('config wizard init threw an exception')
476-
477-    def swap_to_register_frame(self):
478-        try:
479-            self.login_frame.Show(False)
480-            self.regiser_frame = WizardFrame(self, RegisterPanel)
481-            self.regiser_frame.CenterOnScreen()
482-            self.SetTopWindow(self.regiser_frame)
483-            self.SetExitOnFrameDelete(True)
484-            self.regiser_frame.Show(True)
485-        except:
486-            DisplayTraceback('config wizard threw an exception')
487-
488-class WizardFrame(wx.Frame):
489-    def __init__(self, app, panel_class):
490-        #title = 'Allmydata Config Wizard'
491-        title = 'Setup - Allmydata'
492-        wx.Frame.__init__(self, None, -1, title)
493-        self.app = app
494-        self.SetIcon(amdlogo.getIcon())
495-        self.Bind(wx.EVT_CLOSE, self.close)
496-
497-        self.SetSizeHints(500, 360, 600, 800)
498-
499-        banner = wx.Panel(self, -1)
500-        banner.SetSize((496,58))
501-        banner.SetBackgroundColour(wx.WHITE)
502-
503-        banner_title = wx.StaticText(banner, -1, panel_class.title)
504-        banner_desc = wx.StaticText(banner, -1, "        " + panel_class.description)
505-        font = banner_title.GetFont()
506-        font.SetWeight(wx.FONTWEIGHT_BOLD)
507-        banner_title.SetFont(font)
508-        banner_icon = wx.StaticBitmap(banner, -1, amdlogo.getBitmap())
509-        banner_label_sizer = wx.BoxSizer(wx.VERTICAL)
510-        banner_label_sizer.Add(banner_title, 0, wx.EXPAND | wx.ALL, 2)
511-        banner_label_sizer.Add(banner_desc, 0, wx.EXPAND | wx.ALL, 2)
512-
513-        banner_sizer = wx.BoxSizer(wx.HORIZONTAL)
514-        banner_sizer.Add(banner_label_sizer, 1, wx.EXPAND | wx.ALL, 12)
515-        banner_sizer.Add(banner_icon, 0, wx.ALL, 12)
516-        banner.SetSizer(banner_sizer)
517-        banner.SetAutoLayout(True)
518-
519-        background = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
520-        background.parent = self
521-
522-        button_panel = wx.Panel(self, -1)
523-        button_panel.SetSize((496, 64))
524-
525-        self.panel = panel_class(background, button_panel, app)
526-        sizer = wx.BoxSizer(wx.VERTICAL)
527-        background_sizer = wx.BoxSizer(wx.VERTICAL)
528-        background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding)
529-        background_sizer.Add(self.panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
530-        background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding)
531-        background.SetSizer(background_sizer)
532-
533-
534-        sizer.Add(banner, 0, wx.EXPAND | wx.HORIZONTAL, 0)
535-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
536-        sizer.Add(button_panel, 0, wx.EXPAND | wx.HORIZONTAL, 0)
537-        self.SetSizer(sizer)
538-        self.SetAutoLayout(True)
539-        self.Fit()
540-        self.Layout()
541-
542-    def close(self, event):
543-        self.Show(False)
544-        self.app.ExitMainLoop()
545-
546-
547-class LoginPanel(wx.Panel):
548-    padding = 26
549-    title = 'Sign in'
550-    description = 'Sign in to your existing account'
551-
552-    def __init__(self, parent, button_panel, app):
553-        wx.Panel.__init__(self, parent, -1)
554-        self.parent = parent
555-        self.app = app
556-
557-        self.sizer = wx.BoxSizer(wx.VERTICAL)
558-
559-        self.user_label = wx.StaticText(self, -1, 'Email')
560-        self.pass_label = wx.StaticText(self, -1, 'Password')
561-        self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1))
562-        self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
563-        self.warning_label = wx.StaticText(self, -1, '')
564-        self.warning_label.SetOwnForegroundColour(wx.RED)
565-        wx.EVT_CHAR(self.user_field, self.on_user_entry)
566-        wx.EVT_CHAR(self.pass_field, self.on_pass_entry)
567-        login_sizer = wx.FlexGridSizer(2, 2, 5, 4)
568-        login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
569-        login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2)
570-        login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
571-        login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2)
572-        self.sizer.Add(login_sizer, 1, wx.EXPAND | wx.ALL, 2)
573-        self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
574-        self.SetSizer(self.sizer)
575-        self.SetAutoLayout(True)
576-
577-        self.reg_label = wx.StaticText(button_panel, -1, "Don't have an account?")
578-        self.reg_button = wx.Button(button_panel, -1, 'Create Account')
579-        self.login_button = wx.Button(button_panel, -1, 'Sign In')
580-        button_panel.Bind(wx.EVT_BUTTON, self.on_reg_button, self.reg_button)
581-        button_panel.Bind(wx.EVT_BUTTON, self.on_login, self.login_button)
582-        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
583-        btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12)
584-        btn_sizer.Add(self.reg_label, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
585-        btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
586-        btn_sizer.Add(self.login_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
587-        button_panel.SetSizer(btn_sizer)
588-        self.button_panel = button_panel
589-
590-    def on_reg_button(self, event):
591-        self.app.swap_to_register_frame()
592-
593-    def on_user_entry(self, event):
594-        if event.GetKeyCode() == wx.WXK_RETURN:
595-            self.pass_field.SetFocus()
596-        else:
597-            event.Skip()
598-
599-    def on_pass_entry(self, event):
600-        if event.GetKeyCode() == wx.WXK_RETURN:
601-            self.on_login(event)
602-        else:
603-            event.Skip()
604-
605-    def on_login(self, event):
606-        user = self.user_field.GetValue()
607-        passwd = self.pass_field.GetValue()
608-        self.warning_label.SetLabel('Connecting...')
609-        self.Layout()
610-        wx.Yield()
611-
612-        backend = self.app.get_backend()
613-
614-        if passwd == '':
615-            self.warning_label.SetLabel('You must enter a password')
616-            self.pass_field.SetFocus()
617-            self.Layout()
618-            return
619-
620-        try:
621-            root_cap = get_root_cap(backend, user, passwd)
622-            write_root_cap(root_cap)
623-        except AuthError:
624-            self.warning_label.SetLabel('Your email and/or password is incorrect')
625-            self.user_field.SetFocus()
626-            self.Layout()
627-            return
628-
629-        nodeid = get_nodeid()
630-        nickname = get_nickname()
631-        ret = record_install(backend, user, passwd, nodeid, nickname)
632-        if ret != 'ok':
633-            wx.MessageBox('Error "%s" recording this system (%s)' % (ret, nodeid), 'Error')
634-
635-        configure(backend, user, passwd)
636-        maybe_start_services()
637-        maybe_write_file('nickname', nickname)
638-        maybe_write_file('accountname', user)
639-
640-        self.app.open_welcome_page()
641-
642-        # exit
643-        self.parent.parent.Close()
644-
645-class RegisterPanel(wx.Panel):
646-    padding = 7
647-    title = 'Create account'
648-    description = 'Create a new account on Allmydata'
649-
650-    def __init__(self, parent, button_panel, app):
651-        wx.Panel.__init__(self, parent, -1)
652-        self.parent = parent
653-        self.app = app
654-
655-        self.sizer = wx.BoxSizer(wx.VERTICAL)
656-
657-        self.user_label = wx.StaticText(self, -1, 'Email')
658-        self.pass_label = wx.StaticText(self, -1, 'Password')
659-        self.conf_label = wx.StaticText(self, -1, 'Confirm Password')
660-        self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1))
661-        self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
662-        self.conf_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
663-        self.subscribe_box = wx.CheckBox(self, -1, 'Sign up for our Newsletter')
664-        self.subscribe_box.SetValue(True)
665-        self.warning_label = wx.StaticText(self, -1, '')
666-        self.warning_label.SetOwnForegroundColour(wx.RED)
667-        wx.EVT_CHAR(self.user_field, self.on_user_entry)
668-        wx.EVT_CHAR(self.pass_field, self.on_pass_entry)
669-        wx.EVT_CHAR(self.conf_field, self.on_conf_entry)
670-        login_sizer = wx.FlexGridSizer(3, 2, 5, 4)
671-        login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
672-        login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2)
673-        login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
674-        login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2)
675-        login_sizer.Add(self.conf_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
676-        login_sizer.Add(self.conf_field, 0, wx.EXPAND | wx.ALL, 2)
677-        login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | wx.ALL, 2)
678-        self.sizer.Add(login_sizer, 0, wx.EXPAND | wx.ALL, 2)
679-        self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
680-        self.sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, 4)
681-        self.sizer.Add(self.subscribe_box, 0, wx.CENTER | wx.ALL, 2)
682-        self.SetSizer(self.sizer)
683-        self.SetAutoLayout(True)
684-
685-        self.reg_button = wx.Button(button_panel, -1, 'Create Account')
686-        button_panel.Bind(wx.EVT_BUTTON, self.on_create_account, self.reg_button)
687-        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
688-        btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12)
689-        btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
690-        button_panel.SetSizer(btn_sizer)
691-        self.button_panel = button_panel
692-
693-        self.Fit()
694-
695-    def on_user_entry(self, event):
696-        if event.GetKeyCode() == wx.WXK_RETURN:
697-            self.pass_field.SetFocus()
698-        else:
699-            event.Skip()
700-
701-    def on_pass_entry(self, event):
702-        if event.GetKeyCode() == wx.WXK_RETURN:
703-            self.conf_field.SetFocus()
704-        else:
705-            event.Skip()
706-
707-    def on_conf_entry(self, event):
708-        if event.GetKeyCode() == wx.WXK_RETURN:
709-            self.on_create_account(event)
710-        else:
711-            event.Skip()
712-
713-    def on_create_account(self, event):
714-        user = self.user_field.GetValue()
715-        passwd = self.pass_field.GetValue()
716-        pconf = self.conf_field.GetValue()
717-        subscribe = self.subscribe_box.IsChecked()
718-        self.warning_label.SetLabel('Connecting...')
719-        self.Layout()
720-        wx.Yield()
721-
722-        if passwd == '':
723-            self.warning_label.SetLabel('You must enter a password')
724-            self.pass_field.SetFocus()
725-            self.Layout()
726-            return
727-
728-        if passwd != pconf:
729-            self.warning_label.SetLabel("Passwords don't match")
730-            self.pass_field.SetValue('')
731-            self.conf_field.SetValue('')
732-            self.pass_field.SetFocus()
733-            self.Layout()
734-            return
735-
736-        backend = self.app.get_backend()
737-
738-        #print 'calling create_account', time.asctime()
739-        result_code = create_account(backend, user, passwd, subscribe)
740-
741-        if result_code == 'account_exists':
742-            # try and log into it; if valid, use it anyway
743-            try:
744-                #print 'calling get_root_cap (ae)', time.asctime()
745-                root_cap = get_root_cap(backend, user, passwd)
746-                write_root_cap(root_cap)
747-            except AuthError:
748-                self.warning_label.SetLabel('That email address is already registered')
749-                self.user_field.SetFocus()
750-                self.Layout()
751-                return
752-        elif result_code == 'error':
753-            self.warning_label.SetLabel('an error occurred')
754-            self.user_field.SetFocus()
755-            self.Layout()
756-            return
757-        elif result_code == 'ok':
758-            #print 'calling get_root_cap (ok)', time.asctime()
759-            root_cap = get_root_cap(backend, user, passwd)
760-            write_root_cap(root_cap)
761-        else:
762-            self.warning_label.SetLabel('an unexpected error occurred ("%s")' % (result_code,))
763-            self.user_field.SetFocus()
764-            self.Layout()
765-            return
766-
767-        nodeid = get_nodeid()
768-        nickname = get_nickname()
769-        ret = record_install(backend, user, passwd, nodeid, nickname)
770-        if ret != 'ok':
771-            wx.MessageBox('Error "%s" recording this system (%s)' % (ret, nodeid), 'Error')
772-
773-        configure(backend, user, passwd)
774-        maybe_start_services()
775-        maybe_write_file('nickname', nickname)
776-        maybe_write_file('accountname', user)
777-
778-        self.app.open_welcome_page()
779-
780-        # exit
781-        self.parent.parent.Close()
782-
783-def do_uninstall(server_url):
784-    nodeid = get_nodeid()
785-    ret = record_uninstall(server_url + BACKEND, nodeid)
786-    print ret
787-    if ret != 'ok':
788-        print 'Error "%s" recording uninstall of this system (%s)' % (ret, nodeid)
789-
790-class Options(usage.Options):
791-    synopsis = "Usage:  confwiz [options]"
792-
793-    optFlags = [
794-        ['uninstall', 'u', 'record uninstall'],
795-        ]
796-    optParameters = [
797-        ['server', 's', DEFAULT_SERVER_URL, 'url of server to contact'],
798-        ]
799-
800-def main(argv):
801-    config = Options()
802-    try:
803-        config.parseOptions(argv[1:])
804-    except usage.error, e:
805-        print config
806-        print "%s:  %s" % (sys.argv[0], e)
807-        sys.exit(-1)
808-
809-    server = config['server']
810-    if not server.endswith('/'):
811-        server += '/'
812-
813-    if config['uninstall']:
814-        do_uninstall(server)
815-    else:
816-        app = ConfWizApp(server)
817-        app.MainLoop()
818-
819-
820-if __name__ == '__main__':
821-    main(sys.argv)
822rmfile ./src/allmydata/gui/confwiz.py
823hunk ./src/allmydata/gui/macapp.py 1
824-
825-import operator
826-import os
827-import stat
828-from subprocess import Popen, PIPE
829-import sys
830-import thread
831-import threading
832-import traceback
833-import urllib
834-import webbrowser
835-
836-import wx
837-from twisted.internet import reactor
838-from twisted.python import log, logfile
839-
840-import allmydata
841-from allmydata import client
842-from allmydata.gui.confwiz import ConfWizApp, ACCOUNT_PAGE, DEFAULT_SERVER_URL
843-from allmydata.scripts.common import get_aliases
844-from allmydata.gui import amdicon, amdlogo
845-
846-DEFAULT_FUSE_TIMEOUT = 300
847-
848-TRY_TO_INSTALL_TAHOE_SCRIPT = True
849-TAHOE_SCRIPT = '''#!/bin/bash
850-if [ "x${*}x" == "xx" ]
851-then
852-    %(exe)s --help
853-else
854-    %(exe)s "${@}"
855-fi
856-'''
857-
858-def run_macapp():
859-    nodedir = os.path.expanduser('~/.tahoe')
860-    if not os.path.isdir(nodedir):
861-        app_supp = os.path.expanduser('~/Library/Application Support/Allmydata Tahoe/')
862-        if not os.path.isdir(app_supp):
863-            os.makedirs(app_supp)
864-        os.symlink(app_supp, nodedir)
865-
866-    app_cont = AppContainer(nodedir)
867-    return app_cont.run()
868-
869-class MacGuiClient(client.Client):
870-    """
871-    This is a subclass of the tahoe 'client' node, which hooks into the
872-    client's 'notice something went wrong' mechanism, to display the fact
873-    in a manner sensible for a wx gui app
874-    """
875-    def __init__(self, nodedir, app_cont):
876-        self.app_cont = app_cont
877-        client.Client.__init__(self, nodedir)
878-
879-    def _service_startup_failed(self, failure):
880-        wx.CallAfter(self.wx_abort, failure)
881-        log.msg('node service startup failed')
882-        log.err(failure)
883-
884-    def wx_abort(self, failure):
885-        wx.MessageBox(failure.getTraceback(), 'Fatal Error in Node startup')
886-        self.app_cont.guiapp.ExitMainLoop()
887-
888-class AppContainer(object):
889-    """
890-    This is the 'container' for the mac app, which takes care of initial
891-    configuration concerns - e.g. running the confwiz before going any further -
892-    of launching the reactor, and within it the tahoe node, on a separate thread,
893-    and then lastly of launching the actual wx gui app and waiting for it to exit.
894-    """
895-    def __init__(self, nodedir):
896-        self.nodedir = nodedir
897-
898-    def files_exist(self, file_list):
899-        extant_conf = [ os.path.exists(os.path.join(self.nodedir, f)) for f in file_list ]
900-        return reduce(operator.__and__, extant_conf)
901-
902-    def is_config_incomplete(self):
903-        necessary_conf_files = ['introducer.furl', 'private/root_dir.cap']
904-        need_config = not self.files_exist(necessary_conf_files)
905-        if need_config:
906-            print 'some config is missing from nodedir (%s): %s' % (self.nodedir, necessary_conf_files)
907-        return need_config
908-
909-    def run(self):
910-        # handle initial config
911-        if not os.path.exists(os.path.join(self.nodedir, 'webport')):
912-            f = file(os.path.join(self.nodedir, 'webport'), 'wb')
913-            f.write('3456')
914-            f.close()
915-
916-        if self.is_config_incomplete():
917-            confwiz = ConfWizApp(DEFAULT_SERVER_URL, open_welcome_page=True)
918-            confwiz.MainLoop()
919-
920-        if self.is_config_incomplete():
921-            print 'config still incomplete; confwiz cancelled, exiting'
922-            return 1
923-
924-        # set up twisted logging. this will become part of the node rsn.
925-        logdir = os.path.join(self.nodedir, 'logs')
926-        if not os.path.exists(logdir):
927-            os.makedirs(logdir)
928-        lf = logfile.LogFile('tahoesvc.log', logdir)
929-        log.startLogging(lf)
930-
931-        if TRY_TO_INSTALL_TAHOE_SCRIPT:
932-            self.maybe_install_tahoe_script()
933-
934-        # actually start up the node and the ui
935-        os.chdir(self.nodedir)
936-
937-        # start the reactor thread up, launch the tahoe node therein
938-        self.start_reactor()
939-
940-        try:
941-            # launch the actual gui on the wx event loop, wait for it to quit
942-            self.guiapp = MacGuiApp(app_cont=self)
943-            self.guiapp.MainLoop()
944-            log.msg('gui mainloop exited')
945-        except:
946-            log.err()
947-
948-        # shutdown the reactor, hence tahoe node, before exiting
949-        self.stop_reactor()
950-
951-        return 0
952-
953-    def start_reactor(self):
954-        self.reactor_shutdown = threading.Event()
955-        thread.start_new_thread(self.launch_reactor, ())
956-
957-    def launch_reactor(self):
958-        # run the node itself
959-        #c = client.Client(self.nodedir)
960-        c = MacGuiClient(self.nodedir, app_cont=self)
961-        reactor.callLater(0, c.startService) # after reactor startup
962-        reactor.run(installSignalHandlers=False)
963-        self.reactor_shutdown.set()
964-
965-    def stop_reactor(self):
966-        # trigger reactor shutdown, and block waiting on it
967-        reactor.callFromThread(reactor.stop)
968-        log.msg('waiting for reactor shutdown')
969-        self.reactor_shutdown.wait()
970-        log.msg('reactor shut down')
971-
972-    def maybe_install_tahoe_script(self):
973-        path_candidates = ['/usr/local/bin', '~/bin', '~/Library/bin']
974-        env_path = map(os.path.expanduser, os.environ['PATH'].split(':'))
975-        if not sys.executable.endswith('/python'):
976-            print 'not installing tahoe script: unexpected sys.exe "%s"' % (sys.executable,)
977-            return
978-        for path_candidate in map(os.path.expanduser, env_path):
979-            tahoe_path = path_candidate + '/tahoe'
980-            if os.path.exists(tahoe_path):
981-                print 'not installing "tahoe": it already exists at "%s"' % (tahoe_path,)
982-                return
983-        for path_candidate in map(os.path.expanduser, path_candidates):
984-            if path_candidate not in env_path:
985-                print path_candidate, 'not in', env_path
986-                continue
987-            tahoe_path = path_candidate + '/tahoe'
988-            try:
989-                print 'trying to install "%s"' % (tahoe_path,)
990-                bin_path = (sys.executable[:-6] + 'Allmydata')
991-                script = TAHOE_SCRIPT % { 'exe': bin_path }
992-                f = file(tahoe_path, 'wb')
993-                f.write(script)
994-                f.close()
995-                mode = stat.S_IRUSR|stat.S_IXUSR|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH
996-                os.chmod(tahoe_path, mode)
997-                print 'installed "%s"' % (tahoe_path,)
998-                return
999-            except:
1000-                print 'unable to write %s' % (tahoe_path,)
1001-                traceback.print_exc()
1002-        else:
1003-            print 'no remaining candidate paths for installation of tahoe script'
1004-
1005-
1006-def DisplayTraceback(message):
1007-    xc = traceback.format_exception(*sys.exc_info())
1008-    wx.MessageBox(u"%s\n (%s)"%(message,''.join(xc)), 'Error')
1009-
1010-WEBOPEN_ID = wx.NewId()
1011-ACCOUNT_PAGE_ID = wx.NewId()
1012-MOUNT_ID = wx.NewId()
1013-
1014-class SplashFrame(wx.Frame):
1015-    def __init__(self):
1016-        no_resz = wx.DEFAULT_FRAME_STYLE & ~ (wx.MINIMIZE_BOX|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX)
1017-        wx.Frame.__init__(self, None, -1, 'Allmydata', style=no_resz)
1018-
1019-        self.SetSizeHints(100, 100, 600, 800)
1020-        self.SetIcon(amdicon.getIcon())
1021-        self.Bind(wx.EVT_CLOSE, self.on_close)
1022-
1023-        background = wx.Panel(self, -1)
1024-        background.parent = self
1025-        self.login_panel = SplashPanel(background, self.on_close)
1026-        sizer = wx.BoxSizer(wx.VERTICAL)
1027-        background_sizer = wx.BoxSizer(wx.VERTICAL)
1028-        background_sizer.Add(self.login_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
1029-        background.SetSizer(background_sizer)
1030-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
1031-        self.SetSizer(sizer)
1032-        self.SetAutoLayout(True)
1033-        self.Fit()
1034-        self.Layout()
1035-
1036-    def on_close(self, event):
1037-        self.Show(False)
1038-
1039-class SplashPanel(wx.Panel):
1040-    def __init__(self, parent, on_close):
1041-        wx.Panel.__init__(self, parent, -1)
1042-        self.parent = parent
1043-
1044-        hbox = wx.BoxSizer(wx.HORIZONTAL)
1045-        vbox = wx.BoxSizer(wx.VERTICAL)
1046-        self.sizer = wx.BoxSizer(wx.VERTICAL)
1047-
1048-        self.icon = wx.StaticBitmap(self, -1, amdlogo.getBitmap())
1049-        self.label = wx.StaticText(self, -1, 'Allmydata')
1050-        bigfont = self.label.GetFont()
1051-        bigfont.SetPointSize(26)
1052-        smlfont = self.label.GetFont()
1053-        smlfont.SetPointSize(10)
1054-        self.label.SetFont(bigfont)
1055-        ver = "Version 3.0 (%s)" % (allmydata.__version__,)
1056-        self.ver_label = wx.StaticText(self, -1, ver)
1057-        self.ver_label.SetFont(smlfont)
1058-        copy = u"Copyright \N{COPYRIGHT SIGN} 2004-2008 Allmydata Inc.,"
1059-        self.copy_label = wx.StaticText(self, -1, copy)
1060-        self.copy_label.SetFont(smlfont)
1061-        self.res_label = wx.StaticText(self, -1, "All Rights Reserved.")
1062-        self.res_label.SetFont(smlfont)
1063-        ##self.ok = wx.Button(self, -1, 'Ok')
1064-        ##self.Bind(wx.EVT_BUTTON, on_close, self.ok)
1065-        hbox.Add(self.icon, 0, wx.CENTER | wx.ALL, 2)
1066-        vbox.Add(self.label, 0, wx.CENTER | wx.ALL, 2)
1067-        vbox.Add(self.ver_label, 0, wx.CENTER | wx.ALL, 2)
1068-        hbox.Add(vbox)
1069-        self.sizer.Add(hbox)
1070-        self.sizer.Add(wx.Size(8,8), 1, wx.EXPAND | wx.ALL, 2)
1071-        self.sizer.Add(self.copy_label, 0, wx.CENTER | wx.ALL, 2)
1072-        self.sizer.Add(self.res_label, 0, wx.CENTER | wx.ALL, 2)
1073-        #self.sizer.Add(wx.Size(42,42), 1, wx.EXPAND | wx.ALL, 2)
1074-        ##self.sizer.Add(self.ok, 0, wx.CENTER | wx.ALL, 2)
1075-        self.SetSizer(self.sizer)
1076-        self.SetAutoLayout(True)
1077-
1078-
1079-class MountFrame(wx.Frame):
1080-    def __init__(self, guiapp):
1081-        wx.Frame.__init__(self, None, -1, 'Allmydata Mount Filesystem')
1082-
1083-        self.SetSizeHints(100, 100, 600, 800)
1084-        self.SetIcon(amdicon.getIcon())
1085-        self.Bind(wx.EVT_CLOSE, self.on_close)
1086-
1087-        background = wx.Panel(self, -1)
1088-        background.parent = self
1089-        self.mount_panel = MountPanel(background, self.on_close, guiapp)
1090-        sizer = wx.BoxSizer(wx.VERTICAL)
1091-        background_sizer = wx.BoxSizer(wx.VERTICAL)
1092-        background_sizer.Add(self.mount_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
1093-        background.SetSizer(background_sizer)
1094-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
1095-        self.SetSizer(sizer)
1096-        self.SetAutoLayout(True)
1097-        self.Fit()
1098-        self.Layout()
1099-
1100-    def on_close(self, event):
1101-        self.Show(False)
1102-
1103-class MountPanel(wx.Panel):
1104-    def __init__(self, parent, on_close, guiapp):
1105-        wx.Panel.__init__(self, parent, -1)
1106-        self.parent = parent
1107-        self.guiapp = guiapp
1108-
1109-        self.sizer = wx.BoxSizer(wx.VERTICAL)
1110-
1111-        self.label = wx.StaticText(self, -1, 'Allmydata Mount Filesystem')
1112-        self.mnt_label = wx.StaticText(self, -1, 'Mount')
1113-        self.alias_choice = wx.Choice(self, -1, (120, 64), choices=self.guiapp.aliases.keys())
1114-        root_dir = self.alias_choice.FindString('tahoe')
1115-        if root_dir != -1:
1116-            self.alias_choice.SetSelection(root_dir)
1117-        self.at_label = wx.StaticText(self, -1, 'at')
1118-        self.mountpoint = wx.TextCtrl(self, -1, 'choose a mount dir', size=(256,22))
1119-        self.mnt_browse = wx.Button(self, -1, 'Browse')
1120-        mount_sizer = wx.BoxSizer(wx.HORIZONTAL)
1121-        mount_sizer.Add(self.mnt_label, 0, wx.ALL, 4)
1122-        mount_sizer.Add(self.alias_choice, 0, wx.ALL, 4)
1123-        mount_sizer.Add(self.at_label, 0, wx.ALL, 4)
1124-        mount_sizer.Add(self.mountpoint, 0, wx.ALL, 4)
1125-        mount_sizer.Add(self.mnt_browse, 0, wx.ALL, 4)
1126-        self.mount = wx.Button(self, -1, 'Mount')
1127-        self.Bind(wx.EVT_BUTTON, self.on_mount, self.mount)
1128-        #self.Bind(wx.EVT_CHOICE, self.on_choice, self.alias_choice)
1129-        self.Bind(wx.EVT_BUTTON, self.on_mnt_browse, self.mnt_browse)
1130-        self.sizer.Add(self.label, 0, wx.CENTER | wx.ALL, 2)
1131-        self.sizer.Add(wx.Size(28,28), 1, wx.EXPAND | wx.ALL, 2)
1132-        self.sizer.Add(mount_sizer, 0, wx.EXPAND | wx.ALL, 0)
1133-        self.sizer.Add(wx.Size(28,28), 1, wx.EXPAND | wx.ALL, 2)
1134-        self.sizer.Add(self.mount, 0, wx.CENTER | wx.ALL, 2)
1135-        self.SetSizer(self.sizer)
1136-        self.SetAutoLayout(True)
1137-
1138-    def on_mount(self, event):
1139-        mountpoint = str(self.mountpoint.GetValue())
1140-        if not os.path.isdir(mountpoint):
1141-            wx.MessageBox(u'"%s" is not a directory' % (mountpoint,))
1142-        else:
1143-            alias_name = self.alias_choice.GetStringSelection()
1144-            self.do_mount(alias_name, mountpoint)
1145-
1146-    def on_mnt_browse(self, event):
1147-        dlg = wx.DirDialog(self, "Choose a Mountpoint Directory:",
1148-                           style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)
1149-        if dlg.ShowModal() == wx.ID_OK:
1150-            mountpoint = dlg.GetPath()
1151-            self.mountpoint.SetValue(mountpoint)
1152-        dlg.Destroy()
1153-
1154-    def do_mount(self, alias_name, mountpoint):
1155-        log.msg('do_mount(%r, %r)' % (alias_name, mountpoint))
1156-        self.guiapp.mount_filesystem(alias_name, mountpoint)
1157-        self.parent.parent.Show(False)
1158-
1159-class MacGuiApp(wx.App):
1160-    config = {
1161-        'auto-mount': True,
1162-        'auto-open': True,
1163-        'show-webopen': False,
1164-        'daemon-timeout': DEFAULT_FUSE_TIMEOUT,
1165-        }
1166-
1167-    def __init__(self, app_cont):
1168-        self.app_cont = app_cont
1169-        self.nodedir = app_cont.nodedir
1170-        self.load_config()
1171-        self.mounted_filesystems = {}
1172-        self.aliases = get_aliases(self.nodedir)
1173-        wx.App.__init__(self)
1174-
1175-    ## load up setting from gui.conf dir
1176-    def load_config(self):
1177-        log.msg('load_config')
1178-        confdir = os.path.join(self.nodedir, 'gui.conf')
1179-        config = {}
1180-        config.update(self.config)
1181-        for k in self.config:
1182-            f = os.path.join(confdir, k)
1183-            if os.path.exists(f):
1184-                val = file(f, 'rb').read().strip()
1185-                if type(self.config[k]) == bool:
1186-                    if val.lower() in ['y', 'yes', 'true', 'on', '1']:
1187-                        val = True
1188-                    else:
1189-                        val = False
1190-                elif type(self.config[k]) == int:
1191-                    val = int(val)
1192-                config[k] = val
1193-        self.config = config
1194-
1195-    ## GUI wx init
1196-    def OnInit(self):
1197-        log.msg('OnInit')
1198-        try:
1199-            self.frame = SplashFrame()
1200-            self.frame.CenterOnScreen()
1201-            self.frame.Show(True)
1202-            self.SetTopWindow(self.frame)
1203-
1204-            # self.load_config()
1205-
1206-            wx.FutureCall(4096, self.on_timer, None)
1207-
1208-            self.mount_frame = MountFrame(guiapp=self)
1209-
1210-            self.setup_dock_icon()
1211-            menubar = self.setup_app_menu(self.frame)
1212-            self.frame.SetMenuBar(menubar)
1213-
1214-            return True
1215-        except:
1216-            DisplayTraceback('exception on startup')
1217-            sys.exit()
1218-
1219-    ## WX menu and event handling
1220-
1221-    def on_timer(self, event):
1222-        self.frame.Show(False)
1223-        self.perhaps_automount()
1224-
1225-    def setup_dock_icon(self):
1226-        self.tbicon = wx.TaskBarIcon()
1227-        #self.tbicon.SetIcon(amdicon.getIcon(), "Allmydata")
1228-        wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.on_dock_menu)
1229-
1230-    def setup_app_menu(self, frame):
1231-        menubar = wx.MenuBar()
1232-        file_menu = wx.Menu()
1233-        if self.config['show-webopen']:
1234-            webopen_menu = wx.Menu()
1235-            self.webopen_menu_ids = {}
1236-            for alias in self.aliases:
1237-                mid = wx.NewId()
1238-                self.webopen_menu_ids[mid] = alias
1239-                item = webopen_menu.Append(mid, alias)
1240-                frame.Bind(wx.EVT_MENU, self.on_webopen, item)
1241-            file_menu.AppendMenu(WEBOPEN_ID, 'Open Web UI', webopen_menu)
1242-        item = file_menu.Append(ACCOUNT_PAGE_ID, text='Open Account Page')
1243-        frame.Bind(wx.EVT_MENU, self.on_account_page, item)
1244-        item = file_menu.Append(MOUNT_ID, text='Mount Filesystem')
1245-        frame.Bind(wx.EVT_MENU, self.on_mount, item)
1246-        item = file_menu.Append(wx.ID_ABOUT, text='About')
1247-        frame.Bind(wx.EVT_MENU, self.on_about, item)
1248-        item = file_menu.Append(wx.ID_EXIT, text='Quit')
1249-        frame.Bind(wx.EVT_MENU, self.on_quit, item)
1250-        menubar.Append(file_menu, 'File')
1251-        return menubar
1252-
1253-    def on_dock_menu(self, event):
1254-        dock_menu = wx.Menu()
1255-        item = dock_menu.Append(wx.NewId(), text='About')
1256-        self.tbicon.Bind(wx.EVT_MENU, self.on_about, item)
1257-        if self.config['show-webopen']:
1258-            item = dock_menu.Append(WEBOPEN_ID, text='Open Web Root')
1259-            self.tbicon.Bind(wx.EVT_MENU, self.on_webopen, item)
1260-        item = dock_menu.Append(ACCOUNT_PAGE_ID, text='Open Account Page')
1261-        self.tbicon.Bind(wx.EVT_MENU, self.on_account_page, item)
1262-        item = dock_menu.Append(MOUNT_ID, text='Mount Filesystem')
1263-        self.tbicon.Bind(wx.EVT_MENU, self.on_mount, item)
1264-        self.tbicon.PopupMenu(dock_menu)
1265-
1266-    def on_about(self, event):
1267-        self.frame.Show(True)
1268-
1269-    def on_quit(self, event):
1270-        self.unmount_filesystems()
1271-        self.ExitMainLoop()
1272-
1273-    def on_webopen(self, event):
1274-        alias = self.webopen_menu_ids.get(event.GetId())
1275-        #log.msg('on_webopen() alias=%r' % (alias,))
1276-        self.webopen(alias)
1277-
1278-    def on_account_page(self, event):
1279-        webbrowser.open(DEFAULT_SERVER_URL + ACCOUNT_PAGE)
1280-
1281-    def on_mount(self, event):
1282-        self.mount_frame.Show(True)
1283-
1284-    ## Gui App methods
1285-
1286-    def perhaps_automount(self):
1287-        if self.config['auto-mount']:
1288-            mountpoint = os.path.join(self.nodedir, 'mnt/__auto__')
1289-            if not os.path.isdir(mountpoint):
1290-                os.makedirs(mountpoint)
1291-            self.mount_filesystem('tahoe', mountpoint, 'Allmydata')
1292-
1293-    def webopen(self, alias=None):
1294-        log.msg('webopen: %r' % (alias,))
1295-        if alias is None:
1296-            alias = 'tahoe'
1297-        root_uri = self.aliases.get(alias)
1298-        if root_uri:
1299-            nodeurl = file(os.path.join(self.nodedir, 'node.url'), 'rb').read().strip()
1300-            if nodeurl[-1] != "/":
1301-                nodeurl += "/"
1302-            url = nodeurl + "uri/%s/" % urllib.quote(root_uri)
1303-            webbrowser.open(url)
1304-
1305-    def mount_filesystem(self, alias_name, mountpoint, display_name=None):
1306-        log.msg('mount_filesystem(%r,%r,%r)' % (alias_name, mountpoint, display_name))
1307-        log.msg('sys.exec = %r' % (sys.executable,))
1308-
1309-        # first determine if we can find the 'tahoe' binary (i.e. contents of .app)
1310-        if not sys.executable.endswith('Allmydata.app/Contents/MacOS/python'):
1311-            log.msg("can't find allmydata.app: sys.executable = %r" % (sys.executable,))
1312-            wx.MessageBox("Can't determine location of Allmydata.app")
1313-            return False
1314-        bin_path = sys.executable[:-6] + 'Allmydata'
1315-        log.msg('%r exists: %r' % (bin_path, os.path.exists(bin_path),))
1316-
1317-        # check mountpoint exists
1318-        if not os.path.exists(mountpoint):
1319-            log.msg('mountpoint %r does not exist' % (mountpoint,))
1320-            return False
1321-
1322-        # figure out options for fuse_main
1323-        foptions = []
1324-        foptions.append('-olocal') # required to display in Finder on leopard
1325-        #foptions.append('-ofstypename=allmydata') # shown in 'get info'
1326-        if display_name is None:
1327-            display_name = alias_name
1328-        foptions.append('-ovolname=%s' % (display_name,))
1329-        timeout = self.config['daemon-timeout']
1330-        foptions.append('-odaemon_timeout=%d' % (timeout,))
1331-        icns_path = os.path.join(self.nodedir, 'private/icons', alias_name+'.icns')
1332-        log.msg('icns_path %r exists: %s' % (icns_path, os.path.exists(icns_path)))
1333-        if not os.path.exists(icns_path):
1334-            icns_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable),
1335-                                                      '../Resources/allmydata.icns'))
1336-            log.msg('set icns_path=%s' % (icns_path,))
1337-        if os.path.exists(icns_path):
1338-            foptions.append('-ovolicon=%s' % (icns_path,))
1339-
1340-
1341-        # actually launch tahoe fuse
1342-        command = [bin_path, 'fuse', '--alias', alias_name] + foptions + [mountpoint]
1343-        #log.msg('spawning command %r' % (command,))
1344-        #proc = Popen(command, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1345-        #log.msg('spawned process, pid %s' % (proc.pid,))
1346-        self.async_run_cmd(command)
1347-
1348-        # log the outcome, record the fact that we mounted this fs
1349-        #wx.FutureCall(4096, self.check_proc, proc, 'fuse')
1350-        self.mounted_filesystems[display_name] = mountpoint
1351-
1352-        # open finder, if configured to do so
1353-        if self.config['auto-open']:
1354-            wx.FutureCall(4096, self.sync_run_cmd, ['/usr/bin/open', mountpoint])
1355-        return True
1356-
1357-    def unmount_filesystems(self):
1358-        # the user may've already unmounted some, but we should ensure that
1359-        # anything the gui mounted gets shut down, since they all depend on
1360-        # the tahoe node, which is going away
1361-        for name, mountpoint in self.mounted_filesystems.items():
1362-            log.msg('unmounting %r (%s)' % (name, mountpoint))
1363-            self.sync_run_cmd(['/sbin/umount', mountpoint])
1364-
1365-    def sync_run_cmd(self, argv):
1366-        log.msg('synchronously running command: %r' % (argv,))
1367-        proc = Popen(argv, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1368-        proc.wait()
1369-        self.check_proc(proc)
1370-
1371-    def async_run_cmd(self, argv):
1372-        log.msg('asynchronously running command: %r' % (argv,))
1373-        proc = Popen(argv, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1374-        log.msg('spawned process, pid: %s' % (proc.pid,))
1375-        wx.FutureCall(4096, self.check_proc, proc, 'async fuse process:')
1376-
1377-    def check_proc(self, proc, description=None):
1378-        message = []
1379-        if description is not None:
1380-            message.append(description)
1381-        message.append('pid: %s  retcode: %s' % (proc.pid, proc.returncode,))
1382-        stdout = proc.stdout.read()
1383-        if stdout:
1384-            message.append('\nstdout:\n%s' % (stdout,))
1385-        stderr = proc.stderr.read()
1386-        if stderr:
1387-            message.append('\nstdout:\n%s' % (stderr,))
1388-        log.msg(' '.join(message))
1389-
1390rmfile ./src/allmydata/gui/macapp.py
1391rmdir ./src/allmydata/gui
1392hunk ./mac/COPYING.LGPL2 1
1393-mac/fuse.py and mac/fuseparts/subbedopts.py are also available (at your option) under LGPL2 as well as under GPL2+|TGPPL1+
1394-
1395-GNU Lesser General Public License
1396-
1397-Version 2.1, February 1999
1398-
1399-    Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
1400-
1401-    [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
1402-
1403-Preamble
1404-
1405-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
1406-
1407-This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
1408-
1409-When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
1410-
1411-To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
1412-
1413-For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
1414-
1415-We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
1416-
1417-To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
1418-
1419-Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
1420-
1421-Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
1422-
1423-When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
1424-
1425-We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
1426-
1427-For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
1428-
1429-In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
1430-
1431-Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
1432-
1433-The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
1434-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1435-
1436-0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
1437-
1438-A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
1439-
1440-The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
1441-
1442-"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
1443-
1444-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1445-
1446-1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
1447-
1448-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
1449-
1450-2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
1451-
1452-    a) The modified work must itself be a software library.
1453-
1454-    b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
1455-
1456-    c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
1457-
1458-    d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
1459-
1460-    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
1461-
1462-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
1463-
1464-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
1465-
1466-    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
1467-
1468-3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
1469-
1470-Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
1471-
1472-This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
1473-
1474-4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
1475-
1476-If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
1477-
1478-5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
1479-
1480-However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
1481-
1482-When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
1483-
1484-If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
1485-
1486-Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
1487-
1488-6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
1489-
1490-You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
1491-
1492-    a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
1493-
1494-    b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
1495-
1496-    c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
1497-
1498-    d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
1499-
1500-    e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
1501-
1502-For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
1503-
1504-It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
1505-
1506-7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
1507-
1508-    a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
1509-
1510-    b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
1511-
1512-8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
1513-
1514-9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
1515-
1516-10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
1517-
1518-11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
1519-
1520-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
1521-
1522-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
1523-
1524-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
1525-
1526-12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
1527-
1528-13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
1529-
1530-Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
1531-
1532-14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
1533-
1534-NO WARRANTY
1535-
1536-15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
1537-
1538-16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
1539-END OF TERMS AND CONDITIONS
1540-How to Apply These Terms to Your New Libraries
1541-If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
1542-
1543-To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
1544-
1545-    <one line to give the library's name and an idea of what it does.> Copyright (C) <year> <name of author>
1546-
1547-    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
1548-
1549-    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
1550-
1551-    You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1552-
1553-Also add information on how to contact you by electronic and paper mail.
1554-
1555-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
1556-
1557-    Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
1558-
1559-    signature of Ty Coon, 1 April 1990
1560-    Ty Coon, President of Vice
1561-
1562-That's all there is to it!
1563rmfile ./mac/COPYING.LGPL2
1564hunk ./mac/Makefile 1
1565-
1566-.PHONY: all dist build diskimage upload cleanup clean
1567-
1568-all: build
1569-
1570-dist: build diskimage upload cleanup
1571-
1572-build:
1573-       rsync -av ` sw_vers -productVersion | sed -e 's/^\(10\.[0-9]*\)\..*$$/\1/' `/ ./
1574-       ln -sf ../contrib/fuse/impl_c/blackmatch.py tahoefuse.py
1575-       python setup.py py2app --no-chdir
1576-
1577-diskimage:
1578-       mv dist Allmydata-$(VERSION)
1579-       hdiutil create -ov -srcfolder Allmydata-$(VERSION) allmydata-rw.dmg
1580-       hdiutil convert -ov allmydata-rw.dmg -format UDRO -o allmydata-ro.dmg
1581-       hdiutil convert -ov allmydata-ro.dmg -format UDZO -o Allmydata-$(VERSION).dmg
1582-       hdiutil internet-enable -yes Allmydata-$(VERSION).dmg
1583-       rm -r Allmydata-$(VERSION) allmydata-rw.dmg allmydata-ro.dmg
1584-
1585-ifdef UPLOAD_DEST_FURLFILE
1586-# N.B.: xfer-client.py requires foolscap, so we hack up PYTHONPATH to improve
1587-# the chances of finding it (using the one that we just built)
1588-# broken. To fix this just use flappclient. --Zooko 2010-06-06
1589-upload:
1590-       chmod a+r Allmydata-$(VERSION).dmg
1591-       PYTHONPATH=$(PYTHONPATH):../support/lib/python2.5/site-packages \
1592-        python ../misc/xfer-client.py --furlfile $(UPLOAD_DEST_FURLFILE) \
1593-        Allmydata-$(VERSION).dmg
1594-else
1595-upload:
1596-       $(error UPLOAD_DEST_FURLFILE must be set when using upload target. e.g. make upload UPLOAD_DEST_FURLFILE=~/.upload.furl)
1597-endif
1598-
1599-cleanup:
1600-       rm Allmydata-$(VERSION).dmg
1601-
1602-clean:
1603-       rm -rf build dist
1604rmfile ./mac/Makefile
1605hunk ./mac/README.txt 1
1606-2009-02-07:
1607-
1608-Zooko wrote this what is in this directory after asking RobK about it:
1609-
1610-wxpython trappings to build a .app bundle which is both a gui app and (when launching the binary from within the .app bundle) a functioning bin/tahoe binary including "tahoe fuse" subcommand
1611-
1612rmfile ./mac/README.txt
1613binary ./mac/allmydata.icns
1614oldhex
1615*69636e73000099af697433320000599f00000000fffffcfffc0000fffc0000ffb6000c0b284b62
1616*75777677756149280bb60000ffb20014022c6fa3cee1e5e7ebe9e8e9ece8e4e1cda0672a01b200
1617*00ffb0000a1665b8e2ece2d4cdcac8c780c60ac7c8cacdd5e3ebe2b26011b00000ffae00091776
1618*d3eddecec7c6c7c786c809c7c7c6c8cedfedd17716ae0000ffac00070363d4ecd7c8c6c78ec806
1619*c7c6c8d6edcd5dad0000ffab00052db1efd9c8c68ec80bc7c7c6c6c5c4c2c3d7eca925ab0000ff
1620*aa000459dee7cac689c880c703c6c6c5c580c400c380c205c1bec4e3d64baa0000ffa900047cee
1621*d9c6c786c802c7c7c680c500c480c301c2c280c100c080bf05bebcbbd2e771a90000ffa7000406
1622*91efd1c682c880c701c6c580c400c380c280c105c0c0bfbfbebe80bd07bcbbbbbab7c6ea7ea800
1623*00ffa7000994f2cdc6c8c7c6c6c5c580c400c380c207c1c1c0c0bfbfbebe80bd05bcbcbbbbbaba
1624*80b905b8b7b4c0e87da70000ffa600087defcbc4c5c4c4c3c381c209c1c1c0bfbfbebcbbbaba82
1625*b902babab980b801b7b780b605b5b4b2bee76da60000ffa500065aeeccc2c3c2c280c100c080bf
1626*10bebdbcbbbfc7d2dadededdd9cfc3bab5b580b605b5b5b4b4b3b380b203aebee34ba50000ffa4
1627*00062ddcd3bec1c1c080bf00be80bd14bcbabbc8dedfcfac907d747c92b0d2dddac1b2b1b380b2
1628*0ab1b1b0b0afafaeaac6d021a40000ffa3000306b6dfbd80be80bd0cbcbbbbbab9b7c8e2d28c45
1629*11028200070313478fd2ddbeae81af00ae80ad06acacaba9d4a202a30000ffa3000269e9be80bc
1630*0cbbbbbabab9b9b8b5badbd7771a8a00072181d7d3afaaacac80ab07aaaaa9a8a7acdd58a30000
1631*ffa200081bd3ccb8babab9b9b880b705b6b3bfe4a9278e00052eaddeb2a7a980a880a705a6a6a2
1632*bdc513a20000ffa2000181e481b780b607b5b5b4b1bee482049000080785dfb3a4a6a6a5a580a4
1633*04a3a2a2d76fa20000ffa100071ad4c4b4b5b5b4b480b304b2afbbe3679400067bdeada1a3a3a2
1634*80a105a0a09db4c411a10000ffa100076ce1b2b3b3b2b2b180b003aeb2e07a96000485daa39fa0
1635*809f069e9d9d9c9cd45da10000ffa0000305b9c9ae80b000af80ae04adaad6a50396000307abc9
1636*9b809d009c809b049a96bba702a00000ffa0000637dcb4adaeaead80ac04aba8bcd02298000527
1637*ceac989a9a8099059898969fcd28a00000ffa0000175d981ab80aa04a9a8a8db719a000578cf97
1638*979897809604959493cb66a00000ff9f000702a8c7a6a9a9a8a880a703a3b8c7149a00041bc8a6
1639*93958094059392928db696a00000ff9f000d12ccb4a5a7a6a6a5a5a4a3a1d17d9c000686c38f92
1640*9291918090038ca1bc0b9f0000ff9f000436d2a9a3a480a305a2a2a0a5d4389c00023fcc93808f
1641*078e8e8d8d8c92c7299f0000ff9f000255d2a380a180a0049f9cb0be099c000d10bf9e8b8d8c8c
1642*8b8b8a898cc3459f0000ff9f00056bd19e9f9f9e809d039c98be979d000401a0ac878a80890588
1643*888786c05e9f0000ff9f00047cc8999d9c809b049a9995c67c9e000485b5838787808604858481
1644*bd6b9f0000ff9f000389c4969a80990598989795cb6d9e00046fbb81858480830482827cb4749f
1645*0000ff9f000c87c3949897979696959592c96d9e00036abf8082808105807f7f7ab0829f0000ff
1646*9f000386c191958094059392928fc86d9e00026abd7d807f067e7e7d7d77ae819f0000ff9f000c
1647*85bf8e9292919190908f8cc66c9e000c69bb7b7d7d7c7c7b7b7a74ad809f0000ff9f000485be8b
1648*8f8f818e038d8ac46c9e000269b978807a007980780271ab7f9f0000ff9f000584bc888d8d8c80
1649*8b038a87c36c9e000569b875787777807603756ea87f9f0000ff9f000484b9868b8a8089048887
1650*84c16c9e000368b6737581740473736ca77f9f0000ff9f000384b8838880870586858582bf6b9e
1651*000468b4707372807104707069a67e9f0000ff9f000283b681808506848383827fbe6b9e000368
1652*b36d70806f056e6e6d67a47e9f0000ff9f000c83b47e838282818180807cbc6a9e000667b16b6d
1653*6d6c6c806b0264a27d9f0000ff9f000382b37b80807f057e7e7d7aba699e000267b068806a0669
1654*696868619f7c9f0000ff9f000c82b1797e7d7d7c7c7b7b77b96a9e000c67ad6568686767666665
1655*5f9e7c9f0000ff9f000581ae767b7b7a8079037874b6699e000266ac6381658064025d9d7c9f00
1656*00ff9f000481ad737878807704767572b5689e000566ab61646463806203615a9b7c9f0000ff9f
1657*00047dab707675807404737370b4649e000462aa5e61618060045f5e5799779f0000ff98000011
1658*823c0e3a99a76e737372727171706db08838893b013a3a823b013a3a813b833a033786a75b805e
1659*075d5d5c5c549693388139013c27980000ff9700150699bdb0b1b1b0afb3906d7170706f6f6e6d
1660*6b93b0ab80ac80ab81aa84a981a881a782a60ea5a4a8885a5c5c5b5b5a5a59537da682a002a2b5
1661*39970000ff97000b0ebb7e7173727271706f6f6e806d006c806b056a6a6b6a6a69806881670066
1662*80658064056363626261618060015f5e805d055c5b5a5a59598058005780560855565655555450
1663*a366970000ff9700060db4776d6e6e6d816c806b006a8069016867806680650164648063046262
1664*616160815f005e805d005c805b045a5a595958815781560d555554545352525150504f4b9c6397
1665*0000ff9700040db4766b6c806b096a6a696968686767666681658064056363626261618060045f
1666*5e5e5d5d805c055b5b5a5a5959805800578056025555548053805200518050064f4f4e4d499b62
1667*970000ff9700050db373686969806800678066096565646564646363626280610060805f095e5e
1668*5d5d5c5c5b5b5a5a805900588057015656805500548053005280510050804f804e074d4d4c4b4b
1669*479a62970000ff9700060db17165676666826500648063066262616160605f805e805d0a5c5c5b
1670*5b5a5a5959585857805680550554545353525280510050804f004e804d004c804b804a04494844
1671*9862970000ff9700040db16e63658064056363626261618060005f805e005d805c005b805a0159
1672*59805800578056805504545353525280510550504f4f4e4e804d004c804b054a4a494948488047
1673*0345419761970000ff9700030db06d61806200618060055f5f5e5e5d5d805c005b805a00598058
1674*005781560d5555545453535252515150504f4f804e004d804c014b4b804a004980480447474646
1675*45804403433f9561970000ff97000a0db06a5e60605f5e5e5d5d805c055b5b5a5a595980580057
1676*805602555554805380520a515150504f4f4e4e4d4d4c804b804a05494948484747804600458044
1677*004380420441403c9361970000ff97000b0dae675c5d5d5c5c5b5b5a5a80590058805701565680
1678*5500548053005280510050804f014e4e804d004c804b804a044948484747804605454544444343
1679*804200418040053f3e3d399160970000ff97000b0dad65595b5a5a595958585780568055055454
1680*5353525280510050804f004e804d014c4b824a0b49494848474746464545444480430042804103
1681*40403f3f803e063d3c3c3b379060970000ff9700060dac62565858578056805504545353525280
1682*510550504f4f4e4e804d054c4b4a47444280440e4140424546464545444443434242418040803f
1683*003e803d013c3c803b053a3939348f5f970000ff9700120dab6054565555545453535252515150
1684*504f4f804e004d804c164b4b4a4a4742495b76899598978d7c644b3e3d414242418040003f803e
1685*003d803c803b0b3a3a39393838373736318d5f970000ff9700040daa5e515380520a515150504f
1686*4f4e4e4d4d4c804b804a1649494846415282a5a88e756261616b819fa890613e3a3f803e003d80
1687*3c803b043a393938388037083636353534332e8a5f970000ff9700040da95b4f50804f014e4e80
1688*4d004c804b804a0e49484847474645404a84ae8d49150283001609336fa79c57353a3c3b3b3a3a
1689*3939383837373636353580340033803203312c895e970000ff9700030da7584c804d004c814b09
1690*4a4a4949484847474646804505433d60a992368a00071569ae7b39353938803708363635353434
1691*33333280318030042f2e29885e970000ff9700080da756494b4b4a4a49804880470e4646454544
1692*44434342403b70b35c038d00082b9b953b31353534348033003280318030092f2e2e2d2d2c2b27
1693*865d970000ff9700030da65347804800478046004580440143438042074140403f3874af3c9000
1694*05118b9a382f3381311130302f2f2e2e2d2d2c2c2b2b2a2a2824855d970000ff9700060da55144
1695*46464580440043804205414140403f3f803e033664b1339200050b8b8f2e2e2f802e802d0e2c2c
1696*2b2b2a2a29292828272621835d970000ff9700050da44e4243438042084140403f3f3e3e3d3d81
1697*3c03374baf4a940003109c6f26802c002b802a012929802800278026052524231f815d970000ff
1698*97000e0da34c3f4140403f3f3e3e3d3d3c3c803b003a80390235947a9600052da743252a298028
1699*05272726262525802406232222211c805c970000ff9700060da2493c3e3e3d803c803b003a8039
1700*0038803703305ba51697000b6f8924272726262524242323812207212120201e197e5b970000ff
1701*9700030da1463a803b053a3a39393838803707363535343330946198000518a03d1e222282230c
1702*222120201f1e1e1d1d1c177c5b970000ff9700040da04437398038003780360b35353434333332
1703*322d47a3199900166e5e010306080a0e101316191b1c1d1d1c1b1b19147b5b970000ff9700040d
1704*9f42353680358034023333328031803002276e839a000239850485000b0103070b0e1216171712
1705*795b970000ff9700030d9e3f328033003280318030082f2f2e2e2f2e298a549a0002108f1a8b00
1706*0501040807745a970000ff9700160d9d3c2f313130302f2f2e2e2d2d2e2e2d2820130f822f9a00
1707*02027e3a8f00016b57970000ff9700080d9d3a2d2f2e2e2d2d802c0a2d2c261b0f0400000a8c1a
1708*9b00016d4e8f00016b57970000ff9700070d9c382a2c2c2b2a802b03261b0e03820002178c0c9b
1709*00016a588f00016b57970000ff9700030d9b35288029042a271e10048500021b8d0b9b00016b58
1710*8f00016b57970000ff9700080d9a322528282316088800020d8d139b00016a538f00016b579700
1711*00ff9700060d9831241f11048a00020888289b000176418f00016b57970000ff9700040d99280d
1712*028c00020176459a0002088a268f00016b57970000ff9700020d8f0d8f00015a6c9a00022a8c08
1713*8f00016b57970000ff9700020c890b8f00022a8e0b9900015d6b9000016b58970000ff9700020c
1714*8a0c8f00020386439800020a8d2f9000016c59970000ff9700020c8a0c9000024289059700024d
1715*83038d00040102006f59970000ff9700020c8a0c90000206874f9600021696318c000601020405
1716*02725a970000ff9700020c8a0c9100022a9822950001796b8b000801020507080906745a970000
1717*ff9700020c8a0c920002538e139300025e8a0b89000a01030407090a0c0d0a765b970000ff9700
1718*020c8a0c930002698c1591000257931d88000c01030407090b0d0e0f110e7a5c970000ff970002
1719*0c8a0c930003046592298e00030b6b911e87000e01040506080b0d0f10111315127c5d970000ff
1720*9700020c8a0c9500034d9957098b00032b87791486001001030608090a0d0f111214151819167e
1721*5d970001ff079600020c8a0c96000225973f8b00017c6885001301020305080a0b0c0f11131415
1722*181a1c1d1a815e970003ffd386469400020c8b0c97000176468b0001794183001501020306080a
1723*0c0d0e10131516171a1c1e20211d845e9500010d0f80ff02fa7f059200020c8b0c97000178458b
1724*0001794581001701020406070a0c0e1011121517181a1b1e2021222421855f930003147fe8f082
1725*ff01b9459100020c8b0c97000179458b0001794580001802050708090c0e1012121517191b1c1d
1726*2022242526282689609200014eea86ff01f94e9000020c8b0c97000179458b001d794500030407
1727*090a0c0d1012131416191b1d1e1f22242627282b2c2a8c6090000505b0fffffefe83ff04feffff
1728*b0068e00020c8b0c97000179458b001d79470007090b0d0e0f12141517181b1d1f202223262829
1729*2a2c2f302d8e618f000145b980ff01fefe83ff00fe80ff01b2148d00020c8b0c97000179458200
1730*0206b15683001d794a000b0d0f1011131618191a1d1f21222326282a2c2d2e3133343190628e00
1731*074cf9fffffefffefe83ff06fefffdffffea4d8c00020c8c0c970001794581000406b3fff94c82
1732*001d7a4d040f11121415181a1b1c1e21232425282a2c2e2f30333537373592628c0009077ff8ff
1733*fefffefffefe83ff07fefffdfffdfff84d8b00020c8c0c970001794580000106b380ff01f94c81
1734*001d7c5008131415181a1c1d1f2023252628292c2e3031333537393a3b3995638b000106b380ff
1735*05fefffefffefe83ff09fefffdfffdfdffffb0068900020c8c0c9700057945000006b382ff01f9
1736*4c80001d7d530c16171a1c1e2021222527282a2b2e3031333437393b3c3d3f3d98648a000b14b1
1737*fffefdfffefffefffefe83ff05fefffdfffdfd80ff01b3068800020c8c0c97000479450033b384
1738*ff21f93f00007d5710191b1e2021222527292b2c2d3032343536393b3d3e404143419b6489000c
1739*4deafffffefdfffefffefffefe83ff0bfefffdfffdfdfffdffffb1148700020c8c0c9700047945
1740*008a38851220660e007f5a141d2022232426292b2d2e2f31343637383a3d3f4041444647459d65
1741*88000d4bf8fffcfffefdfffefffefffefe83ff07fefffdfffdfdfffd80ff01ea4d8600020c8c0c
1742*9700067944002388000080fb23000010915600805c1722242627282b2d2f3032333638393b3c3f
1743*41424345484a4b49a06586000f077ff7fffdfcfffefdfffefffefffefe83ff0dfefffdfffdfdff
1744*fdfffffcfff94c8500020c8c0c960005017a4400f9fb84872198cc4e0081601c2628292a2d2f31
1745*323336383a3c3d3e41434446474a4c4e4f4ca26685000106b380ff0bfdfcfffefdfffefffefffe
1746*fe83ff0efefffdfffdfdfffdfffffcfdfff84b8400020c8c0c9400070102057c4500d89b843421
1747*457341008263202a2b2c2e31333435383a3c3e3f4142454748494c4e50515251a56784001106b2
1748*fffdfcfffdfcfffefdfffefffefffefe83ff10fefffdfffdfdfffdfffffcfdfffff77e06820002
1749*0c8c0c92000a01030606087f4600b946eb82e822ebf82638008366242e2f3033353738393c3e3f
1750*40434547494a4b4d505253545655a76783001214b1fffffdfcfffdfcfffefdfffefffefffefe83
1751*ff18fefffdfffdfdfffdfffffcfdfffeffffba80791600000c8c0c8f000d010203060809090d81
1752*470089945782552257617f290084692830333537393a3b3e4042434447494b4c4e4f5254555758
1753*5a59a9678100140f4fe9fffefffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffd
1754*fffffcfdfffefbfc80ff05f2aa060a8c0c8e000d020306080a0c0d0d1183460004098607380000
1755*846b2b3437393b3c3d3f42444546494b4d4e5052545658595a5d5e5dac69002278b8f0fffffbfe
1756*fffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff0500
1757*000c088d0d8b000f01020405070a0c0e0f101115864d06058704220607896e2f393b3d3e404144
1758*4647484a4d4f50515456585a5b5c5f616260ae6900110080ff12fcfbfefffdfcfffdfcfffefdff
1759*fefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfcffff78765f0a088d0d8900540102
1760*050608090c0e101113141518809b898b8b8c8c8d8e8e8f9090919192ae69333d3f40414446484a
1761*4b4c4f51525355585a5c5d5f6163656561ae6800e2600cfffffcfbfefffdfcfffdfcfffefdfffe
1762*fffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfdff61d8e93e0a088d0d870036010205
1763*07090a0b0e1012131417191b1c2f3c3f4142434547494a4c4d4f51535452443e41424346484a4c
1764*4d4e51535556575a5c5e5f606381651b61ae6800d6360029fffdfbfefffdfcfffdfcfffefdfffe
1765*fffefffefe83ff18fefffdfffdfdfffdffff009f0e09c7cf00ebd9ce7c09098d0d850037010305
1766*06090b0c0d0f12141516191b1d1f201e1f22232526292b2c2e2f32343637393a40434446474a4c
1767*4e4f5153555758595c5e6061636482651b61ae6800b4fad700ac3f2b28df2a00fffdfcfffefdff
1768*fefffefffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c8f4e08098d0d8300360203
1769*0407090b0d0e1011141617181a1d1f21212426282a2b2c2f31333435383a3c3e3f404345474849
1770*4c4e4f51525557595a5c5d60626385651b61ae68009fb18f92bb89b4d0f827ab5d932bb24800ff
1771*fefffefffefe83ff1800df69d7a81de3b2a4a59d93877484e7827b6e6e3107098d0d8100360103
1772*0607080b0d0f1112131618191b1c1f21222425282a2c2d2e3033353637393c3e3f40434547494a
1773*4b4d5052535457595b5c5e60626487651b61ae6800918c707d8a227f778796969da7baef2be33f
1774*6e15fffffefe81ff531200ba03ccb2b4b2a29b8879695a4a373ab86661535218060a8d0c000001
1775*030608090a0d0f11121316181a1c1d1e21232526272a2c2e2f31323537393a3b3e404142444749
1776*4b4c4d4f52545556585b5d5e5f626489657161ae6800866e56636fe4333b4a5a697c8b9ba2b5b4
1777*b5d5190433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e5044410a060a8d0d00
1778*0305080a0b0c0e11131415171a1c1e1f2022252728292b2e3031323537393b3c3d404244454649
1779*4b4d4e5051545657595a5d5f6062648b656f61ae68007f5d46516bdefb091b2b3b4d606f8292a4
1780*b4c7cdc3d855aa7fff45bbece6d3c0ae9e8f7c69574734250f00efdcd27949403c05050a8e1003
1781*080a0c0e0f1013151718191c1e2021232427292a2c2d3032333436393b3d3e4041444647484b4d
1782*4f50515456585a5b5c5f6162648d656d61ae68007c55404e8fd8dfef03152537475d6c7c8fa1b4
1783*c3d3e6def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb96944410c060a9012050a0c
1784*0e0f1013151718191c1e2021222527292b2c2d30323335363a3c3d3e4042454748494b4e505152
1785*5457595a5c5d5f62638f646d60ae6900805a457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d0
1786*6355ffff000800c4c3c1b2a798887663534431220f00ecdfcd7f5b1d06099722101617181a1d1f
1787*2022232527292a2c2e3032343536393b3d3e3f42444647484b4d4f5052535658595b5c5f616263
1788*6567696a6a8269896a6a6966b66b00867e93d5dcef0312253444576976889babb5bcbacf1dbb75
1789*fefffffefe00f8f213d7afa6a39f9085766657473728180c00d368170177988d8f8f9192939495
1790*9696979899999b9c9d9e9e9fa1a1a2a3a4a4a6a6a7a8a9a9ababacadaeafb0b0b1b2b3b4b5b5b6
1791*86b789b81ab7babc3300b1180309182837475a697988909f9fa6b2e33533000080fe01ffff80fe
1792*00fd800015f2685f0cdcae988e8a7f7a6b5f57474d778500052f33833281338134833583368437
1793*83389a39163b1b0014ea5e4a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe80fd14fc
1794*fdfeaa00e8e96368bc33fbdcb69a7c7888828105c500153379bc7b7f9abedf0045eaa8c3838c5f
1795*7ffdfafcfdfd82fe01ffff80fe80fd08fcfdfdfbfefcf9fcfe80002835e3dbbdef47f2de498d85
1796*7c603b200d0400fffaf5f2ede8e5e0ddd8d5d0cdcac8c4c3c1bebcbbbbb980b700b680b736b9bb
1797*bbbcc0c1c3c8c6caced2d5d8dde2e5e8edf3f7fa0000040f224468808a87f1815d561f00439c00
1798*c6bf00fefcf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd11fcfdfdfbfefcf9fbfdf9f8fdfbf9f7
1799*fcfffc8000207f66eef06707b3d8ea662100e6cccbc3b1aaa79e95918b88817a7773716f6d6b6b
1800*8369366b6d6f7375777c81888d91979ea7abb3c6cdd1ee022d7f120024ef94df75bf00fe0000fc
1801*fdf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd35fcfdfdfbfefcf9fbfdf9
1802*f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fbff0075005b9bcc35e6c9af7b595758503e30302b
1803*262121242482213724242121262b303341595d5c5e89afd4ef53f6f9b3743800fdf5f6f6f8f9fb
1804*fdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfb
1805*fefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fefd55009995b3c305
1806*5fea98452f1e0d09f5e884e536e800090d1a3370aa0c7825061538005f00fcfef9fbfefbfcf5f6
1807*f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34
1808*fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fdfcfafefd
1809*fbf9fc5500d4aa72ce55d708c0f2840c07f21d08dff4ced4c880002bfdfafcfdfbf9fbfdf9fbfe
1810*fbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fefffffcff
1811*b5a30ecc4ef25c1600ded8e2011665134eccb5a300ffb2a307004e6bf5bda59e9e829d079e9fa6
1812*bdf5759900b2a300ffb0a30a0c4ec6a29ea2a7b2bfc8cf80d00acfc7bfb2a7a19da3cf59a0b0a3
1813*00ffaea31cbefba79ea3b3cde1f1f9fbfcfefefdfefefcfbf9f1dfcab3a29eaa065faea300ffac
1814*a30c2701a19eabc9e9fafdfbf7f5f480f300f280f30cf4f5f7fbfef9e6c7a99ea50bc3aca300ff
1815*aaa30b0065ad9eabcff3fefaf5f3f28af30af2f3f5fafef3cfaa9eb386aba300ffa9a30960e09f
1816*a3c8f3fef8f3f290f309f2f3f8fff1c6a2a0ecc8a9a300ffa8a3066ab89fb3e6fef898f306f9fe
1817*e4b09ebecaa8a300ffa7a306c6a69fc5f7fcf49af306f4fdf5bf9eabe1a7a300ffa6a305b8a3a1
1818*d2fdf99ef305f9fdcea0a3c6a6a300ffa5a305cca3a4dbfef6a0f305f7ffd4a0a4e7a5a300ffa4
1819*a30550a5a0dbfff59ef381f405f6ffd4a0abcaa4a300ffa3a305c3b2a0d3fef48ef382f287f384
1820*f405f6ffce9fb97aa3a300ffa2a30500da9ec6fef68cf303f4f6f9fc80fd03fcf9f6f482f387f4
1821*05f7fdc19de900a2a300ffa2a304629fb4f8f88bf310f7fdfbf4e6dbd3ced3dbe8f5fcfcf6f3f3
1822*89f404faf5b0a07fa2a300ffa1a30427a9a4e9fc8af312f7fdf5d9bdaaa3a09e9c9ea0a4aabedb
1823*f6fef78af404fde4a2af39a1a300ffa1a304f49ecbfff488f316f4fcf7d1ac9f9fb0e125465646
1824*1fdaae9e9faed5f9fcf588f404f5fec69e06a1a300ffa0a305f1a0adf5f7f287f308f5fee5b19e
1825*a3f3060084a30886e1eda09eb4e8fff688f404f9f2aba5c3a0a300ffa0a303f09ed5fe88f306f6
1826*fed6a39fe5f18aa306bedc9fa4d8fef688f403fed09e06a0a300ff9fa30499a2aef6f787f305f5
1827*fdcc9fa57f8ea30559a1a0d4fef685f406f5f5f9f3aaa6e79fa300ff9fa303309ecdfe87f305f4
1828*fed39fac5090a304f2aaa0d8ff83f482f503fec99e569fa300ff9ea3053fbda5ecf9f286f304fc
1829*e4a2a55892a306f8a3a4e8fcf4f485f504fbe7a2c7669ea300ff9ea304919fb9fbf486f304f7f6
1830*b09f7f94a3055f9fb3f8f7f485f504f6f9b3a03d9ea300ff9ea303469ed1fe87f303fed09dea95
1831*a30400da9ed4fe87f503fecd9e6e9ea300ff9da30400dfa3e6fa86f304f8f3aba5c396a304f1a1
1832*aef6f886f503fce1a1f19ea300ff9da3047fb2aaf5f686f303fdd59e0198a303ee9fdafe86f504
1833*f8f3a7b63f9da300ff9da3044e9fb9faf485f304f4fbba9e7d98a3040c9fbcfcf685f504f7f9b4
1834*a4e79da300ff9da303f89ec5fc86f304f7f0a7bb3f98a30487b1aaf4f786f503fbbf9f509da300
1835*ff9da3038a9dcdfd83f380f403fbe1a2f79aa303e2a3e6fa86f503feca9db89da300ff9da30446
1836*9ed5fdf280f382f403fdd59f419aa30323a0dafd84f505f6f6ffd09d7f9da300ff9da30543a0da
1837*fcf2f384f403ffcf9d9e9aa303629ed1ff82f581f603ffd49e439da300ff9da30443a0d9fcf385
1838*f403ffcf9da69aa305a29dcffff5f584f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9d
1839*a29aa304a29dcffff585f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29d
1840*d0ff86f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603feda
1841*a0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9d
1842*a30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9da30343a0d9fd86
1843*f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29a
1844*a303a29dd0ff84f605f7f7ffdaa0439da300ff9da30343a0d9fd85f404f5ffcf9da29aa303a29d
1845*d0ff82f681f703ffdaa0439da300ff9da30343a0d9fd82f481f503ffcf9da29aa303a29dd0ff80
1846*f683f703ffdaa0439da300ff9da30343a0d9fd80f483f503ffcf9da29aa304a29dd0fff685f703
1847*ffdaa0439da300ff9da30453a0d9fdf385f503ffcf9dc29aa303c29dd0ff86f703ffdaa0539da3
1848*00ff98a308e758373f61fba0d9fd86f504ffcf9d2158983f0458219dd0ff86f709ffdaa0fb613f
1849*3f370e6697a300ff96a3023f1ba8829f029cd8fd86f502ffcd999c9f0299ceff86f702ffd99c82
1850*9f02a1c99996a300ff96a3024ea2aa82bc02bae3fc86f502fddcb89cbc02b8ddfe86f702fde4ba
1851*81bc04bdb5a2be1f95a300ff95a30400c1a4e7fd82fa01f9f786f500f885fa98fb00f986f700f9
1852*83fb04fcfbbe9fe795a300ff95a304cca9a8f7f882f68af582f690f786f88af701f8f881f903ff
1853*d19d9695a300ff95a304ccaaa8f5f791f591f695f783f803ffd09da295a300ff95a304ccaaa8f5
1854*f78ef591f695f786f803ffd09da295a300ff95a304ccaaa8f5f78cf591f695f788f803ffd09da2
1855*95a300ff95a304ccaaa8f5f78af590f696f78af803ffd09da295a300ff95a304ccaaa8f5f788f5
1856*90f696f78cf803ffd09da295a300ff95a304ccaaa8f5f786f590f696f78ef803ffd09da295a300
1857*ff95a304ccaaa8f5f784f590f695f791f803ffd09da295a300ff95a304ccaaa8f5f781f591f695
1858*f793f803ffd09da295a300ff95a306ccaaa8f5f7f5f591f695f795f803ffd09da295a300ff95a3
1859*05ccaaa8f5f7f590f695f796f804f9ffd09da295a300ff95a304ccaaa8f6f88ff689f701f9fd82
1860*ff02fdfaf880f794f881f903ffd09da295a300ff95a304ccaaa8f6f88cf689f70ef8fdfef7e7d9
1861*d0d0cfd4e0f2fcfffb93f883f903ffd09da295a300ff95a304ccaaa8f6f88af689f712f8fefde5
1862*c5ada39f9d9d9c9ea2a7bad7f5fffb8ff885f903ffd09da295a300ff95a304ccaaa8f6f888f68a
1863*f714f9ffe8bca29eaadc2678a69e50fabb9f9eacd3fafe8cf887f903ffd09da295a300ff95a304
1864*ccaaa8f6f886f68bf707fbfccea39ec686c884a3080061fba39eb6eefff988f889f903ffd09da2
1865*95a300ff95a304ccaaa8f6f884f68cf706fbf8bf9eac6e0089a306cad89ea9e5fff985f88bf903
1866*ffd09da295a300ff95a304ccaaa8f6f882f68df705fafabb9dc44e8ca3050026a0a7e5ff82f88e
1867*f903ffd09da295a300ff95a304ccaaa8f6f880f68ef705f8fec69dc6668fa306659fabf0fdf8f8
1868*90f903ffd09da295a300ff95a305ccaaa8f6f8f690f704ffdea0b63991a305169eb9fbfaf890f9
1869*03ffd09da295a300ff95a304ccaaa8f6f990f704fbf5ae9f1a92a30424cd9fd9ff91f903ffd09d
1870*a295a300ff95a304ccaaa8f6f990f703ffd19efa94a3097da1aff8f9f7f8f8f9f982fa86f903ff
1871*d09da295a300ff95a304ccaaa8f6f98ff704f9f8afa37195a30fe6a0d9f1e2e4e7e8eaeceff1f4
1872*f6f8f984fa03ffd09da295a300ff95a304ccaaa8f6f98ef704f8fee3a1e196a304ec9fbef4e381
1873*e280e30ee4e5e7eaedf0f4f8fafbfbffd09da295a300ff95a304ccaaa8f6f98bf707f8f9faf8fe
1874*cb9e7896a30586aeabf0e7e383e401e5e580e409e5e6e7eaeff2fed09da295a300ff95a304ccaa
1875*a8f6f988f70af8f9f9f6f0eae4f0b99fe397a304dba4e3ece380e482e585e604e5f6ce9da295a3
1876*00ff95a304ccaaa8f6f986f70cf9f8f6eee6dfdcdbdeefb0a75c97a30516a1d8f0e3e482e582e6
1877*83e703f7ce9da295a300ff95a304ccaaa8f6f983f70ff8f8f5eee5dedbdbdcdddce1eea8b70097
1878*a30446a0d5f1e481e581e682e780e804e7f7ce9da295a300ff95a304ccaaa8f6f980f708f8f8f7
1879*f0e7dfdbdadc80dd06dedce3eda7bf2497a30648a0d6f2e4e5e581e682e783e803f8ce9da295a3
1880*00ff95a30eccaaa8f6f9f7f8f8f5ece2dcdadbdc80dd81de04e1eeacabcc97a3042ea0d7f2e481
1881*e682e782e880e903f8ce9da295a300ff95a30bccaaa8f6faf9f3e9dfdbdbdc81dd83de04e0f0b6
1882*a3da97a306f3a3e0f0e5e6e682e782e882e903f8ce9da295a300ff95a309ccaaa9f7f4e7dedbdb
1883*dc81dd82de81df03f1c39ec696a30524baa6ecebe682e782e882e905eae9f8ce9da295a300ff95
1884*a307ccaba9f0e0dadcdc81dd82de82df04deefd7a00196a304f19fb7f4e881e782e881e981ea04
1885*e9f8ce9da295a300ff95a305ccaba8ebdfdc81dd82de82df07e0e0dfe7eca8aebf95a306189fd1
1886*f5e6e7e782e881e984ea03f9ce9da295a300ff95a304ccaba8ede080dd82de82df82e004e1f4c3
1887*9e4694a3050faaa8ecede681e882e982ea81eb03f9ce9da295a300ff95a305ccaba8ede0dd82de
1888*81df82e080e105e0ebe7a5aec393a303069dc9f881e882e982ea81eb05ececf9cf9da295a300ff
1889*95a304ccaba8ede181de81df82e083e105e3f5ca9ee17f91a306cc9faef0eee7e882e982ea82eb
1890*80ec03facf9da295a300ff95a305ccaba8ede1de82df82e082e180e205e1e9f3b49e1d90a30661
1891*aba1dff5e7e881e983ea81eb00ec81ed03fbcf9da295a300ff95a304ccaba8ede181df82e082e1
1892*82e207e3e2efe9ac9f18008da30630ab9fd1f9eae880e983ea04ebebecebec80ed06eeedeefbcf
1893*9da295a300ff95a306ccaba8ede2dfdf82e082e182e282e305f3e8ac9eda998aa3092456a3a1ce
1894*f8ece8e9e983ea01ebeb80ec80ed80ee05efeffccf9da295a300ff95a304ccaba8ede282e082e1
1895*81e282e381e406f2ecb79ea923b687a30773ce9fa7d8faece884ea01ebeb80ec81ed80ee06efef
1896*f0fccf9da295a301ffa294a304ccaba8eee380e082e181e282e384e405f0f5cea7a23787a306ff
1897*a1b8e9f7ebe881ea81eb80ec81ed00ee80ef81f003fccf9da295a303ffa69d9f92a305ccaba8ee
1898*e3e081e182e282e382e481e505e4ebfac39e3787a30506a3e2f8e9e980ea81eb80ec81ed00ee80
1899*ef80f006f1f0f1fdcf9da293a307a1a1ffefd4bb9ba290a304ccaba8eee480e182e282e382e482
1900*e506e6e6e5f5c59e3f87a30606a3e0f3e9eaea82eb80ec80ed00ee80ef80f080f105f2f2fecf9d
1901*a291a303a19ea8a980ff03fdd0a49d8fa305ccaba8eee4e182e282e382e482e581e604e7f5c49e
1902*3f87a30406a3e0f3e982eb80ec00ed80ee80ef81f080f180f203fecf9da28fa305a29faad1f7f9
1903*82ff03e6b99da28da304ccaba8eee481e282e382e481e582e680e703f5c49e3f87a30406a3e0f3
1904*ea80eb03ecedeced80ee81ef80f000f180f280f304f4ffcf9da28ea303a19fbff886ff03fdbf9f
1905*a18ca306ccaba8efe5e2e282e382e481e582e682e703f6c49e3f81a300a282a30606a3e1f4ebeb
1906*ec80ed81ee80ef03f0f1f0f180f281f305f4f4ffcf9da28da3069da3e2fffffefe83ff05feffff
1907*e2a3a08ba304ccaba8efe581e382e482e582e683e704e8f6c49e3f80a302a1a2a181a30406a3e1
1908*f4eb80ed81ee03eff0eff080f180f281f300f480f503ffd09da28ca3029db9e680ff01fefe83ff
1909*06fefffeffe3a79f8aa306ccaba8efe6e3e382e482e582e682e781e80af6c49e3fa3a3a0a3e3c2
1910*9c80a30606a3e1f4eceded80ee00ef80f080f181f280f300f482f503ffd09da28aa309a29abefd
1911*fffffefffefe83ff08fefffdfffff7be9ca288a305ccaba8efe6e381e482e582e682e782e814e9
1912*f6c49e3fa3a0a3e4fffcbe9ca3a306a3e1f6ecee80ef80f080f181f200f380f480f580f604f7ff
1913*d09da289a30aa0a5cffcfffefffefffefe83ff09fefffdfffdfffdbe9fa187a304ccaba8efe680
1914*e482e582e682e781e881e906f6c49e3fa0a3e480ff0afdbe9ca306a3e1f6eeefef80f080f181f2
1915*00f380f480f581f605f7f7ffd09da288a30ba0a2e3fffefffefffefffefe83ff0afefffdfffdfd
1916*ffffe2a3a086a305ccaba8efe6e482e582e682e781e882e906eaf7c49e35a3e482ff07fdbe9d06
1917*a3e1f6ee80f081f180f200f380f480f581f607f7f8f7f8ffd09da287a30c9fa7e2fffefdfffeff
1918*fefffefe83ff0bfefffdfffdfdfffeffe4a2a085a304ccaba8efe781e581e682e782e882e980ea
1919*04f7c49d57e484ff08fdb900a3e1f7eff0f080f100f280f380f481f580f600f780f805f9f8ffd0
1920*9da286a30d9cbef7fffffefdfffefffefffefe83ff0cfefffdfffdfdfffdffffe2a79f84a306cc
1921*aba8f0e7e5e581e682e782e882e982ea04f7c49890388512096606a2e2f8eff1f2f1f280f381f4
1922*80f500f680f780f880f904faffd09da284a30fa29abdfdfffcfffefdfffefffefffefe83ff07fe
1923*fffdfffdfdfffd80ff02f7bf9c83a304ccaba8f0e881e682e782e882e982ea08ebebf8c59ba072
1924*000080fb0a00000c7bfc9fe2f8f1f2f281f380f403f5f6f5f680f781f880f905fafaffd19da283
1925*a310a0a5cffbfffdfcfffefdfffefffefffefe83ff0efefffdfffdfdfffdfffffcfffdbe9c82a3
1926*06ccaba8f0e8e6e682e782e882e983ea07ebebecf8c59c75d984870695cceea0e2f9f281f303f4
1927*f5f4f580f681f780f80af9faf9fafbfafbffd19da282a311a0a3e4fffdfffdfcfffefdfffefffe
1928*fffefe83ff10fefffdfffdfdfffdfffffcfdfffcbc9aa280a304ccaba8f0e882e782e882e983ea
1929*09ebebecebecf8c59d557c8434094273e3a2e2faf2f3f3f480f580f681f703f8f9f8f980fa80fb
1930*05fcfbffd19da281a312a0a2e3fffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdff
1931*fdfffffcfdfffffacfa49b9da1bbaba8f0e980e782e881e982ea03ebeaebeb80ec07ededf9c59e
1932*371ce282df08e2eb1bd9a3e3faf4f480f580f681f700f880f980fa80fb80fc1bfdffd19da2a3a2
1933*a19fa7e1fffffdfcfffdfcfffefdfffefffefffefe83ff19fefffdfffdfdfffdfffffcfdfffefc
1934*ffe6ceceabbbaaa8f0e9e782e881e982ea81eb80ec81ed05f9c59f0d916f826c096f7695cba4e3
1935*faf4f5f580f681f700f880f980fa81fb80fc1cfdfdffd19d9f9ca3a5bff7fffefffdfcfffdfcff
1936*fefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff05fabfaaa8f0ea80e8
1937*82e982ea82eb80ec80ed06eeeff9c49dabaf82ae08adaeaeb0a5a2e2fbf581f680f700f880f980
1938*fa81fb03fcfdfcfd80fe1affd19cbccce5f9fffefbfefffdfcfffdfcfffefdfffefffefffefe83
1939*ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff060008ada7f1eae882e982ea82eb80ec0aedee
1940*edeeefeeeffac7a1a687a703a5a5e4fb80f600f780f880f981fa80fb00fc80fd80fe80ff03d197
1941*c20080ff12fcfbfefffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfd
1942*fffefbfcffff786f77aba7f1eb81e983ea81eb80ec00ed80ee80ef04f0f0f7f1ea81eb86ec03f8
1943*f9f6f780f881f980fa00fb80fc80fd80fe82ff19d1975d600cfffffcfbfefffdfcfffdfcfffefd
1944*fffefffefffefe83ff1afefffdfffdfdfffdfffffcfdfffefbfdff61d8e058aba7f1ebe9e983ea
1945*81eb00ec80ed80ee81ef80f003f2f5f6f680f781f880f901fafb83f880f900fa80fb80fc81fd01
1946*fefe84ff19d19853190029fffdfbfefffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffd
1947*fdfffdffff009f0e09c7cf00ebd9c88ea8a7f1eb83ea01ebeb80ec80ed81ee80ef00f080f181f2
1948*80f380f401f5f580f680f780f803f9faf9fa80fb81fc80fd00fe87ff19d19917e4d700ac3f2b28
1949*df2a00fffdfcfffefdfffefffefffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c89
1950*5ea7a8f1ec81ea01ebeb80ec81ed80ee00ef80f080f181f280f300f480f580f681f780f800f980
1951*fa80fb81fc03fdfefdfe89ff19d19a029e8f92bb89b4d0f827ab5d932bb24800fffefffefffefe
1952*83ff1c00df69d7a81de3b2a4a59d93877484e7827b6e6942a5a8f1eceaeaebeb80ec81ed03eeef
1953*eeef80f080f181f200f380f480f580f681f700f880f980fa80fb81fc00fd80fe8bff19d19bf378
1954*707d8a227f778796969da7baef2be33f6e15fffffefe81ff1c1200ba03ccb2b4b2a29b8879695a
1955*4a373ab86661534c28a5a8f2edebeb80ec81ed00ee80ef80f080f181f200f380f480f580f681f7
1956*00f880f980fa81fb80fc00fd80fe8dff38d19ce85b56636fe4333b4a5a697c8b9ba2b5b4b5d519
1957*0433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e50443c1aa4a8f2ed81ec80ed
1958*00ee80ef80f081f180f200f380f480f581f680f700f880f980fa81fb03fcfdfcfd80fe8fff3ed1
1959*9ce04646516bdefb091b2b3b4d606f8292a4b4c7cdc3d855aa7fff45bbece6d3c0ae9e8f7c6957
1960*4734250f00efdcd27949403618a4a8f2eeececedeeedee80ef81f080f103f2f3f2f380f481f580
1961*f600f780f880f981fa80fb00fc80fd80fe91ff3ad19cdf42404e8fd8dfef03152537475d6c7c8f
1962*a1b4c3d3e6def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb969443d1da4a8f2eeed
1963*ed80ee80ef80f080f101f2f280f380f480f503f6f7f6f781f880f980fa00fb80fc80fd80fe93ff
1964*3ad19ce148457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d06355ffff000800c4c3c1b2a798
1965*887663534431220f00ecdfcd7f562ea5a8f5f1efef80f080f101f2f280f381f480f503f6f6f7f7
1966*81f880f980fa80fb01fcfc80fd80fe97ff38d29be96a93d5dcef0312253444576976889babb5bc
1967*bacf1dbb75fefffffefe00f8f213d7afa6a39f9085766657473728180c00cd74b1a3e1fa80f885
1968*f984fa80fb85fc82fd84fe9aff18faba9e18fb0309182837475a697988909f9fa6b2e335330000
1969*80fe01ffff80fe00fd800014f2685f0cdcae988e8a7f7a6b5f57474a620f9fa6ba87bb8dbc9dbd
1970*88bc16bdb09ebb0e554a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe80fd14fcfdfe
1971*aa00e8e96368bc33fbdcb69a7c78828213ab809e019f9f8b9e019d9e9e9d899e1b9f9f9e9e9da1
1972*d0caa87b7f9abedf0045eaa8c3838c5f7ffdfafcfdfd82fe01ffff80fe80fd08fcfdfdfbfefcf9
1973*fcfe80002835e3dbbdef47e6c685fcf5e1ab7c5c453b3a36352f2c2924211c1614110c09060401
1974*00fffaf8f6f6f584f336f5f6f6f8fbff00040406090e1116191e2124292f323539383e495f85b9
1975*e8f5fa49853e561f00439c00c6bf00fefcf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd11fcfdfd
1976*fbfefcf9fbfdf9f8fdfbf9f7fcfffc81001e66ddb438e292c1d85513f2dac0bfb7a49e9b928886
1977*807c756f6b6766646260845e3660626266696b71757c82868b929b9ea7babfc3e1f6216d00e605
1978*bf5f9f75bf7ff90000fcfdf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd35
1979*fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fbff0075005b9bcc35e6c9
1980*af7b595758503e30302b262121242482213724242121262b303341595d5c5e89afd4ef53f6f9b3
1981*743800fdf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ff
1982*ff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefc
1983*f9fefd55009995b3c3055fea98452f1e0d09f5e884e536e800090d1a3370aa0c7825061538005f
1984*00fcfef9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd
1985*82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fa
1986*fefafefcf9fdfcfafefdfbf9fc5500d4aa72ce55d708c0f2840c07f21d08dff4ced4c880002bfd
1987*fafcfdfbf9fbfdf9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fc
1988*fafcfdfd82fefffffcffb53d0e0039b880675e5250545f6783c43900b53d00ffb23d070039865a
1989*42393433823207333439425a895500b23d00ffb03d0a7f7b4738333a455872839080910a908270
1990*59453933384b7fb6b03d00ffae3d1c045d3a343d5c8cb0cdd7d8d7d8d5d3d5d9d7d8d8cdae865a
1991*3c343c613fae3d00ffac3d0e895f38344c85bedadacec0b7b4b1b080af0eb0b2b4b7c0cfdad9ba
1992*8148343963c3ac3d00ffaa3d0e00833e344c91d1decab8b1afb0b1b184b20db1b1b0afb1b9ccdd
1993*d0914a344090ab3d00ffa93d0a9e53363e82d2dcc3b2afb18eb20ab1afb2c2dccd7f3b375724a9
1994*3d00ffa83d08e443345abae1c4b1b08cb201b1b280b10bb0afafacaec4dfb454334508a83d00ff
1995*a73d07a83a367bd9d4b5af88b201b1b280b103b0b0afaf80ae00ad80ac07a8afd1d271343db1a7
1996*3d00ffa63d07a2393894e2c6afb186b280b103b0afb0af80ae00ad80ac00ab81aa08a9a8a6c0dc
1997*8b383aa8a63d00ffa53d06aa393ea4e1bdaf80b201b1b280b100b081af07aeaeadadacacabab80
1998*aa01a9a980a880a707a6a2b3dc96383ab7a53d00ffa43d07da3a39a6e1b8afb280b100b080af02
1999*aeaead80ac04abaaabaaaa80a980a805a7a7a6a6a5a580a407a39faedb95383d08a43d00ffa33d
2000*09c3413796e0b6aeb0afaf80ae00ad80ac07abaaaaa9a7a6a5a581a482a580a401a3a380a208a1
2001*a19dabd98a354466a33d00ffa23d080050347ce1b9abaead80ac01abab80aa10a9a9a6a6abb4bf
2002*c7cbcacac6bcafa6a1a080a201a1a180a00a9f9f9e9e9aacd771335600a23d00ffa23d0782365c
2003*d7bfa9abab80aa80a980a814a5a6b4ccd4ccb4a1948c94a3b6cdd2c9af9e9d9f9f819e0a9d9d9c
2004*9c9b97b5cb53378da23d00ffa13d05893d3fbccda780a981a818a7a7a6a4a2b4d2ce9e6b493d38
2005*343234383e4a6ea1cdcdac9a819c009b809a0899999795c3ae3b40eea13d00ffa13d095a3487da
2006*aba7a8a7a7a680a51ca4a4a1a6c9d28f4c35353e516a787e78684e3e35365197d1c29c97999981
2007*98809705949ad17b3461a13d00ffa03d05173750d0baa380a580a40ca3a3a29facd6b45533395a
2008*bf55843d0a28b15637345ab5d0a0949780960195958094058facc44a3964a03d00ffa03d045835
2009*97d2a281a30ca2a2a1a1a09cabd7983c3755178a3d150451363e9ad2a291949493939292919190
2010*8fc88a3560a03d00ff9f3d0555384fcfb19f80a100a0809f079e9ba9d685363b8d8e3d097f3837
2011*92d19c8f9291918090078f8e8ba3c2493bd09f3d00ff9f3d04703489d09e809f019e9e809d069b
2012*9fd293353eda903d09b83c3799cb918d8f8e8e808d068c8b8bc77d357e9f3d00ff9e3d057f4440
2013*bdb79a809d009c809b069997c5af3b3add923d0aba393eb2b98a8c8c8b8c8b808a0585abb03d49
2014*009e3d00ff9e3d08f23764d1a19a9b9b9a8099069895abcb54378d943d12813658c89c878a8a89
2015*89888887858ec65937339e3d00ff9e3d0478348ec79781988097059696cc8b3356953d12005035
2016*90c186878786858685858482bc8334879e3d00ff9d3d1200513db1b5939797969695959491a7c5
2017*4b3a64963d05173850c396828184078383827da7a23b579e3d00ff9d3d11003f4ac8a293959493
2018*939292918fc193345f983d04583699b37f8082098180807f7d92ba45427f9d3d00ff9d3d063936
2019*63c9969292819106908f93ca6435eb983d04c13668c283807f817e057c82c05939d09d3d00ff9d
2020*3d08ba3578c59190908f8f808e058b9fbd44437f983d07874048bd8e7b7e7d807c067b7a7cb86c
2021*36da9d3d00ff9d3d05913387c08c8e818d068c8c87aea53b5a9a3d05533ea99c787b807a077979
2022*7877b27d34a29d3d00ff9d3d05783593b7878c808b078a8a8984b59336769a3d05693897a57479
2023*80780777777672ae86338d9d3d00ff9d3d0475389bb4858089088888878683ba8733999a3d0482
2024*3489ab72807600758074046ea48c35779d3d00ff9d3d0575389ab3828780860785858481b98833
2025*9c9a3d059a3385af717480738072046ca29538759d3d00ff9d3d04753899b1808184078383827f
2026*b888339a9a3d059a3485ae6f72807180700469a09438759d3d00ff9d3d04753899af7e80820881
2027*80807f7cb687339a9a3d049a3485ad6d806f006e806d04669f9338759d3d00ff9d3d04753898ad
2028*7b807f817e047bb587339a9a3d069a3484aa6a6d6d816c056b649c9338759d3d00ff9d3d107538
2029*98ac797e7e7d7d7c7c7b78b387339a9a3d109a3484a9686b6b6a6a696968629b9338759d3d00ff
2030*9d3d06753897aa777c7b807a06797976b186339a9a3d069a3484a866686880670666665f999238
2031*759d3d00ff9d3d06753896a8757979807806777773b086339a9a3d069a3483a663666680650664
2032*645e989138759d3d00ff9d3d05753896a6727780760775747471af86349a9a3d109a3483a46264
2033*6463636262615b959138759d3d00ff9d3d04753896a56f807408737372726fad85349a9a3d049a
2034*3482a25f80610860605f5f59949038759d3d00ff9d3d04753896a46d807208717170706cab8434
2035*9a9a3d049a3481a15c805f085e5e5d5d56939038759d3d00ff9d3d10753895a26b70706f6f6e6e
2036*6d6aaa84349a9a3d109a34819f5a5d5d5c5c5b5a5a53908f38759d3d00ff9d3d047b3894a06880
2037*6d806c056b68a88434a69a3d07a634819e575a5b5a815904518f8f387b9d3d00ff983d16d0ddd1
2038*d4e15b38939e666c6b6b6a6a696965a683346add98d417dd6a34819c55595858575756564e8d8e
2039*385be1d4d4d12100973d00ff963d027f683c81370f3632919d636969686867676663a5802e8e37
2040*8b38052e7d9b52565680550654544c8c8c32378238014a55963d00ff963d047b3b486666806504
2041*62a59a606780660765656461a3985f65826401656582640165658b640763635d95995054548053
2042*055251498a9f6081630464563c46bf953d00ff953d0500463fa1b1a680a704a6aa856165806405
2043*6362625f89a682a281a182a0829f819e809d819c809b039f7e5052805105504f4f49739d809806
2044*979698ac6138b7953d00ff953d10003d47b5716566666564646363626261618060825f005e805d
2045*015c5c805b015a5a805901585880570156568155005480530652525150504f4f804e0e4d4c4d4c
2046*4b4c4c4b4a4a46947f3596953d00ff953d08003d46b06b616262618260805f805e015d5c805b00
2047*5a805980580157578056005581548053095252515150504f4f4e4e804d044e4d4d4c4c804b014a
2048*49804807474746428f7d359a953d00ff953d07003d46af695e6060815f0d5e5e5d5d5c5c5b5b5a
2049*5a595a59598058005780568055015454805301525280510050804f804e004d814c014b4b804a03
2050*49484948804780460545418e7d359a953d00ff953d07003d46ae675d5e5e805d005c805b015a5a
2051*8059805800578056805580548053005280510050804f804e804d004c804b804a03494948488147
2052*0d4646454544444343423e8c7c359a953d00ff953d07003d46ae655a5c5b805a81598058025756
2053*56805581540353535252805102504f4f804e044d4d4c4d4c804b804a0649484847484747804600
2054*4580440343434242804105403c8b7c359a953d00ff953d05003d46ac6258815900588057015656
2055*80558054015353805200518050014f4f804e034d4c4d4c814b054a4a4949484880478046054545
2056*4444434380428041014040803f053d39897b359a953d00ff953d09003d46ac6056575756568155
2057*0154548053045252515150804f814e034d4d4c4c804b024a4a4980488147804604454444434380
2058*4280418040043f3f3e3e3d803c053b37887b359a953d00ff953d09003d46ab5e53555554548053
2059*01525280510050804f804e004d814c014b4b804a03494849488147004680450544444343424280
2060*418040013f3f803e003d803c803b073a3a3935867b359a953d00ff953d08003d46a95c51535352
2061*80510050804f804e804d004c804b804a0349494848814705464645454444804301424280410340
2062*403f3f803e003d803c803b803a80390738373633847a359a953d00ff953d09003d46a9594f5150
2063*4f4f804e044d4d4c4d4c804b804a06494848474847478046004580440043804281410940403f3f
2064*3e3e3d3d3c3c803b813a0f393938383737363635353430837a359a953d00ff953d0b003d46a857
2065*4c4e4e4d4c4d4c814b054a4a494948488047804609454544444343413f3c39803c0639383a3d3e
2066*3e3d803c803b013a3a80398038003780360135358034073333322e8179359a953d00ff953d0600
2067*3d46a7554a4c804b024a4a49804881478046044544444343804213413e3a41526b7c878b8a8071
2068*5a4336363a3b3a3a8039003880370436363536358034803309323131302f2b8079369a953d00ff
2069*953d0a003d46a652484a494849488147004680450544444343424280411540403e394a769aa395
2070*887c7b7a818e9f9f83583733388037003680358134053333323231318030802f052e297f79369a
2071*953d00ff953d05003d46a55045804705464645454444804301424280410e40403f3f3e3e384279
2072*a4966b4a3d3980350c373b425c83a3904e2f343534348033003280318130012f2f802e082d2d2c
2073*2b277c78369a953d00ff953d06003d46a34e444580440043804281412240403f3f3e3e3d3d3c3b
2074*35579d9a5f3b363c506d8b9c997c5b433837497ea571322f3280318030012f2f802e012d2d802c
2075*002b802a0528247b78369a953d00ff953d05003d46a24c4180420141418040803f023e3e3d803c
2076*803b093a3466aa773d37489024843d09aae15d3a36579e89352c802f802e002d802c002b802a80
2077*2980280527227a78369a953d00ff953d05003d46a14a3f8040003f803e003d803c813b0c3a3a39
2078*3938326aa961363e87aa893d0808503745948e332a2d802c022b2a2a8029042828272827802606
2079*25241f7877369a953d00ff953d08003d46a0483c3e3e3d803c013b3b803a80390138388037062f
2080*5ba85d3548398c3d08006d3942948328292a8029032827282780260125258024072322221d7776
2081*369a953d00ff953d05003d469f453a803b803a0539393838373780368035063043a36b3649008f
2082*3d058339469d652180270526262525242480238122072121201b7475369a953d00ff953d0e003d
2083*469e43383a393938383737363681350a34343333322e87893844ee913d0a6737599e3c20252424
2084*2323822200218020081f1f1e1d187375369a953d00ff953d0b003d469d41353737363635358034
2085*80330032803106302a53a24b39c6923d0f914c38817e1f22232222212120201f1f801e091d1d1c
2086*1c1b167175369a953d00ff953d06003d469b3e33358034053333323231318030802f052e2b897a
2087*365c943d05eb384c99371b841f011e1d801c091b1b1a1a18147074369a953d00ff953d07003d46
2088*9b3d31333280318030012f2f802e802d05283f9d4c3a46953d1a55397d5501030507090c0e1114
2089*1718191a1a19181816116e74369a953d00ff953d05003d469a3a2e8030012f2f802e002d802c00
2090*2b802a0422638d3b52963d04b6395d7b0385000d010306090c10131414106d74369a953d00ff95
2091*3d09003d4699382c2e2e2d2d802c002b802a8029062a28247d70378b963d0428404689188b0007
2092*010407076973369a953d00ff953d07003d4598362a2c2b802a80298028092928241c110d7a5838
2093*12973d03503e82348f00035f70379a953d00ff953d1a003d459633272929282827282727282722
2094*170e04000008854d3cb9973d03673b7b458f00035f70379a953d00ff953d07003d459530252727
2095*802605272621170c0382000415874543aa973d03783a7b4f8f00035f70379a953d00ff953d0d00
2096*3d45952e2325242425221a0e048500041988434691973d03793a7b4f8f00035f70379a953d00ff
2097*953d0a003d45942c2123231f14078800040b86493d00973d036f3a7a4a8f00035f70379a953d00
2098*ff953d08003d45932b201c0f038a0004077f54396d973d035a3d7f398f00035f70379a953d00ff
2099*953d06003d4592230c028d00036c6538a8963d0491444288238f00035f70379a953d00ff953d04
2100*003d458a0b8f0003507b395f963d0417385583078f00035f70379a953d00ff953d04003e45830a
2101*8f0004258b443f7f953d03683974609000035f70379a953d00ff953d04003e45840a8f0004037a
2102*643878943d04df3d438a2a9000035f70379a953d00ff953d04003e45840a9000043b8b3f3fc393
2103*3d0460376a77039000036070379a953d00ff953d04003e45840a900005057b6b385500913d04aa
2104*39498f2c8d00800104006171379a953d00ff953d04003e45840a910004258f513869903d04e13e
2105*3b825f8c000001810204006271379a953d00ff953d04003e45840a9200054b8c473968008d3d05
2106*ce3e38737c0a8a000b01010202030403006371379a953d00ff953d04003e45840a9300055e8d48
2107*3850558a3d06917e3a3a6f861a89000d010102030304040505016472379a953d00ff953d04003e
2108*45840a930007045b8e54373e6bda873d06e74c39417a831b870010010102020303040405050605
2109*026572379a953d01ff3a943d04003e45840a950005458e6c403cd1873d055d3b53886c12860006
2110*0101020203040480050806060707036572379a953d04ff4231343e913d04003e45840a96000420
2111*876138d1873d03603d825b86000201010280030604040505060607800804046672379a933d073a
2112*3affdea3702b3a903d04003e45840a9700036a6638d4873d03603d803984000201010280030804
2113*0405060607070808800904056772379a913d033932474980ff04fb9c40323e8e3d04003e45840a
2114*9700036c6538d4873d03603d803d8200000180020c03030404050606070708080909800a040767
2115*72379a8f3d053c354b9eeef382ff03ca6b303c8d3d04003e45840a9700036c6538d4873d03603d
2116*803d80000001800207030304050506060780080009800a070b0c0b076772379a8e3d03393578f0
2117*86ff03fb7735398c3d04003e45840a9700036c6538d4813d003c823d21603d803d000101020203
2118*0404050506060707080809090a0a0b0c0c0d0d096972379a8c3d073e323bc2fffffefe83ff05fe
2119*ffffc23c368b3d04003e45840a9700036c6538d4803d02393a38813d0c603d803d000203030404
2120*0506068007110808090a0a0b0b0c0c0d0d0e0e0a6a73379a8c3d02306bcb80ff01fefe83ff00fe
2121*80ff02c546358a3d04003e45840a97000a6c6538d43d3d383ec37e2f803d15603d803e00030404
2122*0505060607070808090a0a0b0c0c800d080e0e0f0f0b6a73379a8a3d093a2a75fbfffffefffefe
2123*83ff08fefffdfffff0772f3c883d04003e45840a9700126c6538d43d383bc5fffa752f3d3d603d
2124*803f00800511060607080809090a0a0b0b0c0c0d0d0e0e0f8010040c6b73369a893d0a38419cfa
2125*fffefffefffefe83ff09fefffdfffdfffa773539873d04003e45840a9700066c6538d4383bc680
2126*ff11fa752f3d603d80400005060607080809090a800b080c0c0d0e0e0f0f10108011040d6c7336
2127*9a883d02363bc580ff05fefffefffefe83ff0afefffdfffdfdffffc23c38863d04003e45840a97
2128*00056c6538c23bc682ff0efa7530623d8141000707080809090a800b070c0c0d0e0e0f0f108011
2129*8012040f6c74369a873d0c3545c5fffefdfffefffefffefe83ff05fefffdfffdfd80ff02c63b36
2130*853d04003e45840a9700046c6536e9c684ff16fa6b503d824200080809090a0a0b0b0c0d0d0e0e
2131*0f0f1080110912121314130f6e74369a863d0d2f77effffffefdfffefffefffefe83ff0cfefffd
2132*fffdfdfffdffffc54535843d04003e45840a9700046c652bef3885122266613b82430009090a0a
2133*0b0c0c0d0d0e0e0f0f1010111112131314141515116e74369a843d0f3a2a75fafffcfffefdfffe
2134*fffefffefe83ff07fefffdfffdfdfffd80ff02ef772f833d04003e45840a9700066c6431537d00
2135*0080fb100000108a96368243010a0a0b0c0c0d0e0e800f0910101112121313141415801604126e
2136*74369a833d1038419bf9fffdfcfffefdfffefffefffefe83ff0efefffdfffdfdfffdfffffcfffb
2137*752f823d04003e45840a9700046c643228f184871798cc8b378345030b0c0c0d0d0e0e0f0f1010
2138*11121213141480150016801704137075369a823d02383bc680ff0bfdfcfffefdfffefffefffefe
2139*83ff10fefffdfffdfdfffdfffffcfdfffa742b3a803d04003e45840a960005026d6434078d8434
2140*0642737e38824604800d0b0e0e0f10101111121213131480150a161617171818147175369a813d
2141*12363bc5fffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffff89b
2142*402c3039dd3e45840a92000a01010201026e6534e935e882e510e8f52275398347050d0e0e0f10
2143*1011111280130814141515161717181880191b167174369a3d3b3a3546c4fffffdfcfffdfcfffe
2144*fdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefeffca97994eee3b45840a90000c
2145*010102030302046f6536ba9460825d0e606789673b8347060f0f10101111128013091414151616
2146*1717181919811a1b16727536952e3c4178effffefffdfcfffdfcfffefdfffefffefffefe83ff0f
2147*fefffdfffdfdfffdfffffcfdfffefbfc80ff05f5153d43840a8e00020101028003060403057065
2148*37428747383d3c834807101011111212131314151516161717181819191a1a1b1b1c18727534bc
2149*93c9f2fffffbfefffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdff
2150*fefbfc80ff0500004941840a8c0002010202800308040405050672693c4188400441874a081180
2151*1207131414151516161780180e19191a1b1b1c1c1d1d1973742a540080ff12fcfbfefffdfcfffd
2152*fcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfcffff786f674742840a
2153*8a0000018002040303040405800603076b8e82818382848085098696450a121213141415801600
2154*1780180719191a1b1b1c1c1d801e1b1973742b10600cfffffcfbfefffdfcfffdfcfffefdfffeff
2155*fefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfdff61d8e6434742840a88001601010202
2156*03040405050606070708081a2425252626272780280b29292a2b2b2a1b111314141580160b1717
2157*1818191a1a1b1b1c1c1d811e1c1d1973752c03300029fffdfbfefffdfcfffdfcfffefdfffefffe
2158*fffefe83ff18fefffdfffdfdfffdffff009f0e09c7cf00ebd9cc834542840a8600090101020303
2159*040405050680070a0808090a07060707080909800a0a0b0c0c0d0d0e0f1214151580160c171718
2160*19191a1a1b1b1c1c1d1d821e1c1d1973742ed9f2d700ac3f2b28df2a00fffdfcfffefdfffefffe
2161*fffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c8d554442840a8400090101020303
2162*04040505068007070808090a0a0b0b0c800d0b0e0e0f1010111112121313148015091616171718
2163*19191a1b1b801c011d1d841e1c1d1973742fc5aa8f92bb89b4d0f827ab5d932bb24800fffefffe
2164*fffefe83ff1800df69d7a81de3b2a4a59d93877484e7827b6e6c384343840a8100130101020203
2165*0304040505060607070809090a0a0b800c1c0d0d0e0e0f10101111121213131414151516171718
2166*1819191a1a1b1b1c801d861e1c1d19737430b686707d8a227f778796969da7baef2be33f6e15ff
2167*fffefe81ff231200ba03ccb2b4b2a29b8879695a4a373ab8666153501f4243840a000001010203
2168*030404800514060607080809090a0a0b0b0c0c0d0d0e0f0f101011801200138014071516161717
2169*181819801a041b1b1c1d1d891e3e1d19737530aa6956636fe4333b4a5a697c8b9ba2b5b4b5d519
2170*0433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e50443f0f4143840a00010280
2171*030b040405050606070808090a0a800b180c0c0d0e0e0f0f101011111212131314151516161717
2172*181819801a041b1b1c1d1d8b1e3c1d19737531a35546516bdefb091b2b3b4d606f8292a4b4c7cd
2173*c3d855aa7fff45bbece6d3c0ae9e8f7c69574734250f00efdcd27949403a0c4143840b00800316
2174*04040506060707080809090a0a0b0b0c0c0d0e0e0f101080111512121314141515161617171818
2175*19191a1b1b1c1c1d1d8d1e3c1d19737531a24f404e8fd8dfef03152537475d6c7c8fa1b4c3d3e6
2176*def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb969443f134143840a008002050304
2177*050506068007070809090a0a0b0c0c800d0b0e0f0f101011111213131414801509161717181819
2178*1a1a1b1b901c421b17727531a454457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d06355ffff
2179*000800c4c3c1b2a798887663534431220f00ecdfcd7f58224243881706090a0a0b0c0c800d090e
2180*0f0f1010111212131380140915161617171818191a1a801b001c801d031e1e1f20802192223c21
2181*1e787630ac7693d5dcef0312253444576976889babb5bcbacf1dbb75fefffffefe00f8f213d7af
2182*a6a39f9085766657473728180c00d06c513a7b847b807d807e827f828001818181828283018484
2183*8285008682870188889789198a955633d70f0309182837475a697988909f9fa6b2e33533000080
2184*fe01ffff80fe00fd800016f2685f0cdcae988e8a7f7a6b5f57474d70b8313f5759598058895983
2185*5a8f5b015c5c975b165c4a3252f65b4a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe
2186*80fd1afcfdfeaa00e8e96368bc33fbdcb69a7c788582b8423536363a3a398a3802373738a13785
2187*381b3a393635353a6b97b57b7f9abedf0045eaa8c3838c5f7ffdfafcfdfd82fe01ffff80fe80fd
2188*08fcfdfdfbfefcf9fcfe80002835e3dbbdef47ead660b8afa07c5435231915120f0c0904fffbf6
2189*f2eeeae6e3e0dddbd9d6d5d3d1d1d080ce00cc80ce36d0d1d1d5d6d6d9dddee2e3e8ebf0f5f8fa
2190*0004090c0f12151b25395c87a7b1b1128550561f00439c00c6bf00fefcf9fcfbf9fcfafcfdfd82
2191*fe01ffff80fe80fd11fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fcfffc80001f7f66eef05500a5d0e1
2192*5f1cf8e0c8c7bfaba6a39a918d88847d77736f6d6b69678466366769696d7173787d82888d939a
2193*a1a6afc2c7cbea0026770cf61ad77fdf75bf00fc0000fcfdf7f7fafdfaf7f9fdfbf9fcfbf9fcfa
2194*fcfdfd82fe01ffff80fe80fd35fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8
2195*f7f6fbff0075005b9bcc35e6c9af7b595758503e30302b262121242482213724242121262b3033
2196*41595d5c5e89afd4ef53f6f9b3743800fdf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfb
2197*f9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7
2198*f5f9fdfbf9f8f7f6fafefafefcf9fefd55009995b3c3055fea98452f1e0d09f5e884e536e80009
2199*0d1a3370aa0c7825061538005f00fcfef9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfa
2200*f7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fb
2201*fefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fdfcfafefdfbf9fc5500d4aa72ce55d708c0f2840c
2202*07f21d08dff4ced4c880002bfdfafcfdfbf9fbfdf9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7
2203*f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe74386d6b00004008000000000000000000000000
2204*000000000000000000000000000000000000000000000000000000000000000000000000000000
2205*000000000000000000000000000000000000000000000000000000000000000000000000000000
2206*000000000000000000000000000000000000000000000000000000000000000000000000000000
2207*000000000000000000000000000000000000000000000000000000000000000000000000000000
2208*000000000000000000000000000000000000000000000000000000000000000000000000000000
2209*000000000000000000000000000000000000000000000000000000000000000000000000000000
2210*000000000000000000000000000000000000000000000000000000000000000000000000000000
2211*000000000000000000000000000000000000000000000000000000000f31537794a2babfb6a194
2212*744e310f0000000000000000000000000000000000000000000000000000000000000000000000
2213*000000000000000000000000000000000000000000000000000000000000000000000000000000
2214*000000000000000000000000000000000000000000000000000000000000000000000000063172
2215*a7d9f5fefffffffffffffffdf3d9a76f2d03000000000000000000000000000000000000000000
2216*000000000000000000000000000000000000000000000000000000000000000000000000000000
2217*000000000000000000000000000000000000000000000000000000000000000000000000000000
2218*000000000000287ccffafffffffffffffffffffffffffffffffffff8c678230000000000000000
2219*000000000000000000000000000000000000000000000000000000000000000000000000000000
2220*000000000000000000000000000000000000000000000000000000000000000000000000000000
2221*0000000000000000000000000000003ba4f4ffffffffffffffffffffffffffffffffffffffffff
2222*fffff09d3000000000000000000000000000000000000000000000000000000000000000000000
2223*000000000000000000000000000000000000000000000000000000000000000000000000000000
2224*00000000000000000000000000000000000000000000000027a1fdffffffffffffffffffffffff
2225*fffffffffffffffffffffffffffffff79a22000000000000000000000000000000000000000000
2226*000000000000000000000000000000000000000000000000000000000000000000000000000000
2227*0000000000000000000000000000000000000000000000000000000000000000000274ecffffff
2228*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe56a000000000000000000
2229*000000000000000000000000000000000000000000000000000000000000000000000000000000
2230*000000000000000000000000000000000000000000000000000000000000000000000000000000
2231*0000000025b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2232*ffffaf1c0000000000000000000000000000000000000000000000000000000000000000000000
2233*000000000000000000000000000000000000000000000000000000000000000000000000000000
2234*000000000000000000000000000043dfffffffffffffffffffffffffffffffffffffffffffffff
2235*ffffffffffffffffffffffffffffd93a0000000000000000000000000000000000000000000000
2236*000000000000000000000000000000000000000000000000000000000000000000000000000000
2237*0000000000000000000000000000000000000000000000005bf7ffffffffffffffffffffffffff
2238*ffffffffffffffffffffffffffffffffffffffffffffffffffffef560000000000000000000000
2239*000000000000000000000000000000000000000000000000000000000000000000000000000000
2240*000000000000000000000000000000000000000000000000000000000000000000005efaffffff
2241*fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa
2242*5b0000000000000000000000000000000000000000000000000000000000000000000000000000
2243*000000000000000000000000000000000000000000000000000000000000000000000000000000
2244*00000000005af9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2245*fffffffffffffffffffffff9550000000000000000000000000000000000000000000000000000
2246*000000000000000000000000000000000000000000000000000000000000000000000000000000
2247*00000000000000000000000000000046f8ffffffffffffffffffffffffffffffffffffffffffff
2248*fffffffffffffffffffffffffffffffffffffffffffffff03a0000000000000000000000000000
2249*000000000000000000000000000000000000000000000000000000000000000000000000000000
2250*0000000000000000000000000000000000000000000000000022e6ffffffffffffffffffffffff
2251*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd190000
2252*000000000000000000000000000000000000000000000000000000000000000000000000000000
2253*000000000000000000000000000000000000000000000000000000000000000000000006bdffff
2254*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2255*ffffffffffffffffb1020000000000000000000000000000000000000000000000000000000000
2256*000000000000000000000000000000000000000000000000000000000000000000000000000000
2257*0000000000000075ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2258*ffffffffffffffffffffffffffffffffffffffff6c000000000000000000000000000000000000
2259*000000000000000000000000000000000000000000000000000000000000000000000000000000
2260*000000000000000000000000000000000027f2ffffffffffffffffffffffffffffffffffffffff
2261*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1f000000000000
2262*000000000000000000000000000000000000000000000000000000000000000000000000000000
2263*00000000000000000000000000000000000000000000000000000000a9ffffffffffffffffffff
2264*ffffffffffffffffffffffffe7b68d7f797f90bceaffffffffffffffffffffffffffffffffffff
2265*ffffffff9d00000000000000000000000000000000000000000000000000000000000000000000
2266*000000000000000000000000000000000000000000000000000000000000000000000000000037
2267*fcfffffffffffffffffffffffffffffffffffffffaaa5012000000000000001356aefdffffffff
2268*fffffffffffffffffffffffffffffff72b00000000000000000000000000000000000000000000
2269*000000000000000000000000000000000000000000000000000000000000000000000000000000
2270*00000000000000000000acffffffffffffffffffffffffffffffffffffffb43700000000000000
2271*0000000000003bbbffffffffffffffffffffffffffffffffffffff9e0000000000000000000000
2272*000000000000000000000000000000000000000000000000000000000000000000000000000000
2273*00000000000000000000000000000000000000002dfbffffffffffffffffffffffffffffffffff
2274*f66c000000000000000000000000000000000078fcfffffffffffffffffffffffffffffffffff5
2275*210000000000000000000000000000000000000000000000000000000000000000000000000000
2276*0000000000000000000000000000000000000000000000000000000000000088ffffffffffffff
2277*ffffffffffffffffffffee460000000000000000000000000000000000000053f0ffffffffffff
2278*ffffffffffffffffffffff79000000000000000000000000000000000000000000000000000000
2279*000000000000000000000000000000000000000000000000000000000000000000000000000000
2280*000008d9fffffffffffffffffffffffffffffffff7450000000000000000000000000000000000
2281*0000000052faffffffffffffffffffffffffffffffffce05000000000000000000000000000000
2282*000000000000000000000000000000000000000000000000000000000000000000000000000000
2283*000000000000000000000000003fffffffffffffffffffffffffffffffffff6c00000000000000
2284*0000000000000000000000000000000076fffffffffffffffffffffffffffffffffc3200000000
2285*000000000000000000000000000000000000000000000000000000000000000000000000000000
2286*0000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffff
2287*ffffb000000000000000000000000000000000000000000000000001bdffffffffffffffffffff
2288*ffffffffffff710000000000000000000000000000000000000000000000000000000000000000
2289*0000000000000000000000000000000000000000000000000000000000000000000001b8ffffff
2290*fffffffffffffffffffffffff62b00000000000000000000000000000000000000000000000000
2291*37fbffffffffffffffffffffffffffffffab000000000000000000000000000000000000000000
2292*000000000000000000000000000000000000000000000000000000000000000000000000000000
2293*0000000000000ce6ffffffffffffffffffffffffffffffa1000000000000000000000000000000
2294*000000000000000000000000adffffffffffffffffffffffffffffffdf08000000000000000000
2295*000000000000000000000000000000000000000000000000000000000000000000000000000000
2296*000000000000000000000000000000000031fcfffffffffffffffffffffffffffffe4100000000
2297*00000000000000000000000000000000000000000000004fffffffffffffffffffffffffffffff
2298*f72100000000000000000000000000000000000000000000000000000000000000000000000000
2299*0000000000000000000000000000000000000000000000000000000052ffffffffffffffffffff
2300*ffffffffffdb0800000000000000000000000000000000000000000000000000000011e7ffffff
2301*ffffffffffffffffffffffff460000000000000000000000000000000000000000000000000000
2302*000000000000000000000000000000000000000000000000000000000000000000000000000000
2303*69ffffffffffffffffffffffffffffffa600000000000000000000000000000000000000000000
2304*00000000000000b5ffffffffffffffffffffffffffffff5e000000000000000000000000000000
2305*000000000000000000000000000000000000000000000000000000000000000000000000000000
2306*00000000000000000000007fffffffffffffffffffffffffffffff810000000000000000000000
2307*0000000000000000000000000000000000008effffffffffffffffffffffffffffff6c00000000
2308*000000000000000000000000000000000000000000000000000000000000000000000000000000
2309*0000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffff64
2310*000000000000000000000000000000000000000000000000000000000075ffffffffffffffffff
2311*ffffffffffff800000000000000000000000000000000000000000000000000000000000000000
2312*00000000000000000000000000000000000000000000000000000000000000000080ffffffffff
2313*ffffffffffffffffffff6200000000000000000000000000000000000000000000000000000000
2314*0063ffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000
2315*000000000000000000000000000000000000000000000000000000000000000000000000000000
2316*000000000080ffffffffffffffffffffffffffffff630000000000000000000000000000000000
2317*00000000000000000000000063ffffffffffffffffffffffffffffff8000000000000000000000
2318*000000000000000000000000000000000000000000000000000000000000000000000000000000
2319*0000000000000000000000000000000080ffffffffffffffffffffffffffffff63000000000000
2320*000000000000000000000000000000000000000000000063ffffffffffffffffffffffffffffff
2321*800000000000000000000000000000000000000000000000000000000000000000000000000000
2322*00000000000000000000000000000000000000000000000000000080ffffffffffffffffffffff
2323*ffffffff63000000000000000000000000000000000000000000000000000000000063ffffffff
2324*ffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000
2325*000000000000000000000000000000000000000000000000000000000000000000000000000080
2326*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2327*00000000000063ffffffffffffffffffffffffffffff8000000000000000000000000000000000
2328*000000000000000000000000000000000000000000000000000000000000000000000000000000
2329*0000000000000000000080ffffffffffffffffffffffffffffff63000000000000000000000000
2330*000000000000000000000000000000000063ffffffffffffffffffffffffffffff800000000000
2331*000000000000000000000000000000000000000000000000000000000000000000000000000000
2332*00000000000000000000000000000000000000000080ffffffffffffffffffffffffffffff6300
2333*0000000000000000000000000000000000000000000000000000000063ffffffffffffffffffff
2334*ffffffffff80000000000000000000000000000000000000000000000000000000000000000000
2335*000000000000000000000000000000000000000000000000000000000000000080ffffffffffff
2336*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2337*63ffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000
2338*000000000000000000000000000000000000000000000000000000000000000000000000000000
2339*0000000080ffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2340*000000000000000000000063ffffffffffffffffffffffffffffff800000000000000000000000
2341*000000000000000000000000000000000000000000000000000000000000000000000000000000
2342*00000000000000000000000000000080ffffffffffffffffffffffffffffff6300000000000000
2343*0000000000000000000000000000000000000000000063ffffffffffffffffffffffffffffff80
2344*000000000000000000000000000000000000000000000000000000000000000000000000000000
2345*000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffff
2346*ffffff63000000000000000000000000000000000000000000000000000000000063ffffffffff
2347*ffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000
2348*000000000000000000000000000000000000000000000000000000000000000000000000007aff
2349*ffffffffffffffffffffffffffff5c000000000000000000000000000000000000000000000000
2350*00000000005cffffffffffffffffffffffffffffff7a0000000000000000000000000000000000
2351*000000000000000000000000000000000000000000000000000000000000000000000000000000
2352*000000002145494844a4ffffffffffffffffffffffffffffff8f45484848484848484848484848
2353*484848484848484848484848484848458fffffffffffffffffffffffffffffffa4444848493505
2354*000000000000000000000000000000000000000000000000000000000000000000000000000000
2355*000000000000000000000000000892f2ffffffffffffffffffffffffffffffffffffffffffffff
2356*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2357*fffffffffffffffffffbcd2d000000000000000000000000000000000000000000000000000000
2358*0000000000000000000000000000000000000000000000007cffffffffffffffffffffffffffff
2359*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2360*ffffffffffffffffffffffffffffffffffffffffffffd910000000000000000000000000000000
2361*0000000000000000000000000000000000000000000000000000000000000000000006d4ffffff
2362*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2363*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5500000000
2364*000000000000000000000000000000000000000000000000000000000000000000000000000000
2365*0000000000000ff1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2366*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2367*ffffffffffff660000000000000000000000000000000000000000000000000000000000000000
2368*00000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffff
2369*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2370*ffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000000000
2371*000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffff
2372*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2373*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000
2374*000000000000000000000000000000000000000000000000000000000000000000000000000000
2375*0ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2376*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2377*630000000000000000000000000000000000000000000000000000000000000000000000000000
2378*00000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffff
2379*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2380*ffffffffffffffffffffff63000000000000000000000000000000000000000000000000000000
2381*000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffff
2382*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2383*ffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000
2384*0000000000000000000000000000000000000000000000000000000000000000000ff0ffffffff
2385*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2386*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000
2387*000000000000000000000000000000000000000000000000000000000000000000000000000000
2388*00000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2389*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2390*ffffffffff63000000000000000000000000000000000000000000000000000000000000000000
2391*000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffff
2392*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2393*ffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000000000
2394*0000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffff
2395*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2396*ffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000
2397*00000000000000000000000000000000000000000000000000000000000000000000000000000f
2398*f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2399*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63
2400*000000000000000000000000000000000000000000000000000000000000000000000000000000
2401*000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffff
2402*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2403*ffffffffffffffffffff6300000000000000000000000000000000000000000000000000000000
2404*0000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffff
2405*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2406*ffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000
2407*00000000000000000000000000000000000000000000000000000000000000000ff0ffffffffff
2408*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2409*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000
2410*000000000000000000000000000000000000000000000000000000000000000000000000000000
2411*000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2412*f0ba8c6e62647ba4dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2413*ffffffff6300000000000000000000000000000000000000000000000000000000000000000000
2414*0000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffff
2415*ffffffffffffffffffcf6a1c000000000000000944a4f9ffffffffffffffffffffffffffffffff
2416*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2417*00000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffff
2418*ffffffffffffffffffffffffffffffffffffee71090000000000000000000000003abfffffffff
2419*ffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000
2420*000000000000000000000000000000000000000000000000000000000000000000000000000ff0
2421*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd231000000000000000000
2422*000000000000068cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300
2423*000000000000000000000000000000000000000000000000000000000000000000000000000000
2424*0000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffd0
2425*1e00000000000000000000000000000000000074ffffffffffffffffffffffffffffffffffffff
2426*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2427*00000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffff
2428*ffffffffffffffffffe11f000000000000000000000000000000000000000094ffffffffffffff
2429*ffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2430*000000000000000000000000000000000000000000000000000000000000000ff0ffffffffffff
2431*fffffffffffffffffffffffffffffffffffffffe4d000000000000000000000000000000000000
2432*00000007c9ffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000
2433*000000000000000000000000000000000000000000000000000000000000000000000000000000
2434*0000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffa50000000000000000
2435*00000000000000000000000000000041fbffffffffffffffffffffffffffffffffffffffffffff
2436*ffffff630000000000000000000000000000000000000000000000000000000000000000000000
2437*00000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffff
2438*fffa2f000000000000000000000000000000000000000000000000b3ffffffffffffffffffffff
2439*ffffffffffffffffffffffffffff63000000000000000000000000000000000000000000000000
2440*000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffff
2441*ffffffffffffffffffffffffb70000000000000000000000000000000000000000000000000054
2442*ffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000
2443*0000000000000000000000000000000000000000000000000000000000000000000000000ff0ff
2444*ffffffffffffffffffffffffffffffffffffffffffffff6e000000000000000000000000000000
2445*0000000000000000000013ebffffffffffffffffffffffffffffffffffffffffffffffff630000
2446*000000000000000000000000000000000000000000000000000000000000000000000000000000
2447*00000000000000000ff0fffffffffffffffffffffffffffffffffffffffffffffffc3800000000
2448*00000000000000000000000000000000000000000000bbffffffffffffffffffffffffffffffff
2449*ffffffffffffffff63000000000000000000000000000000000000000000000000000000000000
2450*000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffff
2451*fffffffffff416000000000000000000000000000000000000000000000000000094ffffffffff
2452*ffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000
2453*0000000000000000000000000000000000000000000000000000000000000ff0ffffffffffffff
2454*ffffffffffffffffffffffffffffffffe009000000000000000000000000000000000000000000
2455*00000000007fffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000
2456*000000000000000000000000000000000000000000000000000000000000000000000000000000
2457*00000ff0ffffffffffffffffffffffffffffffffffffffffffffffd60700000000000000000000
2458*000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffff
2459*ffff63000000000000000000000000000000000000000000000000000000000000000000000000
2460*000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffef
2461*0f000000000000000000000000000000000000000000000000000089ffffffffffffffffffffff
2462*ffffffffffffffffffffffffff6300000000000000000000000000000000000000000000000000
2463*0000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffff
2464*fffffffffffffffffffff82a0000000000000000000000000000000000000000000000000000aa
2465*ffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000
2466*00000000000000000000000000000000000000000000000000000000000000000000000ff0ffff
2467*ffffffffffffffffffffffffffffffffffffffffffff5b00000000000000000000000000000000
2468*00000000000000000007dcffffffffffffffffffffffffffffffffffffffffffffffff63000000
2469*000000000000000000000000000000000000000000000000000000000000000000000000000000
2470*000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffa00000000000
2471*000000000000000000000000000000000000000037fcffffffffffffffffffffffffffffffffff
2472*ffffffffffffff6300000000000000000000000000000000000000000000000000000000000000
2473*0000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffff
2474*ffffffffffea1800000000000000000000000000000000000000000000000093ffffffffffffff
2475*ffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000000000
2476*00000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffff
2477*ffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000
2478*000020f0ffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000
2479*000000000000000000000000000000000000000000000000000000000000000000000000000000
2480*000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffea22000000000000000000
2481*000000000000000000000000009effffffffffffffffffffffffffffffffffffffffffffffffff
2482*ff6300000000000000000000000000000000000000000000000000000000000000000000000000
2483*0000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffff
2484*ffb70400000000000000000000000000000000000000005afeffffffffffffffffffffffffffff
2485*ffffffffffffffffffffffff630000000000000000000000000000000000000000000000000000
2486*00000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffff
2487*ffffffffffffffffffffffffff910000000000000000000000000000000000000044f0ffffffff
2488*ffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000
2489*000000000000000000000000000000000000000000000000000000000000000000000ff0ffffff
2490*ffffffffffffffffffffffffffffffffffffffffffffffffff9306000000000000000000000000
2491*000000004aefffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000
2492*000000000000000000000000000000000000000000000000000000000000000000000000000000
2493*0000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd2d
2494*000000000000000000000000000779f9ffffffffffffffffffffffffffffffffffffffffffffff
2495*ffffffffffff630000000000000000000000000000000000000000000000000000000000000000
2496*00000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffff
2497*fffffffffffffffffffff28e150000000000000000000042c8ffffffffffffffffffffffffffff
2498*ffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000000000
2499*000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffff
2500*ffffffffffffffffffffffffffffffffffffffffffffff4900000000000000000000a3ffffffff
2501*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000
2502*000000000000000000000000000000000000000000000000000000000000000000000000000000
2503*0ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4900000000
2504*0000000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2505*630000000000000000000000000000000000000000000000000000000000000000000000000000
2506*00000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffff
2507*ffffffffffff48000000000000000000009cffffffffffffffffffffffffffffffffffffffffff
2508*ffffffffffffffffffffff63000000000000000000000000000000000000000000000000000000
2509*000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffff
2510*ffffffffffffffffffffffffffffffffff48000000000000000000009cffffffffffffffffffff
2511*ffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000
2512*0000000000000000000000000000000000000000000000000000000000000000000ff0ffffffff
2513*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff4800000000000000000000
2514*9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000
2515*000000000000000000000000000000000000000000000000000000000000000000000000000000
2516*00000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2517*48000000000000000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffff
2518*ffffffffff63000000000000000000000000000000000000000000000000000000000000000000
2519*000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffff
2520*ffffffffffffffffffffff48000000000000000000009cffffffffffffffffffffffffffffffff
2521*ffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000000000
2522*0000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffff
2523*ffffffffffffffffffffffffffffffffffffffffffff48000000000000000000009cffffffffff
2524*ffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000
2525*00000000000000000000000000000000000000000000000000000000000000000000000000000f
2526*f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff480000000000
2527*00000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63
2528*000000000000000000000000000000000000000000000000000000000000000000000000000000
2529*000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffff
2530*ffffffffff48000000000000000000009cffffffffffffffffffffffffffffffffffffffffffff
2531*ffffffffffffffffffff6300000000000000000000000000000000000000000000000000000000
2532*0000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffff
2533*ffffffffffffffffffffffffffffffff48000000000000000000009cffffffffffffffffffffff
2534*ffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000
2535*00000000000000000000000000000000000000000000000000000000000000000ff0ffffffffff
2536*ffffffffffffffffffffffffffffffffffffffffffffffffffffff46000000000000000000009c
2537*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000
2538*000000000000000000000000000000000000000000000000000000000000000000000000000000
2539*000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff51
2540*090e0e0e0e0e0e0e0e059dffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2541*ffffffff6300000000000000000000000000000000000000000000000000000000000000000000
2542*0000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffff
2543*ffffffffffffffffffff8147505050505050504f46b9ffffffffffffffffffffffffffffffffff
2544*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2545*00000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffff
2546*ffffffffffffffffffffffffffffffffffffffffff844b53535353535353524cbcffffffffffff
2547*ffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000
2548*000000000000000000000000000000000000000000000000000000000000000000000000000ff0
2549*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff834a5252525252
2550*5252514bbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300
2551*000000000000000000000000000000000000000000000000000000000000000000000000000000
2552*0000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2553*ffffffff8148505050505050504f49baffffffffffffffffffffffffffffffffffffffffffffff
2554*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2555*00000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffff
2556*ffffffffffffffffffffffffffffff864f575757575757575650bdffffffffffffffffffffffff
2557*ffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2558*000000000000000000000000000000000000000000000000000000000000000cf0ffffffffffff
2559*ffffffffffffffffffffffffffffffffffffffffffffffffffffeae0e2e2e2e2e2e2e2e2e0f3ff
2560*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000000000000000
2561*000000000000000000000000000000000000000000000000000000000000000000000000000000
2562*00000b3ef5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2563*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2564*ffffff760100000000000000000000000000000000000000000000000000000000000000000000
2565*000000000000000000000000224960f5ffffffffffffffffffffffffffffffffffffffffffffff
2566*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2567*ffffffffffffffffffffffffffff983a1500000000000000000000000000000000000000000000
2568*000000000000000000000000000000000000000000002f575462f6ffffffffffffffffffffffff
2569*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2570*ffffffffffffffffffffffffffffffffffffffffffffffffff984f531f00000000000000000000
2571*00000000000000000000000000000000000000000000000000000308121c252b538081838ff8ff
2572*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2573*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb67d82
2574*7b44282319100602000000000000000000000000000000000000000000000002091825303c464e
2575*515455618d8e8c8992f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2576*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2577*ffffffffffffffffb9848c8f85595553504d43392d231407010000000000000000000000000002
2578*102234444e53575755545353534f6c8d8a8a8891f8ffffffffffffffffffffffffffffffffffff
2579*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2580*ffffffffffffffffffffffffffffffffffffffb8838a8a8a5f5053535355565756524d40301e0c
2581*00000000000000000e2a43515657555353525252525252524e6d8e8a8a8891f8ffffffffffffff
2582*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2583*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8838a8a8b60505252
2584*525252525253535557554f3e23080000000b2e50575553525252525252525252525252505d8a8b
2585*8a8891f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2586*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2587*ffffb8838a8c8355515252525252525252525252525356564b2104003b5b535252525252525252
2588*525252525252525250738e8a8891f8ffffffffffffffffffffffffffffffffffffffffffffffff
2589*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2590*ffffffffffffffffffffffffffb8838b8c674f5252525252525252525252525252525255552600
2591*2d5356535252525252525252525252525252525154798d8991f8ffffffffffffffffffffffffff
2592*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2593*ffffffffffffffffffffffffffffffffffffffffffffffffb8858c6c5052525252525252525252
2594*52525252525253574a1b0000153e52575553535252525252525252525252525152708894f8ffff
2595*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2596*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc7f6650
2597*52525252525252525252525252535456564f350d0000000000122a3f4f54575654535352525252
2598*5252525251505d7debffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2599*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2600*ffffffffffffff9b534f5252525252525252525353555657534c3b240c00000000000000000001
2601*091c2a38484f52565756555453535352524f4ba0ffffffffffffffffffffffffffffffffffffff
2602*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2603*ffffffffffffffffffffffffffffffffffde564e52525353535455565855514e43352617070000
2604*000000000000000000000000000000030b17242e38414b4f51545658575452a9f1fbfbfcfffffd
2605*fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc
2606*fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfdfffffbfbfcfad16f5057585653514f493e35
2607*2b2114080200000000000000000000000000000000000000000000000000000001040b131c242b
2608*32393e3f5a6c6d7181919da5a7a5a3a2a1a0a0a09f9f9f9f9f9f9f9f9f9e9e9e9e9e9e9e9e9e9e
2609*9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9f9f9f9f9f9fa0a0a0a0a1a2a3a6a7a39b8d7c6f6d6d6143
2610*39383029221a120904010000000000000000000000000000000000000000000000000000000000
2611*00000000000000000000000000010201040a0f111b243642576873797d82808084848384858585
2612*85868787878787878787878787878787878787878787878685858585848384837f80817b787164
2613*523f312018100d0802000101000000000000000000000000000000000000000000000000000000
2614*000000000000000000000000000000000000000000000000000000000000000000000000020d1c
2615*2736414c5355575d61605f5f62646363636363626262626262626262636363636364615e5f6061
2616*5b575452493e322518090100000000000000000000000000000000000000000000000000000000
2617*000000000000000000000000000000000000000000000000000000000000000000000000000000
2618*0000000000000000000000000000030b141d252b31383e43494b4c4d4d4f505050505050505050
2619*4e4d4d4c4b46423c373029231b1208030000000000000000000000000000000000000000000000
2620*000000000000000000000000000000000000000000000000000000000000000000000000000000
2621*0000000000000000000000000000000000000000000000000000000000000003070c0f14151b20
2622*1f252a292929292929292a231f201915120e0a0702000000000000000000000000000000000000
2623*00000000000000000000000000000000000000000000000000000000000000
2624newhex
2625*
2626rmfile ./mac/allmydata.icns
2627hunk ./mac/allmydata_tahoe.py 1
2628-from allmydata.util import pkgresutil # override the pkg_resources zip provider for py2app deployment
2629-pkgresutil.install() # this is done before nevow is imported by depends
2630-import depends # import dependencies so that py2exe finds them
2631-_junk = depends # appease pyflakes
2632-
2633-import sys
2634-
2635-from twisted.python import usage
2636-
2637-class ReplOptions(usage.Options):
2638-    pass
2639-
2640-def repl(config, stdout, stderr):
2641-    import code
2642-    return code.interact()
2643-
2644-class DbgRunnerExtension(object):
2645-    subCommands = [
2646-        ["dbgrepl", None, ReplOptions, "Open a python interpreter"],
2647-        ]
2648-    dispatch = {
2649-        "dbgrepl": repl,
2650-        }
2651-
2652-class FuseOptions(usage.Options):
2653-    def parseOptions(self, args):
2654-        self.args = args
2655-
2656-def fuse(config, stdout, stderr):
2657-    import tahoefuse
2658-    tahoefuse.main(config.args)
2659-
2660-class FuseRunnerExtension(object):
2661-    subCommands = [
2662-        ["fuse", None, FuseOptions, "Mount a filesystem via fuse"],
2663-        ]
2664-    dispatch = {
2665-        "fuse": fuse,
2666-        }
2667-
2668-def main(argv):
2669-    if len(argv) == 1:
2670-        # then we were given no args; do default mac node startup
2671-        from allmydata.gui.macapp import run_macapp
2672-        sys.exit(run_macapp())
2673-    else:
2674-        # given any cmd line args, do 'tahoe' cli behaviour
2675-        from allmydata.scripts import runner
2676-        #runner_extensions = [DbgRunnerExtension, FuseRunnerExtension, ]
2677-        runner_extensions = [FuseRunnerExtension, ]
2678-        sys.exit(runner.runner(argv[1:],
2679-                               install_node_control=False,
2680-                               additional_commands=runner_extensions,
2681-                               ))
2682-
2683-if __name__ == '__main__':
2684-    main(sys.argv)
2685-
2686rmfile ./mac/allmydata_tahoe.py
2687hunk ./mac/depends.py 1
2688-
2689-# nevow requires all these for its voodoo module import time adaptor registrations
2690-from nevow import accessors, appserver, static, rend, url, util, query, i18n, flat
2691-from nevow import guard, stan, testutil, context
2692-from nevow.flat import flatmdom, flatstan, twist
2693-from formless import webform, processors, annotate, iformless
2694-from decimal import Decimal
2695-
2696-
2697-#if sys.platform in ['darwin', ]:
2698-from nevow.flat import flatsax
2699-from xml.parsers import expat
2700-from xml.sax import expatreader
2701-junk = [ flatsax, expat, expatreader, ]
2702-
2703-try:
2704-    # these build hints are needed for nevow/xml on otto's 10.4 / py2.4
2705-    # environment.  they are broken on zandr's 10.5/py2.5 env, but are
2706-    # also unnecessary.
2707-    from xml.sax import sax2exts
2708-    from xml.sax.drivers2 import drv_pyexpat, drv_xmlproc
2709-    junk = [ sax2exts, drv_pyexpat, drv_xmlproc, ]
2710-except:
2711-    pass
2712-
2713-
2714-
2715-import allmydata.web
2716-
2717-# junk to appease pyflakes's outrage at py2exe's needs
2718-junk = [
2719-    accessors, appserver, static, rend, url, util, query, i18n, flat, guard, stan, testutil,
2720-    context, flatmdom, flatstan, twist, webform, processors, annotate, iformless, Decimal,
2721-    allmydata,
2722-    ]
2723-
2724rmfile ./mac/depends.py
2725hunk ./mac/fuse.py 1
2726-#
2727-#    Copyright (C) 2001  Jeff Epler  <jepler@unpythonic.dhs.org>
2728-#    Copyright (C) 2006  Csaba Henk  <csaba.henk@creo.hu>
2729-#
2730-#    This program can be distributed under the terms of the GNU LGPL.
2731-#    See the file COPYING.
2732-#
2733-# On 2009-09-21 Csaba Henk granted permission for this file to be
2734-# licensed under the same terms as Tahoe-LAFS itself.
2735-#
2736-
2737-
2738-# suppress version mismatch warnings
2739-try:
2740-    import warnings
2741-    warnings.filterwarnings('ignore',
2742-                            'Python C API version mismatch',
2743-                            RuntimeWarning,
2744-                            )
2745-except:
2746-    pass
2747-
2748-from string import join
2749-import sys
2750-from errno import *
2751-from os import environ
2752-import re
2753-from fuseparts import __version__
2754-from fuseparts._fuse import main, FuseGetContext, FuseInvalidate
2755-from fuseparts._fuse import FuseError, FuseAPIVersion
2756-from fuseparts.subbedopts import SubOptsHive, SubbedOptFormatter
2757-from fuseparts.subbedopts import SubbedOptIndentedFormatter, SubbedOptParse
2758-from fuseparts.subbedopts import SUPPRESS_HELP, OptParseError
2759-from fuseparts.setcompatwrap import set
2760-
2761-
2762-##########
2763-###
2764-###  API specification API.
2765-###
2766-##########
2767-
2768-# The actual API version of this module
2769-FUSE_PYTHON_API_VERSION = (0, 2)
2770-
2771-def __getenv__(var, pattern = '.', trans = lambda x: x):
2772-    """
2773-    Fetch enviroment variable and optionally transform it. Return `None` if
2774-    variable is unset. Bail out if value of variable doesn't match (optional)
2775-    regex pattern.
2776-    """
2777-
2778-    if var not in environ:
2779-        return None
2780-    val = environ[var]
2781-    rpat = pattern
2782-    if not isinstance(rpat, type(re.compile(''))):
2783-        rpat = re.compile(rpat)
2784-    if not rpat.search(val):
2785-        raise RuntimeError("env var %s doesn't match required pattern %s" % \
2786-                           (var, `pattern`))
2787-    return trans(val)
2788-
2789-def get_fuse_python_api():
2790-    if fuse_python_api:
2791-        return fuse_python_api
2792-    elif compat_0_1:
2793-        # deprecated way of API specification
2794-        return (0,1)
2795-
2796-def get_compat_0_1():
2797-    return get_fuse_python_api() == (0, 1)
2798-
2799-# API version to be used
2800-fuse_python_api = __getenv__('FUSE_PYTHON_API', '^[\d.]+$',
2801-                              lambda x: tuple([int(i) for i in x.split('.')]))
2802-
2803-# deprecated way of API specification
2804-compat_0_1 = __getenv__('FUSE_PYTHON_COMPAT', '^(0.1|ALL)$', lambda x: True)
2805-
2806-fuse_python_api = get_fuse_python_api()
2807-
2808-##########
2809-###
2810-###  Parsing for FUSE.
2811-###
2812-##########
2813-
2814-
2815-
2816-class FuseArgs(SubOptsHive):
2817-    """
2818-    Class representing a FUSE command line.
2819-    """
2820-
2821-    fuse_modifiers = {'showhelp': '-ho',
2822-                      'showversion': '-V',
2823-                      'foreground': '-f'}
2824-
2825-    def __init__(self):
2826-
2827-        SubOptsHive.__init__(self)
2828-
2829-        self.modifiers = {}
2830-        self.mountpoint = None
2831-
2832-        for m in self.fuse_modifiers:
2833-            self.modifiers[m] = False
2834-
2835-    def __str__(self):
2836-        return '\n'.join(['< on ' + str(self.mountpoint) + ':',
2837-                          '  ' + str(self.modifiers), '  -o ']) + \
2838-               ',\n     '.join(self._str_core()) + \
2839-               ' >'
2840-
2841-    def getmod(self, mod):
2842-        return self.modifiers[mod]
2843-
2844-    def setmod(self, mod):
2845-        self.modifiers[mod] = True
2846-
2847-    def unsetmod(self, mod):
2848-        self.modifiers[mod] = False
2849-
2850-    def mount_expected(self):
2851-        if self.getmod('showhelp'):
2852-            return False
2853-        if self.getmod('showversion'):
2854-            return False
2855-        return True
2856-
2857-    def assemble(self):
2858-        """Mangle self into an argument array"""
2859-
2860-        self.canonify()
2861-        args = [sys.argv and sys.argv[0] or "python"]
2862-        if self.mountpoint:
2863-            args.append(self.mountpoint)
2864-        for m, v in self.modifiers.iteritems():
2865-            if v:
2866-                args.append(self.fuse_modifiers[m])
2867-
2868-        opta = []
2869-        for o, v in self.optdict.iteritems():
2870-                opta.append(o + '=' + v)
2871-        opta.extend(self.optlist)
2872-
2873-        if opta:
2874-            args.append("-o" + ",".join(opta))
2875-
2876-        return args
2877-
2878-    def filter(self, other=None):
2879-        """
2880-        Same as for SubOptsHive, with the following difference:
2881-        if other is not specified, `Fuse.fuseoptref()` is run and its result
2882-        will be used.
2883-        """
2884-
2885-        if not other:
2886-            other = Fuse.fuseoptref()
2887-
2888-        return SubOptsHive.filter(self, other)
2889-
2890-
2891-
2892-class FuseFormatter(SubbedOptIndentedFormatter):
2893-
2894-    def __init__(self, **kw):
2895-        if not 'indent_increment' in kw:
2896-            kw['indent_increment'] = 4
2897-        SubbedOptIndentedFormatter.__init__(self, **kw)
2898-
2899-    def store_option_strings(self, parser):
2900-        SubbedOptIndentedFormatter.store_option_strings(self, parser)
2901-        # 27 is how the lib stock help appears
2902-        self.help_position = max(self.help_position, 27)
2903-        self.help_width = self.width - self.help_position
2904-
2905-
2906-class FuseOptParse(SubbedOptParse):
2907-    """
2908-    This class alters / enhances `SubbedOptParse` so that it's
2909-    suitable for usage with FUSE.
2910-
2911-    - When adding options, you can use the `mountopt` pseudo-attribute which
2912-      is equivalent with adding a subopt for option ``-o``
2913-      (it doesn't require an option argument).
2914-
2915-    - FUSE compatible help and version printing.
2916-
2917-    - Error and exit callbacks are relaxed. In case of FUSE, the command
2918-      line is to be treated as a DSL [#]_. You don't wanna this module to
2919-      force an exit on you just because you hit a DSL syntax error.
2920-
2921-    - Built-in support for conventional FUSE options (``-d``, ``-f`, ``-s``).
2922-      The way of this can be tuned by keyword arguments, see below.
2923-
2924-    .. [#] http://en.wikipedia.org/wiki/Domain-specific_programming_language
2925-
2926-    Keyword arguments for initialization
2927-    ------------------------------------
2928-
2929-    standard_mods
2930-      Boolean [default is `True`].
2931-      Enables support for the usual interpretation of the ``-d``, ``-f``
2932-      options.
2933-
2934-    fetch_mp
2935-      Boolean [default is `True`].
2936-      If it's True, then the last (non-option) argument
2937-      (if there is such a thing) will be used as the FUSE mountpoint.
2938-
2939-    dash_s_do
2940-      String: ``whine``, ``undef``, or ``setsingle`` [default is ``whine``].
2941-      The ``-s`` option -- traditionally for asking for single-threadedness --
2942-      is an oddball: single/multi threadedness of a fuse-py fs doesn't depend
2943-      on the FUSE command line, we have direct control over it.
2944-
2945-      Therefore we have two conflicting principles:
2946-
2947-      - *Orthogonality*: option parsing shouldn't affect the backing `Fuse`
2948-        instance directly, only via its `fuse_args` attribute.
2949-
2950-      - *POLS*: behave like other FUSE based fs-es do. The stock FUSE help
2951-        makes mention of ``-s`` as a single-threadedness setter.
2952-
2953-      So, if we follow POLS and implement a conventional ``-s`` option, then
2954-      we have to go beyond the `fuse_args` attribute and set the respective
2955-      Fuse attribute directly, hence violating orthogonality.
2956-
2957-      We let the fs authors make their choice: ``dash_s_do=undef`` leaves this
2958-      option unhandled, and the fs author can add a handler as she desires.
2959-      ``dash_s_do=setsingle`` enables the traditional behaviour.
2960-
2961-      Using ``dash_s_do=setsingle`` is not problematic at all, but we want fs
2962-      authors be aware of the particularity of ``-s``, therefore the default is
2963-      the ``dash_s_do=whine`` setting which raises an exception for ``-s`` and
2964-      suggests the user to read this documentation.
2965-
2966-    dash_o_handler
2967-      Argument should be a SubbedOpt instance (created with
2968-      ``action="store_hive"`` if you want it to be useful).
2969-      This lets you customize the handler of the ``-o`` option. For example,
2970-      you can alter or suppress the generic ``-o`` entry in help output.
2971-    """
2972-
2973-    def __init__(self, *args, **kw):
2974-
2975-        self.mountopts = []
2976-
2977-        self.fuse_args = \
2978-            'fuse_args' in kw and kw.pop('fuse_args') or FuseArgs()
2979-        dsd = 'dash_s_do' in kw and kw.pop('dash_s_do') or 'whine'
2980-        if 'fetch_mp' in kw:
2981-            self.fetch_mp = bool(kw.pop('fetch_mp'))
2982-        else:
2983-            self.fetch_mp = True
2984-        if 'standard_mods' in kw:
2985-            smods = bool(kw.pop('standard_mods'))
2986-        else:
2987-            smods = True
2988-        if 'fuse' in kw:
2989-            self.fuse = kw.pop('fuse')
2990-        if not 'formatter' in kw:
2991-            kw['formatter'] = FuseFormatter()
2992-        doh = 'dash_o_handler' in kw and kw.pop('dash_o_handler')
2993-
2994-        SubbedOptParse.__init__(self, *args, **kw)
2995-
2996-        if doh:
2997-            self.add_option(doh)
2998-        else:
2999-            self.add_option('-o', action='store_hive',
3000-                            subopts_hive=self.fuse_args, help="mount options",
3001-                            metavar="opt,[opt...]")
3002-
3003-        if smods:
3004-            self.add_option('-f', action='callback',
3005-                            callback=lambda *a: self.fuse_args.setmod('foreground'),
3006-                            help=SUPPRESS_HELP)
3007-            self.add_option('-d', action='callback',
3008-                            callback=lambda *a: self.fuse_args.add('debug'),
3009-                            help=SUPPRESS_HELP)
3010-
3011-        if dsd == 'whine':
3012-            def dsdcb(option, opt_str, value, parser):
3013-                raise RuntimeError, """
3014-
3015-! If you want the "-s" option to work, pass
3016-!
3017-!   dash_s_do='setsingle'
3018-!
3019-! to the Fuse constructor. See docstring of the FuseOptParse class for an
3020-! explanation why is it not set by default.
3021-"""
3022-
3023-        elif dsd == 'setsingle':
3024-            def dsdcb(option, opt_str, value, parser):
3025-                self.fuse.multithreaded = False
3026-
3027-        elif dsd == 'undef':
3028-            dsdcb = None
3029-        else:
3030-            raise ArgumentError, "key `dash_s_do': uninterpreted value " + str(dsd)
3031-
3032-        if dsdcb:
3033-            self.add_option('-s', action='callback', callback=dsdcb,
3034-                            help=SUPPRESS_HELP)
3035-
3036-
3037-    def exit(self, status=0, msg=None):
3038-        if msg:
3039-            sys.stderr.write(msg)
3040-
3041-    def error(self, msg):
3042-        SubbedOptParse.error(self, msg)
3043-        raise OptParseError, msg
3044-
3045-    def print_help(self, file=sys.stderr):
3046-        SubbedOptParse.print_help(self, file)
3047-        print >> file
3048-        self.fuse_args.setmod('showhelp')
3049-
3050-    def print_version(self, file=sys.stderr):
3051-        SubbedOptParse.print_version(self, file)
3052-        self.fuse_args.setmod('showversion')
3053-
3054-    def parse_args(self, args=None, values=None):
3055-        o, a = SubbedOptParse.parse_args(self, args, values)
3056-        if a and self.fetch_mp:
3057-            self.fuse_args.mountpoint = a.pop()
3058-        return o, a
3059-
3060-    def add_option(self, *opts, **attrs):
3061-        if 'mountopt' in attrs:
3062-            if opts or 'subopt' in attrs:
3063-                raise OptParseError(
3064-                  "having options or specifying the `subopt' attribute conflicts with `mountopt' attribute")
3065-            opts = ('-o',)
3066-            attrs['subopt'] = attrs.pop('mountopt')
3067-            if not 'dest' in attrs:
3068-                attrs['dest'] = attrs['subopt']
3069-
3070-        SubbedOptParse.add_option(self, *opts, **attrs)
3071-
3072-
3073-
3074-##########
3075-###
3076-###  The FUSE interface.
3077-###
3078-##########
3079-
3080-
3081-
3082-class ErrnoWrapper(object):
3083-
3084-    def __init__(self, func):
3085-        self.func = func
3086-
3087-    def __call__(self, *args, **kw):
3088-        try:
3089-            return apply(self.func, args, kw)
3090-        except (IOError, OSError), detail:
3091-            # Sometimes this is an int, sometimes an instance...
3092-            if hasattr(detail, "errno"): detail = detail.errno
3093-            return -detail
3094-
3095-
3096-########### Custom objects for transmitting system structures to FUSE
3097-
3098-class FuseStruct(object):
3099-
3100-    def __init__(self, **kw):
3101-        for k in kw:
3102-             setattr(self, k, kw[k])
3103-
3104-
3105-class Stat(FuseStruct):
3106-    """
3107-    Auxiliary class which can be filled up stat attributes.
3108-    The attributes are undefined by default.
3109-    """
3110-
3111-    def __init__(self, **kw):
3112-        self.st_mode  = None
3113-        self.st_ino   = 0
3114-        self.st_dev   = 0
3115-        self.st_nlink = None
3116-        self.st_uid   = 0
3117-        self.st_gid   = 0
3118-        self.st_size  = 0
3119-        self.st_atime = 0
3120-        self.st_mtime = 0
3121-        self.st_ctime = 0
3122-
3123-        FuseStruct.__init__(self, **kw)
3124-
3125-
3126-class StatVfs(FuseStruct):
3127-    """
3128-    Auxiliary class which can be filled up statvfs attributes.
3129-    The attributes are 0 by default.
3130-    """
3131-
3132-    def __init__(self, **kw):
3133-
3134-        self.f_bsize   = 0
3135-        self.f_frsize  = 0
3136-        self.f_blocks  = 0
3137-        self.f_bfree   = 0
3138-        self.f_bavail  = 0
3139-        self.f_files   = 0
3140-        self.f_ffree   = 0
3141-        self.f_favail  = 0
3142-        self.f_flag    = 0
3143-        self.f_namemax = 0
3144-
3145-        FuseStruct.__init__(self, **kw)
3146-
3147-
3148-class Direntry(FuseStruct):
3149-    """
3150-    Auxiliary class for carrying directory entry data.
3151-    Initialized with `name`. Further attributes (each
3152-    set to 0 as default):
3153-
3154-    offset
3155-        An integer (or long) parameter, used as a bookmark
3156-        during directory traversal.
3157-        This needs to be set it you want stateful directory
3158-        reading.
3159-
3160-    type
3161-       Directory entry type, should be one of the stat type
3162-       specifiers (stat.S_IFLNK, stat.S_IFBLK, stat.S_IFDIR,
3163-       stat.S_IFCHR, stat.S_IFREG, stat.S_IFIFO, stat.S_IFSOCK).
3164-
3165-    ino
3166-       Directory entry inode number.
3167-
3168-    Note that Python's standard directory reading interface is
3169-    stateless and provides only names, so the above optional
3170-    attributes doesn't make sense in that context.
3171-    """
3172-
3173-    def __init__(self, name, **kw):
3174-
3175-        self.name   = name
3176-        self.offset = 0
3177-        self.type   = 0
3178-        self.ino    = 0
3179-
3180-        FuseStruct.__init__(self, **kw)
3181-
3182-
3183-class Flock(FuseStruct):
3184-    """
3185-    Class for representing flock structures (cf. fcntl(3)).
3186-   
3187-    It makes sense to give values to the `l_type`, `l_start`,
3188-    `l_len`, `l_pid` attributes (`l_whence` is not used by
3189-    FUSE, see ``fuse.h``).
3190-    """
3191-
3192-    def __init__(self, name, **kw):
3193-   
3194-        self.l_type  = None
3195-        self.l_start = None
3196-        self.l_len   = None
3197-        self.l_pid   = None
3198-
3199-        FuseStruct.__init__(self, **kw)
3200-
3201-
3202-class Timespec(FuseStruct):
3203-    """
3204-    Cf. struct timespec in time.h:
3205-    http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html
3206-    """
3207-
3208-    def __init__(self, name, **kw):
3209-   
3210-        self.tv_sec  = None
3211-        self.tv_nsec = None
3212-
3213-        FuseStruct.__init__(self, **kw)
3214-
3215-
3216-class FuseFileInfo(FuseStruct):
3217-
3218-    def __init__(self, **kw):
3219-
3220-        self.keep      = False
3221-        self.direct_io = False
3222-
3223-        FuseStruct.__init__(self, **kw)
3224-
3225-
3226-
3227-########## Interface for requiring certain features from your underlying FUSE library.
3228-
3229-def feature_needs(*feas):
3230-    """
3231-    Get info about the FUSE API version needed for the support of some features.
3232-
3233-    This function takes a variable number of feature patterns.
3234-
3235-    A feature pattern is either:
3236-
3237-    -  an integer (directly referring to a FUSE API version number)
3238-    -  a built-in feature specifier string (meaning defined by dictionary)
3239-    -  a string of the form ``has_foo``, where ``foo`` is a filesystem method
3240-       (refers to the API version where the method has been introduced)
3241-    -  a list/tuple of other feature patterns (matches each of its members)
3242-    -  a regexp (meant to be matched against the builtins plus ``has_foo``
3243-       patterns; can also be given by a string of the from "re:*")
3244-    -  a negated regexp (can be given by a string of the form "!re:*")
3245-
3246-    If called with no arguments, then the list of builtins is returned, mapped
3247-    to their meaning.
3248-
3249-    Otherwise the function returns the smallest FUSE API version number which
3250-    has all the matching features.
3251-
3252-    Builtin specifiers worth to explicit mention:
3253-    - ``stateful_files``: you want to use custom filehandles (eg. a file class).
3254-    - ``*``: you want all features.
3255-    - while ``has_foo`` makes sense for all filesystem method ``foo``, some
3256-      of these can be found among the builtins, too (the ones which can be
3257-      handled by the general rule).
3258-
3259-    specifiers like ``has_foo`` refer to requirement that the library knows of
3260-      the fs method ``foo``.
3261-    """
3262-
3263-    fmap = {'stateful_files': 22,
3264-            'stateful_dirs':  23,
3265-            'stateful_io':    ('stateful_files', 'stateful_dirs'),
3266-            'stateful_files_keep_cache': 23,
3267-            'stateful_files_direct_io': 23,
3268-            'keep_cache':     ('stateful_files_keep_cache',),
3269-            'direct_io':      ('stateful_files_direct_io',),
3270-            'has_opendir':    ('stateful_dirs',),
3271-            'has_releasedir': ('stateful_dirs',),
3272-            'has_fsyncdir':   ('stateful_dirs',),
3273-            'has_create':     25,
3274-            'has_access':     25,
3275-            'has_fgetattr':   25,
3276-            'has_ftruncate':  25,
3277-            'has_fsinit':     ('has_init'),
3278-            'has_fsdestroy':  ('has_destroy'),
3279-            'has_lock':       26,
3280-            'has_utimens':    26,
3281-            'has_bmap':       26,
3282-            'has_init':       23,
3283-            'has_destroy':    23,
3284-            '*':              '!re:^\*$'}
3285-
3286-    if not feas:
3287-        return fmap
3288-
3289-    def resolve(args, maxva):
3290-
3291-        for fp in args:
3292-            if isinstance(fp, int):
3293-                maxva[0] = max(maxva[0], fp)
3294-                continue
3295-            if isinstance(fp, list) or isinstance(fp, tuple):
3296-                for f in fp:
3297-                    yield f
3298-                continue
3299-            ma = isinstance(fp, str) and re.compile("(!\s*|)re:(.*)").match(fp)
3300-            if isinstance(fp, type(re.compile(''))) or ma:
3301-                neg = False
3302-                if ma:
3303-                    mag = ma.groups()
3304-                    fp = re.compile(mag[1])
3305-                    neg = bool(mag[0])
3306-                for f in fmap.keys() + [ 'has_' + a for a in Fuse._attrs ]:
3307-                    if neg != bool(re.search(fp, f)):
3308-                        yield f
3309-                continue
3310-            ma = re.compile("has_(.*)").match(fp)
3311-            if ma and ma.groups()[0] in Fuse._attrs and not fp in fmap:
3312-                yield 21
3313-                continue
3314-            yield fmap[fp]
3315-
3316-    maxva = [0]
3317-    while feas:
3318-        feas = set(resolve(feas, maxva))
3319-
3320-    return maxva[0]
3321-
3322-
3323-def APIVersion():
3324-    """Get the API version of your underlying FUSE lib"""
3325-
3326-    return FuseAPIVersion()
3327-
3328-
3329-def feature_assert(*feas):
3330-    """
3331-    Takes some feature patterns (like in `feature_needs`).
3332-    Raises a fuse.FuseError if your underlying FUSE lib fails
3333-    to have some of the matching features.
3334-
3335-    (Note: use a ``has_foo`` type feature assertion only if lib support
3336-    for method ``foo`` is *necessary* for your fs. Don't use this assertion
3337-    just because your fs implements ``foo``. The usefulness of ``has_foo``
3338-    is limited by the fact that we can't guarantee that your FUSE kernel
3339-    module also supports ``foo``.)
3340-    """
3341-
3342-    fav = APIVersion()
3343-
3344-    for fea in feas:
3345-        fn = feature_needs(fea)
3346-        if fav < fn:
3347-            raise FuseError(
3348-              "FUSE API version %d is required for feature `%s' but only %d is available" % \
3349-              (fn, str(fea), fav))
3350-
3351-
3352-############# Subclass this.
3353-
3354-class Fuse(object):
3355-    """
3356-    Python interface to FUSE.
3357-
3358-    Basic usage:
3359-
3360-    - instantiate
3361-
3362-    - add options to `parser` attribute (an instance of `FuseOptParse`)
3363-
3364-    - call `parse`
3365-
3366-    - call `main`
3367-    """
3368-
3369-    _attrs = ['getattr', 'readlink', 'readdir', 'mknod', 'mkdir',
3370-              'unlink', 'rmdir', 'symlink', 'rename', 'link', 'chmod',
3371-              'chown', 'truncate', 'utime', 'open', 'read', 'write', 'release',
3372-              'statfs', 'fsync', 'create', 'opendir', 'releasedir', 'fsyncdir',
3373-              'flush', 'fgetattr', 'ftruncate', 'getxattr', 'listxattr',
3374-              'setxattr', 'removexattr', 'access', 'lock', 'utimens', 'bmap',
3375-              'fsinit', 'fsdestroy']
3376-
3377-    fusage = "%prog [mountpoint] [options]"
3378-
3379-    def __init__(self, *args, **kw):
3380-        """
3381-        Not much happens here apart from initializing the `parser` attribute.
3382-        Arguments are forwarded to the constructor of the parser class almost
3383-        unchanged.
3384-
3385-        The parser class is `FuseOptParse` unless you specify one using the
3386-        ``parser_class`` keyword. (See `FuseOptParse` documentation for
3387-        available options.)
3388-        """
3389-
3390-        if not fuse_python_api:
3391-            raise RuntimeError, __name__ + """.fuse_python_api not defined.
3392-
3393-! Please define """ + __name__ + """.fuse_python_api internally (eg.
3394-!
3395-! (1)  """ + __name__ + """.fuse_python_api = """ + `FUSE_PYTHON_API_VERSION` + """
3396-!
3397-! ) or in the enviroment (eg.
3398-!
3399-! (2)  FUSE_PYTHON_API=0.1
3400-!
3401-! ).
3402-!
3403-! If you are actually developing a filesystem, probably (1) is the way to go.
3404-! If you are using a filesystem written before 2007 Q2, probably (2) is what
3405-! you want."
3406-"""
3407-
3408-        def malformed():
3409-            raise RuntimeError, \
3410-                  "malformatted fuse_python_api value " + `fuse_python_api`
3411-        if not isinstance(fuse_python_api, tuple):
3412-            malformed()
3413-        for i in fuse_python_api:
3414-            if not isinstance(i, int) or i < 0:
3415-                malformed()
3416-
3417-        if fuse_python_api > FUSE_PYTHON_API_VERSION:
3418-            raise RuntimeError, """
3419-! You require FUSE-Python API version """ + `fuse_python_api` + """.
3420-! However, the latest available is """ + `FUSE_PYTHON_API_VERSION` + """.
3421-"""
3422-
3423-        self.fuse_args = \
3424-            'fuse_args' in kw and kw.pop('fuse_args') or FuseArgs()
3425-
3426-        if get_compat_0_1():
3427-            return self.__init_0_1__(*args, **kw)
3428-
3429-        self.multithreaded = True
3430-
3431-        if not 'usage' in kw:
3432-            kw['usage'] = self.fusage
3433-        if not 'fuse_args' in kw:
3434-            kw['fuse_args'] = self.fuse_args
3435-        kw['fuse'] = self
3436-        parserclass = \
3437-          'parser_class' in kw and kw.pop('parser_class') or FuseOptParse
3438-
3439-        self.parser = parserclass(*args, **kw)
3440-        self.methproxy = self.Methproxy()
3441-
3442-    def parse(self, *args, **kw):
3443-        """Parse command line, fill `fuse_args` attribute."""
3444-
3445-        ev = 'errex' in kw and kw.pop('errex')
3446-        if ev and not isinstance(ev, int):
3447-            raise TypeError, "error exit value should be an integer"
3448-
3449-        try:
3450-            self.cmdline = self.parser.parse_args(*args, **kw)
3451-        except OptParseError:
3452-          if ev:
3453-              sys.exit(ev)
3454-          raise
3455-
3456-        return self.fuse_args
3457-
3458-    def main(self, args=None):
3459-        """Enter filesystem service loop."""
3460-
3461-        if get_compat_0_1():
3462-            args = self.main_0_1_preamble()
3463-
3464-        d = {'multithreaded': self.multithreaded and 1 or 0}
3465-        d['fuse_args'] = args or self.fuse_args.assemble()
3466-
3467-        for t in 'file_class', 'dir_class':
3468-            if hasattr(self, t):
3469-                getattr(self.methproxy, 'set_' + t)(getattr(self,t))
3470-
3471-        for a in self._attrs:
3472-            b = a
3473-            if get_compat_0_1() and a in self.compatmap:
3474-                b = self.compatmap[a]
3475-            if hasattr(self, b):
3476-                c = ''
3477-                if get_compat_0_1() and hasattr(self, a + '_compat_0_1'):
3478-                    c = '_compat_0_1'
3479-                d[a] = ErrnoWrapper(self.lowwrap(a + c))
3480-
3481-        try:
3482-            main(**d)
3483-        except FuseError:
3484-            if args or self.fuse_args.mount_expected():
3485-                raise
3486-
3487-    def lowwrap(self, fname):
3488-        """
3489-        Wraps the fname method when the C code expects a different kind of
3490-        callback than we have in the fusepy API. (The wrapper is usually for
3491-        performing some checks or transfromations which could be done in C but
3492-        is simpler if done in Python.)
3493-
3494-        Currently `open` and `create` are wrapped: a boolean flag is added
3495-        which indicates if the result is to be kept during the opened file's
3496-        lifetime or can be thrown away. Namely, it's considered disposable
3497-        if it's an instance of FuseFileInfo.
3498-        """
3499-        fun = getattr(self, fname)
3500-
3501-        if fname in ('open', 'create'):
3502-            def wrap(*a, **kw):
3503-                res = fun(*a, **kw)
3504-                if not res or type(res) == type(0):
3505-                    return res
3506-                else:
3507-                    return (res, type(res) != FuseFileInfo)
3508-        elif fname == 'utimens':
3509-            def wrap(path, acc_sec, acc_nsec, mod_sec, mod_nsec):
3510-                ts_acc = Timespec(tv_sec = acc_sec, tv_nsec = acc_nsec)
3511-                ts_mod = Timespec(tv_sec = mod_sec, tv_nsec = mod_nsec)
3512-                return fun(path, ts_acc, ts_mod)
3513-        else:
3514-            wrap = fun
3515-
3516-        return wrap
3517-
3518-    def GetContext(self):
3519-        return FuseGetContext(self)
3520-
3521-    def Invalidate(self, path):
3522-        return FuseInvalidate(self, path)
3523-
3524-    def fuseoptref(cls):
3525-        """
3526-        Find out which options are recognized by the library.
3527-        Result is a `FuseArgs` instance with the list of supported
3528-        options, suitable for passing on to the `filter` method of
3529-        another `FuseArgs` instance.
3530-        """
3531-
3532-        import os, re
3533-
3534-        pr, pw = os.pipe()
3535-        pid = os.fork()
3536-        if pid == 0:
3537-             os.dup2(pw, 2)
3538-             os.close(pr)
3539-
3540-             fh = cls()
3541-             fh.fuse_args = FuseArgs()
3542-             fh.fuse_args.setmod('showhelp')
3543-             fh.main()
3544-             sys.exit()
3545-
3546-        os.close(pw)
3547-
3548-        fa = FuseArgs()
3549-        ore = re.compile("-o\s+([\w\[\]]+(?:=\w+)?)")
3550-        fpr = os.fdopen(pr)
3551-        for l in fpr:
3552-             m = ore.search(l)
3553-             if m:
3554-                 o = m.groups()[0]
3555-                 oa = [o]
3556-                 # try to catch two-in-one options (like "[no]foo")
3557-                 opa = o.split("[")
3558-                 if len(opa) == 2:
3559-                    o1, ox = opa
3560-                    oxpa = ox.split("]")
3561-                    if len(oxpa) == 2:
3562-                       oo, o2 = oxpa
3563-                       oa = [o1 + o2, o1 + oo + o2]
3564-                 for o in oa:
3565-                     fa.add(o)
3566-
3567-        fpr.close()
3568-        return fa
3569-
3570-    fuseoptref = classmethod(fuseoptref)
3571-
3572-
3573-    class Methproxy(object):
3574-
3575-        def __init__(self):
3576-
3577-            class mpx(object):
3578-               def __init__(self, name):
3579-                   self.name = name
3580-               def __call__(self, *a, **kw):
3581-                   return getattr(a[-1], self.name)(*(a[1:-1]), **kw)
3582-
3583-            self.proxyclass = mpx
3584-            self.mdic = {}
3585-            self.file_class = None
3586-            self.dir_class = None
3587-
3588-        def __call__(self, meth):
3589-            return meth in self.mdic and self.mdic[meth] or None
3590-
3591-        def _add_class_type(cls, type, inits, proxied):
3592-
3593-            def setter(self, xcls):
3594-
3595-                setattr(self, type + '_class', xcls)
3596-
3597-                for m in inits:
3598-                    self.mdic[m] = xcls
3599-
3600-                for m in proxied:
3601-                    if hasattr(xcls, m):
3602-                        self.mdic[m] = self.proxyclass(m)
3603-
3604-            setattr(cls, 'set_' + type + '_class', setter)
3605-
3606-        _add_class_type = classmethod(_add_class_type)
3607-
3608-    Methproxy._add_class_type('file', ('open', 'create'),
3609-                              ('read', 'write', 'fsync', 'release', 'flush',
3610-                               'fgetattr', 'ftruncate', 'lock'))
3611-    Methproxy._add_class_type('dir', ('opendir',),
3612-                              ('readdir', 'fsyncdir', 'releasedir'))
3613-
3614-
3615-    def __getattr__(self, meth):
3616-
3617-        m = self.methproxy(meth)
3618-        if m:
3619-            return m
3620-
3621-        raise AttributeError, "Fuse instance has no attribute '%s'" % meth
3622-
3623-
3624-
3625-##########
3626-###
3627-###  Compat stuff.
3628-###
3629-##########
3630-
3631-
3632-
3633-    def __init_0_1__(self, *args, **kw):
3634-
3635-        self.flags = 0
3636-        multithreaded = 0
3637-
3638-        # default attributes
3639-        if args == ():
3640-            # there is a self.optlist.append() later on, make sure it won't
3641-            # bomb out.
3642-            self.optlist = []
3643-        else:
3644-            self.optlist = args
3645-        self.optdict = kw
3646-
3647-        if len(self.optlist) == 1:
3648-            self.mountpoint = self.optlist[0]
3649-        else:
3650-            self.mountpoint = None
3651-
3652-        # grab command-line arguments, if any.
3653-        # Those will override whatever parameters
3654-        # were passed to __init__ directly.
3655-        argv = sys.argv
3656-        argc = len(argv)
3657-        if argc > 1:
3658-            # we've been given the mountpoint
3659-            self.mountpoint = argv[1]
3660-        if argc > 2:
3661-            # we've received mount args
3662-            optstr = argv[2]
3663-            opts = optstr.split(",")
3664-            for o in opts:
3665-                try:
3666-                    k, v = o.split("=", 1)
3667-                    self.optdict[k] = v
3668-                except:
3669-                    self.optlist.append(o)
3670-
3671-
3672-    def main_0_1_preamble(self):
3673-
3674-        cfargs = FuseArgs()
3675-
3676-        cfargs.mountpoint = self.mountpoint
3677-
3678-        if hasattr(self, 'debug'):
3679-            cfargs.add('debug')
3680-
3681-        if hasattr(self, 'allow_other'):
3682-            cfargs.add('allow_other')
3683-
3684-        if hasattr(self, 'kernel_cache'):
3685-            cfargs.add('kernel_cache')
3686-
3687-        return cfargs.assemble()
3688-
3689-
3690-    def getattr_compat_0_1(self, *a):
3691-        from os import stat_result
3692-
3693-        return stat_result(self.getattr(*a))
3694-
3695-
3696-    def statfs_compat_0_1(self, *a):
3697-
3698-        oout = self.statfs(*a)
3699-        lo = len(oout)
3700-
3701-        svf = StatVfs()
3702-        svf.f_bsize   = oout[0]                   # 0
3703-        svf.f_frsize  = oout[lo >= 8 and 7 or 0]  # 1
3704-        svf.f_blocks  = oout[1]                   # 2
3705-        svf.f_bfree   = oout[2]                   # 3
3706-        svf.f_bavail  = oout[3]                   # 4
3707-        svf.f_files   = oout[4]                   # 5
3708-        svf.f_ffree   = oout[5]                   # 6
3709-        svf.f_favail  = lo >= 9 and oout[8] or 0  # 7
3710-        svf.f_flag    = lo >= 10 and oout[9] or 0 # 8
3711-        svf.f_namemax = oout[6]                   # 9
3712-
3713-        return svf
3714-
3715-
3716-    def readdir_compat_0_1(self, path, offset, *fh):
3717-
3718-        for name, type in self.getdir(path):
3719-            de = Direntry(name)
3720-            de.type = type
3721-
3722-            yield de
3723-
3724-
3725-    compatmap = {'readdir': 'getdir'}
3726rmfile ./mac/fuse.py
3727hunk ./mac/fuseparts/__init__.py 1
3728-__version__ = "0.2"
3729rmfile ./mac/fuseparts/__init__.py
3730hunk ./mac/fuseparts/setcompatwrap.py 1
3731-try:
3732-  set()
3733-  set = set
3734-except:
3735-  from sets import Set as set
3736rmfile ./mac/fuseparts/setcompatwrap.py
3737hunk ./mac/fuseparts/subbedopts.py 1
3738-#
3739-#    Copyright (C) 2006  Csaba Henk  <csaba.henk@creo.hu>
3740-#
3741-#    This program can be distributed under the terms of the GNU LGPL.
3742-#    See the file COPYING.
3743-#
3744-# On 2009-09-21 Csaba Henk granted permission for this file to be
3745-# licensed under the same terms as Tahoe-LAFS itself.
3746-#
3747-
3748-from optparse import Option, OptionParser, OptParseError, OptionConflictError
3749-from optparse import HelpFormatter, IndentedHelpFormatter, SUPPRESS_HELP
3750-from fuseparts.setcompatwrap import set
3751-
3752-##########
3753-###
3754-###  Generic suboption parsing stuff.
3755-###
3756-##########
3757-
3758-
3759-
3760-class SubOptsHive(object):
3761-    """
3762-    Class for collecting unhandled suboptions.
3763-    """
3764-
3765-    def __init__(self):
3766-
3767-        self.optlist = set()
3768-        self.optdict = {}
3769-
3770-    def _str_core(self):
3771-
3772-        sa = []
3773-        for k, v in self.optdict.iteritems():
3774-             sa.append(str(k) + '=' + str(v))
3775-
3776-        ra = (list(self.optlist) + sa) or ["(none)"]
3777-        ra.sort()
3778-        return ra
3779-
3780-    def __str__(self):
3781-        return "< opts: " + ", ".join(self._str_core()) + " >"
3782-
3783-    def canonify(self):
3784-        """
3785-        Transform self to an equivalent canonical form:
3786-        delete optdict keys with False value, move optdict keys
3787-        with True value to optlist, stringify other values.
3788-        """
3789-
3790-        for k, v in self.optdict.iteritems():
3791-            if v == False:
3792-                self.optdict.pop(k)
3793-            elif v == True:
3794-                self.optdict.pop(k)
3795-                self.optlist.add(v)
3796-            else:
3797-                self.optdict[k] = str(v)
3798-
3799-    def filter(self, other):
3800-        """
3801-        Throw away those options which are not in the other one.
3802-        Returns a new instance with the rejected options.
3803-        """
3804-
3805-        self.canonify()
3806-        other.canonify()
3807-
3808-        rej = self.__class__()
3809-        rej.optlist = self.optlist.difference(other.optlist)
3810-        self.optlist.difference_update(rej.optlist)
3811-        for x in self.optdict.copy():
3812-             if x not in other.optdict:
3813-                 self.optdict.pop(x)
3814-                 rej.optdict[x] = None
3815-
3816-        return rej
3817-
3818-    def add(self, opt, val=None):
3819-        """Add a suboption."""
3820-
3821-        ov = opt.split('=', 1)
3822-        o = ov[0]
3823-        v = len(ov) > 1 and ov[1] or None
3824-
3825-        if (v):
3826-            if val != None:
3827-                raise AttributeError, "ambiguous option value"
3828-            val = v
3829-
3830-        if val == False:
3831-            return
3832-
3833-        if val in (None, True):
3834-            self.optlist.add(o)
3835-        else:
3836-            self.optdict[o] = val
3837-
3838-
3839-
3840-class SubbedOpt(Option):
3841-    """
3842-    `Option` derivative enhanced with the attribute of being a suboption of
3843-     some other option (like ``foo`` and ``bar`` for ``-o`` in ``-o foo,bar``).
3844-    """
3845-
3846-    ATTRS = Option.ATTRS + ["subopt", "subsep", "subopts_hive"]
3847-    ACTIONS = Option.ACTIONS + ("store_hive",)
3848-    STORE_ACTIONS = Option.STORE_ACTIONS + ("store_hive",)
3849-    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("store_hive",)
3850-
3851-    def __init__(self, *opts, **attrs):
3852-
3853-       self.subopt_map = {}
3854-
3855-       if "subopt" in attrs:
3856-           self._short_opts = []
3857-           self._long_opts = []
3858-           self._set_opt_strings(opts)
3859-           self.baseopt = self._short_opts[0] or self._long_opts[0]
3860-           opts = ()
3861-
3862-       Option.__init__(self, *opts, **attrs)
3863-
3864-    def __str__(self):
3865-        pf = ""
3866-        if hasattr(self, "subopt") and self.subopt:
3867-            pf = " %s...,%s,..." % (self.baseopt, self.subopt)
3868-        return Option.__str__(self) + pf
3869-
3870-    def _check_opt_strings(self, opts):
3871-        return opts
3872-
3873-    def _check_dest(self):
3874-        try:
3875-            Option._check_dest(self)
3876-        except IndexError:
3877-            if self.subopt:
3878-                self.dest = "__%s__%s" % (self.baseopt, self.subopt)
3879-                self.dest = self.dest.replace("-", "")
3880-            else:
3881-                raise
3882-
3883-    def get_opt_string(self):
3884-        if hasattr(self, 'subopt'):
3885-            return self.subopt
3886-        else:
3887-            return Option.get_opt_string(self)
3888-
3889-    def take_action(self, action, dest, opt, value, values, parser):
3890-        if action == "store_hive":
3891-            if not hasattr(values, dest) or getattr(values, dest) == None:
3892-                 if hasattr(self, "subopts_hive") and self.subopts_hive:
3893-                     hive = self.subopts_hive
3894-                 else:
3895-                     hive = parser.hive_class()
3896-                 setattr(values, dest, hive)
3897-            for o in value.split(self.subsep or ","):
3898-                oo = o.split('=')
3899-                ok = oo[0]
3900-                ov = None
3901-                if (len(oo) > 1):
3902-                    ov = oo[1]
3903-                if ok in self.subopt_map:
3904-                    self.subopt_map[ok].process(ok, ov, values, parser)
3905-                else:
3906-                    getattr(values, dest).add(*oo)
3907-            return
3908-        Option.take_action(self, action, dest, opt, value, values, parser)
3909-
3910-    def register_sub(self, o):
3911-        """Register argument a suboption for `self`."""
3912-
3913-        if o.subopt in self.subopt_map:
3914-            raise OptionConflictError(
3915-              "conflicting suboption handlers for `%s'" % o.subopt,
3916-              o)
3917-        self.subopt_map[o.subopt] = o
3918-
3919-    CHECK_METHODS = []
3920-    for m in Option.CHECK_METHODS:
3921-        #if not m == Option._check_dest:
3922-        if not m.__name__ == '_check_dest':
3923-            CHECK_METHODS.append(m)
3924-    CHECK_METHODS.append(_check_dest)
3925-
3926-
3927-
3928-class SubbedOptFormatter(HelpFormatter):
3929-
3930-    def format_option_strings(self, option):
3931-        if hasattr(option, "subopt") and option.subopt:
3932-            res = '-o ' + option.subopt
3933-            if option.takes_value():
3934-                res += "="
3935-                res += option.metavar or 'FOO'
3936-            return res
3937-
3938-        return HelpFormatter.format_option_strings(self, option)
3939-
3940-
3941-
3942-class SubbedOptIndentedFormatter(IndentedHelpFormatter, SubbedOptFormatter):
3943-
3944-    def format_option_strings(self, option):
3945-        return SubbedOptFormatter.format_option_strings(self, option)
3946-
3947-
3948-
3949-class SubbedOptParse(OptionParser):
3950-    """
3951-    This class alters / enhances `OptionParser` with *suboption handlers*.
3952-
3953-    That is, calling `sop.add_option('-x', subopt=foo)` installs a handler
3954-    which will be triggered if there is ``-x foo`` in the command line being
3955-    parsed (or, eg., ``-x foo,bar``).
3956-
3957-    Moreover, ``-x`` implicitly gets a handler which collects the unhandled
3958-    suboptions of ``-x`` into a `SubOptsHive` instance (accessible post festam
3959-    via the `x` attribute of the returned Values object). (The only exception
3960-    is when ``-x`` has *explicitly*  been added with action ``store_hive``.
3961-    This opens up the possibility of customizing the ``-x`` handler at some
3962-    rate.)
3963-
3964-    Suboption handlers have all the nice features of normal option handlers,
3965-    eg. they are displayed in the automatically generated help message
3966-    (and can have their own help info).
3967-    """
3968-
3969-    def __init__(self, *args, **kw):
3970-
3971-         if not 'formatter' in kw:
3972-             kw['formatter'] = SubbedOptIndentedFormatter()
3973-         if not 'option_class' in kw:
3974-             kw['option_class'] = SubbedOpt
3975-         if 'hive_class' in kw:
3976-             self.hive_class = kw.pop('hive_class')
3977-         else:
3978-             self.hive_class = SubOptsHive
3979-
3980-         OptionParser.__init__(self, *args, **kw)
3981-
3982-    def add_option(self, *args, **kwargs):
3983-        if 'action' in kwargs and kwargs['action'] == 'store_hive':
3984-            if 'subopt' in kwargs:
3985-                raise OptParseError(
3986-                  """option can't have a `subopt' attr and `action="store_hive"' at the same time""")
3987-            if not 'type' in kwargs:
3988-                kwargs['type'] = 'string'
3989-        elif 'subopt' in kwargs:
3990-            o = self.option_class(*args, **kwargs)
3991-
3992-            oo = self.get_option(o.baseopt)
3993-            if oo:
3994-                if oo.action != "store_hive":
3995-                    raise OptionConflictError(
3996-                      "can't add subopt as option has already a handler that doesn't do `store_hive'",
3997-                      oo)
3998-            else:
3999-                self.add_option(o.baseopt, action='store_hive',
4000-                                metavar="sub1,[sub2,...]")
4001-                oo = self.get_option(o.baseopt)
4002-
4003-            oo.register_sub(o)
4004-
4005-            args = (o,)
4006-            kwargs = {}
4007-
4008-        return OptionParser.add_option(self, *args, **kwargs)
4009rmfile ./mac/fuseparts/subbedopts.py
4010rmdir ./mac/fuseparts
4011hunk ./mac/setup.py 1
4012-#!/usr/bin/env python
4013-
4014-from setuptools import setup
4015-import py2app
4016-
4017-import glob
4018-import os
4019-import sys
4020-
4021-# pull in formless, as best way to grab its .css file depenedency
4022-import formless
4023-
4024-def find_formless_css():
4025-    fpath = formless.__path__[0]
4026-    # first look for it from a regular package install
4027-    f = os.path.join(fpath, 'freeform-default.css')
4028-    if os.path.exists(f):
4029-        return f
4030-    # then try looking within .egg structured files
4031-    pyver = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
4032-    f = os.path.join(fpath, '../lib', pyver, 'site-packages/formless/freeform-default.css')
4033-    if os.path.exists(f):
4034-        return f
4035-    raise RuntimeError("Can't find formless .css file")
4036-
4037-data_files = [
4038-     ('pkg_resources/allmydata/web', glob.glob('../src/allmydata/web/*')),
4039-     ('pkg_resources/formless', [find_formless_css()]),
4040-     ]
4041-
4042-from setuptools import find_packages
4043-
4044-packages = find_packages('../src')
4045-
4046-py2app_options = {
4047-    'argv_emulation': True,
4048-    'iconfile': 'allmydata.icns',
4049-    'plist': { 'CFBundleIconFile': 'allmydata.icns', },
4050-    }
4051-
4052-setup_args = {
4053-    'name': 'Allmydata',
4054-    'description': 'The various parts of the Allmydata Tahoe system',
4055-    'author': 'Allmydata, Inc.',
4056-    'app': [ 'allmydata_tahoe.py' ],
4057-    'options': { 'py2app': py2app_options },
4058-    'data_files': data_files,
4059-    'setup_requires': [ 'py2app', 'macholib>=1.2' ],
4060-    'packages': packages,
4061-}
4062-
4063-
4064-if __name__ == '__main__':
4065-    if not os.path.exists('allmydata'):
4066-        os.symlink('../src/allmydata', 'allmydata')
4067-    setup(**setup_args)
4068-
4069-junk = [formless, py2app]
4070-del junk
4071-
4072-
4073-
4074-
4075rmfile ./mac/setup.py
4076rmdir ./mac
4077}
4078[NEWS: remove unmaintained Mac GUI app. refs #1282
4079david-sarah@jacaranda.org**20101226020858
4080 Ignore-this: 40474a07f4a550b48563d35350be7ab5
4081] hunk ./NEWS 3
4082 User visible changes in Tahoe-LAFS.  -*- outline; coding: utf-8 -*-
4083 
4084+* Trunk, post-1.8.1
4085+
4086+** Removals
4087+
4088+ - The unmaintained GUI application for Mac OS X has been removed. (#1282)
4089+
4090+
4091 * Release 1.8.1 (2010-10-28)
4092 
4093 ** Bugfixes and Improvements
4094
4095Context:
4096
4097[docs/architecture.rst: correct rst syntax.
4098david-sarah@jacaranda.org**20101212202003
4099 Ignore-this: 3fbe12feb28bec6f1c63aedbc79aad21
4100]
4101[docs/architecture.rst: formatting.
4102david-sarah@jacaranda.org**20101212201719
4103 Ignore-this: 305fa5dfc2939355eaf6d0d2161eb1ff
4104]
4105[docs: linkification, wording improvements.
4106david-sarah@jacaranda.org**20101212201234
4107 Ignore-this: 4e67287f527a8bc728cfbd93255d2aae
4108]
4109[docs: formatting.
4110david-sarah@jacaranda.org**20101212201115
4111 Ignore-this: 2e0ed394ac7726651d3a4f2c4b0d3798
4112]
4113[docs/configuration.rst: more formatting tweaks; which -> that.
4114david-sarah@jacaranda.org**20101212195522
4115 Ignore-this: a7becb7021854ca5a90edd892b36fdd7
4116]
4117[docs/configuration.rst: more changes to formatting.
4118david-sarah@jacaranda.org**20101212194511
4119 Ignore-this: 491aac33e5f5268d224359f1447d10be
4120]
4121[docs/configuration.rst: changes to formatting (mainly putting commands and filenames in monospace).
4122david-sarah@jacaranda.org**20101212181828
4123 Ignore-this: 8a1480e2d5f43bee678476424615b50f
4124]
4125[scripts/backupdb.py: more accurate comment about path field.
4126david-sarah@jacaranda.org**20101212170320
4127 Ignore-this: 50e47a2228a85207bbcd188a78a0d4e6
4128]
4129[scripts/cli.py: fix missing 'put' in usage example for 'tahoe put'.
4130david-sarah@jacaranda.org**20101212170207
4131 Ignore-this: 2cbadf066fff611fc03d3c0ff97ce6ec
4132]
4133[docs/frontends/CLI.rst: changes to formatting (mainly putting commands and filenames in monospace), and to command syntax to reflect that DIRCAP/... is accepted. Clarify the syntax of 'tahoe put' and other minor corrections. Tahoe -> Tahoe-LAFS.
4134david-sarah@jacaranda.org**20101212165800
4135 Ignore-this: a123ef6b564aa8624d1e79c97068ea12
4136]
4137[docs/frontends/CLI.rst: Unicode arguments to 'tahoe' work on Windows as of v1.7.1.
4138david-sarah@jacaranda.org**20101212063740
4139 Ignore-this: 3977a99dfa86ac33a44171deaf43aaab
4140]
4141[docs/known_issues.rst: fix title and linkify another URL. refs #1225
4142david-sarah@jacaranda.org**20101212062817
4143 Ignore-this: cc91287f7fb51c23440b3d2fe79c449c
4144]
4145[docs/known_issues.rst: fix an external link. refs #1225
4146david-sarah@jacaranda.org**20101212062435
4147 Ignore-this: b8cbf12f353131756c358965c48060ec
4148]
4149[Fix a link from uri.rst to dirnodes.rst. refs #1225
4150david-sarah@jacaranda.org**20101212054502
4151 Ignore-this: af6205299f5c9a33229cab259c00f9d5
4152]
4153[Fix a link from webapi.rst to FTP-and-SFTP.rst. refs #1225
4154david-sarah@jacaranda.org**20101212053435
4155 Ignore-this: 2b9f88678c3447ea860d6b61e8799858
4156]
4157[More specific hyperlink to architecture.rst from helper.rst. refs #1225
4158david-sarah@jacaranda.org**20101212052607
4159 Ignore-this: 50424c768fca481252fabf58424852dc
4160]
4161[Update hyperlinks between docs, and linkify some external references. refs #1225
4162david-sarah@jacaranda.org**20101212051459
4163 Ignore-this: cd43a4c3d3de1f832abfa88d5fc4ace1
4164]
4165[docs/specifications/dirnodes.rst: fix references to mutable.rst. refs #1225
4166david-sarah@jacaranda.org**20101212012720
4167 Ignore-this: 6819b4b4e06e947ee48b365e840db37d
4168]
4169[docs/specifications/mutable.rst: correct the magic string for v1 mutable containers. refs #1225
4170david-sarah@jacaranda.org**20101212011400
4171 Ignore-this: 99a5fcdd40cef83dbb08f323f6cdaaca
4172]
4173[Move .txt files in docs/frontends and docs/specifications to .rst. refs #1225
4174david-sarah@jacaranda.org**20101212010251
4175 Ignore-this: 8796d35d928370f7dc6ad2dafdc1c0fe
4176]
4177[Convert docs/frontends and docs/specifications to reStructuredText format (not including file moves).
4178david-sarah@jacaranda.org**20101212004632
4179 Ignore-this: e3ceb2d832d73875abe48624ddbb5622
4180]
4181[scripts/cli.py: remove the disclaimer in the help for 'tahoe cp' that it does not handle non-ASCII filenames well. (At least, we intend to handle them.)
4182david-sarah@jacaranda.org**20101130002145
4183 Ignore-this: 94c003efaa20b9eb4a83503d79844ca
4184]
4185[relnotes.txt: fifth -> sixth labor-of-love release
4186zooko@zooko.com**20101129045647
4187 Ignore-this: 21c245015268b38916e3a138d256c09d
4188]
4189[Makefile: BB_BRANCH is set to the empty string for trunk, not the string 'trunk'.
4190david-sarah@jacaranda.org**20101128233512
4191 Ignore-this: 5a7ef8eb10475636d21b91e25b56c369
4192]
4193[relnotes.txt: eleventh -> twelfth release.
4194david-sarah@jacaranda.org**20101128223321
4195 Ignore-this: 1e26410156a665271c1170803dea2c0d
4196]
4197[relnotes.tst: point to known_issues.rst, not known_issues.txt.
4198david-sarah@jacaranda.org**20101128222918
4199 Ignore-this: 60194eb4544cac446fe4f60b3e34b887
4200]
4201[quickstart.html: fix link to point to allmydata-tahoe-1.8.1.zip.
4202david-sarah@jacaranda.org**20101128221728
4203 Ignore-this: 7b3ee86f8256aa12f5d862f689f3ee29
4204]
4205[TAG allmydata-tahoe-1.8.1
4206david-sarah@jacaranda.org**20101128212336
4207 Ignore-this: 9c18bdeaef4822f590d2a0d879e00621
4208]
4209Patch bundle hash:
42109a441e14649b127d6fddbd88cc7ebfb4e935f86e