[T?ccs1r+dZ,dZ.kZkZ0y 1eWn723dZ4eidjo5ddBZnnX7eed o8de_n9eid djoD:eid d jo);d eeifGH<ei dnn>y?k Z @k Z k Z k Z kZkZkZkZkZAkZkZBklCklDklEeid joFkZkZnWn^Gej oOZHyIkZeiWn JJnXKd eGHLei dnXNyOkl l!l"Wn&Pej oQk#l l!l"nXSe$Z%Ty Uk%Z%WnVWe$Z%nXYe$Z&Ze%odei'dj o[ei(e$f\Z(Z)\y]xvei'dd]rbZ)^e)d djoH_e)dZ)`e)oei(i*e)oaei(i+de)nnqWbk&Z&Wncde$Z&nXee(e_(f[([)nhe$Z,ieidjo*jy kk,Z,Wnlme$Z,nXnoe$Zre$Z-sy tk-Z-Wnuve$Z-nXxyyk.Z.k/Z/k0Z0k1Z1Wn^zej oOZ{y|kZeiWn }}nX~deGHei dnXe.i2Z2dZ3dZ4dZ5dZ6ddfZ7yei8WnHyei9ei:fe_8Wnei9fe_8nXnXyei:Wne$e_:nXdZ;dZ<e$e$dZ=dZ>dZ?e$dZ@dZAdZBdZCe iDZEdZFeGeHeiIfZJd eKfd!YZLd"ZMd#ZNdd$ZOd%ZPhZQd&ZRd'ZSd(ZTd)ZU e$d*ZVeiWZXeiYZZeid+joeiZXnd,Z[ d-fd.YZ\?d/Z]Cd0fd1YZ^Ydd2Z#bd3Z_mfd4Z`fd5ZafZbdd6Zcd7Zdd8Zed9fd:YZfd;effd<YZgd=effd>YZh$d?effd@YZiDdAZj\dBdCdDdEfZk]dFdGfZl^dHdIdJdKdLdMdNdOdPdQdRdSdTf Zm_dZn`dUZoadVZpbdWZqcd Zrdd Zsed ZtfdXZugdXZvhdXZwidZxjd Zykd ZzldYZ{mdZd[fZ|ndo eidjood\dZd[d]fZ|pnqy reWnstdZnXud^Z}~d_fd`YZ~dafdbYZe$Zdce\fddYZdefdfYZqdgfdhYZdie\fdjYZdkefdlYZdmefdnYZmdoefdpYZtdqefdrYZvdsefdtYZ|duefdvYZ~dwefdxYZdyefdzYZd{fd|YZQd}eKfd~YZSde\fdYZdfdYZeZdZddZdfdYZ]defdYZdefdYZdZe$e$e$dZdZdZdZdZdZdZe$dZdZdZdZdZee.i_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i_ee.i_ee.i_ee.i_ee.i_ee.i_dZdZe$e$e$dZe$e$e$dZe$dZe$dZe$dZe$dZe$dZ e$dZ ee/i_ ee/i_ ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_dZee.i_dZddddfZyieiee.iidZeo4eeeddgZ eed Zn![Wn "#nX$dZ%dZ&e$Z'dZ(dZ)e.iZ*e.iZ+e.iZ,e.iZ-e.iZ.e.iZ/e.iZ0e.iZ1e.iZ2hZ3ddZLdZNdZWddZ]dZceidZddZme$e$ddZe$e$dZeZe$e$e$e$dZhZdddfZe$dZdZdZdZdZe$e$e$e$dZeZdZe$dZe$dZde/ifdYZ(de/ifdYZ,e/iZ-e/iZ.de/ifdYZ9de.i/fdYZde.ifdYZ de.i fdYZ de.i fdYZ dfdYZ> defdYZ defdYZ defdYZ defdYZ dfdYZ dfdYZ de.ifdYZ defdYZ deifdYZ> deifdYZK dfdYZ defdYZ; defdYZK defdYZw defdYZ dfdYZ  defdYZ! defdYZ" dddZ# dddZ$* dddZ%? e$Z&@ dZ'^ defdYZ( dfdYZ) dfdYZ*edfdYZ+dfdYZ,de,e+fdYZ-dfdYZ.de.fdYZ/dfdYZ0d e.i1fd YZ2:d e2fd YZ3Dd e*fdYZ4UdfdYZ5de5fdYZ6de5fdYZ7defdYZ8#de6fdYZ9)de7fdYZ::dfdYZ;Ode8fdYZ<defd YZ=d!e9fd"YZ>d#e:fd$YZ?d%e;fd&YZ@d'e<fd(YZAd)eAfd*YZBd+efd,YZCId-eCfd.YZDd/e9fd0YZEd1e:fd2YZFd3e;fd4YZGd5e;fd6YZHd7e<fd8YZId9e<fd:YZJ!d;efd<YZKd=eKfd>YZLd?e9fd@YZMdAe:fdBYZNdCe;fdDYZOdEe<fdFYZPdGefdHYZQdIefdJYZRdKefdLYZSdMefdNYZT/dOeTfdPYZU>dQeUfdRYZVJdSfdTYZWsdUeWfdVYZXdWeWfdXYZYeXZZdoeddYddfjo eYZZndZeZfd[YZ[d\e[fd]YZ\d^eZfd_YZ]d`eZfdaYZ^e^Z_e]Z_e\Z_e[Z_dbfdcYZ`ddfdeYZadfeafdgYZbdhfdiYZcdjecfdkYZddlecfdmYZednecfdoYZf#dpecfdqYZgOdrecfdsYZhcehZidehZjedtecfduYZkvdvecfdwYZldxecfdyYZmdzZnd{Zod}d d|Zpd}d d~Zqd}d dZrd}d dZsd}d dZtdZuddZvdfdYZwdfdYZxdfdYZydewexeyfdYZz9dezfdYZ{<dezfdYZ|AdewfdYZ}de}fdYZ~de~fdYZdefdYZdefdYZdfdYZde}fdYZdeefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZ defdYZ defdYZ defdYZ defdYZ defdYZ de}fdYZ dezfdYZD defdYZJ deze}fdYZ] de}fdYZc dewfdYZo dfdYZy defdYZ} defdYZ dfdYZ defdYZ defdYZ!defdYZ!defdYZ!defdYZ!defdYZ!defdYZ!defdYZ!dfdYZ"dfdYZj(dfdYZx(dfdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ*defdYZ+defdYZ +defdYZ+defdYZ#+defd YZ/+d efd YZ:+d efd YZ@+defdYZE+defdYZN+defdYZf+defdYZj+defdYZ~+defdYZ+defdYZ+defdYZ+defdYZ+d e{fd!YZ+d"efd#YZ+eeded+eidd +eed$ed%+eieiBdd+eed&ed'+eieiBdd+eed(ed)+eidd +eed*ed++eidd+eed,ed+eidd+eed-ed.+eidd +eed/ed+eidd+eed0ed+eidd+eed1ed+eidd+eed2ed+eidd+eed3ed4+eidd+eed5ed6+eidd+eed7ed+eieiBdd+eed8ed+eieiBdd+eed9ed:+eidd+eeded;+eidd +eed<ed=+eidd+eed>ed+eidd+eed?ed+eidd+eed@edA+eieiBdd,eedBedC,eieiBdd,eedDed,eieiBdd,eedEed,eieiBdd,eedFed,eidd,eedGedH ,eidd ,dIefdJYZ%,dKefdLYZ*,dMefdNYZ/,dOezfdPYZ8,dQefdRYZE,dSe{fdTYZG,dUefdVYZN,dWe~fdXYZY,dYefdZYZ^,d[efd\YZn,d]efd^YZu,d_efd`YZ,daefdbYZ,dcefddYZ,deefdfYZ,dgefdhYZ,diefdjYZ,dkefdlYZ,dmefdnYZ,doefdpYZ,dqefdrYZ,eededI,eidd,eedsedM,eidd,eedYedQ,eidd,eedtedu,eidd,eedvedw,eieiBdd,dxddydzdddUdVdWf,eed{ed|,eidd,eed}eda,eieiBeiBdd,eed~ed,eidd,eeded,eidd,eededg,eidd,eeded,eidd,eededk,eidd,eededq,eidd,defdYZ,defdYZ"-defdYZ&-defdYZ(-defdYZ+-defdYZ.-defdYZ0-defdYZ:-defdYZ@-defdYZF-defdYZI-defdYZO-defdYZT-defdYZW-defdYZZ-defdYZ]-defdYZe-defdYZq-defdYZw-defdYZz-defdYZ-defdYZ-defdYZ-defdYZ-defdYZ-eeded-eidd-dddf-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eiddY-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-dd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-eeded-eidd-defdYZ-defdYZ-defdYZ.eeded.eidd .eeded .eidd .eeded .eidd .defdYZ..defdYZ1.defdYZ4.defdYZ>.defdYZB.eededC.eidd D.eededE.eidd F.eededG.eiddH.eededI.eiddJ.eededK.eiddL.defdYZ.defdYZ.defdYZ .defdYZ .defdYZ .eedze d.eidd.defdYZ .de~fdYZ .de}fdYZ.d efd YZ/d efd YZ/d efdYZd/defdYZf/eedWed g/eiddh/eededi/eiddj/defdYZ|/de~fdYZ/defdYZ/defdYZ/defdYZ/defdYZ/deefd YZ/d!efd"YZ/d#ezfd$YZ/d%efd&YZ/d'efd(YZ/d)efd*YZ/d+efd,YZ /d-efd.YZ!/d/efd0YZ"/d1efd2YZ#/d3eefd4YZ$/d5efd6YZ%0d7e%fd8YZ&0d9efd:YZ'0d;efd<YZ(:0eedUed=;0ei)ei*Bdd<0eedVed=0ei)dd>0eed>ed??0ei)dd@0eed@edAA0ei)ddB0eedBedCC0ei)ddD0eedDed)E0ei)ddF0eedEe dFG0ei)ddH0eedGe!dHI0ei)ddJ0eedIe"dJK0ei)ddL0eedKe%d5M0ei)ddN0eedLe&d7O0ei)ddP0eedMe(dNQ0eiddR0dOefdPYZ+b0dQefdRYZ,0dSe,fdTYZ-0dUe,fdVYZ.0dWe,fdXYZ/0eed e-dY0ei0ei*Bdd0eede,dQ0ei0dd0eedZe.dU0ei0dd0eed[e/dW0ei0dd0d\efd]YZ10d^efd_YZ20d`e2fdaYZ30dbe3fdcYZ40dde3fdeYZ5 1dfe5fdgYZ61dhefdiYZ7H1eedje2dkI1ei0ddJ1eedle3dmK1ei0ddL1eedne4doM1ei0ddN1eede5dpO1ei0ddP1eedye6dqQ1ei0ei*BddR1eedre7dhS1ei0ddT1dse}fdtYZ8\1duefdvYZ9{1dwe9fdxYZ:}1eedye9dz~1ei;dd1d{efd|YZ<1d}efd~YZ=1defdYZ>1defdYZ?1defdYZ@1eede@d1eidez1defdYZA2defdYZB2deBfdYZC2defdYZD2defdYZEJ2deEfdYZFS2deEfdYZG2eedeEd2eiHdd2eedeFd2eiHdd2eedeGd2eiHdd2defdYZI2defdYZJ2defdYZK2defdYZL2defdYZM2deMfdYZN3deMfdYZO3deMfdYZP3deMfdYZQ3deMfdYZR3deMfdYZS 3deMfdYZT&3deMfdYZU63de}fdYZV93deMfdYZWV3eedeMdW3eiXeiBdd X3eedeNdY3eiXdd Z3eedeOd[3eiXeiBdd\3eedePd]3eiXdd^3eedeQd_3eiXdd`3dda3eedeRdb3eiXddc3ddd3eedeSde3eiXdd f3eedeTdg3eiXddh3eedeUdi3eiXddj3eedeWdk3eiXddl3defdYZY3defdYZZ3defdYZ[3defdYZ\3defdYZ]3de]fdYZ^3de]fdYZ_3de\fdYZ`3de_fdYZa3de`fdYZb3de_fdYZc84de~fdYZd@4defdYZeC4defdYZfm4eede]dn4eigddo4eede^dp4eigddq4eede_dr4eigei*Bdds4eedeadt4eigddu4eedecdv4eigeiBddw4eedefdx4eigeiBddy4defdYZh|4defdYZi4eedeid4eiHeiBdd4defdYZj4defdYZk4defdYZl4delfdYZm4eedeld4eineiBdd4dd4eedemd4eindd4defdYZo5defdYZp#5depfdYZq(5deqfdYZr35defdYZs85d eqfd YZt:5d epfd YZuE5d eufdYZvG5depfdYZwQ5deqfdYZx[5dexfdYZyb5defdYZzf5defdYZ{j5dexfdYZ|5eedepd5eidd5eedeqd5eidd5eederd5eidd5eedetd 5eidd5d efd!YZ}5d"efd#YZ~5d$e}fd%YZ5d&e}fd'YZ5d(efd)YZ5d*efd+YZ5d,ezfd-YZ5d.e}fd/YZ6eed0e}d16eidd6eed2ed$6eidd6eed3ed4 6eidd 6eed5ed6 6eidd 6eed7ed8 6eidd6eed9ed.6eidd 6d:efd;YZ6d<efd=YZ86d>efd?YZ;6d@efdAYZA6dBefdCYZC6dDezfdEYZi6dFefdGYZl6dHefdIYZn6dJefdKYZ6dLefdMYZ6dNefdOYZ6dPefdQYZ6dRefdSYZ6dTefdUYZ6dVeexfdWYZ6dXefdYYZ6eedZed<6eieiBdd6dd[6eed\ed]6eieiBdd6eed^edB7eieiBdd7eed_ed`7eieiBdd7eedaedb7eieiBdd7eedcedd7eieiBdd7eedeedP7eieiBdd 7eedfedX 7eidd 7dgefdhYZ 7diefdjYZ+7dkefdlYZ67dmefdnYZI7doefdpYZS7dqefdrYZn7dsefdtYZ}7duefdvYZ7dwefdxYZ7eedyedz7eieiBdd7eed{ed|7eieiBdd7eed}edm7eieiBdd7eed~edq7eieiBdd7eededw7eieiBdd7de~fdYZ7de}fdYZ7defdYZ7eeded7eidd7defdYZ7defdYZ7defdYZ8eeded8eidd8defdYZ8dfdYZ@8de~fdYZE8deefdYZU8deefdYZZ8dee}fdYZm8defdYZ8defdYZ8defdYZ8eeded8ei;dd8eeded8ei;ei*Bdd8defdYZ8defdYZ8eeded8eiHdd8defdYZ8dezfdYZ8defdYZ9defdYZ,9eeded-9eidd.9eeded/9eidd09de~fdYZ:9defdYZ@9defdYZb9defdYZd9de{fdYZj9defdYZl9de{fdYZ9de~fdYZ9defdYZ9defdYZ9eeded9eiHdd9dd9eeded9eiHdd9eeded9eiHdd9eeded9eiHdd 9dd9defdYZ9dezfdYZ9defdYZ:defdYZ9:defdYZA:defdYZC:defdYZV:defdYZc:eededd:eidde:dhdGded?W=ei;ddX=eed@ed&Y=ei;ddZ=eedAed*[=ei;eiBdd\=eedBed.]=ei;eiBdd^=eedCedD_=eiHeiBdd`=dEefdFYZ=eedGedH=eiHdd=dIefdJYZ=dKefdLYZ=dMefdNYZ=dOefdPYZ=dQefdRYZ=dSefdTYZ=dUefdVYZ>eedWedX>eindd>eedYedZ>eindd>eed[edQ>eindd>eed\edU>eindd>d]e~fd^YZ>d_efd`YZR>eedaed_S>eiHddT>dbefdcYZf>ddefdeYZo>dfefdgYZ~>dhefdiYZ>djefdkYZ>dlefdmYZ>eednedo>eidd>dxddydzdddUdVdWf>eedpedl>eieiBdd>dhdGd<>dqefdrYZ>dsefdtYZ ?eeduedv ?eidd ?dxddydzdddUdVdWf ?dwefdxYZ?dyefdzYZ?d{efd|YZ*?d}efd~YZD?defdYZ?defdYZ?defdYZ?defdYZ?eeded?eidd?dd?eeded?eidd?eeded?eidd?eeded?eidd?defdYZ?defdYZ*@defdYZ 7@defdYZ E@eededF@ei eiBddG@dhdd<H@eede dI@ei eiBeiBddJ@dhdd<K@defdYZ @de fdYZ @eede d@ei0eiBdd@eede d@ei0eiBdd@de|fdYZ@de fdYZ@defdYZ@defdYZ@defdYZ@defdYZ@defdYZ@defdYZAdefdYZAdefdYZ"Aeeded#AeieiBdd$Aeeded%AeieiBdd&Aeeded'AeieiBdd(Aeeded)AeieiBdd*AdefdYZ,AdefdYZaAde}fdYZeAde}fdYZgAdefdYZAeededAeieiBeiBddAdefdYZAeededAeieiBeiBddAde~fdYZAdefdYZAdefdYZ AdefdYZ!BdefdYZ"BdefdYZ#'BdefdYZ$6BdefdYZ%HBdefdYZ&SBde}fdYZ'lBde'fdYZ(tBde'fdYZ)Bde'fdYZ*Bde'fdYZ+Bde'fdYZ,Bde'fdYZ-Bde'fdYZ.BdefdYZ/Bde/fdYZ0Bde/fdYZ1Cde/fdYZ2@Cde/fdYZ3{Cde/fdYZ4Cde/fdYZ5Cde/fdYZ6Dde/fdYZ7GDdZ8MDe8de0dei9eiBddNDe8de1dei9eiBddODe8de2dei9ddPDe8de3dei9ddQDe8de4dei9eiBddRDe8de5dei9ddSDe8d e6d ei9ddTDe8d e7d ei9ddUD[8VDd efdYZ:XDdefdYZ;aDdefdYZ<zDde;fdYZ=Dde<fdYZ>Dde>fdYZ?Dde>fdYZ@Deede<dDeiAddDddfdxeBdDeede>dDeiAddDddfdxeBdDd d!Deed"e?d#DeiAddDddfdxeBd Dd d!Deed$e@d%DeiAddDddfdxeBdyDd d!Dd&efd'YZCDd(eCfd)YZDDd*e}fd+YZEDd,efd-YZFDd.efd/YZGDd0efd1YZHDd2efd3YZIEd4efd5YZJ6Eeed6eId77EeiKdd8EdeBddxeBdyd8eBd9Eeed9eJd::EeiKdd ;EdeBddxeBdyd8eBdYZMEd?eMfd@YZNEdAeMfdBYZOEdCeLfdDYZPEdEeMfdFYZQEeedGeMdHEeiReiBddEdddfdxddddUdVdWfEeedIeNdJEeiReiBddEddddYfdxdddUdVdWfEeedKeOdLEeiReiBddEdddfdxddd dydzdddUdVdWf EeedMeQdEEeiReiBddEdNefdOYZSEdPefdQYZTFdRefdSYZUaFdTeUfdUYZVcFdVeUfdWYZWeFdXeUfdYYZXhFdZeUfd[YZYjFd\eUfd]YZZnFd^eZfd_YZ[pFd`Z8zFe8daeUdR{Fe8dbeVdc|Fe8ddeWde}Fe8dfeXdg~Fe8dheYdiFe8djeZdkFe8dle[dmF[8FdnefdoYZ\FdpefdqYZ]Fdre fdsYZ^Fdte}fduYZ_Fdve_fdwYZ`FdxefdyYZaFdzefd{YZbFd|e_fd}YZcFd~e_fdYZdFde_fdYZeFde_fdYZfFdefdYZgFdefdYZhFdefdYZiFde`fdYZjFdefdYZkFdfdYZlFdelefdYZmFdemfdYZn*GdemfdYZoKGdemfdYZpvGdemfdYZqGdemfdYZrGdemfdYZsGdemfdYZt3HdetfdYZu5HdelefdYZvgHdemfdYZwHdewfdYZxHdexfdYZyHdeyfdYZzHdZ8He8dendei{ddHe8deodei{dd He8depdei{eiBddHe8deqdei{eiBddHe8derdei{ddHe8desdei{eiBddHe8detdei{ddHe8deudei{ddHe8devdei{ddHe8dewdei{ddHe8dexdei{ddHe8deydei{eiBdd He8dezdei{eiBdd H[8HdeefdYZ|HdfdYZ}IdfdYZ~MIdfdYZ\IdfdYZzLdZLdZDMdZZMdZqMe$dZMei eei'dS(sPySolshttp://www.oberhumer.com/pysolisntisplatformsunknownisjavais1.5.2s-%s needs Python 1.5.2 or better (you have %s)smacsV %s cannot find the standard Python libraries. Please check your Python installation. s --nosoundii s --bindir=sU %s cannot find the Tkinter Python libraries. Please check your Python installation. s4.82s 20 Aug 2003iRcst|tijoyt|}Wn\d}xC|dr6}t|djo d}n||}qPWnX|Snt|}|SdS(Nsii(stypessstypess UnicodeTypesstrsxscsord(sssxscspysol.pysustrs    cs ttt|SdS(N(stuplesrangeslensobject(sobjectspysol.pysindicesscsq|tjott|SnD|tjott||Sntt|||SdS(N(sstopsNonestuplesrangesstartsstep(sstartsstopsstepspysol.pystranges cstt|SdS(N(srangeslensobject(sobjectspysol.pys range_lenscst|tijo/t|}|it|}nQt|tijo|}|int|}|i|SdS(N( stypessequencestypess TupleTypeslistslsreversestuplesListType(ssequenceslspysol.pysreverses   cs|tjo)ttttt||SnJg}x-|dr }|i |||fqQWt|SdS(Ni( sindicessNonestuplesmapsrangeslensobjectslsisappend(sobjectsindicesslsispysol.pysiranges)  csP|tjottt|Sn tttt||SdS(N(s conditionsNoneslensfilterssequencesmap(s conditionssequencespysol.pyscountscsb|tjoti}nx.|dr!}||o dSnq/WdSdS(Nii(s conditionsNonesoperatorstruthssequencesobj(s conditionssequencesobjspysol.pysexistss csc|tjoti}nx/|dr"}|| o dSnq/WdSdS(Nii(s conditionsNonesoperatorstruthssequencesobj(s conditionssequencesobjspysol.pysforalls csE|djo d Sn|djo dSndSdS(Nii(sexpr(sexprspysol.pyssgns   sSubclassResponsibilitycsRS(N((spysol.pysSubclassResponsibilityscs\|o&t|igt|}n|if}t|||SdS(N(sargsstuplesfsim_classslistsasapplyskw(sfsargsskwsaspysol.pysstatics &cs#|o |Sn|SdS(N(sexprsval1sval2(sexprsval1sval2spysol.pysifelses  csx|idr\}}|i|oat||t|jo||||SdS(N(sStructscs_s __class__s__dict__supdate(s_scspysol.pyscopy:s (s__init__s__str__saddattrsupdatesclearscopy(spysol.pysStruct s      c sQ?@xD|id@r1\}}A|i| oB|||OP|ii| oQt|nR||i|t|d\}}?t|dt|dt|df\}}}@to%d|jo djnptAto%d|jo djnptBto%d|jo djnptC|||fSdS( Nllrvlbviii=vicvisv( s __debug__sseeds_sMAX_SEEDsAssertionErrorsdivmodszsysintsx(s_sseedszsysxspysol.pys _unpackSeed;s29///(sMAX_SEEDsstrsrandoms _convertSeeds _packSeeds _unpackSeed(spysol.pysWHRandom$s     csUDEtiddt|}Ftiddti|}G| oHttfSnIt}Jdot|ddfjoDKti d|oLt |nM|}Nt|djo*Oti |d d}P|d}nQti |d d!d}Rti |dd !d}Sti |d d!d}Td |jo d jno9d |jo d jnod |jo d jno U|t|||ffSnnVti d|oWt |nXti|}Yd |jo djnoZ|t|fSn[|t|fSdS(NsL$ss[\s\#\-\_\.\,]ii is [^0-9a-f]iiii=vicvisvs[^0-9]i}(sressubsstrsssstringslowersNonesgameidslenssearchs ValueErrorssssatoisxsyszsWHRandomsatolsseeds LCRandom31s LCRandom64(sssgameidssssxsyszsseedspysol.pysconstructRandomDs.!  # ]$!sClubsSpadesHeartsDiamondsblacksredsAces2s3s4s5s6s7s8s9s10sJacksQueensKingi i i i?Bscardsets.gifs.ppms.pngs.jpgcsuvtid|}w| p |d oxdfSnyti|dd}ztd|}{| p |d o|dfSn}ttt|SdS(Ns[^\d\.]is.cs z|djS(Ns(sx(sxspysol.pyszs( sressplitsversion_stringsvsstringsfilterstuplesmapsint(sversion_stringsvspysol.pysget_version_tupleussTimercs8~ddZdZdZdZRS(NcsZ||_ti|_tidjoti|_n|i|_dS(Nsnt(smsgs_stimesclocksossnamesstart(s_smsgspysol.pys__init__s  scs|i|_dS(N(s_sclocksstart(s_spysol.pysresetscs|i|iSdS(N(s_sclocksstart(s_spysol.pysgetscs(d|i|i|ifSdS(Ns%-20s %6.3f seconds(s_smsgsclocksstart(s_spysol.pys__repr__s(s__init__sresetsgets__repr__(spysol.pysTimer~s  s DataLoadercsegdZeddZedZedZeedZedZRS(Nc s9t|_t|tijo|f}nto&t|titi fjpt |}t i i |\}}| ot i}n|i||it i i|dt idjont idjont idjondo t idjoNxDtdfdr1}x%dd d fdr}yt i i|o|it i i|d ||it i i|d ||it i i|d ||it i i|d||it i i|d||it i i|d|nWntj o nXqoWqQWng|_ x|dr}| o qny^t i i|} | o!| |i j ot i i| o|i i| nWntj o nXqWx|i dr}d} xy|drl} yGt i i|| } t i i | o| d} nPWntj o nXqqW| t!|jo||_PnqSWt i"t#|dt#|dS(Nsdatasposixsntsmacisis@prefix@s /usr/locals/usrs share/pysols lib/pysolsshare/games/pysolslib/games/pysolsgames/share/pysolsgames/lib/pysols: DataLoader could not find ($sNones_sdirstypes filenamesstypess StringTypes __debug__s TupleTypesListTypesAssertionErrorspathsosssplitsargv0sheadstailscurdirsappendsjoinsnamesVERSIONsvsprefixsisdirsEnvErrorspsnormpathsnpsnsfilenamesfsisfileslenserrorsstr( s_sargv0s filenamesspathsheadstailsvsprefixspsnpsnsfilenamesfspysol.pys__init__st 0    """""*   .       cs|tjodf}n*t|tijo|f}nxa|drT}tii|i||}tii |}||o |SnqXW|o0tid|d|idt|ntSdS(NsisDataLoader could not find s in s (ssubdirssNonestypestypess StringTypesdirsosspathsjoins_sfilenamesfsnormpathsfuncsdo_raiseserrorsstr(s_sfuncsfilenamessubdirssdo_raisesdirsfspysol.pys __findFiles  0ics#|itii||SdS(N(s_s_DataLoader__findFilesosspathsisfilesfilenamessubdirs(s_sfilenamessubdirsspysol.pysfindFilescsxMtdr@}|itii|||d}|o |SnqWti d|d|i dt |dS(Nis DataLoader could not find image s in s ( sIMAGE_EXTENSIONSsexts_s_DataLoader__findFilesosspathsisfilesfilenamessubdirssfserrorsdirsstr(s_sfilenamessubdirssextsfspysol.pys findImages  % csr| otit}ntii|\}}| o|d}n|i ||SdS(Ns.xbm( sfilenamesstringslowersPACKAGEsosspathssplitextsrootsexts_sfindFilessubdirs(s_sfilenamessubdirssrootsextspysol.pysfindIcons   cs#|itii||SdS(N(s_s_DataLoader__findFilesosspathsisdirsfilenamessubdirs(s_sfilenamessubdirsspysol.pysfindDirs(s__init__sNones_DataLoader__findFilesfindFiles findImagesfindIconsfindDir(spysol.pys DataLoaders < sResourcecsdZdZRS(Nc slt|dddddddddd dd }tti|f|idS( Nsnamessfilenamesbasenamesabsnamesindexiserrori(sKwStructskwsapplysStructs__init__s_sgetKw(s_skwspysol.pys__init__s      cs tit|iSdS(N(sstringslowerslatin1_to_asciis_sname(s_spysol.pys getSortKeys(s__init__s getSortKey(spysol.pysResources sResourceManagercsdZdZdZdZdZdZdZdZd Zd Z !d Z )d Z >e d Z [dZRS(Ncs\d |_g|_t|_h|_h|_h|_h|_dS(Ni( s_s _selected_keys_objectssNones_objects_by_names_objects_cache_names_objects_cache_filenames_objects_cache_basenames_objects_cache_absname(s_spysol.pys__init__s      cs|iSdS(N(s_s _selected_key(s_spysol.pys getSelectedscsLto/d |jot|ijnpt||_dS(Ni(s __debug__sindexslens_s_objectssAssertionErrors _selected_key(s_sindexspysol.pys setSelecteds9cst|iSdS(N(slens_s_objects(s_spysol.pyslenscs"to|id jptto(|io|ii|i pt||i|i<|ios t i i |i|_  t i i |i|_  ||i|i< ||i|i < ||i|i scs |dS(Ni(sitem(sitemspysol.pyss(s_s_objects_by_namesNonesmaps_objectsslssortstuple(s_slspysol.pysgetAllSortedByNames  "cs!"yf#|oX$tii|}%|otii|o ||j o&|i|nnWn'tj o }(nXdS(N( sdirsosspathsnormpathsisdirsresultsappendsEnvErrorsex(s_sresultsdirsexspysol.pys_addDir!s +c so)*t}+z,ti||dt}-ti|\}}}.xt |d.r}/y"0ti ||\} } } Wn12PnX3| p| o 4qZn5| djot| tijoH6x>ti| tid6r"} 7|i|ti| qWnqZWWd89|tj o+:y;ti|Wn <=nXnXdS(Nii(sNoneskswin32apis RegOpenKeyExshkeyssubkeysKEY_READsRegQueryInfoKeysnsubkeyssnvaluesstsrangesis RegEnumValueskeysvaluesvtypestypestypess StringTypesstringssplitsosspathsepsds_s_addDirsresultsstrips RegCloseKey( s_sresultshkeyssubkeysksnsubkeyssnvaluesstsiskeysvaluesvtypesdspysol.pys_addRegistryKey)s,  " & ,c s[>?t|tijo@|f}nAg}B|oWCxMtiti i |dti dCr"}D|i|ti|qiWnEx|ii|ii|iifdEr]}F| o GqnHtii|}I| ptii| o JqnKx|dKr}LyM|d djoNtiitii||d }O|i||Pti|d}Q|iRx&|dRr}S|i||qWn#U|i|tii||WnVtj o } WnXq%WqWX|i djoYdG|G|GdG|GHnZ|SdS(Nsiis-*s getSearchDirss->(!stypessearchstypess StringTypesresultsenvsstringssplitsossenvironsgetspathsepsds_s_addDirsstripsapps dataloadersdirsdnsmaintsconfigspathsnormpathsisdirsssjoinsglobsglobdirsssortsEnvErrorsexsdebug( s_sappssearchsenvsresultsdsdirsssglobdirssexspysol.pys getSearchDirs>s>  * $'     )  &c su[\t o ]gSn^ddf}_tdf}`t|tijoa|f}nbg}cx|dcr}dx|ddr}ex|der}fd|t ||f} gtt| } hti| d} ixFttfdir3} jyk|i|| | Wn lmnXqWqWqWquWn|idjoodG|GdG|GHnp|SdS( NsMarkus OberhumersisSoftwares\isgetRegistryDirss->(swin32apisvendorssVERSIONsversionsstypes categoriesstypess StringTypesresultsversionsvendorscategorysPACKAGEstsfiltersNonesstringsjoinssubkeysHKEY_CURRENT_USERsHKEY_LOCAL_MACHINEshkeys_s_addRegistryKeysappsdebug( s_sapps categoriessvendorssversionssresultsversionsvendorscategorystssubkeyshkeyspysol.pysgetRegistryDirs[s2       (s__init__s getSelecteds setSelectedslensregistersgets getByNames getByBasenamesgetAllsgetAllSortedByNames_addDirs_addRegistryKeysNones getSearchDirssgetRegistryDirs(spysol.pysResourceManagers           sCSIcs/qrdZsdZtdZudZvdZwdZxdZydZzdZ{dZ |dZ }dZ ~dZ d Z hd d<d d<d d<d d<dd<dd<dd<dd <d?d@<dAdB<dCdD} | t|i| } |i|| t|qWqW||fSdS(Niiiii(s_sgetFaceCardNamessnamesspnamessranksssuitsslenslrslssmins low_rankss high_rankssrangesrankssuitsindexsappend( s_snamesspnamessranksssuitsslrslss low_rankss high_rankssrankssuitsindexspysol.pysgetPreviewCardNamess  !&  &cst|tijo0||ijo|ii|}nnt|tijo|t |i|_n|i|i|_dS(N( stypesbacknamestypess StringTypes_s backnamessindexs backindexsIntTypeslen(s_sbacknames backindexspysol.pysupdateCardbacks (s__init__sgetFaceCardNamessgetPreviewCardNamessNonesupdateCardback(spysol.pysCardsets  sCardsetManagercs)dZ dZKdZRS(NcsSti|h|_h|_h|_h|_h|_dS(N(sResourceManagers__init__s_sregistered_typessregistered_sizessregistered_stylessregistered_nationalitiessregistered_dates(s_spysol.pys__init__s     cs !|i}"tii| o #dSn$||i_%|tijo"&td|_ 'd|_ n(|ti jo")td|_ *d|_ n+|ti jo@,d|_ -td|_ .d|_ /td|_n|0|tijo@1d|_ 2td|_ 3d|_ 4td |_n)5|tijo.6d |_ 7td|_ 8d |_ n9|tijo5:dS;d|_ <td|_ =d |_ n>|tijo.?d|_ @td|_ Ad |_ n_B|tijoDCdSDd|_ Ef|_ Fd|_ Gt|i|_nIdSJdSdS(Nii scshdi iiiiii sabcdefghs abcdefghis abcdefghijisi(scsstypesssCSIsTYPEshas_keyssis TYPE_FRENCHsrangesranksssuitss TYPE_HANAFUDAs TYPE_TAROCKsnbottomsstrumpss TYPE_HEXADECKsTYPE_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAsTYPE_TRUMP_ONLYsncards(s_scsssspysol.pys_check sR            csZKL|i| o MdSnNt|it|it|i|_O|id |_Pd|i i jo djn oQ|i |i f\}}R|djo |djoSti|i _ nT|djo |djoUti|i _ nyV|djo |d joWti|i _ nFX|d jo |d joYti|i _ n[ti|i _ n\|i}]ttd ||i _^x<|i id ^r)}_|ii|d d|i|]sics`tii|S(N(sCSIs NATIONALITYshas_keyss(ssspysol.pys`sidcsdtii|S(N(sCSIsDATEshas_keyss(ssspysol.pysds('s_s_checkscsslensranksssuitsstrumpssncardssnamessissizesCARDWsCARDHsCWsCHsCSIs SIZE_TINYs SIZE_SMALLs SIZE_MEDIUMs SIZE_LARGEs SIZE_XLARGEsstylesskeysstuplesfiltersssregistered_stylessgets nationalitiessregistered_nationalitiessyearsdatessregistered_datesstypesregistered_typessregistered_sizessupdateCardbacksResourceManagersregister(s_scssCWsCHskeysssspysol.pysregisterKsF /( ! '! '! '## (s__init__s_checksregister(spysol.pysCardsetManagers  +sTilecsmndZRS(Nc sGnot|pdtqdd}stti|f|idS(Nscolors text_colors#000000(sKwStructskwsNonesapplysResources__init__s_sgetKw(s_skwspysol.pys__init__ns  (s__init__(spysol.pysTilemss TileManagercstuRS(N((spysol.pys TileManagertssSamplecsvwdZRS(Nc s?wxt|ydd }{tti|f|idS(Nsvolumei(sKwStructskwsapplysResources__init__s_sgetKw(s_skwspysol.pys__init__ws (s__init__(spysol.pysSamplevss SampleManagercs|}RS(N((spysol.pys SampleManager|ssMusiccs~RS(N((spysol.pysMusic~ss MusicManagercsRS(N((spysol.pys MusicManagerssGIcOsz eiZeiZeiZeiZei Z ei Z ei ZeiZeiZdZdZdZdZdZdZdZdZd Zd Zd Zd Zd ZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1d Z2d!Z3d"Z4dd >Z5dd>Z6dd>Z7dd>Z8dd>Z9dd>Z:dd>Z;dd>Z<dd>Z=dd>Z>dd>Z?d#ed$fd%ed&fd'ed(fd)ed*fd+ed,fd-ed.fd/ed0fd1ed2fd3e"d4fd5e&d6fd7e(d8fd9e*d:fd;e+d<fd=e.d>fd?e0d@fdAe1dBfdCe3dDfdEe4dFfdGedHfdIedJfdKedLfdMedNffZ@dOedPfdQe dRfdSe!dTfdUe$dVfdWe'dXfdYe)dZfd[e%d\fd]e,d^fd_e-d`fdae2dbff ZAdce:e e!e'e)ee2fddfdee:e'e)efdffdQe:e dgfdSe:e!dhfdae:e2diffZBdce7e e!e'e)ee2fdjfdee7e'e)efdkfdQe7e dlfdSe7e!dmfdae7e2dnffZChdod<dpd!<dqdr<dsdt<dudv<dpdw<dxdy<dzd{<d|d} d?ffd@dddAdBdCdDffdEdFfffZF(dd"dddddd&dqg ZG)ddd d dd ddddddddddddddgZH-dddd d d dddd dddxdddqgZI1eJdGZKRS(HNiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!sBaker's Dozen typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssBeleaguered Castle typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Canfield typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssFan typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssForty Thieves typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss FreeCell typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Golf typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Gypsy typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Klondike typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Montana typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Napoleon typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Numerica typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Pairing typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Raglan typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Simple gamescs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Spider typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Terrace typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Yukon typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssOne-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssTwo-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssThree-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssFour-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssDashavatara Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Hanafuda typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssHex A Deck typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Matrix typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssMughal Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysssNavagraha Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Memory typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Poker typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Puzzle typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss Tarock typecs|ii|jS(N(sgissis game_typesgt(sgisgtspysol.pysss French typecs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysss Ganjifa typecs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgtspysol.pyssijiii4isiHi~iKiRiiiiXiiDisAtari ST Patiencei'sGnome AisleRioti"i#i(i)i*i+i:i;i\i]i^i_i`idioipiqiiis KDE Patiencei2iisxpat2i6i?iYiYs1.00s1.01s1.02s1.03s1.10s1.11s2.00is2.01iiis2.02s2.90i$s2.99i%s3.00i&i-i.i/i0i1i3i5i7i8i9i<i=i>i@iAiBiCiEiFiGiIiJiLiMiNiOiPiQiSiTiUiViWiZi[iaibicieifigihikils3.10iminiritiuiviwixiyizi{i|i}is3.20iiiiiiiiiiiiiiiZi[i\i]i^i_i`s3.21iis3.30iiiiiiis3.40iiis4.00iiiiiiiis4.20iiiiiiiiiiiiiis4.30iiiiiis4.41iiiiiiiiiiiiiiis4.60iiiis4.70ics12x|id2r\}}3td|}4d|t|fGH5x|d5r}6tot|t i jpt 7|i i |o$8|GHtodp t |n9|o|i | o$:|GHtodp t |nq[WqW;g}<x`|id<rP\}}=td|}>d|t|t|t|fGH?x|d?r}@tot|t i jpt A|i i |o$B|GHtodp t |nC||jo$D|GHtodp t |nE|o|i | o$F|GHtodp t |nqWG|it|q$WHdGt|GdGHI|o}J|i}Kt|d|}Lt|}Mx#|dMr}N|i|qWO|oPd G|GHnndS( Nics 3|djS(Ni(sid(sidspysol.pys3ss%-20s: %d gamescs =|djS(Ni(sid(sidspysol.pys=ss%s: %3d games, %3d totalstotal:sgamescsK|i|idjS(Ni(smsgetsidsplugin(sidsmspysol.pysKssWARNING: games without version:(s_sGAMES_BY_COMPATIBILITYskeysgamessfilterslensids __debug__stypestypessIntTypesAssertionErrorsPROTECTED_GAMESsgetsmanagers all_gamessGAMES_BY_PYSOL_VERSIONsextendslistsgetGamesIdSortedByIdsgsremove(s_smanagerskeysgamessids all_gamessgspysol.pysassertGI1sH '$, + '$$(   (LsCSIs TYPE_FRENCHs GC_FRENCHs TYPE_HANAFUDAs GC_HANAFUDAs TYPE_TAROCKs GC_TAROCKs TYPE_MAHJONGGs GC_MAHJONGGs TYPE_HEXADECKs GC_HEXADECKsTYPE_MUGHAL_GANJIFAsGC_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsGC_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAsGC_DASHAVATARA_GANJIFAsTYPE_TRUMP_ONLYs GC_TRUMP_ONLYs GT_1DECK_TYPEs GT_2DECK_TYPEs GT_3DECK_TYPEs GT_4DECK_TYPEsGT_BAKERS_DOZENsGT_BELEAGUERED_CASTLEs GT_CANFIELDsGT_DASHAVATARA_GANJIFAs GT_FAN_TYPEsGT_FORTY_THIEVESs GT_FREECELLsGT_GOLFsGT_GYPSYs GT_HANAFUDAs GT_HEXADECKs GT_KLONDIKEs GT_MAHJONGGs GT_MATRIXs GT_MEMORYs GT_MONTANAsGT_MUGHAL_GANJIFAs GT_NAPOLEONsGT_NAVAGRAHA_GANJIFAs GT_NUMERICAsGT_PAIRING_TYPEs GT_POKER_TYPEsGT_PUZZLE_TYPEs GT_RAGLANs GT_ROW_TYPEsGT_SIMPLE_TYPEs GT_SPIDERs GT_TAROCKs GT_TERRACEsGT_YUKONsGT_BETAs GT_CHILDRENs GT_CONTRIBs GT_HIDDENsGT_OPENs GT_ORIGINALs GT_POPULARs GT_RELAXEDsGT_SCOREsGT_SEPARATE_DECKSs GT_XORIGINALsSELECT_GAME_BY_TYPEsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_ORIGINAL_GAME_BY_TYPEsSELECT_CONTRIB_GAME_BY_TYPEsPROTECTED_GAMESsGAMES_BY_COMPATIBILITYsGAMES_BY_PYSOL_VERSIONs_CHILDREN_GAMESs _OPEN_GAMESs_POPULAR_GAMESsNonesassertGI(spysol.pysGIs                                                      T ~~Z &e$E9sGameInfoExceptioncsQRRS(N((spysol.pysGameInfoExceptionQssGameInfoc s5SThdeeededfedZRS(Nc s`TY|t| t| t| }Z|d@}[|d@}\ti djo]t |}n^| o _|} n`t | tijoa| f} nb| o cf} ndd|jo djn oet|dt|nfd|jo djn ogt|dt|nh| p"dt| jo d jn oit|d njtii|okt|d t|nlxtitiftitiftitiffd lrh\}}o||@o ||jop|i|n.q||@ o ||jor||B}nqWsd|jo d jn ot|ti jouti!}nv|ti"jowti#}nx|ti$joyti%}nz|ti&jo{ti'}nv||ti(jo}ti)}nS~|ti*joti+}n0|ti,joti-}n ti.}nt/d|d|d|d|d|}|i2|t/i4|d|d|d|d| dt7| d|d|d|d|dt7| dt7| dt7| d|d|dd dS(Nismacii?Bs: invalid game ID is: invalid number of decks iis: invalid game names: protected game ID ii s game_types game_flagssdeckssredealssncardssids gameclasssnames short_namesaltnamesscategoryssuitssranksstrumpsssisrules_filenamesplugin(9sdecksslenssuitssranksstrumpssncardss game_types game_flagssossnameslatin1_to_asciis short_namestypesaltnamesstypess StringTypesidsGameInfoExceptionsstrsGIsPROTECTED_GAMESsgets GT_CHILDRENs_CHILDREN_GAMESsGT_OPENs _OPEN_GAMESs GT_POPULARs_POPULAR_GAMESsfslsappendscategorys GT_HANAFUDAs GC_HANAFUDAs GT_TAROCKs GC_TAROCKs GT_MAHJONGGs GC_MAHJONGGs GT_HEXADECKs GC_HEXADECKsGT_MUGHAL_GANJIFAsGC_MUGHAL_GANJIFAsGT_NAVAGRAHA_GANJIFAsGC_NAVAGRAHA_GANJIFAsGT_DASHAVATARA_GANJIFAsGC_DASHAVATARA_GANJIFAs GC_FRENCHsStructsredealssgi_sisupdatessis__init__s_s gameclassstuplesrules_filename(s_sids gameclasssnames game_typesdeckssredealsssiscategorys short_namesaltnamesssuitssranksstrumpssrules_filenamesncardss game_flagssfslsgi_sispysol.pys__init__Tsf'     ""09" 'iii (sNonesranges__init__(spysol.pysGameInfoSss GameManagercsqdZdZdZdZdZdZdZdZd ZRS( Ncsd |_h|_h|_t|_t|_t|_t|_h|_ h|_ d|_ h|_ dS(Nii( s_s_GameManager__selected_keys_GameManager__gamess_GameManager__gamenamessNones_GameManager__games_by_ids_GameManager__games_by_names!_GameManager__games_by_short_names_GameManager__games_by_altnames_GameManager__all_gamess_GameManager__all_gamenamessloading_pluginsregistered_game_types(s_spysol.pys__init__s          cs|iSdS(N(s_s_GameManager__selected_key(s_spysol.pys getSelectedscs7to|ii|pt||_dS(N(s __debug__s_s_GameManager__all_gamesshas_keysgameidsAssertionErrors_GameManager__selected_key(s_sgameidspysol.pys setSelecteds$cs|ii|SdS(N(s_s_GameManager__all_gamessgetskey(s_skeyspysol.pysgetscst|t otdn|i|_|ii|i otdt |i n|i i|i o(tdt |i dt i n|iiti@o dSndod|i jo djno dSn||i|i <||i |i <x&|idr}||i |scs |dS(Ni(sitem(sitemspysol.pysscs |dS(Ni(sitem(sitemspysol.pyss(s_s_GameManager__games_by_namesNonesl1sl2sl3s_GameManager__gamessitemssidsgisstringslowerslatin1_to_asciisnamesappends short_namesaltnamessnssortstuplesmaps!_GameManager__games_by_short_names_GameManager__games_by_altname(s_sl1sl2sl3sidsgisnamesnspysol.pysgetGamesIdSortedByNames( !   "cs5|itjo|in|iSdS(N(s_s_GameManager__games_by_namesNonesgetGamesIdSortedByNames!_GameManager__games_by_short_name(s_spysol.pysgetGamesIdSortedByShortNamescs5|itjo|in|iSdS(N(s_s_GameManager__games_by_namesNonesgetGamesIdSortedByNames_GameManager__games_by_altname(s_spysol.pys#getGamesTuplesSortedByAlternateNames( s__init__s getSelecteds setSelectedsgetsregistersgetGamesIdSortedByIdsgetGamesIdSortedByNamesgetGamesIdSortedByShortNames#getGamesTuplesSortedByAlternateName(spysol.pys GameManagers       csti||SdS(N(sGAME_DBsregistersgameinfo(sgameinfospysol.pys registerGamescsM|t_tidjodSnt|ttdS(Nsnt(spluginsGAME_DBsloading_pluginsossnamesexecfilesfilenamesglobals(smodnamesfilenamespluginspysol.pysloadGames  sAbstractAudioClientcs!dZdZdZdZdZ dZ ddd dZd Z%d Z.ddd d Z >d Z GdZ IdZ KdZ MdZOdZQdZSdZUdZWdZYdZ[dZRS(Ncsut|_t|_d|_t|_h|_d |_d|_d |_ d|_ dS(Nii( sNones_sserversaudiodevs connectedsapps file_cachessample_prioritys sample_loopsmusic_prioritys music_loop(s_spysol.pys__init__s        cs|idS(N(s_sdestroy(s_spysol.pys__del__scs dS(N((s_spysol.pys startServerscsto|pt||_|itj o`y$|iod|_nWn2toti n|i nXndS(Ni( s __debug__sappsAssertionErrors_sserversNones_connectServers connecteds tracebacks print_excsdestroy(s_sappspysol.pys connectServers  csr|itj o(y|iWn nXnt|_t|_d|_t|_dS(Ni(s_saudiodevsNones_destroysservers connectedsapp(s_spysol.pysdestroys    cs!  |i |idS(N(s_s stopSampless stopMusic(s_spysol.pysstopAll s cs  |itjp|i p|iii o dSn||ijo|io dSn|ii i |}| p|i o dSnyF|i|i |||o#||_||_dSnWn%totinnXdSdS(Nii(s_saudiodevsNonesappsoptssoundspriorityssample_prioritys sample_loopssample_managers getByNamesnamesobjsabsnames _playSamplesloopsvolumes tracebacks print_exc(s_snamesprioritysloopsvolumesobjspysol.pys playSample s /      iicsz|itjo dSny |iWn%!"to"tinnX#d |_$d|_dS(Nii(s_saudiodevsNones _stopSampless tracebacks print_excssample_prioritys sample_loop(s_spysol.pys stopSampless   csz%&|itjo 'dSn(y)|iWn%*+to+tinnX,d |_-d|_dS(Nii(s_saudiodevsNones_stopSamplesLoops tracebacks print_excssample_prioritys sample_loop(s_spysol.pysstopSamplesLoop%s   cs./|itjp|i p|iii o 0dSn1||ijo|io 2dSn3|ii i |}4| p|i o 5dSn6yF7|i|i |||o#8||_9||_:dSnWn%;<to<tinnX=dSdS(Nii(s_saudiodevsNonesappsoptssoundsprioritysmusic_prioritys music_loops music_managers getByBasenamesbasenamesobjsabsnames _playMusicsloopsvolumes tracebacks print_exc(s_sbasenamesprioritysloopsvolumesobjspysol.pys playMusic.s /      csz>?|itjo @dSnAyB|iWn%CDtoDtinnXEd |_Fd|_dS(Nii(s_saudiodevsNones _stopMusics tracebacks print_excsmusic_prioritys music_loop(s_spysol.pys stopMusic>s   csGHdSdS(Ni((s_spysol.pys_connectServerGscs IJdS(N((s_spysol.pys_destroyIscsKLdSdS(Ni((s_snamesprioritysloopspysol.pys _playSampleKscs MNdS(N((s_spysol.pys _stopSamplesMscsOP|idS(N(s_s _stopSamples(s_spysol.pys_stopSamplesLoopOscsQRdSdS(Ni((s_snamesprioritysloopsvolumespysol.pys _playMusicQscs STdS(N((s_spysol.pys _stopMusicSscsUVd SdS(Ni((s_spysol.pys getMusicInfoUscs WXdS(N((s_s music_listspysol.pysplayContinuousMusicWscs YZdS(N((s_spysol.pys playNextMusicYscs [\dS(N((s_spysol.pysupdateSettings[s(s__init__s__del__s startServers connectServersdestroysstopAlls playSamples stopSamplessstopSamplesLoops playMusics stopMusics_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(spysol.pysAbstractAudioClients,              sPysolSoundServerModuleClientcs]^dZgdZidZpdZrdZudZwdZydZ|d Z~d Z d Z d Z d Z RS(Ncsv^_y,`t|_a|iibd|_Wn=cdtodtinet|_ft|_nXdS(Ni(spysolsoundservers_saudiodevsinitsservers tracebacks print_excsNone(s_spysol.pys startServer^s   csgh|ii|SdS(N(s_saudiodevscmd(s_scmdspysol.pyscmdgscsfij|id}k|djo ldSnmdo |iion|idnodSdS(Ns protocol 6isdebug 1i(s_scmdsrsappsdebug(s_srspysol.pys_connectServeris  cspq|iidS(N(s_saudiodevsexit(s_spysol.pys_destroypscs2rs|id|d |||ftdSdS(Nsplaywav '%s' %d %d %d %di(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolumespysol.pys _playSamplers$csuv|iddS(Nsstopwav(s_scmd(s_spysol.pys _stopSamplesuscswx|iddS(Ns stopwavloop(s_scmd(s_spysol.pys_stopSamplesLoopwscs2yz|id|d |||f{dSdS(Nsplaymus '%s' %d %d %d %di(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolumespysol.pys _playMusicys$cs|}|iddS(Nsstopmus(s_scmd(s_spysol.pys _stopMusic|scs0~|io|iiSnd SdS(Ni(s_saudiodevs getMusicInfo(s_spysol.pys getMusicInfo~s c s|itjp|i o dSnysd}xP|drC}|io0|id|i|i d||i fnqGW|idWn%t ot i nnXdS(Ni?Bisqueuemus '%s' %d %d %d %ds startqueue( s_saudiodevsNonesappsloops music_listsmusicsabsnamescmdsindexsvolumes tracebacks print_exc(s_s music_listsloopsmusicspysol.pysplayContinuousMusics    4 cs|iddS(Nsnextmus(s_scmd(s_spysol.pys playNextMusicscs|itjp|i o dSnddf\}}|iiio(|iii}|iii }ny,|i d||i d|Wn%t ot i nnXdS(Nis setwavvol %ds setmusvol %d( s_saudiodevsNonesappsssmsoptssoundssound_sample_volumessound_music_volumescmds tracebacks print_exc(s_sssmspysol.pysupdateSettingss  ( s startServerscmds_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(spysol.pysPysolSoundServerModuleClient]s          sWin32AudioClientcs)dZdZdZRS(NcsZy+k}||_~d|_Wn"t|_t|_nXdS(Ni(swinsounds_saudiodevsserversNone(s_swinsoundspysol.pys startServers   cs|i}|i|iB|iB|iB}|o||i B}n||i jo||i B}ny|i ||dSWn nXdSdS(Nii(s_saudiodevsas SND_FILENAMEs SND_NODEFAULTs SND_NOWAITs SND_ASYNCsflagssloopsSND_LOOPspriorityssample_prioritys SND_NOSTOPs PlaySoundsfilename(s_sfilenamesprioritysloopsvolumesasflagsspysol.pys _playSamples !  cs9|i}|i|iB}|it|dS(N(s_saudiodevsas SND_NODEFAULTs SND_PURGEsflagss PlaySoundsNone(s_sasflagsspysol.pys _stopSampless (s startServers _playSamples _stopSamples(spysol.pysWin32AudioClients csp|itj oVx@|idr0}y|ii|Wn nXq%Wt|_ndS(Ni(s_s _tclCommandssNonesnamestks deletecommand(s_snamespysol.pys Misc__destroys  cs,|i|id|f|||SdS(Nsbind(s_s_binds_wstagOrIdssequencesfuncsadd(s_stagOrIdssequencesfuncsaddspysol.pysCanvas__tag_bindscs| o&|i|ii|idSn|ddjo|it|dSn:|ddjo%|it |d|dSndS(Nsxviewismovetoisscrolli( sargss_s _getdoublesstkscalls_ws xview_movetosfloats xview_scrollsint(s_sargsspysol.pys Canvas__xviews  &cs8t|d}|ii|idd|SdS(Nf0.0sxviewsmoveto(smaxsfractions_stkscalls_w(s_sfractionspysol.pysCanvas__xview_movetoscs|djoG|i|ii|id}|ddjo dSnn|ii|idd||SdS(Nisxviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsvspysol.pysCanvas__xview_scrolls $cs| o&|i|ii|idSn|ddjo|it|dSn:|ddjo%|it |d|dSndS(Nsyviewismovetoisscrolli( sargss_s _getdoublesstkscalls_ws yview_movetosfloats yview_scrollsint(s_sargsspysol.pys Canvas__yviews  &cs8t|d}|ii|idd|SdS(Nf0.0syviewsmoveto(smaxsfractions_stkscalls_w(s_sfractionspysol.pysCanvas__yview_movetoscs|djoG|i|ii|id}|ddjo dSnn|ii|idd||SdS(Nisyviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsvspysol.pysCanvas__yview_scrolls $cs&|iidd|i|SdS(Nswmsstate(s_stkscalls_wsnewstate(s_snewstatespysol.pys Wm__wm_statescs&|ii|idd|SdS(Nsxviewsmoveto(s_stkscalls_wsfraction(s_sfractionspysol.pysText__xview_movetoscs)|ii|idd||SdS(Nsxviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhatspysol.pysText__xview_scrollscs&|ii|idd|SdS(Nsyviewsmoveto(s_stkscalls_wsfraction(s_sfractionspysol.pysText__yview_movetoscs)|ii|idd||SdS(Nsyviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhatspysol.pysText__yview_scrollscs|ii|iSdS(N(s_scanvassbboxsid(s_spysol.pysCanvasItem__bboxscs|ii|iSdS(N(s_scanvassbboxsid(s_spysol.pys Group__bboxscs&|ii|i|||SdS(N(s_scanvasstag_bindsidssequencescommandsadd(s_ssequencescommandsaddspysol.pysCanvasItem__bindscs&|ii|i|||SdS(N(s_scanvasstag_bindsidssequencescommandsadd(s_ssequencescommandsaddspysol.pys Group__bindscs#|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncidspysol.pysCanvasItem__unbindscs#|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncidspysol.pys Group__unbindscs |ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethisspysol.pysCanvasItem__tkraisescs |ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthisspysol.pysCanvasItem__lowerscs |ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethisspysol.pysGroup__tkraisescs   |ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthisspysol.pys Group__lower scs@|iot|i|}nt|i|SdS(N(s_ssubstsapplysargssfunc(s_sargsspysol.pysCallWrapper____call__s stkis.sbreakshand1swatchcs34||f}5ti|}6|o 7|Sn8ddf}9|ddddfjo:ddf}n;|dfjo<dd f}n=|d fjoY>|d jo?td}n3@|d joAdd f}nCddf}nhD|dfjoEddf}nBF|dfjoGddf}nH|dfj oInJ|t|<K|SdS(Ns Helveticas-14scanvass canvas_smallssmalls tree_smalls-12s canvas_larges-18s canvas_cardiGi9s-16s canvas_fixedsCouriersfixedsdefault(snamescardwskeys getFont_cachesgetsfontsgetFont(snamescardwskeysfontspysol.pysgetFont3s.   csLM|idS(N(swindows wm_withdraw(swindowspysol.pys wm_withdrawLscsNOtidjotddddfj}P|oDQyR|iS|iWnTtij o UnXnV|i dS(Nsntiii( sossnames tkversionsneed_fixswindows wm_iconifysupdate_idletaskssTkintersTclErrors wm_deiconify(swindowsneed_fixspysol.pys wm_deiconifyNs+   cs\WX|idjo?Y|o tidjoZ|idn\t|ndS(Nsiconicsntszoomed(swindowswm_states maximizedsossnames wm_deiconify(swindows maximizedspysol.pyswm_mapWscs\]^| o _dSn`tidjo,a|id|b|id|ndS(Nsposixs@(sfilenamesossnameswindows wm_iconbitmaps wm_iconmask(swindowsfilenamespysol.pys wm_set_icon]s   s%^(\d+)x(\d+)\+([\-]?\d+)\+([\-]?\d+)$csde|i}fti|}g| ohtidt|nit t |i }j|i djokd|d<|d  %  $    %..$cstid|d|}to|i|jptto|i|jpt|it||||SdS(Nswidthsheight( sTkinters PhotoImageswidthsheightsimages __debug__sAssertionErrorsblanks fillImagesfillsoutline(swidthsheightsfillsoutlinesimagespysol.pys createImages $$ sMfxCanvasGroupcs;edZ!ddZ#dZ&dZRS(Ncsgtii|d|d|to!|iii|i  pt  ||ii|i t |_ ?g|_ @t |_ Ag|_ Bd|_Cg|_dS(Nis#000000(sapplysTkintersCanvass__init__s_sargsskwspreviewsitemssNones_MfxCanvas__tileimages_MfxCanvas__tiless_MfxCanvas__topimages_MfxCanvas__topss _text_colors _text_items(s_sargsskwspysol.pys__init__:s        cs#DEtii||||SdS(N(sTkintersCanvass_creates_sitemTypesargsskw(s_sitemTypesargsskwspysol.pys _x_createDscscFGtii||||}H|io*I|i i |i d||idnJ|SdS(Nsloweri( sTkintersCanvass_creates_sitemTypesargsskwsids_MfxCanvas__topsstkscalls_w(s_sitemTypesargsskwsidspysol.pys_createFs *csjKL|tjo|io*M|ii|id||idn O|ii|id||dS(Nslowerisraise(s aboveThissNones_s_MfxCanvas__topsstkscalls_wsid(s_sids aboveThisspysol.pys tag_raiseKs*cskPQ|tjo|io+R|ii|id||id n T|ii|id||dS(Nsraiseislower(s belowThissNones_s_MfxCanvas__tilesstkscalls_wsid(s_sids belowThisspysol.pys tag_lowerPs+cs?UV|id|d|W|iddd||fdS(Nswidthsheights scrollregioni(s_sconfigswidthsheight(s_swidthsheightspysol.pyssetInitialSizeUscsXYg|_Zxf|iidZrP}[to||ij pt\t|i|]|i|i q$W^to|ihjptdS(Ni( s_s _text_itemssitemsskeyssids __debug__s_MfxCanvas__tilessAssertionErrorsunbind_destroysdelete(s_sidspysol.pysdeleteAllItemsXs  "cs_`t|iditiofa|id}bxJt t |idbr.}c|i|ii |jo d|SnqPWnff|i dd}gxJt t |idgr.}h|i|ii|jo i|SnqWjd SdS(Niscurrentswithtagi(s isinstancesstackscardssitemsCanvassGroups_sgettagsscurrentsrangeslensistagsfindsid(s_sstackseventscurrentsispysol.pysfindCard_s   c sxkl|tjp |itjom|id}nt|tij p!|ddjpt |djo odSnpg}qxIdddfdqr3}r|i t ti|||d!d qWsd |dd |dd |dd }tddf|dj}nu|i|joBv||_wx,|idwr}x|id|iqMWndS(Nsbgis#iiiiiif0.212671f0.71516f0.072169is#000000s#fffffff0.3sfill(scolorsNones_s_MfxCanvas__tileimagescgetscstypestypess StringTypeslensvsisappendsintsstringsatois luminances _text_colors _text_itemssitemsconfig(s_scolorscsvsis luminancesitemspysol.pys setTextColorks =   1-  c syzy@{|ot|tijo|td|dd}nWn }tij o~dSnX||ijo dSnx&|i dr}|i |qWg|_ ||_|t jo dSn|i |if\}}t|id}t|id}xtd|d|drv}xjtd|d|drM}|id||d|dd }|i||i i|qxWqSWdSdS( Nsfilesditheriiiisimagesanchorsnw(simagestypestypess StringTypes loadImagesTkintersTclErrors_s_MfxCanvas__tileimages_MfxCanvas__tilessidsdeletesNoneswidthsheightsiwsihsmaxswinfo_screenwidthsswswinfo_screenheightsshsrangesxsys _x_creates tag_lowersappend( s_simagesidsiwsihsswsshsxsyspysol.pyssetTileys2        !  $c sy:|ot|tijotd|}nWn tij odSnXt|i djo||i djo dSnx&|i dr}|i |qWg|_ ||_ |t jo dSn|i|if\}}|djot|id}n|djot|id}n||d}||d}|id||d|dd }|ii|id ||i i|dSdS( Nsfileiiswidthsheightisimagesanchorsnwsraise(simagestypestypess StringTypes loadImagesTkintersTclErrorslens_s_MfxCanvas__topssidsdeletes_MfxCanvas__topimagesNoneswidthsheightsiwsihscwsintscgetschsxsys _x_createstkscalls_wsappend( s_simagescwschsidsiwsihsxsyspysol.pys setTopImages2  -     !$icsj|i||i|}d|odpd|df}|ii |||f|SdS(Ns"%sif {"[%s %s]" == "break"} break s+ss%x %y( s_s _registersfuncs _substitutes needcleanupsfuncidsaddscmdstkscallswhatssequence(s_swhatssequencesfuncsadds needcleanupsfuncidscmdspysol.pys_binds$icsLti}t|d|_t|d|_|fSdS(Nii(sTkintersEventsesintsargssxsy(s_sargssespysol.pys _substitutes(s__init__s _x_creates_createsNones tag_raises tag_lowerssetInitialSizesdeleteAllItemssfindCards setTextColorssetTiles setTopImages_binds _substitute(spysol.pys MfxCanvas9s      sMfxCheckMenuItemcs edZdZRS(Ncstii|dS(N(sTkinters BooleanVars__init__s_(s_smenubarspathspysol.pys__init__scs| p |djo d}nto;t|tijod|jo djnpttii||dS(Nsfalseii( svalues __debug__stypestypessIntTypesAssertionErrorsTkinters BooleanVarssets_(s_svaluespysol.pyssets E(sNones__init__sset(spysol.pysMfxCheckMenuItemssMfxRadioMenuItemcs edZdZRS(Ncstii|dS(N(sTkintersIntVars__init__s_(s_smenubarspathspysol.pys__init__scsQto*t|tijo d|jpttii||dS(Ni( s __debug__stypesvaluestypessIntTypesAssertionErrorsTkintersIntVarssets_(s_svaluespysol.pyssets4(sNones__init__sset(spysol.pysMfxRadioMenuItemssMfxRootcsqdZdZdZdZdZdZdZdZd ZRS( Nc s/ttii|f|t|_dS(N(sapplysTkintersTks__init__s_skwsNonesapp(s_skwspysol.pys__init__scs||_dS(N(sapps_(s_sappspysol.pys connectAppscst}|io|ii}n| o|inS|i}d|_|io|iin|i||_dS(Ni(sNonesgames_sappsupdatesbusysold_busyscanvas(s_sgamesold_busyspysol.pys busyUpdates       cs|i|idS(N(s_s after_idlesquit(s_spysol.pysmainquitscs dS(N((s_sfilenamespysol.pys screenshotscs dS(N((s_scursorspysol.pys setCursorscsti|dS(N(stimessleepsseconds(s_ssecondsspysol.pyssleepscstii|dS(N(sTkintersTksupdates_(s_spysol.pysupdatescs;|io |iio|iiindS(N(s_sappsmenubarsmQuit(s_spysol.pyswmDeleteWindows( s__init__s connectApps busyUpdatesmainquits screenshots setCursorssleepsupdateswmDeleteWindow(spysol.pysMfxRoots       s_ToplevelDialogcsreZddd dZ eddZ dZ3 dZ5 dZ8 d Z; d ZRS( Ncs||_d|_||_t|_t|d||_ |i i ||t |i d|i |itjoXtddddtddddtddddtdddd ft_ndS( NistitlesWM_DELETE_WINDOWsdithersdatasu R0lGODlhIAAgAPICAH8AAH9/f7+/v/8AAP///wAAAAAAAAAAACH5BAEAAAIALAAAAAAgACAAAAPZ KLos8PC1SRccOGNYO9AgCHTNE57ZQwoA6mZAB7z0AFRA/QLBBISEFyEECDAAIYISpSSEAAwAqKkM UQkgQGABCF011xAgEBAAUFfMFQUICACu69UFCAgAL7nyBSADaHI0AGQANHI0AGQAL3oELwBkAC6N Si4AZAAoVxhXKABkAgAhVxpXIQBkAQIAIFchVyAAqQIAIU0oTSEAZAsAIQQvBCEAqQwAOi4AqQEM AMgoAKkTAM8gAKkVD9UPyx0BAMgAywErARAoEOMrC2QREeMB6w3w9AHyFfUrCQA7sq R0lGODlhIAAgAPIDAAAAAAAA/39/f7+/v////wAAAAAAAAAAACH5BAEAAAMALAAAAAAgACAAAAPU OLo88vC1SRccJOsBa32DJo7D4zHCMK7jIJyDwA5BHQws4AksYds9AEXQI/xqRUBDMCgOfoPiAMAQ FK8sgEAhGGC/mgFAMBBcjzUsQDAQfI9YAOR7xAIg3yMWAPkesQAQA1hHVwMADwMCWEdXABADAgNX R0UDABAKAj1oNiwAEAwAYEUAEQ0ApCsAERQAA6oEAwARHgAAA18DtxEwArcAAysDwBECMAoQwAMa AMYPyAwRABoAxtEVAgAaAA/YyAAZAA/fyAAEAA/lyLcP68gQ78gPMAkAOw==s R0lGODlhIAAgAPIDAAAAAAAA/39/f7+/v////wAAAAAAAAAAACH5BAEAAAMALAAAAAAgACAAAAPp OLo88vC1SRccJOsBa32DJo7D4zHCMK7jIJyDwM4j4AnsEOz8wAIUAWsQGGR4gQEL0BAMWDsRkjUA MAQzZAY5AwgUgsEMSRggZwOAYCCgDXYDApJGAAgGArpmwNMDIHoZPIEAEIEEOwOBABCHO4cAEAOH hwMADwMCegM7A3oAEAMCA3RIdAMAEAoCdEh0ABAMADQDOwM0ABENAJQrABEUAAO9BAMAER4AAAOB A8oRMALKAAMrA9MRAjAKENMDGgDZD9sMEQAaANnkFQIAGgAP69sAGQAP8tsABAAP+NvKD/xtgyBw 2wMYCQAAOw==s R0lGODlhIAAgAPIDAAAAAH9/AH9/f7+/v///AAAAAAAAAAAAACH5BAEAAAMALAAAAAAgACAAAAPu OLq88S3KqQIhA9Atw70DIHDkEHwXIAglFaDXAKytFMAXsNZNgF8DwIq3CPwugBVxEDheBoAVMfAZ AK6DD2DFC6Cu4M8AsKoFUOArCrBqBWBpAGoAWJUCsDgMsCIFcHEwAwArHAE4AWABOAArGwE/A2AD OAMAKxQBR2BHACsTAU4BAAFHAwArEgFOAwADTgArEQFOFwC1AwArDQG1vhcAKwwBvgNXA04DACsL Ab5ptQArCgG/abUDACsDAb8DVwO+ACsDAb/nFwArAgHovwMA6wMB7k4DAOsCCgFx/f79+QQwCEiw oEEBEQ4qJKggAQA7(sparents_sstatussdefaultsbuttonsNonestimers makeToplevelstitlestops wm_resizables resizablesbindswmDeleteWindowsimgs makeImages_ToplevelDialog(s_sparentstitles resizablesdefaultspysol.pys__init__s    siics  t|id|i |tj o |in t|i|i y |iiWn t i j o  nX |djo" t |i||i |_n y |iiWn tj o  nX |idS(Nsi(sbinds_stopsmCancelsfocussNones setTransientsparentsgrab_setsTkintersTclErrorstimeoutsaftersmTimeoutstimersmainloops SystemExitsdestroy(s_sfocusstimeoutspysol.pysmainloop s"csP  t|i t|i y |iiWn(  to tin! nX" y# |iiWn($ % to% tin& nX' t |i( |i op) y>* t |i do+ |i i n- |i i Wn(. / to/ tin0 nXn1 t|_2 t|_ dS(Ns busyUpdate(s after_cancels_stimersunbind_destroystops wm_withdraws tracebacks print_excsdestroysdestructsparentshasattrs busyUpdatesupdatesNone(s_spysol.pysdestroy s4      cs3 4 tdSdS(Nsdefault(sgetFont(s_spysol.pysgetDefaultFont3 scs5 6 d|_7 tdS(Ni(s_sstatuss SystemExit(s_seventspysol.pyswmDeleteWindow5 s cs8 9 d|_: tdS(Ni(s_sstatuss SystemExit(s_seventspysol.pysmCancel8 s cs; < d|_= tdS(Ni(s_sstatuss SystemExit(s_seventspysol.pysmTimeout; s ( sNonesimgs__init__smainloopsdestroysgetDefaultFontswmDeleteWindowsmCancelsmTimeout(spysol.pys_ToplevelDialogs "    s MfxDialogcsM> ? dZJ dZY dZd dZo dZ dZRS(Nc s? @ |i|}A ti||||i|iB |i |\}}C |i ||D |i|_ E ti|d|id|iF d|id|i}G |idtiddd|id |iH |i||}I |i||idS( Nstextsjustifyswidthsfontsfillsexpandispadxspady(s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssbuttonsTkintersLabelstextsjustifyswidthsfontsmsgspacksBOTHspadxspadys createButtonssfocussmainloopstimeout(s_sparentstitleskws top_frames bottom_framesmsgsfocusspysol.pys__init__? s".c(sJ K t|L ddddM ddddN dd fd dO d dP d |iQ d |iR ddddS dtddddddT dtdddddd}V dt|idj}W t|i d|X |SdS(Nstimeoutis resizablestextssjustifyscentersstringssOKsdefaultswidthsfonts buttonfontspadxispadysbitmaps bitmap_sideslefts bitmap_padxi s bitmap_padysimages image_sides image_padxs image_padyiisseparatorwidth( sKwStructskws_sgetDefaultFontsNoneslensstringsssws kwdefaults__dict__(s_skwsswspysol.pysinitKwJ s  !c sY Z ti|i}[ |idtidtidd\ |i djoc] ti|idd^ d|i d |i _ d |i d }` |idtidti na ti|i}b |idti dtid d c ||fSdS(Nssidesfillsipadyiisreliefssunkensheightswidths borderwidthisexpandi(sTkintersFrames_stops bottom_framespacksBOTTOMsBOTHskwsseparatorwidths separatorsXs top_framesTOP(s_skws bottom_frames separators top_framespysol.pys createFramesY s%#%cs.d e ddddg}f |i|joWg ti|d|i|i|i}h |i d|i d|i d|i ni |ioGj ti|d |i}k |i d|i d|i d|i nUl |ioGm ti|d|i}n |i d|id|id|indS( Nserrorsinfos questheadswarningsimagessidespadxspadysbitmap(sbmskwsbitmapsTkintersLabelsframes_simgsindexsbspacks bitmap_sides bitmap_padxs bitmap_padysimages image_sides image_padxs image_pady(s_sframeskwsbmsbspysol.pys createBitmapsd s+, , c s)o p d }}q |idd|iddf\}}r t}s d}t x~|i dt rn} u t | t i jov | d} nw | o4x tidd| } y t|t| }nq_Wz x|i dz r} { |d} }| t | t i joH} tot| d jpt~ t| d} | d} n | tjo  qn |djo4 ti|d | d |id d }  | }nm ti|d | d |idd d||d}  ||ijo  | } |iddn t| }  do | |jo, | || d }  | id| n |d} | id|ddddd|d| | i |qW |tj oH t||id}  t!|i"d|  t!|i"d| n |SdS(Nis buttonpadxi s buttonpadyiis[\s\.\,]sistextsfontsstatesdisabledsdefaultsnormalscommandcs |i|S(N(s_smDonesbutton(s_sbuttonspysol.pys ssactiveswidthscolumnsrowsstickysewspadxspadycs |i|S(N(s_smDonesbutton(sevents_sbuttonspysol.pys sss (#sbuttonscolumnskwsgetspadxspadysNonesfocussmax_lensstringsssstypestypess TupleTypesressubsmaxslensxbuttons __debug__sAssertionErrorsintsTkintersButtonsframes buttonfontsbs_sdefaultsconfigslsgrid_configuresgrid_columnconfiguresbindstop( s_sframeskwsbuttonscolumnspadxspadysfocussmax_lensssxbuttonsbslspysol.pys createButtonso sP-      $ ' !  +cs  ||_ tdS(N(sbuttons_s SystemExit(s_sbuttonspysol.pysmDone s (s__init__sinitKws createFramess createBitmapss createButtonssmDone(spysol.pys MfxDialog> s   (sMfxExceptionDialogcs  ddZRS(Nc s  t|dd} t|idd} |o|d djo |d}n |d} t|to |it j o) d|i |i t |if}n t|} |||_ tti|||f|idS(Nsbitmapserrorstextsis s[Errno %s] %s: %s(sKwStructskwsstrsgetstexts isinstancesexsEnvironmentErrorsfilenamesNoneserrnosstrerrorsreprstsapplys MfxDialogs__init__s_sparentstitlesgetKw(s_sparentsexstitleskwstextstspysol.pys__init__ s #)sError(s__init__(spysol.pysMfxExceptionDialog ssMfxSimpleSlidercs)  dZ dZ dZRS(Nc  s8  |i|} ti||||i|i |i |\} }  |i | | ||_  ti|_ |ii| ti| d|d| d|dti ddd|d|id d }  | id tid |id |i |i| |}  |i| |i dS(Nsfrom_stos resolutionsorientslengths3islabelsvariables takefocusissidespadxspady(!s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssvaluesTkinters DoubleVarsvarssetsScalesfrom_stos resolutions HORIZONTALslabelssliderspacksTOPspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitleslabelsvaluesfrom_stos resolutionskws top_frames bottom_framesslidersfocusspysol.pys__init__ s" $(csG  t| dddfdd dd} ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKw s cs1  ||_ |ii|_ tdS(N(sbuttons_svarsgetsvalues SystemExit(s_sbuttonspysol.pysmDone s (s__init__sinitKwsmDone(spysol.pysMfxSimpleSlider s  sMfxSimpleEntrycs  dZRS(Nc  s_  |i|} ti||||i|i |i |\}} |i || ||_  |o5 ti|d|dd} |iddn |idd} ti|ddd ||_ |iid| |iid tid |id|i |i||}  |i}  |i| |idS( Nstexts takefocusispadyise_widthsexportselectioniswidthssidespadx(s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssvalueslabelsTkintersLabelspacksgetswsEntrysvarsinsertsTOPspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitleslabelsvalueskws top_frames bottom_frameswsfocusspysol.pys__init__ s"  !+ (s__init__(spysol.pysMfxSimpleEntry ss MfxTooltipcsY  dZ dZ dZ dZ dZ dZ dZRS(Ncs  ||_ t|_ t|_ t|_ t|_ g|_ |ii|ii d|i  |ii|ii d|i  |ii|ii d|i  d|_  t i|_ t i|_ d|_ d|_ d|_ d|_dS( Nsss is#000000s#ffffe0ii(swidgets_sNonestextstimerstooltipslabelsbindingssappendsbinds_enters_leavestimesTkintersSOLIDsreliefsLEFTsjustifysfgsbgsxoffsetsyoffset(s_swidgetspysol.pys__init__ s       %%%    cs  ||_dS(N(stexts_(s_stextspysol.pyssetText scs  |io|iog |iid|id |iid|id |iid|id g|_ndS(Nsisis i(s_sbindingsswidgetsunbind(s_spysol.pys_unbind s cs!  |i |idS(N(s_s_unbinds_leave(s_spysol.pysdestroy s cs8  t|i t|i|i|i|_dS(N(s after_cancels_stimersafterswidgetstimes_showTip(s_seventspysol.pys_enter scs  t|i t|_ |io\ |ii t|i t|_ |ii t|i t|_ndS(N(s after_cancels_stimersNonestooltipslabelsdestroysdestruct(s_seventspysol.pys_leave s   cs  |ip|i o  dSn |ii} |tifjo) |idtijo  dSnn |ii } |ii |ii } ||i} ||i} ti|_ |ii |iid |iid|i ti|id|i d|id|i d|id|id dd d |_ |iid dd d |iid||f |iidS(NsstateisWM_DELETE_WINDOWstextsreliefsjustifysfgsbgsbds takefocusisipadxsipadys%+d%+d(s_stooltipstextswidgets __class__scsTkintersButtonsDISABLEDs winfo_rootxsxs winfo_rootys winfo_heightsysxoffsetsyoffsetsToplevels wm_iconifyswm_overrideredirects wm_protocolsdestroysLabelsreliefsjustifysfgsbgslabelspacks wm_geometrys wm_deiconify(s_scsxsyspysol.pys_showTip s( *(s__init__ssetTexts_unbindsdestroys_enters_leaves_showTip(spysol.pys MfxTooltip s      sMfxScrolledCanvascsE  dddZ7 dZ= dZ? dZD dZH dZK dZO d ZS ed Z X ed Z b d Z i d Z l dZ o d dZ d dZ dZ dZ dZ dZ dZ dZ dZ dZ dZ dZRS(Nc sZ  |id|id} t|d|dd dddd ||_ |i| t|_  t|_  ||_  t|_  ||_  d|_ d|_ d|_ t|_! |i|" |iiddd# |iiddd$ |o% |d joF& d }' to( tid }n) |iidd |n* |i|+ | o, t|i d |in- |in. |o/ |d joF0 d }1 to2 tid }n3 |iidd |n4 |i|5 t|i d |i6 |indS(Nsbgshighlightthicknessisxscrollincrementisyscrollincrementsweightiiisminsizesi(skwsgetsparentscgetsbgs kwdefaults_s createFramesNonescanvasshbars hbar_modesvbars vbar_modes hbar_shows vbar_showsresize_pendingstimers createCanvassframesgrid_rowconfiguresgrid_columnconfigureswswin32apisGetSystemMetricss createHbarsbinds_mapBarsbindHbars createVbarsbindVbar(s_sparentshbarsvbarskwsbgswspysol.pys__init__ sH                 icsP7 8 t|i9 t|_: |i; |ii< |iidS(N(s after_cancels_stimersNones unbind_allscanvassdestroysframe(s_spysol.pysdestroy7 s   c s = > t|iif|dS(N(sapplys_sframespackskw(s_skwspysol.pyspack= scsG? @ t|iA t|iB t|iC t|idS(N(sunbind_destroys_shbarsvbarscanvassframe(s_spysol.pys unbind_all? scsUD E |id}F |id}G ti|id|d|dt|_ dS(Nswidthsheightsbg( skwsgetswidthsheightsTkintersFrames_sparentsNonesframe(s_skwswidthsheightspysol.pys createFrameD scsJH I tti|if||_J |iidddddddS(Nsrowiscolumnsstickysnews(sapplysTkintersCanvass_sframeskwscanvassgrid(s_skwspysol.pys createCanvasH s!c s`K L ti|iddd|dddd|_M |i|id<N |ii|id s(swsNones_scanvassbinds unit_lefts unit_right(s_swspysol.pysbindHbarS scsX Y |tjoZ |i}n[ t|d|i\ t|d|i] t|d|i^ t|d|i_ t|d|i ` t|d|i a t|d|i dS(Nsss ssss( swsNones_scanvassbindspage_ups page_downsunit_ups unit_downs scroll_tops scroll_bottom(s_swspysol.pysbindVbarX scseb c |ii}d |i}e |io f d|_g |ii nh |i|dS(Ni( seventswidgetswinfo_toplevelstops wm_geometrysgs_sresize_pendingscanvassupdate_idletasks(s_seventstopsgspysol.pys_mapBarb s   cs*i j t|ii|k |idS(N(sapplys_shbarssetsargssshowHbar(s_sargsspysol.pys_setHbari scs*l m t|ii|n |idS(N(sapplys_svbarssetsargssshowVbar(s_sargsspysol.pys_setVbarl scs*o p |i o q dSnr |djos |i}nt |djoiu |ii o v dSnw |ii}x t|ddjpt|dddj}ny ||i jo z dSn{ |o&| |ii ddddddn~ |ii  ||_  dSdS( Niif0.0001f1.0srowscolumnsstickyswe( s_shbarsshows hbar_modescanvasswinfo_ismappedsxviewsviewsabss hbar_showsgrids grid_forget(s_sshowsviewspysol.pysshowHbaro s   8  & ics*  |i o  dSn |djo |i}n |djoi |ii o  dSn |ii} t|ddjpt|dddj}n ||i jo  dSn |o& |ii ddddddn |ii  ||_  dSdS( Niif0.0001f1.0srowscolumnsstickysns( s_svbarsshows vbar_modescanvasswinfo_ismappedsyviewsviewsabss vbar_showsgrids grid_forget(s_sshowsviewspysol.pysshowVbar s   8  & cs%  |iid d dSdS(Nispagesbreak(s_scanvass yview_scroll(s_seventspysol.pyspage_up scs$  |iidd dSdS(Nispagesbreak(s_scanvass yview_scroll(s_seventspysol.pys page_down scs%  |iid d dSdS(Nisunitsbreak(s_scanvass yview_scroll(s_seventspysol.pysunit_up scs$  |iidd dSdS(Nisunitsbreak(s_scanvass yview_scroll(s_seventspysol.pys unit_down scs%  |iid d dSdS(Nispagesbreak(s_scanvass xview_scroll(s_seventspysol.pys page_left scs$  |iidd dSdS(Nispagesbreak(s_scanvass xview_scroll(s_seventspysol.pys page_right scs%  |iid d dSdS(Nisunitsbreak(s_scanvass xview_scroll(s_seventspysol.pys unit_left scs$  |iidd dSdS(Nisunitsbreak(s_scanvass xview_scroll(s_seventspysol.pys unit_right scs!  |iid dSdS(Nisbreak(s_scanvass yview_moveto(s_seventspysol.pys scroll_top scs!  |iid dSdS(Nisbreak(s_scanvass yview_moveto(s_seventspysol.pys scroll_bottom s(s__init__sdestroyspacks unbind_alls createFrames createCanvass createHbars createVbarsNonesbindHbarsbindVbars_mapBars_setHbars_setVbarsshowHbarsshowVbarspage_ups page_downsunit_ups unit_downs page_lefts page_rights unit_lefts unit_rights scroll_tops scroll_bottom(spysol.pysMfxScrolledCanvas s2%                   sMfxScrolledTextcsD  edZ dZ dZ dZ dZRS(Nc s   h} x^|id rK} t|tijp |djo ||||< ||=nqW |ido |d|dsss foregroundsblues underlinei( s_sanchorsurlstagstextstag_adds anchor_markstag_bindscreateCallbacks anchor_enters anchor_leaves tag_configsNone(s_surlstagspysol.pys anchor_end s  "cs#  |iid|iidS(Nscursor(s_stextsconfigsviewers handcursor(s_sargsspysol.pys anchor_enter scs#  |iid|iidS(Nscursor(s_stextsconfigsviewers defcursor(s_sargsspysol.pys anchor_leave scs  |io/ |ii|i|id t|_n! |o" |iid|_# |ii|do$ |d|_ng% |do& d|_nI' |do( d|_n+) |do* d|_n , t|_ndS( Nsinsertiispreisboldisitalic( s_sfontstextstag_adds font_marksNonesindexsfontmapshas_key(s_sfontspysol.pysnew_font s  cs- . d||_dS(Ns (slevels_sindent(s_smarginslevelspysol.pys new_margin- scs"/ 0 |i|i|ddS(Ns (s_s_tkHTMLWriter__writesindentsdata(s_sdataspysol.pyssend_label_data/ scsn1 2 |idjo3 |idn4 |djo5 |id|n6 d|_7 d|_dS(Nis (s_scols_tkHTMLWriter__writes blanklinesatbreak(s_s blanklinespysol.pyssend_paragraph1 s  csc8 9 tt|idd}: |id|; |id< d|_= d|_dS(Nswidthf0.9s_s i(sints_stextswidths_tkHTMLWriter__writescolsatbreak(s_sargsswidthspysol.pys send_hor_rule8 s   ( s__init__screateCallbackswrites_tkHTMLWriter__writes anchor_bgns anchor_ends anchor_enters anchor_leavesnew_fonts new_marginssend_label_datassend_paragraphs send_hor_rule(spysol.pys tkHTMLWriter s '         s tkHTMLParsercs5> ? dZB dZF dZI dZRS(Ncs?? @ tii||||A |iii|||dS(N( shtmllibs HTMLParsers anchor_bgns_shrefsnamestypes formatterswriter(s_shrefsnamestypespysol.pys anchor_bgn? scs7B C |ioD t|_nE |iiidS(N(s_sanchorsNones formatterswriters anchor_end(s_spysol.pys anchor_endB s cs'F G |iidH |idS(Ni(s_s formatters end_paragraphsddpop(s_sattrsspysol.pysdo_dtF scs/I J |iiii||||||dS(N( s_s formatterswritersviewers showImagessrcsaltsismapsalignswidthsheight(s_ssrcsaltsismapsalignswidthsheightspysol.pys handle_imageI s(s anchor_bgns anchor_endsdo_dts handle_image(spysol.pys tkHTMLParser> s   s tkHTMLViewercsK L dZo dZ{ dZ dZ dZ dZ dZ dZ d Z e d d Z  d Z  d d ddd Z  dddZ  dZ dZ dZ dZ dZ dZRS(NcsFL M ||_N t|_O t|_P tdgR dd|_T g|_U |d|_V d|_ W t i |}|_ X |i dddd Y t i|d d Z d |i|_[ |ii dd \ t i|d d] d |i|_^ |ii dd _ t i|d d` d |i|_a |ii dd b t i|d dc d |i|_d |ii dde ddf}f tidjog ddf}nh t|i ddddj d|ik d|ddl dddd|_m |ii dd dd!d"d#n |idS($Nslistsindexiscursorshand2ssidesbottomsfillsxstextsIndexscommandsleftsBacksForwardsClosesrights Helveticai sntsTimes New Romansfgs#000000sbgs#f7f3ffsfontswrapswordspadxispadystopsbothsexpandi(sparents_sNoneshomesurlsStructshistorysimagess defcursors handcursorsTkintersFramesframespacksButtonsgoHomes homeButtonsgoBacks backButtons goForwards forwardButtonsdestroys closeButtonsbasefontsossnamesMfxReadonlyScrolledTextstexts initBindings(s_sparentsframesbasefontspysol.pys__init__L s@        "cso p |i}q t|d|ir t|d|is t|d|it t|d|iu t|d|iv t|d|iw t|d|i x t|d|i y t|d |i z t|d |i dS( NsWM_DELETE_WINDOWssss sssss( s_sparentswsbindsdestroyspage_ups page_downsunit_ups unit_downs scroll_tops scroll_bottomsgoBack(s_swspysol.pys initBindingso s csq{ | t|i} y~ |iiWn   nX y |iiWn   nX t|_dS(N(sunbind_destroys_sparents wm_withdrawsdestroysNone(s_seventspysol.pysdestroy{ scs%  |iid d dSdS(Nispagesbreak(s_stexts yview_scroll(s_seventspysol.pyspage_up scs$  |iidd dSdS(Nispagesbreak(s_stexts yview_scroll(s_seventspysol.pys page_down scs%  |iid d dSdS(Nisunitsbreak(s_stexts yview_scroll(s_seventspysol.pysunit_up scs$  |iidd dSdS(Nisunitsbreak(s_stexts yview_scroll(s_seventspysol.pys unit_down scs!  |iid dSdS(Nisbreak(s_stexts yview_moveto(s_seventspysol.pys scroll_top scs!  |iid dSdS(Nisbreak(s_stexts yview_moveto(s_seventspysol.pys scroll_bottom scs  |tjo |i}n  tii|} |o|otii| o tii |\}} tii |\}} t||djo tii|||}n tii|}n |SdS(Ni(sbaseurlsNones_surlsosspathsnormpathsrelpathsisabsssplitsh1st1sh2st2scmpsjoin(s_surlsbaseurlsrelpathsh1st1sh2st2spysol.pysbasejoin s%icsv  |d djptii|o tii|d}n tii|} t|d|fSdS(Nis/s index.htmlsrb(surlsosspathsisdirsjoinsnormpathsopen(s_surlspysol.pysopenfile s(cs  |iido5 |io |iio |iiinn xddddddfd ro} ti||d joL t | o0 |i t d d |d d d|n dSnqlW |i |d|} yM t}  |i|\}} |i} |i t}Wn tj oM}  |o |in |i d|dt|  dSnA  |o |in |i d| dSnX ||_  |itjo |i |_n |o# |i|i d|d|n |iid jo |ii ddn |ii dd |iit!|ii"jo |i#i ddn |i#i dd |i$|i%f\} }  d|_$|_% |i(i d|i$ |i(i) |i*i d|i$ |i*i) |i(i dd |i(i+dd g|_, t-|i(|}  t/i0| }  t2| } |i4| |i |i(i dd d|jo djno |i(i5|n d|jo djno |i(i6|n |i7i8|i9 |i7i:|i9 | | f\|_$|_% |i(i d|i$ |i*i d|i$dS(Nsappsftp:sgopher:shttp:smailto:snews:stelnet:iis HTML limitation: sThe s! protocol is not supported yet. s%Please use your standard web browser sto open the following URL: srelpathsUnable to service request: s sxviewsyviewsstatesnormalsdisabledswatchscursors1.0sendf0.0f1.0(;s_s__dict__sgetsappsgames _cancelDragspsstringsfindsurlsopenURLs errorDialogsPACKAGEsbasejoinsrelpathsNonesfilesopenfilesreadsdatascloses Exceptionsexsstrshomesadds addHistorysxviewsyviewshistorysindexs backButtonsconfigslenslists forwardButtons defcursors handcursorsold_c1sold_c2stextsupdate_idletaskssframesdeletesimagess tkHTMLWriterswriters formattersAbstractFormattersfmts tkHTMLParsersparsersfeeds xview_movetos yview_movetosparentswm_titlestitles wm_iconname(s_surlsaddsrelpathsxviewsyviewspsfilesdatasexsold_c1sold_c2swritersfmtsparserspysol.pysdisplay s| 0    "     #"  !!ics  |iidjo[ |ii|iid\}}} t||djo |i  dSnn |ii|ii3 |iii |||f |iid|i_dS(Nii( s_shistorysindexslistsusxvsyvscmpsurlsupdateHistoryXYViewsappendsxviewsyview(s_surlsxviewsyviewsusxvsyvspysol.pys addHistory s& cs  |iidjo| |ii|iid\}}} |iid} |iid} |||f|ii|iid; < eZ= dZD dZG dZI dZRS(Nc sQ= > t|? dddfdd @ ddA dd}C ti||SdS( NsstringssOKsCancelsdefaultis resizablesseparatorwidthi(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKw= s   cs2D E |iidd|_F ti|dS(Ns1.0send(s_stext_wsgetstextsDisplayTextDialogsdestroy(s_spysol.pysdestroyD scs G H dS(N((s_seventspysol.pyswmDeleteWindowG scs I J dS(N((s_seventspysol.pysmCancelI s(sMfxScrolledTexts Text_ClasssinitKwsdestroyswmDeleteWindowsmCancel(spysol.pysEditTextDialog; s     sPlayerOptionsDialogcs)K L dZi dZp dZRS(Nc  sL M |i|}N ti||||i|iO |i |\}}P |i ||Q t i|_R |ii|iidjS t i|_T |ii|iidjU t i|_V |ii|iidjW t i|dddd}X |iddY |idd}Z t i|d d d ||_[ |iid|ii \ |iid t i!d |i"d|i#] t i$|d|i^ dd}_ |id t i!d |i"d|i#` t i$|d|ia dd}b |id t i!d |i"d|i#c |ii|_ d |ii|_e |ii|_%f |ii|_g |i&||} h |i(| |i)dS(Nistexts Please enter your names takefocusspadyise_widthisexportselectioniswidthssidespadxsvariables Confirm quitsUpdate statistics and logs(*s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssTkinters BooleanVarsupdate_stats_varssetsappsoptsupdate_player_statss confirm_varsconfirmswin_animation_vars win_animationsLabelswidgetspacksgetswsEntrys player_varsinsertsplayersTOPspadxspadys Checkbuttons update_statss createButtonssfocussmainloopstimeout( s_sparentstitlesappskws top_frames bottom_frameswidgetswsfocusspysol.pys__init__L s8"!+((csvi j ||_k t|ii|_l |ii|_m |ii|_ n |i i|_ o t dS(N( sbuttons_sustrs player_varsgetsplayers confirm_varsconfirmsupdate_stats_vars update_statsswin_animation_vars win_animations SystemExit(s_sbuttonspysol.pysmDonei s  cs\p q t|r dddfdds dddd t d d d d }v ti||SdS( NsstringssOKsCancelsdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKwp s  (s__init__smDonesinitKw(spysol.pysPlayerOptionsDialogK s  sDemoOptionsDialogcsw x dZ dZRS(Nc  snx y |i|}z ti||||i|i{ |i |\}}| |i ||} t i|_~ |ii|iidj t i|_ |ii|iidj t i|_ |ii|ii t i|d|i dd} |idt id|id|i t i|d|i dd} |idt id|id|i t i|d d d d  d ddt i  dddd d|idd} |idt id|id|i |i!||} |i#||i$ |ii%|_ |ii%|_ |ii%|_dS(NisvariablestextsDisplay floating Demo logossidespadxspadysShow score in statusbarsfrom_f0.2stof9.9s resolutionf0.1sorientslengths3islabelsSet demo delay in secondss takefocus(&s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssTkinters BooleanVars demo_logo_varssetsappsopts demo_logosdemo_score_vars demo_scores DoubleVarsdemo_sleep_vars demo_sleeps CheckbuttonswidgetspacksTOPspadxspadysScales HORIZONTALs createButtonssfocussmainloopstimeoutsget( s_sparentstitlesappskws top_frames bottom_frameswidgetsfocusspysol.pys__init__x s4"(((csG  t| dddfdd dd} ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKw s (s__init__sinitKw(spysol.pysDemoOptionsDialogw s sHintOptionsDialogcs  dZRS(Nc s^  t||d |iiddd} |i|_ |i |_  |i |_dS(NsSet hint delay in secondsf0.2f9.9f0.1( sMfxSimpleSlidersparentstitlesappsopts hint_sleepsdsstatuss_sbuttonsvalue(s_sparentstitlesappskwsdspysol.pys__init__ s (s__init__(spysol.pysHintOptionsDialog ssSoundOptionsDialogcsV  fZ dZ dZ dZ dZ dZ dZRS(Nc  sO  ||_ |i|} ti||||i|i  |i |\}} |i || |ii|_ ti|_ |ii|iidj ti|_ |ii|iidj ti|_ |ii|ii ti|_ |ii|ii ti|d|i dd} |idtid|id|i  t!i"djot#o\ ti|d|i dd  d |i$} |idtid|id|i n t#o|i%idjo ti&|d dd d  dddti' dddd d|idd} |idtid|id|i  ti&|d dd d  dddti' dddd d|idd} |idtid|id|i n t(|i)d< |i*||} |i,||i-dS(Nisvariablestexts Sound enabledssidespadxspadysntsUse DirectX for sound playingscommandsfrom_stois resolutionisorientslengths3islabels Sample volumes takefocuss Music volume(.sapps_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssoptscopys saved_optsTkinters BooleanVarssoundssets sound_modesIntVars sample_volumessound_sample_volumes music_volumessound_music_volumes CheckbuttonswidgetspacksTOPspadxspadysossnamespysolsoundserversmOptSoundDirectXs startup_optsScales HORIZONTALsNonesstringss createButtonssfocussmainloopstimeout( s_sparentstitlesappskws top_frames bottom_frameswidgetsfocusspysol.pys__init__ sH "( ,(,cs  ddddg} |itjo dd f|d |i SdS(NscreditssstksTcl/Tk, sgnomesPyGTK, skdespyKDE, swxs wxPython, stitles Creditsstimeoutstexts credits go to: s-Volker Weidner for getting me into Solitaire s1Guido van Rossum for the initial example program s3T. Kirk for lots of contributed games and cardsets s&Carl Larsson for the background music s8The Gnome AisleRiot team for parts of the documentation s Natascha s s The Python, s2SDL & Linux crews for making this program possiblesimageis image_sidesrightsseparatorwidthi(ssoundsappsaudios playSampleststknames MfxDialogstopsPACKAGEstimeoutsgimagesslogossdsstatus(sappstimeoutssoundstsdspysol.pys helpCredits* s       5 cs@ A | o B tSnC y`D |ii||}E F ttjo1G ddf\}}H |ii||anWnOI tj o@J t |i dt dK dd|L dd}M tSnXN t |i dt d }O |id jp|id jo P d }Q |id dnS d}T |iddU yV t||iiWn W W nXX t|}Y ||_Z t|_[ |i|\ t|d|] |SdS(Ns index.htmlshtmlstitles HTML ProblemstextsCannot find help document sbitmapswarnings Helpi iXii,iiiis maximized(sdocumentsNonesapps dataloadersfindFilesdirsdocshelp_html_indexsEnvErrors MfxDialogstopsPACKAGEsdsmakeHelpToplevelswinfo_screenwidthswinfo_screenheights maximizeds wm_minsizes wm_set_iconsfindIcons tkHTMLViewersviewershomesdisplayswm_map(sappsdocumentsdirsdocsdstops maximizedsviewerspysol.pyshelpHTML@ s:     )    sStatus_StatsDialogcs^ _ dZRS(Nc sL_ ` |i|if\}}a d}}b d}c x/|iidc r}d |t|i }qFWe t djoYf dt |i d}g |dt |}h |dt t|i |}n;j dt |i dd t |i dd t |id}m |iiohn |iidjo(o |d t |iiid }np |d t t|iii }nq |iio|ii|iijo*r |dt t|iii }ns |iiot |dt |}nu tidti|ii} v ti||ddw d|id|idd dd|idd| ddt |i i!ddt |i"ddt |i#ddt |i$ddt |i%d|| dddd ff d!|i&i'i(d"d#d$d%d& d'd&d(d)dS(*NsisPyJonggsHighlight tiles: s s Tiles removed: s Tiles remaining: sHighlight piles: sHighlight cards: sHighlight same rank: s Redeals: is Cards in Talon: s Cards in Waste: s Cards in Foundations: s%Y-%m-%d %H:%Mstitles Game statusstextsformatsPlaying time: s Started at: s sMoves: s Undo moves: sBookmark moves: s Demo moves: sHints: sstringssOKs Statistics...iesimageis image_sideslefts image_padxispadxsseparatorwidthi()sgamesstatssgstatssw1sw2snsss foundationsslenscardssPACKAGEsstrshighlight_pilesshighlight_cardsshighlight_samerankstalonsgameinfosredealssroundswastestimesstrftimes localtimes start_timesdates MfxDialogs__init__s_sparents getTitleNames getGameNumbersgetTimesmovessindexs undo_movessgoto_bookmark_movess demo_movesshintssappsgimagesslogos( s_sparentsgamesstatssgstatssw1sw2snsssdatespysol.pys__init___ s2   (D(*)*$ "(s__init__(spysol.pysStatus_StatsDialog^ ssPysolStatsFormattercs  dZ dfdYZ defdYZ ddZ dZ d Z d Z d ZRS( Ncs  ||_dS(N(sapps_(s_sappspysol.pys__init__ ss StringWritercs[  dZ dZ ddZ dZ edZ d d dZRS(Ncs  d|_dS(Ns(s_stext(s_spysol.pys__init__ scs  |i||_dS(N(s_stextss(s_ssspysol.pysp scs  |id|dS(Ns (s_spscount(s_scountspysol.pysnl sics  |i|dS(N(s_spss(s_ssspysol.pyspheader scs3  d|||||f} |i|dS(Ns%-30s %7s %7s %7s %7s (st1st2st3st4st5sss_sp(s_st1st2st3st4st5sgameidssspysol.pyspstats scs'  |id||||fdS(Ns%-25s %-20s %17s %s (s_spsgamenames gamenumbersdatesstatus(s_sgamenames gamenumbersdatesstatussgameidswonspysol.pysplog s(s__init__spsnlspheadersNonespstatssplog(spysol.pys StringWriter s    s FileWritercs  dZ dZRS(Ncs  ||_dS(N(sfiles_(s_sfilespysol.pys__init__ scs  |ii|dS(N(s_sfileswritess(s_ssspysol.pysp s(s__init__sp(spysol.pys FileWriter s cs  titi} tidtiti} t|t|t|d} |i |d||d |i d|d |i ddS(Ns%Y-%m-%d %H:%Mis s s-( stimesctimesdatesstrftimes localtimesmaxs pagewidthslensheadersblanksswriterspheader(s_swritersheaders pagewidthsdatesblanksspysol.pys writeHeader s $& iHc s0  |i} |i||d |i|pddddd |i dddf\}}} |i } x|d r}  |i| }  |ii|| \} }  || || f\}} | | djo dd | | | } n  d }  | djp| djp| |ii jo7 |i| | | | | | d |  |d }nqW |i ||f\} }  | | djo dd | | | } n  d }  |id |t|f | | | | |  |id |SdS(Ni>s Demo gamessPlayedsWonsLosts% wonis%.1ff100.0s0.0sgameidisTotal (%d out of %d games)i(s_sapps writeHeaderswritersheaderspstatssplayersnlstwonstloststgamessgetGamesIdSortedByNamesgsidsgetGameMenuitemNamesnamesstatssgetStatsswonslostspercsgameslen(s_swritersplayersheadersappstwonstloststgamessgsidsnameswonslostspercspysol.pys writeStats s4 #   0&  c s{  | p| o  dSn |i||d |idddd |i ddf\}} x|d r} t |t i j o  q~n t|djo |dttd f}nX t|d jo |td f}n+ t|d jo |d f}n t|d jo  q~n |d} t |t ij o  q~n |ii|}  | o% |iitii|} n | o | i} n d |}  |d }  t| d jo/ d| dd !| d d!| dd !f} n- t| djo  | } n  d}  tidti|d}  |ddjo8 |ddj} |||d |f\}}n d} d |djo djno( dddddf|dd}n |i| | | |d|d|dq~W |id d SdS(NiiGsGames Game numbers Started at sStatusisiiis** UNKNOWN %d **is%s-%s-%sii is ** ERROR **s%Y-%m-%d %H:%Miis*error*sLoadedsNot wonsLostsWonsPerfectsgameidswon("splayers prev_gamess_s writeHeaderswritersheadersplogsnlstwonstlostspgstypestypess TupleTypeslensNonesgameidsIntTypesapps getGameInfosgisGIsPROTECTED_GAMESsgets short_namesnamesfs gamenumberstimesstrftimes localtimesdateswonsstatus(s_swritersplayersheaders prev_gamesstwonstlostspgsgameidsgisnamesfs gamenumbersdateswonsstatusspysol.pys _writeLog sV        %   /  "% &(-cs;  |iiii|} |i||||SdS(N( s_sappsstatss prev_gamessgetsplayers _writeLogswritersheader(s_swritersplayersheaders prev_gamesspysol.pys writeFullLog scs;  |iiii|} |i||||SdS(N( s_sappsstatss session_gamessgetsplayers prev_gamess _writeLogswritersheader(s_swritersplayersheaders prev_gamesspysol.pyswriteSessionLog s(s__init__s StringWriters FileWriters writeHeaders writeStatss _writeLogs writeFullLogswriteSessionLog(spysol.pysPysolStatsFormatter s   - sPysolMenubarActionscs  dZdZ8dZ:dZ<dZ>dZ@dZBdZEd ZGd Z Id Z Pd Z ud Z dZ dZdZedZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!#d"Z",d$d#Z#2d$ d%Z$8d&Z%?d'Z&Fd(Z'Id)Z(Ld*Z)Od+Z*Rd,Z+_d-Z,vd.Z-d/Z.d0Z/d1Z0d2Z1d3Z2d4Z3d5Z4d6Z5d7Z6d8Z7d9Z8d:Z9d;Z:d<Z;d=Z<d>Z=d?Z>d@Z? dAZ@dBZAdCZBdDZCdEZDdFZE#dGZF(dHZG3dIZH6dJZI9dKZJ?dLZKBdMZLEdNZMGdOZNMdPZO\dQZPRS(RNc0s#  ||_ ||_ t|_ tdd dd dd dd dd dd dd d d d d d d d d d d dd dddd|_tdt|dt|dt|d t|d t|d t| d t| dt| dt| d t| dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|d t||_ dS(!Nssaveissave_ass hold_and_quitsundosredosrestartsdealshints autofaceupsautodropsautodeals quickplaysdemoshighlight_pilessrulessgameidsgameid_popularscomments bookmarksshighlight_cardsshighlight_samerankssoundscardbacks tabletiles animationssshadowsshadestoolbars toolbar_sizestoolbar_reliefs statusbar( sapps_stopsNonesgamesStructs menustatesMfxRadioMenuItemsMfxCheckMenuItemstkopt(s_sappstopspysol.pys__init__ sR                 cs||_|tjo dSnto|i|ijpt |i|iif\}}!|ii |i "|i i |i #|i i t |ii $|ii |i%|ii |i&|ii |i'|ii |i(|ii |i)|ii |i*|ii |i+|ii |i,|ii |i-|ii |i.|ii |i/|ii |iii0|ii |iif1|ii |i2|i i |i 3|i!i |i!4|i"i |i"5|i#i |i#6|i$i |i$7|i%i |i%dS(N(&sgames_sNones __debug__sappsAssertionErrorstkoptsoptsgameidssetsidsgameid_popularscommentsbools gsaveinfos autofaceupsautodropsautodeals quickplaysundoshints bookmarksshighlight_pilesshighlight_cardsshighlight_samerankssoundscardbackscardsets backindexs tabletilestabletile_indexs animationssshadowsshadestoolbars toolbar_sizestoolbar_reliefs statusbar(s_sgamestkoptsoptspysol.pys connectGames8  $cs 89dS(N((s_sgameidsspysol.pysupdateRecentGamesMenu8scs :;dS(N((s_spysol.pysupdateBookmarkMenuState:scs <=dS(N((s_spysol.pysupdateBackgroundImagesMenu<scs'>?|itjp |iiSdS(N(s_sgamesNones _finishDrag(s_spysol.pys _finishDrag>scs'@A|itjp |iiSdS(N(s_sgamesNones _cancelDrag(s_spysol.pys _cancelDrag@scsABCto|itj ptDt|ii||SdS(N( s __debug__s_sgamesNonesAssertionErrorsapplyschangedsargsskw(s_sargsskwspysol.pyschangedBs!csEFtdS(N(sSubclassResponsibility(s_sstatespathspysol.pys setMenuStateEscsGHtdS(N(sSubclassResponsibility(s_sstatespathspysol.pyssetToolbarStateGscsIJ|i}Kxl|iidKrV\}}Lt|ti jo!Mdgt ||i||io dSnt|iiddf\}}t|idd|ddddfd dd d }|i djo dSn|i d jo dSn|i d jo|i dSn|i o&|iid o dSnn|i|i|iiidS(NsformatisSelect new game numbers Enter new game numbersstringssOKs Next numbersCancelsdefaultse_widthiii(s_s _cancelDragsNonesgames getGameNumbersidsfsMfxSimpleEntrystopsdsstatussbuttonsmNewGameWithNextIdschangeds areYouSures_mNewGameBySeedsvaluesrandomsORIGIN_SELECTED(s_sargssidsfsdspysol.pysmSelectGameByIds" $    csT|io dSn|io&|iid o dSnnxtddr}|ii|ii }|t jo qfndo|i |ii jo qfndo|i |iii jo qfnPqfW|o|i |ii jo*|ii|ii|i ndS(NsSelect random gameiii(s_s _cancelDragschangedsgames areYouSuresrangesisapps getGameInfosgetRandomGameIdsgisNonesidscategorysgameinfosendGamesquitGame(s_sargssisgispysol.pysmSelectRandomGames$     #  cs|io dSn|ii}t|}t|djp ||j o dSn|io&|iid o dSnn|i ||t|}|ii |ii ||dS(NisSelect next game( s_s _cancelDragsgamesidslistsglslenschangeds areYouSuresindexsstepsendGamesquitGame(s_sglsstepsidsindexspysol.pys_mSelectNextGameFromLists $  cs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedById(s_sargsspysol.pysmSelectNextGameByIdscs'|i|iiid dS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedById(s_sargsspysol.pysmSelectPrevGameByIdscs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedByName(s_sargsspysol.pysmSelectNextGameByNamescs'|i|iiid dS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedByName(s_sargsspysol.pysmSelectPrevGameByNamescsp|io dSn |iio> |iio |ii|iin |indS(N(s_s _cancelDrags menustatessave_assgamesfilenamessaveGamesmSaveAs(s_sargsspysol.pysmSaves  csN|io dSn|iidd|iidddS(Nsholdgamei(s_s _cancelDragsgamesendGamesquitGame(s_sargsspysol.pys mHoldAndQuits csx|io dSn|io&|iid o dSnn|ii|iidS(Ns Quit PySol(s_s _cancelDragschangedsgames areYouSuresendGamesquitGame(s_sargsspysol.pysmQuits csY|io dSn|iio'|iid|iindS(Nsundo(s_s _cancelDrags menustatesundosgames playSample(s_sargsspysol.pysmUndos  csi|io dSn|iio7 |iid!|ii"|iindS(Nsredo(s_s _cancelDrags menustatesredosgames playSamples checkForWin(s_sargsspysol.pysmRedos  cs#$|io $dSn%|iio&|iiddd'xX'|iiit|iii jo/(|ii)|ii o*PnqMW+|ii ndS(Nsredosloopi( s_s _cancelDrags menustatesredosgames playSamplesmovessindexslenshistorys checkForWins stopSamples(s_sargsspysol.pysmRedoAll#s ( cs,-|io -dSn.|iii o .dSn/d|jo djn o /dSn0|ii|d|1|ii dS(Niisconfirm( s_s _cancelDragsappsopts bookmarkssnsgames setBookmarksconfirms updateMenus(s_snsconfirmspysol.pys mSetBookmark,s  " ics23|io 3dSn4|iii o 4dSn5d|jo djn o 5dSn6|ii|d|7|ii dS(Niisconfirm( s_s _cancelDragsappsopts bookmarkssnsgames gotoBookmarksconfirms updateMenus(s_snsconfirmspysol.pys mGotoBookmark2s  " cs89|io 9dSn:|iii o :dSn;|iii o ;dSn<|iidd o <dSn=h|ii_>|iidS(NsClear bookmarkssClear all bookmarks ?( s_s _cancelDragsappsopts bookmarkssgames gsaveinfos areYouSures updateMenus(s_sargsspysol.pysmClearBookmarks8s    cs?@|io @dSnA|iiidjo BdSnC|iddo)D|iidd o DdSnnE|iidS(Nisrestartis Restart gamesRestart this game ?(s_s _cancelDragsgamesmovessindexschangeds areYouSures restartGame(s_sargsspysol.pysmRestart?s  cs2FG|io GdSnH|iidS(N(s_s _cancelDragsgames dealCards(s_sargsspysol.pysmDealFs cs?IJ|io JdSnK|iidd dddS(Ns autofaceupisautodrop(s_s _cancelDragsgamesautoPlay(s_sargsspysol.pysmDropIs cs>LM|io MdSnN|iidddddS(Ns autofaceupisautodrop(s_s _cancelDragsgamesautoPlay(s_sargsspysol.pysmDrop1Ls cs5OP|io PdSnQ|idddS(Nsmodeid(s_s _cancelDrags mPlayerStats(s_sargsspysol.pysmStatusOs csBRS|io SdSnT|i|iif\}}Ud|idd}Vd|i|d}W|i i p|}Xt |i d|d|}Y|idjo |idjoWZti|iti|jo[d |i _ n]ti|i|i _ n^|ii it|i i dS( Ns sformatis Comments for s: s Comments forstextis(s_s _cancelDragsgamesgameinfosgis getGameNumberstsnamesccs gsaveinfoscommentscsEditTextDialogstopsdsstatussbuttonsstringsstripstextsrstripstkoptssetsbool(s_sargssgamesgistsccscsdspysol.pysmEditGameCommentRs #%c s_`t}a|tjobd}c|d}n ed}ftii|i i i |d}gtii |}hycit |d}jt|i }k|i|}lt|||||fmt|WnQntj oB} o|oo|inpt|i| qdd} nPXs|os|intt|idtd d d ud|d |} dS( NsDemo statisticss_demosYour statisticss.txtsastextsError while writing to filestitles Infosbitmapsinfos were appended to (sNonesfilesplayerstextsfilenamesosspathsjoins_sappsdnsconfigsnormpathsopensPysolStatsFormattersas FileWriterswritersapplys write_methodsheadersdestructsEnvErrorsexsclosesMfxExceptionDialogstopsds MfxDialogsPACKAGE( s_splayersheadersfilenames write_methodsfilestextsaswritersexsdspysol.pys _mStatsSave_s,   %  c svw|idd}xd}yxy|djoz|djo{| }||d}n}tdd dd }~|o0t}tdtd d f\}}} n2|i ii}|d d |f\}}} |iii} |d jot|id |i}nt|djo?|d| } t|i| |i |d|ii}n%|djo3|d| } t|i| |i |}n|djo3|d| } t|i| |i |}n|djo3|d| } t|i| |i |}n\|djo6d|} ti} |i|| d| n|djo6d|} ti} |i|| d| n|djo6d|} ti } |i|| d| n|djo|ii!dd|d d!dd"doT|i i"i#|d|ii$d|i i"i%|i ii|iinn|d#jo|ii!d$d%|d&| d d!dd"doZ|i i"i#||ii|ii$d|i i"i%|i ii|iinnF|d'jon/|d(jond)G|G|G|GH|i&djoPn|i'}q'WdS(*Nsmodeieiisstatusisbuttons Demos Demo ss for idsgamesStatistics for sgameidifs StatisticsigsFull logihs Session logisstatsis Full log for slogisSession log for i-sReset all statisticss)Reset ALL statistics and logs for player s ?sconfirmsdefaulti.sReset game statisticss%Reset statistics and logs for player s and game iisstats problem:((skwsgetsmodesdemosStructsdsNonesplayersPACKAGEsp0sp1sp2s_sappsoptsgamesgameinfos short_namesnsStatus_StatsDialogstopsheadersSingleGame_StatsDialogsidsAllGames_StatsDialogsFullLog_StatsDialogsSessionLog_StatsDialogsPysolStatsFormatters writeStatss write_methods _mStatsSaves writeFullLogswriteSessionLogs areYouSuresstatss resetStatss updateStatussgetStatssstatussbutton( s_sargsskwsmodesdemosdsplayersp0sp1sp2snsheaders write_methodspysol.pys mPlayerStatsvsz    '."""      ??cs~|io dSn|iiioI|iid|iiio#|iii d|ii_ nndS(Nii( s_s _cancelDragsappsoptshintsgamesshowHints hint_sleepsstatsshints(s_sargsspysol.pysmHints  "cs~|io dSn|iiioI|iid|iiio#|iii d|ii_ nndS(Ni( s_s _cancelDragsappsoptshintsgamesshowHints hint_sleepsstatsshints(s_sargsspysol.pysmHint1s  "cs{|io dSn|iiioF|ii|iiio#|iiid|ii_nndS(Ni( s_s _cancelDragsappsoptshighlight_pilessgameshighlightPilesshighlight_piles_sleepsstats(s_sargsspysol.pysmHighlightPiless  csR|io dSn|iitj o|iddndS(Nsmixedi(s_s _cancelDragsgames getHintClasssNones_mDemo(s_sargsspysol.pysmDemos cs5|io dSn|idddS(Nsmixedi(s_s _cancelDrags_mDemo(s_sargsspysol.pys mMixedDemos cs|io dSn|ioY|iiidjo|iiidjo&|iid o dSnnn|iid|dS(Nis Play demosmixed( s_s _cancelDragschangedsgamesstatss demo_movesshintss areYouSures startDemosmixed(s_smixedspysol.pys_mDemos /csa|io dSnt|id|i}|idjo |idjot|i |ii _ t|i |ii _ t|i |ii _ ti|id }dt|jo djnol||ii _|iid|ii i|iid|iii|ii i|iinndS(NsSet player optionsiisplayersstats(s_s _cancelDragsPlayerOptionsDialogstopsappsdsstatussbuttonsboolsconfirmsopts update_statssupdate_player_statss win_animationsstringsstripsplayersnslensgames updateStatussstatssgetStatssid(s_sargssdsnspysol.pysmOptPlayerOptionss #'csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkopts autofaceupsgetsappsoptsgamesautoPlay(s_sargsspysol.pysmOptAutoFaceUps  csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkoptsautodropsgetsappsoptsgamesautoPlay(s_sargsspysol.pys mOptAutoDrops  csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkoptsautodealsgetsappsoptsgamesautoPlay(s_sargsspysol.pys mOptAutoDeals  cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkopts quickplaysgetsappsopt(s_sargsspysol.pys mOptQuickPlays csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptsundosgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableUndos csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkopts bookmarkssgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableBookmarkss csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshintsgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableHints csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_pilessgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableHighlightPiless csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_cardssgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableHighlightCardss csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_sameranksgetsappsoptsgames updateMenus(s_sargsspysol.pysmOptEnableHighlightSameRanks csk|io dSn |iii|ii_ |iii o |iiindS(N( s_s _cancelDragstkoptssoundsgetsappsoptsaudiosstopAll(s_sargsspysol.pys mOptSounds  cs\  |io  dSnt|id|i}|iii|ii idS(NsSound settings( s_s _cancelDragsSoundOptionsDialogstopsappsdstkoptssoundssetsopt(s_sargssdspysol.pysmOptSoundDialog s cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkopts animationssgetsappsopt(s_sargsspysol.pysmOptAnimationss cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsshadowsgetsappsopt(s_sargsspysol.pys mOptShadows cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsshadesgetsappsopt(s_sargsspysol.pys mOptShades cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsirregular_pilessgetsappsopt(s_sargsspysol.pysmOptIrregularPiless cs|io dSnt|id|i}|idjo |idjoC |i|ii _!|i |ii _ "|i |ii _ ndS(NsSet demo optionsi( s_s _cancelDragsDemoOptionsDialogstopsappsdsstatussbuttons demo_logosopts demo_scores demo_sleep(s_sargssdspysol.pysmOptDemoOptionss #csy#$|io $dSn%t|id|i}&|idjo |idjo'|i|ii _ndS(NsSet hint optionsi( s_s _cancelDragsHintOptionsDialogstopsappsdsstatussbuttons hint_sleepsopt(s_sargssdspysol.pysmOptHintOptions#s  #cs()|io )dSn*y+|iiWn6,tj o'}-t|i|.dd}n=X0t |idt d1dd|ii i 2dd}dS(NstextsError while saving optionsstitles InfosOptions were saved to sbitmapsinfo( s_s _cancelDragsapps saveOptionss ExceptionsexsMfxExceptionDialogstopsds MfxDialogsPACKAGEsfnsopt(s_sargssexsdspysol.pysmOptSave(s cs834|io 4dSn5t|idddS(Ns index.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargsspysol.pysmHelp3s cs867|io 7dSn8t|idddS(Nshowtoplay.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargsspysol.pysmHelpHowToPlay6s cs~9:|io :dSn;|ii o <dSn=tiidd}>t|i |i i |i i |dS(Nshtmlsrules( s_s _cancelDrags menustatesrulessosspathsjoinsdirshelpHTMLsappsgetGameRulesFilenamesgamesid(s_sargssdirspysol.pys mHelpRules9s   cs8?@|io @dSnAt|idddS(Ns license.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargsspysol.pys mHelpLicense?s cs8BC|io CdSnDt|idddS(Ns news.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargsspysol.pys mHelpNewsBs csEFttdS(N(sopenURLs PACKAGE_URL(s_sargsspysol.pys mHelpWebSiteEscs^GH|io HdSnI|iotd@oJt|inLt|idS(Ni(s_s _cancelDragsappsbundleshelpAboutSimples helpAbout(s_sargsspysol.pys mHelpAboutGs  csMN|io NdSnOtii|iiid}Ptii | o QdSnRtii||ii |i i }Sd}TxgTdo\U|d|}Vtii| oWPnX|d}Y|djo ZdSnqW[|ii|dS(Ns screenshotsis-%d.ppmi'(s_s _cancelDragsosspathsjoinsappsdnsconfigsfsisdirsgetGameSaveNamesgamesidsisfnsisfilestops screenshot(s_sargssfsisfnspysol.pys mScreenshotMs  ! *   cs\]|io ]dSn^|iio|iiidjo|_|iii`do |iioNa|iii}b|ii i |}c|oddG|i GHnnndS(Niisplaying music:(s_s _cancelDragsappsaudiosoptssound_music_volumes playNextMusicsdebugs getMusicInfosindexs music_managersgetsmusicsfilename(s_sargssindexsmusicspysol.pysmPlayNextMusic\s & (Qs__init__s connectGamesupdateRecentGamesMenusupdateBookmarkMenuStatesupdateBackgroundImagesMenus _finishDrags _cancelDragschangeds setMenuStatessetToolbarStates_clearMenuStates_updateMenuStates _updateMenuss updateMenuss disableMenussmNewGamesNones _mSelectGames mSelectGamesmSelectGamePopulars_mNewGameBySeedsmNewGameWithNextIdsmSelectGameByIdsmSelectRandomGames_mSelectNextGameFromListsmSelectNextGameByIdsmSelectPrevGameByIdsmSelectNextGameByNamesmSelectPrevGameByNamesmSaves mHoldAndQuitsmQuitsmUndosmRedosmRedoAlls mSetBookmarks mGotoBookmarksmClearBookmarkssmRestartsmDealsmDropsmDrop1smStatussmEditGameComments _mStatsSaves mPlayerStatssmHintsmHint1smHighlightPilessmDemos mMixedDemos_mDemosmOptPlayerOptionssmOptAutoFaceUps mOptAutoDrops mOptAutoDeals mOptQuickPlaysmOptEnableUndosmOptEnableBookmarkssmOptEnableHintsmOptEnableHighlightPilessmOptEnableHighlightCardssmOptEnableHighlightSameRanks mOptSoundsmOptSoundDialogsmOptAnimationss mOptShadows mOptShadesmOptIrregularPilessmOptDemoOptionssmOptHintOptionssmOptSavesmHelpsmHelpHowToPlays mHelpRuless mHelpLicenses mHelpNewss mHelpWebSites mHelpAbouts mScreenshotsmPlayNextMusic(spysol.pysPysolMenubarActions s .           %                            ?                                sPysolToolbarActionscsefdZidZldZndZrdZvdZzdZ~dZd Zd Z d Z d Z d Z dZ dZRS(Ncsfgt|_ht|_dS(N(sNones_sgamesmenubar(s_spysol.pys__init__fs csij||_k||_dS(N(sgames_smenubar(s_sgamesmenubarspysol.pys connectGameis cslmtdS(N(sSubclassResponsibility(s_spysol.pys_busylscs3no|i op|iinqdSdS(Ni(s_s_busysmenubarsmNewGame(s_sargsspysol.pysmNewGamenscs3rs|i ot|iinudSdS(Ni(s_s_busysmenubarsmOpen(s_sargsspysol.pysmOpenrscs3vw|i ox|iinydSdS(Ni(s_s_busysmenubarsmRestart(s_sargsspysol.pysmRestartvscs3z{|i o||iin}dSdS(Ni(s_s_busysmenubarsmSaveAs(s_sargsspysol.pysmSavezscs3~|i o|iindSdS(Ni(s_s_busysmenubarsmUndo(s_sargsspysol.pysmUndo~scs3|i o|iindSdS(Ni(s_s_busysmenubarsmRedo(s_sargsspysol.pysmRedoscs3|i o|iindSdS(Ni(s_s_busysmenubarsmDrop(s_sargsspysol.pysmDropscs3|i o|iindSdS(Ni(s_s_busysmenubarsmStatus(s_sargsspysol.pysmStatusscs3|i o|iindSdS(Ni(s_s_busysmenubars mPlayerStats(s_sargsspysol.pys mPlayerStatsscs3|i o|iindSdS(Ni(s_s_busysmenubars mHelpRules(s_sargsspysol.pys mHelpRulesscs3|i o|iindSdS(Ni(s_s_busysmenubarsmQuit(s_sargsspysol.pysmQuitscs3|i o|iindSdS(Ni(s_s_busysmenubarsmOptPlayerOptions(s_sargsspysol.pysmOptPlayerOptionss(s__init__s connectGames_busysmNewGamesmOpensmRestartsmSavesmUndosmRedosmDropsmStatuss mPlayerStatss mHelpRulessmQuitsmOptPlayerOptions(spysol.pysPysolToolbarActionses              s _MfxToolbarcsddZdZdZdeiedZdddZddZd Z d Z d Z RS( Ncsd}||_t|_|i|d |_g|_g|_d|_ t i |idddd|_ t i |i dddd|_|i|i idt idt idS(Niisbdshighlightthicknessssidesfill(sreliefstops_sNones button_bgs_MfxToolbar__setReliefssides _tooltipss_widgetss _icon_heightsTkintersCanvasscanvassFramesframes _initFramespacksTOPsX(s_stopsreliefspysol.pys__init__s       $$ icst|tijotitif|}n0|titifjon ti}||_|tijoti|_ nti|_ |SdS(N( stypesreliefstypessIntTypesTkintersRAISEDsFLATs_s button_reliefsseparator_relief(s_sreliefspysol.pys __setReliefs  cs)|iidtidtidS(Nssidesfill(s_sframespacksTkintersTOPsX(s_spysol.pys _initFramescs)|tjo|i}n|tijp |djoFti|iddd|ddddd|}d}nqt |i pdd d }ti|id d dd dd d|ddd|}|d d }|id|d||ii|dS(Nishighlightthicknessiswidthsheights takefocussreliefi&iisbdiissidespadx(sreliefsNones_sseparator_reliefsTkintersFLATswidthsFramesframessepspadxsmaxs _icon_heightsheightspackssides_widgetssappend(s_swidthssidesreliefssepspadxsheightspysol.pys_createSeparators   i cs5|i|jo dSn|o|iidn| oXdoto|iiddn*|iid|iiddnzdoto|iiddn|iidt t i t i f|}|iid|d t i||_dSdS( Nissstateshiddensheightsnormalissidesfill(s_ssidesresizestops wm_geometrys TK_DASH_PATCHscanvassconfigspack_propagatesNonesTkintersTOPsBOTTOMssspacksX(s_ssidesresizessspysol.pysshows     cs|id|dS(Ni(s_sshowsresize(s_sresizespysol.pyshidescs|iSdS(N(s_sside(s_spysol.pysgetSidescsx1|idr!}|o|inqWg|_x1|idr!}|o|inqUWg|_dS(Ni(s_s _tooltipsswsdestroys_widgets(s_swspysol.pysdestroys     cs>|io*|iid||iindS(Nscursor(s_ssidesframesconfigscursorsupdate_idletasks(s_scursorspysol.pys setCursors ( s__init__s_MfxToolbar__setReliefs _initFramesTkintersLEFTsNones_createSeparatorsshowshidesgetSidesdestroys setCursor(spysol.pys _MfxToolbars   s PysolToolbarcsddZdZdZdedZ-dZ7deiedZAd Z Gd Z \d Z ^d Z bd Z {dZ~dZdZRS(Ncs ti|||ti|||_||_|id|i dd|id|i dd|i |id|i dd|id|i dd |i |id |idd |id |idd |id|idd|i |id|idd|id|idd|i |id|idd|i dddti|iddddd|iid|it|_|iid|i|iid|idS(NsnewstooltipsNew gamesrestartsRestart the current gamesopensOpen a saved gamessaves Save gamesundosUndo last movesredosRedo last movesautodropsAuto drop cardssstatssView statisticssrulessRules for this gamesquits Quit PySolswidthisreliefsplayerspadxisPlayer optionss<1>s<3>(s _MfxToolbars__init__s_stopsreliefsPysolToolbarActionssdirssizes _createButtonsmNewGamesmRestarts_createSeparatorsmOpensmSavesmUndosmRedosmDrops mPlayerStatss mHelpRulessmQuitsTkintersFLATs _createLabels player_labelsbindsmOptPlayerOptionssNonespopupsframes clickHandlersrightclickHandler(s_stopsdirssizesreliefspysol.pys__init__s0       icsdp tidjo |iidddti |iidtidti dd  |i d d dti dti  |i d d dti dti n)|iidtidti dddS( Nisntsbdisreliefssidesfillsipadyiswidth(sossnames_sframesconfigsTkintersSOLIDspacksTOPsXs_createSeparatorsLEFTsFLATsRIGHT(s_spysol.pys _initFrames (%)cstii|i|}t}xet drX}tii|i||}tii |ot i d|}Pnq3W|SdS(Nisfile(sosspathsjoins_sdirsnamesfilesNonesimagesIMAGE_EXTENSIONSsextsisfilesTkinters PhotoImage(s_snamesfilesimagesextspysol.pys _loadImages   cs|i|}ti|id|ddd|i}||_ |o@|i d||i djo |i |_ nn!|itijoD"|itjo#|i|d|_n$|i|dt|}?|ii |@|i|ndS( Nii,isreliefsridgesjustifyscentersaspectssidespadxs_label(s_ssizesaspectsTkintersMessagesframeslabelspackssidespadxssetattrsnames_widgetssappendstooltips MfxTooltipsbs _tooltipsssetText(s_snamespadxssidestooltipsaspectslabelsbspysol.pys _createLabel7s' csgAB|i p|i p|i o CdSnD|iioE|iinF|iiSdS(Ni(s_ssidesgamesmenubarsdemosstopDemosbusy(s_spysol.pys_busyAs $ c sGHti|||I|io0J|iiKt|iLt|_nM|orN|i }Ot i |i dd|_P|ii dddt iQ|iiddd|iddd |id dR|iidd d|idd d |id dS|iidd d|iddd |id dTd o|U|iiV|iiddd|iddd |id dW|iiddd|idd d |id dnXndS(NstearoffislabelsToolbarsstatesHidesvariablesvaluescommands underlinesTopisBottomis Small iconss Large icons(sPysolToolbarActionss connectGames_sgamesmenubarspopupsdestroysdestructsNonestkoptsTkintersMenuscanvass add_commandsDISABLEDsadd_radiobuttonstoolbars mOptToolbars add_separators toolbar_sizesmOptToolbarSize(s_sgamesmenubarstkoptspysol.pys connectGameGs"   444 48cs \]dS(N((s_sreliefspysol.pys setRelief\sc sS^_xF|id_r3}`t||d}at|||ddo tidjo?n@tt i ||f|A|t jo B|}nC|id|d|d|dS(Nsnameisposixsmenuslabels underline(s_s labeltonameslabelsnameslabel_underlines kwdefaultskwsossapplys MfxMenubars__init__smasters underlinesNones add_cascade(s_smasterslabels underlineskwsnameslabel_underlinespysol.pys__init__;s (sNones__init__(spysol.pysMfxMenu:ss PysolMenubarcs"DEdZQdZTdZXdZdZdZ)dZ-dZ@d ZQd Z [d Z cd Z md Z odZ vdZdZdZdZdZdZedjo dZn dZeddefddffZdZdZdZdZ dZ d Zd!Zd"Zd#Zd$Z  d%Z!,d&Z"2d'Z#5d(Z$8d)Z%;d*Z&Bd+Z'Hd,Z(Pd-Z)RS(.NcsEFti|||G|ii}Hd|_I|djoId|_nJ|djoJd|_nKt|_ Lh|_ Mh|_ N|i O|i P|iid|i dS(NiiXiii#smenu(sPysolMenubarActionss__init__s_sappstopswinfo_screenheightsshs_PysolMenubar__cb_maxsNones_PysolMenubar__menubars_PysolMenubar__menupaths_PysolMenubar__keybindingss_createMenubarsupdateBackgroundImagesMenusconfig(s_sappstopsshspysol.pys__init__Es      cs;QR|ii| oS|||f|i||i|id d?d|d@|id dAd|dBt|d dC}|id d;d|dD|id d=d|dE|i dF}|id dGd|i-ddHt%d1jo&|id dId|i.ddJn#|id dKd|i.ddJ|i|id dLd|i/d|d3|id dMd|i0|i dN}|id dOd|i1t%d1jot|d dP}|i)d dQd9|i*i2d|i3|i)d dRd9|i*i4d|i5|i)d dSd9|i*i6d|i7|i)d dTd9|i*i8d|i9nt|d dU}|i)d dVd9|i*i:d|i;|i)d d4d9|i*i<d|i=|i)d dWd9|i*i>d|i?|i|i)d dXd9|i*i@d|iAt|d dP}|i)d dQd9|i*i2d|i3|i)d dRd9|i*i4d|i5|i)d dSd9|i*i6d|i7|i)d dYd9|i*i8d|i9|i)d dZd9|i*iBd|iC|i)d d[d9|i*iDd|iE|i|iFiGiHtIjo5|i)d d\d9|i*iJd|iKd]tLiMn_tNo,|i)d d^d9|i*iJd|iOn)|i)d d\d9|i*iJd|iK|iFiP}|iR} t%d1joW|id d_d|iTdd`t|d da}|id dbd|iUnT|id dcd|iTdd`t|d dd}|id ded|iUt|d df}|iVd dgd9|i*iWdhd'd|iX|iVd did9|i*iWdhdjd|iX|iVd dkd9|i*iWdhdd|iX|iVd dld9|i*iWdhdmd|iX|iVd dnd9|i*iWdhdod|iXt%d1joT|i)d dpd9|i*iYd|iZ|i)d dqd9|i*i[d|i\n|i|id drd|i]|id dsd|i^|it|d dt}|iVd dud9|i*i_dhd'd|i`|iVd dvd9|i*i_dhdd|i`|iVd dwd9|i*i_dhdjd|i`|i|iVd dxd9|i*iadhd'd|ib|iVd dyd9|i*iadhdd|ib|i)d dzd9|i*icd|id|i d{}|id d|d|ied|d}|id d~d|if|id dd|igdd}thdo@d'jo<|id dd|ii|id dd|ijn|i|id dt%dd|iktIt_d} |imdd|i|imdd|in|imdd|io|im| d|i|im| d|i|im| d|ip|im| d|i|im| d|i|im| d|i|imdd|i|imdd|i|imdd|i|im| d|i$|imdd|i&|imdd|i(|im| d|iq|imdd|i-|im| d|ir|imdd|i.|im| d|i/|imdd|iT|im| d|is|im| d|it|im| d|i1|im| d}|ie|imdd}|ig|imdd|iu|im| d|iv|imdd|i'|im| d|iw|imdd|i|imdd|i&|imdd|i'|im| d|iw|imdd|i|imdd|i&xBtd&d'r/}|im| tx|d||dq]W do |iFiyo |im| d|iv |im| d|iz |im| d|i{ |im| d|i||im| d|i}ndS(Nsmenubarsnameisposixsgroovesreliefsactiveborderwidths sCtrl-smacsCmd-s&Fileslabels &New gamescommands acceleratorsNs R&ecent gamessSelect &random gamesRsSelect game by nu&mber...sMs&Open...sOs&SavesSs Save &as...s&Hold and quits&QuitsQs&Selects&Edits&UndosZs&Redos Redo &alls &Set bookmarki is Bookmark %dcsy|i|S(N(s_s mSetBookmarksi(s_sispysol.pysyssGo&to bookmarks%dcs~|i|S(N(s_s mGotoBookmarksi(s_sispysol.pys~ss&Clear bookmarkss Restart &gamesGs&GamesPyJonggs &Deal cardssDs &Auto dropsAs S&tatus...sTs &Comments...svariables &StatisticssCurrent game...cs|iddS(Nsmodeie(s_s mPlayerStats(s_spysol.pysss All games...cs|iddS(Nsmodeif(s_s mPlayerStats(s_spysol.pysssSession log...cs|iddS(Nsmodeih(s_s mPlayerStats(s_spysol.pysss Full log...cs|iddS(Nsmodeig(s_s mPlayerStats(s_spysol.pysssDemo statisticscs|iddS(NsmodeiM(s_s mPlayerStats(s_spysol.pysscs|iddS(NsmodeiN(s_s mPlayerStats(s_spysol.pysss&Assists&HintsHsHighlight t&ilessIsHighlight p&iless&DemosDemo (&all games)s&Optionss&Player options...s Assist &levels Enable &undosEnable &bookmarkss Enable &hintsEnable highlight t&iless&Automatic plays Auto &face ups Auto &deals &Quick playsEnable highlight p&ilessEnable highlight &cardssEnable highlight same &ranks&Soundsstates &Sound...s Tiles&et...sEs Tile &bordersTable b&ackground...s Cards&et...sCard &backgroundsTable t&ile...s A&nimationss&Nonesvalues &Timer basedis&Fasts&Slowis &Very slowis Card shado&wsShade &legal movess&Hint options...s&Demo options...s&Toolbars&Hides&Tops&Bottoms &Small iconss &Large iconss Stat&usbars&Helps &ContentssF1s &How to plays&Rules for this games&License termss What's &new ?s&About s...sControl-ssnsgsvsrsmsosssqszs BackSpacesspacestshsisdsesbspsPrintsusaslsksjcs|i|ddS(Nsconfirmi(s_s mGotoBookmarksi(sevents_sispysol.pysssEndsPriorsNextsUpsDown(~s_s_addPaths MfxMenubarsaddPathskwsossnamesapplystops_PysolMenubar__menubarsbinds_keyPressHandlersms _createMenusmenus add_commandsmNewGamesMfxMenussubmenusmSelectRandomGamesmSelectGameByIds add_separatorsmOpensmSavesmSaveAss mHoldAndQuitsmQuits_addSelectGameMenusmUndosmRedosmRedoAllsrangesislabelsaccsmClearBookmarkssmRestartsPACKAGEsmDealsmDropsmStatussadd_checkbuttonstkoptscommentsmEditGameCommentsmHintsmHighlightPilessmDemos mMixedDemosmOptPlayerOptionssundosmOptEnableUndos bookmarkssmOptEnableBookmarksshintsmOptEnableHintshighlight_pilessmOptEnableHighlightPiless autofaceupsmOptAutoFaceUpsautodrops mOptAutoDropsautodeals mOptAutoDeals quickplays mOptQuickPlayshighlight_cardssmOptEnableHighlightCardsshighlight_sameranksmOptEnableHighlightSameRanksappsaudiosaudiodevsNonessounds mOptSoundsTkintersDISABLEDspysolsoundserversmOptSoundDialogscardset_managersmanagerslensnsmSelectCardsetDialogsmSelectTileDialogsadd_radiobuttons animationssmOptAnimationssshadows mOptShadowsshades mOptShadesmOptHintOptionssmOptDemoOptionsstoolbars mOptToolbars toolbar_sizesmOptToolbarSizes statusbars mOptStatusbarsmHelpsmHelpHowToPlays mHelpRulessbundles mHelpLicenses mHelpNewss mHelpAboutsctrls_bindKeysmSelectGameDialogsmSelectGameDialogWithPreviewsmNewGameWithNextIds mPlayerStatssmHint1smOptChangeCardbacksmOptChangeTableTiles mScreenshotsmPlayNextMusicsmDrop1sstrsdebugsmSelectPrevGameByNamesmSelectNextGameByNamesmSelectPrevGameByIdsmSelectNextGameById( s_skwsmsmenussubmenusislabelsaccsmanagersnsctrlspysol.pys_createMenubarXsl   "&& && &""  & , &"""(  "&" &(((,((( ((((((( 5 ,(" ".....(,  ... ..(&"  $   -cs do| ot|djo=||iti|<||iti|<dSnd|d|d}yt |i ||t|djo|ti|joEti|}d|d|d}t |i ||nWn nXdS(Niis( smodifierslenskeysfuncs_s_PysolMenubar__keybindingssstringslowersupperssequencesbindstop(s_smodifierskeysfuncssequencespysol.pys_bindKeys% ,cst}|o|io |iio3!|io""|i|ii_#t}nn$|i i |i}%|o|i d@djo&||'t}nn(|SdS(Nii( sEVENT_PROPAGATEsrsevents_sgamesdemoscharskeypresss EVENT_HANDLEDs_PysolMenubar__keybindingssgetsfuncsstate(s_seventsrsfuncspysol.pys_keyPressHandlers   cs9)*d}+t|i|d|dd },|SdS(Nistearoffs underlinei(stearoffsMfxMenus_s_PysolMenubar__menubarslabelsmenu(s_slabelstearoffsmenuspysol.pys _createMenu)s "cs-.t|iii|iii}/t|}0|i ddd|i dd1|i ddd|i dd2|i 3dd f}4|i|||f5|i|ii6td jo:7|i 8|i|||i|ii9dSn:t|dd };|i||ti<|i|ii=|i >|i||ti?|i|iidS( Nslabels All &games...scommands acceleratorsGsPlayable pre&view...sVs&Popular gamescs3|iiti@S(N(sgissis game_flagssGIs GT_POPULAR(sgispysol.pys3ssPyJonggs&Special games(smaps_sappsgdbsgetsgetGamesIdSortedByShortNamesgamesstuplesmenus add_commandsmSelectGameDialogsmSelectGameDialogWithPreviews add_separatorsdatas_addSelectGameSubMenusmSelectGamePopularstkoptsgameid_popularsPACKAGEs_addSelectMahjonggGameSubMenus mSelectGamesgameidsMfxMenussubmenusGIsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_GAME_BY_TYPE(s_smenusgamessdatassubmenuspysol.pys_addSelectGameMenu-s$'""  "  c s@Ad}Bx|dBr\}}C|tjoDd}EqnFt||} G| o HqnI|oJ|i Kd}nLt |d|} Mdo |djoNnP|i | | ||qWdS(Niislabels Mahjongg type(sneed_seps select_dataslabels select_funcsNonesfiltersgamessgsmenus add_separatorsMfxMenussubmenus_s_addSelectGameSubSubMenuscommandsvariable( s_smenusgamess select_datascommandsvariablesneed_sepslabels select_funcsgssubmenuspysol.pys_addSelectGameSubMenu@s          c sQRxddddddfdRr}St|d|dd |}T| o Uq!nV|d}W|d|djoX|dd |d}nYt|d |}Z|i ||||q!WdS( NsACsDFsGKsLRsSTsUZiics%S||idjo |jnS(Ni(sc0sgis short_namesc1(sgisc0sc1spysol.pysSss - slabel( scsfiltersgsggslabelsMfxMenusmenussubmenus_s_addSelectGameSubSubMenuscommandsvariable( s_smenusgscommandsvariablescsggslabelssubmenuspysol.pys_addSelectMahjonggGameSubMenuQs #   c s[\d|ift|ddj}]xtt|d]rj}^||}_|djo||dj}`|i d|d|ad|bd|i d|iqAWdS( Niiiscommandsvariables columnbreaksvalueslabel(s_s_PysolMenubar__cb_maxslensgscbsrangesisgis columnbreaksmenusadd_radiobuttonscommandsvariablesids short_name( s_smenusgscommandsvariablescbsisgis columnbreakspysol.pys_addSelectGameSubSubMenu[s&    cscd|idjo#|idjo|i|iijohe|iii|if|ii i|igj|ii k|ii |id|i nlt SdS(Nisrandom(sdsstatussbuttonsgameids_sgamesidstkoptssetsgameid_popularsendGamesquitGamesrandoms EVENT_HANDLED(s_sdspysol.pys_mSelectGameDialogcs9#cs#mn|iid|iidS(Nscursor(s_sgames setCursorsapps top_cursor(s_seventspysol.pys__restoreCursormscsop|io pdSnq|iidtrt|i|ist|iddtd|i d|ii }u|i |SdS(Nscursorstitles Select gamesappsgameid( s_s _cancelDragsgames setCursors CURSOR_WATCHs after_idlestops_PysolMenubar__restoreCursorsSelectGameDialogsappsidsds_mSelectGameDialog(s_seventsdspysol.pysmSelectGameDialogos c svw|io wdSnx|iidtyt}z~t|i|i t |iddd|i d|ii d|}|i|SdS(Nscursorstitles Select gamesappsgameidsbookmark(s_s _cancelDragsgames setCursors CURSOR_WATCHsNonesbookmarks after_idlestops_PysolMenubar__restoreCursorsSelectGameDialogWithPreviewsappsidsds_mSelectGameDialog(s_seventsbookmarksdspysol.pysmSelectGameDialogWithPreviewvs  c s|idd}|iddd|ift|ddj}d}x|dr}|i i |}| o qen|djo||dj}|id|id|iid |d |i d |i|d }qeWdS( Ns.menubar.file.recentgamesiislastiiscommandsvariables columnbreaksvalueslabeli(s_s_PysolMenubar__menupathssubmenusdeletes_PysolMenubar__cb_maxslensgameidsscbsisidsapps getGameInfosgis columnbreaksadd_radiobuttons mSelectGamestkoptsgameids short_name(s_sgameidsssubmenuscbsisidsgis columnbreakspysol.pysupdateRecentGamesMenus&      c s|i}|iid}|iid}|iid}|tjp|tjp |tjo dSn|i i i o |i i }|\}}}x5tddr"} |i| d||qW|i|d|||\}}}d} xmtddrZ} |i ii i| tj } |i| d|| o|| p| } q;W|i|d|| o||\}}}|i|d|| o|dS(Ns.menubar.edit.setbookmarks.menubar.edit.gotobookmarks.menubar.edit.clearbookmarksi isstate(s_s_getEnabledStatesstates_PysolMenubar__menupathsgetsmp1smp2smp3sNonesappsopts bookmarkssgamescanSetBookmarksxsmenusindexssubmenusrangesis entryconfigsmss gsaveinfoss( s_sstatesmp1smp2smp3sxsmenusindexssubmenusismsssspysol.pysupdateBookmarkMenuStates, * "    !##csJ|iid}tdjo |tjo|iid}n|d}|idd|ii i }t t it it|}xtt|dr}}|djo||dj}|id||id||id |iid |d |id |d dddqWdS(Ns.menubar.options.cardbackgroundsPyJonggs.menubar.options.tileborderiislastslabelsimagesvariablesvaluescommands columnbreaks indicatorons hidemargin(s_s_PysolMenubar__menupathsgetsmpsPACKAGEsNonessubmenusdeletesappsimagess getCardbackssmbackssintsmathsceilssqrtslenscbsrangesis columnbreaksadd_radiobuttonsnames menu_imagestkoptscardbacks mOptCardback(s_smpssubmenusmbacksscbsis columnbreakspysol.pysupdateBackgroundImagesMenus '  5csd|}|ii|}tdjo |tjo dSn|\}}}|i |}|i |d|dS(Ns .menubar.sPyJonggsstate(spaths_s_PysolMenubar__menupathsgetsmpsPACKAGEsNonesmenusindexssubmenus_getEnabledStatesstatesss entryconfig(s_sstatespathsmpsmenusindexssubmenussspysol.pys setMenuStates  csB|i|}t|ii|d}||d|io dSn|i|iiidS(N(s_s _cancelDrags_mOptTableTilestkopts tabletilesget(s_seventspysol.pys mOptTableTiles csx|io dSn|iii}|djo1|iiid|}|i |ndS(Nii( s_s _cancelDragsappstabletile_managerslensnstkopts tabletilesgetsis_mOptTableTile(s_seventsnsispysol.pysmOptChangeTableTiles  c s6 !|io !dSn"|ii}#|djo$ti|iii}n%t |i dd&d|id|ii d|}'|i djo|iddfjow(t|itijo)|i|inA*|idjo|i|iijo+|i|inndS(NistitlesSelect table backgroundsappsmanagerskeyi(s_s _cancelDragsappstabletile_indexskeysstringslowersopts tablecolorsSelectTileDialogWithPreviewstopstabletile_managersdsstatussbuttonstypestypess StringTypes_mOptTableColors_mOptTableTile(s_seventskeysdspysol.pysmSelectTileDialog s $))csv,-|io -dSn.tid|iii/dd}0|o|do1|i|dndS(Ns initialcolorstitlesSelect table colori( s_s _cancelDragstkColorChoosersaskcolorsappsopts tablecolorscs_mOptTableColor(s_seventscspysol.pysmOptTableColor,s  cs>23|io 3dSn4|i|iiidS(N(s_s _cancelDragssetToolbarSidestkoptstoolbarsget(s_seventspysol.pys mOptToolbar2s cs>56|io 6dSn7|i|iiidS(N(s_s _cancelDragssetToolbarSizestkopts toolbar_sizesget(s_seventspysol.pysmOptToolbarSize5s cs>89|io 9dSn:|i|iiidS(N(s_s _cancelDragssetToolbarReliefstkoptstoolbar_reliefsget(s_seventspysol.pysmOptToolbarRelief8s cs;<|io <dSn=|ii o =dSn>|iii}?||ii_@|iii|oA|i i ndS(N( s_s _cancelDragsapps statusbarstkoptsgetssidesoptsshowstopsupdate_idletasks(s_seventssidespysol.pys mOptStatusbar;s  cswBC|io CdSnD||ii_E|iii|F|iii|oG|i i ndS(N( s_s _cancelDragssidesappsoptstoolbarstkoptssetsshowstopsupdate_idletasks(s_ssidespysol.pyssetToolbarSideBs  csHI|io IdSnJ||ii_K|iii|L|ii|}M|ii i ||o3N|i i d|iiiO|iindS(Nsplayer(s_s _cancelDragssizesappsopts toolbar_sizestkoptssetsgetToolbarImagesDirsdirstoolbars updateImagessgames updateStatussplayerstopsupdate_idletasks(s_ssizesdirspysol.pyssetToolbarSizeHs csZPQ|io QdSnR||ii_S|iii|T|ii dS(N( s_s _cancelDragsreliefsappsoptstoolbar_reliefstkoptssetstopsupdate_idletasks(s_sreliefspysol.pyssetToolbarReliefPs  (*s__init__s_addPaths_getEnabledStates_createMenubars_bindKeys_keyPressHandlers _createMenus_addSelectGameMenus_addSelectGameSubMenus_addSelectMahjonggGameSubMenus_addSelectGameSubSubMenus_mSelectGameDialogs_PysolMenubar__restoreCursorsmSelectGameDialogsmSelectGameDialogWithPreviewsupdateRecentGamesMenusupdateBookmarkMenuStatesupdateBackgroundImagesMenus setMenuStatessetToolbarStatesPACKAGEsDEFAULTEXTENSIONs FILETYPESsmOpensmSaveAssmSelectCardsetDialogs _mOptCardbacks mOptCardbacksmOptChangeCardbacks_mOptTableTiles_mOptTableColors mOptTableTilesmOptChangeTableTilesmSelectTileDialogsmOptTableColors mOptToolbarsmOptToolbarSizesmOptToolbarReliefs mOptStatusbarssetToolbarSidessetToolbarSizessetToolbarRelief(spysol.pys PysolMenubarDsV               #                sMfxTreeBaseNodecskUVdZ`dZedZjeedZwdZdZdZdZRS( NcssVW||_X||_Y||_Z||_[d|_\t|_]t|_^t|_ _t|_ dS(Ni( strees_s parent_nodestextskeysselectedsNonessubnodess symbol_idstext_ids textrect_id(s_strees parent_nodestextskeyspysol.pys__init__Vs        csb`a|itj oHb|iii|ig}c|i|d||ii|iddZdZeedZdZRS(Ncs/ti|||||||_dS(N(sMfxTreeBaseNodes__init__s_strees parent_nodestextskeysexpanded(s_strees parent_nodestextskeysexpandedspysol.pys__init__sic s|ii||_||f\}}||f\}}xL|idr<} |i| _| i ||||\}}}}qTW|ioR|ii} |iii||| id||d| id| in|SdS(Niisstipplesfill(s_strees getContentsssubnodesslastxslastyslxslysxsysnxsnysnodesdrawsstylescanvass create_linesdistys linestyles linecolor( s_sxsyslastxslastyslxslysnxsnysnodesstylespysol.pys drawChildrens + &csti|||||\}}}}|i o|i i } || i| id} |} || i| id} || id} |i| | | | }n||||fSdS(Ni(sMfxTreeBaseNodesdraws_sxsysilastxsilastyslxslysnxsnysexpandedstreesstylesdistxswidthschildxschildysclastxsheightsclastys drawChildren(s_sxsysilastxsilastyslxslysnxsnysstyleschildxschildysclastxsclastyspysol.pysdraws*  c sl|id}|tjo'|io d}n d}nti|||d|dS(Nscolorsredspink( skwsgetscolorsNones_sexpandedsMfxTreeBaseNodes drawSymbolsxsy(s_sxsyskwscolorspysol.pys drawSymbols    (s__init__s drawChildrensNonesdraws drawSymbol(spysol.pys MfxTreeNodes  sMfxTreeInCanvascsdfdYZdZdZedZdZdZdZ d Z ed Z ed Z d Z d Z RS(NsStylecsdZRS(Ncsd|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ t d|_ d|_ d|_tid jod |_ d|_ndS( Niiisblackswhites#00008bs tree_smallsgray50snts(s_sdistxsdistyswidthsheightsoriginxsoriginystext_normal_fgstext_normal_bgstext_selected_fgstext_selected_bgsgetFontsfonts linestyles linecolorsossname(s_spysol.pys__init__s              (s__init__(spysol.pysStylesc s|idp |id}|d<tti||f|||_ |i |i |t |_ h|_ h|_|i|_|iid|i_||i_t|id|it|id|i|idtidddS(Nsbgsinsertbackgroundsssfillsexpandi(skwsgetsparentscgetsbgsapplysMfxScrolledCanvass__init__s_s rootnodessupdateNodesWithTreesNones selection_keysnodesskeyssStylesstylescanvasstext_normal_fgstext_normal_bgsbinds singleClicks doubleClickspacksTkintersBOTH(s_sparents rootnodesskwsbgspysol.pys__init__s*    csNx1|ii|igdr}d|_q!Wti|dS(Ni(s_skeyssgets selection_keysnodesselectedsMfxScrolledCanvassdestroy(s_snodespysol.pysdestroys csK|iiti}|o|ii|dSntSdS(Ni( s_scanvass find_withtagsTkintersCURRENTsidsnodessgetsNone(s_seventsidspysol.pysfindNodes cs"|ii|iif\}}||ii}||iid}xo|idr_}||_ y+|i ||t t \}}}}Wntij o nXq]W|iid}|iiddd|d|df|iid|iidS(Niisalls scrollregionisyscrollincrement(s_sstylesoriginxsoriginysnxsnysdistxsheights rootnodessnodestreesdrawsNoneslxslysTkintersTclErrorscanvassbboxsconfigsdisty(s_snxsnysnodeslxslysbboxspysol.pysdraws!  + *cs2h|_h|_|iiddS(Nsall(s_snodesskeysscanvassdelete(s_spysol.pysclears  cst|id}d|id<|ii|i|i|i|i ||id}|i o*d|_|i |i nqW||_dS(Nii( s_skeyssgets selection_keysl1skeysl2snodesselecteds updateSymbols updateText(s_skeysl1sl2snodespysol.pysupdateSelections      csSxF|dr9} ||_!|io"|i|i|nqWdS(Ni(snodessnodestreessubnodess_supdateNodesWithTree(s_snodesstreesnodespysol.pysupdateNodesWithTrees    ( sStyles__init__sdestroysNonesfindNodesdrawsclearsredraws getContentss singleClicks doubleClicksupdateSelectionsupdateNodesWithTree(spysol.pysMfxTreeInCanvass      sSelectDialogTreeLeafcs#$dZRS(Nc s$%|iii|i|j oa&|iii||'d|ii i d|i t jdd|_(||ii|iddf|_?|itjoX@tddddtddddtddddtdddd ft_ndS( Nf0.0f1.0sditherisdatas  R0lGODlhEAAOAPIFAAAAAICAgMDAwP//AP///4AAAAAAAAAAACH5BAEAAAUALAAAAAAQAA4AAAOL WLrcGxA6FoYYYoRZwhCDMAhDFCkBoa6sGgBFQAzCIAzCIAzCEACFAEEwEAwEA8FAMBAEAIUAYSAY CAaCgWAgGAQAhQBBMBAMBAPBQDAQBACFAGEgGAgGgoFgIBgEAAUBBAIDAgMCAwIDAgMCAQAFAQQD AgMCAwIDAgMCAwEABSaiogAKAKeoqakFCQA7s R0lGODlhEAAOAPIFAAAAAICAgMDAwP//AP///4AAAAAAAAAAACH5BAEAAAUALAAAAAAQAA4AAAN3 WLrcHBA6Foi1YZZAxBCDQESREhCDMAiDcFkBUASEMAiDMAiDMAgBAGlIGgQAgZeSEAAIAoAAQTAQ DAQDwUAwAEAAhQBBMBAMBAPBQBAABACFAGEgGAgGgoFgIAAEAAoBBAMCAwIDAgMCAwEAAApERI4L jpWWlgkAOw==s R0lGODdhEAAOAPIAAAAAAAAAgICAgMDAwP///wAAAAAAAAAAACwAAAAAEAAOAAADTii63DowyiiA GCHrnQUQAxcQAAEQgAAIg+MCwkDMdD0LgDDUQG8LAMGg1gPYBADBgFbs1QQAwYDWBNQEAMHABrAR BADBwOsVAFzoqlqdAAA7s R0lGODdhEAAOAPIAAAAAAAAAgICAgMDAwP8AAP///wAAAAAAACwAAAAAEAAOAAADVCi63DowyiiA GCHrnQUQAxcUQAEUgAAIg+MCwlDMdD0LgDDQBE3UAoBgUCMUCDYBQDCwEWwFAUAwqBEKBJsAIBjQ CDRCTQAQDKBQAcDFBrjf8Lg7AQA7(s_s tree_xviews tree_yviewsimgsNones makeImagesSelectDialogTreeData(s_spysol.pys__init__<s(sNonesimgs__init__(spysol.pysSelectDialogTreeData:s sSelectDialogTreeCanvascsXOPed d dddZodZtdZvedZedZRS( Nc sPR||_S||_Td|_Ud|_Vd} W|djo Xd}nY|djomZd| }[|o|i djo\d| }n]|o|i djo^d| }nn_|| |_ `t i |||i iad |d |bd |d | cd|i_d| |i_ed|i_fd |i_g|oh||i_ni|ij|i|k|io!l|ii|i idnm|io!n|ii|i idndS(NiiiiiXii iswidthsheightshbarsvbari(sdialogs_sdefaults n_selectionss n_expansionssdistyswidthsheightsparentswinfo_screenheightslinessMfxTreeInCanvass__init__sdatas rootnodesshbarsvbarsstylesdistxsfontsdrawsupdateSelectionskeyscanvass xview_movetos tree_xviews yview_movetos tree_yview( s_sdialogsparentskeysdefaultsfontswidthsheightshbarsvbarsdistyspysol.pys__init__Ps:          ! iiics^op|idjo4q|ii|i_r|ii|i_nsti |dS(Ni( s_s n_expansionsscanvassxviewsdatas tree_xviewsyviews tree_yviewsMfxTreeInCanvassdestroy(s_spysol.pysdestroyoscstu|iSdS(N(snodes getContents(s_snodespysol.pys getContentstscsvw|i}xt|toy|i o |itj oz|id}{d|id<||ii }|i d|_ ~|i |i|i i|i||id|iidddtiddd|id|idS(Nssidesrightsfillsexpandispadxspady(s_sframespacksTkintersBOTHskwspadxspady(s_skwspysol.pyspackscs|ii|i}|idjoP|ii|i o3|ii d|i |ii |i nn0|ii d|ii|ii t|i|dS(Nisbg(sappstabletile_managersgetstabletile_indexstilesindexs_scanvasssetTilesfilenamesconfigstop_bgs setTextColors text_colorsopts tablecolorsNonespackskw(s_sappskwstilespysol.pyssetups(s createCanvasspackssetup(spysol.pysSelectDialogPreviewCanvass  sSelectGameLeafcsRS(N((spysol.pysSelectGameLeafssSelectGameNodecsdZRS(Ncsg}t|itoix_|idrO\}}|o|o2t|i||d|}|i |nq1Wnuxn|ii i drX}|o |i|o8t|i||id|i}|i |nqW|p |ii iSdS(Niskey(scontentss isinstances_s select_funcsUserListsidsnamesSelectGameLeafstreesnodesappendsdatas all_games_gisgisno_games(s_scontentssidsnamesnodesgispysol.pys _getContentss  $(s _getContents(spysol.pysSelectGameNodessSelectGameDatacsdZRS(Ncs"ti|t|ii|ii|_t t t dt g|_ t }}}}g}xtitititifdr}g}x{|drn\} } | t jpt| |i o qntidd| } |itt | | qW|i|qWdo|do,tt dt|ddd}ndo|do&tt dt|d}ndo|d o&tt d t|d }ndo|d ont gf\} }xuti!dre\} } | d } | t jpt| |i o q5n|itt | | q5Wdo|o"tt d t|} nt gf\} }xti$drr\} } | d} | t jpt| |i o qnd| } |itt | | qWdo|o t%djo"tt dt|} nt&t'|ii(}t*t tt ddddtt d|tt dddd||tt dtt dtt ddtt ddtt ddtt dd tt d!d"tt d#d$tt d%d&tt d'd(ftt d)tt d*d+tt d,d-tt d.d/tt d0d1ftt d2tt d3d4tt d5d6tt d7d8tt d9d:tt d;d<tt d'd=f| f| tt d>tt d?d@tt dAdBtt dCdDtt dEdFtt dGdHf||f |_+dS(INs (no games)is&sis by Game Typesexpandeds Special GamesisOriginal Gamesics|i|jS(N(sgisidsgames(sgisgamesspysol.pysssby Compatibilitycs|i|jS(N(sgisidsgames(sgisgamesspysol.pysssNew games in vsPySolsby PySol versions All GamescsdS(Ni((sgispysol.pysssAlternate Namess Popular Gamescs|iiti@S(N(sgissis game_flagssGIs GT_POPULAR(sgispysol.pysssby Game Featuresby Number of Cardss32 cardscs|iidjS(Ni (sgissisncards(sgispysol.pysss48 cardscs|iidjS(Ni0(sgissisncards(sgispysol.pysss52 cardscs|iidjS(Ni4(sgissisncards(sgispysol.pysss64 cardscs|iidjS(Ni@(sgissisncards(sgispysol.pysss78 cardscs|iidjS(NiN(sgissisncards(sgispysol.pysss 104 cardscs|iidjS(Nih(sgissisncards(sgispysol.pysss 144 cardscs|iidjS(Ni(sgissisncards(sgispysol.pysss Other numbercs(|iidddddddfjS(Ni i0i4i@iNihi(sgissisncards(sgispysol.pysssby Number of Deckss 1 deck gamescs|iidjS(Ni(sgissisdecks(sgispysol.pysss 2 deck gamescs|iidjS(Ni(sgissisdecks(sgispysol.pysss 3 deck gamescs|iidjS(Ni(sgissisdecks(sgispysol.pysss 4 deck gamescs|iidjS(Ni(sgissisdecks(sgispysol.pysssby Number of Redealss No redealcs|iidjS(Ni(sgissisredeals(sgispysol.pysss1 redealcs|iidjS(Ni(sgissisredeals(sgispysol.pysss 2 redealscs|iidjS(Ni(sgissisredeals(sgispysol.pysss 3 redealscs|iidjS(Ni(sgissisredeals(sgispysol.pysssUnlimited redealscs|iid jS(Ni(sgissisredeals(sgispysol.pysscs#|iid ddddfjS(Niiii(sgissisredeals(sgispysol.pysssOther CategoriessGames for Children (very easy)cs|iiti@S(N(sgissis game_flagssGIs GT_CHILDREN(sgispysol.pysssGames with Scoringcs|iiti@S(N(sgissis game_flagssGIsGT_SCORE(sgispysol.pysssGames with Separate Deckscs|iiti@S(N(sgissis game_flagssGIsGT_SEPARATE_DECKS(sgispysol.pysssOpen Games (all cards visible)cs |iiti@S(N(sgissis game_flagssGIsGT_OPEN(sgispysol.pys ssRelaxed Variantscs |iiti@S(N(sgissis game_flagssGIs GT_RELAXED(sgispysol.pys s(,sSelectDialogTreeDatas__init__s_smapsappsgdbsgetsgetGamesIdSortedByNames all_games_gisSelectGameLeafsNonesno_gamess s_by_types s_specials s_originals s_contribsgsGIsSELECT_GAME_BY_TYPEsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_ORIGINAL_GAME_BY_TYPEsSELECT_CONTRIB_GAME_BY_TYPEsdatasggsnames select_funcsexistssressubsappendsSelectGameNodestupless_by_compatibilitysGAMES_BY_COMPATIBILITYsgamesss_by_pysol_versionsGAMES_BY_PYSOL_VERSIONsPACKAGEsUserListslists#getGamesTuplesSortedByAlternateNamesul_alternate_namessfilters rootnodes(s_sapps s_by_types s_specials s_originals s_contribsgsdatasggsnames select_funcss_by_compatibilitysgamesss_by_pysol_versionsul_alternate_namesspysol.pys__init__sb$ $   $  %$  $   (s__init__(spysol.pysSelectGameDatassSelectGameTreeWithPreviewcseZeZRS(N(sNonesdatas html_viewer(spysol.pysSelectGameTreeWithPreviews sSelectGameTreecsedZRS(Ncs|i|dS(N(s_s doubleClicksevent(s_seventspysol.pys singleClicks(sNones singleClick(spysol.pysSelectGameTreessSelectGameDialogcsPeZeZeZdZ)dZ2dZ7dZ RS(Nc sp|i|}ti||||i|i|i |\}}|i ||||_ ||_ t|_!|iitjo"|i||i_n#|iidd$|i||d|d|id|i|_%|iiidtiddd|id |i&|i||}'|ii}(|i!||i"dS( Niskeysdefaultsfontsfillsexpandispadxspady(#s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappsgameidsNonesrandomsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizes Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitlesappsgameidskws top_frames bottom_framesfocusspysol.pys__init__s"   04csw)*t|+dttdfdd,dddd-d t.d d d d /d d dd }1ti||SdS(NsstringssCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skwspysol.pysinitKw)s  csO23t|_4|ii|iit5|ii6ti|dS(N(sNones_sappstreesupdateNodesWithTrees rootnodessdestroys MfxDialog(s_spysol.pysdestroy2s cs,78|djo%9|ii|_:d|i_n;|djo<|ii|ii}=| o >dSn?t i i dd}@t i}A|tjoBt|i||t _n?D|iii||}E|iF|i|ddGdSnHti||dS(Niishtmlsrulessrelpath(sbuttons_strees selection_keysgameids n_expansionssappsgetGameRulesFilenamesdocsosspathsjoinsdirsSelectGameTreeWithPreviews html_viewersviewersNoneshelpHTMLs dataloadersfindFilesurlsupdateHistoryXYViewsdisplays MfxDialogsmDone(s_sbuttonsdocsdirsviewersurlspysol.pysmDone7s      ( sSelectGameTrees Tree_ClasssSelectGameTreeWithPreviewsTreeDataHolder_ClasssSelectGameDatasTreeData_Classs__init__sinitKwsdestroysmDone(spysol.pysSelectGameDialogs     sSelectGameDialogWithPreviewcsSIJeZKedZldZqdZuddZddZRS(Nc sKL|i|}Mti||||i|iN|i |\}}O|i ||P||_ Q||_R||_St|_T|iitjoU|i||i_nV|iiddW|ii} X| djoYddf\} } nhZ| djo[ddf\} } n?\| djo]d d f\} } n_dd f\} } `tdt| d d |iid } a|i||d|d|id|i d| |_!b|i!i"i#dddt$i%ddd|i&d|i'ct(|d| |_)d|i)i*||ed|i)i+_)fd |_,gt|_-ht|_.i|i/|ddj|i0||} k|i2| |i3dS(NiiiLiiXiii iii,i i skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyiis animations(4s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappsgameidsbookmarksNonesrandomsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsswsw1sw2smaxsminssubsampled_imagessCARDWs Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviewssetupscanvass preview_keys preview_games preview_apps updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsgameidsbookmarkskws top_frames bottom_framesswsw1sw2sfocusspysol.pys__init__Ks>"    -6:   csAlmt|nddtdfdd}pti||SdS(NsstringssSelectsCancelsdefaulti(sKwStructskwsNonesSelectGameDialogsinitKws_(s_skwspysol.pysinitKwls cs:qr|idds|iitti|dS(Nsdestroyi(s_s deletePreviewspreviews unbind_allsSelectGameDialogsdestroy(s_spysol.pysdestroyqscsuvd |_w|ioNxt|iiy|iiiz|o{|iiidnn||io4}|ii ~|ii t |int |_|o1|i ot |i nt |_ ndS(Nisall( s_s preview_keyspreviewsunbind_destroyscanvassdeleteAllItemssdestroysdeletes preview_gamesendGamesdestructsNones preview_app(s_sdestroyspysol.pys deletePreviewus       ic %s||ijo dSn|i|ii}|iii|}| od |_dSn|i t jo<t d|ii d|d|iiid|iiiddd|iid |iid |iid |iid t d |iid|iiid|iid|iiidt d|iidt d|ii|_ d|i i_d|i i_nt |i _ |djo||i i_n|io$|ii|ii n|i!i"d|ii#|do|i$|i%f\}}|djo |djoCt(||d|ddddddddt)dnn|i*||_|ii+|i ddf\}}|ii.|ii/f\} } |i2d | | | | f|i3d|i4dt } ||ijo|ii6i5i} n||ijo|i7o|ii8|i7n|ii9d!| d"d|i2d | | | | f|ii |i _ |iiiod#|i i_nd|i i_|ii5i|_5|i5i:|i5_;||_dS($Nisaudioscanvasscardsetscommentssdebugis gamerandomsgdbsgimagessimagessmenubars miscrandomsopts startup_optsstatsstops top_cursorstoolbars constructGamesPlayable Preview - idiispreviewsanchorssstexts Playable Areasfonts canvas_larges scrollregionsrandomsautoplayi(<sgameids_s preview_keys deletePreviewspreviewscanvassappsgdbsgetsgis preview_appsNonesStructsaudioscardsetscopyscommentssnews gamerandomsgimagesssubsampled_imagess miscrandomsopts startup_optsstatss top_cursors constructGamesshadowsshades animationss preview_gamesendGamesdestructstopswm_titlesgetGameTitleNames winfo_widths winfo_heightscwschs MfxCanvasTextsgetFonts gameclasss createPreviewstxstyswidthsheightsgwsghsconfigs xview_movetos yview_movetosrandomsgamesbookmarksrestoreGameFromBookmarksnewGamesORIGIN_PREVIEWsorigin( s_sgameids animationsscanvassgiscwschstxstysgwsghsrandomspysol.pys updatePreviews~           # !!# !i(sSelectGameTreeWithPreviews Tree_ClasssNones__init__sinitKwsdestroys deletePreviews updatePreview(spysol.pysSelectGameDialogWithPreviewIs  !  sSelectCardsetLeafcsRS(N((spysol.pysSelectCardsetLeafssSelectCardsetNodecsdZRS(Nc sg}xj|iiidrT}|i|o;t|i|d|id|i }|i |nq!W|p |iii SdS(Nistextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectCardsetLeafsnamesindexsnodesappends no_contents(s_scontentssobjsnodespysol.pys _getContentss  '(s _getContents(spysol.pysSelectCardsetNodessSelectCardsetDatacsdZRS(Nc snti||i|_td|i|_tttddtg|_ t}t i i }|idg}xU|drH\}}|ii|o&|itt||dnqW|o%ttdt|dd }nt}t ii }|id g}xU|drH\}}|ii|o&|itt||d nqeW|o>|ittd d ttdt|}nt}t ii }|idg}xU|drH\}}|ii|o&|itt||dnq?W|o>|ittd dttdt|}nt} t ii }|idg}xU|drH\}}|ii|o&|itt||dnqW|o>|ittd dttdt|} nttttdddt |idjttdttddttddttdd ttd!d"ttd#d$fdd ||| |f|_!dS(%Ncs |i S(N(sobjserror(sobjspysol.pysss (no cardsets)skeycst|d|dS(Ni(scmpsasb(sasbspysol.pyssics||iijS(N(skeyscsssistype(scsskeyspysol.pysssby Typesexpandedicst|d|dS(Ni(scmpsasb(sasbspysol.pysscs||iijS(N(skeyscsssisstyles(scsskeyspysol.pysss Uncategorizedcs|ii S(N(scsssisstyles(scsspysol.pysssby Stylecst|d|dS(Ni(scmpsasb(sasbspysol.pysscs||iijS(N(skeyscsssis nationalities(scsskeyspysol.pysscs|ii S(N(scsssis nationalities(scsspysol.pysssby Nationalitycst|d|dS(Ni(scmpsasb(sasbspysol.pysscs||iijS(N(skeyscsssisdates(scsskeyspysol.pysscs|ii S(N(scsssisdates(scsspysol.pysssby Dates All CardsetscsdS(Ni((scsspysol.pyssi sby Sizes Tiny cardsetscs|iitijS(N(scsssissizesCSIs SIZE_TINY(scsspysol.pysssSmall cardsetscs|iitijS(N(scsssissizesCSIs SIZE_SMALL(scsspysol.pysssMedium cardsetscs|iitijS(N(scsssissizesCSIs SIZE_MEDIUM(scsspysol.pysssLarge cardsetscs|iitijS(N(scsssissizesCSIs SIZE_LARGE(scsspysol.pysssXLarge cardsetscs|iitijS(N(scsssissizesCSIs SIZE_XLARGE(scsspysol.pyss("sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssfiltersSelectCardsetLeafsNones no_contentssselect_by_typesCSIsTYPEsitemsssortsnodesskeysnamesregistered_typessgetsappendsSelectCardsetNodestuplesselect_by_stylesSTYLEsregistered_stylessselect_by_nationalitys NATIONALITYsregistered_nationalitiessselect_by_datesDATEsregistered_datesslens rootnodes( s_smanagerskeysselect_by_typesitemssnodessnamesselect_by_stylesselect_by_nationalitysselect_by_datespysol.pys__init__sb!   * %   *    *    * (s__init__(spysol.pysSelectCardsetDatassSelectCardsetByTypeDatacsdZRS(Ncs ti||i|_tttddtg|_t i i }|i dg}xU|drH\}}|ii|o&|itt||dnqWttdt|dd}tt|f|_dS( Ns (no cardsets)skeycst|d|dS(Ni(scmpsasb(sasbspysol.pyssics||iijS(N(skeyscsssistype(scsskeyspysol.pysssby Typesexpandedi(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssSelectCardsetLeafsNones no_contentssCSIsTYPEsitemsssortsnodesskeysnamesregistered_typessgetsappendsSelectCardsetNodestuplesselect_by_typesfilters rootnodes(s_smanagerskeysitemssnodessnamesselect_by_typespysol.pys__init__s!  *!(s__init__(spysol.pysSelectCardsetByTypeDatassSelectCardsetTreecseZRS(N(sNonesdata(spysol.pysSelectCardsetTreessSelectCardsetByTypeTreecs eZRS(N(sNonesdata(spysol.pysSelectCardsetByTypeTreessSelectCardsetDialogWithPreviewcs_!"eZ#eZ$eZ%edZ@dZFdZOdZ ddZ RS(Nc s7%&|i|}'ti||||i|i(|i |\}})|i ||*|tjo+|i}n,||_-||_ .|iitjo/|i|||i_n0|iidd1|iidjo2ddf\} } n4ddf\} } 5|i||d|d|i6d|id | |_7|iiid d d tid dd|i d|i!8t"|d | |_#9|i#i$||:d |_&;g|_'<|i(|=|i)||} >|ii} ?|i+| |i,dS(Niii ii,skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyi(-s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapsskeysNonesmanagers getSelectedsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsw1sw2s Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviewssetupsapps preview_keyspreview_imagess updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsmanagerskeyskws top_frames bottom_framesw1sw2sfocusspysol.pys__init__%s2"  :  cs_@A|ii|iitB|iiC|iiDg|_Et i|dS(N( s_streesupdateNodesWithTrees rootnodessNonesdestroyspreviews unbind_allspreview_imagess MfxDialog(s_spysol.pysdestroy@s  cswFGt|HddddfddIddd d Jd tKd d dd Ldd dd }Nti||SdS(NsstringssOKsLoadsCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skwspysol.pysinitKwFs  cscOP|ddfjo%Q|ii|_Rd|i_nS|ddfjoT|ii|ii}U| o VdSnWt i i |i d}X|djoYt i i |i d}nZy/[t|}\|i}]|iWn^_dSnX`t|idtd|iad |}bdSncti||dS( Niiiis COPYRIGHTs config.txtstitles stext(sbuttons_strees selection_keyskeys n_expansionssmanagersgetscssosspathsjoinsdirsfsopensfilesreadstextsclosesDisplayTextDialogstopsCARDSETsnamesds MfxDialogsmDone(s_sbuttonscssfsfilestextsdspysol.pysmDoneOs(    c stde||ijo fdSng|ii}h|iig|_j|ii|}k| old |_mdSnn|i \}}oypp|i \}}qxQ|dqrD}rtii|i||i}s|iitd|qWWn*tud |_vg|_wdSnXxddddd|id|idf\}} } } } } }yx|idyr}zt || | ddd|{t!| | t!| | f\} } ||d}}||djo~d| |f\} } n| | } qW|i"ddd| | | |f|i"d | d |||_dS( Niisfilei sanchorsnwsimages scrollregionsxscrollincrementsyscrollincrement(#skeys_s preview_keyspreviewscanvassdeleteAllItemsspreview_imagessmanagersgetscssgetPreviewCardNamessnamesscolumnssnsosspathsjoinsdirsextsfsappends loadImagesCARDWsCARDHsisxsyssxssysdxsdysimagesMfxCanvasImagesmaxsconfig(s_skeyscanvasscssnamesscolumnssnsfsisxsyssxssysdxsdysimagespysol.pys updatePreviewds@       "$   A ' '( sSelectCardsetTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(spysol.pysSelectCardsetDialogWithPreview!s     s$SelectCardsetByTypeDialogWithPreviewcs eZeZeZRS(N(sSelectCardsetByTypeTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetByTypeDatasTreeData_Class(spysol.pys$SelectCardsetByTypeDialogWithPreviews  sSelectTileLeafcsRS(N((spysol.pysSelectTileLeafssSelectTileNodecsdZRS(Nc sg}xj|iiidrT}|i|o;t|i|d|id|i }|i |nq!W|p |iii SdS(Nistextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectTileLeafsnamesindexsnodesappends no_contents(s_scontentssobjsnodespysol.pys _getContentss  '(s _getContents(spysol.pysSelectTileNodessSelectTileDatacsdZRS(Ncsqti||i|_td|i|_td|i|_tttddtg|_ t |t i jpt|idj}d}ttdtttddd tttd dd tttd dd tttdddtttdddtttdddfd|ttddd|f|_dS(Ncs |i S(N(sobjserror(sobjspysol.pysscs|idjo|iS(Ni(stilesindexsfilename(stilespysol.pysss (no tiles)skeyiis Solid ColorssBlues#0082dfsGreens#008200sNavys#000086sOlives#868200sOranges#f79600sTeals#008286sexpandedsAll BackgroundscsdS(Ni((stilespysol.pyss(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssfiltersSelectTileLeafsNones no_contentsstypeskeystypess StringTypeslense1se2sSelectTileNodes rootnodes(s_smanagerskeyse1se2spysol.pys__init__s!. (s__init__(spysol.pysSelectTileDatassSelectTileTreecseZRS(N(sNonesdata(spysol.pysSelectTileTreessSelectTileDialogWithPreviewcs_eZeZeZedZdZdZdZ dZ RS(Nc sF|i|}ti||||i|i|i |\}}|i |||tjo|i}n||_||_ |ii|_|iitjo|i|||i_n|iidd|iidjoddf\} } nddf\} } |i||d|d|id|id| |_|iii d d d t!i"d d d|i#d|i$t%|d| dd dd |_&|i&i |d |_'|i(||i)||} |ii} |i+| |i,dS(Niii i,skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyshbarsvbari(-s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapsskeysNonesmanagers getSelectedsappsopts tablecolorsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsw1sw2s Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviews preview_keys updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsmanagerskeyskws top_frames bottom_framesw1sw2sfocusspysol.pys__init__s2"  :$ csS|ii|iit|ii|iiti|dS(N( s_streesupdateNodesWithTrees rootnodessNonesdestroyspreviews unbind_alls MfxDialog(s_spysol.pysdestroyscswt|ddddfddddd d d td d dd dd dd }ti||SdS(NsstringssOKsSolid color...sCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skwspysol.pysinitKws  cs|djo%|ii|_d|i_n|djotid|id|i dd}|o|doUt i |d|_|i|_ |ii |i|i|indSnti||dS(Niismasters initialcolorstitlesSelect table color(sbuttons_strees selection_keyskeys n_expansionsstkColorChoosersaskcolorstops tablecolorscsstringslowersupdateSelections updatePreviews MfxDialogsmDone(s_sbuttonscspysol.pysmDones cs||ijo dSn|ii}t|tijoc|id||i |i t |i t ||_||_ dSnt }|ii|}|oMytd|idd}Wn$tij o}t }nXn|i |i ||i |i||_|t jod |_ndS(Nsbgsfilesditheri(skeys_s preview_keyspreviewscanvasstypestypess StringTypesconfigsdeleteAllItemsssetTilesNones setTextColors tablecolorsimsmanagersgetstiles loadImagesfilenamesTkintersTclErrorsexs text_color(s_skeyscanvassimstilesexspysol.pys updatePreviews0         ( sSelectTileTrees Tree_ClasssTreeDataHolder_ClasssSelectTileDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(spysol.pysSelectTileDialogWithPreviews     sSingleGame_StatsDialogcs}dZdZdZ%dZ8dZTdZYdZldZd Zd Z RS( Nc s|i|}ti||||i|i|i |\}}|i |||pd|_ |iidd|i|_|i} |i} |idjp|idjo|i}  |i} n |ii||\} }  | ||| | d |iii|g}  t |d| } t!t |d| } t!t |d| } | ||| | d |i"||} |i$| |i%dS( Ns Demo gamesii iXsTotalcs |d|jS(Ni(sasb(sasbspysol.pys scs|ddjS(Nii(sa(sasbspysol.pysscs|ddjS(Nii(sa(sasbspysol.pysssCurrent session(&s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssplayerstops wm_minsizesbuttonscreate3DBarCharts createChartscreatePieChartswinfo_screenwidthswinfo_screenheightscreateSimpleChartsappsstatssgetStatssgameidswonslosts session_gamessgetsgsfilterslens createButtonssfocussmainloopstimeout(s_sparentstitlesappsplayersgameidskws top_frames bottom_frames createChartswonslostsgsfocusspysol.pys__init__s*"  ) csddf\}}||djoCt|||}tt|dd}d|}n||fSdS(Nf0.0if1e-05f0.99999f1.0(spwonsplostswonslostsfloatsminsmax(s_swonslostspwonsplostspysol.pys_getPwons c s#td}ti|}ti|d|d|}|i d}|i dti dti ddd d d d  |i dti !|id d||dddd"ti|d|d|ddd dd d}#|id dd|dd$|||fSdS(Ns tree_smallswidthsheightsinsertbackgroundssidesfillsexpandispadxispadyi iissoutlines#7f7f7fstextsfontsbdiiswindowsanchorsnw(sgetFontstfontsTkintersFramesframesCanvasswshscscgetsfgspacksTOPsBOTHscreate_rectanglesLabelstextsls create_window( s_sframeswshstextstfontscsfgslspysol.pys_createChartInits1%0c sg%&td}'|id}(|i||\}} )|d} *|i | |dddddd|d |+|i | |d dd ddd|d |,|i | |d dd ddd|d |-|d d} .|i | |ddd|ddd|d |/|i | |d dd|ddd|d |0|i | |d dd||ddd|d |1|d d} 2|i|d| | | d |3||djo4|d } 5ttd|} 6|i | |ddd| ddd|d |7|i | |d ddd| ddd|d |ndS(Ns tree_smallsinsertbackgroundistextsWon:sanchorsnwsfontsfillisLost:isTotal:is%dsnei f100.0s%d%%id(sgetFontstfontscscgetsfgs_s_getPwonswonslostspwonsploststxsxs create_textstysys create_linesintsroundspw( s_scstxstyswonsloststfontsfgspwonsplostsxsyspwspysol.pys_createChartTexts%s$ ///337# 3c s89|djo :dSn;t|}<xddddfd<r}=|||d|||df||<>|d}?tt||d|} @tt||d|} A||d| ||d| f||i iiiviixiriips#00ff00s#008200s#00c300ifii1i=i ii{i~s#ff0000s#860400s#c70400iii0stextsfontsfill(sappsgimagessstatssimageswidthsheightsiwsihs_s_createChartInitsframestextscstfontsfgs_getPwonswonslostspwonsploststxsyystys create_imagespscols_createChart3DBars_createChartTextss create_textsplayer(s_sframesappswonsloststextsimagesiwsihscstfontsfgspwonsploststxsyystyspscolspysol.pyscreate3DBarChartYs !( *[#W#c srlm|i|dd|\}}}n|i||\} } odddf} pdddf} q||d jogrd d | d | f\} }}s|id d ddddddd| d|t|id d ddddddd| |d|u|id d ddddd| d|v|id d ddddd| |d|w| d d | d f\}}x|i|||d|dddy| d}z|i|||d|dddnr||id d dddddd}|id d dddd~|idddddd d!|dd"|i|| | ||dS(#Ni,idiiiii)iKif0.0f360.0iii insfills#007f00sstartsextents#7f0000s#00ff00s#ff0000i is#7f7f7fs#f0f0f0iAi2stextsNo gamessanchorscentersfonts#bfbfbf(s_s_createChartInitsframestextscstfontsfgs_getPwonswonslostspwonsploststxstysssewonselosts create_arcsxsyscreate_rectangles create_ovals create_texts_createChartTexts(s_sframesappswonsloststextscstfontsfgspwonsploststxstysssewonselostsxsyspysol.pyscreatePieChartls$$#37+/!' +'+cskt|ddddfddffddd d d d d ddd}ti||SdS(NsstringssOKs All games...ifsReset...i.sdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKws  $cstdSdS(Nssmall(sgetFont(s_spysol.pysgetDefaultFonts( s__init__s_getPwons_createChartInits_createChartTextss_createChart3DBarscreateSimpleChartscreate3DBarChartscreatePieChartsinitKwsgetDefaultFont(spysol.pysSingleGame_StatsDialogs        s"AllGames_StatsDialogScrolledCanvascsRS(N((spysol.pys"AllGames_StatsDialogScrolledCanvasssAllGames_StatsDialogcsddf\ZZeidjo dZndZdZdZdZd Ze d Z d Z d e i fd YZRS(Niismaciic s!d}|o|idjo d}nt|d||i|i|}ti ||||i |i |i |\}}|i||||_|iidd|i |_|i|_t|d|id|i|_|iidtidd d |id |ih|_|ii |_ ||i _!t"|i d |i#|i$|||i i&d } |i i'ddd| d| df|i i(|i)|i*||} |i,| |i-dS(NiiXisheightiswidthsfillsexpandispadxspadyssalls scrollregioniii(.slinessparentswinfo_screenheights kwdefaultskws_sCHAR_HsinitKws_ToplevelDialogs__init__stitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappstops wm_minsizesbuttonsfonts"AllGames_StatsDialogScrolledCanvasswidthsheightsscspacksTkintersBOTHspadxspadysnodesscanvassdialogsbinds singleClicks fillCanvassplayersbboxsconfigs yview_movetosYVIEWs createButtonssfocussmainloopstimeout( s_sparentstitlesappsplayerskwsliness top_frames bottom_framesbboxsfocusspysol.pys__init__s0  " $1 *cstt|ddddfddffddd d d d d ddddd}ti||SdS(NsstringssOKs Save to fileis Reset all...i-sdefaultisseparatorwidthis resizableispadxi spadyswidthi(sKwStructskws MfxDialogsinitKws_(s_skwspysol.pysinitKws  $cstdSdS(Nssmall(sgetFont(s_spysol.pysgetDefaultFontscsNt|_t|i_h|_|iiti|dS(N( sNones_sappscanvassdialogsnodessscsdestroys MfxDialog(s_spysol.pysdestroys   cs|iiti}| o dSn|ii|dttf\}}dS|o|o|G|GHn|o |GHndS(Ni( s_scanvass find_withtagsTkintersCURRENTsidsnodessgetsNonesgameids gamenumber(s_seventsidsgameids gamenumberspysol.pys singleClicks  ( cst|i}|i|i|i|i}|i ||| o"|i dt |dnt|t|dS(NsNo entries for player s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_Hswriters writeStatssplayersheaderspsustrsdestruct(s_splayersheadersaswriterspysol.pys fillCanvass !" s CanvasWritercspdZdZdZdZedZdZdZ(d d dZRS( Ncs||_|id|_||_||_d|_|_t|_ t|_ |ii d|dS(Nsinsertbackgroundisyscrollincrement( scanvass_scgetsfgsfontshsxsysNonesgameids gamenumbersconfig(s_scanvassfontshspysol.pys__init__s     cs)|i|if|iii|is istextsanchorsnwsfontsfill( s_sysh1sh2ssshscanvass create_textsxsfontsfgsids_addItem(s_sssh1sh2sidspysol.pysps    <cs dS(N((s_ssspysol.pyspheadersc s|idjo dSn||_t|_d|if\}}|i} d} t | | ||dddt |} t | | |d|dddt |} t | | |d |dddt |} t | | |d |dddt |} t | | |d |dddt |} |i|d |t ||i| |_t|_dS( Ni>iisanchorsnwstextisneii,i^it(s_sysgameidsNones gamenumbersxs _pstats_textspshsmaxsustrst1st2st3st4st5s pstats_perc( s_st1st2st3st4st5sgameidsxsyspshspysol.pyspstatss     -1111 c sat|d|id|it|ii||f|}|i ||i SdS(Nsfontsfill( s kwdefaultskws_sfontsfgsapplyscanvass create_textsxsysids_addItemsh(s_sxsyskwsidspysol.pys _pstats_texts!c s8|od|djo djn o dSntttit|}|djo dSn||dddd|i df\}}}}dott||d } do | djo dSn| djogtd | } t|d| }  |ii|||| ||d d d d dd} n | |joC |ii|| |||||d d d ddd} ndSnt} |ii||||||d dd | dd} do|d|df\}}|d|df\}}tt||d } | djo?|ii|||| ||d dd d dd} n| |joC|ii|| |||||d dd ddd} ndSnd} |d} xddddddddddf dr} ||jo!Pn"dd| d| f\}}}#d t|t|t|f}$|ii| |d| d!||dd d%d |d|} &| d} 'td"| d#} q^WdS($Ns0is9iiii if100.0iswidthsfills#00ff00soutlines#000000s#ff0000s#808080sf1.0i iii)i3i=iGiQi[iii@s #%02x%02x%02xif0.0f0.1(stsintsroundsstringsatofsstrspercsxsys_shsrxsrysrwsrhswsmaxsminscanvasscreate_rectanglesidsNonesfillspsixsisrsgsbsc(s_sxsystspercsrxsrysrwsrhswsidsfillspsixsisrsgsbscspysol.pys pstats_percsZ- $ 4  &*  & &*   * #(. cs()|djo"d|dd!jo djno*||_+||_n,|id||||f-t|_.t|_dS(Nis0is9s%-25s %-20s %17s %s (sgameids gamenumbers_spsgamenamesdatesstatussNone(s_sgamenames gamenumbersdatesstatussgameidswonspysol.pysplog(s 5   i( s__init__s_addItemspspheadersNonespstatss _pstats_texts pstats_percsplog(spysol.pys CanvasWriters     -(sCHAR_WsCHAR_HsossnamesYVIEWs__init__sinitKwsgetDefaultFontsdestroysNones singleClicks fillCanvassPysolStatsFormatters StringWriters CanvasWriter(spysol.pysAllGames_StatsDialogs       sFullLog_StatsDialogcs&/0dZ1dZ7dZRS(Nics12t|i}3|i|i|i|i}4|i ||| o"5|i dt |dn6t|dS(NsNo log entries for s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_Hswriters writeFullLogsplayersheaderspsustrsdestruct(s_splayersheadersaswriterspysol.pys fillCanvas1s !"c sl78t|9ddddfddffdd:d td ;d d |i}=ti||SdS( NsstringssOKsSession log...ihs Save to fileisdefaultisfonts canvas_fixedswidthiL(sKwStructskwsgetFonts_sCHAR_WsAllGames_StatsDialogsinitKw(s_skwspysol.pysinitKw7s  $(sYVIEWs fillCanvassinitKw(spysol.pysFullLog_StatsDialog/s  sSessionLog_StatsDialogcs>?dZEdZRS(Ncs?@t|i}A|i|i|i|i}B|i ||| o"C|i dt |dnDt|dS(Ns#No current session log entries for s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_HswriterswriteSessionLogsplayersheaderspsustrsdestruct(s_splayersheadersaswriterspysol.pys fillCanvas?s !"csMEFt|Gddddfddffdd}Iti||SdS( NsstringssOKs Full log...igs Save to fileisdefaulti(sKwStructskwsFullLog_StatsDialogsinitKws_(s_skwspysol.pysinitKwEs *(s fillCanvassinitKw(spysol.pysSessionLog_StatsDialog>s s AbstractCardcsJKdddZWdZYdZ[dZ]dZcddZgd Zid Zked Z mdd Z odd Z qdZ RS(NcsKL||_M||_N||_O|d|_P||_Q||_R||_St|_ Td|_ Ut|_ Vd|_ |_ dS(Nii(sids_sdeckssuitscolorsranksxsysNonesitemsface_ups hide_stackshide_xshide_y(s_sidsdeckssuitsranksgamesxsyspysol.pys__init__Ks         ics*WXd|i|i|i|ifSdS(NsCard(%d, %d, %d, %d)(s_sidsdeckssuitsrank(s_spysol.pys__str__WscsYZ|itj SdS(N(s_s hide_stacksNone(s_spysol.pysisHiddenYscs6[\|i||i|i||i|idS(N(s_smoveBysxshide_xsyshide_y(s_sxsyspysol.pysmoveTo[scsy]^t|t|f\}}_|p|o@`|i||_a|i||_b|ii||ndS(N(sintsdxsdys_sxsysitemsmove(s_sdxsdyspysol.pysmoveBy]s !cs2cd|oe|inf|iidS(N(sunhides_sitemstkraise(s_sunhidespysol.pystkraisecs ics ghdS(N((s_sstackspysol.pyshidegscs ijdS(N((s_spysol.pysunhideiscs kldS(N((s_sssgroupspysol.pys setSelectedkscsmntdS(N(sSubclassResponsibility(s_sunhidespysol.pysshowFacemscsoptdS(N(sSubclassResponsibility(s_sunhidespysol.pysshowBackoscsqrtdS(N(sSubclassResponsibility(s_simagespysol.pysupdateCardBackgroundqs( s__init__s__str__sisHiddensmoveTosmoveBystkraiseshidesunhidesNones setSelectedsshowFacesshowBacksupdateCardBackground(spysol.pys AbstractCardJs      s_HideableCard_1csstdZdZRS(Ncstu||ijo vdSnw|io-x|i|i|i|if\}}nz|i|if\}}{|i}||ii i |ii d|i ||}|i|if\|_|_~||_dS(Nsmove( sstacks_s hide_stackshide_xshide_yshxshysitemscanvasstkscalls_wsid(s_sstackshxshysitemspysol.pyshidets  - +!cs|itjo dSn|i}|iii|iid|i|i |i ddf\|_ |_ t|_dSdS(Nismovei( s_s hide_stacksNonesitemscanvasstkscalls_wsidshide_xshide_y(s_sitemspysol.pysunhides  3 (shidesunhide(spysol.pys_HideableCard_1ss s_HideableCard_2csdZdZRS(NcsG||ijo dSn|iidd||_dS(Nsstateshidden(sstacks_s hide_stacksitemsconfig(s_sstackspysol.pyshides csN|itjo dSn|iiddt|_dSdS(Nisstatesnormali(s_s hide_stacksNonesitemsconfig(s_spysol.pysunhides   (shidesunhide(spysol.pys_HideableCard_2s is _OneImageCardcsYdddZdZddZddZdZdZRS( Nc sti||||||d|d||i ||||_ |i ||||_ |i |_t|i|i|i d|idd|_dS(Nsxsysimagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysgetCardFaceImages _face_imagesgetCardBackImages _back_images _active_imagesMfxCanvasImagescanvassitem(s_sidsdeckssuitsranksgamesxsyspysol.pys__init__s +ics@||ij o&|iid|||_ndS(Nsimage(simages_s _active_imagesitemsconfig(s_simagespysol.pys _setImagescsK|i o6|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _face_imagestkraisesunhide(s_sunhidespysol.pysshowFacesicsJ|io6|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _back_imagestkraisesunhide(s_sunhidespysol.pysshowBacks cs8||_|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups _setImage(s_simagespysol.pysupdateCardBackgrounds cst|t|f\}}|i||_|i||_|i}|iii |ii d|i ||dS(Nsmove( sintsdxsdys_sxsysitemscanvasstkscalls_wsid(s_sdxsdysitemspysol.pysmoveBys ! (s__init__s _setImagesshowFacesshowBacksupdateCardBackgroundsmoveBy(spysol.pys _OneImageCards   s_OneImageCardWithHideByConfigcsGdZdZddZddZdZRS(NcsD||ijo dSn|idt||_dS(Nsimage(sstacks_s hide_stacks _setImagesNone(s_sstackspysol.pyshides csu|itjo dSn|io|id|in|id|it|_dSdS(Nisimagei(s_s hide_stacksNonesface_ups _setImages _face_images _back_image(s_spysol.pysunhides   csY|i oD|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _face_imagesitemstkraise(s_sunhidespysol.pysshowFaces  icsX|ioD|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _back_imagesitemstkraise(s_sunhidespysol.pysshowBacks   csC||_|i o|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups hide_stacks _setImage(s_simagespysol.pysupdateCardBackgrounds (shidesunhidesshowFacesshowBacksupdateCardBackground(spysol.pys_OneImageCardWithHideByConfigs   s _TwoImageCardcsAdddZddZddZdZRS(Nc sti||||||d|d|t |i |_ t |i |i|i d|i|||dd|_t |i |i|i d|i|||dd|_|ii|i |ii|i dS(Nsxsysimagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysMfxCanvasGroupscanvassitemsMfxCanvasImagesgetCardFaceImages_TwoImageCard__facesgetCardBackImages_TwoImageCard__backsaddtag(s_sidsdeckssuitsranksgamesxsyspysol.pys__init__s +<<ics|i ojto0|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__backsconfigs_TwoImageCard__facestkraisesunhide(s_sunhidespysol.pysshowFaces ics~|iojto0|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__facesconfigs_TwoImageCard__backstkraisesunhide(s_sunhidespysol.pysshowBacks  cs|iid|dS(Nsimage(s_s_TwoImageCard__backsconfigsimage(s_simagespysol.pysupdateCardBackgrounds(s__init__sshowFacesshowBacksupdateCardBackground(spysol.pys _TwoImageCardss_TwoImageCardWithHideItemcsAdddZddZddZdZRS(Nc sti||||||d|d|t |i |_ t |i |i|i dd|i|||dd|_t |i |i|i d|i|||dd|_|ii|i |ii|i dS(Nsxsyi*simagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysMfxCanvasGroupscanvassitemsMfxCanvasImagesgetCardFaceImages_TwoImageCardWithHideItem__facesgetCardBackImages_TwoImageCardWithHideItem__backsaddtag(s_sidsdeckssuitsranksgamesxsyspysol.pys__init__s +@<icsb|i oM|iidd|iidd |i|d|_ndS(Nii'i*i(s_sface_ups_TwoImageCardWithHideItem__backsmoves_TwoImageCardWithHideItem__facestkraisesunhide(s_sunhidespysol.pysshowFaces icsa|ioM|iidd|iidd |i|d|_ndS(Nii*i'(s_sface_ups_TwoImageCardWithHideItem__facesmoves_TwoImageCardWithHideItem__backstkraisesunhide(s_sunhidespysol.pysshowBacks  cs|iid|dS(Nsimage(s_s_TwoImageCardWithHideItem__backsconfigsimage(s_simagespysol.pysupdateCardBackgrounds(s__init__sshowFacesshowBacksupdateCardBackground(spysol.pys_TwoImageCardWithHideItemssImagesCardbackcs edZRS(NcsT  |tjo  |}n ||_ ||_ ||_||_dS(N(s menu_imagesNonesimagesindexs_sname(s_sindexsnamesimages menu_imagespysol.pys__init__ s     (sNones__init__(spysol.pysImagesCardbackssImagescsddZ$dZ&dddZ1dZ6dZEeddZzd Z}d Zd Z d Z d d Z dZ dZ dZdZdZRS(Ncst||_||_||_|tjo dSn|i||i||i |f\|_|_|_ d||_ |i |_ |djo t d|i ||_ n|i||i|f\|_|_|i||i|f\|_|_d|_g|_g|_ g|_!g|_"g|_#g|_dS(Ni ii i(s dataloaders_sdscssrsreducedsNonesCARDWsCARDHsCARDDs CARD_XOFFSETsCARD_UP_YOFFSETs CARD_YOFFSETsmaxsSHADOW_XOFFSETsSHADOW_YOFFSETsCARD_DXsCARD_DYs _shade_indexs_cards_backs_bottoms_letters_shadows_shade(s_s dataloaderscssrspysol.pys__init__s&    9 ))      ics $%dS(N((s_spysol.pysdestruct$scs&'tii|ii|}(td|})|i |i f\}}*|idjo+||f\|_|_nO-|o ||ijp|o ||ijo/td|||fn0|SdS(NsfileisInvalid size %dx%d of image %s(sosspathsjoins_scssdirsfilenamesfs loadImagesimgswidthsheightswshsCARDWsCARDHscheck_wscheck_hs Exception(s_sfilenamescheck_wscheck_hsfsimgswshspysol.pys __loadCard&s!1cs12t|id|id}3tdtt|}4|i|}5|i i t t |i |||dS(Nf40.0f60.0i(smaxs_sCARDWsCARDHsrsintsroundsim1s subsamplesim2s_backsappendsImagesCardbackslensname(s_sim1snamesrsim2spysol.pys __addBack1s csb67|i of8t|i|idddd}9d}:|i||;t|i i |f|i _ n<t }=xi=t |idjoO>|t jo(?t|i|idt dd}n@|ii|qWAxiAt |idjoOB|t jo(Ct|i|idt dd}nD|ii|qWdS(Nsfills#a0a0a0soutlines#000000sii(s_s_backs createImagesCARDWsCARDHsimsnames_Images__addBackstuplescss backnamessNonesbottomslens_bottomsappends_letter(s_simsnamesbottomspysol.pys_createMissingImages6s $ & ((c s9EF|iid}Gd}H|ozI|iit|ii|ii|ii }J| oK||ii d}nLt dd|i |}nMxw|iidMra}N|ii|i||iiO||id _P|oP|id|nqWQto#t|i|iijptRxc|iidRrP}Sy7T|o)U|i|}V|i||nWn WXnXq_WY|oY|iddnZxt|iidZrq} [y7\d| d|f}]|ii|i|Wn ^_nX`|o`|id|nqWaxt|ii darq} by7cd| d|f}d|ii|i|Wn efnXg|og|id|nqWhxt|ii dhr} i|oj|iit nbld| |f}my"n|i|ddd d}Wnopt }nXq|ii|r|or|id|nqWs|ot|i!it n!v|i!i|id |w|ow|id|nx|i"ydSdS( Niif80.0ssteps bottom%02d.%ssl%02d.%ss shadow%02d.%sscheck_wscheck_hsshade.(#s_scssextspstepsprogresssncardsslens backnamessnbottomssnletterssfastsnshadowssmaxspercentsgetFaceCardNamessns_cardsappends_Images__loadCardsfilenamesupdates __debug__sAssertionErrorsnamesims_Images__addBacksrangesis_bottomsranks_letters_shadowsNones_shades_createMissingImages( s_sappsprogresssfastsextspstepsnsnamesimsisrankspysol.pysloadEsz  3 ! & -            "      ics<z{|t|ii|}||i||iiSdS(N( ssuitslens_scssrankssranksindexs_cardsncards(s_sdeckssuitsranksindexspysol.pysgetFacezscs4}~|iit|i}|i|iSdS(N(s_scss backindexslens_backsindexsimage(s_sdeckssuitsranksindexspysol.pysgetBack}scs|idSdS(Ni(s_s_bottom(s_spysol.pysgetTalonBottomscs|idSdS(Ni(s_s_bottom(s_spysol.pysgetReserveBottomscstot|tijpt|d jo|idSnd|}|t |ijo|idSn|i|SdS(Nii( s __debug__stypessuitstypessIntTypesAssertionErrors_s_bottomsislen(s_ssuitsispysol.pys getSuitBottoms' cs|idSdS(Ni(s_s_bottom(s_spysol.pysgetBraidBottomscsoto%d|jo djnpt|t|ijo|idSn|i|SdS(Nii(s __debug__sranksAssertionErrorslens_s_letters_bottom(s_srankspysol.pys getLetters/csWto|djpt|t|ijo tSn|i|SdS(Ni(s __debug__sncardssAssertionErrorslens_s_shadowsNone(s_sncardsspysol.pys getShadows cs|i|iSdS(N(s_s_shades _shade_index(s_spysol.pysgetShadescs|iSdS(N(s_s_back(s_spysol.pys getCardbackss(s__init__sdestructs_Images__loadCards_Images__addBacks_createMissingImagessNonesloadsgetFacesgetBacksgetTalonBottomsgetReserveBottoms getSuitBottomsgetBraidBottoms getLetters getShadowsgetShades getCardbacks(spysol.pysImagess    5        sSubsampledImagescs,ddZdZdZRS(Nc sti|t|id||i|i||_|i|i ||_ |i|i ||_ x|i drp}|tjo|i i tnD|i i|}|i i tt|i |i||qW|i|if\}}x{|idrk}|tjptddddfjo|ii tn&|ii t|dd||q#WdS(Nsriii(sImagess__init__s_sNonesimagesscssrs _subsamples_cards_bottoms_letters_backsappendsimages subsamplesimsImagesCardbackslensnamesCARDWsCARDHsCWsCHs_shades tkversions copyImage(s_simagessrs_backsimsCWsCHspysol.pys__init__s  2 )icstSdS(N(sNone(s_sncardsspysol.pys getShadowscszg}x]|drP}|tjp |djo|i|n|i|i|qW|SdS(Nii(ssslsimsNonesrsappends subsample(s_slsrsssimspysol.pys _subsamples  (s__init__s getShadows _subsample(spysol.pysSubsampledImagess s AtomicMovecs5dZdZdZdZRS(Ncs|i|dS(N(s_sredosgame(s_sgamespysol.pysdoscst|iSdS(N(sstrs_s__dict__(s_spysol.pys__repr__scst|iSdS(N(sstrs_s__dict__(s_spysol.pys__str__scsd SdS(Ni((s_sotherspysol.pys cmpForRedos(sdos__repr__s__str__s cmpForRedo(spysol.pys AtomicMoves   s AMoveMovecsEd dZdZdZdZdZRS(Ncsgto||j pt||_|i|_|i|_||_ ||_ dS(N( s __debug__s from_stacksto_stacksAssertionErrorsncardss_sids from_stack_ids to_stack_idsframessshadow(s_sncardss from_stacksto_stacksframessshadowspysol.pys__init__s   ic s.|ii|ijo0to"|i||i| pt ng}x8t |dr%}|i }|i|qgW|i|idjoN|i|d\}} |i||||| d|id|inx#|dr} |i| q WdS(Nisframessshadow(sgamesmovessstatesS_PLAYs __debug__sto_stacks acceptsCardss from_stackscardssncardssAssertionErrorsrangesis removeCardscardsappendsreverses_sframessgetPositionForsxsysanimatedMoveTosshadowscsaddCard( s_sgamesncardss from_stacksto_stackscardssiscardsxsyscspysol.pys__doMoves0   2 cs:|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss from_stack_ids to_stack_id(s_sgamespysol.pysredoscs:|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss to_stack_ids from_stack_id(s_sgamespysol.pysundoscsIt|i|ip)t|i|ipt|i|iSdS(N(scmps_sncardssothers from_stack_ids to_stack_id(s_sotherspysol.pys cmpForRedos(s__init__s_AMoveMove__doMovesredosundos cmpForRedo(spysol.pys AMoveMoves   s AFlipMovecsAdZdZdZdZdZRS(Ncs|i|_dS(N(sstacksids_sstack_id(s_sstackspysol.pys__init__scsC|id }|io|in|idS(Ni(sstackscardsscardsface_upsshowBacksshowFace(s_sgamesstackscardspysol.pys__doMoves cs$|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgamespysol.pysredoscs$|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgamespysol.pysundoscst|i|iSdS(N(scmps_sstack_idsother(s_sotherspysol.pys cmpForRedos(s__init__s_AFlipMove__doMovesredosundos cmpForRedo(spysol.pys AFlipMoves     sATurnStackMovecs8ddZdZ dZdZRS(NcsOto||j pt|i|_|i|_||_dS(N( s __debug__s from_stacksto_stacksAssertionErrorsids_s from_stack_ids to_stack_ids update_flags(s_s from_stacksto_stacks update_flagsspysol.pys__init__sics|i|i}|i|i}tot|i djpt tot|i djpt t|i }xt |drt}d}|id|dd}to|ipt |i|d|dd|id|qW|id@o/todpt |id|_n|id@ooto||iijpt to*|i|ijp |idjpt |id|_n|i|idS(Niisunhidesupdatei(sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stacks __debug__slenscardssAssertionErrorslsrangesisunhides removeCardscardsface_upsaddCardsshowBacks update_flagssroundssstalons max_roundss updateText(s_sgames from_stacksto_stackslsisunhidescardspysol.pysredos*''  $4 cs  |i|i} |i|i} tot|i djpt  tot|i djpt t|i }xt |dru}d}|id|dd}to|i pt |id||i|d|ddqW|id@oPtodpt to|idjpt |id|_n|id@o\to||iijpt to|idjpt |id|_n|i|idS(Niisunhidesupdatei(sgames allstackss_s to_stack_ids from_stacks from_stack_idsto_stacks __debug__slenscardssAssertionErrorslsrangesisunhides removeCardscardsface_upsshowFacesaddCards update_flagssroundssstalons updateText(s_sgames from_stacksto_stackslsisunhidescardspysol.pysundo s,''   !$! csI t|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sotherspysol.pys cmpForRedos(s__init__sredosundos cmpForRedo(spysol.pysATurnStackMoves  sNEW_ATurnStackMovecsD#$ddZ)dZ;dZCdZKdZRS(NcsO$%to||j pt&|i|_'|i|_(||_dS(N( s __debug__s from_stacksto_stacksAssertionErrorsids_s from_stack_ids to_stack_ids update_flags(s_s from_stacksto_stacks update_flagsspysol.pys__init__$sicsW)*tot|idjpt+tot|idjpt,x|id,r}-|ii|i .|ii |i /|o30to|i pt1|i ddn/3to|i pt4|iddq`W5|i|_6g|_7|i8|i9|i:|idS(Nisunhide(s __debug__slens from_stackscardssAssertionErrorsto_stackscardsitemsdtagsgroupsaddtags show_facesface_upsshowFacesshowBacks refreshViews updateText(s_s from_stacksto_stacks show_facescardspysol.pys__doMove)s"''      cs;<|i|i}=|i|i}>|id@oo?to||i i jpt @to*|i |i jp |i djpt A|i d|_ nB|i||ddS(Nii(sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stacks update_flagss __debug__ssstalonsAssertionErrorsrounds max_roundss_NEW_ATurnStackMove__doMove(s_sgames from_stacksto_stackspysol.pysredo;s$4csCD|i|i}E|i|i}F|id@o\Gto||i i jpt Hto|i djpt I|i d|_ nJ|i ||ddS(Ni(sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stacks update_flagss __debug__ssstalonsAssertionErrorsrounds_NEW_ATurnStackMove__doMove(s_sgames from_stacksto_stackspysol.pysundoCs$!csIKLt|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sotherspysol.pys cmpForRedoKs(s__init__s_NEW_ATurnStackMove__doMovesredosundos cmpForRedo(spysol.pysNEW_ATurnStackMove#s    sAUpdateStackMovecsAOPdZSdZ[dZ^dZadZRS(Ncs"PQ|i|_R||_dS(N(sstacksids_sstack_idsflags(s_sstacksflagsspysol.pys__init__PscsvST|id@oU|i||inEW|id@oX|inY|id@oZ|indS(Ni@ii (s_sflagssstacks updateModelsundos updateTexts refreshView(s_sgamesstacksundospysol.pys__doMoveSs csH[\|id@ddfjo$]|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgamespysol.pysredo[scsH^_|id@ddfjo$`|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgamespysol.pysundo^scs3abt|i|ipt|i|iSdS(N(scmps_sstack_idsothersflags(s_sotherspysol.pys cmpForRedoas(s__init__s_AUpdateStackMove__doMovesredosundos cmpForRedo(spysol.pysAUpdateStackMoveOs     sANextRoundMovecs5efdZhdZndZtdZRS(Ncsfg|i|_dS(N(sstacksids_sstack_id(s_sstackspysol.pys__init__fscshi|i|i}jto||iijptkto*|i |i jp |i djptl|i d|_ m|i dS(Nii( sgames allstackss_sstack_idsstacks __debug__ssstalonsAssertionErrorsrounds max_roundss updateText(s_sgamesstackspysol.pysredohs $4csno|i|i}pto||iijptqto|i djptr|i d|_ s|i dS(Ni( sgames allstackss_sstack_idsstacks __debug__ssstalonsAssertionErrorsrounds updateText(s_sgamesstackspysol.pysundons $!cstut|i|iSdS(N(scmps_sstack_idsother(s_sotherspysol.pys cmpForRedots(s__init__sredosundos cmpForRedo(spysol.pysANextRoundMovees   s ASaveSeedMovecs5vwdZydZ{dZ}dZRS(Ncswx|ii|_dS(N(sgamesrandomsgetSeeds_sseed(s_sgamespysol.pys__init__wscsyz|ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgamespysol.pysredoyscs{||ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgamespysol.pysundo{scs}~t|i|iSdS(N(scmps_sseedsother(s_sotherspysol.pys cmpForRedo}s(s__init__sredosundos cmpForRedo(spysol.pys ASaveSeedMovevs   sAShuffleStackMovecs5dZdZdZdZRS(NcsL|i|_ttd|i|_|i i |_ dS(Ncs |iS(N(scsid(scspysol.pyss( sstacksids_sstack_idstuplesmapscardsscard_idssgamesrandomsgetSeedsseed(s_sstacksgamespysol.pys__init__s!cs|i|i}to||iijptto,|i t t d|i jpt|i i|i|i }t|d}x_|djoN|i id|}||||f\||<||<|d}qW|idS(Ncs |iS(N(scsid(scspysol.pyssii(sgames allstackss_sstack_idsstacks __debug__ssstalonsAssertionErrorscard_idsstuplesmapscardssrandomssetSeedsseedsseqslensnsrandintsjs refreshView(s_sgamesstacksseqsnsjspysol.pysredos$6 %cs|i|i}g}xW|idrG}|i|}t o|i|jpt |i |q.W||_|i i |i|idS(Ni(sgames allstackss_sstack_idsstackscardsscard_idssidscs __debug__sAssertionErrorsappendsrandomssetSeedsseeds refreshView(s_sgamesstackscardssidscspysol.pysundos  ! csIt|i|ip)t|i|ipt|i|iSdS(N(scmps_sstack_idsotherscard_idssseed(s_sotherspysol.pys cmpForRedos(s__init__sredosundos cmpForRedo(spysol.pysAShuffleStackMoves  csV| o dSnx,|dr}|i o dSnq%WdSdS(Nii(scardsscsface_up(scardsscspysol.pys cardsFaceUps  csU| o dSnx+|dr}|io dSnq%WdSdS(Nii(scardsscsface_up(scardsscspysol.pys cardsFaceDowns   cst| o dSn|d}xI|ddr8}|i|||ijo dSn|}q<WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmod(scardssmodsdirsc1sc2spysol.pysisRankSequences     i cst| o dSn|d}x\|ddrK}|i|||ijp|i|ijo dSn|}q<WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc1sc2spysol.pysisAlternateColorSequences   1  cst| o dSn|d}x\|ddrK}|i|||ijp|i|ijo dSn|}q<WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc1sc2spysol.pysisSameColorSequences   1  cst| o dSn|d}x\|ddrK}|i|||ijp|i|ijo dSn|}q<WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc1sc2spysol.pysisSameSuitSequences   1  cst| o dSn|d}x\|ddrK}|i|||ijp|i|ijo dSn|}q<WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc1sc2spysol.pysisAnySuitButOwnSequences   1  cs ttd|SdS(Ncs |i S(N(ssscards(ssspysol.pyss(slensfiltersstacks(sstacksspysol.pysgetNumberOfFreeStacksscsg}xW|drJ}|i p|id i o tSn|i|id qW|o|in|SdS(Nii(scardssstackssssface_upsNonesappendsreverse(sstackssreversescardsssspysol.pysgetPileFromStackss  !  sStackcshdZdZ!dZ%dZ0dZZdZbdZkdZod d d Zze d d d Z d Z d Z dZ dZe dZdZdZe dZdZdZdZdZdZdZdZdZdZdZd d dZdZd d Zd d d d!Z d"Z!d#Z"d$Z#4d%Z$Md&Z%Td'Z&Vd(Z'gd)Z(d*Z)d+Z*d,Z+d-Z,d.Z-d/Z.d0Z/d d1Z0d2Z1d4d3Z2d5Z3d6Z4d7Z5d8Z6d9Z7d:Z8d;Z9d<Z:d=Z;d>Z<d?Z=d@Z>d dAZ?dBZ@dCZAd4d4dDZB3dEZC8dFZDgdGZEse dHZF{e dIZGRS(JNc st|i}|ii|tt|}tt|}||f}||i |<|||f\}}} ||_||_g|_tdd dd dd dd dd dd dd d d d d d d dddddddd |_|ii|to#t|iitijptto#t|iitijptto#t|iitijptto#t|iitijptto#t|iitijptto#t|iitijpt||_||_ |i|_d |_ d |_  t!|i|_" tdt# dt#dt#|_$tdt#|_%tdt#dt#dt#dt#dt#|_&t#|_'|id jo|i d j|_(d |_)d |_*d |_+dS(Nssuitiscolorsranks base_suits base_colors base_ranksdirismodi smax_moves max_accepts max_cardsi?Bsmin_moves min_accepts min_cardssbottomsredeals redeal_imgsncardssroundss redeal_strsmiscid(,slensgames allstackssidsappends_sintsroundsxsysmapkeysstackmapsmodelsviews controllerscardssStructscapsupdates __debug__stypessuitstypessIntTypesAssertionErrorscolorsranks base_suits base_colors base_rankscanvass CARD_XOFFSETs CARD_YOFFSETsMfxCanvasGroupsgroupsNonesimagessitemsstextss top_bottoms is_visiblesis_openscan_hide_cardssmax_shadow_cards( s_sxsysgamescapsidsmapkeysmodelsviews controllerspysol.pys__init__sf                ------           '  cs t|idS(N(sunbind_destroys_sgroup(s_spysol.pysdestructscs2!"|i#|io$|indS(N(s_s prepareViews is_visibles initBindings(s_spysol.pys prepareStack!s  cs%&|i}'t|d|i(t|d|i)t|d|i*t|d|i+t|d|i,t|d|i-t|d|i .t|d|i /t|d |i dS( Ns<1>s ss s s s<3>s<2>s ( s_sgroupsbinds_Stack__clickEventHandlers_Stack__motionEventHandlers_Stack__releaseEventHandlers _Stack__controlclickEventHandlers_Stack__shiftclickEventHandlers_Stack__doubleclickEventHandlers_Stack__rightclickEventHandlers_Stack__middleclickEventHandler(s_sgroupspysol.pys initBindings%s cs01|i|if\}}2t|tijo3|f|_n%5tt t t t ||_6t|tijo7|f|_n%9tt t t t ||_:|i djo;|i |_ <|iidjo=d|_ nm>tt|io?d|_ nG@tt|ioAd|_ n!B|iioCd|_ nnD|i o%E|iiii|iiiif\}}F|i|d}G|i|d}H|d|djo Idd f\|_|_ nJ|d|djo Kd df\|_|_ n]L||ii!d|djoMddf\|_|_ nOddf\|_|_ nP|i"djoGQ|i o1t#|iddjpt#|iddj|_"nT|i$djoIUd|_$Vt#|id|iiiijoWd|_$nnX|i oY|i%ndS(Niiii'ii?Bi(&s_s CARD_XOFFSETs CARD_YOFFSETsoxsoystypestypessIntTypestuplesmapsintsroundscan_hide_cardss is_visiblescaps max_cardssfiltersNonescanvasspreviewsgamesappsimagessCARDWsCARDHsCWsCHsxscxsyscyshide_xshide_ysheightsis_opensabssmax_shadow_cardss prepareBottom(s_soxsoysCWsCHscxscyspysol.pys prepareView0sH$$ -  "G ) csZ[to$|io|iitjpt\|i}]|tj ob^t |i |i |i _d|dt |i_`|iii|ia|ii|_ndS(Nsimagesanchor(s __debug__s_s is_visiblesimagessbottomsNonesAssertionErrorsgetBottomImagesimgsMfxCanvasImagescanvassxsys ANCHOR_NWsaddtagsgroups top_bottom(s_simgspysol.pys prepareBottomZs.c sbcto$|io|iitjptd|iii }et |i |i |i f|i |ig|i |ihdddddd|i_i|iii|ij|ii|_dS(Nsfillssoutlineswidthi(s __debug__s_s is_visiblesitemssbottomsNonesAssertionErrorsgamesappsimagessMfxCanvasRectanglescanvassxsysCARDWsCARDHsaddtagsgroups top_bottom(s_simagesspysol.pysprepareInvisibleBottombs.!csqklto|iidjptmto|iidjptntot|d ptdS(Nissuit(s __debug__s_scapsmin_movesAssertionErrors min_acceptshasattr(s_spysol.pys assertStackks$$csop||f\}}q|ii|r|id|s|iot |idjot|id i |nu|i i |i v|i|w|ox|iny|SdS(Nsunhidei(s_smodelsviewscardssappendscardstkraisesunhidescan_hide_cardsslenshidesitemsaddtagsgroups _positionsupdates updateText(s_scardsunhidesupdatesmodelsviewspysol.pysaddCardos# icsz{||f\}}|tot|idjpt}|tjo~|id }|i i |i |o|i oC|i t|idjo|id i nn|id =n|i i |i |o|i ot|i t|idjoJ||id jp||id jo|id i nnn|ii||o|in|SdS(Niiii(s_smodelsviews __debug__slenscardssAssertionErrorscardsNonesitemsdtagsgroupsunhidescan_hide_cardssremovesupdates updateText(s_scardsunhidesupdatesmodelsviewspysol.pys removeCardzs('  -! cs.|io|id SntSdS(Ni(s_scardssNone(s_spysol.pysgetCards cs|iidjoj|i|ii }xIt||iijo,|i|o |Sn|d=q6WntSdS(Ni(s_scapsmax_movescardsslensmin_moves canMoveCardssNone(s_scardsspysol.pysgetPiles cs2|i|\}}|i||dS(N(s_sgetPositionForscardsxsysmoveTo(s_scardsxsyspysol.pys _positionscsX||f\}}|tj o|io|ii||Snd SdS(Ni(s_smodelsviewseventsNonescardsscanvassfindCard(s_seventsmodelsviewspysol.pys _findCardsc s||f\}}|tjo|i}n|iii}d }xt t |dr}||} | i | i| i |i| i|if} || djo0|| djo|| djo|| djo |}nqlW|SdS(Niiii(s_smodelsviewscardssNonesgamesappsimagessindexsrangeslensiscsxsysCARDWsCARDHsr( s_sxsyscardssmodelsviewsimagessindexsiscsrspysol.pys _findCardXYs   /Gcs dS(N((s_sundosflagsspysol.pys updateModelscs4|i|_|i|_|i|_dS(N(s_sidsclonesgamescap(s_sclonespysol.pys copyModelscs|tjo|id }nt|djo dSn|d i|d i|ii}||iidjo||iiSn|SdS(Niii(scardssNones_slensrankscapsmodsdir(s_scardssdirspysol.pys getRankDirs 'csdSdS(Ni((s_spysol.pysbasicIsBlockedscs;||jp |io dSn|i}t|}||ijp ||ijo dSn|t|i}||i jo dSnx|dr}|i o dSn|i djo|i |i jo dSn|i djo|i |i jo dSn|idjo|i|ijo dSnqW|io|id i Sn|d}|idjo|i |ijo dSn|idjo|i |ijo dSn|idjo|i|ijo dSndSdS(Nii(s from_stacks_sbasicIsBlockedscapslenscardssls min_accepts max_accepts max_cardsscsface_upssuitscolorsranks base_suits base_colors base_rank(s_s from_stackscardsscapslscspysol.pysbasicAcceptsCardss:  #    & & &  & & & cs|io dSn|i}t|}||ijp ||ijo dSnt|i|}||ijo dSnt |SdS(Ni( s_sbasicIsBlockedscapslenscardsslsmin_movesmax_moves min_cardss cardsFaceUp(s_scardsscapslspysol.pysbasicCanMoveCardss  #  csdSdS(Ni((s_s from_stackscardsspysol.pys acceptsCardsscsdSdS(Ni((s_scardsspysol.pys canMoveCardsscsdSdS(Ni((s_spysol.pys canFlipCardscstdfSdS(Ni(sNone(s_sstacksspysol.pys canDropCardsscs dS(N((s_spysol.pys resetGamescs!d|ii|ifSdS(Ns%s(%d)(s_s __class__s__name__sid(s_spysol.pys__repr__scs|ii|dS(N(s_sgamesflipMove(s_spysol.pysflipMovescs9|ii|||d|d||idS(Nsframessshadow(s_sgamesmoveMovesncardssto_stacksframessshadows fillStack(s_sncardssto_stacksframessshadowspysol.pysmoveMoves%cs|ii|dS(N(s_sgames fillStack(s_spysol.pys fillStackscsp|o|iiddn|i|ii o|iin|iidS(Nsflipi(ssounds_sgames playSamplesflipMoves checkForWinsautoPlays finishMove(s_ssoundspysol.pys playFlipMoves   cs|oS||iiijo|iidddn|iidddn |i||d|d| |ii o2 ||iiij o |ii nn |ii dS(Nsdropspriorityismovei sframessshadow(ssoundsto_stacks_sgamesss foundationss playSamplesmoveMovesncardssframessshadows checkForWinsautoPlays finishMove(s_sncardssto_stacksframessshadowssoundspysol.pys playMoveMoves cstSdS(N(sNone(s_spysol.pysgetBottomImagesc s||f\}}|io|i|ifSn|i|if\}}ddt|it|if\}}}} xx|i drh} | |joPn||i|}||i|}|d|}|d| }qW||fSdS(Nii(s_smodelsviewscan_hide_cardssxsyslens CARD_XOFFSETs CARD_YOFFSETsixsiyslxslyscardsscscard( s_scardsmodelsviewsxsysixsiyslxslyscspysol.pysgetPositionFors 3 c s||f\}} |i}!|i pt|djo "dSn#|io]$x(|d d$r}%|i|qnW&x%|d d&r}'|i qWn(|di })|i |i f\}}*ddt|i t|if\}} } } +x|dd+r},|i i|-|i }.|i oa/||i |}0||i| }1|d| }2| d| } 3|i||nq(WdS(Niii(s_smodelsviewscardss is_visibleslenscan_hide_cardsscshidesunhidesitemsxsys CARD_XOFFSETs CARD_YOFFSETsixsiyslxslystkraisesmoveTo( s_smodelsviewscardsscsitemsxsysixsiyslxslyspysol.pys refreshViews0 !    3  cs 45|iidjp|iitjo 6dSn7d}8d}9|iiitj oM:|iii};|djo'<d}=|i o >d}nnn?|o@|t |i }nAdo |ii i oBd}Cx|i dCr}D|ioVEto|itj ptFto'|idjp |idjptn`H|d}Ito|itjptJto'|idjo |idjptqWK|d|}nL|iiid|dS(Niss%ds%Dis %2dstext(s_sgamespreviewstextssncardssNonestsformats text_formatscardsslensappsdebugsvisiblescsisHiddens __debug__s hide_stacksAssertionErrorshide_xshide_ysconfig(s_stsformatsvisiblescspysol.pys updateText4s0)        !5 !5csyMNto||ijptO|i p|i o PdSnQ||id jo RdSnS|iSdS(Nii(s __debug__scards_scardssAssertionErrors is_visiblesface_upsis_open(s_scardspysol.pysbasicShallHighlightSameRankMs !  csTU|i|SdS(N(s_sbasicShallHighlightSameRankscard(s_scardspysol.pysbasicShallHighlightMatchTsc sVW|i|}X|djo YdSnZ|i|}[|i| o \dSn]|iii i }^||||dfg}_x|ii d_r}`x|id`rw}a||jo aqnb|i|ijo bqnc|i|o$d|i||||dfnqWqWe|iiid|ii_f|ii||iii iSdS(Niii(s_s _findCardseventsiscardsscardsbasicShallHighlightSameRanksgamesappsoptshighlight_samerank_colorsscolsinfos allstacksssscsranksappendsstatsshighlight_sameranks_highlightCardsshighlight_samerank_sleep(s_seventsiscardscolsinfossscspysol.pyshighlightSameRankVs(      ,c sgh|i|}i|djo jdSnk|i|}l|i| o mdSnn|iii i }o|}}pg}qd}rxc|iidrrP} s||iiijo| |iiijo tqnux | idur} v| |jo vqnw| i|  o xqny|ii||| | ozd}{| |joa||ii| } }|d| jo}| }qn~|d| jo~| }qnn|i| | | |dfnqWqW|os|o#|iiid|ii_n|i||||df|ii||iii iSndSdS(Niii(s_s _findCardseventsiscardsscardsbasicShallHighlightMatchsgamesappsoptshighlight_cards_colorsscolsc1sc2sinfosfounds allstackssss foundationsscsshallHighlightMatchsindexsjsappendsstatsshighlight_cardss_highlightCardsshighlight_cards_sleep( s_seventsiscardscolsc1sc2sinfosfoundssscsjspysol.pyshighlightMatchingCardsgsF      /     ,  # &csdSdS(Ni((s_seventspysol.pys clickHandlerscs|i o dSn|i|}t|i|d}|djp|djp|i|i o dSn|i|i i |i i i |i i|i iii|i|i i|i|di |i i i dSdS(Nii(s_sis_opens _findCardseventsislenscardss positionssface_upsitemstkraisesgamescanvassupdate_idletasksssleepsappsoptsraise_card_sleepslower(s_seventsis positionsspysol.pysmiddleclickHandlers / (csdSdS(Ni((s_seventspysol.pysrightclickHandlerscs|i|SdS(N(s_s clickHandlersevent(s_seventspysol.pysdoubleclickHandlerscsdSdS(Ni((s_seventspysol.pyscontrolclickHandlerscs8|iiiio|i|SndSdS(Ni(s_sgamesappsoptshighlight_samerankshighlightSameRanksevent(s_seventspysol.pysshiftclickHandlerscsdSdS(Ni((s_seventspysol.pysshiftrightclickHandlerscsL|io8|o|iidn|i||ndS(Nsnomove(sdragscardsssounds_sgames playSamplesmoveCardsBackHandlersevent(s_seventsdragssoundspysol.pysreleaseHandlers  cs3x&|idr}|i|qWdS(Ni(sdragscardsscards_s _position(s_seventsdragscardspysol.pysmoveCardsBackHandlers cs|iio|ii|n|iio tSn|iiio|iiii |n|oL||}|djo)|dj}|i|d|nn||tSdS(Nissound(s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDsdragsstacks cancelDrags start_dragshandlersrssounds startDrag(s_seventshandlers start_dragsrssoundspysol.pys__defaultClickEventHandlers   ics |i||idSdS(Ni(s_s _Stack__defaultClickEventHandlersevents clickHandler(s_seventspysol.pys__clickEventHandlerscs |i||idSdS(Ni(s_s _Stack__defaultClickEventHandlerseventsdoubleclickHandler(s_seventspysol.pys__doubleclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsmiddleclickHandler(s_seventspysol.pys__middleclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsrightclickHandler(s_seventspysol.pys__rightclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventscontrolclickHandler(s_seventspysol.pys__controlclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftclickHandler(s_seventspysol.pys__shiftclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftrightclickHandler(s_seventspysol.pys__shiftrightclickEventHandlerscs|iio|ii|n|iio tSndoQ|ii}|it jot |i |i |_n||_n|i |tSdS(Ni(s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDsdragstimersNones after_idlescanvass keepDragTimerskeepDrag(s_seventsdragspysol.pys__motionEventHandlers  csp|iio|ii|n|iio tSn|i||i|tSdS(N( s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDskeepDrags finishDrag(s_seventspysol.pys__releaseEventHandlers csu|it|iii}|io8t|id}t |i ||i |_ ntSdS(Nf1000.0(s_s_Stack__leaveEventHandlersNonesgamesappsoptsmagnetic_mousesintsmagnetic_mouse_timestsafterscanvass!_Stack__magneticMouseTimerHandlersmagnetic_mouse_timers EVENT_HANDLED(s_seventsoptstspysol.pys__enterEventHandlers  "cs?t|iit|i_t|i_tSdS(N(s after_cancels_smagnetic_mousestimersNonesevents EVENT_HANDLED(s_seventspysol.pys__leaveEventHandlerscsH|ii}|it|o|iii ondS(N(s_smagnetic_mousesevents_Stack__leaveEventHandlersNonesgamesdragsstack(s_seventspysol.pys__magneticMouseTimerHandlersc sto|iiitjpt|i|}|djp|i |i | o dSn|o|ii dn|i|_|i|_|i}|i}|i|_|i|_||_|g|_|i ||_ |ii}|i|i |_x#|idr}|iqHW|i |i f\}} x6|i dr&} | i| i || qW|iii!i"o|ii#i$dt%ndS(Nis startdragscursor(&s __debug__s_sgamesdragsstacksNonesAssertionErrors _findCardseventsis canMoveCardsscardsssounds playSamplesxslastxsyslastysstart_xsstart_ysnoshade_stackssappsimagess createShadowssshadowsssstkraisesSHADOW_XOFFSETsSHADOW_YOFFSETssxssyscardsmoveBysopts dragcursorscanvassconfigs CURSOR_DRAG( s_seventssoundsisgamesdragsimagesssssxssyscardspysol.pys startDrags6'(        cs:|ii}|i o dSnto||ijpt|i|i } |i |i } |p|o |i|_  |i |_  |iiiio|inx)|idr}|i||qWx)|idr}|i||qWnt|_dS(Ni(s_sgamesdragscardss __debug__sstacksAssertionErrorseventsxslastxsdxsyslastysdysappsoptsshades _updateShadesshadowssssmovescardsmoveBysNone(s_seventsdragsdxsdyssscardspysol.pyskeepDrags$ !  csV|ii}t|it|_|io|i|indS(N(s_sgamesdrags after_cancelstimersNoneseventskeepDrag(s_sdragspysol.pys keepDragTimers   c sJ|iiii p|iidjo fSnt|}|djp ||i jo fSn |iii }!|di |di f\}}"x^|dd"rM}#|i |jpt|i ||ijo $fSn%|i }qW&|id|i|f\} } '| o| o(|d })|iddjo)|d}n*|i |i||i |i|f\}}+t|ii||| i,d| dt} -t|ii||.d| dt} /| i|i 0| i|i 1| | fSn2fSdS(Niisimagesanchor(!s_sgamesappsoptsshadowscanvasspreviewslenscardsslsmax_shadow_cardssimagessxsyscxscyscsabss CARD_YOFFSETs getShadowsimg0simg1sCARDWsdxsCARDHsdysMfxCanvasImagesheights ANCHOR_SEss1ss2slowersitem( s_scardssdxsdyslsimagesscxscyscsimg0simg1ss1ss2spysol.pys createShadowss4*   # 0 '1csX34|iiio5|iiiin6t|ii_7t|ii_dS(N(s_sgamesdrags shade_imgsdeletesNones shade_stack(s_spysol.pys _deleteShade3scs89|i}:|ii};|i}<|tjo =dSn>|i|if\}}?|i }@|i d}A|i||if}B|i|i|i||i|f\} } } } Ctdddf\} }}}Dx|dDr}E|tjp ||ijo FqnG|i o>H|i d }I|i|i|i||i|f}n*K|i|i|i||i|f}L| |djp0| |djp|d| jp|d| jo MqnN||ijoOnMP|i|i|i oQ|ii |nS|ii |TqU| |dd| |dd}V||jo-W|||d|df\} }}}nqWX| |i"jo YdSnZ| tjo[|i#\dSn]| |_"^|i$o_|i$i%||nsat&|i'||d|dt(}b||_$c|i)od|i*|i)dnf|i*|i di+dS(Niiɚ;iiisimagesanchor(,s_sgamesappsimagessgetShadesimgsNonesCARDWsCARDHsCWsCHsdragscardsscsgetClosestStacksstacksstackssxsysr1_0sr1_1sr1_2sr1_3ssstackssdiffssxssysssnoshade_stackssr2scanshade_stackss acceptsCardssappendsdiffs shade_stacks _deleteShades shade_imgsmoveTosMfxCanvasImagescanvass ANCHOR_NWsshadowsslowersitem(s_sgamesimagessimgsCWsCHsdragscsstackssr1_0sr1_1sr1_2sr1_3ssstackssdiffssxssysssr2sdiffspysol.pys _updateShade8sV   5!    -)G %1     $  csgh|ii}it|ijt|_k|ilg|_mg|_nx#|i dnr}o|i qbWpg|_ qt|_ rg|_ dS(Ni(s_sgamesdrags after_cancelstimersNones _deleteShadescanshade_stackssnoshade_stackssshadowssssdeletesstackscards(s_sdragssspysol.pys _stopDraggs       csst|iiiio&u|iiid|iiinv|iii }w|i x|i o8yt o|i |jptz|i||ndS(Nscursor(s_sgamesappsopts dragcursorscanvassconfigs top_cursorsdragscopys _stopDragscardss __debug__sstacksAssertionErrorsreleaseHandlersevent(s_seventsdragspysol.pys finishDragss&  !cs{||iiiio&}|iiid|iiin~|iii }|i |i o8t o|i |jpt|i||ndS(Nscursor(s_sgamesappsopts dragcursorscanvassconfigs top_cursorsdragscopys _stopDragscardss __debug__sstacksAssertionErrorsmoveCardsBackHandlersevent(s_seventsdragspysol.pys cancelDrag{s&  !(Hs__init__sdestructs prepareStacks initBindingss prepareViews prepareBottomsprepareInvisibleBottoms assertStacksaddCardsNones removeCardsgetCardsgetPiles _positions _findCards _findCardXYs updateModels copyModels getRankDirsbasicIsBlockedsbasicAcceptsCardssbasicCanMoveCardss acceptsCardss canMoveCardss canFlipCards canDropCardss resetGames__repr__sflipMovesmoveMoves fillStacks playFlipMoves playMoveMovesgetBottomImagesgetPositionFors refreshViews updateTextsbasicShallHighlightSameRanksbasicShallHighlightMatchshighlightSameRankshighlightMatchingCardss clickHandlersmiddleclickHandlersrightclickHandlersdoubleclickHandlerscontrolclickHandlersshiftclickHandlersshiftrightclickHandlersreleaseHandlersmoveCardsBackHandlers _Stack__defaultClickEventHandlers_Stack__clickEventHandlers_Stack__doubleclickEventHandlers_Stack__middleclickEventHandlers_Stack__rightclickEventHandlers _Stack__controlclickEventHandlers_Stack__shiftclickEventHandlers#_Stack__shiftrightclickEventHandlers_Stack__motionEventHandlers_Stack__releaseEventHandlers_Stack__enterEventHandlers_Stack__leaveEventHandlers!_Stack__magneticMouseTimerHandlers startDragskeepDrags keepDragTimers createShadowss _deleteShades _updateShades _stopDrags finishDrags cancelDrag(spysol.pysStacks<   *                                                 / sDealRow_StackMethodscsmeddd ddZeddd ddZddd dZddd d dZRS(Ncs|tjo|iii}n|o|o|iiii o|ii n|i ||||}|o|iin|SdS(N(srowssNones_sgamessssoundsframessappsopts animationssstartDealSamples dealToStackssflipsreversesns stopSamples(s_srowssflipsreversesframesssoundsnspysol.pysdealRows$ iics|tjo|iii}n|o|o|iiii o|ii nt |i t |jo|t |i  }n|i ||||}|o|iin|SdS(N(srowssNones_sgamessssoundsframessappsopts animationssstartDealSampleslenscardss dealToStackssflipsreversesns stopSamples(s_srowssflipsreversesframesssoundsnspysol.pys dealRowAvails$ cs|i p| o dSnto#t|it|jpt|ii|ii}|o t |}|i nx |dr}to|i i ptto||j pt|djo|iii|iijoJ|idd}|i|dd|o|innA|o|ii|n|iid||d|qW|ii|t|SdS(Nisupdateisframes(s_scardssstackss __debug__slensAssertionErrorsgames enterStatesS_DEALs old_statesreverseslistsrsgetCardsface_upsframessmovessstatesS_INITs removeCardscsaddCardsflipsshowFacesflipMovesmoveMoves leaveState(s_sstackssflipsreversesframess old_statesrscspysol.pys dealToStackss* -  ",  #c s |djo |iiidii}n|i p| o dSn|ii |ii }|o t |}|i nd}xE|dr8}to||j ptx|io|d}|o|ii|n|o|id i|jox|iiidri} to| |j pt| i||id o'|iid|| d|PnqMWn$|iid||d|PqWqW|ii||SdS(Niisframes(sranks_sgamesss foundationsscaps base_rankscardssstackss enterStatesS_DEALs old_statesreverseslistsnsrs __debug__sAssertionErrorsflipsflipMoves acceptsCardssmoveMovesframess leaveState( s_sstackssflipsreversesframessranks old_statesnsrssspysol.pysdealToStacksOrFoundationss8        "  (sNonesdealRows dealRowAvails dealToStackssdealToStacksOrFoundations(spysol.pysDealRow_StackMethodss sDealBaseCard_StackMethodscs.d ddZdd ddZRS(Ncs|id }|iddd|ddxs|iiidr]}|i|i _ |o;t d|i}|ii ii|i|fnqHW|SdS(Nisncardssframessupdate_saveinfois base_rank(s_scardsscs dealBaseCardssframessgamesss foundationssrankscaps base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsid(s_sframessupdate_saveinfoscssscapspysol.pysdealSingleBaseCards  *icsto#|iii|iijptto|i ptxk|djoZto|i pt|i d }x||ii i drE}|i o&|i idjp|i i|ijoPnqWtodptt}|i|i _|o;td|i}|iiii|i|fn|i o|ii|n|iid||d||d}qRWdS(Niis base_ranksframes(s __debug__s_sgamesmovessstatesS_INITsAssertionErrors base_cardssncardsscardsscsss foundationsscaps base_suitssuitsNonesranks base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsidsface_upsflipMovesmoveMovesframes(s_sncardssframessupdate_saveinfoscssscapspysol.pys dealBaseCardss(- 7   &(sdealSingleBaseCards dealBaseCards(spysol.pysDealBaseCard_StackMethodss s TalonStackcsdddZdZdZdZdZdZd dZd Zddd Zd Z 5d Z 7dZ RS(Nc sKti||||d|||_||_|i dS(Nscap( sStacks__init__s_sxsysgamescaps max_roundssnum_deals resetGame(s_sxsysgames max_roundssnum_dealscapspysol.pys__init__s  icsd|_g|_dS(Ni(s_srounds base_cards(s_spysol.pys resetGames csti||iii}|djo%to|i|jpt n&to|i|djpt dS(Nii( sStacks assertStacks_sgamesgameinfosredealssns __debug__s max_roundssAssertionError(s_snspysol.pys assertStacks %cs|iiddSdS(Nssoundi(s_sgames dealCards(s_seventspysol.pys clickHandlerscs|i|SdS(N(s_s clickHandlersevent(s_seventspysol.pysrightclickHandlerscst|idjSdS(Ni(slens_scards(s_spysol.pys canDealCardsscs dS(N((s_ssoundspysol.pys dealCardssicsxJ|iidr7}x+|io|iddddq$WqWx&|iidr}|iqeWdS(Nisunhidesupdate(s_sgames allstackssstackscardss removeCards updateText(s_sstackspysol.pysremoveAllCardss  " csti||o|iidjoG|iitj o-d|i }|iii d|nn|o*|i dj} |iitj oy |i|} |tj o||iij o, |iii d| ||i_nddf|}nddf|}|iitj o|iidjoF||iijo,|iii d|||i_nnndS( NisRound %dstextisimagessRedealsStop(sStacks updateTexts_s update_roundssgamespreviewstextssroundssNonesroundstsconfigs update_redeals canDealCardssdealsimagessredealsgetRedealImagessimgs redeal_imgs redeal_str(s_s update_roundss update_redealstsdealsimgspysol.pys updateTexts$! #)csti||i p|iitjo dSn|iitj p|iitj o dSn|i i djo dSn|i i i}|i |i d|i|iddf\}}}|i djo |idjo |i|idj}!|tj o"t|i i||#d|dd|i_$||i_%|iii|i&|iii|i'|ii|_(|idjo')|i|idd f\}}n +t}nn,|i d jo|o-|idjo.|i i i}/t|i i||0d||i_1d |i_2|iii|i3|iii|i4|ii|_nndS( Niiscenteri6simagesanchoriZissi+s(sStacks prepareViews_s is_visiblesimagessbottomsNonesredealstextssgamespreviewsappsxsCARDWsysCARDHscxscyscasgetRedealImagess max_roundssimgsMfxCanvasImagescanvass redeal_imgstkraises top_bottomsaddtagsgroups MfxCanvasTexts redeal_str(s_simagesscxscyscasimgspysol.pys prepareViews<! )  7#'cs56|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_spysol.pysgetBottomImage5scs78|iiiiSdS(N(s_sgamesappsgimagessredeal(s_spysol.pysgetRedealImages7s( s__init__s resetGames assertStacks clickHandlersrightclickHandlers canDealCardss dealCardssremoveAllCardss updateTexts prepareViewsgetBottomImagesgetRedealImages(spysol.pys TalonStacks       sDealRowTalonStackcs9:ddZRS(Ncs:;|id|SdS(Nssound(s_s dealRowAvailssound(s_ssoundspysol.pys dealCards:si(s dealCards(spysol.pysDealRowTalonStack9ssInitialDealTalonStackcs<=dZ?dZRS(Ncs =>dS(N((s_spysol.pys initBindings=scs?@tSdS(N(sNone(s_spysol.pysgetBottomImage?s(s initBindingssgetBottomImage(spysol.pysInitialDealTalonStack<s s OpenStackcsABdZEdZGdZIdZMdZVdZ\dZfdZrd Zvd d Z e e d Z RS( Nc sEBCt|ddddddDti||||d|dS(Nsmax_moveis max_acceptis max_cardsi?Bscap(s kwdefaultscapsStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__BscsEF|i||SdS(N(s_sbasicAcceptsCardss from_stackscards(s_s from_stackscardsspysol.pys acceptsCardsEscsGH|i|SdS(N(s_sbasicCanMoveCardsscards(s_scardsspysol.pys canMoveCardsGscs@IJ|ip|i o KdSnL|id i SdS(Nii(s_sbasicIsBlockedscardssface_up(s_spysol.pys canFlipCardIs csMN|ip|i oOtdfSnP|id }Q|i|oQRxG|dRr:}S||j o|i||oT|dfSnq_WnUtdfSdS(Nii(s_sbasicIsBlockedscardssNones canMoveCardssstackssss acceptsCards(s_sstacksscardsssspysol.pys canDropCardsMs #csbVW|ii|\}}}X||jo |ioY|iZd Sn[dSdS(Nii( s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMove(s_sevents flipstackss dropstackss quickstacksspysol.pys clickHandlerVs   cs\]|i|o ^dSn_|iiiion`|ii|\}}}a||jo<b|i |}c|ii i||ii _d|SnnedSdS(Nii(s_sdoubleclickHandlerseventsgamesappsopts quickplays getAutoStackss flipstackss dropstackss quickstackssquickPlayHandlersnsstatssquickplay_moves(s_sevents flipstackss dropstackss quickstackssnspysol.pysrightclickHandler\s csfg|ii|\}}}h||jo |ioi|ijd Snk||joll|i |ii i \}}m|o=n|iidddo|i||ddpdSnnqdSdS(Nisautodropspriorityissoundi(s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMoves canDropCardssss foundationssto_stacksncardss playSamples playMoveMove(s_sevents flipstackss dropstackss quickstackssto_stacksncardsspysol.pysdoubleclickHandlerfs  ! cs8rs|iiiiot|i|SnudSdS(Ni(s_sgamesappsoptshighlight_cardsshighlightMatchingCardssevent(s_seventspysol.pyscontrolclickHandlerrscs-vw|i}x|tj o}y|i|i|i|if\}}zt |djot |djo'{t i |||d||dSnn}|ii|d|}~| p||jp|i|| o t i |||d|n&|it||ddd|dS(Ni ssoundisframes(sdragscardsseventsNonesxsstart_xsysstart_ysdxsdysabssStacksreleaseHandlers_ssoundsgamesgetClosestStacksstacks acceptsCardss playMoveMoveslen(s_seventsdragssoundscardssdxsdysstackspysol.pysreleaseHandlervs )), ic s|tjo|iii}n|tjo#|iii|iii}ng}|i ox|dr}||j o|i o|i }|o|i ||oQ|iit|||}|i|t| t|||fnnqWnZt|i f\}} | os|i|} | djoM|i | }t|t| jo |i|o |}nnnx|| fdr}| o qnx|drz}||j o|i ||oQ|iit|||}|i|t| t|||fnqWqW|ol|i|i|dddjo6|ddi|dd|dddSnndSdS(Niiiii(s from_stackssNones_sgamessgs dropstackss to_stackssss foundationssmovesscardssgetPilespiles acceptsCardssgetQuickPlayScoreslensscoresappendspile1spile2s _findCardseventsis canMoveCardsssortsreverses playMoveMove( s_sevents from_stackss to_stackssmovesssspilesscorespile1spile2sispysol.pysquickPlayHandlersH#  !< ,    #!8   +( s__init__s acceptsCardss canMoveCardss canFlipCards canDropCardss clickHandlersrightclickHandlersdoubleclickHandlerscontrolclickHandlersreleaseHandlersNonesquickPlayHandler(spysol.pys OpenStackAs       sAbstractFoundationStackcsSdZdZdZdZeedZdZRS(Nc s]t|d|d|dtddddddtti||||f|dS( Nssuits base_suits base_ranksdiris max_accepts max_cardsi ( s kwdefaultscapssuitsACEsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamessuitscapspysol.pys__init__scstdfSdS(Ni(sNone(s_sstacksspysol.pys canDropCardsscsdSdS(Ni((s_seventspysol.pys clickHandlerscsdSdS(Ni((s_seventspysol.pysrightclickHandlerscsdSdS(Ni((s_sevents from_stackss to_stacksspysol.pysquickPlayHandlerscs&|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscaps base_suit(s_spysol.pysgetBottomImages(s__init__s canDropCardss clickHandlersrightclickHandlersNonesquickPlayHandlersgetBottomImage(spysol.pysAbstractFoundationStacks     sSS_FoundationStackcsdZRS(Ncsti||| o dSn|ioE|id i|ii|ii|dijo dSnndSdS(Nii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsdirsmod(s_s from_stackscardsspysol.pys acceptsCardss   6(s acceptsCards(spysol.pysSS_FoundationStackssRK_FoundationStackcs edZdZRS(Nc s,tti|||||f|dS(N( sapplysSS_FoundationStacks__init__s_sxsysgamessuitscap(s_sxsysgamessuitscapspysol.pys__init__scs_ti|to|iitjptto|iit jptdS(N( sSS_FoundationStacks assertStacks_s __debug__scapssuitsANY_SUITsAssertionErrorscolors ANY_COLOR(s_spysol.pys assertStacks$(sANY_SUITs__init__s assertStack(spysol.pysRK_FoundationStackssAC_FoundationStackcsdZdZRS(Nc s?t|d|tti||||t f|dS(Ns base_suit( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgamesANY_SUIT(s_sxsysgamessuitscapspysol.pys__init__scsqti||| o dSn|io1|di|id ijo dSnndSdS(Nii(sSS_FoundationStacks acceptsCardss_s from_stackscardsscolor(s_s from_stackscardsspysol.pys acceptsCardss   "(s__init__s acceptsCards(spysol.pysAC_FoundationStacks sSequenceStack_StackMethodscsAdZdZdZdZdZRS(NcstdS(N(sSubclassResponsibility(s_scardsspysol.pys _isSequencescs|i|SdS(N(s_s _isSequencescards(s_scardsspysol.pys_isAcceptableSequencescs|i|SdS(N(s_s _isSequencescards(s_scardsspysol.pys_isMoveableSequencescs|i|| o dSn|i| o dSn|io|i|id g| o dSndSdS(Nii(s_sbasicAcceptsCardss from_stackscardss_isAcceptableSequence(s_s from_stackscardsspysol.pys acceptsCardss  - cs'|i|o |i|SdS(N(s_sbasicCanMoveCardsscardss_isMoveableSequence(s_scardsspysol.pys canMoveCardss(s _isSequences_isAcceptableSequences_isMoveableSequences acceptsCardss canMoveCards(spysol.pysSequenceStack_StackMethodss     s BasicRowStackcsdZRS(Nc sXt|dd dttti||||f||i i i |_ dS(Nsdiris base_rank( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSET(s_sxsysgamescapspysol.pys__init__s"(s__init__(spysol.pys BasicRowStackssSequenceRowStackcsdZRS(Nc sBt|ddddtti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__s(s__init__(spysol.pysSequenceRowStackss AC_RowStackcsdZRS(Ncs&t||ii|iiSdS(N(sisAlternateColorSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequences(s _isSequence(spysol.pys AC_RowStackss SC_RowStackcsdZRS(Ncs&t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequences(s _isSequence(spysol.pys SC_RowStackss SS_RowStackcsdZRS(Ncs&t||ii|iiSdS(N(sisSameSuitSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequences(s _isSequence(spysol.pys SS_RowStackss RK_RowStackcsdZRS(Ncs&t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequences(s _isSequence(spysol.pys RK_RowStackssFreeCell_AC_RowStackcsdZRS(NcsIt|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_movespysol.pys canMoveCardss(s canMoveCards(spysol.pysFreeCell_AC_RowStackssFreeCell_SS_RowStackcsdZRS(NcsIt|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_movespysol.pys canMoveCardss(s canMoveCards(spysol.pysFreeCell_SS_RowStackssSpider_AC_RowStackcsdZRS(Ncs&t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scardsspysol.pys_isAcceptableSequences(s_isAcceptableSequence(spysol.pysSpider_AC_RowStackssSpider_SS_RowStackcs dZRS(Ncs&  t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scardsspysol.pys_isAcceptableSequence s(s_isAcceptableSequence(spysol.pysSpider_SS_RowStackssYukon_AC_RowStackcs)  dZ dZ dZRS(Nc sB  t|dddd tti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__ scsA  |i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2scolor(s_sc1sc2spysol.pys _isSequence scsh  |i|| o  dSn |io|i|id |d o  dSn dSdS(Nii(s_sbasicAcceptsCardss from_stackscardss _isSequence(s_s from_stackscardsspysol.pys acceptsCards s  - (s__init__s _isSequences acceptsCards(spysol.pysYukon_AC_RowStack s  sYukon_SS_RowStackcs  dZRS(NcsA  |i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2ssuit(s_sc1sc2spysol.pys _isSequence s(s _isSequence(spysol.pysYukon_SS_RowStack ssKingAC_RowStackcs  dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__ s(s__init__(spysol.pysKingAC_RowStack ssKingSS_RowStackcs  dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys SS_RowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__ s(s__init__(spysol.pysKingSS_RowStack ssKingRK_RowStackcs  dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys RK_RowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__ s(s__init__(spysol.pysKingRK_RowStack ss WasteStackcs  RS(N((spysol.pys WasteStack ssWasteTalonStackcs>  dedZ# dZ' dZ/ ddZRS(Nc s; ! tti||||||f|" ||_ dS(N( sapplys TalonStacks__init__s_sxsysgames max_roundssnum_dealscapswaste(s_sxsysgames max_roundssnum_dealswastescapspysol.pys__init__ s(icsC# $ ti|% |itjo& |iii|_ndS(N(s TalonStacks prepareStacks_swastesNonesgamess(s_spysol.pys prepareStack# scs' ( |i}) |ioB* tt|i|i}+ t|i||iijSn,, |io|i |i jo - dSn. dSdS(Nii( s_swastescardssminslensnum_deals num_cardsscaps max_cardssrounds max_rounds(s_swastes num_cardsspysol.pys canDealCards' s  $  c s/ 0 |ii|ii}1 d}2 |i}3 |io4 |o |ii o5 |ii dn6 t t |i|i }7 to't |i||iijpt8 xxt|d8 re}9 |id i o: |ii|n; |iid||dddd< |iqWnz= |io|i|ijoY> |o? |ii ddd n@ t |i}A |ii||d dnB |ii|C |SdS( Nis dealwasteisframesisshadows turnwastespriorityis update_flags(s_sgames enterStatesS_DEALs old_states num_cardsswastescardsssoundsdemos playSamplesminslensnum_deals __debug__scaps max_cardssAssertionErrorsrangesisface_upsflipMovesmoveMoves fillStacksrounds max_roundss turnStackMoves leaveState(s_ssounds old_states num_cardsswastesispysol.pys dealCards/ s*   1 %   i(sNones__init__s prepareStacks canDealCardss dealCards(spysol.pysWasteTalonStack s  sFaceUpWasteTalonStackcsD E dZG dZRS(Ncs0E F t|idjo|id i SdS(Nii(slens_scardssface_up(s_spysol.pys canFlipCardE scs.G H |ioI |ii|ndS(N(s_s canFlipCardsgamesflipMove(s_spysol.pys fillStackG s(s canFlipCards fillStack(spysol.pysFaceUpWasteTalonStackD s sOpenTalonStackcseJ K eiZL eiZM eiZN dZQ dZS dZU dZX dZRS(Nc s<N O t|ddP tti||||f|dS(Nsmax_movei( s kwdefaultscapsapplys TalonStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__N scsQ R dSdS(Ni((s_spysol.pys canDealCardsQ scs0S T t|idjo|id i SdS(Nii(slens_scardssface_up(s_spysol.pys canFlipCardS scs.U V |ioW |ii|ndS(N(s_s canFlipCardsgamesflipMove(s_spysol.pys fillStackU scsAX Y |ioZ ti||Sn\ ti||SdS(N(s_s canDealCardss TalonStacks clickHandlersevents OpenStack(s_seventspysol.pys clickHandlerX s( s OpenStacks canMoveCardss canDropCardssreleaseHandlers__init__s canDealCardss canFlipCards fillStacks clickHandler(spysol.pysOpenTalonStackJ s       s ReserveStackcs] ^ dZa dZRS(Nc sB^ _ t|dddd` tti||||f|dS(Ns max_acceptis max_cards( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__^ scsa b |iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImagea s(s__init__sgetBottomImage(spysol.pys ReserveStack] s sInvisibleStackcs5c d dZh dZk dZm dZRS(Nc scd e d d t|if\}}f t|ddddg ti||||d|dS(Nismax_moveis max_acceptscap( slensgames allstackssxsys kwdefaultscapsStacks__init__s_(s_sgamescapsxsyspysol.pys__init__d s$cs3h i ti|j to|i ptdS(N(sStacks assertStacks_s __debug__s is_visiblesAssertionError(s_spysol.pys assertStackh scs k l dS(N((s_spysol.pys initBindingsk scsm n tSdS(N(sNone(s_spysol.pysgetBottomImagem s(s__init__s assertStacks initBindingssgetBottomImage(spysol.pysInvisibleStackc s   s StackWrappercso p dZu dZRS(Nc sgp q tot|tijptr tot|tpts ||_t ||_ dS(N( s __debug__stypes stack_classstypess ClassTypesAssertionErrors issubclasssStacks_scap(s_s stack_classscapspysol.pys__init__p s'! c sNu v |ii}w tt|f|x t|i|||f|SdS(N( s_scapscopyscsapplys kwdefaults stack_classsxsysgame(s_sxsysgamescapscspysol.pys__call__u s(s__init__s__call__(spysol.pys StackWrappero s sWeakStackWrappercsy z dZRS(Nc s?z { tt|f|i| t|i|||f|SdS(N(sapplys kwdefaultscaps_s stack_classsxsysgame(s_sxsysgamescapspysol.pys__call__z s(s__call__(spysol.pysWeakStackWrappery ssFullStackWrappercs} ~ dZRS(Nc s)~  t|i|||f|iSdS(N(sapplys_s stack_classsxsysgamescap(s_sxsysgamescapspysol.pys__call__~ s(s__call__(spysol.pysFullStackWrapper} ss HintInterfacecs   dZ edZRS(Ncs   dS(N((s_sgameslevelspysol.pys__init__ scs  gSdS(N((s_s taken_hintspysol.pysgetHints s(s__init__sNonesgetHints(spysol.pys HintInterface s s AbstractHintcs  dZ dZ dZ dfdYZ dZ dZ eedZ d Z d Z  d Z  ed Z  d Z  dZ  dZ dZ e Z dZ edZ dZ dZ dZRS(Ncss  ||_ ||_ d|_ |idjo d|_n t|_ g|_ |idS(Nii'(sgames_slevelsscore_flatten_valuesNones bonus_colors_AbstractHint__clonessreset(s_sgameslevelspysol.pys__init__ s     cs  |idS(N(s_sreset(s_spysol.pys__del__ scs,  g|_ d|_ |idS(Ni(s_shintss max_scores_AbstractHint__destructClones(s_spysol.pysreset s  s AClonedStackcs  dZRS(Ncs3  |i|_ |i| ||_dS(N(sstacks __class__s_s copyModels stackcardsscards(s_sstacks stackcardsspysol.pys__init__ s(s__init__(spysol.pys AClonedStack scs6  |i||} |ii| |SdS(N(s_s AClonedStacksstacks stackcardssss_AbstractHint__clonessappend(s_sstacks stackcardsssspysol.pys ClonedStack scsK  x2|id r"} |i|_ t|qW g|_dS(Ni(s_s_AbstractHint__clonessss AClonedStacks __class__sdestruct(s_ssspysol.pys__destructClones s  c s  |djo  dSn t|i||_ |idjo ||i|i}n |tjo |i}n to'|tjpt |djpt  t |i  } t|||||||f} |i i|dS(Nii(sscoresmaxs_s max_scoresscore_flatten_values text_colorsNonesBLACKs __debug__s forced_moveslensAssertionErrorshintsspossintsncardss from_stacksto_stacksahsappend( s_sscoresncardss from_stacksto_stacks text_colors forced_movespossahspysol.pysaddHint s 1$csA  |i} |i |i |i |SdS(N(s_shintssresetssortsreverse(s_shintsspysol.pys __returnHints s     iics5  |i |i} |o|do |dgSn |idjot xj|id rZ} |ioD |i|i d|| |i djo |i SnnqeWn |i  |idjo: |i o& |i|i d|iitnn |i SdS(Niiiii_(s_sresetsgames taken_hintslevels allstackssrs canFlipCardsaddHints SCORE_FLIPs_AbstractHint__returnHintss computeHintss canDealCardss SCORE_DEALssstalonsNone(s_s taken_hintsgamesrspysol.pysgetHints s     *cs   dS(N((s_spysol.pys computeHints scs=  ||jp|i|| o  dSn dSdS(Nii(s from_stacksto_stacks acceptsCardsspile(s_s from_stacksto_stackspilesrpilespysol.pys_defaultShallMovePile s$ csv  ||jp|i|| o  dSn |i|d|} |i||o  dSn dSdS(Nis stackcardsi(s from_stacksto_stacks acceptsCardsspiles_s ClonedStacksrpilesrr(s_s from_stacksto_stackspilesrpilesrrspysol.pys_cautiousShallMovePile s $  cs  ||jp|i|| o  dSn |idjo= |i|d|} |i||o  dSnn dSdS(Niis stackcardsi( s from_stacksto_stacks acceptsCardsspiles_slevels ClonedStacksrpilesrr(s_s from_stacksto_stackspilesrpilesrrspysol.pys_cautiousDemoShallMovePile s$ cs  to||j pt dS t} |i xh|d r[} xO|d r;} ||j o% |i ||go PnnqaW dSqLW dSdS(Nii( s __debug__s from_stacksstackssAssertionErrorspilescardssreversescardsss acceptsCards(s_s from_stacksstackss stackcardsscardsscardssspysol.pys_canDropAllCards s     isblacksredsblue(s__init__s__del__sresets AClonedStacks ClonedStacks_AbstractHint__destructClonessNonesaddHints_AbstractHint__returnHintss SCORE_FLIPs SCORE_DEALsgetHintss computeHintss_defaultShallMovePiles_cautiousShallMovePiles_cautiousDemoShallMovePiles shallMovePiles_canDropAllCardssKINGsKsBLACKsREDsBLUE(spysol.pys AbstractHint s*               s DefaultHintcs  dZ dZ dZ dZ dZ!dZ!dZ !dZ !d Z !d Z  !d Z !d Z $!d Z ,!dZ E!dZP!dZ\!dZ^!dZw!eZx!dZ!dZ!dZ!dZRS(Ncs  dSdS(Ni((s_spysol.pys_preferHighRankMoves si,iidcsW  to|pt d} |oL |i|d|} |i |i i i do |i }nn |io|id i|dijo# ||id|di}n |io# ||id|di}nQ |o'!||i|i|d i}n !||id|di}!|SdS(Nis stackcardsi(s __debug__spilesAssertionErrorsbonussrpiles_s ClonedStacksrsrrs canDropCardssgamesss foundationssBONUS_DROP_CARDstscardsssuitsBONUS_SAME_SUIT_MOVEsranks_preferHighRankMovessBONUS_NORMAL_MOVEsK(s_srstspilesrpilesbonussrrspysol.pys_getMoveCardBonus s   ,## 'icsL!!to|o|pt!t|it|d}!|SdS(Ni( s __debug__spilesrpilesAssertionErrorsmaxs_sBONUS_FLIP_CARDslensbonus(s_srstspilesrpilesbonusspysol.pys_getFlipSpecialBonus!si(#iics1 ! !| o!|iSn!|d i o!|i||||Sn!|i||i i i d|o$!|i |_ !|i|iSn!|i|o~!xt|i i id!r^}!||jp|i o !qn!|i||o!|i|_ !|iSnqWn!dSdS(Nis stackcardsi(srpiles_sBONUS_CREATE_EMPTY_ROWsface_ups_getFlipSpecialBonussrstspiles_canDropAllCardssgamesss foundationssREDs bonus_colorsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs canMoveCardssrowssxscardss acceptsCardssBLUE(s_srstspilesrpilesxspysol.pys_getMoveSpecialBonus !s  %  c s!!to|pt!||_!|i||||} !to%d|jo djnpt!!|i ||||}"!to%d|jo djnpt#!||||ifSdS(Nii(#i(s __debug__spilesAssertionErrorscolors_s bonus_colors_getMoveSpecialBonussrstsrpilesb1s_getMoveCardBonussb2sscore( s_sscorescolorsrstspilesrpilesb1sb2spysol.pys_getMovePileScore!s //cs$!%!to|pt&!||_'!d}(!|io (!d}n)!|i ||||}*!to%d|jo djnpt+!|||ifSdS(Ni0uiyii( s __debug__spilesAssertionErrorscolors_s bonus_colorsscorestscardss_getMoveCardBonussrsrpilesb2(s_sscorescolorsrstspilesrpilesb2spysol.pys_getMoveWasteScore$!s   /c s,!-!to||j pt.!|djo/!d|fSn0!|i}1!|d }2!|i i djo3!t |i}nR5!|i |i i |i i}6!||i idjo7!||i i}n8!t|djo 9!d}n:!||iiijo ;!d}np!|i||iiid|d o?!d }@!|i}n B!d }C!||i|i }D!||fSdS( NiiHkiii`giaixcs stackcardsi_iP(s __debug__stsrsAssertionErrorsncardsscolorscardsspilescscaps base_rankslensdsranksmodsabssscores_sgamessgs talonstackss_canDropAllCardssss foundationssREDsK( s_sscorescolorsrstsncardsspilescsdspysol.pys_getDropCardScore,!s,     *  csE!F!|i}G!|i|ii|iiH!|i o |idjo#I!|i |ii|ii nJ!|i o |idjo,K!|i |ii |ii|iinL!|i o#M!|i |ii|ii nN!|i o#O!|i|ii |iindS(Ni(s_sgamesstep010ssgs dropstackssssrowsshintsslevelsstep020s foundationssstep030sstep040s reservestackssstep050(s_sgamespysol.pys computeHintsE!s #,#c sP!Q!x|dQ!r}R!|i|iii\}}S!|oqT!dt f\}}U!|i |||||\}}V!|i |||||W!|djoX!PnnY!x@|i|dY!r*}Z!|o[!|i|||nqWqWdS(Nii_(s dropstackssrs canDropCardss_sgamesss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHintsstep010b_getPilesspilesstep010_movePilesrows( s_s dropstackssrowssrstsncardssscorescolorspilespysol.pysstep010P!s ! $   cs\!]!|ifSdS(N(sstacksgetPile(s_sstackspysol.pysstep010b_getPiles\!sc s^!_!t|}`!t|i}a!to%d|jo |jnptb!|i|| }c!d}d!||i i i j}e!x"|de!r} f!dtf\} } g!|i|| || o h!qni!|o+j!|i| | || ||\} } nl!| i oDm!||jo n!qno!|o p!qnq!d} r!d}n t!d} u!|i| | || ||\} } v!|i| ||| | qWdS(Niii`i8(slenspileslpsrscardsslrs __debug__sAssertionErrorsrpilesempty_row_seens_sgamessgs talonstackss r_is_wastesrowsstsNonesscorescolors shallMovePiles_getMoveWasteScores_getMovePileScoresaddHint( s_srspilesrowsslpslrsrpilesempty_row_seens r_is_wastestsscorescolorspysol.pysstep010_movePile^!s./    +      'csKx!y!x>|dy!r1}z!x%|i|dz!r}{!| pt|djo |!q-n}!g}~!d}!x|d!r}!|i |d|g}!|i |\} } !| o | |j o>!to| djpt!|i|| | |fn!|d}q|W!x|d!r} !| d}!|| dd} !to|i| pt!x|d!r} !| |jp| i||  o !qn!d}!|d|i|ii}!dd| d|| d|itf}!|i|t| || |id |qWq*Wq-WqWdS( Niis stackcardsiii@ii?Bs forced_move( srowssrs_sstep020_getPilesspileslens drop_infosiscs ClonedStacksrrs canDropCardss foundationssstacksncardss __debug__sAssertionErrorsappendsdissub_piles canMoveCardssts acceptsCardssscoresKsgetCardsranksBLUEsNonesforcesaddHintsRED(s_srowss foundationssrspiles drop_infosiscsrrsstacksncardssdissub_pilestsscoresforcespysol.pysstep020x!s:         ! $  !)cs!!x|d!r}!|i}!| p|i|g o !qn!x|d!r}!||jp|i||g o !q\n!|i |d|i |g}!x)|d!r}!||jo !qn!|i} !| o !qn!|i||  o !qn!|i t|i t|  } !|i |d| } !| i|| o !qn!d|i} !ddt| |||itf} !|i| d|||id| qWq\WqWdS(Nis stackcardsi Ni?Bis forced_move(s foundationssssgetCardscards canMoveCardssrowssts acceptsCardss_s ClonedStackscardsstts dropstackssrsgetPilespileslensrpilesrrsranksscoresBLUEsNonesforcesaddHint(s_s foundationssrowss dropstacksssscardststtsrspilesrpilesrrsscoresforcespysol.pysstep030!s4   ' "     # 'c sr!!| o !dSn!xO|d!rB}!|i}!| p|i|g o !q%n!|g}!|it|it| }!|i |d|}!x|d!r}!||jp|i|| o !qn!|i||o !qn!d} !|i| t||||\} } !|i| t|||| !PqWq%WdS(Nis stackcardsi'(s reservestackssrowssrsgetCardscards canMoveCardsspilescardsslensrpiles_s ClonedStacksrrsts acceptsCardssscores_getMovePileScoresNonescolorsaddHint( s_srowss reservestackssrscardspilesrpilesrrstsscorescolorspysol.pysstep040!s(     # $   '"cs!!| o !dSndS(N(s reservestacks(s_s reservestackssrowsspysol.pysstep050!s (s_preferHighRankMovessBONUS_DROP_CARDsBONUS_SAME_SUIT_MOVEsBONUS_NORMAL_MOVEs_getMoveCardBonussBONUS_FLIP_CARDs_getFlipSpecialBonussBONUS_CREATE_EMPTY_ROWsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs_getMoveSpecialBonuss_getMovePileScores_getMoveWasteScores_getDropCardScores computeHintssstep010sstep010b_getPilessstep010_movePilesstep020_getPilessstep020sstep030sstep040sstep050(spysol.pys DefaultHint s.                    sCautiousDefaultHintcs!!eiZ!dZRS(Ncs!!dSdS(Ni((s_spysol.pys_preferHighRankMoves!s(s DefaultHints_cautiousShallMovePiles shallMovePiles_preferHighRankMoves(spysol.pysCautiousDefaultHint!s sKlondikeType_Hintcs!!RS(N((spysol.pysKlondikeType_Hint!ssYukonType_Hintcs!!dZRS(NcsX!!|i}!g}!x,!|o!!|i|!|d}q!W!|SdS(Ni(sstacksgetPilespspilessappend(s_sstackspspilesspysol.pysstep010b_getPiles!s  (sstep010b_getPiles(spysol.pysYukonType_Hint!ssFreeCellType_Hintcs!!RS(N((spysol.pysFreeCellType_Hint!ss GolfType_Hintcs!!RS(N((spysol.pys GolfType_Hint!ssSpiderType_Hintcs!!RS(N((spysol.pysSpiderType_Hint!ssFreeCellSolverWrappercs6!!defdYZ!dZ"dZRS(NsFreeCellSolver_Hintcs)!!dZ!dZ!dZRS(Ncs !!d|id|iSdS(Ns A23456789TJQKsCSHD(scardsrankssuit(s_scardspysol.pysstr1!scs$!!d|idd|iSdS(NsCSHDs-s A23456789TJQK(scardssuitsrank(s_scardspysol.pysstr2!sc s!!d}!d}!xO|iiid!r9}!|io&!|d|i|id }nq*W!|o!|d|d}n!d}!x\|iiid!rF}!|io&!|d|i |id }n!|d}qW!|o!|d|d}n!xu|iii d!r_}!d}!x0|id!r }!||i |d}qQW!|t i |d}q0W!tti|i}!y!|i|}Wn!!t}nX!|o!t|}!to|d djpt!t}!|iii|iii |iii} !xt!|djoc!|d }!tid |||d !} !d d| d| | d| | d t|f}qSW!|ii |ndS( Nsis isFounds:s s -sFC:isZ>$d?Z?$d@Z@$dAZA$d dBZB$dCZC$eDZE$dDZF$dEZG$dFZH$dGZI$dHZJ$dIZK$dJZL$ddKZM$dLZN$ddMZO%dNZP=%dOZQB%dPZRG%dQZSJ%dRZTQ%dSZUW%edTZVY%d d d d dUZWf%dVZX%d dWZY%dXZZ%dZdYZ[%dZd[Z\%d\Z]%d]Z^%d^Z_%d_Z`%d`Za%daZb%dbZc%edcZd%ddZeddZe&d ddeZf+&edfZg2&dgZh&dhZi&diZj&djZk&dkZl&dlZm&dmZn&dnZo&doZp&d d dpZq'dqZr'd drZs 'dsZt'dtZu'duZv'dvZw"'dwZxG'dxZy['dyZzm'd dzZ{'d d d{Z|'d|Z}'d}Z~'d d~Z'dZ'dZ'dZ>(d dZH(ddZd(dZf(dZh(dZRS(Niiiiii i0i@iPic s^""d|_"t|_"||_"|i|_"to|idjpt"d|_"t |_ "t |_ "g|_ "h|_"g|_"t|_ "tdt""dt#"dg$"dg%"dg&"dg|_("tdg*"d g+"d g,"d g-"d g|_/"td g1"dg2"dg|_4"|idS(Nistalonswastes foundationssrowssreservess internalss openstackss talonstackss dropstackss reservestackss hp_stackssinfos remainingsdata(s_spreviewsNonesrandomsgameinfosids __debug__sAssertionErrorsbusysVERSIONsversions VERSION_TUPLEs version_tuplescardssstackmaps allstackss demo_logosStructssssgsregionssreset(s_sgameinfospysol.pys__init__"s6   !                  csF5"6"td}7"|i}8"|i|9"|idt:"|i i t d|i ;"|i i t d|i <"|iiio <"|iiiiddn="|i>"td|ii|i_?"td|ii|i_@"t|i|_A"t|ii|i_B"t|ii|i_C"t|ii|i_D"t|ii|i_E"t|ii|i_F"t|ii|i_G"t|ii|i_H"t|ii|i_I"t|ii|i_J"x0|idJ"r }K"|i!L"|i"qWM"|ii#oRN"t$ot%|ii#d pt&O"t$ot%|ii#d pt&nP"|i'Q"|i( o%R"|i)d |iii|_(nS"|i*T"|i i+d U"|i,i-|i.|i/V"t0i0|i1_2W"||_dS( Ns Game.createscursors - sstepics>"|ii|iijS(N(ssscaps max_accepts min_accept(ssspysol.pys>"scs?"|iidjS(Ni(ssscapsmax_move(ssspysol.pys?"sisrounds max_roundssprogresss(3sTimerstimers_sbusysold_busys_Game__createCommonsapps setCursors CURSOR_WATCHstopswm_titlesPACKAGEs getTitleNames wm_iconnamesintrosprogresssupdates createGamesfilterssgs openstackss dropstackss hp_stacksstuples allstackssss foundationssrowssreservess internalss talonstackss reservestackssstacks prepareStacks assertStackstalons __debug__shasattrsAssertionErrorsoptimizeRegionsscardss createCardss initBindingss wm_geometryscanvasssetInitialSizeswidthsheightstimesstatss update_time(s_sappstimersold_busysstackspysol.pyscreate5"sH !!  !!  '+ % csRX"Y"t|id|iZ"t|id|i["t|id|idS(Ns<1>s<2>s<3>(sbinds_scanvass clickHandler(s_spysol.pys initBindingsX"scs#\"]"d|_^"||__"|i|_`"|i|_a"d|_b"tdtd"dte"ddf"ddg"dth"d gi"d gj"d tk"d tl"d gm"dg |_o"|i i tjop"|ii i |i _ nq"tdts"dtt"dtu"dtv"dt|_ dS(Nisseventstimersstart_xisstart_ysstackscardssshadowss shade_stacks shade_imgscanshade_stackssnoshade_stackssinfoshelpsmiscsscores base_rank(s_sbusysappstopscanvassfilenamesStructsNonesdragsgstatss start_playersoptsplayerstexts(s_sappspysol.pys__createCommon\"s.                 csx"y"td}z"|i}{"|i||"td|ii |_ }"|i ~"t d|i i |i _ "t d|i i|i _"x0|id"r }"|i"|iqW"|i"|i|_"||_dS(NsGame.createPreviewics~"|ii|iijS(N(ssscaps max_accepts min_accept(ssspysol.pys~"scs"|iidjS(Ni(ssscapsmax_move(ssspysol.pys"si(sTimerstimers_sbusysold_busys_Game__createCommonsappsmaxscanvasspreviews createGamesfilterssgs openstackss dropstackss hp_stackss allstackssstacks prepareStacks assertStacksoptimizeRegionss createCardsscards(s_sappstimersold_busysstackspysol.pys createPreviewx"s  !!   csf""x#|id"r}"t|qW"x0|id"r }"|i"t|q;WdS(Ni(s_scardssobjsdestructs allstacks(s_sobjspysol.pysdestruct"s   cs""d|_"t|_"tdt"dd "dd |_"tdg|_"tdt"dd"d d |_"td d "d d "d d "dd "dd "dd "dd "dd "dd "dd "dd "dd "dd "dti"dd|_ "|i "|o "dSn"tdd "dd "dd "dd "dd "d|i "d ti"d!d"d"t |_ "td#h"d$d|_dS(%Nsslistsindexislevels stack_capssstackss talon_roundsncardsishintsshighlight_pilesshighlight_cardsshighlight_sameranks undo_movess redo_movess total_movess player_movess demo_movessautoplay_movessquickplay_movessgoto_bookmark_movess demo_updateds update_times elapsed_timef0.0sholdedsloadedssaveds restartedsupdateds start_timestotal_elapsed_times start_players bookmarksscomment(s_sfilenamesNonesdemosStructshintsssaveinfosloadinfostimesstatss startMovessrestartsU_PLAYsgstatss gsaveinfo(s_srestartspysol.pysreset"sL                              cs""|ii|iSdS(N(s_sappsgetGameTitleNamesid(s_spysol.pys getTitleName"scs9""t|i}"|o"d|Sn"|SdS(Ns#(sstrs_srandomsssformat(s_sformatssspysol.pys getGameNumber"s cs:""tt|tt|f\|_|_dS(N(sintsroundswshs_swidthsheight(s_swshspysol.pyssetSize"scse""|io"|iid|n"|io |iio"|iiid|ndS(Nscursor(s_scanvassconfigscursorsappstoolbars setCursor(s_scursorspysol.pys setCursor"s cs""|idf\}|_"|idt"|i"|id|"|i"|i |"|i "t o)t |iii|iijpt"x#|id"r}"|iqW"|i"|id|iii"|id|idddd"|id |iii|iii|i"|i o3"t |i!d |iii""|i!i#n"|i$"|i%|i&_'"|i("|i)"x#|id"r}"|iqW"|i"|idd"|i*"|i$"|o "|i,"d|i_-n"|id|ii."t/i/|i_0"||_dS( Niscursorsrestartisplayers gamenumbersformatsmovessstatss maximized(1s_sbusysold_busys setCursors CURSOR_WATCHs disableMenussresetsrestarts resetGames createRandomsrandomsshuffles __debug__slenssstalonscardssgameinfosncardssAssertionErrors allstackssstacks updateTexts updateStatussappsoptsplayers getGameNumbersstatssgetStatssidspreviewswm_mapstops wm_maximizeds busyUpdates stopSamplessS_INITsmovessstates startGames startMovess updateMenussautoplaysautoPlays player_movess top_cursorstimes update_time(s_srandomsrestartsautoplaysold_busysstackspysol.pysnewGame"sF   3  %1         c s=""|idf\}|_"|o"|in"|i"|i|_"|i|_"|i|_"|i |_ "|i |_ "|i |_ "|i |_ "|i |_ "|i|_"|ii|ii_"to)t|it|iijpt"xtt|id"r}"x{|ii|d"rd}#|\}}#|i|}#|o#|i n#|i!#|i|i"|qRWq3W#x<|i i#d#r)\} } #|i| i%i&| i'qW #|i(| #x#|id #r}  #| i*q"W #|i* #|i+d|i,i-i.#|i+d|i/ddd|i i0#|i+d|i,i i1|i,i-i.|i2#|i3 o0#|i4#t5|i6d|i,i-i7n#|i8d |i,i9#t:i:|i _;#||_dS( Niisplayers gamenumbersformatsmovessstatss maximizedscursor(<s_sbusysold_busysresets resetGamesgamesfilenamesversions version_tuplesrandomsmovessstatssgstatsssaveinfos gsaveinfosloadinfos talon_roundssstalonsrounds __debug__slens allstackssstackssAssertionErrorsrangesistscard_idsface_upscardsscardsshowFacesshowBacksaddCards stack_capssstack_idscapsupdates__dict__s_restoreGameHooksstacks updateTexts updateStatussappsoptsplayers getGameNumbersindexsgetStatssidspreviews updateMenusswm_mapstops wm_maximizeds setCursors top_cursorstimes update_time( s_sgamesresetsold_busysistscard_idsface_upscardsstack_idscapsstackspysol.pys restoreGame"sT  3    !  +1 #cs##|idf\}|_#t|}#t|}#|i||i }#t o|i |i jpt #|i|dd#t|#||_dS(Nisreseti(s_sbusysold_busysStringIOsbookmarksfiles Unpicklersps _undumpGamesappsgames __debug__sidsAssertionErrors restoreGamesdestruct(s_sbookmarksold_busysfilespsgamespysol.pysrestoreGameFromBookmark#s$ cs# #t|i_!#|iii"#x#|id"#r}##|i q4W$#|i djoP%#xF|i i |i i fd%#r'}&#|o'#|iddnqWndS(Niistexts(sNones_shintsslistssstalonsremoveAllCardss allstackssstacks resetGamespreviewstextssscores base_rankstsconfig(s_sstackstspysol.pys resetGame#s   cs(#)#d}*#||ijo+#|dB}n,#|iii|iij o-#|dB}n.#|tj oX/#|i|iij o0#|dB}n+1#|i |ii jo2#|dB}nn3#|SdS(Niiii( sfsids_sappsnextgamescardsetsrandomsNones __class__s initial_seed(s_sidsrandomsfspysol.pys nextGameFlags(#s c s94#6#|i7#|ok8#|i|if\}}9#t}:#t|d};#|i |dd<#|i |i i _n=#|djo>#|i dtn?#||i i _@#||i i _A#||i i _B#||i i _C#||i i _D#|idtdtdtE#|iidS(Nisbookmarkiscursorsmovess gamenumbersstats(s_s updateTimesbookmarksidsrandomsStringIOsfilesPicklersps _dumpGamesgetvaluesappsnextgames setCursors CURSOR_WATCHs loadedgames startdemosholdgames updateStatussNonestopsmainquit( s_sidsrandoms loadedgames startdemosbookmarksholdgamesfilespspysol.pysquitGame4#s    csfF#G#|io H#dSnI#|iiJ#|o K#dSnL#|o M#dSnN#|oQO#|iidjo|i djoP#|i i d|i _ nQ#dSnR#|i S#|ii }T#|ioU#|i}V#|oiW#|ii|id||i|i<X#|ii|id||i|i<Y#|i||_nndS(Nii(s_spreviewsapps wm_save_statesholdgamesbookmarksrestartsmovessindexsgetPlayerMovessgstatss restarteds updateStatssstatssshallUpdateBalancesgetGameBalancesbs total_balancesgetsidssession_balancesgameid_balance(s_srestartsbookmarksholdgamesstatssbspysol.pysendGameF#s&       )   ))cs6Z#[#|idd\#|iddd|idS(Nsrestartisrandom(s_sendGamesnewGamesrandom(s_spysol.pys restartGameZ#scs]#^#|tjo_#t|ito,`#|ii}a#|iii |nb#xQb#doFc#|iii}d#|iii}e#|djof#Pnq[Wg#t||_h#|ii |i_ nj#||_k#|ii dS(Nil_(srandomsNones isinstances_s LCRandom64sgetSeedsseedsapps gamerandomssetSeedsdummys ORIGIN_RANDOMsoriginsreset(s_srandomsseedsdummyspysol.pys createRandom]#s   cs@l#m#|ii}n#||joo#||i_np#|SdS(N(s_smovessstates old_state(s_sstates old_statespysol.pys enterStatel#scsq#r#||i_dS(N(s old_states_smovessstate(s_s old_statespysol.pys leaveStateq#scs^s#t#td}u#|i}v#d}w#|ox#d|i|i}ny#g}z#d}{#|i i i |i i if\}}|#xt|id|#rj} }#x|id}#r} ~#x|id~#r} #|i|| | | d|d|} #| tjo #qn#|i| #|d}#|o#|id|nqWqW#t|i} #x|id#r} #|i|| | | d|d|} #| tjo #q{n#|i| #|d}#|o#|id|nq{WqW#|o#|idd n#tot||ijpt#|SdS( NsGame.createCardsif100.0sxsyisstepspercentid( sTimerstimers_sgameinfosgispstepsprogressspercentsncardsscardssidssstalonsxsysrangesdeckssdeckssuitsssuitsrankssranks _createCardscardsNonesappendsupdateslens trump_suitstrumpss __debug__sAssertionError(s_sprogressstimersgispstepscardssidsxsysdeckssuitsrankscards trump_suitspysol.pys createCardss#sF     '   '    '    'c s/##t||||d|d|d|SdS(Nsgamesxsy(sCardsidsdeckssuitsranks_sxsy(s_sidsdeckssuitsranksxsyspysol.pys _createCard#scs1##t|i}#t|itot|djor#g}#xVtdd#rC}#x7ddddfd#r}#|i |||qzWqYW#|}n#|ii #|ii |#|i|}#xB|d#r5}#|iii|dd#|iddqWdS(Ni4i ii'isupdatesunhide(slists_scardss isinstancesrandoms LCRandom31slensfcardssrangesisjsappendsresetsshuffles _shuffleHookscardssstalonsaddCardsshowBack(s_scardssfcardssisjscardspysol.pysshuffle#s )      cs##g}#|ii#|ii|ii}#xlt|iid#rS}#||}#t |i|||!}#|ii |#|i|qMW#|i|}#xB|d#r5}#|iii|dd#|iddqWdS(Nisupdatesunhide(scardss_srandomsresetsgameinfosncardssdeckssnsrangesdecksislists deck_cardssshufflesextends _shuffleHookscardssstalonsaddCardsshowBack(s_scardssnsdecksis deck_cardsscardspysol.pysshuffleSeparateDecks#s    cs##|SdS(N(scards(s_scardsspysol.pys _shuffleHook#scs0##|i|||\}}#||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscardsspysol.pys_shuffleHookMoveToTop#si?Bcs0##|i|||\}}#||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscardsspysol.pys_shuffleHookMoveToBottom#sc s##gt|f\}}#x|d#r}}#||\}}#|oK#|i|#|i |||f#t||jo#Pnn#|d}q+W#|i #|i #t d|} #|| fSdS(Niics #|dS(Ni(sitem(sitemspysol.pys#s(slenscardsssitemssiscsfuncsselects sort_ordersremovesappendsncardsssortsreversesmapsscards( s_scardssfuncsncardsssitemssiscsselects sort_ordersscardsspysol.pys_shuffleHookMoveSorter#s     csk##|io#|in#|io #dSn#|iio#|iiin#dSdS(Nii(s_sdemosstopDemosbusysdragsstacks finishDrag(s_spysol.pys _finishDrag#s  csk##|io#|in#|io #dSn#|iio#|iiin#dSdS(Nii(s_sdemosstopDemosbusysdragsstacks cancelDrag(s_spysol.pys _cancelDrag#s  cs,##|i o#|iiindS(N(s_spreviewsappsmenubars updateMenus(s_spysol.pys updateMenus#scs,##|i o#|iiindS(N(s_spreviewsappsmenubars disableMenus(s_spysol.pys disableMenus#scs,##|io#|in#tSdS(N(s_sdemosstopDemosEVENT_PROPAGATE(s_sargsspysol.pys clickHandler#s c s##|io #dSn#|ii|iif\}}#x|id#r\}}#|djo#|t jo+#|o#|i ddn#qNn#t |tijo+#|o#|i d|n#qNnn#|djo#|t jo+#|o#|i ddn#qNn#t |tijo+#|o#|i d|n#qNnn#|djo#|t jo+#|o#|i ddn#qNn#t |tijo/#|o#|i dd|n#qNn#t |tijo+#|o#|i d|n#qNnn#|djo#|t jo+#|o#|i ddn#qNn#t |tijoh#|oT#t|}#|iiio$|i dd|n$|i d|n$qNnn$|d jo$|t jo+$|o$|i d dn$qNn$t |tijoU $d |d|d |d|d f} $|o $|i d |n $qNnn $|d jo  $qNn$t|qNWdS( Nis gamenumberssinfosmovessMoves %dsplayersPlayer sstatss %d: %d/%distime(s_spreviewsappstoolbars statusbarstbssbskwsitemssksvsNones updateTextstypestypess StringTypesIntTypes StringTypessustrsopts toolbar_sizes TupleTypestsAttributeError(s_skwstbssbsksvstspysol.pys updateStatus#sz  !                *  csD$$|iio&$|iii|d|d|Sn$dSdS(Nsprioritysloopi(s_sappsaudios playSamplesnamesprioritysloop(s_snamesprioritysloopspysol.pys playSample$s&cs.$$|iio$|iiindS(N(s_sappsaudios stopSamples(s_spysol.pys stopSamples$scs.$$|iio$|iiindS(N(s_sappsaudiosstopSamplesLoop(s_spysol.pysstopSamplesLoop$scs$$|iii}$|o|i o$|iin$|iio |iii o$|dddfjo $|i dddd|na $|djo !$|i d ddd|n1"$|d jo #$|i d ddd|nndS( Niiisdeal01spriorityidsloopisdeal04isdeal08( s_sappsopts animationssaspreviewscanvassupdate_idletaskssaudiossounds playSamplesloop(s_sloopsaspysol.pysstartDealSample$s   c s$$%$|io &$dSn'$|djo($|iii}n)$|o*$| o *$t}n+$| o +$d}n,$|id-$t |i d|d|.$dd/$d |d d d f}0$|i djp |idjo 1$dSnn2$dSdS( NiisDiscard current game ?s areyousurestitlestextsbitmaps questheadsdefaultsstringssOKsCancel(s_spreviewsconfirmsappsoptstitlesPACKAGEstexts playSamples MfxDialogstopsdefaultsdsstatussbutton(s_stitlestextsconfirmsdefaultsdspysol.pys areYouSure$$s       #cs13$4$t|idd5$dd6$dd}dS(NstitlesNot yet implementedstexts%This function is not yet implemented.sbitmapserror(s MfxDialogs_stopsd(s_sdspysol.pysnotYetImplemented3$s c s7$8$|iiidjp |djo 9$dSn:$|iio|ii o ;$dSn<$tddf\} } } =$|iiidjo >$t } n?$dd} @$|djo A$d}nB$to|djptC$|iiidjoD$|d}E$| d} nF$|iiidjoG$|d}H$| d} nUI$|iiid jo;J$|ii|ijo |djoK$|d}nnL$|djoM$|iii}nN$f} O$|o*P$x |dP$r}Q$|iqWnR$|d}S$||it|||it|f\}}T$ddf\}}U$d}V$| oV$| }nW$xW$||joX$t"t#|||t"t#|||f\}}Y$||||f\}}Z$x&| dZ$r}[$|i'||qW\$x&|d\$r}]$|i(||q2W^$|djo |o|oC_$|ii*i+|ii*i,f\}}`$|i/|||} na$|i0i1b$d}c$| od$||| }e$|| }f$| o |d jog$t5|nah$| o|d | joDi$|d}j$|djo|d | joj$|d}nnnk$||}qWl$x | dl$r}m$|i6qWn$||i||if\}}o$x&|do$r}p$|i(||qWq$|i0i1dS( Niiif0.15iiiiif0.005f0.75f1.5(7s_sappsopts animationssframessdebugstopswinfo_ismappedsNonesclocksdelaysskipsuclocksSPFs __debug__sAssertionErrorsmovessstatesS_INITsshadowsshadowsstkraisescardsscardsc0sxsfloatsysdxsdystxstysis starttimesintsroundsmxsmysssmovesmoveBys from_stacksimagessSHADOW_XOFFSETsSHADOW_YOFFSETssxssys createShadowsscanvassupdate_idletaskssstepsendtimessleepsusleepsdelete(s_s from_stacksto_stackscardssxsystkraisesframessshadowsclocksdelaysskipsSPFsshadowsscardsc0sdxsdystxstysis starttimesmxsmyssssxssysstepsendtimessleepspysol.pysanimatedMoveTo7$s& !      &    7  =  '   " # c sr$s$|iii o t$dSnu$|iio|ii o v$dSnw$|iii}x$|djoy$d|ii_n'z$|djo{$d|ii_n|$g}}$xb|i d}$rR}~$||i i j o6$x,|id$r}$|i ||fqWnqW$g}$x\tdd$rI}$|iii|\}}$||j o$|i |nq8W$|i i i|i i if\}} $|i|if\} } $x$|o$|iii|} $| \}}$|i|dd$||jpt|djob$|i|t|g| d| dddd d$|i|t|g|| ddd dn$|i || $|i!| qW$||ii_dS( Niiiiisupdateistkraisesshadow("s_sappsopts animationssdebugstopswinfo_ismappedsold_ascardss allstacksssstalonscsappendsacardssrangesis miscrandomschoicesxsyssxssyswidthsheightswshsts removeCardslensanimatedMoveTosNonesmoveTosremove( s_sperfectsold_ascardsssscsacardssissxssyswshstspysol.pys winAnimationr$sF !    "  ' #3/csO$$|djo8$|io$|ii|n$ti|ndS(Ni(ssecondss_stopssleepstime(s_ssecondsspysol.pyssleep$s csd$$|iiitijo%$|djo$|d}nn$|iii|||SdS(Ni i( s_sappscardsetstypesCSIs TYPE_TAROCKsranksimagessgetFacesdeckssuit(s_sdeckssuitsrankspysol.pysgetCardFaceImage$scs#$$|iii|||SdS(N(s_sappsimagessgetBacksdeckssuitsrank(s_sdeckssuitsrankspysol.pysgetCardBackImage$sc s$$tdf\}}$x_|d$rR}$|i|d|i|d}$||jo$||f\}}nq$W$|SdS(Niɚ;ii( sNonesclosestscdistsstackssstacksxscxsyscysdist( s_scxscysstackss dragstacksclosestscdistsstacksdistspysol.pys_getClosestStack$s #cs$$|i|if\}}$x|iid$rp\}}$||djo0||djo||djo||djo$|i ||||Snq0W$|i |||ii |SdS(Niiii( scardsxsyscxscys_sregionssinfosstackssrects_getClosestStacks dragstacks remaining(s_scards dragstackscxscysstackssrectspysol.pysgetClosestStack$s G!c s$$tot|djpt$toDt|djo'|d|djo|d|djpt$x |d$r}$to|o ||ijpt$|i|i |f\}}}$toK||djo0||djo||djo||djpt$xT|i i d$rA}$||djo'$to||dj ptnq:WqW$|i i i|t|i i  t|t|fdS(Niiiii(s __debug__slensstackssAssertionErrorsrectsss_s allstackssxsysrsregionssdatasdsprioritysappendstuple( s_sstackssrectsprioritysssxsysrsdspysol.pys setRegion$s$N (!U /cs-$$|iii$|iii$g|i_$x=|iid$r*}$|iii|d|dfqJW$t|ii|i_$t |i i }$xc|iid$rP\}}$x>|d$r1}$x%$||jo$|i|qWqWqW$t||i_ dS(Niii(s_sregionssdatassortsreversesinfosdsappendstupleslistssgs openstackss remainingsstackssrectsstacksremove(s_sds remainingsstackssrectsstackspysol.pysoptimizeRegions$s  ( cs$$tdS(N(sSubclassResponsibility(s_spysol.pys createGame$scs$$tdS(N(sSubclassResponsibility(s_spysol.pys startGame$scs'$$|iio|iiiSdS(N(s_ssstalons canDealCards(s_spysol.pys canDealCards$scs$$|iio |io$|i$|i|i}$|iiid|}$|i |$|i$|i o$|i n$|Sn$dSdS(Nssoundi(s_ssstalons canDealCardss finishMoves enterStatesS_DEALs old_states dealCardsssoundsns leaveStates checkForWinsautoPlay(s_ssounds old_statesnspysol.pys dealCards$s   cs $$dS(N((s_sstackspysol.pys fillStack$scs$$|iSdS(N(s_s Hint_Class(s_spysol.pys getHintClass$scs$$dSdS(Ni((s_spysol.pys getStrictness$scs$$dSdS(Ni((s_spysol.pys canSaveGame$scs$$|i|jSdS(N(s_s GAME_VERSIONs game_version(s_s version_tuples game_versionspysol.pys canLoadGame$scs$$|iSdS(N(s_s canSaveGame(s_spysol.pyscanSetBookmark$scs$$dSdS(Ni((s_spysol.pyscanUndo$scs$$|iSdS(N(s_scanUndo(s_spysol.pyscanRedo$scs$$|iidjo $dSn$|iidjo $dSn$| oF$|iidjo $dSn$|iidjo $dSnn$|iidjp|i djo $dSn$dSdS(Niii( s_sgstatssupdatedsloadedsrestarts restartedsgoto_bookmark_movessmovessindexsgetPlayerMoves(s_srestartspysol.pyschanged$s    ) cs$$|idj}$| p#|iidjp|iidjo$|d|ifSn$|iidjo6|iidjo#|ii djo|ii djo$|d|i fSn$|d|i fSdS(Niii( s_s isGameWonswonsstatsshintss demo_movessU_LOSTs undo_movessgoto_bookmark_movesshighlight_pilesshighlight_cardss U_PERFECTsU_WON(s_swonspysol.pys getWinStatus$s 1Ocs$$|io %dSn%|i\}}}%|o|idjo/%||i_ %|i ii t ||nD%|i o%||i_%|i iioZ%|i ii |i ii|| %|id|i ii|i ii|inn %| o %|i iio %|iio* %|i ii|i ii|d nT%|iidjo|ii djo*%|i ii|i ii|d nnndS(Nisstatsii(s_spreviews getWinStatusswonsstatussupdatedsdemosgetPlayerMovessstatss demo_updatedsapps updateStatssNoneschangedsgstatssoptsupdate_player_statssplayers updateStatussgetStatssidsloadeds updateLog(s_sdemoswonsstatussupdatedspysol.pys updateStats$s"   %9 *)c s6%%|i\}}}%| o %dSn%|i%|io %dSn%|djo%|i%|iddd%t |i dd%d d d |i d d t |i id%ddtdf%d|iiiddd}ni %|djo!%|i"%|iddd#%t |i dd$%d dd |i d d t |i id'%ddtdf(%d|iiiddd}n)%|iidjoS*%|iddd+%t |i dddd,%d d-%ddtdf}nP/%|iddd0%t |i dddd1%d d2%ddddf}3%|idjo |idjof4%|i5%|djo6%|id dn"7%|djo8%|in9%|in5:%|idjo |idjo;%|in<%dSdS(!Niiis winperfectspriorityistitlesGame wonstexts3 Congratulations, this was a truly perfect game ! sYour playing time is s sfor s moves. sstringssNew gamesCancelsimageisseparatorwidthswinwons Congratulations, you did it ! is winfinisheds Game finishedsbitmapsinfos Game finished swinlosts+ Game finished, but not without my help... sRestartsperfect(s_s getWinStatusswonsstatussupdateds finishMovespreviews updateStatss playSamples MfxDialogstopsgetTimesstrsmovessindexsNonesappsgimagesslogossdsgstatssbuttonsendGames winAnimationsnewGames restartGame(s_swonsstatussupdatedsdspysol.pys checkForWin%sN      3& 3&  # #cs[=%>%d}?%x/|iid?%r}@%|t|i}qWA%|t|ijSdS(Ni(scs_sss foundationsslenscards(s_scssspysol.pys isGameWon=%s   csWB%C%xC|iidC%r0}D%t|idjoE%|iSnqWF%dSdS(Nii(s_sss foundationsslenscardss getRankDir(s_ssspysol.pysgetFoundationDirB%s  csG%H%|ii}I%|SdS(N(s_sstatss player_moves(s_s player_movesspysol.pysgetPlayerMovesG%scs~J%K%ti}L%||ii}M%|djo6N%|ii||i_O%|ii||i_nP%||i_dS(Ni( stimests_sstatss update_timesds elapsed_timesgstatsstotal_elapsed_time(s_stsdspysol.pys updateTimeJ%s csQ%R%|iS%tt|ii}T%|djo T%dSnU%|djoU%d|d|dfSnV%d|d|dd|dfSdS(Nis0:00is%d:%02di<s %d:%02d:%02d(s_s updateTimesintsroundsstatss elapsed_timest(s_stspysol.pysgetTimeQ%s  cs)W%X%|ii|ii|iifSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacksW%scsY%Z%|io [%dSn\%|idf\}|_]%|djo]%|iii}n^%|djo^%|iii}n_%|djo_%|iii}n`%|i i }a%|i |||d|}b%|ic%|i i|i i ||i _d%||_e%|SdS(Niissound(s_sdemosbusysold_busys autofaceupsappsoptsautodropsautodealsstatss total_movessmovess _autoPlayssoundsns finishMovesautoplay_moves(s_s autofaceupsautodropsautodealssoundsold_busysmovessnspysol.pysautoPlayY%s   # c s f%g%|i\}}}h%d}i%xi%|oj%d}k%|o|ol%x|dl%r|} m%| iofn%|oo%|i dddnp%| i q%d}r%|i s%|i o t%dSnnqZWnu%|o|ov%x|dv%r} w%| i|ii\} } x%| oly%|i z%|o{%|i dddn|%| i| | }%d}~%|i o %dSnnqWn%|oO%|id|o5%d}%|i %|i o %dSnnnq*W%dSdS( Niisautoflipspriorityisautodropissound(s_s getAutoStackss flipstackss dropstackss quickstackssdone_somethings autofaceupsss canFlipCardssounds playSamplesflipMoves finishMoves checkForWinsautodrops canDropCardss foundationssto_stacksncardssmoveMovesautodeals _autoDeal( s_s autofaceupsautodropsautodealssounds flipstackss dropstackss quickstackssdone_somethingsssto_stacksncardsspysol.pys _autoPlayf%sF                csa%%|ii}%|o t|idjo |io%|id|Sn%dSdS(Nissound( s_ssswasteswslenscardss canDealCardss dealCardsssound(s_ssoundswspysol.pys _autoDeal%s-cs8%%|iio%|iidffSn%fSdS(Ni(s_ssgs hp_stacks(s_spysol.pysgetHighlightPilesStacks%scs%%| o %dSn%g}%x|d%r\}}}}%to'||ijo ||ijpt%|i d}%|djo%|i |\} } %|i |\} } %||id j o |djo%| |} n%| |iii} n}%|i |\} } %|i |\} } %| |iii} %||id j o%| |iii|} n%| |iii} %t|i| d| d| d| d%dddtd|} %| i|i%|i| q.W%| o %dSn%|ii%|i|%|i%x |d%r} %| iq_W%|ii%t SdS(Niiswidthisfillsoutline(!sinfositemssssc1sc2scolors __debug__scardssAssertionErrors CARD_YOFFSETssy0sgetPositionForsx1sy1sx2sy2s_sappsimagessCARDHsCARDWsMfxCanvasRectanglescanvassNonesrstkraisesitemsappendsupdate_idletasksssleepsreversesdeletes EVENT_HANDLED(s_sinfossleepsitemssssc1sc2scolorssy0sx1sy1sx2sy2srspysol.pys_highlightCards%sB    1%(    f1.5c s%%|i}%| o %dSn%|iii}%g}%x|d%r}%xt|dd%rc}%|i }%|ot ||djo-%|i ||d|d |dfnqhWqOW%|i||SdS(Nii(s_sgetHighlightPilesStackss stackinfosappsoptshighlight_piles_colorsscolshississsgetPilespileslensappends_highlightCardsssleep(s_s stackinfossleepscolshississspilespysol.pyshighlightPiles%s     !5cs%%dSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch%scs%%t|idjSdS(Ni(slensto_stackscards(s_sncardss from_stacksto_stackspysol.pysgetQuickPlayScore%scs %%dS(N((s_spysol.pys updateText%scs%%tSdS(N(sNone(s_spysol.pys getGameScore%scsZ%%t|i }%x3|iid%r }%|dt|i}q(W%|SdS(Nii(slens_scardssvsss foundations(s_svssspysol.pysgetGameScoreCasino%s  csP%%|iio %dSn%|ii|iijo %dSn%dSdS(Nii(s_sgstatssloadedsrandomsoriginsORIGIN_SELECTED(s_spysol.pysshallUpdateBalance%s   cs%%dSdS(Ni((s_spysol.pysgetGameBalance%scsS%%|i}%|tjo %tSn%|||}%|i|SdS(N(s_s getHintClasss hint_classsNoneslevelshintsgetHintss taken_hint(s_slevels taken_hints hint_classshintspysol.pysgetHints%s  cs%%|itjo %tSn%||iijo"%||i_%t|i_n%|iitjo.%|i|||i_%d|i_n%|ii o %tSn%|ii|ii}%|iid|i_%|iit |iijo%d|i_n%|\}}}}} } } %to$|ot |i|jpt%|djoM%to|djpt%to||iijpt%|Sn%|| jo]%to|djpt%to*|djot |i|jpt%|Sn}%to| pt%to.d|jot |ijnpt%to"| i||i| pt%|djo %|Sn%|ii} %|i|i| \} }%| i| i\}}%| | i!|| i"f\} }%|| i!|| i"f\}}%|djo,%| | i#d} %|| i$d}nn&|i%do0&| |i%dd} &|| i$d}n-&| | i#d} &||i&dd}&|| i#d}&|| i$d}&t'|i(| |||dd &d|ii)i* &dd d d d d f} &|djp|djo |ii)i,} &|o|ii.o |ii)i.o* &|ii.i/d dd|d| n &d}&|i(i0&|i|&|o&&|ii.i/d ddddn&|tj o&|i1n&|i(i0&|SdS(Niiif0.0swidthisfillsarrowslasts arrowshapeii sinfostexts Score %6dsfgss#000000(2s_s getHintClasssNoneslevelshintsslistsgetHintss taken_hintsindexshslensscorespossncardss from_stacksto_stacks text_colors forced_moves __debug__scardssAssertionErrorssstalons acceptsCardsssleepsappsimagessgetPositionForsx1sy1sgetCardsx2sy2sCARD_DXsCARD_DYsCARDWsCARDHs CARD_XOFFSETs CARD_YOFFSETs MfxCanvasLinescanvassoptshintarrow_colorsarrows demo_scoresinfos statusbars configLabelsupdate_idletaskssdelete(s_slevelssleeps taken_hintshsscorespossncardss from_stacksto_stacks text_colors forced_movesimagessx1sy1sx2sy2sarrowsinfospysol.pysshowHint%sv  ".$ 4 8,  ##,'*  &cs&&to|djpt&|i o &dSn&td|&d|&d|iii  &dg!&dt "&dt #&d|i i $&d t |_ &&t |i_'&d o(&|in)&|i*&t|i|idS( Nislevelsmixedssleeps last_dealshintskeypresssstart_demo_movess info_texti(s __debug__slevelsAssertionErrors_stopsStructsmixedsappsopts demo_sleepsNonesstatss demo_movessdemoshintsslistscreateDemoInfoTextscreateDemoLogos after_idles demoEvent(s_smixedslevelspysol.pys startDemo&s         csX+&,&|i o -&dSn.&|iit/&t|_0&t|_1&|idS(N(s_sdemoscanvass setTopImagesNones demo_logos updateMenus(s_seventspysol.pysstopDemo+&s    c sb2&3&|i p |iio%4&|i5&|i6&dSn7&|i|i}8&|i9&|ii :&t |i _ ;&|i }<&t df\}}=&d}>&d}?&|djo @&d}nA&|ioB&d}C&|ii o D&d}niE&|djoF&|idG&|iiidd d d f}H&t|id td I&ddt|iidJ&d|iii dd|fK&ddd|}L&|i}nN&|iiiddf}O&d}P&|ii"o'Q&|d|i#i|i#i$f}nR&t|id td S&d|d|d|fT&ddd|}U&|i}nV&|oW&|ii o X&d}nZ&|djo[&|idn\&|iiidddf}]&t|id td ^&dd _&d|d|f`&ddd|}a&|i}nb&|oc&|i%d!dd&|io|djo |ii" oe&|i#i$|ii&jojf&|ii'd|i_'g&|ii'd"djo3h&|iioi&t(|idd}nnnnj&|io |djok&|i} l&|i)} m&do| i*o |ii"omn&|ii+i,} o&|ii+i.} p&t | } q&| i|i)dt/| } r&| | } n|s&| i*ont&|ii+i,} u&xOu&t/| djo8v&|ii0} w&dp | |i)jox&PnqWny&|i1| djo:z&|i2{&|i3d#d|&|i4d$| i*n1~&|i2&|i&|i5| d%dnP&|i&do |ii"o+&|i2&|i6&|i3nn8&|ii7&|io&t8|i|i9ndS(&Nisinfoi'iiis autopilotwonsGreatsCoolsYeahsWowstitles Autopilotstexts Game solved in s moves. simageisstringssseparatorwidthstimeoutsOKs Game finished s %d %d sbitmapspadxis autopilotlostsOh wells That's lifesHmms This won't come out... sdemoisautoplaysmixeds startdemo(:s_sdemoskeypresssstopDemos updateMenussplayOneDemoMovesfinisheds finishMovestopsupdate_idletaskssNoneshintsslistsgetPlayerMovess player_movessdsstatussbitmapstimeouts isGameWonswinfo_ismappeds playSamplesapps miscrandomschoicesss MfxDialogsPACKAGEsstrsmovessindexsgimagesslogosstextsdebugsstatss demo_movess updateStatssstart_demo_movess demo_counters helpAboutsidsmixedsgdbsgetGamesIdSortedByIdsglsgetGamesIdSortedByNameslensgetRandomGameIds nextGameFlagssendGamesnewGames startDemosquitGames winAnimations busyUpdates after_idles demoEvent( s_sfinisheds player_movessdsstatussbitmapstimeoutssstextsdemosidsglsindexspysol.pys demoEvent2&s         $ '  !  ((  !#        c s&&|iidjo &dSn&|i}&|iio&&|ii o&d }nn&|i p |i d o%&|i ddo &dSnn&|i |i |d|i }&||_ &| o &dSn&|\}}}}}} } &|djok&|idjo &dSn&|iii} &| |ijo &dSn&|ii| nT&||jo&|i&g|_n'&|i||dd &g|_&dSdS( Niif1.0issoundis taken_hintsframes(s_smovessindexsdemossleepsappsdebugstopswinfo_ismappedshints _autoDealsshowHintslevelshsscorespossncardss from_stacksto_stacks text_colors forced_moves dealCardsssstalonsgetCardscs last_dealsappendsflipMovesmoveMove( s_sdemossleepshsscorespossncardss from_stacksto_stacks text_colors forced_movescspysol.pysplayOneDemoMove&s6  !       c s&&dS&|i p|iip|io &dSn&dd|idfd|id|idfdddfd|iddfg}&|i|}&|oX&t d}&t |i |d|dd |d &d |d |i |i_ndS( Nsswissesnwsnes canvas_largeiisanchorisfontstext(s_sdemos info_textspreviewsheightswidthstinfosgetDemoInfoTextAttrstasgetFontsfonts MfxCanvasTextscanvassgetDemoInfoText(s_stinfostasfontspysol.pyscreateDemoInfoText&s% U $cs&&|iiSdS(N(s_sgameinfos short_name(s_spysol.pysgetDemoInfoText&scs&&ggf\}}&x|id&r}&|io{&|i|&|it|i &|i o|i i djo&|i|n&|it|i nq'W&|i |}&|djo&|i |}n&|djo &tSn&||SdS(Ni(sitems1sitems2s_s allstackssss is_visiblesappendsextendslistscardsscaps max_accepts$_Game__checkFreeSpaceForDemoInfoTextstisNonestinfo(s_stinfositems1sitems2ssstispysol.pysgetDemoInfoTextAttr&s  !! c s&&|iii|iiif\}}&d|d|id|df\}}&|d|i d|df\}}&ddddg}&x|d&r} &| i| if\} } &| |joF&| |jo&d|di8|i8n4(| i?|5(|djo)6(|ti }7(||djn8(| djo@9(|i>| _>:(|i=| _=;(|i5| _5<(|i9| _9n=(| SdS(NcsH''| o6'| o'dtd}n'tt|ndS(NsInvalid or damaged s save file(sexprstextsPACKAGEs Exceptionsstr(sexprstextspysol.pyscheck's  csq''|i}'t|tijo;'t||j o!'dtd}'t |nn'|SdS(NsInvalid or damaged s save file( spsloadsobjstypeststypessTypeTypesPACKAGEstexts Exception(stspsobjstextspysol.pyspload's iisCannot load games saved with s version iisIncompatible savegame formatis#Cannot load this game from version s> as the game rules have changed in the current implementation.soriginiiisEOF(As_s updateTimesNonescheckspsploadspackagestypestypess StringTypesPACKAGEsversionslensget_version_tuples version_tuples_getUndumpVersionsvs VERSION_TUPLEs game_versionsbookmarksvts TupleTypesIntTypesidsGIsPROTECTED_GAMESshas_keysapps constructGamesgames canLoadGamesdestructsrandomsWHRandoms InstanceTypes isinstances PysolRandomshasattrsORIGIN_UNKNOWNsoriginsloadinfosstackssncardssnstackssrangesisstacksjscard_idsface_upsappendsgameinfos talon_roundssaveinfosStructs merge_dicts__dict__s gsaveinfosListTypestalon_base_cardssmovessgstatssstatss _loadGameHooksdummy(s_spsappschecksploadspackagesversions version_tuplesvs game_versionsbookmarksvtsidsgamesnstackssisstacksncardssjscard_idsface_upssaveinfos gsaveinfostalon_base_cardssmovessgstatssstatssdummyspysol.pys _undumpGame's  ) //   ) = ) )     :   : !  ! !  cs>(?(t}@(zYA(|i oB(tdnC(t|d}D(t||}E(|i |WdF(G(|oG(|i nXdS(NsCannot save this game.swb( sNonesfs_s canSaveGames ExceptionsopensfilenamesPicklersbinmodesps _dumpGamesclose(s_sfilenamesbinmodesfspspysol.pys _saveGame>(s  cs[H(I(|iJ(to%d|jo djnptK(|itL(|itM(|it N(|i|O(|i|i P(|i|i Q(|i|i R(|it |iS(xq|idS(ra}T(|it |iU(x<|idU(r,}V(|i|i W(|i|iqWqWX(|i|iiiY(d|jo djno*Z(|i|i[(|i|in\(|i|i](d|jo djnoW^(|djo_(|iid|i_n`(|i|ia(|i|inb(|i|c(|iddS(NiiisEOF(s_s updateTimes __debug__sbookmarksAssertionErrorspsdumpsPACKAGEsVERSIONs VERSION_TUPLEs GAME_VERSIONsidsrandomslens allstackssstackscardsscardsface_upssstalonsroundssaveinfos gsaveinfosmovessgstatsssavedsstatss _saveGameHook(s_spsbookmarksstackscardspysol.pys _dumpGameH(s: /  !!cs d(e(dS(N((s_sgamespysol.pys_restoreGameHookd(scs f(g(dS(N((s_spspysol.pys _loadGameHookf(scs h(i(dS(N((s_spspysol.pys _saveGameHookh(s(sU_PLAYsU_WONsU_LOSTs U_PERFECTsS_INITsS_DEALsS_FILLsS_PLAYsS_UNDOsS_REDOs GAME_VERSIONs__init__screates initBindingss_Game__createCommons createPreviewsdestructsresets getTitleNames getGameNumberssetSizes setCursorsNonesnewGames restoreGamesrestoreGameFromBookmarks resetGames nextGameFlagssquitGamesendGames restartGames createRandoms enterStates leaveStates createCardss _createCardsshufflesshuffleSeparateDeckss _shuffleHooks_shuffleHookMoveToTops_shuffleHookMoveToBottoms_shuffleHookMoveSorters _finishDrags _cancelDrags updateMenuss disableMenuss clickHandlers updateStatuss playSamples stopSamplessstopSamplesLoopsstartDealSamples areYouSuresnotYetImplementedsanimatedMoveTos winAnimationssleepsgetCardFaceImagesgetCardBackImages_getClosestStacksgetClosestStacks setRegionsoptimizeRegionss createGames startGames canDealCardss dealCardss fillStacks DefaultHints Hint_Classs getHintClasss getStrictnesss canSaveGames canLoadGamescanSetBookmarkscanUndoscanRedoschangeds getWinStatuss updateStatss checkForWins isGameWonsgetFoundationDirsgetPlayerMovess updateTimesgetTimes getAutoStackssautoPlays _autoPlays _autoDealsgetHighlightPilesStackss_highlightCardsshighlightPilessshallHighlightMatchsgetQuickPlayScores updateTexts getGameScoresgetGameScoreCasinosshallUpdateBalancesgetGameBalancesgetHintssshowHints startDemosstopDemos demoEventsplayOneDemoMovescreateDemoInfoTextsgetDemoInfoTextsgetDemoInfoTextAttrs$_Game__checkFreeSpaceForDemoInfoTextscreateDemoLogos startMovess_Game__storeMovesmoveMovesflipMoves turnStackMoves nextRoundMoves saveSeedMovesshuffleStackMovesupdateStackMoves finishMovesundosredos setBookmarks gotoBookmarksundoGotoBookmarksloadGamessaveGames _loadGames_getUndumpVersions _undumpGames _saveGames _dumpGames_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pysGame"s             " #    3    "(                4    ;!                   -      ! "       ? Y             %    #  a   s _LayoutStackcs&j(k(edZq(dedZRS(Ncs[k(l(tt||_m(tt||_n(||_o(h|_p(d|_dS(Ns%d(sintsroundsxs_syssuits text_argss text_format(s_sxsyssuitspysol.pys__init__k(s   c sjq(r(||id<s(||id<t(||id<u(|ii|v(|tj ow(||_ ndS(Nsxsysanchor( sxs_s text_argssysanchorsupdateskwsformatsNones text_format(s_sxsysanchorsformatskwspysol.pyssetTextq(s scenter(sNones__init__ssetText(spysol.pys _LayoutStackj(ssLayoutcsx(y(dddZ(edZ(dZ(ddddZ(dZ(d Z(d Z(d Z(d Z (ddd Z (dddZ )ddddZ 5)dddZ T)ddddZ{)dddZ)ddddZ)ddddZ)ddddZ *ddddZ2*ddddZQ*ddd Zn*dd"d!ZRS(#Nc sy(z(||_{(|ii|_|(t|_}(tdt(dt(dg(dg(dg|_(h|_(g|_(|ii i }(|i |_ (|i |_(||_(||_(|i ||_(|i||_(|i|_(|i|_(|ii|(|iidjod(|ido(|i|ii|_n(|ido(|i|ii|_nndS( Nstalonswastes foundationssrowssreservesisXOFFSETsYOFFSET(sgames_scanvassNonessizesStructsssstackmapsregionssappsimagessCARDWsCWsCARDHsCHsXMsYMsXSsYSs CARD_XOFFSETsXOFFSETs CARD_YOFFSETsYOFFSETs__dict__supdateskwspreviewshas_key(s_sgamesXMsYMskwsimagesspysol.pys__init__y(s2          i csm((t|||}(|i|if}(to|ii | pt (||i|<(|SdS(N( s _LayoutStacksxsyssuitsstacksmapkeys __debug__s_sstackmapshas_keysAssertionError(s_sxsyssuitsstacksmapkeyspysol.pys __createStack(s %csi((ddf\}}(|tj o(|i|if\}}n(|djo)(||id||iddfSn(|djo)(||id||iddfSn(|djo)(||id||iddfSn(|djo)(||id||iddfSn(|d jo(||i |d dfSn(|d jo%(||i ||i d dfSn(d }(|i i idjo (d}n(|d jo(||i|d |fSn(|d jo%(||i||i d |fSn(|djo)(||i||i dd|fSn(t|dS(Nisniscenters%dsnnssssssnwsnesswsses%2dis%3dsesw(sxsysstacksNonesanchors_sCWsYMsYSsXMsCHsfsgamesgameinfosdeckssXSs Exception(s_sstacksanchorsxsysfspysol.pys getTextAttr(s2))))%  %)c s((|iidjo (dSn(to|iitjpt(|i ||\}}}} (t|i||||d||i_(|p| |ii_dS(Nisanchor(s_scanvasspreviews __debug__sstackstextssncardssNonesAssertionErrors getTextAttrsanchorstxstystastfs MfxCanvasTextsdxsdys text_format( s_sstacksanchorsdxsdys text_formatstxstystastfspysol.pys createText(s  $!,iscs ((|ii||fdS(N(s_sregionssappendsstackssrects(s_sstackssrectsspysol.pys setRegion(scs((|i}(|iio((|i|ii|iii_n(|iio((|i|ii|iii_n(|i(|i dS(N( s_sgamessstalons defaultTextstextssncardsswastesdefaultStackGroupssdefaultRegions(s_sgamespysol.pys defaultAll(s (( cs((|iidjo (tSn(|tjp|i o (tSn(tt|iif|i}(|i |_ (|SdS(Ni( s_scanvasspreviewsNones layout_stacks text_argssapplys MfxCanvasTextsgamests text_format(s_s layout_stackstspysol.pys defaultText(s  !cs((|i}(g}(|iitj o(|iig}n(|iig||i_(|ii|ii ||i_ (|ii |ii|ii |i_ (|ii |i_ dS(N(s_sgameswastesssNonestalonssgs talonstackssrowssreservess dropstackss foundationss openstackss reservestacks(s_sgameswastespysol.pysdefaultStackGroups(s  #)cs((x|id(r}(g}(xY|dd(rH}(|i|if}(|ii |}(|i |ii |q4W(|ii ||dqWdS(Nii(s_sregionssregionsstackssssxsysmapkeysgamesstackmapsidsappends allstackss setRegion(s_sregionsstackssssmapkeysidspysol.pysdefaultRegions(s   c s((|i}(|i|if\}}(|i|if\}}(|i|if\} } (|i i i } (t |i i i t|i i i} (|dd} (| td| |d|i}(t|d| dd| d|}(t|d| }(||f\}}(x@t| d(r-}(|iii|||| |q9W(xHt|| d(r1}(|iii|||| ||qW(|| | |f\}}(|i|iid d ||ddf(xrt| d(r_}(xFt| d(r3}(|iii|||| |d|q4W(|| }qW(|d|}(|||| |i_ }(|o(t"odpt#n(|| | | |f|_$dS( Niiiiiii?Bssuit(%s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsshalfrowssmins playcardssYOFFSETshsmaxsxsysrangesisssappends setRegionssuits foundationsstalonstextss __debug__sAssertionErrorssize(s_srowsstextss playcardssSsCWsCHsXMsYMsXSsYSsdecksssuitsshalfrowsshsxsysissuitssspysol.pysbakersDozenLayout(s< +%) + //  1  i c s!((|i}(|i|if\}}(|i|if\}} (|i|if\} } (|i i i } (t |i i i t|i i i} )|d| | })t||})||| })|dd|d|i})| | t|d| })||| |d| f\}})xEt|d)r2})|iii|||)|| }qJW )xjt| d )rW} )xKt| d )r8} )|| } )|ii i|||d|qWqW )||| |d| | f\}})xEt|d)r2})|iii|||)|| }q.W)|i!|iid || dddf)||| f\}})||||i_"})|o+)|i$|| ||dd d d n)||| | |f|_%dS( Niiiissuitii?Bsanchorsswsformats%3d(&s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssreservesstoprowssmaxsrowssmaxrowssws playcardssYOFFSETshsxsysrangesisssappendssuits foundationss setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardssSsCWsCHsXMsYMsXSsYSsdecksssuitsstoprowssmaxrowsswshsxsysissuitssspysol.pysfreeCellLayout(sB + %    -) . +ic s))|i})|i|if\}})|i|if\}} )|i|if\} } )|i i i } )t |i i i t|i i i} )|dd|d|i})| t|| d| } )|| f\}}!)xEt|d!)r2}")|iii|||#)|| }qW$)|i|iid d ||ddf%)xrt| d%)r_}&)xFt| d&)r3}')|iii|||| |d|qW()|| }q|W))|| d| || f\}}*)|o+)|| d}n,)||||i_}-)|o+.)|i || ||dd d d n/)|ob0)|| }1)||||i_!}2)|o+3)|i ||||dd d d nn4)||| | |f|_"dS( Niiiiii?Bssuitsanchorsswsformats%3dsse(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstextsstalonssetTextswastessize(s_srowsswastestextss playcardssSsCWsCHsXMsYMsXSsYSsdecksssuitsshsxsysissuitssspysol.pys gypsyLayout)s@ +  /  1%  +   /iic s%5)6)|i}7)|i|if\}}8)|i|if\}} 9)|i|if\} } :)|i i i } ;)t |i i i t|i i i} <)t|| | | |d| | | d| d|}=)||}>)| |d|i}?)t|d| }@)||| |d| f\}}A)xEt|dA)r2}B)|iii|||C)|| }qLWD)|| |f\}}E)|i|iid d d|| dfF)xjt| dF)rW}G)xKt| dG)r8}H)|iii|||d|I)|| }qWqWJ)|odK)|d| }L)||||i_}M)|o)N)|i!||d|| dd nnO)|| }P)||||i_"}Q)|o)R)|i!||d|| dd nS)|| || f|_#dS( Niiiiii?Bssuitsanchorss($s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssmaxsrowsswastesws playcardssYOFFSETshsxsysrangesisssappends setRegionssuits foundationsstextsssetTextstalonssize(s_srowsswastestextss playcardssSsCWsCHsXMsYMsXSsYSsdecksssuitsswshsxsysissuitssspysol.pys harpLayout5)sB += % /  %  -  )ic sT)U)|i}V)|i|if\}}W)|i|if\} } X)|i|if\} } Y)|i i i } Z)t |i i i t|i i i}[)|| }\)d||}])t||}^)d}_)|dd|d|i}`)t|d| }a)| | f\}}b)||||i_}c)|o|d)|p| p||djo2e)|i ||d|| ddf)d}n$h)|i || |ddd d ni)|o`j)|| }k)||||i_}l)|o)m)|i ||d|| ddnnn)| ||| }o)|o|dd|d|jop)| ||| d}nq)xjt!|dq)rW}r)xKt!| dr)r8}s)|ii$i%|||d |t)|| }qWqWu)| | | |f\}}v)|i&|iid || dd d fw)xEt!|dw)r2}x)|iii%|||y)|| }qSWz)| || | | ||f|_'dS(Niiiisanchorsnisnwsformats%3dssuitii?B((s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsrangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksssuitssfrowsstoprowssmaxrowssyextrashsxsyssssuitsispysol.pysklondikeLayoutT)sP +    #% '   -'  %. ic sj{)|)|i}})|i|if\}}~)|i|if\}})|i|if\} } )|i i i } )t |i i i t|i i i} )|dd|d|i} )|t| | | } )||f\}})xEt|d)r2})|iii|||)|| }qW)|i|iid d ||ddf)xrt| d)r_})xFt| d)r3})|iii|||| |d|qW)|| }qxW)|| | f\}})||||i_})|o+)|i || ||dd d d n)||| | | f|_!dS( Niiiiii?Bssuitsanchorsswsformats%3d("s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstalonstextsssetTextssize(s_srowsstextss playcardssSsCWsCHsXMsYMsXSsYSsdecksssuitsshsxsysissuitssspysol.pys yukonLayout{)s2 +  /  1 +ic s&))|i})|i|if\}})|i|if\} } )|i|if\} } )|i i i } )t |i i i t|i i i})d| d| dj})d||})t||})d})|dd|d|i})t|d| })| | f\}})||||i_})|o|)|p| p||djo2)|i ||d|| dd)d}n$)|i || |dd d d n)|o`)|| })||||i_})|o))|i ||d|| ddnn)| ||| })|o|dd|d|jo)| ||| d}n)||f\}})xt#|d)r})xKt#| d)r8})|ii&i'|||d |)|| }qW)|djo | djo&)||| f\}})|}nqW)| || || djf\}})|i(|iid || dddf)xEt#|d)r2})|iii'|||)|| }qW)| || | | ||f|_)dS(Niiiiisanchorsnisnwsformats%3dssuitii?B(*s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksssuitssfrowsstoprowssmaxrowssyextrashsxsysssx0sy0ssuitsispysol.pys easyLayout)sX +   #% '   -'  %'. c s ))|i})|i|if\}})|i|if\} } )|i|if\} } )|i i i } )t |i i i t|i i i})d| |})d})|dd|d|i})t|d| })| || d| })|})||||i_})|o|)|p| p||djo2)|i||d|| dd)d}n$)|i|| |ddd d n)|o`)|| })||||i_})|o))|i||d|| ddnn)| | f\}})d||f\}}})xt"d d)r})xt"| d)r})|| ||| |f\}})|ii%i&|||d |)|| djo |d joA)|| || | f\}})d ||f\}}}nqxW)|d}q]W)| | | | f\}})|i'|ii|| dd|| |df)xEt"|d)r2})|iii&|||)|| }qW)| || | | ||f|_(dS(Niiiisanchorsnisnwsformats%3di ssuitii?B()s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsstoprowssyextras playcardssYOFFSETshsmaxsxsyssstalonstextsswastescenterssetTextsdsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksssuitsstoprowssyextrashsxsysssdsx0sy0ssuitsispysol.pys samuriLayout)sT +    #% '   -  %%!!$5 c s))|i})|i|if\}})|i|if\} } )|i|if\} } )|i i i } )t |i i i t|i i i})to|ddjpt)d})t||})| || })|dd|d|i})t|d| })| | f\}})xt| d)rp})xKtdd)r8})|i i!i"|||d|)|| }qcW)| || f\}}qHW)| | ||d| | | f\}})xEt|d)r2})|i ii"|||)|| }qW)|i#|i i| | d| | | d| d| ddf)| | | | f\}})xIt|dd)r2}*|i ii"|||*|| }qW*|| | | | f\}}*xIt|dd*r2}*|i ii"|||*|| }qW*| |f\}}*||||i _$}*|o+ *|i&|| ||d d d d n *| || | | |f|_'dS( Niii iissuiti i?Bsanchorsswsformats%3d((s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss __debug__sreservessAssertionErrorstoprowssmaxsrowssmaxrowssws playcardssYOFFSETshsxsysrangesissuitsss foundationssappends setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksssuitsstoprowssmaxrowsswshsxsysissuitssspysol.pys sumoLayout)sR +"    %- E !  +i c s  * *|i} *|i|if\}}*|i|if\} } *|i|if\} } *|i i i } *t |i i i t|i i i}*to|ddjpt*to|| djpt*| |d}*| d|| }*|dd|d|i}*t|d| }*|| | | f\}}*xt| d*rp}*xKt|d*r8}*|ii i!|||d|*|| }qW*|| | f\}}qlW*| | f\}}*xIt|dd*r2} *|iii!|||!*|| }qW"*| | |df\}}#*xIt|dd#*r2}$*|iii!|||%*|| }qzW&*|i"|iidd| |d| ddf'*|| | | | df\}}(*xt| d(*rv})*xIt|| d)*r2}**|iii!|||+*|| }q>W,*|| | | df\}}qW-*| |f\}}.*||||i_#}/*|o+0*|i%|| ||dd d d n1*|| | |f|_&dS( Niiiissuiti?Bisanchorsswsformats%3d('s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss __debug__srowssAssertionErrorsreservesstoprowssws playcardssYOFFSETshsmaxsxsysrangesissuitsss foundationssappends setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksssuitsstoprowsswshsxsysissuitssspysol.pys funLayout *sX +""   %  5%  % +cs:2*3*|i}4*|i|if\}}5*|i|if\} } 6*|i|if\} } 7*|i i i } 8*t o|ddjpt9*| |d}:*| d|| | };*|dd|d|i}<*t|d| }=*| | f\}}>*||||i_}?*|o/@*|i||d|| ddddnA*| | d| f\}}B*xMt|ddB*r6}C*|ii i|||D*|| | }qWE*| | d| |df\}}F*xMt|ddF*r6}G*|ii i|||H*|| | }q WI*|i|ii | | d d d fJ*| | d| f\}}K*xt| dK*rv}L*xIt|| dL*r2}M*|iii|||N*|| }qWO*|| | | d f\}}qWP*|| | |f|_ dS( Niiiisanchorsnsformats%dii?Bi(!s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckss __debug__srowssAssertionErrorstoprowssws playcardssYOFFSETshsmaxsxsyssstalonstextsssetTextsrangesisappends setRegionsreservesssize(s_srowssreservesstextss playcardsscentersSsCWsCHsXMsYMsXSsYSsdecksstoprowsswshsxsysssispysol.pys oonsooLayout2*sD "  / % *  %c sQQ*R*|i}S*|i|if\}}T*|i|if\}}U*|i|if\} } V*|i i i } W*t o|ddjptX*t o|ddjptY*|d| d|| df\} } Z*||f\}}[*xxtdd[*re}\*|iii|||d|]*|| }^*|djo_*| | |f\}}nqW`*|d| }a*xDt|dda*r-}b*|ii i|||| |qWc*xHt|ddc*r1}d*|ii i|||| | dqWe*|i|ii || d | || d ff*xHt|ddf*r1}g*|iii||| | |d qcWh*xLt|ddh*r5}i*|iii|| | | | |d qWj*|| | d| | |i_}k*|ol*t odptnm*| | f|_dS( Niiii iissuitii?Bi(s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckss __debug__srowssAssertionErrorsreservesswshsxsysrangesisss foundationssappends setRegionstalonstextsssize(s_srowssreservesstextssSsCWsCHsXMsYMsXSsYSsdecksswshsxsysissspysol.pys ghulamLayoutQ*sB "") % ! + /2 / 3( c sjn*o*|i}p*|i|if\}}q*|i|if\}}r*|i|if\} } s*|i i i } t*t |i i i t|i i i} u*| | d} v*| |dd}w*|| ||d| |f\}}x*||f|_y*||f\}}z*||||i_}{*|i|| ||dddd|*|||| |i_}}*|i|| || |dddd~*||| | d}*xnt| dd*rW}*xKt| d*r8}*|ii i!|||d|*|| }qWqW*||| | d}*|| }*xvt| dd*r_}*xSt| d*r@}*|ii i!|||d|| d*|| }qWqjW*||d| df\}}*xEt|d*r2}*|iii!|||*|| }qW*|i"|iid ||d d fdS( Niisanchorsswsformats%3dissuitii?B(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowssrowssfspacesheightswshssizesxsyssstalonssetTextswastesrangessuitsis foundationssappends setRegion(s_srowsswastesheightsSsCWsCHsXMsYMsXSsYSsdecksssuitssfrowssfspaceswshsxsyssssuitsispysol.pysgeneriklonLayoutn*sH +)' +  %   -! i(s__init__sNones_Layout__createStacks getTextAttrs createTexts setRegions defaultAlls defaultTextsdefaultStackGroupssdefaultRegionssbakersDozenLayoutsfreeCellLayouts gypsyLayouts harpLayoutsklondikeLayouts yukonLayouts easyLayouts samuriLayouts sumoLayouts funLayouts oonsooLayouts ghulamLayoutsgeneriklonLayout(spysol.pysLayoutx(s,      '+)%'sKlondikecsf**eiZ*eZ*eZ*eZ*e Z *d ddZ *dddZ *dZ RS(Nc s**t||if\}}*t|dddddddd*t|i|f|*|i|i d|i d*|i |ii i |ii i |*d |d ||_ *|iio.*t|iii |iii ||_n*xJ|iid*r7}*|ii|i|i |i |d |iq W*xA|iid*r.}*|ii|i|i |i |q\W*|i*|SdS( Nsrowsiswasteistextss playcardsiis max_roundssnum_dealssuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys max_roundssnum_dealswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_s max_roundssnum_dealslayoutslsssrspysol.pys createGame*s %!$. 5 , ic s**x]tdt|iid*r;}*|iiid|ii|d|ddd|q$W*|i *|iiid|*|ii o*|iii ndS(Niisrowssflipsframessreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSampleswastes dealCards(s_sflipsreversesispysol.pys startGame*s! 9 icsH**|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch*s(sLayoutsklondikeLayouts Layout_MethodsWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysKlondike*s     s VegasKlondikecsD**eiZ*eiZ*ddZ*dZ*dZRS(Nc sW**ti|d|*t|id|id*dddtd|i_ dS(Ns max_roundsisanchorsswsfonts canvas_large( sKlondikes createGames_s max_roundss MfxCanvasTextscanvassheightsgetFontstextssscore(s_s max_roundsspysol.pys createGame*sics**|idjo *dSn*|iiidf\}}*|io*|i}n*do |ii o*d||f}n*d||}*|i i i d|dS(Niis Balance %d/%ds Balance $%dstext(s_spreviewsappsstatssgameid_balancesb1sb2sshallUpdateBalancesgetGameBalancesdebugststextssscoresconfig(s_sb1sb2stspysol.pys updateText*s cs**|dSdS(Ni(stinfo(s_stinfospysol.pysgetDemoInfoTextAttr*s(sGamesgetGameScoreCasinos getGameScoresgetGameBalances createGames updateTextsgetDemoInfoTextAttr(spysol.pys VegasKlondike*s    sCasinoKlondikecs**dZRS(Ncs**ti|dddS(Ns max_roundsi(s VegasKlondikes createGames_(s_spysol.pys createGame*s(s createGame(spysol.pysCasinoKlondike*ssKlondikeByThreescs**dZRS(Ncs**ti|dddS(Nsnum_deali(sKlondikes createGames_(s_spysol.pys createGame*s(s createGame(spysol.pysKlondikeByThrees*ssThumbAndPouch_RowStackcs**dZRS(Ncs&**t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequence*s(s _isSequence(spysol.pysThumbAndPouch_RowStack*ss ThumbAndPouchcs&**eZ*dZ*dZRS(Ncs**ti|dddS(Ns max_roundsi(sKlondikes createGames_(s_spysol.pys createGame*scsH**|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch*s(sThumbAndPouch_RowStacksRowStack_Classs createGamesshallHighlightMatch(spysol.pys ThumbAndPouch*s  sWhitehead_RowStackcs**dZRS(Ncs&**t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scardsspysol.pys_isAcceptableSequence*s(s_isAcceptableSequence(spysol.pysWhitehead_RowStack*ss Whiteheadcs;**eZ*eZ*dZ*dZ*dZRS(Ncs**ti|dddS(Ns max_roundsi(sKlondikes createGames_(s_spysol.pys createGame*scs**ti|dddS(Nsflipi(sKlondikes startGames_(s_spysol.pys startGame*scsH**|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch*s(sWhitehead_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pys Whitehead*s     s SmallHarpcs**eiZ*dZRS(Nc s**xTtt|iid*r5}*|iiid|ii| ddddq!W*|i*|iii*|iii dS(Nisrowssflipsframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame*s  3 (sLayouts gypsyLayouts Layout_Methods startGame(spysol.pys SmallHarp*s s Eastcliffcs&**eZ*dZ*dZRS(Ncs**ti|dddS(Ns max_roundsi(sKlondikes createGames_(s_spysol.pys createGame*scs**x8tdd*r%}*|iiiddddqW*|i*|iii*|iio*|iiindS(Niisflipsframes( srangesis_ssstalonsdealRowsstartDealSampleswastes dealCards(s_sispysol.pys startGame*s # (s AC_RowStacksRowStack_Classs createGames startGame(spysol.pys Eastcliff*s  s Easthavencs**eZ*dZRS(Ncs#**ti|dddddS(Ns max_roundsiswastei(sKlondikes createGames_(s_spysol.pys createGame*s(sDealRowTalonStacks Talon_Classs createGame(spysol.pys Easthaven*s s Westcliffcs&**eeddZ*dZRS(Nsmax_moveics#**ti|dddddS(Ns max_roundsisrowsi (sKlondikes createGames_(s_spysol.pys createGame*s(s StackWrappersSS_FoundationStacksFoundation_Classs createGame(spysol.pys Westcliff*ss Westhavencs**eZ*dZRS(Ncs)**ti|dddddddS(Ns max_roundsisrowsi swastei(sKlondikes createGames_(s_spysol.pys createGame*s(sDealRowTalonStacks Talon_Classs createGame(spysol.pys Westhaven*s sPasSeulcs**dZ+dZRS(Ncs#**ti|dddddS(Ns max_roundsisrowsi(sKlondikes createGames_(s_spysol.pys createGame*scs:++|i+|iii+|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGame+s (s createGames startGame(spysol.pysPasSeul*s s BlindAlleyscs)++dZ+dZ +dZRS(Ncs#++ti|dddddS(Ns max_roundsisrowsi(sKlondikes createGames_(s_spysol.pys createGame+scs++|i|dSdS(Ncs+|idj|ifS(Ni(scsrankssuit(scspysol.pys+s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook+scs< + +|iiid|iidd +ti|dS(Nsrowssframesi(s_ssstalonsdealRows foundationss Eastcliffs startGame(s_spysol.pys startGame +s%(s createGames _shuffleHooks startGame(spysol.pys BlindAlleys+s  sSomersetcsD + +eZ+eeddZ+eZ+dZ+dZRS(Nsmax_moveic s/++ti|dddddddddS(Ns max_roundsisrowsi swasteistexts(sKlondikes createGames_(s_spysol.pys createGame+scs++xBtdd+r/}+|iiid|ii|ddqW+|i+|iiid|iid+|iiid|iiddS(Niisrowssframesi(srangesis_ssstalonsdealRowsrowssstartDealSample(s_sispysol.pys startGame+s  - #( sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(spysol.pysSomerset +s    sCanistercs/++eZ+eZ+dZ+dZRS(Nc s/++ti|dddddddddS(Ns max_roundsisrowsiswasteistexts(sKlondikes createGames_(s_spysol.pys createGame+scs++x2tdd+r}+|iiiddqW +|i!+|iii"+|iiid|iidd!dS(Niisframessrowsii(srangesis_ssstalonsdealRowsstartDealSamplesrows(s_sispysol.pys startGame+s   (sInitialDealTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(spysol.pysCanister+s   s AgnesSorelcsn#+$+eZ%+eedddeddZ&+eedddeZ'+dZ)+dZ ,+dZ RS( Nsmodi s base_ranksmax_moveics#'+(+ti|dddddS(Ns max_roundsiswastei(sKlondikes createGames_(s_spysol.pys createGame'+scs2)+*+ti|dd++|iii}dS(Nsflipi(sKlondikes startGames_ssstalonsdealSingleBaseCardsc(s_scspysol.pys startGame)+scsP,+-+|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch,+s( sDealRowTalonStacks Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(spysol.pys AgnesSorel#+s  !  sEightTimesEightcs2/+0+eiZ1+eZ2+dZ4+dZRS(Ncs2+3+ti|dddS(Nsrowsi(sKlondikes createGames_(s_spysol.pys createGame2+scsr4+5+x2tdd5+r}6+|iiiddqW7+|i8+|iii9+|iiidS(Niisframes(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame4+s   (sLayouts gypsyLayouts Layout_Methods AC_RowStacksRowStack_Classs createGames startGame(spysol.pysEightTimesEight/+s   s AchtmalAchtcs:+;+dZRS(Ncs;+<+ti|dddd}=+|i}>+|ii|i|iif\}}?+t |i ||dd|i i _ dS(Nsrowsis max_roundsisanchorsne(sKlondikes createGames_slssswastesxsXMsys MfxCanvasTextscanvasstalonstextssrounds(s_slsssxsyspysol.pys createGame;+s ((s createGame(spysol.pys AchtmalAcht:+ssBatsford_ReserveStackcs@+A+dZRS(Ncs@A+B+ti||| o C+dSnD+|ditjSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscardsspysol.pys acceptsCardsA+s (s acceptsCards(spysol.pysBatsford_ReserveStack@+ssBatsfordcsE+F+dZRS(Nc sF+G+ti|dddddd}H+|i}I+|i|i|if\}}J+|i i t |||ddK+|i |i d ||i||id fd dL+|i|i d d M+|idS(Nsrowsi s max_roundsis playcardsis max_cardsiii?Bspriorityisse(sKlondikes createGames_slsssXMsheightsYSsxsysreservessappendsBatsford_ReserveStacks setRegionsYMsXSs createTextsdefaultStackGroups(s_slayoutslsssxsyspysol.pys createGameF+s$ "%7(s createGame(spysol.pysBatsfordE+ss StonewallcsNN+O+eZP+eZQ+ddddd ddfZR+dZ\+dZRS(Niic s'R+S+ti|dddddd}T+|i}U+t|i|id|i}V+|i |i |i d|i |W+xtddW+r}X+xstddX+r`}Y+|i |d|i |i||if\}}Z+|iit|||ddqWqW[+|idS( Nsrowsis max_roundsistextsiis max_accept(sKlondikes createGames_slsssmaxsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups(s_slssshsisjsxsyspysol.pys createGameR+s$ #(  5-cs\+]+d}^+x`|id^+rP}_+|djo`+d }a+|in c+|iiid|d|qWd+|iiid|iie+t o#t |iii djpt dS(Niisflipsframessrows( sframess_sDEALsflipsstartDealSamplessstalonsdealRowsreservess __debug__slenscardssAssertionError(s_sframessflipspysol.pys startGame\+s   #(sInitialDealTalonStacks Talon_Classs AC_RowStacksRowStack_ClasssDEALs createGames startGame(spysol.pys StonewallN+s    s FlowerGardencsBf+g+eeddZh+eZi+ddddd ddfZRS(Nsmax_movei(s StackWrappers RK_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssDEAL(spysol.pys FlowerGardenf+s s KingAlbertcsbj+k+eZl+eeddZm+eZn+dZo+ddddfZp+dZ {+dZ RS(Nsmax_moveii ic sbp+q+ti|ddd|idddd}r+|i}s+t|it|if\}}t+t|i |i ||i }u+|i|id|i||i|v+xt|dv+r}w+xzt|i|dw+r`}x+|i|||i|i ||i f\}} y+|iit|| |ddqWqWz+|idS( Ns max_roundsisrowsswasteistextsis max_accept(sKlondikes createGames_sROWSslsssmaxsRESERVESslensrwsrhsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups( s_slsssrwsrhshsisjsxsyspysol.pys createGamep+s- '#,  5-csB{+|+ti|dddd}+|iiid|iidS(Nsflipisreverseisrows(sKlondikes startGames_ssstalonsdealRowsreserves(s_spysol.pys startGame{+s( sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssROWSsRESERVESs createGames startGame(spysol.pys KingAlbertj+s    sRaglancs/~++dddfZ+dZ+dZRS(Nics++|i|dSdS(Ncs+|idj|ifS(Ni(scsrankssuit(scspysol.pys+s(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook+scs++xBtdd+r/}+|iiid|ii|ddqW+|i+|iiid|iid+|iiid|ii+|iiid|ii dS(Niisrowssframes( srangesis_ssstalonsdealRowsrowssstartDealSamplesreservess foundations(s_sispysol.pys startGame+s - #(sRESERVESs _shuffleHooks startGame(spysol.pysRaglan~+s sBrigadecsP++eeddZ+dZ+ddddfZ+dZ+dZRS(Nsmax_moveiiics++x2tdd+r}+|iiiddqW+|i+|iii+|iiid|ii+|iiid|iidS(Niisframessrows( srangesis_ssstalonsdealRowsstartDealSamplesreservess foundations(s_sispysol.pys startGame+s  cs5++|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch+s(s StackWrappers RK_RowStacksRowStack_ClasssROWSsRESERVESs startGamesshallHighlightMatch(spysol.pysBrigade+s   s Jane_Taloncs,++dZ+dZ+ddZRS(Ncs++dSdS(Ni((s_spysol.pys canFlipCard+scs++t|idjSdS(Ni(slens_scards(s_spysol.pys canDealCards+scs++d}+t|idjo%+|i|iiid|}n+t|idjoe+|ii |+|ii d||iii dddd+|ii |+|d}n+|SdS(Niissoundisframesisshadow( scslens_scardssdealRowsgamesssreservesssoundsflipMovesmoveMoveswaste(s_ssoundscspysol.pys dealCards+s %.i(s canFlipCards canDealCardss dealCards(spysol.pys Jane_Talon+s  sJanecs++eZ+eedddeddZ+eedddeZ+dddZ+d ddZ +d Z +dd Z RS( Nsmodi s base_ranks min_cardsic s++t|dd+tti||f|}+|i}+t |i |i d|i }+|i|i|id|i|+|id|i|i f\}}+xt|d+r} +|| dd@|i} +t| ||dd} +|i d| _+d| _+|ii| +||i d}qW+|i+|iii|i +|i|i |i f\} }+t!|i"| |dd +d t#d d |i$|i%_&dS( Nstextsiiiis max_acceptisanchorsswsfonts canvas_cardscardw('s kwdefaultslayoutsapplysKlondikes createGames_s max_roundsslsssmaxsheightsYMsYSshssetSizeswidthsXMsXSsx0sysrangesreservessisxs OpenStacksstacks CARD_YOFFSETsis_opensappendsdefaultStackGroupsssgs dropstacksstalons MfxCanvasTextscanvassgetFontsCWstextssinfo( s_s max_roundssreservesslayoutslssshsx0sysisxsstackspysol.pys createGame+s& #(&   "ic s5++x]tdt|iid+r;}+|iiid|ii|d|ddd|q$W+|i +|iiid|+|iiid|ii +|iii }+td|idd}+xN|iid+r;}+|ii|i+|iii|i|fqWdS( Niisrowssflipsframessreverses base_ranki (srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSamplesreservessdealSingleBaseCardscsStructsrankscapsupdates__dict__ssaveinfos stack_capssappendsid(s_sflipsreversesiscscapssspysol.pys startGame+s! 9  icsP++|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch+scs++dSdS(Ni((s_ssoundspysol.pys _autoDeal+s( s Jane_Talons Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs AC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatchs _autoDeal(spysol.pysJane+s ! sAgnesBernauer_Taloncs++ddZRS(Ncs&++|i|iiid|SdS(Nssound(s_s dealRowAvailsgamesssreservesssound(s_ssoundspysol.pys dealCards+si(s dealCards(spysol.pysAgnesBernauer_Talon+ss AgnesBernauercsG++eZ+eedddeddZ+dZ+dZRS(Nsmodi s base_ranksmax_moveics)++ti|dddddddS(Ns max_roundsiswasteistexts(sJanes createGames_(s_spysol.pys createGame+scs++ti|dddS(Nsflipi(sJanes startGames_(s_spysol.pys startGame+s(sAgnesBernauer_Talons Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs createGames startGame(spysol.pys AgnesBernauer+s ! i=sCasino KlondikeisVegas KlondikeisKlondike by Threesi:sThumb and PouchiCi's Small HarpiBii!iiksPas SeuliQs Blind Alleysiiis Agnes Sorels8 x 8is Achtmal Achtiiis Flower Gardenis King AlbertiiiisAgnes BernauersGypsycsY , ,eiZ ,eZ ,eZ,eZ,e Z ,dZ ,dZ ",dZ RS(Nc s,,t||if\}},t|dddddd,t|i|f|,|i|i d|i d,|i |ii i |ii i ||_ ,|iio.,t|iii |iii ||_n,xJ|iid,r7},|ii|i|i |i |d|iqW,xA|iid,r.},|ii|i|i |i |qGW,|idS(Nsrowsiswasteistextsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssrspysol.pys createGame,s!-. 5 ,cse,,x8tdd,r%},|iiiddddqW ,|i!,|iiidS(Niisflipsframes(srangesis_ssstalonsdealRowsstartDealSample(s_sispysol.pys startGame,s  # csH",#,|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch",s(sLayouts gypsyLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysGypsy ,s      sGiant_Foundationcs%,&,dZRS(NcsH&,',ti|| o (,dSn),t|iiiidjSdS(Ni(sSS_FoundationStacks canMoveCardss_scardsslensgamessstalon(s_scardsspysol.pys canMoveCards&,s (s canMoveCards(spysol.pysGiant_Foundation%,ssGiantcs*,+,eZ,,dZRS(Ncs',,-,|i.,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame,,s (sGiant_FoundationsFoundation_Classs startGame(spysol.pysGiant*,s s Irmgard_Taloncs/,0,ddZRS(Ncs0,1,|ioe2,t|idjo3,|id|}n)5,|i|iiidd!d|}6,|Sn7,dSdS(Nissoundiii( s_scardsslensdealRowssoundscsgamesssrows(s_ssoundscspysol.pys dealCards0,s  ( i(s dealCards(spysol.pys Irmgard_Talon/,ssIrmgardcsD8,9,dZ:,eiZ;,eZ<,eZ=,dZ?,dZ RS(Nics#=,>,ti|dddddS(Nsrowsi s playcardsi(sGypsys createGames_(s_spysol.pys createGame=,sc s?,@,|ii}A,xRtdddA,r<}B,|iiid||t||!ddddq'WC,|i D,|iiidS(Niiisrowssflipsframes( s_sssrowssrsrangesistalonsdealRowslensstartDealSample(s_srsispysol.pys startGame?,s  : ( s GAME_VERSIONsLayouts harpLayouts Layout_Methods Irmgard_Talons Talon_ClasssKingAC_RowStacksRowStack_Classs createGames startGame(spysol.pysIrmgard8,s      sDieKoenigsbergerin_TaloncsE,F,eiZRS(N(sDealRowTalonStacksdealToStacksOrFoundationss dealToStacks(spysol.pysDieKoenigsbergerin_TalonE,ssDieKoenigsbergerincs/G,H,eZI,eeddZJ,dZRS(Nsmax_moveicsFJ,K,|iL,x,tddL,r}M,|iiiq"WdS(Nii(s_sstartDealSamplesrangesissstalonsdealRow(s_sispysol.pys startGameJ,s  (sDieKoenigsbergerin_Talons Talon_Classs StackWrappersSS_FoundationStacksFoundation_Classs startGame(spysol.pysDieKoenigsbergerinG,s sDieRussische_FoundationcsN,O,dZRS(NcsO,P,ti||| o Q,dSnR,|iokS,|id i}T,|tjo U,d}nV,||ii|ii |dijo W,dSnnX,dSdS(Niii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksACEscapsdirsmod(s_s from_stackscardssrankspysol.pys acceptsCardsO,s   +(s acceptsCards(spysol.pysDieRussische_FoundationN,ssDieRussische_RowStackcsY,Z,dZRS(NcsIZ,[,ti||| o \,dSn],|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscardsspysol.pys acceptsCardsZ,s (s acceptsCards(spysol.pysDieRussische_RowStackY,ss DieRussischecsP^,_,eZ`,eeddZa,eZb,dZd,dZf,dZ RS(Ns min_cardsics#b,c,ti|dddddS(Nsrowsistextsi(sGypsys createGames_(s_spysol.pys createGameb,scs d,e,|i|ddSdS(Ncse,|idj|ifS(Ni(scsrankssuit(scspysol.pyse,si(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHookd,scsf,g,x2tddg,r}h,|iiiddqWi,|ij,x,tddj,r}k,|iiiqZWl,|iiid }m,|iiid|ii |i dfdS(Niisframesiisrowsi( srangesis_ssstalonsdealRowsstartDealSamplescardsscs foundationsssuit(s_siscspysol.pys startGamef,s   ( sInitialDealTalonStacks Talon_Classs StackWrappersDieRussische_FoundationsFoundation_ClasssDieRussische_RowStacksRowStack_Classs createGames _shuffleHooks startGame(spysol.pys DieRussische^,s     sMissMilligan_ReserveStackcsn,o,dZs,dZRS(Ncsao,p,ti||| o q,dSnr,t|idjot|iiiidjSdS(Ni( s AC_RowStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscardsspysol.pys acceptsCardso,s css,t,|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImages,s(s acceptsCardssgetBottomImage(spysol.pysMissMilligan_ReserveStackn,s s MissMilligancsJu,v,eeddZw,eZx,eZy,dddZ,dZRS(Nsmax_moveic sy,z,t||if\}}{,|i|idtd||i|i dtd||i |,|i|i f\}}},|i||||_~,xUtdd~,rB},||i},|ii|i|||d|dqW,|i||i f\}},||i|id||i df\}} ,xKt|d,r8},|i i|i|||,||i }q^W,|i o+,|i|i d | |ddfn!,|i|id ,d },|id||id|i |i f\}},xKt|d,r8},||i},|ii|i|||q<W,|i|i|| ddf,|idS( Niiiissuitiii?Bsss(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsreservessYSsxsys Talon_Classstalonsrangesis foundationssappendsFoundation_ClasssrxsrysReserveStack_Classs setRegions createTextsRowStack_ClasssdefaultStackGroups( s_srowssreservesslsssxsysisrxsryspysol.pys createGamey,s2I 02 " + 5 &"iics',,|i,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame,s ( s StackWrappersSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssMissMilligan_ReserveStacksReserveStack_Classs createGames startGame(spysol.pys MissMilliganu,s   sNomadcs,,,eZ,eZ,eZ,dZRS(Ncs_,,x2tdd,r},|iiiddqW,|i,|iiidS(Niisframes(srangesis_ssstalonsdealRowsstartDealSample(s_sispysol.pys startGame,s   (sSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_Classs ReserveStacksReserveStack_Classs startGame(spysol.pysNomad,s   s MilliganCellcs&,,eZ,dZ,dZRS(Ncs,,ti|dddS(Nsreservesi(s MissMilligans createGames_(s_spysol.pys createGame,scs',,|i,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame,s (s ReserveStacksReserveStack_Classs createGames startGame(spysol.pys MilliganCell,s  s MilliganHarpcs),,eeddZ,ddZRS(Nsmax_moveic s,,xXtt|iid,r9},|iiid|ii|dd|ddq!W,|i ,|iiidS(Nisrowsisflipsframes( srangeslens_sssrowssistalonsdealRowsflipsstartDealSample(s_sflipsispysol.pys startGame,s  7 (s StackWrappersSS_FoundationStacksFoundation_Classs startGame(spysol.pys MilliganHarp,ssCarltoncs,,dZRS(Ncs,,ti|dddS(Nsflipi(s MilliganHarps startGames_(s_spysol.pys startGame,s(s startGame(spysol.pysCarlton,ss LexingtonHarpcs ,,dZ,eZ,eZRS(Ni(s GAME_VERSIONsYukon_AC_RowStacksRowStack_ClasssYukonType_Hints Hint_Class(spysol.pys LexingtonHarp,s  s Brunswickcs,,dZRS(Ncs,,ti|dddS(Nsflipi(s LexingtonHarps startGames_(s_spysol.pys startGame,s(s startGame(spysol.pys Brunswick,ss Mississippics,,dZRS(Ncs,,ti|dddS(Nsrowsi(s LexingtonHarps createGames_(s_spysol.pys createGame,s(s createGame(spysol.pys Mississippi,ssGriffoncs,,dZRS(Ncs,,ti|dddS(Nsflipi(s Mississippis startGames_(s_spysol.pys startGame,s(s startGame(spysol.pysGriffon,ssBlockadecs>,,eiZ,eZ,dZ,dZ,dZRS(Ncs,,ti|dddS(Nsrowsi (sGypsys createGames_(s_spysol.pys createGame,scs',,|i,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame,s cs,,||iijo|i o |iiioU,|i|i},|iii ,|iii d|,|i |ndS(Ni( sstacks_sssrowsscardsstalons enterStatesS_FILLs old_statesflipMovesmoveMoves leaveState(s_sstacks old_statespysol.pys fillStack,s 1(sLayoutsklondikeLayouts Layout_Methods SS_RowStacksRowStack_Classs createGames startGames fillStack(spysol.pysBlockade,s     iAiwsDie Knigsbergerinis Die Russischesranksiii>s Miss MilliganiiNs Milligan Cellis Milligan HarpiiDsLexington HarpiisFortyThieves_Hintcs,,RS(N((spysol.pysFortyThieves_Hint,ss FortyThievescs,,eZ,eZ,eZ,dZ,dZ,ddfZ,dZ ,dddddddZ -dZ -d Z -d Z RS( Niiic sn,,ddf|dj},t|d|d|dd|if\}} ,|ii} ,t |d| d} ,| |i |id|i f\} } ,| ||i| jo,t| | ||_n,t d|i|i|d|i},|i| |i|i||i|i,|i| d| |i d},|i},xbtd| d ,rK},| ii|i|||d || d |i,||i }qwW,|i| ||i d},|i|i},xTt|d ,rA}-| ii|i|||d |i -||i }q W-|i!|i }-|i"|i|i}-t#|||d |d || _&-|i'| i&d-|djo@-t(|i)-||i*d||idd| i&i+_,n -||i } -t-|||| _. -|i | i._/ -|i'| i.d -|i0dS(Ni isXMsXOFFSETsYBOTTOMiiiissuitsmax_moves max_roundssnum_dealsssanchor(1srowssXMsLayouts_sXOFFSETssslsgameinfosdeckssmaxsmaxrowssXSsw1sw2sXCARDSsintsYSs playcardssYOFFSETshssetSizesYMsYBOTTOMsxsysrangesis foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsRowStack_Classs ROW_MAX_MOVEswidthsheightsWasteTalonStacks max_roundssnum_dealstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes CARD_XOFFSETsdefaultStackGroups(s_s max_roundssnum_dealsrowss playcardssXCARDSsXOFFSETsXMslsssdeckssmaxrowssw1sw2shsxsysispysol.pys createGame,sB0*+/#  5 +$ 4i i i@cs--x?t|idd-r%}-|iiiddddqW-x=t|iddd-r}-|iiiddqeW-|i-|iii-|iiidS(Nisflipsframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame-s #  cs--|io||iijo|i o-|i|i}-|ii io-|ii i d|nG-|ii i o0-|ii i -|ii i d|n-|i|ndS(Ni(s_sFILL_EMPTY_ROWSsstacksssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_statespysol.pys fillStack-s+csH- -|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch-s(sSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(spysol.pys FortyThieves,s        sBusyAcescs "-#-ddfZ$-dZRS(Niics$-%-ti|dddS(Nsrowsi (s FortyThievess createGames_(s_spysol.pys createGame$-s(sDEALs createGame(spysol.pysBusyAces"-ssLimitedcs&-'-ddfZRS(Nii(sDEAL(spysol.pysLimited&-ss Courtyardcs(-)-dZ*-dZRS(Ni?Bi(s ROW_MAX_MOVEsFILL_EMPTY_ROWS(spysol.pys Courtyard(-s s WaningMooncs+-,-dZRS(Ncs,---ti|dddS(Nsrowsi (s FortyThievess createGames_(s_spysol.pys createGame,-s(s createGame(spysol.pys WaningMoon+-ssLucascs.-/-dZRS(Ni?B(s ROW_MAX_MOVE(spysol.pysLucas.-ssDeucescs\0-1-eeddddZ2-eeddZ3-ddfZ4-dZ6-dZRS(Nsmodi s base_rankiics4-5-|i|dSdS(Ncs5-|idj|ifS(Ni(scsrankssuit(scspysol.pys5-s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook4-scsC6-7-|i8-|iiid|ii9-ti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss FortyThievess startGame(s_spysol.pys startGame6-s (s StackWrappersSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssDEALs _shuffleHooks startGame(spysol.pysDeuces0-s  sCoronacs2:-;-dZ<-ddfZ=-dZ>-dZRS(Niiics>-?-ti|dddS(Nsrowsi (s FortyThievess createGames_(s_spysol.pys createGame>-s(sFOUNDATION_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(spysol.pysCorona:-s  s QuadranglecsA@-A-eedddeZB-eeddZC-dZRS(Nsmodi s base_rankcs*C-D-ti|E-|iiidS(N(s FortyThievess startGames_ssstalonsdealSingleBaseCard(s_spysol.pys startGameC-s(s StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SS_RowStacksRowStack_Classs startGame(spysol.pys Quadrangle@-ss FortyAndEightcsF-G-dZRS(Nc s/G-H-ti|dddddddddS(Ns max_roundsisrowsisXCARDSiHsXOFFSET(s FortyThievess createGames_(s_spysol.pys createGameG-s(s createGame(spysol.pys FortyAndEightF-ss LittleFortycs,I-J-eZK-dZL-dZM-dZRS(Ni?Bics)M-N-ti|dddddddS(Ns max_roundsisnum_dealisXOFFSETi(s FortyThievess createGames_(s_spysol.pys createGameM-s(sSpider_SS_RowStacksRowStack_Classs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(spysol.pys LittleFortyI-s   sStreetscsO-P-eZQ-dZRS(NcsHQ-R-|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchQ-s(s AC_RowStacksRowStack_ClasssshallHighlightMatch(spysol.pysStreetsO-s sMariacsT-U-dZRS(NcsU-V-ti|dddS(Nsrowsi (sStreetss createGames_(s_spysol.pys createGameU-s(s createGame(spysol.pysMariaT-ss NumberTencsW-X-dZY-ddfZRS(Ni?Bi(s ROW_MAX_MOVEsDEAL(spysol.pys NumberTenW-s s RankAndFilecsZ-[-dZ\-ddfZRS(Ni?Bii(s ROW_MAX_MOVEsDEAL(spysol.pys RankAndFileZ-s s TripleLinecsD]-^-dZ_-dZ`-dZa-ddfZb-dZc-dZRS(Niii?Biics#c-d-ti|dddddS(Ns max_roundsisrowsi (sStreetss createGames_(s_spysol.pys createGamec-s(s GAME_VERSIONsFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(spysol.pys TripleLine]-s     s RedAndBlackcsJe-f-eZg-dZh-ddfZi-dZk-dZm-dZRS(Ni?Biicsi-j-ti|dddS(Nsrowsi(s FortyThievess createGames_(s_spysol.pys createGamei-scsk-l-|i|dSdS(Ncsl-|idj|ifS(Ni(scsrankssuit(scspysol.pysl-s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookk-scsCm-n-|io-|iiid|iip-ti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationssStreetss startGame(s_spysol.pys startGamem-s (sAC_FoundationStacksFoundation_Classs ROW_MAX_MOVEsDEALs createGames _shuffleHooks startGame(spysol.pys RedAndBlacke-s     sZebracs,q-r-dZs-dZt-dZu-dZRS(Niics)u-v-ti|dddddddS(Ns max_roundsisrowsisXOFFSETi(s FortyThievess createGames_(s_spysol.pys createGameu-s(sFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(spysol.pysZebraq-s   sIndian_RowStackcsw-x-dZRS(Ncs&x-y-t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scardsspysol.pys _isSequencex-s(s _isSequence(spysol.pysIndian_RowStackw-ssIndiancs5z-{-eZ|-ddfZ}-dZ-dZRS(Niics#}-~-ti|dddddS(NsXCARDSiJsXOFFSETi(s FortyThievess createGames_(s_spysol.pys createGame}-scsH--|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch-s(sIndian_RowStacksRowStack_ClasssDEALs createGamesshallHighlightMatch(spysol.pysIndianz-s  s Midshipmancs --ddfZ-dZRS(Nics--ti|dddS(Nsrowsi (s FortyThievess createGames_(s_spysol.pys createGame-s(sDEALs createGame(spysol.pys Midshipman-ssNapoleonsExilecs)--eZ-ddfZ-dZRS(Niics5--|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch-s(s RK_RowStacksRowStack_ClasssDEALsshallHighlightMatch(spysol.pysNapoleonsExile-s s DoubleRailcs)--dZ-ddfZ-dZRS(Ni?Biics--ti|dddS(Nsrowsi(s FortyThievess createGames_(s_spysol.pys createGame-s(s ROW_MAX_MOVEsDEALs createGame(spysol.pys DoubleRail-s s SingleRailcs--dZRS(Ncs#--ti|dddddS(NsrowsisXCARDSi0(s FortyThievess createGames_(s_spysol.pys createGame-s(s createGame(spysol.pys SingleRail-si s Forty ThievessaltnamessNapoleon at St.Helenas Le CadraniPs Busy AcesiiOs Waning Mooni}imiiinisForty and Eightiss Little FortyiLiIiFs Number TeniGs Rank and FilesEmperori~s Red and BlackiqiEiJis Double Railis Single RailsDiplomatcsz--eZ-eZ-eZ-dZ-dZ-ddfZ-dZ -dZ -dZ -dZ -dZ RS(Niiic s--t||if\}}-|i|id|i|id|i-|i|if\}}-xat dd-rN}-|i i|i|||d|d-d|i-||i}q}W-|i||if\}}-xWt dd-rD}-|ii|i|||-d|i-||i}qW-|i|i|if\}}-t|||dd|_-|i|id -||i}-t||||_-|i|id -|idS( Niiissuitismax_moves max_roundsisnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsrowssRowStack_Classs ROW_MAX_MOVEsheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssxsysispysol.pys createGame-s*/ % "cs--x9t|idd-r}-|iiiddqW-|i-x3t|idd-r}-|iiiqhW-|iiidS(Nisframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame-s   cs--|io||iijo|i o-|i|i}-|ii io-|ii i d|nG-|ii i o0-|ii i -|ii i d|n-|i|ndS(Ni(s_sFILL_EMPTY_ROWSsstacksssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_statespysol.pys fillStack-s+cs5--|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch-s(sSS_FoundationStacksFoundation_Classs RK_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(spysol.pysDiplomat-s         sLadyPalkcs--dZRS(Ni?B(s ROW_MAX_MOVE(spysol.pysLadyPalk-ssCongresscs)--ddfZ-dZ-dZRS(Niic sL--t||if\}}-|i|id|i|id|i-xt dd-r}-xt dd-ro}-|id||i|i||if\}}-|ii|i|||d|-d|iq}WqbW-xt dd-r}-xt dd-r}-|idd||i|i||if\}}-|i|||d|i}-d|_-|ii|q$Wq W.|i|if\}}.t|||dd |_.|i|id .||i}.t||||_.|i|id .|idS( Niiiissuitsmax_moveis max_roundsisss(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsys foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsRowStack_Classs ROW_MAX_MOVEsstacks CARD_YOFFSETsrowssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssisjsxsysstackspysol.pys createGame-s0/  5!  9! (sDEALsFILL_EMPTY_ROWSs createGame(spysol.pysCongress-s iis Lady PalkisDoubleKlondikecsN ..eiZ.eZ.eZ.d ddZ%.dZ+.dZ RS(Nc s@..t||if\}}.t|dddddddd.t|i|f|.|i|i d|i d.t |ii i |ii i |.d |d ||_ .t|iii |iii ||_.xG|iid.r4}.|iit|i |i |d |iqW.xA|iid.r.}.|ii|i|i |i |qBW.|i.|djo.to|i iitjpt .|i|i d \}}} } !.|i$do".|d |i%}n#.t&|i'||d| |i i_n$.|SdS(Nsrowsi swasteistextss playcardsiis max_roundssnum_dealssuitsnnisanchor((sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizesWasteTalonStackstalonsxsys max_roundssnum_deals WasteStackswastes foundationssrsappendsSS_FoundationStackssuitsrowssRowStack_Classs defaultAlls __debug__stextssroundssNonesAssertionErrors getTextAttrstxstystastfsgetsYMs MfxCanvasTextscanvas( s_s max_roundssnum_dealslayoutslsssrstxstystastfspysol.pys createGame.s*%!!* 2 , '$+ic s%.&.xXtt|iid&.r9}'.|iiid|ii|dddddq!W(.|i).|iii*.|iii dS(Nisrowsisflipsframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame%.s  7 csH+.,.|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch+.s( sLayouts harpLayouts Layout_MethodsKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysDoubleKlondike .s     sDoubleKlondikeByThreescs../.dZRS(Ncs/.0.ti|dddS(Nsnum_deali(sDoubleKlondikes createGames_(s_spysol.pys createGame/.s(s createGame(spysol.pysDoubleKlondikeByThrees..ss Gargantuacs1.2.dZRS(Ncs2.3.ti|dddS(Ns max_roundsi(sDoubleKlondikes createGames_(s_spysol.pys createGame2.s(s createGame(spysol.pys Gargantua1.ssBigHarpcs&4.5.eZ6.dZ8.dZRS(Ncs#6.7.ti|dddddS(Ns max_roundsisrowsi (sDoubleKlondikes createGames_(s_spysol.pys createGame6.sc s8.9.xTtt|iid9.r5}:.|iiid|ii| ddddq!W;.|i<.|iii=.|iii dS(Nisrowssflipsframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame8.s  3 (s AC_RowStacksRowStack_Classs createGames startGame(spysol.pysBigHarp4.s  sStepscs>.?.eZ@.dZRS(Ncs#@.A.ti|dddddS(Ns max_roundsisrowsi(sDoubleKlondikes createGames_(s_spysol.pys createGame@.s(s AC_RowStacksRowStack_Classs createGame(spysol.pysSteps>.s isDouble KlondikeisDouble Klondike by ThreesiisBig Harpi3sPictureGallery_HintcsL.M.dZRS(Nc sM.N.|i}O.x|iidO.r}P.|i|ii\}}Q.|o |djoR.|i }S.t o||j o|pt T.t o|itjpt U.||iijoV.dd|ii}n X.d}Y.|d|i|i}Z.|i|d||nq!W[.|i oV\.xL|iid\.r9}].|i}^.| pt|djo _.qJn`.||iijo[a.|i|d|id } b.| it|o c.qJnd.dd|ii}n f.d}g.x||iidg.ri}h.||j o|i||o@i.|d|i|di}j.|i|d||k.PnqWqJWnl.|i om.x|iidm.r}n.|i}o.| pt|djo p.qnq.|i|d|id } r.| it|o s.qnt.x||ii dt.ri}u.||j o|i||o@v.dd|i|di}w.|i|d||x.Pnq@WqWny.|i oz.x|ii dz.r}{.|i}|.| p,t|djpt|t|ijo }.qn~.d }.x||ii d.ri}.||j o|i||o@.|d|i|di}.|i|d||.PnqOWqWn.|i!d jo:.|i"o&.|i|i#d|ii$tnndS( Niii_iids stackcardsi8ipi`i(%s_sgamessgs dropstackssrs canDropCardssss foundationsstsnsgetCardscs __debug__sAssertionErrorsranksACEstableauxscaps base_ranks base_scoresKsscoresaddHintshintssgetPilespileslens ClonedStackscardssrrs acceptsCardssNonesrowsslevels canDealCardss SCORE_DEALstalon( s_sgamesrstsnscs base_scoresscorespilesrrspysol.pys computeHintsM.s|  %! !      #     # :   #(s computeHints(spysol.pysPictureGallery_HintL.ssPictureGallery_Foundationcs..dZ.dZRS(Nc s]..ti||||dtdddddd.td|iii i d|_ dS( Ns base_ranksdirismax_moves max_cardsiii ( sRK_FoundationStacks__init__s_sxsysgamesACEsminsappsimagess CARD_YOFFSET(s_sxsysgamespysol.pys__init__.s1cs ..|iiiitSdS(N(s_sgamesappsimagess getLettersACE(s_spysol.pysgetBottomImage.s(s__init__sgetBottomImage(spysol.pysPictureGallery_Foundation.s sPictureGallery_TableauStackcs)..dZ.dZ.dZRS(Nc s>..ti||||d|dddd.||_dS(Ns base_ranksdiris max_accepti( s SS_RowStacks__init__s_sxsysgames base_ranksyoffsets CARD_YOFFSET(s_sxsysgames base_ranksyoffsetspysol.pys__init__.s+csh..ti||| o .dSn.|io|idi|iijo .dSn.dSdS(Nii(s SS_RowStacks acceptsCardss_s from_stackscardssrankscaps base_rank(s_s from_stackscardsspysol.pys acceptsCards.s  * cs&..|iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_spysol.pysgetBottomImage.s(s__init__s acceptsCardssgetBottomImage(spysol.pysPictureGallery_TableauStack.s  sPictureGallery_RowStackcs..dZ.dZRS(Ncs^..ti||| o .dSn.|ip|iiiio .dSn.dSdS(Nii(s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalon(s_s from_stackscardsspysol.pys acceptsCards.s    cs..|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_spysol.pysgetBottomImage.s(s acceptsCardssgetBottomImage(spysol.pysPictureGallery_RowStack.s sPictureGallerycsV..eZ.dZ.dZ.dZ.dZ.dZ.dZRS(Nc s..t||if\}}.tdtd|id}.|id|}.dd|i|i dd}.|i d|i |i|id||i|.|idg.|id|i |i d}.|i|i d}.|iit|||.|i}.xdddfd.rv}.|i}.xQtdd.r>} .|iit||||d |.||i }qdW.||}q=W.|i||if\}}.xNtdd.r;}.|iit|||d d.||i }qW.|id|i |i d}.|i|i}.t||||_.|i |id .|i!|i||i"dd d ||i f.|i|i|i|i#_$.|ig|i#_%.|i|i|i#_&dS(Ni ii iistableauxiisyoffsets max_acceptsseii?B('sLayouts_ssslsminsmaxsYOFFSETsTABLEAU_YOFFSETsYSsthsCHshssetSizesXSsXMsYMsaddattrsxsys foundationssappendsPictureGallery_FoundationsisrangesjstableauxsPictureGallery_TableauStacksrowssPictureGallery_RowStacksheightsDealRowTalonStackstalons createTexts setRegionsCWssgs openstackss talonstackss dropstacks( s_slsssTABLEAU_YOFFSETsthshsxsysisjspysol.pys createGame.s>"#7"    ( %"5 csL..|iiid|iidd.|i.|iiidS(Nsrowssframesi(s_ssstalonsdealRowstableauxsstartDealSample(s_spysol.pys startGame.s% cs..t|iididjo .dSn.x=|iid.r*}.t|idjo .dSnqCW.dSdS(Niiii(slens_sss foundationsscardsstableauxsstack(s_sstackspysol.pys isGameWon.s#  csj..|iiioP.||iijot|idjo .|iiid|gnndS(Nisrows(s_ssstalonscardssstacksrowsslensdealRow(s_sstackspysol.pys fillStack.s,csv..|itjp |itjo .dSn.|i|ijo+|id|ijp|id|ijSdS(Nii(scard1sranksACEscard2ssuit(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch.s# cs..fSdS(N((s_spysol.pysgetHighlightPilesStacks.s(sPictureGallery_Hints Hint_Classs createGames startGames isGameWons fillStacksshallHighlightMatchsgetHighlightPilesStacks(spysol.pysPictureGallery.s      sPicture Gallerys Braid_Hintcs..RS(N((spysol.pys Braid_Hint.ssBraid_Foundationcs..dZ.dZRS(Nc sQ..t|dddddtdd.tti|||||f|dS(Nsmodi sdiris base_ranksmax_move( s kwdefaultscapsNO_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__.s%cs..ti||| o .dSn.|i o .dSn.|ii}.|djo?.|id|id |df}.|dd fjSn..|id i ||i i |di jSdS(Niiscards( sAbstractFoundationStacks acceptsCardss_s from_stackscardssgamesgetFoundationDirs stack_dirs getRankDirscard_dirsrankscapsmod(s_s from_stackscardss stack_dirscard_dirspysol.pys acceptsCards.s  '(s__init__s acceptsCards(spysol.pysBraid_Foundation.s sBraid_BraidStackcs..ddZRS(Nc s$..ti||||.|iiii|_.|iiii }.|o.g|_ .d}.d|dti|}.d}.x_t|d.rL} .tt|ti| d}.|i i||.|}qWn+.d |d|d|d |f|_ dS( Ni f0.4iiif0.45f0.35f0.55(s OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSETsCARDWsCWssines CARD_XOFFSETsnsmathspisdxslast_xsrangesisintsroundssinsappend( s_sxsysgamessinesCWsnsdxslast_xsispysol.pys__init__.s     &i(s__init__(spysol.pysBraid_BraidStack.ssBraid_RowStackcs..dZ.dZRS(NcsN..|i o|iiiio&.|iid|iii|ndS(Ni(s_scardssgamesssbraidsmoveMove(s_spysol.pys fillStack.s!cs..|iiiiSdS(N(s_sgamesappsimagessgetBraidBottom(s_spysol.pysgetBottomImage.s(s fillStacksgetBottomImage(spysol.pysBraid_RowStack.s sBraid_ReserveStackcs//dZ/dZRS(NcsW//||iiijp||iiijo /dSn/ti|||SdS(Ni( s from_stacks_sgamesssbraidsrowss ReserveStacks acceptsCardsscards(s_s from_stackscardsspysol.pys acceptsCards/s/ cs//|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_spysol.pysgetBottomImage/s(s acceptsCardssgetBottomImage(spysol.pysBraid_ReserveStack/s sBraidcs//eZ /dZ /eZ /dZ4/dZ:/dZI/dZL/dZN/dZ R/dZ U/d Z W/d Z RS( Nic s / /t||if\}} /td|id|i|id|i}/|i d|i |i |i |/t |_/|idt /|i |i f\}}/xtdd/rn}/|iit|d|i ||/|iit|d |i ||/|d |i}qW/|i |i}/xtdd/r}/|iit|||/|iit||i ||/|iit|||i|/|iit||i ||i|/|d|i }qaW/|i |i d d|i f\}}/t||||_/|i d |i |i |id df\}} /t|||d d |_!/|i|id"/t|i#/||id||i $/dd|ii _!%/||i }&/t"||||_#'/|i|i#d(/|i d|i })/|i }*/xttdd*/ra}+/|i$it%||||,/|i$it%||i |||-/||i}qwW./t|i//||i|i d|0/dddt&dd|i|i _'1/|ig|i#g|i(_)2/|i$|i|i(_*3/|ig|i|i#g|i(_+dS(Niiii sbraidiif0.5f4.5iiis max_roundsssssanchorssisnsfonts canvas_cardscardw(,sLayouts_ssslsmaxsYSs BRAID_CARDSsYOFFSETshssetSizesXSsXMsYMsNones base_cardsaddattrsxsysrangesisrowssappendsBraid_RowStacksBraid_ReserveStacksBraid_BraidStacksbraidsWasteTalonStackstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes foundationssBraid_FoundationsgetFontsinfossgs talonstackss openstackss dropstacks(s_slssshsxsysispysol.pys createGame /sV2(  ** &&-*5   ") *cs4/5/d |it|ii}}6/x56/||it|i i jo7/|d}q.W8/||||f\||<||<9/|SdS(Ni( s_s BRAID_CARDSslensssrowssnsmscardsssuitsgameinfossuits(s_scardssnsmspysol.pys _shuffleHook4/s %#%csM:/;/t|_/xDt|id>/r.}?/|ii i d|ii gddq>W@/|ii i ddA/|ii i d |_B/|ii d|ii}C/|i|ii D/|id|ii |E/|iF/x.|ii dF/r}G/|ii|i_qWH/|ii idS(Nisrowssframesiii(sNones_s base_cards updateTextsstartDealSamplesranges BRAID_CARDSsissstalonsdealRowsbraidscardss foundationsssuitsto_stacksflipMovesmoveMovesrankscaps base_ranks dealCards(s_sisto_stackssspysol.pys startGame:/s     ,  csPI/J/|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchI/scsL/M/fSdS(N((s_spysol.pysgetHighlightPilesStacksL/scsTN/O/|i|ii|_P/x.|iidP/r}Q/|ii|i _ q.WdS(Ni( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamessspysol.pys_restoreGameHookN/s cs2R/S/|iidtT/|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_spspysol.pys _loadGameHookR/scsU/V/|i|iidS(N(spsdumps_s base_cardsid(s_spspysol.pys _saveGameHookU/scsW/X/|idjp |ii o Y/dSnZ/|i o [/d}ni]/|i|ii}^/|i}_/|djo`/|d}n#a/|d job/|d}nc/|iii d|dS(Niss Ascendings Descendingstext( s_spreviewstextssinfos base_cardstsRANKSsranksgetFoundationDirsdirsconfig(s_stsdirspysol.pys updateTextW/s!  ( s Braid_Hints Hint_Classs BRAID_CARDSsRANKSs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackss_restoreGameHooks _loadGameHooks _saveGameHooks updateText(spysol.pysBraid/s    )       s LongBraidcsd/e/dZRS(Ni(s BRAID_CARDS(spysol.pys LongBraidd/sis Long Braids Spider_Hintcs&j/k/dZl/dZn/dZRS(Nicsl/m/dSdS(Ni((s_spysol.pys_preferHighRankMovesl/scs*n/o/ti||||| o p/dSnq/|i|d|}r/|i ||os/t |i djo t/dSnu/|di |i d i joAv/t |djp|di |d i jo w/dSnnx/|i djot |djo y/dSnz/dSn{/dSdS(Nis stackcardsi(sSpiderType_Hints shallMovePiles_srstspilesrpiles ClonedStacksrrs acceptsCardsslenscardsssuitslevel(s_srstspilesrpilesrrspysol.pys shallMovePilen/s   "2&  (sBONUS_SAME_SUIT_MOVEs_preferHighRankMovess shallMovePile(spysol.pys Spider_Hintj/s  sSpider_SS_Foundationcs |/}/edZ/dZRS(Nc s[}/~/t|dd dt/dddddd/tti|||||f|dS( Nsdiris base_ranks min_accepti s max_acceptsmax_movei( s kwdefaultscapsKINGsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__}/scsK//ti||| o /dSn/t||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisSameSuitSequencescapsmodsdir(s_s from_stackscardsspysol.pys acceptsCards/s (sANY_SUITs__init__s acceptsCards(spysol.pysSpider_SS_Foundation|/ssSpider_AC_Foundationcs//dZRS(NcsK//ti||| o /dSn/t||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisAlternateColorSequencescapsmodsdir(s_s from_stackscardsspysol.pys acceptsCards/s (s acceptsCards(spysol.pysSpider_AC_Foundation/ssSpider_RowStackcs//dZRS(Ncs//t|idjo/tdfSn/|id }/xG|d/r:}/||j o|i||o/|dfSnqJW/tdfSdS(Ni i(slens_scardssNonesstackssss acceptsCards(s_sstacksscardsssspysol.pys canDropCards/s #(s canDropCards(spysol.pysSpider_RowStack/ss RelaxedSpidercsY//eiZ/eZ/eZ/eZ/e Z /dZ /dZ /dZ RS(Nc s//t||if\}}/t|dddddddd/t|i|f|/|i|i d|i d/|i |ii i |ii i ||_ /|iio./t|iii |iii ||_n/xG|iid/r4}/|ii|i|i |i |d tqW/xA|iid/r.}/|ii|i|i |i |qJW/|idS( Nsrowsi swasteistextsis playcardsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClasssANY_SUITsrowssRowStack_Classs defaultAll(s_slayoutslsssrspysol.pys createGame/s%!-. 2 ,cs//x8tdd/r%}/|iiiddddqW/|i/|ii}/|d|d|d|df}/|iiid|dd/|iiidS( Niisflipsframesiii srows( srangesis_ssstalonsdealRowsstartDealSamplesrowssr(s_sisrsrowsspysol.pys startGame/s # %csI//|id|ii|ijp|id|ii|ijSdS(Ni(scard1sranksstack1scapsmodscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch/s(sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSpider_SS_FoundationsFoundation_ClasssSpider_RowStacksRowStack_Classs Spider_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pys RelaxedSpider/s      sSpidercs//dZRS(Ncse//ti| o /dSn/x2|iid/r}/|i o /dSnq4W/dSdS(Nii(s RelaxedSpiders canDealCardss_sssrowssrscards(s_srspysol.pys canDealCards/s  (s canDealCards(spysol.pysSpider/ssBlackWidow_RowStackcs//dZRS(Ncs//ti||SdS(N(sSpider_RowStacks canDropCardss_sstacks(s_sstacksspysol.pys canDropCards/s(s canDropCards(spysol.pysBlackWidow_RowStack/ss BlackWidowcs//eZRS(N(sBlackWidow_RowStacksRowStack_Class(spysol.pys BlackWidow/ssGroundForADivorce_Taloncs//ddZRS(Ncs{//|io`/td|iii}/| o/|iiid }n/|id|d|Sn/dSdS(Ncs /|iS(N(srscards(srspysol.pys/sisrowsssoundi(s_scardssfiltersgamesssrowss dealRowAvailssound(s_ssoundsrowsspysol.pys dealCards/s   i(s dealCards(spysol.pysGroundForADivorce_Talon/ssGroundForADivorcecsb//eiZ/eZ/eededdZ/ee ddZ /dZ /dZ RS(Ns base_ranksmodi cs//ti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_spysol.pys createGame/scs_//x2tdd/r}/|iiiddqW/|i/|iiidS(Niisframes(srangesis_ssstalonsdealRowsstartDealSample(s_sispysol.pys startGame/s   ( sLayouts harpLayouts Layout_MethodsGroundForADivorce_Talons Talon_Classs StackWrappersSpider_SS_FoundationsANY_RANKsFoundation_ClasssSpider_RowStacksRowStack_Classs createGames startGame(spysol.pysGroundForADivorce/s    sGrandmothersGamecs)//eiZ/dZ/dZRS(Ncs//ti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_spysol.pys createGame/scs_//x2tdd/r}/|iiiddqW/|i/|iiidS(Niisframes(srangesis_ssstalonsdealRowsstartDealSample(s_sispysol.pys startGame/s   (sLayouts harpLayouts Layout_Methods createGames startGame(spysol.pysGrandmothersGame/s  s Spiderettecs//dZ/dZRS(Ncs#//ti|dddddS(Nsrowsis playcardsi(sSpiders createGames_(s_spysol.pys createGame/sc s//xWtdt|iid/r5}/|iiid|ii|ddddq$W/|i/|iiidS(Niisrowssflipsframes( srangeslens_sssrowssistalonsdealRowsstartDealSample(s_sispysol.pys startGame/s ! 3 (s createGames startGame(spysol.pys Spiderette/s sBabySpiderettecs//eZRS(N(sBlackWidow_RowStacksRowStack_Class(spysol.pysBabySpiderette/ss WillOTheWispcs//dZRS(Ncse//x8tdd/r%}/|iiiddddqW/|i/|iiidS(Niisflipsframes(srangesis_ssstalonsdealRowsstartDealSample(s_sispysol.pys startGame/s  # (s startGame(spysol.pys WillOTheWisp/ss SimpleSimoncs&//eZ/dZ/dZRS(Ncs#//ti|dddddS(Nsrowsi stextsi(sSpiders createGames_(s_spysol.pys createGame/scs~//xQdddddddfd/r/}/|iiid |ii| d dq$W/|i/|iiidS( Ni iiiiiiisrowssframes(sls_ssstalonsdealRowsrowssstartDealSample(s_slspysol.pys startGame/s ! - (sInitialDealTalonStacks Talon_Classs createGames startGame(spysol.pys SimpleSimon/s  sRachelcs;//eeddZ/eZ/dZ/dZRS(Ns max_roundsics)//ti|dddddddS(Nswasteisrowsistexts(s RelaxedSpiders createGames_(s_spysol.pys createGame/scs://|i/|iii/|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGame/s (s StackWrappersWasteTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(spysol.pysRachel/s  sScorpion_RowStackcs//eiZRS(N(sSpider_RowStacks canDropCards(spysol.pysScorpion_RowStack/ssScorpioncsJ/0eedeZ0dZ0dZ 0dZ 0dZRS(Ns base_rankcs#00ti|dddddS(Nsrowsis playcardsi(s RelaxedSpiders createGames_(s_spysol.pys createGame0sc s00xddddddfd0rd}0|iiid|ii| dddd0|iiid|ii|ddddq!W0|i0|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_sispysol.pys startGame0s  /3 csH 0 0|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch 0scs 0 0fSdS(N((s_spysol.pysgetHighlightPilesStacks 0s(s StackWrappersScorpion_RowStacksKINGsRowStack_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(spysol.pysScorpion/s    sWaspcs00eZ0dZRS(Nc s00xddddddfd0rd}0|iiid|ii| dddd0|iiid|ii|ddddq!W0|i0|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_sispysol.pys startGame0s  /3 (sScorpion_RowStacksRowStack_Classs startGame(spysol.pysWasp0s sRougeEtNoir_RowStackcs00dZRS(Ncs00|i o0tdfSn0x||d0ro}0xc|id |id fd0r@}0||j o|i||o0|t|fSnqYWq.W0tdfSdS(Niii (s_scardssNonesstackssss acceptsCardsslen(s_sstacksssscardsspysol.pys canDropCards0s " #(s canDropCards(spysol.pysRougeEtNoir_RowStack0ss RougeEtNoircsA0 0eiZ!0eZ"0eZ#0dZ50dddZRS(Nc s#0$0t||if\}}%0t|dddddddd&0t|i|f|'0|i|i d|i d(0|i |ii i |ii i ||_ )0|iio.*0t|iii |iii ||_n+0x]td d+0rJ},0|ii|}-0|iit|i |i |d |d dqW.0xUtd d.0rB}/0|ii|d }00|iit|i |i |q`W10xA|iid10r.}20|ii|i|i |i |qW30|i40|SdS( Nsrowsi swasteistextsis playcardsiissuitsmax_move(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacksrangesis foundationssrsappendsAC_FoundationStacksSpider_AC_FoundationsrowssRowStack_Classs defaultAll(s_slayoutslsssisrspysol.pys createGame#0s(%!-. 5 ) , c s5060x^tdt|iid60r<}70|iiid|ii| d|ddd|q$W80|i 90|iiid|iid d|dS(Niisrowssflipsframessreversei( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesispysol.pys startGame50s ! : ii( sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssRougeEtNoir_RowStacksRowStack_Classs createGames startGame(spysol.pys RougeEtNoir0s     sRelaxed Spideri1s Black WidowisGround for a DivorceirsGrandmother's Gameii/sBaby Spiderettei0sWill o' the Wispi2s Simple Simoniiis Rouge et NoirsFreeCell_RowStackcs)R0S0dZ\0dZ_0dZRS(NcsS0T0t|iiid}U0t|iii}V0|djoW0|d}nX0x<X0|djo |djoY0|d}Z0|d}q^W[0|SdS(Niiii( sgetNumberOfFreeStackss_sgamesssreservessmax_movesrowssnsto_stack_ncards(s_sto_stack_ncardssmax_movesnspysol.pys _getMaxMoveS0s cs?\0]0|id}^0t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_movespysol.pys canMoveCards\0scsK_0`0|it|i}a0t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves AC_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_movespysol.pys acceptsCards_0s(s _getMaxMoves canMoveCardss acceptsCards(spysol.pysFreeCell_RowStackR0s sFreeCellcseb0c0eiZd0eZe0eZf0eZg0e e ddZ h0dZ u0dZ }0dZRS(Nic sh0i0t||if\}}j0t|ddddddk0t|i|f|l0|i|i d|i dm0|i |ii i |ii i ||_ n0xJ|iidn0r7}o0|ii|i|i |i |d|iqWp0xA|iidp0r.}q0|ii|i|i |i |q Wr0x>|iidr0r+}s0|iit|i |i |qPWt0|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutslsssrspysol.pys createGameh0s!- 5 , )csu0v0x2tddv0r}w0|iiiddqWx0|iy0|iiiz0|ii}{0|iiid|d |0t o#t |iii djpt dS(Niisframessrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrs __debug__slenscardssAssertionError(s_sisrspysol.pys startGameu0s  csH}0~0|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch}0s(sLayoutsfreeCellLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssFreeCell_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysFreeCellb0s     sRelaxedFreeCellcs&00eZ0eedddZRS(Nii(s AC_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Class(spysol.pysRelaxedFreeCell0s sForeCellcs&00eedeZ0dZRS(Ns base_rankcs00x2tdd0r}0|iiiddqW0|i0|iii0|iiid|ii0to#t |iii djpt dS(Niisframessrows( srangesis_ssstalonsdealRowsstartDealSamplesreservess __debug__slenscardssAssertionError(s_sispysol.pys startGame0s  (s StackWrappersFreeCell_AC_RowStacksKINGsRowStack_Classs startGame(spysol.pysForeCell0ss Stalactitescsn00eededdddZ0eeddddZ0eZ0d Z0d Z 0d Z RS( Nssuitsmodi s min_cardsismax_moves max_acceptics00ti|dddS(Nsreservesi(sFreeCells createGames_(s_spysol.pys createGame0scs00x2tdd0r}0|iiiddqW0|i0|iii0|iiid|ii0to#t |iii djpt 0|i t dS(Niisframessrows(srangesis_ssstalonsdealRowsstartDealSamples foundationss __debug__slenscardssAssertionErrors_restoreGameHooksNone(s_sispysol.pys startGame0s  -cs?00x2|iid0r}0|idi|i_qWdS(Ni(s_sss foundationsscardssrankscaps base_rank(s_sgamessspysol.pys_restoreGameHook0s ( s StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs BasicRowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGames_restoreGameHook(spysol.pys Stalactites0s !   sRelaxed FreeCelli.iMsBakersGame_RowStackcs)00dZ0dZ0dZRS(Ncs00t|iiid}0t|iii}0|djo0|d}n0x<0|djo |djo0|d}0|d}q^W0|SdS(Niiii( sgetNumberOfFreeStackss_sgamesssreservessmax_movesrowssnsto_stack_ncards(s_sto_stack_ncardssmax_movesnspysol.pys _getMaxMove0s cs?00|id}0t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_movespysol.pys canMoveCards0scsK00|it|i}0t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves SS_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_movespysol.pys acceptsCards0s(s _getMaxMoves canMoveCardss acceptsCards(spysol.pysBakersGame_RowStack0s s BakersGamecsG00eiZ0eZ0eZ0dZ0dZ0dZ RS(Nc s00t||if\}}0t|dddddd0t|i|f|0|i|i d|i d0t |ii i |ii i ||_ 0xJ|iid0r7}0|iiit|i |i |d|iqW0xA|iid0r.}0|ii|i|i |i |qW0xA|iid0r.}0|iiit|i |i |qMW0|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizesInitialDealTalonStackstalonsxsys foundationssrsappendsSS_FoundationStackssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutslsssrspysol.pys createGame0s!* 5 , ,cs00x2tdd0r}0|iiiddqW0|i0|iii0|ii}0|iiid|d 0t o#t |iii djpt dS(Niisframessrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrs __debug__slenscardssAssertionError(s_sisrspysol.pys startGame0s  csH00|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch0s( sLayoutsfreeCellLayouts Layout_MethodsBakersGame_RowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pys BakersGame0s     sKingOnlyBakersGamecs00eedeZRS(Ns base_rank(s StackWrappersFreeCell_SS_RowStacksKINGsRowStack_Class(spysol.pysKingOnlyBakersGame0ssEightOffcs#00dddZ0dZRS(Nc sv00t||if\}}0td|i|idd|i}0t||}0|i |i ||i |i|i||i0|i |d|i d|if\}}0xKtdd0r8} 0|iit|||| 0||i }qW0|i |||i d||if\}}0xKt|d0r8} 0|ii|i|||0||i }qWW0|i |||i d|i|if\}}0xHt|d0r5} 0|i it|||0||i }qW0|i|i d ||idddf0t|i |i||_0|idS(Niiiiiii?B(sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsxsysrangesis foundationssappendsSS_FoundationStacksRowStack_Classsheights ReserveStacks setRegionsCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservesslssshsmaxrowssxsysispysol.pys createGame0s,+6. "2 "5 .ics00x2tdd0r}0|iiiddqW0|i0|iii0|ii}0|iiid|d|d|d|dg0t o#t |iii djpt dS(Niisframessrowsiii( srangesis_ssstalonsdealRowsstartDealSamplesreservessrs __debug__slenscardssAssertionError(s_sisrspysol.pys startGame0s  5(s createGames startGame(spysol.pysEightOff0ssSeahavenTowerscs00dZ1dZRS(Ncsg00t||if\}}0td|id|i}0|i|i d|i |i |i|0|i |i f\}}0xGtdd0r4}0|iit||d|i ||qW0x_tdd0rL}0ddddf|}0|iit|||i |||qW0|i |i |if\}}0xKtdd0r8}0|ii|i|||0||i }qqW0|i|id ||i d d d f1t|i |i|i||_1|i|i|i|i_1|ig|i_1|i|i|i_1|i|i_ dS( Niii iii iiiii?B(!sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsysrangesisreservessappends ReserveStackssuits foundationssSS_FoundationStacksrowssRowStack_Classs setRegionsInitialDealTalonStacksheightstalonssgs openstackss talonstackss dropstackss reservestacks(s_slssshsxsysissuitspysol.pys createGame0s, / 2 1" ".% cs11x2tdd1r}1|iiiddqW1|i 1|iii 1|iiid|iidd! 1to#t |iii djpt dS(Niisframessrowsii( srangesis_ssstalonsdealRowsstartDealSamplesreservess __debug__slenscardssAssertionError(s_sispysol.pys startGame1s  &(s createGames startGame(spysol.pysSeahavenTowers0s sRelaxedSeahavenTowerscs 1 1eZRS(N(sKingSS_RowStacksRowStack_Class(spysol.pysRelaxedSeahavenTowers 1ssPenguincs11dZ1eZ1eZ1dddZ(1dZ*1dZ81dZ;1dZ >1dZ A1d Z C1d Z RS( Nic s11t||if\}}1td|i|idd|i}1t||}1|i |i |d|i |i||i1t|_1|i|i |if\}}1xWtdd1rD} 1|iit|||| dddd1||i}qW1|i|i||id d d d f1|i |||i d |if\}}1xQt|d1r>} 1|ii|i|||dd 1||i }qW!1|i |||i d |i|if\}}"1xHt|d"1r5} #1|i it|||$1||i }qW%1|i|i d ||id d d f&1t|i d|||_ '1|i!dS( Niiiiismodi smax_moveiii?B("sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsNones base_cardswidthsxsysrangesis foundationssappendsSS_FoundationStacks setRegionsCWsRowStack_Classsheights ReserveStacksCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservesslssshsmaxrowssxsysispysol.pys createGame1s0+3 " ... (5 .ics((1)1|i||d idSdS(Nics)1|i|jdfS(Ni(scsrank(scsrankspysol.pys)1s(s_s_shuffleHookMoveToTopscardssrank(s_scardsspysol.pys _shuffleHook(1scsf*1+1|iiid |_,1|i-1xtdd-1r}.1|iii}/1t o|i |ii jpt 01|ii |i|ii}11|i|ii21|id|ii|ddq<W31x2tdd31r}41|iiiddqW51|i61|iii71t o#t|iiidjpt dS(Niiiisframesi(s_ssstalonscardss base_cards _updateStackssrangesisgetCardscs __debug__sranksAssertionErrors foundationsssuitsgameinfosdeckssto_stacksflipMovesmoveMovesdealRowsstartDealSampleslen(s_siscsto_stackspysol.pys startGame*1s  ' &  csP8191|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch81scs-;1<1|i|ii|_=1|idS(N(s_scardssgamesloadinfos base_card_ids base_cards _updateStacks(s_sgamespysol.pys_restoreGameHook;1scs2>1?1|iidt@1|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_spspysol.pys _loadGameHook>1scsA1B1|i|iidS(N(spsdumps_s base_cardsid(s_spspysol.pys _saveGameHookA1scswC1D1x.|iidD1r}E1|ii|i_qWF1x6|iidF1r#}G1|iidd|i_qIWdS(Niii (s_sss foundationss base_cardsrankscaps base_ranksrows(s_ssspysol.pys _updateStacksC1s   ( s GAME_VERSIONs SS_RowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames _shuffleHooks startGamesshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHooks _updateStacks(spysol.pysPenguin1s         i-s Baker's GameisKing Only Baker's Gameis Eight OffsSeahaven TowerssRelaxed Seahaven Towersi@sEiffelTower_RowStackcsT1U1dZX1dZRS(Nc s8U1V1ti||||ddddW1d|_dS(Nsmax_moveis max_accepti(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgamespysol.pys__init__U1s%csOX1Y1ti||| o Z1dSn[1|id i|didjSdS(Niii (s OpenStacks acceptsCardss_s from_stackscardssrank(s_s from_stackscardsspysol.pys acceptsCardsX1s (s__init__s acceptsCards(spysol.pysEiffelTower_RowStackT1s s EiffelTowercsV\1]1eZ^1eZ_1dZq1dZu1dZw1edZy1dZ RS(Nc s_1`1t||if\}}a1|i|id|i|id|ib1|i}c1xddfddfddfddfd d fd d ffd c1r}d1|i|d|i}e1xLt |d d e1r5}f1|iit|||g1||i}qWh1||i}qWi1|id|i}j1|id |id}k1|i||||_l1|i|id m1||i}n1|i|||d d|_o1|i|id p1|idS(Nf8.5iif2.5iif1.5iif0.5issss max_rounds(sLayouts_ssslssetSizesXMsXSsYMsYSsysdsxsrangesisrowssappendsEiffelTower_RowStacks Waste_Classswastes createTexts Talon_ClassstalonsdefaultStackGroups(s_slsssysdsxsispysol.pys createGame_1s&/ B  !cs:q1r1|is1|iiit1|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGameq1s cs?u1v1t|iiidjot|iiidjSdS(Ni(slens_ssstalonscardsswaste(s_spysol.pys isGameWonu1scsw1x1ffffSdS(N((s_seventspysol.pys getAutoStacksw1scsy1z1|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchy1s( sWasteTalonStacks Talon_Classs WasteStacks Waste_Classs createGames startGames isGameWonsNones getAutoStackssshallHighlightMatch(spysol.pys EiffelTower\1s     sStrictEiffelTowercs{1|1eeddZRS(Ns max_cardsi(s StackWrappers WasteStacks Waste_Class(spysol.pysStrictEiffelTower{1sis Eiffel TowersMatriarchy_Wastecs11dZRS(NcsJ11ti|1|iiiio1|iiiindS(N(s WasteStacks updateTexts_sgamessstalons_updateMaxRounds(s_spysol.pys updateText1s(s updateText(spysol.pysMatriarchy_Waste1ssMatriarchy_Taloncsw11ddddddddd d d d d dddddfZ1d Z1d Z1ddZ1dZRS(Niiiiiiii i i i csh11|i}1d|_1|iii}1xddddfd1r}1t||dit||di}1t||dit||di}1t o||d jpt 1||d jo1|id|_n51|d jp |d jo1|id|_nqEW1|id jo1d |_n1||ijSdS( Ni iiiiiii ii ii( s_s max_roundssoldsgamesssrowssislenscardssl1sl2s __debug__sAssertionError(s_soldsrowssisl1sl2spysol.pys_updateMaxRounds1s   //"cs11|io1|in1|i o|iiii o 1dSn1|i|id}1t o|djpt 1t |i|jp|i|i jSdS(Nii(s_s_updateMaxRoundss updateTextscardssgamessswastesDEALsroundsncardss __debug__sAssertionErrorslens max_rounds(s_sncardsspysol.pys canDealCards1s" cs911|i|id}1to|djpt1|iii}1d}1d}1xZ1||joI1x1||jo1|i }1| o1Pn1to|i pt1|ii|1|iid||dddd1|d}qxW1||jot|idjo1tot|idjpt1to'|i|ijp |djpt1|ii||d|1d}nqbW1to|i|ijpt1to||jpt1to&t|iiiidjpt1|SdS(Niisframesisshadows update_flags(s_sDEALsroundsncardss __debug__sAssertionErrorsgamessswastesns update_flagssgetCardscardsface_upsflipMovesmoveMoveslenscardss max_roundss turnStackMove(s_ssoundsncardsswastesns update_flagsscardspysol.pys dealCards1s2   %&'1$0ics11|iidjo 1dSn1ti|dd1d|i|if}1|ii i d|1d|i |id}1|ii i d|dS(Nis update_roundsis Round %d/%dstextsDeal %d( s_sgamespreviewsWasteTalonStacks updateTextsrounds max_roundsststextssroundssconfigsDEALsmisc(s_stspysol.pys updateText1s (sDEALs_updateMaxRoundss canDealCardss dealCardss updateText(spysol.pysMatriarchy_Talon1s ?  sMatriarchy_UpRowStackcs11dZ1dZRS(NcsZ11ti||||d|1dtdddd1dddd 1|i |_dS( Nssuits base_ranksmodi sdiris min_cardss max_cardsi ( s SS_RowStacks__init__s_sxsysgamessuitsKINGs CARD_YOFFSET(s_sxsysgamessuitspysol.pys__init__1scs&11|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_spysol.pysgetBottomImage1s(s__init__sgetBottomImage(spysol.pysMatriarchy_UpRowStack1s sMatriarchy_DownRowStackcs11dZ1dZRS(NcsK11ti||||d|1dtdddd 1dddd dS( Nssuits base_ranksmodi sdiris min_cardss max_cardsi (s SS_RowStacks__init__s_sxsysgamessuitsQUEEN(s_sxsysgamessuitspysol.pys__init__1scs&11|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_spysol.pysgetBottomImage1s(s__init__sgetBottomImage(spysol.pysMatriarchy_DownRowStack1s s MatriarchycsJ11eZ1dZ1dZ1dZ1dZ1dZRS(Nc s11t||if\}}1td|idd|i|idd}1|i d|i |i ||i |1|i d||i |f\}}}1|i ||if\}}1xOtdd1r<} 1|iit|||| d1||i }qW1|i |f\}}1xOtdd1r<} 1|iit|||| d1||i }qGW1||i d||id|if\}}1||id} 1t||||_1|i|id1||id}1t|||d t|_ 1|i|i d 1t!|i"1| ||id d |i i#_$1t!|i"1| |d d 1dt%d|i i#_&1|i'dS(Nii iii iissss max_roundssnnsanchorsnscentersfonts canvas_large((sLayouts_ssslsmaxsYSsYOFFSETsCHshssetSizesXSsXMsYMsheightscentersc1sc2sxsysrangesisrowssappendsMatriarchy_UpRowStacksMatriarchy_DownRowStacksCWstxsMatriarchy_Wasteswastes createTextsMatriarchy_TalonsVARIABLE_REDEALSstalons MfxCanvasTextscanvasstextssroundssgetFontsmiscsdefaultStackGroups( s_slssshscentersc1sc2sxsysistxspysol.pys createGame1s63,) & &2 % cs 11|i|ddSdS(Ncs1|idj|ifS(Ni (scsrankssuit(scspysol.pys1si(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook1scsG11|i1|iii|iid1|iiidS(Ni(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_spysol.pys startGame1s  cs?11t|iiidjot|iiidjSdS(Ni(slens_ssstalonscardsswaste(s_spysol.pys isGameWon1scsy11|i|ittjo 1dSn1|i|ijo3|idd|ijp|idd|ijSdS(Niii (scard1srankscard2sQUEENsKINGssuit(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch1s (sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(spysol.pys Matriarchy1s      isCalculation_Hintcs11dZRS(Ncs=11to0||iiijot|djpt1d}1t|i djo#1|t |i di d}n1|i d i |i di jo)1d|i d i t|i }n]1|i d i |i di jo 2d}n+2||i d i |i di d}2||fSdS(Nii0uiii'i N(s __debug__srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpilespysol.pys_getMoveWasteScore1s: #%)% *(s_getMoveWasteScore(spysol.pysCalculation_Hint1ssBetsyRoss_Foundationcs22dZRS(Ncs22|iidjo 2dSn2|iio 2t|idjo0 2|ii} 2|iii dt |n 2t|i|ii jo 2|iii ddnF2|id i |ii |ii}2|iii dt |ndS(Niistexts(s_sgamespreviewstextssmiscslenscardsscaps base_ranksranksconfigsRANKSs max_cardssdirsmod(s_srankspysol.pys updateText2s !((s updateText(spysol.pysBetsyRoss_Foundation2ssCalculation_Foundationcs22dZRS(Ncs&22|iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_spysol.pysgetBottomImage2s(sgetBottomImage(spysol.pysCalculation_Foundation2ssCalculation_RowStackcs22dZ2dZRS(NcsU22ti||| o 2dSn2||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscardsspysol.pys acceptsCards2s cs22|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage2s(s acceptsCardssgetBottomImage(spysol.pysCalculation_RowStack2s s Calculationcs>22eZ2dZ<2dZD2dZH2dZRS(Nc s22t||if\}}2td|id|i} 2|id|i |i |i |id|!2|i |i dd}"2||i f\}}#2xtdd#2r}$2t|||d|d d d |d }%2|ii|&2t|i||id||i'2d ddtdd|i|i_(2||i }qW)2dddd} .2t|i||i ||idd| /2d ddtd|i_02|}12|i |id}22xTtdd22rA}32|iit|||dd dd 42||i }qW52|i|id |ddf62|i }72t |||dd |_!82|i"|i!d92||i}:2t#|||dd |_$;2|i%dS( Niif5.5iiiis base_ranksmodi sdirisanchorsnsfonts canvas_cardscardws1: A 2 3 4 5 6 7 8 9 T J Q K s2: 2 4 6 8 T Q A 3 5 7 9 J K s3: 3 6 9 Q 2 5 8 J A 4 7 T K s4: 4 8 Q 3 7 J 2 6 T A 5 9 Kstextsws canvas_fixedsmax_moves max_acceptii?Bs max_roundssnns max_cards(&sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXSsXMsYMsx0sxsysrangesisCalculation_Foundationsstacks foundationssappends MfxCanvasTextscanvassCWsgetFontstextssmiscshelpsCHsrowssCalculation_RowStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_slssshsx0sxsysisstackshelpspysol.pys createGame2s8 3 +$**!  +# cs<2=2tgd}>2x_|d>2rQ}?2|idjo||itjo$@2|||i<A2|i|nq WB2|iC2||SdS(Niii(sNonestopcardsscardsscsranksremovesreverse(s_scardsstopcardsscspysol.pys _shuffleHook<2s ' csFD2E2|iF2|iiid|iiG2|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_spysol.pys startGameD2s csH2I2fSdS(N((s_spysol.pysgetHighlightPilesStacksH2s(sCalculation_Hints Hint_Classs createGames _shuffleHooks startGamesgetHighlightPilesStacks(spysol.pys Calculation2s     s HopscotchcsJ2K2dZRS(NcsK2L2tgd}M2xo|dM2ra}N2|idjo!|idjo||itjo$O2|||i<P2|i|nq WQ2|iR2||SdS(Niii(sNonestopcardsscardsscssuitsranksremovesreverse(s_scardsstopcardsscspysol.pys _shuffleHookK2s 7 (s _shuffleHook(spysol.pys HopscotchJ2ss BetsyRosscsS2T2dZu2dZRS(Nc sT2U2t||if\}}V2|id|i|i|i|idd|iW2|i|idd}X2||if\}}Y2xlt ddY2rY}Z2t|||d|[2dd d dd d}\2|ii|]2||i}qW^2|}_2|i|id}`2xt dd`2r}a2t|||dd|d d d d|d b2ddd d}c2t|i||id||id2dddtdd|i|i_e2|ii|f2||i}q2Wg2dddd}l2t|i||i||idd|m2dddtd|i_n2|i}o2t|||dd|_p2|i|idq2||i}r2t||||_s2|i|idt2|idS(Nf5.5iiiiis base_ranks max_cardsismax_moves max_acceptsmodi sdiri sanchorsssfonts canvas_cardscardws1: 2 3 4 5 6 7 8 9 T J Q K s2: 4 6 8 T Q A 3 5 7 9 J K s3: 6 9 Q 2 5 8 J A 4 7 T K s4: 8 Q 3 7 J 2 6 T A 5 9 Kstextsws canvas_fixeds max_roundssnnsss( sLayouts_ssslssetSizesXSsXMsYMsYSsx0sxsysrangesisBetsyRoss_Foundationsstacks foundationssappends MfxCanvasTextscanvassCWsgetFontstextssmiscshelpsCHsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_slsssx0sxsysisstackshelpspysol.pys createGameT2s<:   -$**! csu2v2tgd}w2x|dw2r}x2|idjo||itjo$y2|||i<z2|i|nq{2|iddddfjoQ|2d|idd}}2||tjo!~2|||<2|i|nnq W2|i2||SdS( Niiiiiiii(sNonestopcardsscardsscsranksremovesisreverse(s_scardsstopcardsscsispysol.pys _shuffleHooku2s '  (s createGames _shuffleHook(spysol.pys BetsyRossS2s !ii^is Betsy Rosss Canfield_Hintcs22dZRS(NcsB22ti|||||||\}}2|d|fSdS(Ni( sCautiousDefaultHints_getMovePileScores_sscorescolorsrstspilesrpile(s_sscorescolorsrstspilesrpilespysol.pys_getMoveWasteScore2s*(s_getMoveWasteScore(spysol.pys Canfield_Hint2ssCanfield_AC_RowStackcs22dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss AC_RowStacksbasicAcceptsCards(s_s from_stackscardsspysol.pysbasicAcceptsCards2s2(sbasicAcceptsCards(spysol.pysCanfield_AC_RowStack2ssCanfield_SS_RowStackcs22dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss SS_RowStacksbasicAcceptsCards(s_s from_stackscardsspysol.pysbasicAcceptsCards2s2(sbasicAcceptsCards(spysol.pysCanfield_SS_RowStack2ssCanfield_RK_RowStackcs22dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss RK_RowStacksbasicAcceptsCards(s_s from_stackscardsspysol.pysbasicAcceptsCards2s2(sbasicAcceptsCards(spysol.pysCanfield_RK_RowStack2ssCanfieldcs22eZ2eeddZ2eZ2eZ2dZ 2dZ 2dZ 2dd ddZ 2dZ 2d Z2d Z2d Z2d Z2d Z2dZRS(Nsmodi iics22t||if\}}2|ii}2td|id|i}2|i |i dt|d||i |i |i|id|2t|_2|i |if\}} 2t|| |d|d||_2|i|id2||i }2t|| ||_2|i|id2||i }2xytdd2rf} 2xZt|d2rG} 2||i }2|ii|i|| || d d d dqwWq\W2|d|joI2|i td \} } }}2|| |i | | f\} } nF2|i td\} } }}2|| | | |if\} } 2t%d d|i&}2t(|i)| | d|d||i*_+2|i |i|idf\}} 2|i,i|i-|| |2d|i,d_.2|i/djo#2t0|id|i,d_.n2|i d|i |i }2xKt|d2r8} 2|i i|i1|| |2||i }qnW2|i2dS(Niiiis max_roundssnum_dealssismodi smax_movesses canvas_cardscardwsanchorsfonti ii(3sLayouts_ssslsgameinfosdeckssmaxsYSsYOFFSETshssetSizesXMsrowssXSsYMsNones base_cardsxsysWasteTalonStacks max_roundssnum_dealstalons createTexts WasteStackswastesrangesisjs foundationssappendsFoundation_Classs getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosreservessReserveStack_Classs CARD_YOFFSETsINITIAL_RESERVE_FACEUPsminsRowStack_ClasssdefaultStackGroups(s_srowss max_roundssnum_dealslsssdecksshsxsysisjstxstystastfsfontspysol.pys createGame2sH K $  9!(!$*&"# "iicsl22|idjo 2dSn2|i o 2d}n2t|ii}2|iiid|dS(Nisstext( s_spreviews base_cardstsRANKSsrankstextssinfosconfig(s_stspysol.pys updateText2s   c s22|i2t|_2|i2|iii|_2x.|iid2r}2|ii |i _ qSW2|ii |i i}2|ii|io52to|i idjpt2|d}n2|i|ii2|id|ii|ii|2|i2xut|id2r_}2|io2|i|iin2|id|ii|iidddddq8W2|iidio2|i|iidn2|iiidd2|iiidS(Niisframesisshadowsreverse(s_sstartDealSamplesNones base_cards updateTextssstalonsgetCards foundationssrankscaps base_rankssuitsgameinfosdeckssnscardss __debug__sAssertionErrorsflipMovesmoveMovesrangesINITIAL_RESERVE_CARDSsisINITIAL_RESERVE_FACEUPsreservess canFlipCardsdealRows dealCards(s_sssnsispysol.pys startGame2s.    $&   6cs22||iijo |iio2|io2|i o|iidio\2|iidid i o2|iidin2|iidi d|nnn<2||iijo%2|i o2|inndS(Nii( sstacks_sssrowssreservessFILL_EMPTY_ROWSscardssface_upsflipMovesmoveMoves canFlipCard(s_sstackspysol.pys fillStack2s# " )csP22|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch2scsT22|i|ii|_2x.|iid2r}2|ii|i _ q.WdS(Ni( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamessspysol.pys_restoreGameHook2s cs222|iidt2|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_spspysol.pys _loadGameHook2scs22|i|iidS(N(spsdumps_s base_cardsid(s_spspysol.pys _saveGameHook2s(sSS_FoundationStacksFoundation_Classs StackWrappersCanfield_AC_RowStacksRowStack_Classs OpenStacksReserveStack_Classs Canfield_Hints Hint_ClasssINITIAL_RESERVE_CARDSsINITIAL_RESERVE_FACEUPsFILL_EMPTY_ROWSs createGames updateTexts startGames fillStacksshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pysCanfield2s      #     sSuperiorCanfieldcs22dZ2dZRS(Nii(sINITIAL_RESERVE_FACEUPsFILL_EMPTY_ROWS(spysol.pysSuperiorCanfield2s sRainfallcs33dZRS(Ncs#33ti|dddddS(Ns max_roundsisnum_deali(sCanfields createGames_(s_spysol.pys createGame3s(s createGame(spysol.pysRainfall3ssRainbowcs&33eeddZ3dZRS(Nsmodi cs#33ti|dddddS(Ns max_roundsisnum_deal(sCanfields createGames_(s_spysol.pys createGame3s(s StackWrappersCanfield_RK_RowStacksRowStack_Classs createGame(spysol.pysRainbow3ss StorehousecsV33eeddZ 3dZ 3dZ 3dZ3dZ3dZRS(Nsmodi cs# 3 3ti|dddddS(Ns max_roundsisnum_deali(sCanfields createGames_(s_spysol.pys createGame 3scs 3 3|i|dSdS(Ncs 3|idj|ifS(Ni(scsrankssuit(scspysol.pys 3s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook 3scsG 33|i3|iiid|iid 3ti|dS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssCanfields startGame(s_spysol.pys startGame 3s #csP33|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch3scs 33dS(N((s_spysol.pys updateText3s(s StackWrappersCanfield_SS_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(spysol.pys Storehouse3s     s Chameleoncs;33eeddZ3dZ3dZ3dZRS(Nsmodi i cs)33ti|dddddddS(Nsrowsis max_roundsisnum_deal(sCanfields createGames_(s_spysol.pys createGame3scs=33|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch3s(s StackWrappersCanfield_RK_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSs createGamesshallHighlightMatch(spysol.pys Chameleon3s  sDoubleCanfieldcs33dZRS(Ncs33ti|dddS(Nsrowsi(sCanfields createGames_(s_spysol.pys createGame3s(s createGame(spysol.pysDoubleCanfield3ss AmericanToadcs8 3!3eeddZ"3dZ#3dZ$3dZRS(Nsmodi iics)$3%3ti|dddddddS(Nsrowsis max_roundsisnum_deali(sCanfields createGames_(s_spysol.pys createGame$3s(s StackWrappersCanfield_SS_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSsINITIAL_RESERVE_FACEUPs createGame(spysol.pys AmericanToad 3s  sVariegatedCanfieldcsS&3'3eZ(3dZ)3dZ+3dZ-3dZ13dZ43dZRS(Nics#)3*3ti|dddddS(Nsrowsis max_roundsi(sCanfields createGames_(s_spysol.pys createGame)3scs+3,3|i|dSdS(Ncs,3|idj|ifS(Ni(scsrankssuit(scspysol.pys,3s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook+3scsG-3.3|i/3|iiid|iid 03ti|dS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssCanfields startGame(s_spysol.pys startGame-3s #csH1323|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch13scs 4353dS(N((s_spysol.pys updateText43s(sCanfield_AC_RowStacksRowStack_ClasssINITIAL_RESERVE_FACEUPs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(spysol.pysVariegatedCanfield&3s      sEagleWing_ReserveStackcs6373dZRS(Ncs07383t|idjo|id i SdS(Ni(slens_scardssface_up(s_spysol.pys canFlipCard73s(s canFlipCard(spysol.pysEagleWing_ReserveStack63ss EagleWingcs;93:3eeddddddZ;3eZ<3dZRS(Nsmodi smax_moveis max_cardsic s<3=3t||if\}}>3|i|id|i|i|id|i?3t |_ @3|i|if\}}A3t |||dddd|_B3|i|idC3||i}D3t||||_E3|i|idF3xetddF3rR}G3|i|d|i}H3|ii|i||||d d d dqWI3|it d \}}}} J3|||i||f\}}K3td d|i} L3t|i ||d|d| |i!_"M3|id|i} N3xtddN3ry}O3|i||dj|i}P3| ddddddddf||i$}Q3|i%i|i&|||qWR3|id|i| f\}}S3|i'i|i(|||T3|i|i'ddU3|i)dS(Ni is max_roundsisnum_dealisssismodi smax_movesses canvas_cardscardwsanchorsfontiif0.2f0.4f0.6(*sLayouts_ssslssetSizesXMsXSsYMsYSsNones base_cardsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsFoundation_Classs getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosrysCHsrowssRowStack_ClasssreservessReserveStack_ClasssdefaultStackGroups( s_slsssxsysistxstystastfsfontsryspysol.pys createGame<3s66 $ 5!$* !0&#"(s StackWrappers SS_RowStacksRowStack_ClasssEagleWing_ReserveStacksReserveStack_Classs createGame(spysol.pys EagleWing93s! iiiesSuperior Canfieldicilids Straight Upi+sKansasijsDouble Canfieldigs American ToadifsVariegated Canfieldips Eagle Wings Golf_Hintcsl3m3dZRS(Nc sm3n3|i}o3x|iido3rp}p3|i|ii\}}q3| o r3q!ns3t o|djpt t3|i |d|i |i d gf}u3d|itf\}}v3x|iidv3r}w3|i o x3qny3||jo$z3|i |d|i d }n{3|io|3|d}n)}3|i|do~3|d}nqW3|i|||||q!WdS(Niis stackcardsi'id(s_sgamessgs dropstackssrs canDropCardssss foundationsswsncardss __debug__sAssertionErrors ClonedStackscardsswwsidsNonesscorescolorsts canFlipCardsaddHint( s_sgamesrswsncardsswwsscorescolorstspysol.pys computeHintsm3s(    -  $(s computeHints(spysol.pys Golf_Hintl3ss Golf_Taloncs33dZRS(Ncs733ti| o 3dSn3|ii SdS(Ni(sWasteTalonStacks canDealCardss_sgames isGameWon(s_spysol.pys canDealCards3s (s canDealCards(spysol.pys Golf_Talon3ss Golf_Wastecs33dZ3dZRS(Nc sB33t|dddd3tti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys WasteStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__3scs33ti||| o 3dSn3|id i|dif\}}3|ii djo3|t jo 3dSnn3|d|i i |jp|d|i i |jSdS(Nii( s WasteStacks acceptsCardss_s from_stackscardssranksr1sr2sgames getStrictnesssKINGscapsmod(s_s from_stackscardssr1sr2spysol.pys acceptsCards3s '(s__init__s acceptsCards(spysol.pys Golf_Waste3s s Golf_RowStackcs33dZRS(Ncs33|i|SdS(N(s_sdoubleclickHandlersevent(s_seventspysol.pys clickHandler3s(s clickHandler(spysol.pys Golf_RowStack3ssGolfcsb33eZ3eZ3dZ3dZ3dZ3dZ3dZ3e dZ RS(Ncs33t|dd|if\}}3d|i|id|if\}}3|d|i|jo3t ||d|_n3|i |d|i |i 3|i|id|i f\}}3xHtdd3r5}3|iit|||3||i}qW3|i|i|i f\}}3t|||d d |_3|i|id 3||i}3|i||||_3|i|i_3|i|id 3|ii|i3|ig|i_3|ig|i_3|i|i_dS( NsXOFFSETi iii4iiis max_roundsisnn( sLayouts_ssslsXSsXMsw1sw2sXOFFSETsintssetSizesYSsYMsxsysrangesisrowssappends Golf_RowStacksheights Golf_Talonstalons createTexts Waste_Classswastes CARD_XOFFSETs foundationsssgs openstackss talonstackss dropstacks(s_slsssw1sw2sxsysispysol.pys createGame3s*$*!& "csr33x2tdd3r}3|iiiddqW3|i3|iii3|iiidS(Niisframes(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGame3s   csE33x1|iid3r}3|io 3dSnqW3dSdS(Nii(s_sssrowssrscards(s_srspysol.pys isGameWon3s   cs533|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch3scs33fSdS(N((s_spysol.pysgetHighlightPilesStacks3scsM33|tjo3|iifffSn3|ii|iiffSdS(N(seventsNones_ssgs dropstacks(s_seventspysol.pys getAutoStacks3s( s Golf_Wastes Waste_Classs Golf_Hints Hint_Classs createGames startGames isGameWonsshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(spysol.pysGolf3s       s DeadKingGolfcs33dZ3dZRS(Ncs33dSdS(Ni((s_spysol.pys getStrictness3scsA33|itjo 3dSn3ti|||||SdS(Ni( scard1sranksKINGsGolfsshallHighlightMatchs_sstack1sstack2scard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch3s (s getStrictnesssshallHighlightMatch(spysol.pys DeadKingGolf3s s RelaxedGolfcs&33eeddZ3dZRS(Nsmodi cs=33|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch3s(s StackWrappers Golf_Wastes Waste_ClasssshallHighlightMatch(spysol.pys RelaxedGolf3ssElevator_RowStackcsY33dddddddddddddddddddddfZ3dZRS(Niiiiiics33|iii|if\}}3|idt|f\}}}3xu3||jod3|||}3|d}3x<t |||d3r"}3||io 3dSnqWqNW3dSdS(Nii(s_sgamesssrowssSTEPsrsstepsidslensisnslsrangesjscards(s_srsstepsisnslsjspysol.pysbasicIsBlocked3s!$  (sSTEPsbasicIsBlocked(spysol.pysElevator_RowStack3sHsElevatorcs33dZ3dZRS(Nc s33t||if\}}3|id|i|id|i|i3xt dd3r}3|id||id}3|i||id}3xLt |dd3r5}3|iit|||3||i}qWqbW3|i|if\}}3t|||dd|_3|i|id 3||i}3|i||||_3|i|id 3|ii|i3|ig|i_3|ig|i_3|i|i_dS( Ni iiiiiis max_roundssss(sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsElevator_RowStacks Golf_Talonstalons createTexts Waste_Classswastes foundationsssgs openstackss talonstackss dropstacks(s_slsssisxsysjspysol.pys createGame3s(/  css33|i3|iiid|iid dd3|iiid|iid3|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_spysol.pys startGame3s )#(s createGames startGame(spysol.pysElevator3s sTriPeaks_RowStackcsh33dddddddddddddddddddddddddddfZRS(Niiii i i(sSTEP(spysol.pysTriPeaks_RowStack3ssTriPeakscsb33dZ4dZ4dZ)4eZ*4dZ24dZ44dZ64dZRS(Nc s33t|dd|if\}}3|id|i|id|i|i3h|_ 3xt dd3r}3xddfddfddfddfddfddffd3ro}3|id|d|d|id}3|i|d|id}3|iit|||qWqtW3|id|idf\}}3xHt dd3r5}4|iit|||4||i}qnW4|i|i|if\}}4t|||d d|_4|i|id 4||i}4|i||||_4|i|i_4|i|id  4|ii|i 4t|i|id |id  4d d dtd|i _! 4|ig|i"_# 4|ig|i"_$4|i|i"_%dS(NsXOFFSETi iiiiiis max_roundssnnisanchorssesfonts canvas_large(&sLayouts_ssslssetSizesXSsXMsYSsYMstalon_card_idssrangesisdsxsysrowssappendsTriPeaks_RowStacks Golf_RowStacksheights Golf_Talonstalons createTexts Waste_ClassswastesXOFFSETs CARD_XOFFSETs foundationss MfxCanvasTextscanvasswidthsgetFontstextssscoressgs openstackss talonstackss dropstacks(s_slsssisdsxsyspysol.pys createGame3s8$/  B +'# " !cs44|i4|iiid|iid dd4|iiid|iid4h|_4x/|iiid4r}4d|i|i 4|d|ii |jp|d|ii |jSn?4dSdS(Nii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksr1sr2scapsmod(s_s from_stackscardssr1sr2spysol.pys acceptsCards94s   ':(s acceptsCards(spysol.pysBlackHole_Foundation84ssBlackHole_RowStackcs@4A4dZRS(NcsA4B4|i|SdS(N(s_sdoubleclickHandlersevent(s_seventspysol.pys clickHandlerA4s(s clickHandler(spysol.pysBlackHole_RowStack@4ss BlackHolecs_C4D4eeddddZE4eZF4ddZ`4dZb4dZh4ed Z RS( Ns max_acceptis max_cardsic sF4G4t|dd|if\}}H4td|i|i|d|i}I4|i |i d||i d|i J4|i }K4xOtddK4r<}L4|i ||}M4|ii|i|||qWN4xtddN4rq}O4||i }P4xUddddfdP4r<}Q4|i ||}R4|ii|i|||q"WqWS4||i }T4xOtddT4r<}U4|i ||}V4|ii|i|||qWW4x1|idW4r!} X4|i| _Y4d| _qWZ4|i d||i d|i df\}}[4|iit|||td dd d d dd d\4|i|idd]4|i d||i|i f\}}^4t||||__4|idS(NsXOFFSETi iiiiiisdirsmodi smax_moves max_cardsi4sss( sLayouts_ssslsmaxsXSs playcardssXOFFSETswssetSizesXMsYMsYSsysrangesisxsrowssappendsRowStack_Classsjsrs CARD_XOFFSETs CARD_YOFFSETs foundationssBlackHole_FoundationsANY_SUITs createTextsheightsInitialDealTalonStackstalonsdefaultStackGroups( s_s playcardsslssswsysisxsjsrspysol.pys createGameF4s<$+,  &  * & 2:*ics `4a4|i|ddSdS(Ncsa4|idj|ifS(Ni (scsidssuit(scspysol.pysa4si(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook`4scs~b4c4x2tddc4r}d4|iiiddqWe4|if4|iiig4|iiid|iidS(Niisframessrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_sispysol.pys startGameb4s   csMh4i4|tjoj4ff|iifSnl4f|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_seventspysol.pys getAutoStacksh4s( s StackWrappersBlackHole_RowStacksRowStack_Classs Golf_Hints Hint_Classs createGames _shuffleHooks startGamesNones getAutoStacks(spysol.pys BlackHoleC4s    i$isDead King Golfis Relaxed Golfi(is Tri Peaksibs Black HolesGrandfathersClock_Hintcsy4z4dZRS(Ncsz4{4d|fSdS(Ni`g(scolor(s_sscorescolorsrstsncardsspysol.pys_getDropCardScorez4s(s_getDropCardScore(spysol.pysGrandfathersClock_Hinty4ssGrandfathersClockcsY|4}4eZ~4dZ4dZ4dZ4dZ4dZ4edZRS(Nc s~44t|dd|if\}}4td|id|i|idd|i}4|i d|i |i |i d|4xt dd4r}4|i |i ||f\}}4xTt dd4rA}4|iit|||d dd d4||i }qWqW4|i ||id}4|i|id d d ||i d|f4|i|idd |||i dd f4ddfdd fddfddfddfddfg}4xMt t|d4r4}4|id||dd||dfqW4|i |i ||if\} } 4xt dd4r}4|dd}4tt| d||d|i }4tt| d ||d|i}4ddddf|d} 4|iit|||| 4d|ddd4d dqoW4t|i |i |i!|i||_"4|i|i|i#_$4|i"g|i#_%4|i|i#_&dS(NsXOFFSETi iii iiismax_moves max_acceptii?Bf0.15f0.5f2.5f1.5f2.85i if6.5s base_ranksmodi ('sLayouts_ssslsmaxsYSsCHsYOFFSETsdhssetSizesXSsXMsYMsrangesisxsysjsrowssappends RK_RowStacks setRegionsdslensx0sy0sintsroundssuits foundationssSS_FoundationStacksInitialDealTalonStackswidthsheightstalonssgs openstackss talonstackss dropstacks( s_slsssdhsisxsysjsdsx0sy0ssuitspysol.pys createGame~4s>$6, # +32? 2& ,-,c s 44ddddddddf\}}}}4d|d|d|d|d|d|d |d |d |d |d |d|f }4g}4xK|d4r=}4|i|jo$4|i |4|i |nqW4|i d4||SdS(Nii iiiiiiiii i i i cs4t|i|iS(N(scmpsbsranksa(sasbspysol.pys4s( sCsSsHsDsidssclocksscardsscsidsappendsremovessort( s_scardssCsSsHsDsidssclocksscspysol.pys _shuffleHook4s1]  cs44|iddd4x2tdd4r}4|iiiddq+W4|iii4|iiid|iidS(Nsgrandfathersclocksloopiiisframessrows(s_s playSamplesrangesissstalonsdealRows foundations(s_sispysol.pys startGame4s  cs544|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch4scs44fSdS(N((s_spysol.pysgetHighlightPilesStacks4scs44ffffSdS(N((s_seventspysol.pys getAutoStacks4s( sGrandfathersClock_Hints Hint_Classs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(spysol.pysGrandfathersClock|4s     isGrandfather's Clocks Numerica_Hintcs44dZRS(Ncs=44to0||iiijot|djpt4d}4t|i djo#4|t |i di d}n4|i d i |i di jo)4d|i d i t|i }n]4|i d i |i di jo 4d}n+4||i d i |i di d}4||fSdS(Nii0uiii'i N(s __debug__srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpilespysol.pys_getMoveWasteScore4s: #%)% *(s_getMoveWasteScore(spysol.pys Numerica_Hint4ssNumerica_RowStackcs44dZ4dZRS(NcsU44ti||| o 4dSn4||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscardsspysol.pys acceptsCards4s cs44|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage4s(s acceptsCardssgetBottomImage(spysol.pysNumerica_RowStack4s sNumericacsV44eZ4eedeZ4ddZ4dZ4dZ4dZ RS(Nssuitc s44t||if\}}4td|id|i}4|i|i d||i |i |i |i|4|i |i dd}4||d|i d|i f\}}4xQtdd4r>}4|ii|i|||d|4||i }qW4||i |if\}}4xNt|d4r;}4|i it|||dd 4||i }qIW4|i|i ||i d|d d f4|i }4t|||d d |_4t|i4||id||i 4d d |ii_4||i}4t|||dd |_4|i|i |i _!4|ig|ig|i _"4|i |ig|i _#dS(Niif1.5iiissuits max_acceptii?Bs max_roundssanchorsss max_cards($sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsrowssXSsYMsx0sxsysrangesis foundationssappendsFoundation_ClasssNumerica_RowStacks setRegionsWasteTalonStackstalons MfxCanvasTextscanvassCWstextssncardss WasteStackswastessgs openstackss talonstackss dropstacks( s_srowsslssshsx0sxsysispysol.pys createGame4s2 :+ ( %-  ics'44|i4|iiidS(N(s_sstartDealSamplessstalons dealCards(s_spysol.pys startGame4s csH44|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch4scs44fSdS(N((s_spysol.pysgetHighlightPilesStacks4s( s Numerica_Hints Hint_Classs StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(spysol.pysNumerica4s    s LadyBettycs44eZ4dZRS(Ncs44ti|dddS(Nsrowsi(sNumericas createGames_(s_spysol.pys createGame4s(sSS_FoundationStacksFoundation_Classs createGame(spysol.pys LadyBetty4s is Sir Tommyis Lady Bettys Yukon_Hintcs#44dZ4dZ4dZRS(Ni(#idcs+44ti|||||||\}}4||}4t o%d|jo djnpt 4|i } 4| o4x|d4r}} 4|i|d| g} 4xV| d4rI} 4| i|| go*4|d} 5| d|d}5PnqWqWn5|||fSdS(Nii's stackcardsiid(sYukonType_Hints_getMovePileScores_sscorescolorsrstspilesrpilesssbonuss __debug__sAssertionErrorsgetPilestpilescrs ClonedStacksrrscts acceptsCardssd(s_sscorescolorsrstspilesrpilesssbonusstpilescrsrrsctsdspysol.pys_getMovePileScore4s* /    (sBONUS_FLIP_CARDsBONUS_CREATE_EMPTY_ROWs_getMovePileScore(spysol.pys Yukon_Hint4s  sYukoncsq55eiZ5eZ5eZ5eede Z 5e Z  5dZ 5dZ5dZ 5dZRS(Ns base_rankc sY 5 5t||if\}} 5t|dddd 5t|i|f| 5|i|i d|i d5|i |ii i |ii i ||_ 5xS|iid5r@}5|ii|i|i |i |d|i5ddqW5xA|iid5r.}5|ii|i|i |i |q W5|i5|SdS(Nsrowsistextsiissuitsmax_move(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssrspysol.pys createGame 5s!- * , c s55xWtdt|iid5r5}5|iiid|ii|ddddq$W5xHtdd5r5}5|iiid|iidddddqrW5|i5|iii5t o#t|iii djpt dS(Niisrowssflipsframesi( srangeslens_sssrowssistalonsdealRowsstartDealSamples __debug__scardssAssertionError(s_sispysol.pys startGame5s! 3 3 cs55fSdS(N((s_spysol.pysgetHighlightPilesStacks5scsH 5!5|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch 5s(sLayouts yukonLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersYukon_AC_RowStacksKINGsRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStackssshallHighlightMatch(spysol.pysYukon5s      sRussianSolitairecs&#5$5eedeZ%5dZRS(Ns base_rankcsH%5&5|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch%5s(s StackWrappersYukon_SS_RowStacksKINGsRowStack_ClasssshallHighlightMatch(spysol.pysRussianSolitaire#5ssOdessacs(5)5dZRS(Ncs)5*5x8tdd*5r%}+5|iiiddddqW,5x2tdd,5r}-5|iiiddqSW.5xEtdd.5r2}/5|iiid|iidd!ddqW05|i15|iii25to#t |iii djpt dS( Niisflipsframesisrowsii( srangesis_ssstalonsdealRowsrowssstartDealSamples __debug__slenscardssAssertionError(s_sispysol.pys startGame)5s #  0 (s startGame(spysol.pysOdessa(5ssAlaska_RowStackcs3545dZRS(Ncsh4555|i|ijoK|i|ii|ii|ijp$|i|ii|ii|ijSdS(N(sc1ssuitsc2sranks_scapsdirsmod(s_sc1sc2spysol.pys _isSequence45s(s _isSequence(spysol.pysAlaska_RowStack35ssAlaskacs8595eedeZRS(Ns base_rank(s StackWrappersAlaska_RowStacksKINGsRowStack_Class(spysol.pysAlaska85ssChineseDisciplinecs2:5;5eiZ<5eZ=5dZ?5dZRS(Ncs#=5>5ti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_spysol.pys createGame=5sc s?5@5xddddddfd@5rd}A5|iiid|ii| ddd dB5|iiid|ii|ddd dq!WC5|iD5|iiidS( Niiiiisrowssflipisframes(sis_ssstalonsdealRowsrowssstartDealSample(s_sispysol.pys startGame?5s  /3 (sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(spysol.pysChineseDiscipline:5s   sChineseSolitairecsE5F5eZRS(N(sYukon_AC_RowStacksRowStack_Class(spysol.pysChineseSolitaireE5ssQueeniecs8G5H5eiZI5eZJ5dZL5dddZRS(Ncs#J5K5ti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_spysol.pys createGameJ5sc sL5M5x]tdt|iidM5r;}N5|iiid|ii|d|ddd|q$WO5|i P5|iiid|dS(Niisrowssflipsframessreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesispysol.pys startGameL5s ! 9 i(sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(spysol.pysQueenieG5s   sRushdikecs8Q5R5eiZS5eZT5dZV5dddZRS(Ncs#T5U5ti|ddddSdS(Nswasteistextsi(sRussianSolitaires createGames_(s_spysol.pys createGameT5sc sV5W5x]tdt|iidW5r;}X5|iiid|ii|d|ddd|q$WY5|i Z5|iiid|dS(Niisrowssflipsframessreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesispysol.pys startGameV5s ! 9 ii(sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(spysol.pysRushdikeQ5s   s RussianPointcs[5\5dZRS(Nc s\5]5|ii}^5x[ddddddfd^5r<}_5|iiid||t||!ddddq0W`5|ia5|iiidS(Niiiisrowssflipsframes( s_sssrowssrsistalonsdealRowslensstartDealSample(s_srsispysol.pys startGame\5s  : (s startGame(spysol.pys RussianPoint[5ssAbacus_Foundationcsb5c5dZRS(Nc sUc5d5t|d|ddd|ddde5tti|||||f|dS(Ns base_ranksmodi sdirismax_movei( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgame(s_sxsysgamessuitscapspysol.pys__init__c5s)(s__init__(spysol.pysAbacus_Foundationb5ssAbacus_RowStackcsf5g5dZRS(NcsRg5h5|id df\}}i5|i|ijo|i|||ijSdS(Nii (sc1ssuitsdirsmodsc2srank(s_sc1sc2sdirsmodspysol.pys _isSequenceg5s(s _isSequence(spysol.pysAbacus_RowStackf5ssAbacuscsMj5k5eZl5eZm5dZv5dZx5dddZ~5dZRS(Nc stm5n5ti|}o5dddd}t5t|i|i|i|i d|u5dddt d |i _dS( Ns#Club: A 2 3 4 5 6 7 8 9 T J Q K s#Spade: 2 4 6 8 T Q A 3 5 7 9 J K s#Heart: 3 6 9 Q 2 5 8 J A 4 7 T K s"Diamond: 4 8 Q 3 7 J 2 6 T A 5 9 Kstextsanchorsswsfonts canvas_fixed( sRushdikes createGames_slshelps MfxCanvasTextscanvassXMsheightsYMsgetFontstexts(s_slshelpspysol.pys createGamem5s%csv5w5|i|dSdS(Ncs%w5|iddddfj|ifS(Niiii*(scsidssuit(scspysol.pysw5s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookv5sc sx5y5|iiid|iiddz5x]tdt|iidz5r;}{5|iiid|ii|d|ddd|qIW|5|i }5|iiid|dS(Nsrowssframesiisflipsreverse( s_ssstalonsdealRows foundationssrangeslensrowssisflipsreversesstartDealSample(s_sflipsreversesispysol.pys startGamex5s %! 9 icsm~55|id df\}}5|i|ijo3|i|||ijp|i|||ijSdS(Nii (scard1ssuitsdirsmodscard2srank(s_sstack1scard1sstack2scard2sdirsmodspysol.pysshallHighlightMatch~5s(sAbacus_FoundationsFoundation_ClasssAbacus_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatch(spysol.pysAbacusj5s    iisRussian SolitaireiisCastlesInSpaincsY55eiZ5eZ5eZ5eZ5e Z 5dZ 5dddfdZ RS(Nc sU55t||if\}}5t|dddd5t|i|f|5|i|i d|i d5|i |ii i |ii i ||_ 5xG|iid5r4}5|ii|i|i |i ||iqW5xP|iid5r=}5|ii|i|i |i |5ddddqW5|idS( Nsrowsi s playcardsi iismax_moves max_accept(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssrspysol.pys createGame5s!- 2 !cs_55x2|d5r%}5|iiid|ddqW5|i5|iiidS(Nisflipsframes(sflipsfs_ssstalonsdealRowsstartDealSample(s_sflipsfspysol.pys startGame5s  # i( sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(spysol.pysCastlesInSpain5s      sMartha_RowStackcs55dZRS(NcsI55ti||| o 5dSn5|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscardsspysol.pys acceptsCards5s (s acceptsCards(spysol.pysMartha_RowStack5ssMarthacs855eeZ5dZ5dZ5dZRS(Ncs#55ti|dddddS(Nsrowsi s playcardsi (sCastlesInSpains createGames_(s_spysol.pys createGame5scs55|i|dSdS(Ncs5|idj|ifS(Ni(scsrankssuit(scspysol.pys5s(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook5scsE55ti|ddddf5|iiid|iidS(Nsflipiisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_spysol.pys startGame5s(sFullStackWrappersMartha_RowStacksRowStack_Classs createGames _shuffleHooks startGame(spysol.pysMartha5s  s BakersDozencs>55eedeZ5dZ5dZ5dZRS(Ns base_rankcs$55dt|iif\}}5g}5xG|d5r:}5|i t jo5|i |n5|d}q9W5x|d5r}5||}5xf5||joU5||i t jo-5||||f\||<||<5Pn5||}qWqW5|i 5|SdS(Nii(slens_sssrowssisnskingsscardsscsranksKINGsappendsjsreverse(s_scardssisnskingsscsjspysol.pys _shuffleHook5s$!    % cs&55ti|ddddfdS(Nsflipi(sCastlesInSpains startGames_(s_spysol.pys startGame5scs555|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch5s(s StackWrappers RK_RowStacksNO_RANKsRowStack_Classs _shuffleHooks startGamesshallHighlightMatch(spysol.pys BakersDozen5s  sSpanishPatiencecs55eZRS(N(sAC_FoundationStacksFoundation_Class(spysol.pysSpanishPatience5ss GoodMeasurecs)55dZ5dZ5dZRS(Ncs55ti|dddS(Nsrowsi (sCastlesInSpains createGames_(s_spysol.pys createGame5scs555ti||}5|i|ddSdS(Ncs5|idj|ifS(Ni(scsrankssuit(scspysol.pys5si(s BakersDozens _shuffleHooks_scardss_shuffleHookMoveToBottom(s_scardsspysol.pys _shuffleHook5scs55ti|dddddf5xtdd5r}}5|iiid }5t o|i t jpt 5|i |ii5|id|ii|ii|iq7W5t o#t|iiidjpt dS(Nsflipiii(sCastlesInSpains startGames_srangesissstalonscardsscs __debug__sranksACEsAssertionErrorsflipMovesmoveMoves foundationsssuitslen(s_siscspysol.pys startGame5s" !-(s createGames _shuffleHooks startGame(spysol.pys GoodMeasure5s  s Cruel_Taloncs 55dZ5ddZRS(NcsI55|iio|iiidjo 5dSn5|ii SdS(Nidi(s_sgamesdemosmovessindexs isGameWon(s_spysol.pys canDealCards5s& c s55t|iii}5d}5tot|idjpt 5t |iii}5|i 5xg|d5rZ}5xNt t|id5r2}5|d}5|iid||ddqWq}W5tot|i|jpt 5|djo 5dSn5|ii|5|df\}}5dg|}5|d|} 5xH5| djo75||d||<5|d|}5| d} qoW5xt |d5r}5t|||} 5ddf|ddj} 5xEt | d5r2} 5|iid||iii|d| qW5|| }5|djo5PnqW5to.|t|ijo djnpt 5|SdS(Niisframesii(slens_sgamesssrowsslrs num_cardss __debug__scardssAssertionErrorslistsreversesrsrangesismoveMoves nextRoundMovesnsdeals extra_cardssminsksframessj( s_ssoundslrs num_cardssrowssrsisnsdeals extra_cardssksframessjspysol.pys dealCards5sF '    ''   0  8i(s canDealCardss dealCards(spysol.pys Cruel_Talon5s sCruelcsT55eedd Z5eedeZ5dZ5dZ6dZRS(Ns max_roundsis base_rankcs55ti|dddS(Nsrowsi (sCastlesInSpains createGames_(s_spysol.pys createGame5scs56|i|dSdS(Ncs6|idj|ifS(Ni(scsrankssuit(scspysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook5scsE66ti|ddddf6|iiid|iidS(Nsflipisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_spysol.pys startGame6s( s StackWrappers Cruel_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Classs createGames _shuffleHooks startGame(spysol.pysCruel5s   iSsCastles in SpainiTis Baker's DozeniUsSpanish PatienceiVs Good MeasureihsFan_Hintcs66RS(N((spysol.pysFan_Hint6ssFancsk66eZ6eZ6eZ6eZ6ddddfddZ-6dZ 36dZ 66dZ RS(Nc s66t|dd|if\}}6td|i|i|d|i}6t d|i|}6|dd@}6|i |i t|||i dt||i6|i ||i f\}}6x}t|iid6rd}6xXtdd6rE}  6|ii|i|||d| !6|||ii}q WqW"6xtt|d"6r} #6|i ||if\}}$6xt|| d$6rh}%6|i|||d dd d} &6|idf\| _| _'6|i i| (6||}qWqsW)6|i|i|i|if\}}*6|i ||||_!+6|i",6|SdS( NsXOFFSETi iiiiissuitsmax_moves max_accept(#sLayouts_ssslsmaxsXSs playcardssXOFFSETswsminssetSizesXMsrowssYMslensYSsxsysrangesgameinfosdeckssjsis foundationssappendsFoundation_ClasssRowStack_Classsstacks CARD_XOFFSETs CARD_YOFFSETswidthsheights Talon_ClassstalonsdefaultStackGroups( s_srowss playcardsslssswsxsysjsisstackspysol.pys createGame6s2$+<  (  $) iii cs-6.6xBtdd.6r/}/6|iiid|iid ddqW06|i16|iii26to#t |iii djpt dS(Niisrowsisframes( srangesis_ssstalonsdealRowsrowssstartDealSamples __debug__slenscardssAssertionError(s_sispysol.pys startGame-6s  - csH3646|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch36scs6676fSdS(N((s_spysol.pysgetHighlightPilesStacks66s( sInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingSS_RowStacksRowStack_ClasssFan_Hints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(spysol.pysFan6s      sScotchPatiencecs#8696eZ:6eedeZRS(Ns base_rank(sAC_FoundationStacksFoundation_Classs StackWrappers RK_RowStacksNO_RANKsRowStack_Class(spysol.pysScotchPatience86s sShamrocks_RowStackcs;6<6dZRS(Ncs<6=6ti||| o >6dSn?6|id |df\}}@6|i|id|ii jp|i|id|ii jSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssc1sc2srankscapsmod(s_s from_stackscardssc1sc2spysol.pys acceptsCards<6s !(s acceptsCards(spysol.pysShamrocks_RowStack;6ss Shamrockscs A6B6eededdZRS(Ns base_ranks max_cardsi(s StackWrappersShamrocks_RowStacksNO_RANKsRowStack_Class(spysol.pys ShamrocksA6ssLaBelleLucie_TaloncsGC6D6dZF6ddZQ6dZZ6dZ_6ddZRS(Ncs+D6E6|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_spysol.pys canDealCardsD6scsF6G6|i}H6|djo I6dSnJ6|iK6|oL6|iinM6|iN6|oO6|iinP6|SdS(Ni( s_s redealCards1sns redealCards2ssoundsgamesstartDealSamples redealCards3s stopSamples(s_ssoundsnspysol.pys dealCardsF6s     icsQ6R6tot|idjptS6d}T6xk|iiidT6rU}U6|ioBV6|t|i}W6|ii t|i||ddnqHWX6tot|i|jptY6|SdS(Nisframes( s __debug__slens_scardssAssertionErrors num_cardssgamesssrowssrsmoveMove(s_s num_cardssrspysol.pys redealCards1Q6s'   0'cslZ6[6to|i|ijpt\6to|ipt]6|ii|^6|ii|dS(N( s __debug__s_srounds max_roundssAssertionErrorscardssgamesshuffleStackMoves nextRoundMove(s_spysol.pys redealCards2Z6s$c s _6`6|iii}a6tt|idt|}b6xt ddb6r}c6|d|dd|ddf|}d6dddf|}e6xh|| de6rW}f6|id i|jog6|ii|nh6|iid||d|qWqLWdS(Niiiiisframes(s_sgamesssrowss to_stackssminslenscardssnsrangesisjsframessrsface_upsflipMovesmoveMove(s_sface_ups to_stackssnsisjsframessrspysol.pys redealCards3_6s% * i(s canDealCardss dealCardss redealCards1s redealCards2s redealCards3(spysol.pysLaBelleLucie_TalonC6s   s LaBelleLuciecs/i6j6eeddZk6eedeZRS(Ns max_roundsis base_rank(s StackWrappersLaBelleLucie_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Class(spysol.pys LaBelleLuciei6ssSuperFlowerGardencsl6m6eedeZRS(Ns base_rank(s StackWrappers RK_RowStacksNO_RANKsRowStack_Class(spysol.pysSuperFlowerGardenl6ssThreeShufflesAndADraw_RowStackcs%n6o6d d dZ6dZRS(Nc so6p6|i|iiidf\}}q6||j o-r6ti|||d|d|s6dSnt6|i }u6t o+|o|idjo |djptv6|i|ddBw6|id||d|d|x6|i|ddBy6|i|ddBz6dp|i o{6|id d d n|6|djo}6d }n~6|id||d|d|6|i|i}6|id||d|d|6|i|dS( Nisframessshadowiiiii@sdropspriorityi(s_sgamesssreservessrsto_stacks SS_RowStacksmoveMovesncardssframessshadows _canDrawCardsfs __debug__s draw_donesAssertionErrorsupdateStackMovesdemos playSamples enterStatesS_FILLs old_states leaveState( s_sncardssto_stacksframessshadowsgamesrsfs old_statespysol.pysmoveMoveo6s$%" 5"""ics66t|idjov6|id d !}6xW|iii|iiid6r4}6||j o|i||o 6|SnqSWn6t SdS(Niii( slens_scardsspilesgamesss foundationssrowss acceptsCardssNone(s_spilessspysol.pys _canDrawCard6s" #(smoveMoves _canDrawCard(spysol.pysThreeShufflesAndADraw_RowStackn6ss"ThreeShufflesAndADraw_ReserveStackcs566dZ6dZ6dZ6dZRS(Ncs66ti||| o 6dSn6||iiij o 6dSn6|iip |i o 6dSn6dSdS(Nii( s ReserveStacks acceptsCardss_s from_stackscardssgamesssrowss draw_dones _canDrawCard(s_s from_stackscardsspysol.pys acceptsCards6s   csA66to||iijpt6|ii |i_dS(N(s __debug__sundos_sgames draw_donesAssertionError(s_sundosflagsspysol.pys updateModel6s$css66|iidjp|iitjo 6dSn6ddf|iidj}6|iiid|dS(NisXsDrawistext( s_sgamespreviewstextssmiscsNones draw_donestsconfig(s_stspysol.pys updateText6s) cs66ti|6|i p|iidjo 6dSn6|iii}6|i|i d|i |i df\}}6t |ii ||dd|i_dS(Niisanchorscenter(s ReserveStacks prepareViews_s is_visiblesgamespreviewsappsimagessxsCARDWsysCARDHs MfxCanvasTextscanvasstextssmisc(s_simagessxsyspysol.pys prepareView6s ! 1(s acceptsCardss updateModels updateTexts prepareView(spysol.pys"ThreeShufflesAndADraw_ReserveStack6s   sThreeShufflesAndADrawcsV66eedeZ6dZ6dZ6dZ6dZ6dZRS(Ns base_rankcs66ti|}6|i}6|idi|id if\}}6|ii t |||6|i 6d|_ dS(Niii( s LaBelleLucies createGames_slsssrowssxsysreservessappends"ThreeShufflesAndADraw_ReserveStacksdefaultStackGroupss draw_done(s_slsssxsyspysol.pys createGame6s  * cs:66d|_6|iidi6ti|dS(Ni(s_s draw_donesssreservess updateTexts LaBelleLucies startGame(s_spysol.pys startGame6s cs66|ii|_dS(N(sgamesloadinfos draw_dones_(s_sgamespysol.pys_restoreGameHook6scs#66|iid|idS(Ns draw_done(s_sloadinfosaddattrspsload(s_spspysol.pys _loadGameHook6scs66|i|idS(N(spsdumps_s draw_done(s_spspysol.pys _saveGameHook6s( s StackWrappersThreeShufflesAndADraw_RowStacksNO_RANKsRowStack_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pysThreeShufflesAndADraw6s     sTrefoilcsG66dZ6eeddZ6dZ6dZ6dZRS(Nis min_cardsics)66ti|dddddfSdS(Nsrowsii(sFans createGames_(s_spysol.pys createGame6scs66|i|dSdS(Ncs6|idj|ifS(Ni(scsrankssuit(scspysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook6scs~66x2tdd6r}6|iiiddqW6|i6|iii6|iiid|iidS(Niisframessrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_sispysol.pys startGame6s   (s GAME_VERSIONs StackWrappersSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(spysol.pysTrefoil6s    sIntelligence_Taloncs,66eiZ6dZ6ddZRS(NcsU66tot|idjpt6|iiid}6t|i}6|ii t|i||dd6x||iii d6rf}6|t|i}6xD6|io66|ii d||dd6|ii |qWqW6tot|i|jpt6tot d|ipt6|SdS(Nisframesics 6|i S(N(scsface_up(scspysol.pys6s(s __debug__slens_scardssAssertionErrorsgamesssreservessrs num_cardssmoveMovesrowssflipMovesforall(s_srs num_cardsspysol.pys redealCards16s'(  ''cs66xr|iiid6r\}6xP6t|idjo66|i|gdd6|i o 6dSnq'WqW6|iit|i||iii ddddS(Niisframesi( s_sgamesssrowssrslenscardss dealToStackssmoveMovesreserves(s_sface_upsrspysol.pys redealCards36s i(s TalonStacksdealToStacksOrFoundationss dealToStackss redealCards1s redealCards3(spysol.pysIntelligence_Talon6s  sIntelligence_RowStackcs66dZ6dZRS(Ncs66ti||| o 6dSn6to|ipt6|id |df\}}6|i |i jo 6dSn6|i |i d|i i jp|i |i d|i i jSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardss __debug__sAssertionErrorsc1sc2ssuitsrankscapsmod(s_s from_stackscardssc1sc2spysol.pys acceptsCards6s ! csb66|i oM6|iiid}6|io&6|id|||fddnndS(Nisrowsssoundi(s_scardssgamesssreservessrsdealRow(s_srspysol.pys fillStack6s (s acceptsCardss fillStack(spysol.pysIntelligence_RowStack6s sIntelligence_ReserveStackcs66dZ6eiZRS(Ncs66dSdS(Ni((s_spysol.pys canFlipCard6s(s canFlipCards TalonStacksdealToStacksOrFoundationss dealToStacks(spysol.pysIntelligence_ReserveStack6s s IntelligencecsG66eeddZ6eedeZ6dZ6dZRS(Ns max_roundsis base_rankc s66ti|}6|i}6|ii|i|iif\}}6|i i t |||dddddd6|i |i dd6|i dS(Nsmax_moveis max_accepts max_cardsi?Bssw(sFans createGames_slssstalonsxsXSsysreservessappendsIntelligence_ReserveStacks createTextsdefaultStackGroups(s_slsssxsyspysol.pys createGame6s  (1cs66|ii}6x,tdd6r}6|iddq$W6|i6|i6|it|i ||ii ddddS(Niisframes( s_ssstalonsrangesisdealRowsstartDealSamplesmoveMoveslenscardssreserves(s_stalonsispysol.pys startGame6s   (s StackWrappersIntelligence_Talons Talon_ClasssIntelligence_RowStacksNO_RANKsRowStack_Classs createGames startGame(spysol.pys Intelligence6s i8s Midnight OiliWsScotch Patiencei9isLa Belle LucieisSuper Flower GardenisThree Shuffles and a DrawiXisBeleagueredCastleType_Hintcs 7 7RS(N((spysol.pysBeleagueredCastleType_Hint 7ssStreetsAndAlleyscs) 77eZ7ddZ$7dZRS(Nc s?77t|dd|if\}}7td|i|i|d|i}7|i }7||d|i }7||id|i }7|||i }7|i||id|i7||if\} } 7xQtdd7r>} 7|iit| | || dd7| |i} qW7x||if||iffd7r\} } 7x{tdd7rh} 7t| | |ddd d} 7|idf\| _| _7|ii|  7| |i} qzWqYW!7|i|i|i|if\} } "7t| | ||_ #7|i!dS( NsXOFFSETi iiiiismax_moves max_accept("sLayouts_ssslsmaxsXSs playcardssXOFFSETswsXMsx0sx1sx2sx3ssetSizesYMsYSsxsysrangesis foundationssappendsSS_FoundationStacks RK_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowsswidthsheightsInitialDealTalonStackstalonsdefaultStackGroups( s_s playcardsslssswsx0sx1sx2sx3sxsysisstackspysol.pys createGame7s.$+ ! ($ !)i cs$7%7x2tdd%7r}&7|iiiddqW'7|i(7x,tdd(7r})7|iiiqZW*7to#t |iii djpt dS(Niisframesi( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvails __debug__slenscardssAssertionError(s_sispysol.pys startGame$7s   (sBeleagueredCastleType_Hints Hint_Classs createGames startGame(spysol.pysStreetsAndAlleys 7s sBeleagueredCastlecs+7,7dZ.7dZRS(Ncs,7-7|i|dSdS(Ncs-7|idj|ifS(Ni(scsrankssuit(scspysol.pys-7s(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHook,7scs.7/7x2tdd/7r}07|iiiddqW17|i27x,tdd27r}37|iiiqZW47|iiid|ii57to#t |iii djpt dS(Niisframesisrows( srangesis_ssstalonsdealRowsstartDealSamples foundationss __debug__slenscardssAssertionError(s_sispysol.pys startGame.7s   (s _shuffleHooks startGame(spysol.pysBeleagueredCastle+7s sCitadelcs6777dZ97dZRS(Ncs7787|i|dSdS(Ncs87|idj|ifS(Ni(scsrankssuit(scspysol.pys87s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook77sc s%97:7d};7|ii}<7|i=7|id|iid|>7x>7|io?7x|iid?7r}@7|i |A7xw|iidA7rH}B7|i ||id o$C7|i d||d|D7PnqWF7|i d||d|G7|i oH7PnqlWqMWdS(Nisrowssframesii( sframess_ssstalonsstartDealSamplesdealRows foundationsscardssrowssrsflipMoves acceptsCardssmoveMove(s_sframesstalonsrssspysol.pys startGame97s"      (s _shuffleHooks startGame(spysol.pysCitadel67s sFortress_RowStackcsI7J7dZRS(NcsJ7K7ti||| o L7dSnM7|ioN7|id i|dijo O7dSnP7|id i|dif\}}Q7|d|i i |jp|d|i i |jSnR7dSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardsssuitsranksr1sr2scapsmod(s_s from_stackscardssr1sr2spysol.pys acceptsCardsJ7s  " ':(s acceptsCards(spysol.pysFortress_RowStackI7ssFortresscsYS7T7eiZU7eZV7eZW7eeddZ X7e Z Y7dZ g7dZ RS(Ns max_acceptic sY7Z7t||if\}}[7t|dddddddd\7t|i|f|]7|i|i d|i d^7|i |ii i |ii i ||_ _7|iio.`7t|iii |iii ||_na7xJ|iida7r7}b7|ii|i|i |i |d |iqWc7xA|iidc7r.}d7|ii|i|i |i |qMWe7|if7|SdS( Nsrowsi swasteistextss playcardsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssrspysol.pys createGameY7s%!-. 5 , csg7h7x2tddh7r}i7|iiiddqWj7|ik7x,tddk7r}l7|iiiqZWm7to#t |iii djpt dS(Niisframes( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvails __debug__slenscardssAssertionError(s_sispysol.pys startGameg7s   (sLayoutsklondikeLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersFortress_RowStacksRowStack_ClasssBeleagueredCastleType_Hints Hint_Classs createGames startGame(spysol.pysFortressS7s     sChessboard_Foundationcsn7o7dZr7dZRS(Nc sKo7p7t|ddddddq7tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__o7scsr7s7|i ot7t|djp |di o u7dSnv7|di|iijo w7dSnx7xK|iii dx7r5}y7|io"z7|di |idi jSnq~W{7dSn|7t i |||SdS(Nii(s_scardsslensface_upssuitscaps base_suitsgamesss foundationssranksSS_FoundationStacks acceptsCardss from_stack(s_s from_stackscardsssspysol.pys acceptsCardsr7s%    & (s__init__s acceptsCards(spysol.pysChessboard_Foundationn7s sChessboard_RowStackcs}7~7dZRS(Ncs~77|iio7ti||Sn7x@|iiid7r*}7|io7ti||Snq?W7t dfSdS(Ni( s_sgamesdemosFortress_RowStacks canDropCardssstackssss foundationsscardssNone(s_sstacksssspysol.pys canDropCards~7s  (s canDropCards(spysol.pysChessboard_RowStack}7ss ChessboardcsA77eZ7eeddddZ7dZ7dZRS(Ns max_acceptismodi cs77ti|}7|i|iid d\}}}}7t dd|i }7t|i||i|d|d||i_dS(Nises canvas_cardscardwsanchorsfont(sFortresss createGames_sls getTextAttrsss foundationsstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvassXMstextssinfo(s_slstxstystastfsfontspysol.pys createGame7s,cs77|idjo 7dSn7d}7xE|iid7r2}7|io7t|idi}7Pnq<W7|ii i d|dS(Nisistext( s_spreviewstsss foundationsscardssRANKSsrankstextssinfosconfig(s_stssspysol.pys updateText7s     (sChessboard_FoundationsFoundation_Classs StackWrappersChessboard_RowStacksRowStack_Classs createGames updateText(spysol.pys Chessboard7s  isStreets and Alleysi"sBeleaguered CastleiiisUnionSquare_Foundationcs77dZRS(Ncs77ti||| o 7dSn7t|idjo%7|didt|ijSn7|dit|ijSdS(Nii i(sAbstractFoundationStacks acceptsCardss_s from_stackscardsslensrank(s_s from_stackscardsspysol.pys acceptsCards7s  %(s acceptsCards(spysol.pysUnionSquare_Foundation7ssUnionSquare_RowStackcs)77dZ7dZ7dZRS(Nc sc77t|dddddt7dddd7tti||||f|7d|_ dS( Nsmodi sdiris base_ranks max_acceptismax_move( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgamescapspysol.pys__init__7s"cs 77ti||| o 7dSn7|i o 7dSn7|di|idijo 7dSn7t|idjo>7|di|id i}7|djp |d jSnY7|idi|idi|i i }7|id i||i i |dijSdS(Nii( s OpenStacks acceptsCardss_s from_stackscardsssuitslensrankscard_dirscapsmods stack_dir(s_s from_stackscardsscard_dirs stack_dirspysol.pys acceptsCards7s  ! +cs77|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage7s(s__init__s acceptsCardssgetBottomImage(spysol.pysUnionSquare_RowStack7s  s UnionSquarecs>77eZ7dZ7dZ7dZ7dZRS(Nc s"77t|dd|if\}}7|i|id|i|id|i7|i|if\}}7t |||dd|_ 7|i |i d7||i}7t||||_7|i |id7xtdd7rt}7d |i}7xHtdd7r5}7|iit|||7||i}q W7||i}qW7d |i|if\}}7x|tdd7ri}7t||||d d7d dd d}7|i |d7|ii|7||i}qW7|idS(NsYMii is max_roundsissiiismax_movesdirs max_cardsissw(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesisjsrowssappendsUnionSquare_RowStacksUnionSquare_Foundationsstacks foundationssdefaultStackGroups(s_slsssxsysisjsstackspysol.pys createGame7s2$/   cs:77|i7|iii7|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGame7s csH77|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch7scs77fSdS(N((s_spysol.pysgetHighlightPilesStacks7s(sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(spysol.pys UnionSquare7s     i#s Union SquaresWindmill_Foundationcs77dZRS(NcsJ77|iitjo7|iiiitSn7ti |SdS(N( s_scaps base_ranksACEsgamesappsimagess getLettersRK_FoundationStacksgetBottomImage(s_spysol.pysgetBottomImage7s(sgetBottomImage(spysol.pysWindmill_Foundation7ssWindmill_RowStackcs77dZRS(NcsB77ti||| o 7dSn7||iiijSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgamessswaste(s_s from_stackscardsspysol.pys acceptsCards7s (s acceptsCards(spysol.pysWindmill_RowStack7ssWindmillcs\77dZ8dZ8dZ 8dZ8dZ8dZ8edZRS(Nc s77t|dd|if\}}7|id|i|id|i|i|i7|i}7|i}7t |||dd|_ 7|i |i d7||i}7t||||_7|i |id7||i|f\}}7xdd fddfd dfddfd dfd dfdd fdd ffd 7rX}7||d |i||d|if\}}7|iit|||qWW7|d|i|d|if\}}7|iit|||7d d dddd7xddfd dfddfd dffd 7rh}7||d |i||d|if\}}7|iit|||8dtdd qEW8|idS(NsXMiiis max_roundsisssiiiismodi s min_cardss max_cardsi4f0.6f3.4s base_ranksdir(sLayouts_ssslssetSizesXSsXMsYSsYMsxsysWasteTalonStackstalons createTexts WasteStackswastesx0sy0sdsrowssappendsWindmill_RowStacks foundationssWindmill_FoundationsKINGsdefaultStackGroups(s_slsssxsysx0sy0sdspysol.pys createGame7s.$6  T 3#+0 3csY88x.|d8r!}8|idjo8PnqW8|i|8||gSdS(Ni(scardsscsidsremove(s_scardsscspysol.pys _shuffleHook8s   cs`8 8|i 8|iiid|iidf 8|iii 8|iiidS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_spysol.pys startGame8s &cs 88t|idjo8||iijo |iiio8|iiinD8||iijo |iiio8|iii d|nndS(Nii( slensstackscardss_ssswastestalons dealCardssrowssmoveMove(s_sstackspysol.pys fillStack 8s &&cs588|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch8scs88fSdS(N((s_spysol.pysgetHighlightPilesStacks8scs88ffffSdS(N((s_seventspysol.pys getAutoStacks8s(s createGames _shuffleHooks startGames fillStacksshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(spysol.pysWindmill7s      is Pyramid_Hintcs88dZRS(Ncs688||iiif}8ti|||SdS(N(srowss_sgamessstalons DefaultHintsstep010s dropstacks(s_s dropstackssrowsspysol.pysstep0108s(sstep010(spysol.pys Pyramid_Hint8ssPyramid_StackMethodscsE8 8dZ'8dZ08d d dZ:8d d dZRS(Ncs 8!8|io "8dSn#8||jp|i pt|djo $8dSn%8|id }&8|io&|dio|di|idjSdS(Niii (s_sbasicIsBlockeds from_stackscardsslenscsface_upsrank(s_s from_stackscardsscspysol.pys acceptsCards 8s  . cs'8(8|i o )8dSn*8|id }+8|io|itjo |i oJ,8|iiddd-8|i d|ii i ddd.8dSn/8dSdS(Niisautodropspriorityissound( s_scardsscsface_upsranksKINGsbasicIsBlockedsgames playSamples playMoveMovesss foundations(s_seventscspysol.pys_dropKingClickHandler'8s +& cs0818|iiddd28to2|djo|i||id gpt38|ii |ii }48|ii i d}58|ii|||d|d|68|ii|||d|d|78|ii|88|i98|idS(Nsdroppairspriorityiiisframessshadow(s_sgames playSamples __debug__sns acceptsCardss other_stackscardssAssertionErrors enterStatesS_FILLs old_statesss foundationssfsmoveMovesframessshadows leaveStates fillStack(s_sns other_stacksframessshadows old_statesfspysol.pys _dropPairMove08s<%% icsv:8;8||iiijo6<8|ii|||d|d|=8|i n!?8|i ||dd d|dS(Nsframessshadowi( sto_stacks_sgamesss foundationssmoveMovesncardssframessshadows fillStacks _dropPairMove(s_sncardssto_stacksframessshadowspysol.pysmoveMove:8s%(s acceptsCardss_dropKingClickHandlers _dropPairMovesmoveMove(spysol.pysPyramid_StackMethods8s   sPyramid_Foundationcs@8A8dZRS(Ncs@A8B8ti||| o C8dSnD8|ditjSdS(Ni(sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscardsspysol.pys acceptsCardsA8s (s acceptsCards(spysol.pysPyramid_Foundation@8ss Pyramid_Taloncs)E8F8dZJ8dZN8dZRS(Ncs8F8G8|i|o H8dSnI8ti||SdS(Ni(s_s_dropKingClickHandlerseventsFaceUpWasteTalonStacks clickHandler(s_seventspysol.pys clickHandlerF8s cs7J8K8ti| o L8dSnM8|ii SdS(Ni(sFaceUpWasteTalonStacks canDealCardss_sgames isGameWon(s_spysol.pys canDealCardsJ8s csN8O8|iobP8|id }Q8xG|dQ8r:}R8||j o|i||oS8|dfSnq-WnT8tdfSdS(Nii(s_scardssstackssss acceptsCardssNone(s_sstacksscardsssspysol.pys canDropCardsN8s  #(s clickHandlers canDealCardss canDropCards(spysol.pys Pyramid_TalonE8s  s Pyramid_WastecsU8V8dZRS(Ncs8V8W8|i|o X8dSnY8ti||SdS(Ni(s_s_dropKingClickHandlersevents WasteStacks clickHandler(s_seventspysol.pys clickHandlerV8s (s clickHandler(spysol.pys Pyramid_WasteU8ssPyramid_RowStackcsqZ8[8dZ^8dddddddddddddddddddddfZ_8dZi8d ZRS( Nc s8[8\8ti||||dddd]8d|_dS(Ns max_acceptis max_cardsi(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgamespysol.pys__init__[8s%iiiiiics_8`8|iii|if\}}a8|idf\}}b8xub8|djodc8|||}d8|d}e8x<t |||de8r"}f8||i o g8dSnqWqBWh8dSdS(Niii( s_sgamesssrowssSTEPsrsstepsidsisnsrangesjscards(s_srsstepsisnsjspysol.pysbasicIsBlocked_8s!  cs8i8j8|i|o k8dSnl8ti||SdS(Ni(s_s_dropKingClickHandlersevents OpenStacks clickHandler(s_seventspysol.pys clickHandleri8s (s__init__sSTEPsbasicIsBlockeds clickHandler(spysol.pysPyramid_RowStackZ8s H sPyramidcsDm8n8eZo8ddZ8dZ8edZ8dZRS(Nc so8p8t||if\}}q8|i|id|i|id|ir8xt ddr8r}s8|id||id}t8|i||id}u8xLt |ddu8r5}v8|iit|||w8||i}qWqbWx8|i|if\}}y8t|||dd d d|_z8|i|id {8|i|id \}} } } |8t|i|| d | |ii_}8||i}~8t|||d d|_8|i|id 8|i|i|if\}}8|i it!|||8dt"dddt#8dddd8|ig|ig|i$_%8|i|i$i%|i$_&8|i|i$i%|i$_'dS(Ni iiiiiis max_roundsis max_acceptssesnesanchorssuitsdirs base_ranksmax_moves max_cardsi4((sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysjsrowssappendsPyramid_RowStacks Pyramid_Talonstalons createTexts getTextAttrstxstystastfs MfxCanvasTextscanvasstextssroundss Pyramid_Wasteswasteswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks( s_srowsslsssisxsysjstxstystastfspysol.pys createGameo8s2/  $$'"ics:88|i8|iii8|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGame8s cs#88|ii|iiffSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacks8scs88|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch8s(s Pyramid_Hints Hint_Classs createGames startGamesNones getAutoStackssshallHighlightMatch(spysol.pysPyramidm8s   sRelaxedPyramidcs88dZRS(Ncs,88t|iit|iijSdS(N(sgetNumberOfFreeStackss_sssrowsslen(s_spysol.pys isGameWon8s(s isGameWon(spysol.pysRelaxedPyramid8ssThirteencs88dZ8dZRS(Ncs^88t||if\}}8|id|i|id|i|i8xt dd8r}8|id||id}8|i|i||id}8xLt |dd8r5}8|iit|||8||i}qWqbW8|i|if\}}8t|||dd|_8|i|id8||i}8t||||_8|i|id8d |i_8|i|i|if\}}8|iit|||8d td dd t8d ddd8|ig|ig|i_8|i|ii|i_8|i|ii|i_dS(Niiiiiis max_roundsssissuitsdirs base_ranksmax_moves max_cardsi?B( sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsPyramid_RowStacksWasteTalonStackstalons createTexts Pyramid_Wasteswastes CARD_XOFFSETswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks(s_slsssisxsysjspysol.pys createGame8s0/ " "css88|i8|iiid|iid dd8|iiid|iid8|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_spysol.pys startGame8s )#(s createGames startGame(spysol.pysThirteen8s i&isRelaxed PyramidsPileOn_RowStackcs88dZRS(Ncs88|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage8s(sgetBottomImage(spysol.pysPileOn_RowStack8ssPileOncsA88eZ8ddZ8dZ8dZ8dZRS(Nc s88t|dd|if\}}8td|i|i|d|id|i}8|i |id||i d|i 8|i }8xtdd8r}8|i}8xtdd8r}8t|||dddd} 8|idf\| _| _8|ii| 8||}8|d jo |djo8PnqW8||i }qW8|i|i|i|i f\}}8t||||_8|i|i_8|ig|i_8|i|i_dS( NsXOFFSETiiiiisdirs max_cardsi( sLayouts_ssslsmaxsXSs playcardssXOFFSETsXMswssetSizesYMsYSsysrangesisxsjsPileOn_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowssappendswidthsheightsInitialDealTalonStackstalonssgs openstackss talonstackss dropstacks( s_s playcardsslssswsysisxsjsstackspysol.pys createGame8s*$6,    !  )ics88|iid }8x8tdd8r%}8|iiid|ddq(W8|i8|iiid|8t o#t |iii djpt dS(Ni iisrowssframes( s_sssrowssrsrangesistalonsdealRowsstartDealSamples __debug__slenscardssAssertionError(s_srsispysol.pys startGame8s # csv88xb|iid8rO}8|io<8t|idjp|i|i o 8dSnnqW8dSdS(Niii(s_sssrowssrscardsslens _isSequence(s_srspysol.pys isGameWon8s   -cs88|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch8s(s DefaultHints Hint_Classs createGames startGames isGameWonsshallHighlightMatch(spysol.pysPileOn8s    i)s Bristol_Hintcs,88dZ8dZ8dZ8dZRS(Nics88||iiij oB8|d}8t|t|ijo8d |fSnn8t i |||||||SdS(Ni'i(srs_sgamesssreservessscoreslenspilescardsscolorsCautiousDefaultHints_getMovePileScorestsrpile(s_sscorescolorsrstspilesrpilespysol.pys_getMovePileScore8s  (sBONUS_CREATE_EMPTY_ROWsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs_getMovePileScore(spysol.pys Bristol_Hint8s   s Bristol_Taloncs88ddZRS(Ncs)88|id|iiid|SdS(Nsrowsssound(s_s dealRowAvailsgamesssreservesssound(s_ssoundspysol.pys dealCards8si(s dealCards(spysol.pys Bristol_Talon8ssBristolcs>88eiZ8eZ8dZ9dZ9dZRS(Nc s88t|dd|if\}}8|i|id|i|id|i8|id|i|if\}}8xNt dd8r;}8|i it|||dd8||i}qW8xt dd8r}8|i|dd|id}8xt dd8rw}8|i|d|id}8t|||d tdd }8|idf\|_|_8|ii|q WqW8|id|i|id|if\}}8t||||_8|i|id 8xTt dd8rA}8||i}9|iit|||d dd dqW9|i |i|i_9|ig|i_9|i|i|i_ dS(NsXOFFSETi iiiismax_moveis base_rankissws max_accepts max_cardsi?B(!sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsRK_FoundationStacksjs RK_RowStacksNO_RANKsstacksXOFFSETs CARD_XOFFSETs CARD_YOFFSETsrowss Bristol_Talonstalons createTextsreservess ReserveStackssgs openstackss talonstackss dropstacks( s_slayoutslsssxsysisjsstackspysol.pys createGame8s4$/& % # !1 /cs(99dt|iif\}}9g}9xK|d d9r:}9|i t jo 9|i |n 9|d}q=W 9x|d 9r} 9||} 9xf 9||joU9||i t jo-9||||f\||<||<9Pn9||}qWqW9|i 9|SdS(Niii(slens_sssrowssisnskingsscardsscsranksKINGsappendsjsreverse(s_scardssisnskingsscsjspysol.pys _shuffleHook9s$!    % cs99|ii}9x8tdd9r%}9|iiid|ddq$W9|i9|iiid|9|iii dS(Niisrowssframes( s_sssrowssrsrangesistalonsdealRowsstartDealSamples dealCards(s_srsispysol.pys startGame9s # (sLayoutsklondikeLayouts Layout_Methods Bristol_Hints Hint_Classs createGames _shuffleHooks startGame(spysol.pysBristol8s     s Belvederecs99dZ#9dZRS(Ncs|99x>|d9r1}9|idjo9|i| 9PnqW!9ti||}"9|d |g|d SdS(Nii(scardsscsranksremovesBristols _shuffleHooks_(s_scardsscspysol.pys _shuffleHook9s  cs#9$9|ii}%9x8tdd%9r%}&9|iiid|ddq$W'9|i(9|iiid|)9t o%|iii d i t jpt *9|iiid|iid +9|iiidS(Niisrowssframesi(s_sssrowssrsrangesistalonsdealRowsstartDealSamples __debug__scardssranksACEsAssertionErrors foundationss dealCards(s_srsispysol.pys startGame#9s # /#(s _shuffleHooks startGame(spysol.pys Belvedere9s i*isAcesUp_Foundationcs0919dZRS(Ncs1929ti||| o 39dSn49|d}59x|iiid59r}69||j o"|io|id i |i joN79|id i |i jp|id i t jo89|i t jSnnqJW99dSdS(Nii( sAbstractFoundationStacks acceptsCardss_s from_stackscardsscsgamesssrowsssuitsranksACE(s_s from_stackscardsscssspysol.pys acceptsCards19s   56(s acceptsCards(spysol.pysAcesUp_Foundation09ssAcesUp_RowStackcs:9;9dZ?9eiZRS(NcsB;9<9ti||| o =9dSn>9t|idjSdS(Ni(s BasicRowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscardsspysol.pys acceptsCards;9s (s acceptsCardss BasicRowStacksdoubleclickHandlers clickHandler(spysol.pysAcesUp_RowStack:9s sAcesUpcsV@9A9eZB9eeddZC9dZS9dZV9dZ]9edZ RS(Ns max_acceptic sC9D9t||if\}}E9|i|id|i|id|iF9|i|if\}}G9|i ||||_ H9|i |i dI9|d|id}J9xKtddJ9r8}K9|ii|i|||L9||i}qWM9|id|i}N9t|||tddO9d dd td d }P9|i |dQ9|ii|R9|idS( Niisssiiiismax_movesdirs base_ranks max_cardsi0(sLayouts_ssslssetSizesXMsXSsYMsYSsxsys Talon_Classstalons createTextsrangesisrowssappendsRowStack_ClasssAcesUp_FoundationsANY_SUITsANY_RANKsstacks foundationssdefaultStackGroups(s_slayoutslsssxsysisstackspysol.pys createGameC9s / "cs'S9T9|iU9|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGameS9s csV9W9t|iididjo X9dSnY9xT|iidY9rA}Z9t|idjp|iditjo [9dSnqCW\9dSdS(Nii0i(slens_sss foundationsscardssrowssranksACE(s_ssspysol.pys isGameWonV9s#  0csY]9^9|tjo _9|iif|iifSn#a9|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_seventspysol.pys getAutoStacks]9s ( sDealRowTalonStacks Talon_Classs StackWrappersAcesUp_RowStacksRowStack_Classs createGames startGames isGameWonsNones getAutoStacks(spysol.pysAcesUp@9s     sFortunescs b9c9eeddddZRS(Nsmax_movei?Bs max_accept(s StackWrappersAcesUp_RowStacksRowStack_Class(spysol.pysFortunesb9ssRussianAces_Taloncsd9e9ddZRS(Ncs_e9f9td|iii}g9| oh9|iii}ni9|id|d|SdS(Ncs f9|i S(N(ssscards(ssspysol.pysf9ssrowsssound(sfilters_sgamesssrowss dealRowAvailssound(s_ssoundsrowsspysol.pys dealCardse9s i(s dealCards(spysol.pysRussianAces_Talond9ss RussianAcescsj9k9eZRS(N(sRussianAces_Talons Talon_Class(spysol.pys RussianAcesj9ssPerpetualMotion_Taloncs l9m9dZq9ddZRS(NcsIm9n9|iio|iiidjo o9dSnp9|ii SdS(Nii(s_sgamesdemosmovessindexs isGameWon(s_spysol.pys canDealCardsm9s& cs2q9r9|ios9ti|d|Snt9|it|if\}}u9t|i i }v9|i w9x}|dw9rp}x9xdx9|ioVy9|d}z9|i d||dd{9|id io|9|i|nqWqzW}9tot|i|jpt~9ti|d|SdS(Nssoundiisframesi(s_scardssDealRowTalonStacks dealCardsssoundsgameslens num_cardsslistsssrowssreversesrsmoveMovesface_upsflipMoves __debug__sAssertionError(s_ssoundsgames num_cardssrowssrspysol.pys dealCardsq9s !    'i(s canDealCardss dealCards(spysol.pysPerpetualMotion_Talonl9s sPerpetualMotion_Foundationcs99dZRS(Ncs?99ti||| o 9dSn9t|ddSdS(Nisdir(sAbstractFoundationStacks acceptsCardss_s from_stackscardssisRankSequence(s_s from_stackscardsspysol.pys acceptsCards9s (s acceptsCards(spysol.pysPerpetualMotion_Foundation9ssPerpetualMotion_RowStackcs99dZRS(Ncs99|i}9| pt|djo9tdfSn9xG|d9r:}9||j o|i||o9|dfSnqMW9tdfSdS(Nii(s_sgetPilespileslensNonesstackssss acceptsCards(s_sstacksspilessspysol.pys canDropCards9s #(s canDropCards(spysol.pysPerpetualMotion_RowStack9ssPerpetualMotioncs)99dZ9dZ9dZRS(Nc s99t||if\}}9|i|id|i|id|i9|i|if\}}9t |||dd |_ 9|i |i d9|d|id}9xTtdd9rA}9|iit|||d dd t9||i}qW9|id |i}9t|||td t9d d dd9dddd}9|i |d9|ii|9|idS(Niis max_roundsisssiiisdirs base_rankis max_cardsi4smax_moves min_accepts max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysPerpetualMotion_Talonstalons createTextsrangesisrowssappendsPerpetualMotion_RowStacksNO_RANKsPerpetualMotion_FoundationsANY_SUITsANY_RANKsstacks foundationssdefaultStackGroups(s_slayoutslsssxsysisstackspysol.pys createGame9s"/ +cs'99|i9|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame9s cs99|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch9s(s createGames startGamesshallHighlightMatch(spysol.pysPerpetualMotion9s  isAces UpsIdiot's Delightiis Russian AcesisPerpetual Motions First Laws Montana_Hintcs99dZRS(Nc s99|i}9|i|i|if\}}}9td|ii}9x||iid9ri}9|i o 9q`n9t o/t |i djo|i d i pt9|i d|i gf\}}} 9|i|djo9|ii|id} n'9t} 9|i|jo 9q`n9x|d9r} 9|i|| || o]9| o| i o#9d|i| i d i} n 9d} 9|i| d|| nqFWq`WdS(Ncs 9|i S(N(ssscards(ssspysol.pys9siii@iP(s_sgamesRLENsRSTEPsRBASEsfiltersssrowssfreerowssrscardss __debug__slensface_upsAssertionErrorscspilesrpilesidsleftsNonesranksts shallMovePilesKsscoresaddHint( s_sgamesRLENsRSTEPsRBASEsfreerowssrscspilesrpilesleftstsscorespysol.pys computeHints9s* $  9%   # (s computeHints(spysol.pys Montana_Hint9ss Montana_Taloncs,99dZ9ddZ9dZRS(Ncs+99|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_spysol.pys canDealCards9sc s99|i}9|i|i|if\}}}9d}9tot|idjpt 9|i i }9g}9t gd} 9xtdd9r} 9| |} 9|| } 9| io| id i|jo$9d| id if\} }n9dtf\} }9xt|d9r}9|| |} 9| oS9| i p1| id i|jp| id i||jo 9d} nn9| os9|i| 9| | t jo9| | | :||j o?:|i|nqW@:|SdS(Ni( sspacesslens_sgamesrandomschoicesstackssrsappend(s_sstackssgapssspacessrspysol.pysgetRedealSpaces::s (sgetRedealSpaces(spysol.pys Spaces_Talon9:ssSpacescsA:B:eZRS(N(s Spaces_Talons Talon_Class(spysol.pysSpacesA:ssBlueMooncs,C:D:dddf\ZZZE:dZRS(Ni8iicsWE:F:d}G:d}H:xtddH:r}I:|ddjoJ:|d}nK:|djoL:|iM:d}nN:|iiid|ii |fd|O:|d}q'WP:t o#t |iii djpt Q:td |ii }R:d}S:x@|dS:r3}T:|id||ii |U:|d}qWdS( Nii4iii'isrowssframescs"Q:|io|id itjS(Ni(srscardssranksACE(srspysol.pysQ:s(sframessjsrangesis_sstartDealSamplessstalonsdealRowsrowss __debug__slenscardssAssertionErrorsfiltersace_rowssrsmoveMove(s_sframessjsisace_rowssrspysol.pys startGameE:s$     ,-   (sRLENsRSTEPsRBASEs startGame(spysol.pysBlueMoonC:ssRedMooncsV:W:dZY:dZRS(NcsW:X:|i|dSdS(NcsX:|idj|ifS(Ni(scsrankssuit(scspysol.pysX:s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookW:scsY:Z:d}[:|ii}\:|iiid|d|d|d|dfd|]:x~tdd]:rk}^:|djo_:|i `:d}na:|dd }b:|iiid|||d !d|qhWdS( Nisrowsiii*sframesiiii ( sframess_sssrowssrstalonsdealRowsrangesisstartDealSamplesn(s_sframessrsisnspysol.pys startGameY:s ;   (s _shuffleHooks startGame(spysol.pysRedMoonV:s i5ssisncardssGapsiti?s Blue MooniusRed MoonsPasDeDeux_Hintcsm:n:dZu:dZRS(Ncsmn:o:d}p:|i|idjoq:|d}nr:|i|idjos:|d}nt:|SdS(Nii i(sdscardsranksstacksidssuit(s_sstackscardsdspysol.pys getDistancen:s  c su:v:g}w:xJ|iiidw:r4}x:|i|ioy:|i|z:Pnq!W{:xD|d{:r7}|:|i||id }}:|i d|i df\}}~:t |ddt d|d|d}:x|d:r}:|iii|}:||jo :qn:to|i||ipt:|i||id } :|i||id } :|i||id } :ddf\} } :|iiiidjo:ddf\} } n:|ii|id i d}:do||iiiijo:| d} n:t| || | | | | | d}:|djo:|i|d||nqWqhWdS( Niii i4iiii( srowss_sgamesssrs canMoveCardsscardssappends getDistancesr1_dsidscolumnsrowsranges stack_idssists __debug__s acceptsCardssAssertionErrorst1_dsr2_dst2_dsrwstwstalonsroundscswastesintsscoresaddHint(s_srowssrsr1_dscolumnsrows stack_idssistst1_dsr2_dst2_dsrwstwscsscorespysol.pys computeHintsu:s:    #.  '"#/(s getDistances computeHints(spysol.pysPasDeDeux_Hintm:s sPasDeDeux_Wastecs::dZRS(Ncs::dSdS(Ni((s_spysol.pys canFlipCard:s(s canFlipCard(spysol.pysPasDeDeux_Waste:ssPasDeDeux_RowStackcsc::dZ:dZ:d d dZ:d d dZ:dZ:eedZRS(Ncs::ti|| o :dSn:|iiii o :dSn:|iiiid }:|io+|di |i jo|di |i jSdS(Nii( s ReserveStacks canMoveCardss_scardssgamessswastescsface_upssuitsrank(s_scardsscspysol.pys canMoveCards:s   csB::ti||| o :dSn:|ii||SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgames isNeighbour(s_s from_stackscardsspysol.pys acceptsCards:s cs::to*|djo||iiijpt:tot|i djpt:|i ||dd dd:|iii i o:|iii i nI:to"|iiii d ipt:|ii|iiidS(Nisframessshadowi(s __debug__sncardssto_stacks_sgamesssrowssAssertionErrorslenscardss _swapPairMovestalons canDealCardss dealCardsswastesface_upsflipMove(s_sncardssto_stacksframessshadowspysol.pysmoveMove:s4' ,ics::|i}:|i|i}:|iid}:|i|||dd:|i|||d|d|:|i|||dd:|i |dS(Nisframessshadow(s_sgames enterStatesS_FILLs old_statesss internalssswapsmoveMovesns other_stacksframessshadows leaveState(s_sns other_stacksframessshadowsgames old_statesswapspysol.pys _swapPairMove:s "cs0::|id}:|iiii|SdS(Ni (s_sidssuitsgamesappsimagess getSuitBottom(s_ssuitspysol.pysgetBottomImage:scs::xz|iiid:rd}:|i|ioH:|i||io':|it |i|:dSn:PnqW:dSdS(Nii( s_sgamesssrowssrs canMoveCardsscardss acceptsCardss playMoveMoveslen(s_sevents from_stackss to_stackssrspysol.pysquickPlayHandler:s   (s canMoveCardss acceptsCardssmoveMoves _swapPairMovesgetBottomImagesNonesquickPlayHandler(spysol.pysPasDeDeux_RowStack:s     s PasDeDeuxcse::eZ:dZ:dZ:dZ:edZ:dZ:dZ:dZ RS(Nc s::t|dd|if\}}:|i|id|i|id|i:xt dd:r}:xut dd:rb}:|i||i|i||if\}}:|iit|||dddd qWqhW:|id |i|i|if\}}:t|||d d |_:|i|id :t|i:||i|d d |ii_:||i}:t|||dd|_:|i|id:|iit|:|idS(NsXMii iis max_acceptis max_cardsis max_roundsssesanchorsnwsmax_movessw(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsPasDeDeux_RowStackswidthsheightsWasteTalonStackstalons createTexts MfxCanvasTextscanvasstextssroundssPasDeDeux_Wasteswastes internalssInvisibleStacksdefaultStackGroups(s_slsssisjsxsyspysol.pys createGame:s$$/  13- %cs::|idS(N(s_sshuffleSeparateDecks(s_spysol.pysshuffle:scs@::|i:|iiidd:|iiidS(Nsframesi(s_sstartDealSamplessstalonsdealRows dealCards(s_spysol.pys startGame:s cs::ff|iifSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacks:scs::x|iid:rw}:t|idjo :dSn:|id }:|i|idjp|i |idjo :dSnqW:dSdS(Niii ( s_sssrowssrslenscardsscssuitsidsrank(s_srscspysol.pys isGameWon:s  1csg::|id|idf\}}:|id|idf\}}:||jp ||jSdS(Ni (sstack1sidscolumn1srow1sstack2scolumn2srow2(s_sstack1sstack2scolumn1srow1scolumn2srow2spysol.pys isNeighbour:s##cs::|iidffSdS(Ni(s_sssrows(s_spysol.pysgetHighlightPilesStacks:s( sPasDeDeux_Hints Hint_Classs createGamesshuffles startGamesNones getAutoStackss isGameWons isNeighboursgetHighlightPilesStacks(spysol.pys PasDeDeux:s      is Pas de DeuxsRoyalCotillion_Foundationcs::dZRS(NcsY::|iidjo:|iiiidSn:|iiii|iiSdS(Ni( s_scaps base_ranksgamesappsimagess getLetters getSuitBottoms base_suit(s_spysol.pysgetBottomImage:s(sgetBottomImage(spysol.pysRoyalCotillion_Foundation:ssRoyalCotillioncsM::eZ:dZ;dZ ;dZ;dZ;edZRS(Ncs::t||if\}}:|i|id|i|id|i:xdt dd:rQ}:|i||i|if\}}:|i it|||ddqbW:xt dd:r}:|id|i|i||if\}}:|ii|i||||dddd:||i}:|ii|i||||ddddd d qW:xt dd:r}:xst dd:r`}:|i|d |i|i||if\}}:|iit|||ddqWqW:|i|i|i|if\}}:t|||d d |_:|i|id :||i};t||||_;|i|id;|idS(Ni iis max_acceptsdirismodi s base_rankiis max_roundssswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysrowssappends BasicRowStacks foundationssFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssisxsysjspysol.pys createGame:s2/ &) 11;  5-)cs~;;|iiid|iidd;|i;x,tdd;r};|iiiqGW;|iiidS(Nsrowssframesii( s_ssstalonsdealRowsreservessstartDealSamplesrangesis dealCards(s_sispysol.pys startGame;s %  cs ; ;|i o ;|i|i} ;||iijo |iiio ;|iii nD;||ii jo |iiio;|iii d|n;|i |ndS(Ni( sstackscardss_s enterStatesS_FILLs old_statessswastestalons dealCardssreservessmoveMoves leaveState(s_sstacks old_statespysol.pys fillStack ;s&&cs;;fSdS(N((s_spysol.pysgetHighlightPilesStacks;scsY;;|tjo ;|iif|iifSn#;|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_seventspysol.pys getAutoStacks;s (sRoyalCotillion_FoundationsFoundation_Classs createGames startGames fillStacksgetHighlightPilesStackssNones getAutoStacks(spysol.pysRoyalCotillion:s      s OddAndEvencs;;dZ/;dZRS(Ncs;;t||if\}};|i|id|i|id|i;|i|if\}};xZt dd;rG};|i i|i||||dddd;||i}q}W ;x`t dd ;rM}!;|i i|i||||dddddd ";||i}qW#;xt dd#;r}$;|idd f||i|i|d |if\}}%;xXt dd f|d%;r;}&;|iit|||d d';||i}qWqCW(;|i|i|if\}});t|||d d|_*;|i|id+;||i},;t||||_-;|i|id.;|idS(Niiisdirismodi s base_rankiiis max_accepts max_roundssnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssxsysisjspysol.pys createGame;s2/ 1 7 ? %"csF/;0;|i1;|iiid|ii2;|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRowsreservess dealCards(s_spysol.pys startGame/;s (s createGames startGame(spysol.pys OddAndEven;s sKingdomcs23;4;eZ5;dZG;dZI;dZRS(Nc s5;6;t||if\}}7;|i|id|i|id|i8;|i|if\}}9;xNt dd9;r;}:;|i i|i|||t;;||i}q}W<;|i||if\}}=;xNt dd=;r;}>;|iit|||dd?;||i}qW@;|id|i|d|idf\}}A;t|||dd|_B;|i|id C;||i}D;t||||_E;|i|id F;|idS( Niiis max_acceptiis max_roundsisswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssANY_SUITsreservess ReserveStacksWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssxsysispysol.pys createGame5;s&/ % %2cs G;H;|i|ddSdS(NcsH;|idj|ifS(Ni(scsrankssuit(scspysol.pysH;si(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookG;scslI;J;|iK;|iiid|iidfL;|iiid|iiM;|iiidS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssreservess dealCards(s_spysol.pys startGameI;s &(sRK_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(spysol.pysKingdom3;s   sAlhambra_WastecsN;O;dZRS(NcsO;P;ti||| o Q;dSnR;|i o S;dSnT;|id |df\}}U;|i|ijo?|id|i i |ijp|id|i i |ijSdS(Nii( s WasteStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc1sc2spysol.pys acceptsCardsO;s   !(s acceptsCards(spysol.pysAlhambra_WasteN;ssAlhambracs)V;W;dZn;dZp;dZRS(NcsuW;X;t||if\}}Y;|i|id|i|id|iZ;|i|if\}}[;xTt dd[;rA}\;|i it|||d|dd];||i}q}W^;xdt dd^;rQ}_;|i it|||d|dd`;dtdd a;||i}qWb;|i||if\}}c;xNt ddc;r;}d;|iit|||d de;||i}q`Wf;|id |i|d |if\}}g;t|||d d |_h;|i|id i;||i}j;t|||ddd d|_k;|i|idl;|ii|im;|idS(Niiissuitsmax_moves base_ranksdiris max_acceptiis max_roundssswsmodi sse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsSS_FoundationStacksKINGsreservess BasicRowStacksWasteTalonStackstalons createTextsAlhambra_WasteswastesrowssdefaultStackGroups(s_slsssxsysispysol.pys createGameW;s2/ + $ %.$cs n;o;|i|ddSdS(Ncs8o;|idjo|iddfj|i|iffS(Nii (scsdecksrankssuit(scspysol.pyso;si(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookn;scsp;q;|iiid|iiddr;x>tddr;r+}s;|iiid|iiddq:Wt;|iu;|iiid|iidS(Nsrowssframesii( s_ssstalonsdealRows foundationssrangesisreservessstartDealSample(s_sispysol.pys startGamep;s % ) (s createGames _shuffleHooks startGame(spysol.pysAlhambraV;s  sCarpetcs2v;w;eZx;dZ;dZ;dZRS(Nc s,x;y;t||if\}}z;|i|id|i|id|i{;xt dd{;ry}|;xmt dd|;rZ}};|i|d|i|i||if\}}~;|iit|||q}WqbW;xt dd;r};ddfddfddfddff|\}};|i||i|i||if\}};|ii|i||||qW;|i|if\}};t|||d d|_;|i|id ;||i};t||||_;|i|id ;|idS( Ni iiiiiiis max_roundssse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends ReserveStacksdxsdys foundationssFoundation_ClasssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_slsssisjsxsysdxsdyspysol.pys createGamex;s(/  5' 71)cs;;|i|dSdS(Ncs;|idj|ifS(Ni(scsrankssuit(scspysol.pys;s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook;scsY;;|i;|iiid|ii;|iii;|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_spysol.pys startGame;s (sSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(spysol.pysCarpetv;s   i6sRoyal Cotillioni7s Odd and EveniiiasOsmosis_Foundationcs;;dZRS(Ncs;;ti||| o ;dSn;tot|djpt;td f\}};xW|i i i d;rA};t|i|jo";|t|if\}}nqwW;t|i|jo9;|di|it|iijo ;dSnn;dSdS(Nii(sAbstractFoundationStacks acceptsCardss_s from_stackscardss __debug__slensAssertionErrorsNonesmax_ss max_cardssgamesss foundationssrank(s_s from_stackscardssmax_ss max_cardsssspysol.pys acceptsCards;s $ &*(s acceptsCards(spysol.pysOsmosis_Foundation;ssOsmosiscs';;d ddZ;ddZRS(Nc sN;;t|dd|if\}};|i|id|i|id|i;|i|if\}};x{t dd;rh};t |||dddd};|idf\|_|_;|ii|;||i}qW;|id |i|if\}};x~t dd;rk};t||||d tdd};|idf\|_|_;|ii|;||i}q*W;|i|i|i|if\}};t|||d |d ||_;|i|id ;||i};t||||_;|i|id ;|idS(NsXOFFSETi iiismax_moveis max_acceptis base_ranks max_roundssnum_dealssw( sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis RK_RowStacksstacksXOFFSETs CARD_XOFFSETs CARD_YOFFSETsrowssappendsOsmosis_FoundationsANY_RANKs foundationsswidthsWasteTalonStacks max_roundssnum_dealstalons createTexts WasteStackswastesdefaultStackGroups( s_s max_roundssnum_dealslsssxsysisstackspysol.pys createGame;s.$/ !& $)$ics;;|iii};|i|ii};|ii |};|i ;|i |ii;|i d|ii|;x2tdd;r};|iiid|qW;|iii;|iiidS(Niiisflip(s_ssstalonsgetCards base_cardssuitsgameinfosdeckssns foundationssto_stacksstartDealSamplesflipMovesmoveMovesrangesisdealRowsflips dealCards(s_sflips base_cardsnsto_stacksispysol.pys startGame;s  i(s createGames startGame(spysol.pysOsmosis;ssPeekcs;;dZRS(Ncs;;ti|dddS(Nsflipi(sOsmosiss startGames_(s_spysol.pys startGame;s(s startGame(spysol.pysPeek;si;i<sMonteCarlo_Hintcs;;RS(N((spysol.pysMonteCarlo_Hint;ssMonteCarlo_Taloncs ;;dZ;ddZRS(Ncsy;;d};xL|iiid;r6};|i o ;d}n;|o ;dSnq!W;|o t|iSdS(Nii(sfrees_sgamesssrowssrscardsslen(s_sfreesrspysol.pys canDealCards;s    csf;;|ii|iiiddB;|ii};|ii|iiiddB;|SdS(Niii(s_sgamesupdateStackMovessstalonsfillEmptyStackssn(s_ssoundsnspysol.pys dealCards;s##i(s canDealCardss dealCards(spysol.pysMonteCarlo_Talon;s sMonteCarlo_RowStackcs9;;dZ;d d dZ;d d dZRS(Ncso;;ti||| o ;dSn;|id i|dijo ;dSn;|ii||SdS(Nii(s OpenStacks acceptsCardss_s from_stackscardssranksgames isNeighbour(s_s from_stackscardsspysol.pys acceptsCards;s  " cs;;to*|djo||iiijpt;|io$;|i ||dd d|n#;t i |||d|d|dS(Nisframessshadow(s __debug__sncardssto_stacks_sgamesssrowssAssertionErrorscardss _dropPairMovesshadows BasicRowStacksmoveMovesframes(s_sncardssto_stacksframessshadowspysol.pysmoveMove;s4 $ics,;;|i};|i|i};|iid};|i|ii ddB;|i o;|i dddn;|i |||d|d|;|i |||d|d|;|i;|i;|iio;|in;|i|ii d dB;|i|dS( Niiisdroppairspriorityisframessshadowi(s_sgames enterStatesS_FILLs old_statesss foundationssfsupdateStackMovestalonsdemos playSamplesmoveMovesnsframessshadows other_stacks fillStacksFILL_STACKS_AFTER_DROPsfillEmptyStackss leaveState(s_sns other_stacksframessshadowsgames old_statesfspysol.pys _dropPairMove;s ""  (s acceptsCardssmoveMoves _dropPairMove(spysol.pysMonteCarlo_RowStack;s s MonteCarlocs;;eZ;eeddZ=|djSdS(Nii3(scs_sss foundationsslenscards(s_scssspysol.pys isGameWon:=s   cs?=@=f|iiffSdS(N(s_sssreserves(s_seventspysol.pys getAutoStacks?=scsA=B=dSdS(NsDer letzte Monarch((s_spysol.pysgetDemoInfoTextA=scsC=D=d|ijo djnod|ijo djn o E=dSnF=|id}G=|i|i}H=|djoI=|d ddfjSnHJ=|djoK=|d d dfjSnM=|d d ddfjSdS(Nii3i ii (sstack1sidsstack2scolumnsdiff(s_sstack1sstack2scolumnsdiffspysol.pys isNeighbourC=sF (s createGames startGames isGameWonsNones getAutoStackssgetDemoInfoTexts isNeighbour(spysol.pysDerLetzteMonarch#=s     iYs Monte CarloiiiZs Simple Carloi[s Simple Pairsi\i`iisDer letzte Monarchs RoyalEastcsJ`=a=eZb=dZy=dZ=dZ=dZ=dZRS(Nc sb=c=t||if\}}d=|i|id|i|id|ie=t |_ f=xt ddf=r}g=ddfddfddfddff|\}}h=|id|d|id|id|d|idf\}}i=t||||ddd d}j=d|_k=|ii|qnWl=xt ddl=r}m=ddfddfddfddfddff|\}}n=|id|d|id|id|d|idf\}}o=t|||ddd d}p=d|_q=|ii|qPWr=|i|id |idf\}}s=t|||d d|_t=|i|id u=||i}v=t||||_w=|i|id x=|idS( Nf5.5iiiiismodi smax_moveis max_roundssss(sLayouts_ssslssetSizesXMsXSsYMsYSsNones base_cardsrangesisdxsdysxsysSS_FoundationStacksstacks CARD_YOFFSETs foundationssappends RK_RowStacksrowssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_slsssisdxsdysxsysstackspysol.pys createGameb=s0/  7I$  @I! *csy=z=|iiid |_{=x.|iid{=r}|=|ii|i_q/W}=|iii }~=|ii|i |i i }=|i|ii=|id|ii|dd=|i=|iii=|iiidS(Niisframes(s_ssstalonscardss base_cards foundationssrankscaps base_ranksgetCardscssuitsgameinfosdeckssto_stacksflipMovesmoveMovesstartDealSamplesdealRows dealCards(s_ssscsto_stackspysol.pys startGamey=s  " csT==|i|ii|_=x.|iid=r}=|ii|i _ q.WdS(Ni( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamessspysol.pys_restoreGameHook=s cs2==|iidt=|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_spspysol.pys _loadGameHook=scs==|i|iidS(N(spsdumps_s base_cardsid(s_spspysol.pys _saveGameHook=s(sCautiousDefaultHints Hint_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pys RoyalEast`=s     i]s Royal Easts TamOShantercs,==dZ=dZ=edZRS(Nc s==t||if\}}=|i|id|i|id|i=|i|if\}}=t |||dd|_ =|i |i d=xbtdd=rO}=|i|d|i|if\}}=|iit|||qW=xtdd=rr}=|i|d|i|i|if\}}=|iit|||ddd d=||i}qW=|idS( Niis max_roundsisssiismax_moves max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysDealRowTalonStackstalons createTextsrangesis foundationssappendsRK_FoundationStacksrowss BasicRowStacksdefaultStackGroups(s_slsssxsysispysol.pys createGame=s/ *# 1+cs'==|i=|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_spysol.pys startGame=s cs==ff|iifSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacks=s(s createGames startGamesNones getAutoStacks(spysol.pys TamOShanter=s  s AuldLangSynecs==dZ=dZRS(Ncs==|i|dSdS(Ncs=|idj|ifS(Ni(scsrankssuit(scspysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook=scsL==|iiid|iidd=|i=|iiidS(Nsrowssframesi(s_ssstalonsdealRows foundationssstartDealSample(s_spysol.pys startGame=s% (s _shuffleHooks startGame(spysol.pys AuldLangSyne=s sStrategy_Foundationcs==dZRS(NcsK==ti||| o =dSn=t|iiiidjSdS(Ni( sSS_FoundationStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscardsspysol.pys acceptsCards=s (s acceptsCards(spysol.pysStrategy_Foundation=ssStrategy_RowStackcsA==dZ=dZ=dZ=dZ=dZRS(NcsU==ti||| o =dSn=||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalonslen(s_s from_stackscardsspysol.pys acceptsCards=s cs;==|iiiio =dSn=ti||SdS(Ni(s_sgamessstalonscardss BasicRowStacks canMoveCards(s_scardsspysol.pys canMoveCards=s csW==|iiiio'=|iiiid|=dSn=ti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacks clickHandlersevent(s_seventspysol.pys clickHandler=s csW==|iiiio'=|iiiid|=dSn=ti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacksdoubleclickHandlersevent(s_seventspysol.pysdoubleclickHandler=s cs==|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage=s(s acceptsCardss canMoveCardss clickHandlersdoubleclickHandlersgetBottomImage(spysol.pysStrategy_RowStack=s     sStrategycs)==dZ=dZ=dZRS(Nc s==t||if\}}=|i|id|i|id|i=|i|if\}}=t ||||_ =|i |i d=xntdd=r[}=|i|d|i|if\}}=|iit|||d|ddqW=xtdd=rn}=|i||i|i|if\}}=|iit|||ddd d=||i}qW=|idS( Niisseiissuitsmax_moveis max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysOpenTalonStackstalons createTextsrangesis foundationssappendsStrategy_FoundationsrowssStrategy_RowStacksdefaultStackGroups(s_slsssxsysispysol.pys createGame=s/ */ -+cs==|i|dSdS(Ncs=|idj|ifS(Ni(scsrankssuit(scspysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHook=scsF==|i=|iiid|ii=|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss fillStack(s_spysol.pys startGame=s (s createGames _shuffleHooks startGame(spysol.pysStrategy=s  sInterregnum_Foundationcs==dZRS(Ncsv==ti||| o =dSn=t|idjo=|i|idjSn=||iii jSdS(Nii i( sRK_FoundationStacks acceptsCardss_s from_stackscardsslensidsgamesssrows(s_s from_stackscardsspysol.pys acceptsCards=s  (s acceptsCards(spysol.pysInterregnum_Foundation=ss Interregnumcsh==dZ=ddZ=dZ=edZ=dZ>dZ>dZ >d ZRS( Nic s$==t||if\}}=|i|itd||i|i d|i =t |_ =xdt dd=rQ}=|i||i|i f\}}=|iit|||ddqwW=xqt dd=r^}=|i||i|i |i f\}}=|iit|||ddddqW=xt |d=rr}=|id |d||id |i d |i f\}}=|iit|||dddd qXW=t|i|i|i|i ||_=|i|id =|idS( Ni iiis max_acceptsmodi smax_moveiisnn(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsNones base_cardssrangesisxsysreservessappends ReserveStacks foundationssInterregnum_Foundations RK_RowStacksDealRowTalonStackswidthsheightstalons createTextsdefaultStackGroups(s_srowsslsssisxsyspysol.pys createGame=s$8  &) -/ A/,ics==|i=g|_=xtdd=r}=|ii|iii=|i|i dd|ii |i _ =|i |ii=|id|ii|ii|q.W=|iiidS(Niiii (s_sstartDealSamples base_cardssrangesisappendssstalonsgetCardsranks foundationsscaps base_ranksflipMovesmoveMovesreservessdealRow(s_sispysol.pys startGame=s   +*cs==ff|iifSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacks=scs===|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch=scs>>tgd|_>xntdd>r[}>|ii|}>|i ||i|<>|i|i dd|i i |i _q(WdS(Niiii (sNones_s base_cardssrangesisgamesloadinfos base_card_idssidscardssranksss foundationsscaps base_rank(s_sgamesisidspysol.pys_restoreGameHook>s  cs[>>g}>x/tdd>r} >|i|iqW >|iid|dS(Niis base_card_ids( sidssrangesisappendspsloads_sloadinfosaddattr(s_spsidssispysol.pys _loadGameHook>s   cs6 > >x)|id >r} >|i|iqWdS(Ni(s_s base_cardsscspsdumpsid(s_spscspysol.pys _saveGameHook >s ( s GAME_VERSIONs createGames startGamesNones getAutoStackssshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pys Interregnum=s     is Tam O'Shanteri_sAuld Lang Syneii{sDoublets_Foundationcs>>dZRS(Ncs>>ti||| o >dSn>|ioC>d|id id|ii|dijo >dSnn>dSdS(Niii(sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsmod(s_s from_stackscardsspysol.pys acceptsCards>s   4(s acceptsCards(spysol.pysDoublets_Foundation>ssDoubletscsY>>eZ >dZ3>dZ>>dZC>dZG>dZP>edZRS(Ncs{ >!>t||if\}}">|i|id|i|id|i#>xddfddfddfddfddfddfddffd#>rt\}}$>|id|d|id|id|d|idf\}}%>|i it|||qW&>ddf\}}'>|id|d|id|id|d|idf\}}(>|iit|||t)>dddd *>d dd d +>|i|idd ,>|i|id|idf\}}->t|||dd|_.>|i|id />||i}0>t||||_1>|i|id 2>|idS(Nf5.5iiiiisdirsmodi smax_moves max_cardsi0sssis max_rounds(sLayouts_ssslssetSizesXMsXSsYMsYSsdxsdysxsysrowssappends ReserveStacks foundationssDoublets_FoundationsANY_SUITs createTextsWasteTalonStackstalons WasteStackswastesdefaultStackGroups(s_slsssdxsdysxsyspysol.pys createGame >s&/KI#I*cs3>4>ggf\}}5>xy|d5>rk}6>|i|7>|itjo8>|i|n/:>|i|;>t|djo<>Pnq%W=>|||SdS(Nii( skingsstopcardsscardsscsremovesranksKINGsappendslen(s_scardsskingsstopcardsscspysol.pys _shuffleHook3>s  csY>>?>|i@>|iiiA>|iiid|iiB>|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_spysol.pys startGame>>s csUC>D>|iiip |iiio E>dSnF>t|iididjSdS(Nii0(s_ssstalonscardsswasteslens foundations(s_spysol.pys isGameWonC>s# csG>H>||iijo|i oI>|i|i}J>|iiioK>|iii d|nGL>|ii i o0M>|ii i N>|iii d|nO>|i |ndS(Ni(sstacks_sssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_statespysol.pys fillStackG>s!csP>Q>ff|iifSdS(N(s_ssgs dropstacks(s_seventspysol.pys getAutoStacksP>s( sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWons fillStacksNones getAutoStacks(spysol.pysDoublets>s     iosSiebenBisAs_HintcsT>U>dZRS(Nc sU>V>|i}W>td|ii}X>xn|iidX>r[}Y>|i o Z>q<n[>t o/t |i djo|i d i pt \>|i d|i gf\}}}]>|i|iii\}}^>|oY_>dtf\} } `>|i| | |||\} } a>|i| |||| nb>xU|db>rH}c>|i||||o&d>d} e>|i| d||nqKWq<WdS(Ncs W>|i S(N(ssscards(ssspysol.pysW>siiiP(s_sgamesfiltersssrowssfreerowsssgs dropstackssrscardss __debug__slensface_upsAssertionErrorscspilesrpiles canDropCardss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHints shallMovePile( s_sgamesfreerowssrscspilesrpilestsncardssscorescolorspysol.pys computeHintsU>s$   9%! $   (s computeHints(spysol.pysSiebenBisAs_HintT>ssSiebenBisAs_Foundationcsf>g>dZRS(Ncsg>h>ti||| o i>dSnj>||iiij o k>dSnl>|iddjo m>dSnn>t |iii|ididjSdS(Nii i( sSS_FoundationStacks acceptsCardss_s from_stackscardssgamesssrowssidslen(s_s from_stackscardsspysol.pys acceptsCardsg>s   (s acceptsCards(spysol.pysSiebenBisAs_Foundationf>ssSiebenBisAs_RowStackcso>p>dZ|>dZRS(Ncscp>q>ti||| o r>dSns>|iddjot>|iii|id}u>|ioC|id i |di jo$|id i dd|di jo v>dSnnw>|idddjox>|iii|id}y>|ioC|id i |di jo$|id i dd|di jo z>dSnn{>dSdS(Nii ii ( s BasicRowStacks acceptsCardss_s from_stackscardssidsgamesssrowsssuitsrank(s_s from_stackscardsssspysol.pys acceptsCardsp>s SScs|>}>|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage|>s(s acceptsCardssgetBottomImage(spysol.pysSiebenBisAs_RowStacko>s s SiebenBisAscs&~>>eZ>dZ>dZRS(Ncs>>t||if\}}>|i|id|i|id|i>xt dd>r}>xyt dd>rf}>|i||i|i|d|if\}}>|iit|||ddddq}WqbW>xht dd>rU}>|i|d |i|if\}}>|iit|||ddqW>xt d d>ro}>|i|d|i|id |if\}}>|iit||||d d d d ddqnW>t|i|i|i||_>|idS(Ni iiiis max_accepts max_cardsiis base_rankismodi smax_move(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsSiebenBisAs_RowStacksreservess ReserveStacks foundationssSiebenBisAs_FoundationsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_slsssisjsxsyspysol.pys createGame>s$/  53 *) 58%cs>>|i>|iii>|iiid|ii>td|ii}>x>|d>r1}>|i d||ii |i d i qiWdS(Nsrowscs>|id idjS(Nii(srscardssrank(srspysol.pys>sii(s_sstartDealSamplessstalonsdealRowsreservessfiltersrowssstackssrsmoveMoves foundationsscardsssuit(s_sstackssrspysol.pys startGame>s  (sSiebenBisAs_Hints Hint_Classs createGames startGame(spysol.pys SiebenBisAs~>s  s Maze_RowStackcs)>>dZ>eiZ>dZRS(Ncsq>>ti||| o >dSn>|iii|idd}>|io>|id i |di jo |id i d|di jo >dSn>|id i t jo|di t jo >dSnn>|iii|idd}>|ioT>|id i |di jo |id i d|di jo >dSnn>dSdS(Niii6( s BasicRowStacks acceptsCardss_s from_stackscardssgamesssrowssidssuitsranksQUEENsACE(s_s from_stackscardsssspysol.pys acceptsCards>s ! E /! Ecs>>|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage>s(s acceptsCardssStacksprepareInvisibleBottoms prepareBottomsgetBottomImage(spysol.pys Maze_RowStack>s  sMazecs;>>dZ>eZ>dZ>dZ>dZRS(Nic sP>>t|dddd|if\}}>|i|id|i|id|i>xt dd>r}>xut dd>rb}>|i||i|i||if\}}>|iit|||ddd dqWqnW>t|i|id|i|i||_>|iit|>|idS( NsXMisYMi iis max_acceptis max_cards(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends Maze_RowStacksInitialDealTalonStackswidthsheightstalons internalssInvisibleStacksdefaultStackGroups(s_slsssisjsxsyspysol.pys createGame>s*/  130cs->>d}>xtdd>r}>|djo >qn>|iiid }>|it jo)>|iii d|ii ddne>|djo |djo>|i >d }n>|iii d|ii |fd|qW>to#t|iiidjptdS(Nii6i4isrowssframesi$(sframessrangesis_ssstalonscardsscsranksKINGsdealRows internalssstartDealSamplesrowss __debug__slensAssertionError(s_sframessiscspysol.pys startGame>s   ) 0cs>>td|ii}>t|djo >dSn>d}>doH>x1>||id itjo>|d}qXW>||}n>x|d|d|d|dfd>r}>||}>||d}>|i |i d djo >dSn>|id itjp|id it jo >dSn>t|||d!}>| pt|d d o >dSnqW>dSdS( Ncs >|iS(N(ssscards(ssspysol.pys>si0iii ii$i i6sdir(sfilters_sssrowsslensiscardssranksACEsjsr1sr2sidsQUEENsgetPileFromStacksspilesisSameSuitSequence(s_srowssisjsr1sr2spilespysol.pys isGameWon>s*   (   3 (s GAME_VERSIONsSiebenBisAs_Hints Hint_Classs createGames startGames isGameWon(spysol.pysMaze>s    ivs Sieben bis AsisDieBoeseSieben_Taloncs >>dZ>ddZRS(Ncs*>>t|ip|i|ijSdS(N(slens_scardssrounds max_rounds(s_spysol.pys canDealCards>scs>>|io>ti|d|Sn>|it|if\}}>x|ii d>rp}>xd>|ioV>|d}>|id i o>|i |n>|i d||ddqlWq]W>tot|i|jpt>|o>|in>|i|>|i|>t|ii }>||d@}>xU>|ioG>t|i|jo >d}n>|id|>| }qbW>|o>|in>|SdS(Nssoundiisframessflip(s_scardssDieKoenigsbergerin_Talons dealCardsssoundsgameslens num_cardssssrowssrsface_upsflipMovesmoveMoves __debug__sAssertionErrorsstartDealSamplesshuffleStackMoves nextRoundMovesnsflipsdealRows stopSamples(s_ssoundsgames num_cardssrsnsflipspysol.pys dealCards>s6 !   %'    i(s canDealCardss dealCards(spysol.pysDieBoeseSieben_Talon>s sDieBoeseSiebencs >>ddZ?dZRS(Nc s>>t||if\}}>|i|itd||i|i d|i >xkt dd>rX}>|i||i|i f\}}>|iit||||dddqkW?xut |d?rb}?|id|d||id|i |i f\}}?|iit|||qW?t|i|i|i |dd|_?|i|id?|idS(Niiiismax_moves max_roundssse(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsrangesisxsys foundationssappendsDieRussische_Foundations AC_RowStacksDieBoeseSieben_Talonsheightstalons createTextsdefaultStackGroups(s_srowsslsssisxsyspysol.pys createGame>s8 &0 =#+ics[??|i?xAdddddddfd?r} ?|iiid|q1WdS(Niisflip(s_sstartDealSamplesflipssstalonsdealRow(s_sflipspysol.pys startGame?s ! (s createGames startGame(spysol.pysDieBoeseSieben>s ixsDie bse Siebens Terrace_Taloncs ??dZRS(Ncs;??|iidjo ?dSn?ti|SdS(Ni(s_sgamesgetStatesWasteTalonStacks canDealCards(s_spysol.pys canDealCards?s (s canDealCards(spysol.pys Terrace_Talon ?ssTerrace_AC_Foundationcs??dZ?dZRS(Nc sK??t|dddddd?tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysAC_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__?scs??|iidjor?t|djp |di o ?dSn?|di|iijo ?dSn?||ii i jSn?t i |||SdS(Nii(s_sgamesgetStateslenscardssface_upssuitscaps base_suits from_stacksssrowssAC_FoundationStacks acceptsCards(s_s from_stackscardsspysol.pys acceptsCards?s%  (s__init__s acceptsCards(spysol.pysTerrace_AC_Foundation?s sTerrace_SS_Foundationcs??dZ"?dZRS(Nc sK? ?t|dddddd!?tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__?scs"?#?|iidjor$?t|djp |di o %?dSn&?|di|iijo '?dSn(?||ii i jSn)?t i |||SdS(Nii(s_sgamesgetStateslenscardssface_upssuitscaps base_suits from_stacksssrowssSS_FoundationStacks acceptsCards(s_s from_stackscardsspysol.pys acceptsCards"?s%  (s__init__s acceptsCards(spysol.pysTerrace_SS_Foundation?s sTerrace_RowStackcs=*?+?dZ.?dZ4?d d dZB?dZRS(Nc sB+?,?t|dddd-?tti||||f|dS(Nsmodi smax_movei( s kwdefaultscapsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__+?scse.?/?|iidjo 0?dSn1?||iiijo 2?dSn3?ti|||SdS(Ni( s_sgamesgetStates from_stacksssreservess AC_RowStacks acceptsCardsscards(s_s from_stackscardsspysol.pys acceptsCards.?s   csv4?5?|ii}6?|djo-7?ti|||d|d|8?dSn9?t o||ii i jpt :?t o|djpt ;?t o|ii ii pt ?|idi|i_qW??td|ii i}@?|ii iid|ddA?|ii iidS(Nisframessshadowics ??|i S(N(ssscards(ssspysol.pys??ssrowsssound(s_sgamesgetStatesstates AC_RowStacksmoveMovesncardssto_stacksframessshadows __debug__sss foundationssAssertionErrorswastescardssrankscaps base_ranksfiltersrowssfreerowsstalonsdealRows dealCards(s_sncardssto_stacksframessshadowsstatesssfreerowsspysol.pysmoveMove4?s" '%% "icsB?C?|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImageB?s(s__init__s acceptsCardssmoveMovesgetBottomImage(spysol.pysTerrace_RowStack*?s  sTerracecsD?E?eZF?eZG?eZH?eZI?dZJ?ddddZ e?dZ j?dZ o?dZ w?dZ z?d Z|?d ZRS( Ni c sJ?K?t|dd|if\}}L?t|d}M?|d|id|||idf\}}N?td|i d|i } O?|i |i||i|i|id|i | P?t|_Q?|i||if\} } R?t| | |d|d ||_S?|i|id T?| |i} U?t| | ||_V?|i|id d d W?| d|i} X?|i| | |} Y?|i| _Z?|i| d [?|ii | \?|i|| |i f\} } ]?xUt!dd]?rB} ^?|i#i |i$| | |d| d_?| |i} qW`?|i|| |i f\} } a?xKt!|da?r8} b?|ii |i%| | |c?| |i} qWd?|i&dS(NsXOFFSETii iiiis max_roundssnum_dealsswsses text_formats%Dissuit('sLayouts_ssslsmaxsrowssmaxrowssXSsw1sw2sYSsYOFFSETshssetSizesXMsYMsNones base_cardsxsys Terrace_Talons max_roundssnum_dealstalons createTexts WasteStackswastesReserveStack_ClasssstacksXOFFSETs CARD_XOFFSETsreservessappendsrangesis foundationssFoundation_ClasssRowStack_ClasssdefaultStackGroups(s_srowss max_roundssnum_dealslsssmaxrowssw1sw2shsxsysstacksispysol.pys createGameJ?s8$3 : $# ,# "i icsEe?f?x1|iidf?r}g?|io h?dSnqWi?dSdS(Nii(s_sss foundationsscards(s_ssspysol.pysgetStatee?s   csxj?k?|il?x;t|idl?r%}m?|iiid|iiq%Wn?|iiid|ii d dS(Nisrowsi( s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessrows(s_sispysol.pys startGamej?s   #cso?p?|i oq?|i|i}r?||iijo |iiios?|iii nDt?||ii jo |iiiou?|iii d|nv?|i |ndS(Ni( sstackscardss_s enterStatesS_FILLs old_statessswastestalons dealCardssrowssmoveMoves leaveState(s_sstacks old_statespysol.pys fillStacko?s&&cs;w?x?x.|iidx?r}y?|ii|i_qWdS(Ni(s_sss foundationssgamesloadinfos base_rankscap(s_sgamessspysol.pys_restoreGameHookw?s cs#z?{?|iid|idS(Ns base_rank(s_sloadinfosaddattrspsload(s_spspysol.pys _loadGameHookz?scsg|?}?t}~?xA|iid~?r.}?|io?|idi}?PnqW?|i|dS(Ni( sNO_RANKs base_ranks_sss foundationsscardssrankspsdump(s_sps base_rankssspysol.pys _saveGameHook|?s    (sTerrace_AC_FoundationsFoundation_ClasssTerrace_RowStacksRowStack_Classs OpenStacksReserveStack_ClasssCautiousDefaultHints Hint_ClasssINITIAL_RESERVE_CARDSs createGamesgetStates startGames fillStacks_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pysTerraceD?s          sGeneralsPatiencecs??eZ?dZRS(Ni (sTerrace_SS_FoundationsFoundation_ClasssINITIAL_RESERVE_CARDS(spysol.pysGeneralsPatience?s sBlondesAndBrunettescs&??dZ?dZ?dZRS(Ni cs??|i?x;t|id?r%}?|iiid|iiq%W?|iii?|iii }?x+|ii d?r}?|i |i _qW?|iiid|ii d|if?|iiidS(Nisrowsi(s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessgetCardscs foundationssrankscaps base_rankssuits dealCards(s_siscssspysol.pys startGame?s  # -cs??dSdS(Ni((s_spysol.pysgetState?s(sINITIAL_RESERVE_CARDSs startGamesgetState(spysol.pysBlondesAndBrunettes?s  s FallingStarcs??dZRS(Ni (sINITIAL_RESERVE_CARDS(spysol.pys FallingStar?sisQueen of ItalyisGeneral's PatienceisBlondes and Brunettesis Falling StarsPokerSquare_RowStackcs??dZ?eZRS(NcsO??|i o'?|iiiid|?dSn?ti||SdS(Ni( s_scardssgamessstalons playMoveMoves ReserveStacks clickHandlersevent(s_seventspysol.pys clickHandler?s (s clickHandlersrightclickHandler(spysol.pysPokerSquare_RowStack?s s PokerSquarecs??eZ?eeddZ?eZ?dZ?dZ?dZ ?dZ ?edZ ?dZ ?d Z @d ZRS( Nsmax_moveiidcs??t||if\}}?d}?|i|id|if\}}?|i djoC?t |i ||dd?dddd }?|i}?|dd }?|d |d}?|d|ijo4?d }?|id |i ?||i}n?t |i ||dd?dd}?|idd }?t |i ||dd?dddd|i_?|iiidd}n?td|i|} ?|i|i| d|id|id|id?xtdd ?r|} ?xptdd ?r]} ?|i| | |i|i| |if\}}?|ii|i|||q'Wq W?|i|if\}}?|i||||_?|i |id|?|i!it"|?|i djoc?|ii#dg?xdddddfd ?ri} ?|i$|i| dd \} } }}?t |i | d| d|}?|ii(i|q;W?x{tddd ?re} ?|i$|i| dd\} } }}?t |i | | d|}?|ii(i|qW?t |i |id|i?dddt)d |i_*n?|i}?|d d!|dd!!|d!d"!|d"d!|dd!|d |d d|d d!|d d"|d df|d|dd|dd!|dd"|ddf|d|dd|dd!|dd"|ddf|d |d d|d d!|d d"|d df|d|dd|dd!|dd"|ddfg |_,?t-t.|i,|_,?|i/?|SdS(#Nsssiisanchorsnwstexts*Royal Flush Straight Flush Four of a Kind sFull House Flush Straight s!Three of a Kind Two Pair One Pairiiseis100 75 50 25 20 15 10 5 2s0 is0i ii2ishandsii iiiiisswsfonts canvas_largei i(0sLayouts_ssslstasXMsYMsYSsxsyspreviews MfxCanvasTextscanvasstsbboxsbbshsmovestextssmiscsmaxsXSswssetSizesrangesisjsrowssappendsRowStack_Classs Talon_Classstalons createTexts internalssInvisibleStacksaddattrs getTextAttrstxstystfshandssgetFontsscoresrs poker_handssmapstuplesdefaultStackGroups(s_slssstasxsystsbbshswsisjstxstystfsrspysol.pys createGame?sf & !;  5* +" +% M csF??|id|ii|iiddd?|iiidS(Niisframes(s_smoveMovessstalons internalss fillStack(s_spysol.pys startGame?s,cs9??t|iiidjo|i|ijSdS(Ni(slens_ssstalonscardss getGameScores WIN_SCORE(s_spysol.pys isGameWon?scs??ffffSdS(N((s_seventspysol.pys getAutoStacks?scs??|idjo ?dSn?d}?dgd}?xtdd?r}?|i|i|\}}?d|jo djno?||d||@d|iiii_ndS(Ns%D( s PokerSquares createGames_slssstalonstextssncardss text_format(s_slspysol.pys createGame;@scsS?@@@|id|ii|iidddA@|iB@|iiidS(Niisframes(s_smoveMovessstalons internalssstartDealSamplesdealRow(s_spysol.pys startGame?@s, csC@D@dSdS(Ni((s_spysol.pys checkForWinC@s( sInitialDealTalonStacks Talon_Classs StackWrappersPokerShuffle_RowStacksRowStack_Classs WIN_SCOREs createGames startGames checkForWin(spysol.pys PokerShuffle7@s     is Poker Squareis Poker ShufflesDerKatzenschwanzcsPK@L@eedeZM@dddZm@dZu@dZx@dZRS(Ns base_rankc sM@N@t|dd|if\}}O@t||}P@|i|i |d|i |i d|i Q@d|i |i }R@ggf\}}S@x<t|dS@r)} T@|idU@|i|i qWV@x@td|dV@r)} W@|i|iX@|idqWY@|i |||i d|i f\} } Z@xHt|dZ@r5} [@|iit| | |\@| |i } q`W]@|i |||i d|i |i f\} } ^@|i|id d d | |i df_@xlt|d_@rY} `@|i| | |} a@|| _b@|| _c@|ii| d@| |i } qWe@|i ||i |i f\} } f@xxtddf@re} g@xItddg@r6} h@|iit| | |i | |d | qWi@| |i } qWj@|i|ii| |i dd d | fd d k@t!|i"d |i d|i#|i ||_$l@|i%dS(NsXOFFSETi iiiiihii?Bssuitspriorityii(&sLayouts_ssslsmaxsrowssreservessmaxrowsssetSizesXMsXSsYMsYSsYOFFSETs playcardssxoffsetsyoffsetsrangesisappendsXOFFSETsxsys ReserveStacks setRegionsRowStack_Classsstacks CARD_XOFFSETs CARD_YOFFSETssuits foundationssSS_FoundationStacksCWsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups(s_srowssreservesslsssmaxrowss playcardssxoffsetsyoffsetsisxsysstackssuitspysol.pys createGameM@sJ$3  . 5/   &  474i icsm@n@|io@d}p@xp@|iiio}q@|iiid itjo,r@|ii|ios@|d}nnt@|iii d|ii|gddqWdS(Niisrowssframesi( s_sstartDealSamplesissstalonscardssranksKINGsrowssdealRow(s_sispysol.pys startGamem@s  !csHu@v@|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchu@sc sx@y@tdf\}}z@x|dz@r}{@|io ||j o7|@|id i|d|id i |d}n$~@|i|d|i |d}@||jo@||f\}}nq$W@|SdS(Niɚ;iii( sNonesclosestscdistsstackssstackscardss dragstacksxscxsyscysdist( s_scxscysstackss dragstacksclosestscdistsstacksdistspysol.pys_getClosestStackx@s 7#(s StackWrappers AC_RowStacksNO_RANKsRowStack_Classs createGames startGamesshallHighlightMatchs_getClosestStack(spysol.pysDerKatzenschwanzK@s   s DieSchlangecs;@@eedeZ@eZ@dZ@dZRS(Ns base_rankcs#@@ti|dddddS(Nsrowsi sreservesi(sDerKatzenschwanzs createGames_(s_spysol.pys createGame@scs@@|i@d}@x@|iiio@|iiid }@|itjoM@|ii |i d}@|io"@|ii |i dd}nnL@|it jo|ii |io@|d}n@|ii |}@|iiid|fddqWdS(Niiisrowssframesi(s_sstartDealSamplesissstalonscardsscsranksACEs foundationsssuitsto_stacksKINGsrowssdealRow(s_siscsto_stackspysol.pys startGame@s   &'(s StackWrappersFreeCell_AC_RowStacksNO_RANKsRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGame(spysol.pys DieSchlange@s  isDer Katzenschwanzis Die SchlangesNapoleon_Taloncs@@RS(N((spysol.pysNapoleon_Talon@ssNapoleon_Foundationcs@@RS(N((spysol.pysNapoleon_Foundation@ssNapoleon_RowStackcs)@@dZ@dZ@dZRS(Nc sH@@t|dddddd@tti||||f|dS(Nsmodi smax_moveis max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__@scs@@ti||| o @dSn@|i o @dSn@|id |df\}}@|i|ijo @dSn@|i|id|i i jp|i|id|i i jSdS(Nii( s OpenStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc1sc2spysol.pys acceptsCards@s  ! cs@@|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImage@s(s__init__s acceptsCardssgetBottomImage(spysol.pysNapoleon_RowStack@s  sNapoleon_ReserveStackcs@@dZRS(Nc sB@@t|dddd@tti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescapspysol.pys__init__@s(s__init__(spysol.pysNapoleon_ReserveStack@ssNapoleon_SingleFreeCellcs@@dZ@dZRS(Ncs@@ti|||SdS(N(s ReserveStacks acceptsCardss_s from_stackscards(s_s from_stackscardsspysol.pys acceptsCards@scsV@@|iiidio|iiidio @dSn@ti||SdS(Nii i(s_sgamesssrowsscardss ReserveStacks canMoveCards(s_scardsspysol.pys canMoveCards@s1 (s acceptsCardss canMoveCards(spysol.pysNapoleon_SingleFreeCell@s sNapoleon_FreeCellcs@@dZRS(NcsF@@|iii|idio @dSn@ti||SdS(Nii(s_sgamesssrowssidscardss ReserveStacks canMoveCards(s_scardsspysol.pys canMoveCards@s! (s canMoveCards(spysol.pysNapoleon_FreeCell@ssDerKleineNapoleoncsD@@ddZ@dZ@dZ@dZ@dZRS(Nc s@@t||if\}}@|i|iddd|id|i|id|id|i@|idd|i}@||i|i}@||i|i}@|i}@xgt dd@rT}@|iit|||@|iit|||@||i}qW@|i|i}@|djoa@|iit|||@|iit|||@|iit|||n@|iit||i||@|iit||i||@|iit|||@|iit|||@||if\} }@xKt dd@r8}@|iit| |||@||i}qhW@|djo@|i|i}n@|i|i}@t| |||_@x|id@rq} @| id@djo'@d|i gdd g| _n"@d|igddg| _@d| _qW@|i dS( Niii iiiii (!sLayouts_ssslssetSizesXMsXSsYMsYSsx0sx1sx2sysrangesisrowssappendsNapoleon_RowStacksheightsreservessNapoleon_ReserveStacksNapoleon_SingleFreeCellsNapoleon_FreeCellsxs foundationssNapoleon_FoundationsNapoleon_Talonstalonsrsids CARD_XOFFSETs CARD_YOFFSETsdefaultStackGroups( s_sreservesslsssx0sx1sx2sysisxsrspysol.pys createGame@sHM  #&& " '!ics1@@|d i}@|i||dSdS(Nics@|i|j|ifS(N(scsrankssuit(scsrankspysol.pys@s(scardssranks_s_shuffleHookMoveToBottom(s_scardssrankspysol.pys _shuffleHook@scs@@xBtdd@r/}@|iiid|iid ddqW@|i@|iiid|iid @x<tdd@r)}@|iiid|iidqW@|iiidddS(Niisrowsisframessncards( srangesis_ssstalonsdealRowsrowssstartDealSamples dealBaseCards(s_sispysol.pys startGame@s - # 'csP@@|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch@scs@@|idjp |ii o @dSn@d}@|iid}@|iom@t |idi }@|i }@|djo@|d}n#@|d jo@|d}nn@|iii d|dS(Nisis Ascendings Descendingstext(s_spreviewstextssinfostsss foundationssfscardssRANKSsranksgetFoundationDirsdirsconfig(s_stsfsdirspysol.pys updateText@s!   (s createGames _shuffleHooks startGamesshallHighlightMatchs updateText(spysol.pysDerKleineNapoleon@s %   sDerFreieNapoleoncs@@ddZRS(NcsU@@t||if\}}A|idddd|i}A|it|d|i}A|i |i d|i d|i |i |A|i d|i d|i }A|i |i}AxOtddAr<}A|i ||i }A|iit|||qWAxLtddAr9} A|||i } A|iit|||q3W A|i|id ||i dd d f A|i } A|djo.A|iit||i d||nFA|iit|||A|iit||i ||A|i d|i }AxKtd dAr8} A|iit|||| A||i }qYWA|i|id d \} } } } At"d d |i#}At%|i&| |i | d| d||i'_(A|i |i)|if\}}At*||||_+A|i,dS(Niiiii iiii?Bisses canvas_cardscardwsanchorsfont(-sLayouts_ssslsCHsYOFFSETshsYSsmaxssetSizesXMsXSsYMsx1sysrangesjsxsrowssappendsNapoleon_RowStacksNapoleon_ReserveStacks setRegionsreservessNapoleon_SingleFreeCellsNapoleon_FreeCellsis foundationssNapoleon_Foundations getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosheightsNapoleon_TalonstalonsdefaultStackGroups(s_sreservesslssshsx1sysjsxsistxstystastfsfontspysol.pys createGame@s># 3" # #. .& ")1"i(s createGame(spysol.pysDerFreieNapoleon@ssNapoleoncsAAdZRS(NcsAAti|dddS(Nsreservesi(sDerKleineNapoleons createGames_(s_spysol.pys createGameAs(s createGame(spysol.pysNapoleonAss FreeNapoleoncsA AdZRS(Ncs A!Ati|dddS(Nsreservesi(sDerFreieNapoleons createGames_(s_spysol.pys createGame As(s createGame(spysol.pys FreeNapoleonAsisDer kleine NapoleonisDer freie Napoleoniis Free NapoleonsLarasGame_Hintcs*A+ARS(N((spysol.pysLarasGame_Hint*AssLarasGame_TaloncsC,A-Aeddd dZ6Addd dZOAddZRS(Ncs-A.A|tjo.A|iii}n/A|ii|ii}0A|i||||}1At |idjoT2A|iid||iiid|3A|iid||iiid|n4A|ii|5A|dSdS(Niisframes(srowssNones_sgamesss enterStatesS_DEALs old_states dealToStackssflipsreversesframesstempslenscardssmoveMoveswastes leaveState(s_srowssflipsreversesframess old_statestempspysol.pysdealRow-As(,iics6A7At|idjo 8AdSn9AxI|d9Ar<}:At|idjo ;AdSnA|o?A|i i |n@A|i i d||d|AA|ii|ijoPBAt|idjo CAdSnDA|i i d||i iid|nEA|iitjoxFAt|idjo GAdSnHA|i i d||i iid|IA|i i d||i iid|nJA|iitjp)|iitjp|iitjoPKAt|idjo LAdSnMA|i i d||i iid|nq3WNAt|SdS(Niisframesi(slens_scardssstackssrs __debug__sgetCardsface_upsAssertionErrorsflipsgamesflipMovesmoveMovesframessranksidssswastesACEsJACKsQUEENsKING(s_sstackssflipsreversesframessrspysol.pys dealToStacks6As2   "  , (,E 0c s%OAPAd}QA|iii}RA|ioSA|ii}TAxt |ii dTAru}UAt |iii |idjoIVA|iid|iii ||iii|iiddddnqUWWA|ii|XA|iid||iii dddddYAt |iii|id}ZAxvt t |iii|idZArM}[A|iid|iii||iii ||dddddqaW\A||i_nS]A|io|i|ijo2^At |i}_A|ii||ddn`A|SdS(Niisframesisshadows update_flags(s num_cardss_sgamessswastescardssgetCardsranks curr_ranksranges NUMRESERVESsislensreservessmoveMovesrowssold_ranksflipMoves res_beginsrounds max_roundss turnStackMove(s_ssounds num_cardsswastes curr_ranksis res_beginspysol.pys dealCardsOAs&   &M2#( K  (sNonesdealRows dealToStackss dealCards(spysol.pysLarasGame_Talon,As sLarasGame_RowStackcsaAbAdZRS(Nc s5bAcAtti||||f|dAd|_dS(Ni( sapplys OpenStacks__init__s_sxsysgamescaps CARD_YOFFSET(s_sxsysgamescapspysol.pys__init__bAs"(s__init__(spysol.pysLarasGame_RowStackaAssLarasGame_ReserveStackcseAfARS(N((spysol.pysLarasGame_ReserveStackeAss LarasGamecsgAhAeZiAdZjAdZAdZAdZAdZAddZAdZAd Z Add Z Ad Z Ad Z Ad Z RS(Nic sjAkAt|dd|if\}}lA|i|i|i|id|id|i mAd|_ nA|i|i}oA|i|i }pAxt ddpAr}qA|iit|||ddrA||i}sA|d jp |d jo'tA|i|i}uA||i }nqWvA|i}wA|i}xAxXt d dxArE}yA|iit||||d d d tzA||i }qQW{A|i|i|i}|A|i}}AxKt d d}Ar8}~A|iit||||A||i}qWAxt ddAr}A|i|id ||i f\}}AxOt |iddAr5}A|iit|||A||i}qrWq&WA|id |i}A|id|i }At|||dd|_A|i|idA||i}At||||_A|i|i|i_A|ig|ig|i_A|i|i|ig|i_dS(NsXOFFSETi iiii smax_moveiii sdirs base_rankiis max_roundssse( sLayouts_ssslssetSizesXMs NUMRESERVESsXSsYMsYSsold_ranksxsysrangesisrowssappendsLarasGame_RowStacks foundationssSS_FoundationStacksKINGsreservessLarasGame_ReserveStacksLarasGame_Talonstalons createTexts WasteStackswastessgs openstackss talonstackss dropstacks(s_slsssxsysispysol.pys createGamejAsP$6  %   /  " * csAAd}AxxtddAre}A|iii oAPnA|djoA|iAd}nA|iiid|qWA|i t |ii i|ii |iidddS(Niiisframes( sframessrangesis_ssstalonscardssstartDealSamplesdealRowsmoveMoveslenswaste(s_sframessispysol.pys startGameAs    csHAA|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchAscsAAfSdS(N((s_spysol.pysgetHighlightPilesStacksAscsAAdSdS(Ni((s_ssoundspysol.pys _autoDealAsicsAAdSdS(Ni((s_spysol.pyscanUndoAscsAAdSdS(Ni((s_spysol.pys canSaveGameAscsAA|idS(N(s_snotYetImplemented(s_sfilenamesbinmodespysol.pyssaveGameAscsAA|ii|_dS(N(sgamesloadinfosold_ranks_(s_sgamespysol.pys_restoreGameHookAscs2AA|iiddA|i|i_dS(Nsold_ranki(s_sloadinfosaddattrspsloadsold_rank(s_spspysol.pys _loadGameHookAscsAA|i|idS(N(spsdumps_sold_rank(s_spspysol.pys _saveGameHookAs(sLarasGame_Hints Hint_Classs NUMRESERVESs createGames startGamesshallHighlightMatchsgetHighlightPilesStackss _autoDealscanUndos canSaveGamessaveGames_restoreGameHooks _loadGameHooks _saveGameHook(spysol.pys LarasGamegAs   $      i%s Lara's GamesSanibelcsqAAeiZAeeddZAeeddZAeZ Ae Z AdZ AdZ AdZRS(Ns max_roundsismax_moveics)AAti|dddddddS(Nsrowsi swasteis playcardsi(sGypsys createGames_(s_spysol.pys createGameAscsAAx8tddAr%}A|iiiddddqWAx2tddAr}A|iiiddqSWA|iA|iiiA|iiidS(Niisflipsframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_sispysol.pys startGameAs #  csAAfSdS(N((s_spysol.pysgetHighlightPilesStacksAs(sLayoutsklondikeLayouts Layout_Methods StackWrappersWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssYukon_AC_RowStacksRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStacks(spysol.pysSanibelAs     isFlower_FoundationStackcs)AAdZAdZAdZRS(Nc sKAAt|dddddtAtti|||||f|dS(Ns max_cardsi smax_moveis base_rank( s kwdefaultscapsANY_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__AscsAAxtt|ddAr}A||i||dijo AdSnA||idjoHA||i||dif\}}A|djo Ad}nn(A|i ||||d\}}A|d|jo AdSnqWAt |SdS(Niii i( srangeslensssisrankssuitsasbs_sswapTrashCardss cardsFaceUp(s_sssisasbspysol.pysisOonsooSequenceAs " ''csAA|i|if\}}A|djo |djp|djo |djoAddf\}}nEA|djo |djp|djo |djo Ad}nA||fSdS(Niiii(scardassuitscardbsasb(s_scardascardbsasbspysol.pysswapTrashCardsAs 77 (s__init__sisOonsooSequencesswapTrashCards(spysol.pysFlower_FoundationStackAs  sFlowerClock_FoundationcsAAdZRS(NcsAA|i|| o AdSnA|i}A| oA|didjSnA|di|d ij o AdSnA|di}A|d i}A|djo Ad}nA|d|jSdS(Niii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksisj(s_s from_stackscardss stackcardssisjspysol.pys acceptsCardsAs      (s acceptsCards(spysol.pysFlowerClock_FoundationAssGaji_FoundationcsAAdZAdZRS(Nc sDAAtti|||||f|A|ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscapspysol.pys__init__As%csuAA|i|| o AdSnA|i}A|d i|dijo!|d idd|dijSdS(Niii (s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcardsspysol.pys acceptsCardsAs  (s__init__s acceptsCards(spysol.pysGaji_FoundationAs sPagoda_FoundationcsAAdZRS(NcsXAA|i|| o AdSnA|i}A| o/A|didjo|di|ijSnA|di|d ij o AdSnA|di}A|d i}A|djo Ad}nAt |djoB||djSnVBt |djo2B|djo Bd}nB||djSnB||jSdS(Niii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsisjslen(s_s from_stackscardss stackcardssisjspysol.pys acceptsCardsAs$   /    (s acceptsCards(spysol.pysPagoda_FoundationAssSamuri_Foundationcs)BBdZ BdZBdZRS(Nc sEB Btti|||||f| B|ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscapspysol.pys__init__Bs%cs B B|i|| o  BdSnB|i}B| o/B|didjo|di|ijSnB|d i}B|djo Bd}nB|di|d ijo|di|djSdS(Niii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsi(s_s from_stackscardss stackcardssispysol.pys acceptsCards Bs   / csBB|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_spysol.pysgetBottomImageBs(s__init__s acceptsCardssgetBottomImage(spysol.pysSamuri_FoundationBs  sMatsuKiri_Foundationcs)BBdZBdZ%BdZRS(Nc sgBBt|ddddddBtti|||||f|B|ii i i d|_ dS(Ns max_cardsi0s min_acceptis max_accepti (s kwdefaultscapsapplysAbstractFoundationStacks__init__s_sxsysgamessuitsappsimagessCARDHs CARD_YOFFSET(s_sxsysgamessuitscapspysol.pys__init__Bs%csBB|i|| o BdSnB|i} B|i| o !BdSn"B| o,#B|didjo|didjSn$B|d id|dijSdS(Nii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcardsspysol.pys acceptsCardsBs    ,cs %B&B|iiiidSdS(Ni(s_sgamesappsimagess getLetter(s_spysol.pysgetBottomImage%Bs(s__init__s acceptsCardssgetBottomImage(spysol.pysMatsuKiri_FoundationBs  sGreatWall_Foundationcs'B(BdZ,BdZRS(Nc sW(B)Bt|dddddd*Btti|||||f|+Bd|_ dS(Ns max_cardsi$s min_accepti s max_accepti( s kwdefaultscapsapplysFlower_FoundationStacks__init__s_sxsysgamessuits CARD_YOFFSET(s_sxsysgamessuitscapspysol.pys__init__(Bs%cs,B-B|i|| o .BdSn/B|i}0B|didjo 1BdSn2BxFtdd2Br3}3B||i|i ddjo 4BdSnqeW5Bt |ddSdS(Nii iisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssranksrangesissuitsidsisRankSequence(s_s from_stackscardss stackcardssispysol.pys acceptsCards,Bs    "(s__init__s acceptsCards(spysol.pysGreatWall_Foundation'Bs sGreatWall_BuildStackcs6B7BdZ;BdZRS(Nc sa7B8Bt|dddd9Btti|||||f|:B|ii i i d|_ dS(Ns max_cardsi smax_movei (s kwdefaultscapsapplysFlower_FoundationStacks__init__s_sxsysgamessuitsappsimagessCARDHs CARD_YOFFSET(s_sxsysgamessuitscapspysol.pys__init__7Bs%cs;BB|i}?B|o2@B|di|d idjo ABdSnn#BB|didjo CBdSnDBx<|dDBr/}EB|i|iddjo FBdSnqWGBt |ddSdS(Niiisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssrankscssuitsidsisRankSequence(s_s from_stackscardss stackcardsscspysol.pys acceptsCards;Bs   #  (s__init__s acceptsCards(spysol.pysGreatWall_BuildStack6Bs sFourWinds_FoundationcsHBIBdZRS(NcsIBJB|i|| o KBdSnLB|i}MB|di|ijo NBdSnOB| oPB|didjSn!RB|d id|dijSdS(Nii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsrank(s_s from_stackscardss stackcardsspysol.pys acceptsCardsIBs    (s acceptsCards(spysol.pysFourWinds_FoundationHBssFlower_OpenStackcs)SBTBdZXBdZeBdZRS(Nc sNTBUBt|ddddVBtti||||f|WB||_ dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscapspysol.pys__init__TBs"cs XBYBxtt|ddYBr}ZB||i||dijo [BdSn\B||idjoH]B||i||dif\}}^B|djo _Bd}nn(aB|i ||||d\}}bB|d|jo cBdSnqWdBdSdS(Niii i( srangeslensssisrankssuitsasbs_sswapTrashCards(s_sssisasbspysol.pysisOonsooSequenceXBs " ''cseBfB|i|if\}}gB|djo |djp|djo |djohBddf\}}nEiB|djo |djp|djo |djo jBd}nkB||fSdS(Niiiii(scardassuitscardbsasb(s_scardascardbsasbspysol.pysswapTrashCardseBs 77 (s__init__sisOonsooSequencesswapTrashCards(spysol.pysFlower_OpenStackSBs  sFlowerClock_RowStackcslBmBdZRS(NcsomBnB|i|| o oBdSnpB|i}qB| o rBdSnsB|d idd|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuit(s_s from_stackscardss stackcardsspysol.pys acceptsCardsmBs     (s acceptsCards(spysol.pysFlowerClock_RowStacklBss Gaji_RowStackcstBuBdZRS(Ncs uBvB|i|| o wBdSnxB|i}yB| o zBdSn{B|didjo|didjp'|d idjo|d idjo }BdSn+~B|di|d ijo BdSnB|i|d |d\}}B|d|jSdS(Niii ( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardss stackcardssasbspysol.pys acceptsCardsuBs    U  $(s acceptsCards(spysol.pys Gaji_RowStacktBssMatsukiri_RowStackcsBBdZRS(NcswBB|i|| o BdSnB|i}B| oB|didjSnB|i|d |dgSdS(Nii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisOonsooSequence(s_s from_stackscardss stackcardsspysol.pys acceptsCardsBs    (s acceptsCards(spysol.pysMatsukiri_RowStackBssOonsoo_RowStackcsBBdZRS(NcsBB|i|| o BdSnB|i}B|i| o BdSnB| oB|didjSnB|d i|dijo BdSnB|i|d |dgSdS(Nii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcardsspysol.pys acceptsCardsBs     (s acceptsCards(spysol.pysOonsoo_RowStackBssSamuri_RowStackcsBBdZRS(NcsBB|i|| o BdSnB|i}B| oB|didjSnB|di}B|djo Bd}nB|d i|dijo|d i|djSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisrank(s_s from_stackscardss stackcardssispysol.pys acceptsCardsBs    (s acceptsCards(spysol.pysSamuri_RowStackBssGreatWall_RowStackcsBBdZRS(NcsBB|i|| o BdSnB|i}B| oB|didjSnB|di|d ijo(B|didd|d ijSnB|i|d |d\}}B|d|jSdS(Niii ( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardss stackcardssasbspysol.pys acceptsCardsBs   ($(s acceptsCards(spysol.pysGreatWall_RowStackBssFourWinds_RowStackcsBBdZBdZRS(NcsBB|i|| o BdSnB|i}B| o BdSnB|di|d ijo|did|d ijSdS(Nii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcardsspysol.pys acceptsCardsBs     csBB|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImageBs(s acceptsCardssgetBottomImage(spysol.pysFourWinds_RowStackBs sAbstractFlowerGamec s>BBddddddddd d d d f ZBd ZRS(NsPinesPlumsCherrysWisteriasIrissRosesCloversMoonsMumsMaplesRainsPhoenixcsBB|i|ijo BdSnB|i|if\}}B|djo Bd}nB|djo Bd}nB|d|jp|d|jSdS(Niii(scard1srankscard2ssuitsasb(s_sstack1scard1sstack2scard2sasbspysol.pysshallHighlightMatchBs   (sSUITSsshallHighlightMatch(spysol.pysAbstractFlowerGameBs-s FlowerClockcsDBBdZBdZBdZBdZBedZRS(Nc sBBt||if\}}Btdd|i}B|i|i|i d|i |i dBddddddd d d d d df }Bd d d d d dd d d d d df }B|i|i d}B|id }BxtddBr}B||||i } B||||i } B|iit| | |tBt|i| |id| |i Bddd|Bd|i|} qWBxtddBr} B|i|i |i | df\}}Bx^tddBrK}B|iit|||d|idBddB||i }qWqWB|i |idd|i ddfBt!|i"|i |i#|i ||_$B|i%dS(Ns canvas_cardscardwf10.5f5.5iif2.5if0.25f0.75f1.9if3.5f3.75ii sanchorscentersfontstextf2.7isyoffsets max_cardsii?B(&sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxoffsetsyoffsetsxsCHsysrangesisx0sy0s foundationssappendsFlowerClock_FoundationsANY_SUITs MfxCanvasTextscanvassSUITSstsjsrowssFlowerClock_RowStacks setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups( s_slsssfontsxoffsetsyoffsetsxsysisx0sy0stsjspysol.pys createGameBs4/2- "$ * %),csBBto#t|iiidjptBx2tddBr}B|iii ddqBWB|i B|iii Bto#t|iiidjptdS(Ni0iisframes( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSample(s_sispysol.pys startGameBs-  csyBBxe|iidBrR}Bt|idjo BdSnB|idi|ijo BdSnqWBdSdS(Niii(s_sss foundationssislenscardssranksid(s_sispysol.pys isGameWonBs  csBBdSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchBscsYBB|tjo B|iif|iifSn#B|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_seventspysol.pys getAutoStacksBs (s createGames startGames isGameWonsshallHighlightMatchsNones getAutoStacks(spysol.pys FlowerClockBs     sGajics5BBdZCdZ CdZCdZRS(Nc s)BBt||if\}}B|i|id|id|id|idB|i}B|i}B|i i t |||dB||id}B|i i t |||dB||id}Bx^tdd BrK}B|ii t|||d |idBd dB||i}qWB|i|i|i|idd d |i|idddfB|d}C|i i t |||dC||id}C|i i t |||d Ct|i|i|i|i||_C|idS(Nii iiii iiisyoffsets max_cardsi ii?Bi(sLayouts_ssslssetSizesXMsXSsYMsYSsxsys foundationssappendsGaji_Foundationsrangesisrowss Gaji_RowStacksCHs setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups(s_slsssxsysispysol.pys createGameBs(7  "" %G "",csCCttttg}Cxr|dCrd}C||i oL C|idjo |idj o$ C|||i< C|i|nnq%W C||SdS(Nii (sNonestopcardsscardsscssuitsranksremove(s_scardsstopcardsscspysol.pys _shuffleHookCs $c s CCto#t|iiidjptCx2tddCr}C|iii ddqBWC|i C|ii }C|iii d|d|d|d|d|d |d fC|iii d|d|d|d |d fC|iii d|d|d fC|ii }C|iii d|d|d|d|d fCto#t|iiidjptdS( Ni0iisframessrowsiiiiii(s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrowssrs foundations(s_sisrspysol.pys startGame Cs-  C5'5csUCC||iijo8C|io|id i oC|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstackspysol.pys fillStackCs (s createGames _shuffleHooks startGames fillStack(spysol.pysGajiBs   sOonsoocs5CCdZ0CdZ5CdZcsUC|io|id i o?C|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstackspysol.pys fillStackCt|io|id i oC|i |nndS(Ni( sstackscardss_ssswastes canDealCardss dealCardssrowsslensface_upsflipMove(s_sstackspysol.pys fillStackCs !&(s createGames startGames fillStack(spysol.pysSamuriCs % s GreatWallcsACCdZCdZ DdZDdZDdZRS(Nc sCCt||if\}}Ctdd|i}C|i|i|i d|i |i dCg|_ C|i}C|i }CxtddCr}C|iit||||dC|i it|iC||idC||idCd d d |C||i d}qWC|i|i }C|i }CxtddCr}C|iit||||d dC|i it|iC|dC||idCd d d |C||i d}qcWC|i}C|i |i d}CxtddCr}C|iit||||dC|i it|iC||idC||idCd d d |C||i d}q)WC|i|i }C|i |i d}CxtddCr}C|iit||||d dC|i it|iC|dC||idCd d d |C||i d}qWC|i|i d}C|i }Cx[tddCrH}C|iit|||d|idddC||i }qWC|i|i|i|i dd |i|i ddfC|id|id}C|i|i d}Ct||||_C|idS(Ns canvas_cardscardwif6.2iiiisanchorswsfontisef2.2f1.5i syoffsets max_cardsif1.25ii?Bf1.2( sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsfoundation_textssxsysrangesis foundationssappendsGreatWall_Foundations MfxCanvasTextscanvassCHswidthsGreatWall_BuildStacksrowssGreatWall_RowStacks setRegionsheightsInitialDealTalonStackstalonsdefaultStackGroups(s_slsssfontsxsysispysol.pys createGameCsn/    &  *   & *   2?csCC|idjo DdSnDxtddDr}D|djo0Dt|ii|iddf\}}n)Dt|ii|idf\}}D|djo Dd}nD||jo  Dd}n D|i |i d t |q3WdS( Niiiii issFullstext( s_spreviewsrangesislensss foundationsscardsstsfsfoundation_textssconfigsstr(s_sistsfspysol.pys updateTextCs  0(  cs D Dto't|iiiddjpt D|iDx8tddDr%}D|iii ddddqSWD|i D|iii Dto#t|iiidjptdS(Ni0iiisflipsframes( s __debug__slens_ssstalonscardssAssertionErrors updateTextsrangesisdealRowsstartDealSample(s_sispysol.pys startGame Ds1  # csUDD||iijo8D|io|id i oD|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstackspysol.pys fillStackDs csPDD|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchDs(s createGames updateTexts startGames fillStacksshallHighlightMatch(spysol.pys GreatWallCs  3  s FourWindscs5DDdZD|i?D|iiidS(Ni0( s __debug__slens_ssstalonscardssAssertionErrorsstartDealSamples dealCards(s_spysol.pys startGameDs(s_s_shuffleHookMoveToTopscards(s_scardsspysol.pys _shuffleHookDscs_DD|iDxEtt|idDr)}D|iiid|ii d q+WdS(Nisrowsi( s_sstartDealSamplesrangeslenscardssissstalonsdealRowsrows(s_sispysol.pys startGameDs  cs1DDt|iid it|ijSdS(Ni(slens_sssrowsscards(s_spysol.pys isGameWonDs(sHanoiPuzzle_RowStacksRowStack_Classs _shuffleHooks startGames isGameWon(spysol.pys HanoiPuzzle4Ds   s HanoiPuzzle5csDDRS(N((spysol.pys HanoiPuzzle5Dss HanoiPuzzle6csDDRS(N((spysol.pys HanoiPuzzle6Dsi|sTower of HanoyssuitsisHanoi Puzzle 4srules_filenameshanoipuzzle.htmlisHanoi Puzzle 5isHanoi Puzzle 6sHexADeck_FoundationStackcsDDdZRS(Nc sEDDt|ddddDtti|||||f|dS(Nsmax_moveis max_cardsi ( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscapspysol.pys__init__Ds(s__init__(spysol.pysHexADeck_FoundationStackDssHexATrump_FoundationcsDDdZRS(NcszDD|i|| o DdSnDxD|iiid dDr*}Dt|idjo DdSnq>WDdSdS(Niiii(s_sbasicAcceptsCardss from_stackscardssgamesss foundationsslen(s_s from_stackscardsssspysol.pys acceptsCardsDs  (s acceptsCards(spysol.pysHexATrump_FoundationDssHexADeck_OpenStackcsDDdZRS(Nc sHDDt|ddDtti||||f|D||_ dS(Nsmax_movei?B( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscapspysol.pys__init__Ds"(s__init__(spysol.pysHexADeck_OpenStackDss Bits_RowStackcsDDdZRS(NcsDD|i|| o DdSnD|i}D|p|didjo DdSnD|id}DxC|ii i |d|i!dDr}D|i o DdSnqWD|ii i |id i d|id?d|di ddjSdS(Niiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardss stackcardssisrspysol.pys acceptsCardsDs   # (s acceptsCards(spysol.pys Bits_RowStackDssBytes_RowStackcsDDdZRS(NcsDD|i|| o DdSnD|i}D|p|didjo DdSnD|id}D|d}DxG|ii i d|d|i!dDr}D|i o DdSnqWD|ii i |id i |di jSdS(Niiiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardss stackcardssidsisrspysol.pys acceptsCardsDs    ' (s acceptsCards(spysol.pysBytes_RowStackDssHexAKlon_RowStackcsDDdZRS(NcshDDti|||o DdSnD|i}D| p&|d idjp|didjSdS(Niii(s AC_RowStacks acceptsCardss_s from_stackscardss stackcardsssuit(s_s from_stackscardss stackcardsspysol.pys acceptsCardsDs  (s acceptsCards(spysol.pysHexAKlon_RowStackDss BitsNBytescsJDDdZDdZDdZEdZ EdZEdZRS(NicsADDt||if\}}Dtdd|i}D|i|id|i d|i |i dD|i }Dxt ddDr}D|id|i d}Dxct ddDrP}D|iit|||ddDd dd |d dD||i }qWD||i }qWD|i }Dxt ddDr}D|id |i d }Dxct d dDrP}D|iit|||ddDd dd td dD||i }qWD||i }qIWD|id |i }D|i }Dx`t ddDrM}D|iit||||ddDd dddD||i }qWD|i|iddddfD|i}D|i }Dt|||dd dd |_D|i|idD||i |i d }Dt||||_D|i|idD|idS(Ns canvas_cardscardwiiiis max_cardsis max_accepts base_suitsmax_moveiismodi?Bsnum_deals max_roundssss(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsysrangesjsxsisrowssappends Bits_RowStacksBytes_RowStacksANY_SUITs foundationssSS_FoundationStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_slsssfontsysjsxsispysol.pys createGameDsN3        !"  $cs!DDtgdtgdf\}}Dx|dDr}D|idj oD||i oDd}Dx=tddDr*}D|i ||jo Dd}nq}WD| o7D|||i<D|i ||i<E|i |nnnq3WE||}E|i E|SdS(Niii( sNonestopcardssranksscardsscssuitshaveranksrangesisranksremovesreverse(s_scardsstopcardssranksscshaveranksispysol.pys _shuffleHookDs"#       cssEEto#t|iiidjptE|iE|iiid|ii E|iii dS(NiDsrows( s __debug__slens_ssstalonscardssAssertionErrorsstartDealSamplesdealRows foundationss dealCards(s_spysol.pys startGameEs- csF E Ex2|iid Er} E|i o  EdSnqW EdSdS(Nii(s_sssrowsscards(s_ssspysol.pys isGameWon Es  csEEdSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchEs(s GAME_VERSIONs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(spysol.pys BitsNBytesDs   #   sHexAKloncs2EEeZEdZ-EdZ4EdZRS(NcsEEt||if\}}Etdd|i}E|i|i|i d|i |i dE|i}E|i }Et|||dddd |_E|i|idE||i }Et||||_E|i|idE|i|i d }Ex`td d ErM}E|iit||||d d  Edd dd !E||i }q"W"E|iit|||d d d #Edd dd $E|i}%E|i d |i }&Exltdd &ErY}'E|iit|||dd(Edddt)Edddd*E||i }qW+E|i|id ||i dddf,E|idS(Ns canvas_cardscardwiisnum_dealis max_roundssssiiismodismax_moves max_cardsics max_accepts base_suits base_rankiii?B(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsSS_FoundationStacksHexATrump_FoundationsrowssHexAKlon_RowStacksANY_SUITs setRegionsdefaultStackGroups(s_slsssfontsxsysispysol.pys createGameEs8/  % !!  -c s-E.Eto#t|iiidjpt/ExXtt|iid/Er9}0E|iii d|ii|dddddqNW1E|i 2E|iii 3E|iii dS(NiDisrowsisflipsframes( s __debug__slens_ssstalonscardssAssertionErrorsrangesrowssisdealRowsstartDealSamples dealCards(s_sispysol.pys startGame-Es- 7 cs4E5EdSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch4Es(sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysHexAKlonEs   is Bits n Bytesstrumpsis Hex A KlonsMemory_RowStackcsOE|i}?Et|idjp|id io @EdSnAE|itjo3BE|idddCE|iDE||_ncFEt o5t|iidjo|iid ipt GE|id |iidf\}}HE|iIE|ii ||oJE|id|inLE|idddME|id|_NE|id|iidOE|iPE|iiQE|idRE|iiSE|iiTE|idUE|iVEt|_WE|iiXEdSdS( Nisflipspriorityiismovesf0.5f0.2(s_sgameslenscardssface_ups other_stacksNones playSamplesflipMoves __debug__sAssertionErrorsc1sc2s cardsMatchs _dropPairMovesscores updateStatussmovessindexs updateTextscanvassupdate_idletasksssleeps finishMove(s_seventsgamesc1sc2spysol.pys clickHandler=Es2 +  ?'    csOYEZE|i}[E|iddd\E|id|_]E|id|_dS(Nsdroppairspriorityiii(s_sgames playSamples closed_cardssscore(s_sns other_stacksframessshadowsgamespysol.pys _dropPairMoveYEs ics`EaEdSdS(Ni((s_seventspysol.pyscontrolclickHandler`EscsbEcEdSdS(Ni((s_seventspysol.pysshiftclickHandlerbEs(s clickHandlers _dropPairMovesrightclickHandlersdoubleclickHandlerscontrolclickHandlersshiftclickHandler(spysol.pysMemory_RowStackEsiii'i'(s_sgamesfiltersssrowssstacksstsSTEPSsdxsdysmapsgetspossrscardss acceptsCardssapps miscrandomsrandintsscoresaddHint(s_sgamesstacksstsdxsdysrsscorespysol.pys computeHintsEs  1- (s computeHints(spysol.pys Pegged_HintEssPegged_RowStackcsIEFdZFdZFd d dZFdZFdZRS(NcsBFFti||| o FdSnF|i|tj SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardss_getMiddleStacksNone(s_s from_stackscardsspysol.pys acceptsCardsFs csFFtdfSdS(Ni(sNone(s_sstacksspysol.pys canDropCardsFscsFF|i|}F|ii|ii} F|iii d} F|ii |||dd F|ii ddd F|ii |||dd d| F|ii|F|iF|idS(Nisframessdropspriorityiisshadow(sto_stacks_getMiddleStacks_s other_stacksgames enterStatesS_FILLs old_statesss foundationssfsmoveMovesncardss playSamplesshadows leaveStates fillStack(s_sncardssto_stacksframessshadows other_stacks old_statesfspysol.pysmoveMoveFs& icsFF|id|id|id|idf\}}F|iii||f o FtSnF|ii i|id|d|id|df}F| p|i o FtSnF|SdS(Niii( s from_stacksposs_sdxsdysgamesSTEP_MAPsgetsNonesmapssscards(s_s from_stacksdxsdyssspysol.pys_getMiddleStackFs9  < cs)FFti||F|i|_dS(N(s ReserveStacks copyModels_sclonespos(s_sclonespysol.pys copyModelFs(s acceptsCardss canDropCardssmoveMoves_getMiddleStacks copyModel(spysol.pysPegged_RowStackEs    sPeggedcsFFeZFd dfddfdd fddffZFdddddddfZFd Z FdZF|djo0?F|i||ii|iidddn@F|i AFt |ii}BF|i ||i CF|iii d|ddDFto#t|iiidjptdS(Niisframessrowsi(slens_scardssssrowssnsmoveMovestalons internalssstartDealSampleslistsremovesEMPTY_STACK_IDsdealRows __debug__sAssertionError(s_snsrowsspysol.pys startGameOFsii(sGames getWinStatuss_swonsstatussupdatedsfiltersgamesssrowssstackss __debug__slensAssertionErrorsidsEMPTY_STACK_IDsU_WON(s_swonsstatussupdatedsstacksspysol.pys getWinStatusLFs$c sTFUFg}VFx|iidVFr}WF|i o XFqnYF|i\}}ZFx|idZFr\}}[F|i i ||||f}\F|o|i oW]F|i i ||d||df}^F|o|io_F|i|nnq`WqW`F|dffSdS(Niii(srowss_sssrscardsspossrxsrysSTEPSsdxsdysmapsgetsmsappend( s_srowssrsrxsrysdxsdysssmspysol.pysgetHighlightPilesStacksTFs   #+ ( s Pegged_Hints Hint_ClasssSTEPSsROWSsEMPTY_STACK_IDs createGames startGames isGameWonsNones getAutoStackss getWinStatussgetHighlightPilesStacks(spysol.pysPeggedFs /    s PeggedCross1cs#aFbFdddddddfZRS(Nii(sROWS(spysol.pys PeggedCross1aFss PeggedCross2c s)cFdFdddddddddf ZRS(Nii (sROWS(spysol.pys PeggedCross2cFss Pegged6x6cs)eFfFdZgFddddddfZRS(Nii(sEMPTY_STACK_IDsROWS(spysol.pys Pegged6x6eFs s Pegged7x7cs#hFiFdddddddfZRS(Ni(sROWS(spysol.pys Pegged7x7hFssPeggedTriangle1csjjFkFd d fd dfdd fddfdd fddffZlFdddddfZmFdZRS(Niiiiii(sSTEPSsROWSsEMPTY_STACK_ID(spysol.pysPeggedTriangle1jFsDsPeggedTriangle2cs nFoFddddddfZRS(Niiiiii(sROWS(spysol.pysPeggedTriangle2nFsc spFqFd}rFx#|idrFr}sF||}qWtFt|||uFtiddvFdh|d<wFdd}xFt |yF|SdS(Niissisncardssrules_filenames pegged.html( s si_ncardss gameclasssROWSsnsGameInfosidsnamesGIsGT_PUZZLE_TYPEsgis registerGame(sids gameclasssnames si_ncardssnsgispysol.pysrpFs   iisPegged Cross 1isPegged Cross 2is Pegged 6x6is Pegged 7x7isPegged Triangle 1isPegged Triangle 2s Wicked_TaloncsFFRS(N((spysol.pys Wicked_TalonFssImperialTrump_FoundationcsFFdZRS(NcsWFFti||| o FdSnF|d it|iii dijSdS(Niii( sSS_FoundationStacks acceptsCardss_s from_stackscardssrankslensgamesss foundations(s_s from_stackscardsspysol.pys acceptsCardsFs (s acceptsCards(spysol.pysImperialTrump_FoundationFssPonytail_FoundationcsFFRS(N((spysol.pysPonytail_FoundationFssTarock_OpenStackcsFFd dZRS(Nc stFFt|ddddFtti||||f|F|djoF|i i i }nF||_ dS(Nsmax_movei?Bs max_accepti( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsetsappsimagess CARD_YOFFSET(s_sxsysgamesyoffsetscapspysol.pys__init__Fs "i(s__init__(spysol.pysTarock_OpenStackFssTarock_AC_RowStackcsFFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|di|id idjo FdSnZF|didjp|id idjo FdSn F|di|id ijSdS(Niii(s_sbasicAcceptsCardss from_stackscardssrankscolor(s_s from_stackscardsspysol.pys acceptsCardsFs  & / (s acceptsCards(spysol.pysTarock_AC_RowStackFss Skiz_RowStackcsFFdZRS(NcsFF|i|| o FdSnF|i o|F|dit|iiijo+F|di t|iii djSn(F|di t|iii djSnF|id i|dijo |id i d|di jSdS(Nii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitssrankstrumpssranks(s_s from_stackscardsspysol.pys acceptsCardsFs &++(s acceptsCards(spysol.pys Skiz_RowStackFssPagat_RowStackcsFFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|id i|dijo |id id|dijSdS(Nii(s_sbasicAcceptsCardss from_stackscardsssuitsrank(s_s from_stackscardsspysol.pys acceptsCardsFs   (s acceptsCards(spysol.pysPagat_RowStackFssTrumpWild_RowStackcsFFdZRS(Ncs=FF|i|| o FdSnF|i o|F|dit|iiijo+F|di t|iii djSn(F|di t|iii djSnF|di |id i djo FdSnZF|di djp|id i djo FdSn F|di |id i jSdS(Niii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitssrankstrumpssranksscolor(s_s from_stackscardsspysol.pys acceptsCardsFs &++& / (s acceptsCards(spysol.pysTrumpWild_RowStackFssTrumpOnly_RowStackcsFFdZFdZRS(NcsFF|i|| o FdSnF|i o'F|dit|iiijSnF|di djo |di |id i djSdS(Niii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitsscolorsrank(s_s from_stackscardsspysol.pys acceptsCardsFs  'csFF|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImageFs(s acceptsCardssgetBottomImage(spysol.pysTrumpOnly_RowStackFs sExcuse_RowStackcsFFdZRS(NcseFF|i|| o FdSnF|i o FdSnF|di|id idjSdS(Nii(s_sbasicAcceptsCardss from_stackscardssrank(s_s from_stackscardsspysol.pys acceptsCardsFs   (s acceptsCards(spysol.pysExcuse_RowStackFssWheelOfFortune_RowStackcsFFdZFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|di|id ijo |di|id idjSdS(Nii(s_sbasicAcceptsCardss from_stackscardsssuitsrank(s_s from_stackscardsspysol.pys acceptsCardsFs   csFF|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_spysol.pysgetBottomImageFs(s acceptsCardssgetBottomImage(spysol.pysWheelOfFortune_RowStackFs sPonytail_PonytailStackcsFFRS(N((spysol.pysPonytail_PonytailStackFssPonytail_RowStackcsFFRS(N((spysol.pysPonytail_RowStackFssPonytail_ReserveStackcsFFRS(N((spysol.pysPonytail_ReserveStackFssCavalier_RowStackcsFFdZFdZRS(NcsIFFti||| o FdSnF|ipt|djSdS(Nii(sTarock_AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscardsspysol.pys acceptsCardsFs csFFxtt|ddFr}F||idj o1F||i||dijo FdSnnF||id||dijo FdSnqWFdSdS(Niii(srangeslenscardssissuitscolorsrank(s_scardssispysol.pys canMoveCardsFs "&(s acceptsCardss canMoveCards(spysol.pysCavalier_RowStackFs sNasty_RowStackcsFFdZRS(NcsFF|i|| o FdSnF|ioFF|di|id idjo|di|id ijSnF|didd|didjjSdS(Niii ii(s_sbasicAcceptsCardss from_stackscardssrankssuit(s_s from_stackscardsspysol.pys acceptsCardsFs   F(s acceptsCards(spysol.pysNasty_RowStackFssTarock_GameMethodscs\FFdddddfZFdddd d d d d ddddddfZFdZRS(NsWandsSwordsCupsCoinsTrumpsAces2s3s4s5s6s7s8s9s10sPagesValetsQueensKingcs#FF|iii|||SdS(N(s_sappsimagessgetFacesdeckssuitsrank(s_sdeckssuitsrankspysol.pysgetCardFaceImageFs(sSUITSsRANKSsgetCardFaceImage(spysol.pysTarock_GameMethodsFs3sAbstractTarockGamecsFFRS(N((spysol.pysAbstractTarockGameFssWheelOfFortunecs2FFeZFdZ!GdZ(GdZRS(Nc sFFt||if\}}Ftdd|i}F|i|i|i d|i |i dGdddddddd d d d d d d d d d d d ddf}Gd d d d dddddddd d d d d ddd ddf}G|i|i d}G|i }Gxtdd Grw}G||||i }  G||||i }  G|iit| | |d|id Gddddddq6W G|i|id d |i ddf G|i|i d}G|i }G|iit|||d ddG||i }G|iit|||dddG||i }G|iit|||dddG||i }G|iit|||dddG||i d }G||i }G|iit|||dddG|i|i }G|i|i d }Gt|||d!dd"d|_G|i|id#G||i }Gt ||||_!G|i|i!d# G|i"dS($Ns canvas_cardscardwf11.5f5.5iiif3.9if0.2f0.5f1.1f2.2f3.3f4.2f4.4f1.8f2.1f2.4f2.6iisyoffsets max_cardssmax_moves max_acceptii i?Biif1.5snum_deals max_roundssnn(#sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxoffsetsyoffsetsxsysrangesisx0sy0srowssappendsWheelOfFortune_RowStacksCHs setRegionswidths foundationssSS_FoundationStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_slsssfontsxoffsetsyoffsetsxsysisx0sy0spysol.pys createGameFsD/QH  % + ((((($cs!G"Gto#t|iiidjpt#G|i$G|iiid|ii d %G|iiid|ii dd !&G|iiid|ii d 'G|iii dS(NiNsrowsii( s __debug__slens_ssstalonscardssAssertionErrorsstartDealSamplesdealRowsrowss dealCards(s_spysol.pys startGame!Gs - $'#cs(G)GdSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch(Gs(sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(spysol.pysWheelOfFortuneFs  % sImperialTrumpscs,*G+GdZBGddZIGdZRS(Nc s@+G,Gt||if\}}-Gtdd|i}.G|i|i|i d|i |i d/G|i|i d}0G|i }1GxQtdd1Gr>}2G|iit||||dd 3G||i }qW4G|iit|||ddd 5G|i}6Gt|||d d d d |_7G|i|id8G||i }9Gt||||_:G|i|id;G|i}G|iit|||?G||i }qW@G|i|id |ddfAG|idS(Ns canvas_cardscardwiiiiis max_cardsiisnum_dealis max_roundssssf1.25ii?B(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsImperialTrump_FoundationsSS_FoundationStacksWasteTalonStackstalons createTexts WasteStackswastesintsroundsrowssTrumpWild_RowStacks setRegionsdefaultStackGroups(s_slsssfontsxsysispysol.pys createGame+Gs0/  (( % # #c sBGCGto#t|iiidjptDGxWtdt|iidDGr5}EG|iii d|ii|ddddqQWFG|i GG|iii d|HG|iii dS(NiNiisrowssflipsframessreverse(s __debug__slens_ssstalonscardssAssertionErrorsrangesrowssisdealRowsstartDealSamplesreverses dealCards(s_sreversesispysol.pys startGameBGs-! 3 icsIGJGdSdS(Ni((s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchIGs(s createGames startGamesshallHighlightMatch(spysol.pysImperialTrumps*Gs sPagatcs)KGLGdZlGdZrGdZRS(Ncs?LGMGt||if\}}NGtdd|i}OGtd|id|i }PG|i |i d|i |i|i|QG|i |i d}RG|i}SG|iit|||ddd TG||i }UG|iit|||d dd VG||i }WG|iit|||d dd XG||i }YG|iit|||d dd ZG||i }[G|iit|||ddd \G|i }]GxHtdd]Gr5}^G|iit|||_G||i }qW`G||i d}aGxHtddaGr5}bG|iit|||cG||i }q3WdG|i }eG|i|id}fGxHtddfGr5}gG|iit|||hG||i }qWiG|i|id t|ddfjGt|i |i|i||_kG|idS(Ns canvas_cardscardwiii f3.5is max_cardsiiiiiif1.1ii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsys foundationssappendsSS_FoundationStacksrangesisreservess ReserveStacksrowssPagat_RowStacks setRegionsintsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_slsssfontshsxsysispysol.pys createGameLGsD / (((((     )%cslGmGto#t|iiidjptnGx2tddnGr}oG|iii ddqBWpG|i qG|iii d|ii dd!dS(NiNiisframessrowsii ( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrows(s_sispysol.pys startGamelGs -  csHrGsG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchrGs(s createGames startGamesshallHighlightMatch(spysol.pysPagatKGs sSkizcs)vGwGdZGdZGdZRS(Ncs?wGxGt||if\}}yGtdd|i}zGtd|id|i }{G|i |i d|i |i|i||G|i |i d}}G|i}~G|iit|||ddd G||i }G|iit|||d dd G||i }G|iit|||d dd G||i }G|iit|||d dd G||i }G|iit|||ddd G|i }GxHtddGr5}G|iit|||G||i }qWG||i d}GxHtddGr5}G|iit|||G||i }q3WG|i }G|i|id}GxHtddGr5}G|iit|||G||i }qWG|i|id t|ddfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii f3.5is max_cardsiiiiiif1.1ii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsys foundationssappendsSS_FoundationStacksrangesisreservess ReserveStacksrowss Skiz_RowStacks setRegionsintsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_slsssfontshsxsysispysol.pys createGamewGsD / (((((     )%csGGto#t|iiidjptGx2tddGr}G|iii ddqBWG|i G|iii d|ii dd!dS(NiNiisframessrowsii ( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrows(s_sispysol.pys startGameGs -  csHGG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchGs(s createGames startGamesshallHighlightMatch(spysol.pysSkizvGs s FifteenPluscs)GGdZGdZGdZRS(Nc sOGGt||if\}}Gtdd|i}Gtd|id|i }G|i |i d|i |i|i|G|i|i }G|i}G|iit|||dddG||i}GxQtdd Gr>}G|iit||||dd G||i}qWG|i }G|i}Gxtd d Gr}GxTtd d GrA}G|iit|||d dddG||i }q{WG|i }G||id}q`WG|i|id d |i |i d dfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii is max_cardsiiiiismax_moveis max_acceptiii?B(sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMswidthsxsys foundationssappendsSS_FoundationStacksrangesisjsrowssTarock_AC_RowStacks setRegionsInitialDealTalonStacksheightstalonsdefaultStackGroups( s_slsssfontshsxsysisjspysol.pys createGameGs2 / ( (    + 2%c sGGto#t|iiidjptGx8tddGr%}G|iii ddddqBWGxHtddGr5}G|iii d|ii d ddddqWG|i G|iii dS(NiNiisflipsframessrowsi( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsrowssstartDealSample(s_sispysol.pys startGameGs- # 3 csHGG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchGs(s createGames startGamesshallHighlightMatch(spysol.pys FifteenPlusGs  sExcusecs>GGdZGdZGdZGdZGdZRS(Nic sXGGt||if\}}Gtdd|i}Gtd|id|i }G|i |i d|i |i|i|G|i|i }G|i}G|iit|||dddG||i}GxQtdd Gr>}G|iit||||dd G||i}qWG|i }G|i}Gxtd d Gr}Gx]td d GrJ}G|iit|||Gd ddddtG||i }q{WG|i }G||id}q`WG|i|id d |i |i d dfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii is max_cardsiiiiismax_moveis max_accepts base_rankiii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMswidthsxsys foundationssappendsSS_FoundationStacksrangesisjsrowssExcuse_RowStacksNO_RANKs setRegionsInitialDealTalonStacksheightstalonsdefaultStackGroups( s_slsssfontshsxsysisjspysol.pys createGameGs4 / ( (     2%cs+GGd}Gdt|iif\}}Gg}GxD|dGr7}G||oG|i |nG|d}qEWGx|dGr}}G||}GxdG||joSG||| o-G||||f\||<||<GPnG||}qWqWG|i G|SdS(NcsGGG|idjo |idjp|idjo |idjSdS(Nii i(scssuitsrank(scspysol.pysisKingGsii( sisKingslens_sssrowssisnskingsscardsscsappendsjsreverse(s_scardssisKingsisnskingsscsjspysol.pys _shuffleHookGs& !    % csGGto#t|iiidjptGx2tddGr}G|iii ddqBWG|iii d|ii d ddG|i G|iii d|ii d dS(NiNiisframessrowsi( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsrowssstartDealSample(s_sispysol.pys startGameGs- ) cs5GG|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchGs(s GAME_VERSIONs createGames _shuffleHooks startGamesshallHighlightMatch(spysol.pysExcuseGs     s Grasshoppercs>GGdZGdZHdZ(HdZ/HdZRS(Nic sGGt||if\}}Gtdd|i}H|ii}H|i d|i dd||i d|i d|i Ht|itd|id}H|i }H|i }Ht|||ddd d|_H|i|id H||i }Ht||||_ H|i|id  H||i |i } Hxptd d  Hr]} HxQt|d  Hr>}  H|iit||||d dH||i }qWqeWHxQt|d Hr>} H|iit|||d d dH||i }qWH|i }H|i d|i }H|iit |||H|i|f|dj|id _!H||i |i }HxNt|d Hr;} H|i"it#|||d|H||i }qWHxPtd |dd Hr5} H|i"it$|||H||i }q WH|i%|i"d ||i ddfH|i&dS(Ns canvas_cardscardwiiii snum_dealis max_roundssssiis max_cardsiisyoffsetii?B('sLayouts_ssslsgetFontsCWsfontsgameinfosdecksssetSizesXMsXSsYMsYSsminsYOFFSETsmaxsyoffsetsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesjsis foundationssappendsSS_FoundationStacksreservess OpenStacks CARD_YOFFSETsrowssTrumpOnly_RowStacksTarock_AC_RowStacks setRegionsdefaultStackGroups( s_slsssfontsdeckssyoffsetsxsysjsispysol.pys createGameGsL?%  $  ( ( & % *c sH H|ii}!Hto't|iiid|jpt"H|i #HxHt d|d#Hr1}$H|iii d|ii ddddqfW%H|ii di&H|iii d|ii|'H|iiidS(NiNiisrowssflipsframesi(s_sgameinfosdeckss __debug__slenssstalonscardssAssertionErrorsstartDealSamplesrangesisdealRowsreservessflipMovesrowss dealCards(s_sdeckssispysol.pys startGameHs1  /#cs(H)H|iid}*H|i o||iijoC+H|io|i||id o,H|id|nn-H|i o.H|i ndS(Nii( s_sssreservessrsstackscardssrowss acceptsCardssmoveMoves canFlipCardsflipMove(s_sstacksrspysol.pys fillStack(Hs !(csH/H0H|id|ijp|id|ijo|i|ijSdS(Ni(scard1srankscard2scolor(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatch/Hs(s GAME_VERSIONs createGames startGames fillStacksshallHighlightMatch(spysol.pys GrasshopperGs   " sDoubleGrasshoppercs3H4HRS(N((spysol.pysDoubleGrasshopper3HssPonytailcs5H6HdZRS(Nc s6H7Ht||if\}}8Htd|id|i|id|i}9H|i d|i |i |i |:Ht |_;H|idt H|iit|d|i ||?H|iit|d |i ||@H|iit|d |i ||AH|iit|d |i ||BH|d |i}qWCH|i |i}DHx tddDHr }EH|iit|||FH|iit||i ||GH|iit|||i|HH|iit||i ||i|IH|iit||d|i|JH|iit||i |d|i|KH|d |i }qWLH|i d|i d}MH|i }NHt|||d d|_OH|i d|i }PH|i d|i}QHt|||dd|_RH|i|idSHt|iTH||id||i UHdd|ii _!VH||i }WHt"||||_#XH|i|i#dYH|i d|i }ZH|i }[Hxtd d[Hry}\H|i$it%||||dddd]H|i$it%||i |||dddd^H||i}q"W_H|i$it%|||d dddd`H|i$it%||i ||d ddddaHt|ibH||i|i d||icHdddt&dd|i|i _'dH|i$|i|i(_)eH|ig|i#g|i(_*fH|ig|i|i#g|i(_+dS(Niiii sbraidiif0.5f4.5f5.5f6.5issineis max_roundsissssanchorssismodis max_cardsisnsfonts canvas_cardscardw(,sLayouts_ssslsmaxsYSs BRAID_CARDSsYOFFSETshssetSizesXSsXMsYMsNones base_cardsaddattrsxsysrangesisrowssappendsPonytail_RowStacksPonytail_ReserveStacksPonytail_PonytailStacksbraidsWasteTalonStackstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes foundationssPonytail_FoundationsgetFontsinfossgs openstackss talonstackss dropstacks(s_slssshsxsysispysol.pys createGame6Hsf2(  **** &&-*1    .5.5 "*(s createGame(spysol.pysPonytail5HssCavaliercs_gHhHeiZiHeZjHeZkHeZlHdZ yHdddfddZ HdZ RS(Nc solHmHt||if\}}nHt|ddddoHt|i|f|pH|i|i d|i dqHxp|ii dqHr]}rHdd|i d j}sH|i i|i|i|i||i tHd |d |qWuHxA|iiduHr.}vH|ii|i|i|i|qWwH|i|iii|iii||_xH|idS( Nsrowsis playcardsiiiiiismods max_cards(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes foundationssrssuitsnsappendsFoundation_ClasssxsysrowssRowStack_Classs Talon_Classstalons defaultAll(s_slayoutslsssrsnspysol.pys createGamelHs! ' ,-csyHzHto#t|iiidjpt{Hx2|d{Hr%}|H|iii d|ddq<W}H|i ~H|iii H|oIH|iii d|ii dd!H|iii d|ii n$H|iii d|ii d dS(NiNisflipsframessrowsii( s __debug__slens_ssstalonscardssAssertionErrorsflipsfsdealRowsstartDealSamples foundationssrows(s_sflips foundationssfspysol.pys startGameyHs- #  &#iicshHH|id|ijp|id|ijo0|idjp |idjp|i|ijSdS(Nii(scard1srankscard2ssuitscolor(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchHs( sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssCavalier_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(spysol.pysCavaliergHs      sFiveAcescsHHdZHdZRS(NcsHH|i|dSdS(NcsH|idj|ifS(Ni(scsrankssuit(scspysol.pysHs(s_s_shuffleHookMoveToBottomscards(s_scardsspysol.pys _shuffleHookHscsHHti|dddS(Ns foundationsi(sCavaliers startGames_(s_spysol.pys startGameHs(s _shuffleHooks startGame(spysol.pysFiveAcesHs sWickedcs]HHeedd ZHeedddddeZHeZHdZHdZ RS(Ns max_roundsismax_moves max_accepts base_rankcs,HHti|ddddfdddS(Nsflipis foundations(sCavaliers startGames_(s_spysol.pys startGameHscsHHH|id|ijp|id|ijo|i|ijSdS(Ni(scard1srankscard2ssuit(s_sstack1scard1sstack2scard2spysol.pysshallHighlightMatchHs( s StackWrappers Wicked_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_ClasssCautiousDefaultHints Hint_Classs startGamesshallHighlightMatch(spysol.pysWickedHs !  sNastycs&HHeedddddeZRS(Nsmax_moveis max_accepts base_rank(s StackWrappersNasty_RowStacksANY_RANKsRowStack_Class(spysol.pysNastyHsc srHH|tiBtiBtiB}Ht||||||Hdt ddt d}Ht |H|SdS(Nsranksistrumpsi(s game_typesGIs GT_TAROCKs GT_CONTRIBs GT_ORIGINALsGameInfosids gameclasssnamesdeckssredealssrangesgis registerGame(sids gameclasssnames game_typesdeckssredealssgispysol.pysrHs ! isWheel of FortuneisImperial Trumpsiiis Fifteen plusiiisDouble Grasshopperiiis Five AcesiisPysolScrolledCanvascs;HHdZHdZHedZHedZRS(NcsTHHtti||if|H||_H|iidddddddS(Nsrowiscolumnsstickysnews(sapplys MfxCanvass__init__s_sframeskwscanvassgrid(s_skwspysol.pys createCanvasHs csHH|iioHd|_nH|iid|d|H|iid|d|H|iiddd||fdS(Niswidthsheights scrollregioni(s_scanvasswinfo_ismappedsresize_pendingsframesconfigswidthsheight(s_swidthsheightspysol.pyssetInitialSizeHs cs HHdS(N((s_swspysol.pysbindHbarHscs HHdS(N((s_swspysol.pysbindVbarHs(s createCanvasssetInitialSizesNonesbindHbarsbindVbar(spysol.pysPysolScrolledCanvasHs  sOptionscs8HHdZHedZHdZ IdZRS(NcsHHt|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_ Hd|_ Hd|_ Hd|_ Hd|_ Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hd|_Hg|_ Hd|_!Ht"|_#Ht"|_$Hd|_%Hd|_&H|i'H|i(dS(Nisunknownis#008200if1.5i()s VERSION_TUPLEs_s version_tuplessavedsplayersconfirmsupdate_player_statss autofaceupsautodropsautodeals quickplaysundos bookmarksshintshighlight_pilesshighlight_cardsshighlight_sameranks tablecolors animationssshadowsshades hint_sleeps demo_sleeps demo_logos demo_scorestoolbars toolbar_sizes statusbarssounds sound_modessound_sample_volumessound_music_volumes recent_gameids last_gameidsNones last_players last_save_dirs game_holdeds wm_maximizeds setDefaultss setConstants(s_spysol.pys__init__HsL                                     cswHHdddf\}}}H|o1H|i|i|if\}}}nH|djoHd|_n Ht |_Hd}Hd|jo djnpd|jo djno Hd}nHh|dfd<|dft i <d dft i <d dft i<d dft i<d dft i<d dft i<d dft i<|_dS( NiisFade_Green.ppmsOxymoroni iXs2000ssKintengus Vienna 2Ks Hex A DecksDashavatara Ganjifa(sswsshssdstopswinfo_screenwidthswinfo_screenheightswinfo_screendepths_stabletile_namesNonescsCSIs TYPE_FRENCHs TYPE_HANAFUDAs TYPE_TAROCKs TYPE_HEXADECKsTYPE_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAscardset(s_stopsswsshssdscspysol.pys setDefaultsHs 1  ? csHHd|_Hd|_Hd|_Hd|_Hd|_Id|_Id|_Itdf|_ Id|_ Itdtdf|_ Id|_ Itdtdf|_ Id|_Itd jo( Id|_ Id|_ Id|_ndS( Niif2.0f1.0f1.5s#ffc000s#0000ffs#303030sPyJongg(s_s win_animationstoolbar_reliefs dragcursorsmagnetic_mousesmagnetic_mouse_timesraise_card_sleepshighlight_piles_sleepsNoneshighlight_piles_colorsshighlight_cards_sleepshighlight_cards_colorsshighlight_samerank_sleepshighlight_samerank_colorsshintarrow_colorsPACKAGEshighlight_sameranksshadowsshade(s_spysol.pys setConstantsHs"            cs= I It}It|i|iI|iI|SdS(N(sOptionssopts merge_dicts__dict__s_s setConstants(s_soptspysol.pyscopy Is  (s__init__sNones setDefaultss setConstantsscopy(spysol.pysOptionsHs ' s StatisticscsYIIdZIdZIdZ+IdZ2IdZ7IdZ>IdZRS(NcsIIt|_Id|_Ih|_Ih|_Ih|_Ih|_Ih|_Ih|_ Ih|_ Id|_ dS(Ni( s VERSION_TUPLEs_s version_tuplessavedsstatss demo_statss prev_gamessall_prev_gamess session_gamess total_balancessession_balancesgameid_balance(s_spysol.pys__init__Is         csIItSdS(N(s Statistics(s_spysol.pysnewIscsI I|i||i|!I|i||i|"I|ii| o #IdSn$I|djo%I|i|=ns'I|i|d\}}(I|i||\}})I||||f|i|d<*Iddf|i||1Is(sgamesshas_keysplayersgameidsfilter(s_splayersgamessgameidspysol.pys__resetPrevGames+Is  cs]2I3I|ii|}4I|tjo5Ih}|i|I?I|i|idd||ii|iit|i|i |i f }CI|t j o |djoDI|ii| oEIg|i|IsN(s__init__snews resetStatss_Statistics__resetPrevGamessgetStatss updateStatss updateLog(spysol.pys StatisticsIs    sCommentscs5MINIdZRIdZTIdZXIdZRS(Ncs+NIOIt|_PId|_QIh|_dS(Ni(s VERSION_TUPLEs_s version_tuplessavedscomments(s_spysol.pys__init__NIs  csRISItSdS(N(sComments(s_spysol.pysnewRIscs8TIUIt}VId||f}WIt||i|It=|_?It@}I| o Id}nI|d }I||i_AItddIdtIdtIddIdtIddIdt|_BItd t|_CId|_DdS(!NsApplication.__init__iisbordersdemoslogossredealsshadesstatssprogressshomesconfigspluginss savegamessmaintsopts options.datsstatistics.datsholdgames holdgame.datscommentss comments.datsntsunknownisidsrandoms loadedgames startdemoscardsetsbookmarksloadgame(EsTimers_s starttimersGAME_DBsgdbsOptionssoptscopys startup_opts StatisticssstatssCommentsscommentss splashscreensdebugsNonestopstop_bgs top_cursorsmenubarstoolbarscanvass statusbarsgames dataloadersaudiosimagesssubsampled_imagessStructsgimagess progress_bgsprogress_imagessCardsetManagerscardset_managerscardsets TileManagerstabletile_managerstabletile_indexs SampleManagerssample_managers MusicManagers music_managersmusic_playlistsintrososspathsnormpaths gethomedirshomes getprefdirsPACKAGEsconfigsjoinsdns__dict__sitemssksvsfnsnamesnormcases LCRandom64s gamerandoms miscrandoms getusernamesplayersnextgames commandlines demo_counter(s_shomesconfigsksvsplayerspysol.pys__init__]Is                           !!'          cs II|ii|_IyI|iWn IInXIyI|iWn IInXI|i|iioI|ii|i_ nI|i i d}I|i |}I|iidjo |ii oIt}IyI|i|ii|}WnIIt}nXI|oI|i |iijo |iio;I|iid|i_Id|i_I||i_nI|iIt|nIt}nI|iio |ii o]Iy:I|i|ii||i_Id|iii_WnIIt|i_nXnId|i_I|iIt|It}It||i|_It|i|_I|ii |iiI|i!|ii"}It$|id|d|ii"|_%I|i%i&|ii'I|i%i |ii%I|i(i)oI|i(i)i*ddnIt+|i|_,I|i,i-ddddI|i.|i/d dIzIxIdoIt0o|i1tj pt2I|ii |ii3f\}}Idtf\|i_ |i_3I|i4||I|iioIt0o|ii djpt2IyDId|ii_I|ii5|iiI|ii |i_Wn IInXnI|i6I|ii djoIPnI|ii1|i1j o0I|i7|ii1d |ii d d d nI|i8|ii qWWdII||i_IyI|i9Wn IInXIyI|i:Wn IInXIyI|i;Wn IInXIyI|i<Wn IInXIyI|i=i>Wn IInXXdS(Niisdirssizesstepsfillsbothsexpandsforcesidsupdateii(?s_soptscopys startup_optsloadStatisticss loadCommentss getGameClasss last_gameidsnextgamesidsgdbsgetGamesIdSortedByNames constructGamestmpgames game_holdeds loadedgamesNonesgames _loadGamesfnsholdgamesgstatssholdedsloadedsdestructs commandlinesloadgames PysolMenubarstopsmenubarsPysolStatusbars statusbarsshowsgetToolbarImagesDirs toolbar_sizesdirs PysolToolbarstoolbars setReliefstoolbar_reliefsintrosprogresssupdatesPysolScrolledCanvasscanvasspackssetTilestabletile_indexs __debug__scardsetsAssertionErrorsrandomsrunGames _saveGamesfreeGames loadCardsetsrequestCompatibleCardsetTypes wm_save_states saveOptionsssaveStatisticss saveCommentssaudiosdestroy(s_sidstmpgamesgamesdirsrandomspysol.pysmainloopIs$   &  !   ' !!!$  0csIJ|ii|J|i|}J|tjodJd}Jt}J|i|}J|tjo,J|ii d}J|i|}nn J|i |} Jt o1|o t |tijo |djpt Jt o$|tj o |i|jpt J|i||_ J|ii|Jd|i_J|ii|J|ii o |ii oCJ|idjo)J||i_J||i_JdSnnJ|ii|iJ|ii|i|iJ|iid|iiJxIJdo>JyJ|ii i!|WnJt"j o JPnXqWJ|ii i#d|J|ii d3J|ii$|ii  J|i%i&o9!J|i%i&i'"Jt(|i%i&#Jt|i%_&n$Jd}%J|ii*tj o?&Jd|i+_,'J|ii-|ii*(Jt(|ii*nh)J|iitj o*J|ii.|iin5,Jd|i+_,-J|ii/d|dd.Jd}/Jt|i_*0Jt|i_1J|i0pt1d@o2Jnd3J|i2djoP4Jt3|d d d d}5J|djo!6J|o7Jd|i_nnn8Jd|_29J|iio3:Jd|i_;J|ii5J|ii7?Jd|ii+_8n@Jd|i_AJ|ii9dS( Niiisplayerisrandomsautoplayistimeouti Nssound(:s_stops connectApps getGameClasssidsgsNonesrandomsgdbsgetGamesIdSortedByNames getGameInfosgis __debug__stypestypess ClassTypesAssertionErrors constructGamesgames setSelectedsbusyscreatesnextgames startdemosbookmarksrequestCompatibleCardsetSizesmenubars connectGamestoolbars updateStatussoptsplayers recent_gameidsremoves ValueErrorsinsertsupdateRecentGamesMenusintrosprogresssdestroysdestructsautoplays loadedgamesstatssgameid_balances restoreGamesrestoreGameFromBookmarksnewGamesdebugsbundles splashscreens helpAboutsstatuss startDemoscreateDemoInfoTextsautoPlays player_movessmainloop(s_sidsrandomsgsgisautoplaysstatusspysol.pysrunGameIs  ;.      csBJCJ|iittDJ|iitEJt|iFJ|iiGJ|iiHJ|i o$IJ|i i JJt |i nKJt|_ LJ|i i tdS(N( s_stoolbars connectGamesNonesmenubarsunbind_destroyscanvassdeleteAllItemssupdate_idletaskssgamesdestructstops connectApp(s_spysol.pysfreeGameBJs  cs MJNJdS(N((s_sinfospysol.pysdumpMemMJsscspOJPJ|io\QJ|ii}RJ|djoSJd|i_n$TJ|djoUJd|i_nndS(Nszoomedisnormali(s_stopswm_statesssopts wm_maximized(s_ssspysol.pys wm_save_stateOJs  csVJWJ|iio9XJ|iiiYJt|iiZJt|i_n[J|io$\Jt|i]J|iindS(N( s_sintrosprogresssdestroysdestructsNonestops wm_withdraws busyUpdate(s_spysol.pys wm_withdrawVJs cs{^J_Jtiidd}`J|iiit|i i d|aJ|iiit|i i d|bJ|iii|i i d|cJ|iii|i i d|dJ|iii|i i d|eJ|iii|i i d|fJ|iii|i i d |gJd}hJx>d d fd hJr+}iJ|ii i|i i ||qEWdS( Nsimagesslogossjoker07_40_774sjoker08_40_774sjoker07_50_774sjoker08_50_774sjoker11_100_774s joker10_100spysol_40sstopsignsredeali( sosspathsjoinsdirs_sgimagesslogossappends loadImages dataloaders findImagesfsredeal(s_sdirsfspysol.pys loadImages1^Js++%%%%%  csjJkJtiidd}lJxGdddddfdlJr+}mJ|iii|i i ||q6WnJtiidd }oJx;d fdoJr+}pJ|ii i|i i ||qWdS( Nsimagessdemosdemo01sdemo02sdemo03sdemo04sdemo05isstatssbarchart( sosspathsjoinsdirsfs_sgimagessdemosappends dataloaders findImagesstats(s_sdirsfspysol.pys loadImages2jJs ) cs qJrJdS(N((s_spysol.pys loadImages3qJscssJtJx|iiidtJr\}}uJt|tijovJxt t |dvJrk}wJt||ti joHxJt ||||<yJ|iiozJ|iiiddnnq[W{Jt||ii| cs6K7KdSdS(Ni((s_spysol.pysrequestCompatibleCardsetSize6Kscs8K9K|ii}:Kt|idd|ddt;Kd|d|id|Kt Sn?K|ii |i}@K|t jp |i|jo AKt SnBK|SdS( NstitlesPlease select a is type sappsmanagerskeysstringssOKsCancelsdefaulti(s_scardsetsindexskeys$SelectCardsetByTypeDialogWithPreviewstopstsCARDSETscardset_managersNonesdsstatussbuttonsgetscs(s_stskeysdscsspysol.pys__selectCardsetDialog8Ks"#   csCKDK|ii|iEKt|ii}FK|oGK|ii}HKt|do t|doIKt||inJKt|doKKt |i |i_ nLKt|ii |i MK||i_nNK|ii dS(Ns version_tuplescardsetsplayer( s_sopts setDefaultsstopsunpicklesfnscardsetshasattrs merge_dictsustrsplayers__dict__s setConstants(s_soptscardsetspysol.pys loadOptionsCKs #cspOKPKt|ii}QK|oRKt|ii|inSKh|i_TKh|i_UKd|i_dS(Ni( sunpickles_sfnsstatss merge_dicts__dict__s session_gamesssession_balancesgameid_balance(s_sstatsspysol.pysloadStatisticsOKs  csCVKWKt|ii}XK|oYKt|ii|indS(N(sunpickles_sfnscommentss merge_dicts__dict__(s_scommentsspysol.pys loadCommentsVKs cs<ZK[Kt|_\K|id|_]Kt||dddS(Nisbinmode(s VERSION_TUPLEsobjs version_tuplessavedspicklesfn(s_sobjsfnspysol.pys __saveObjectZKs cs#^K_K|i|i|iidS(N(s_s_Application__saveObjectsoptsfn(s_spysol.pys saveOptions^Kscs#`KaK|i|i|iidS(N(s_s_Application__saveObjectsstatssfn(s_spysol.pyssaveStatistics`Kscs#bKcK|i|i|iidS(N(s_s_Application__saveObjectscommentssfn(s_spysol.pys saveCommentsbKscsPdKeK|ii|}fK|tjogKtd|nhK|i|SdS(NsUnknown game (id %d)(s_sgdbsgetsidsgisNones Exceptions gameclass(s_sidsgispysol.pys constructGamedKscsiKjK|iiSdS(N(s_sgdbsgetGamesIdSortedById(s_spysol.pysgetGamesIdSortedByIdiKscskKlK|iiSdS(N(s_sgdbsgetGamesIdSortedByName(s_spysol.pysgetGamesIdSortedByNamekKscsmKnK|ii|SdS(N(s_sgdbsgetsid(s_sidspysol.pys getGameInfomKscsAoKpK|ii|}qK|tjo qKtSnrK|iSdS(N(s_sgdbsgetsidsgisNones gameclass(s_sidsgispysol.pys getGameClassoKs csAsKtK|ii|}uK|tjo uKtSnvK|iSdS(N(s_sgdbsgetsidsgisNonesname(s_sidsgispysol.pysgetGameTitleNamesKs csAwKxK|ii|}yK|tjo yKtSnzK|iSdS(N(s_sgdbsgetsidsgisNones short_name(s_sidsgispysol.pysgetGameMenuitemNamewKs cs{K|K|ii|}}K|tjo }KtSn~K|itj oK|iSnK|i}Kt i dd|}Kt |}Kt i dd|}Kt i |d}K||_K|SdS(Ns [\[\(].*$ss[^\w]s.html(s_sgdbsgetsidsgisNonesrules_filenamesnamesnsressubslatin1_to_asciisstringslower(s_sidsgisnspysol.pysgetGameRulesFilename{Ks   csKK|i|}K| o KtSnKtid|}K|o0K|iddt i |id}nKt |}Kti dd|SdS(Ns^(.*)([\[\(](\w+).*[\]\)])\s*$is_is[^\w\-]s( s_sgetGameTitleNamesidsnsNonesressearchsmsgroupsstringslowerslatin1_to_asciissub(s_sidsnsmspysol.pysgetGameSaveNameKs  0cs#KK|ii|iiSdS(N(s_s miscrandomschoicesgdbsgetGamesIdSortedById(s_spysol.pysgetRandomGameIdKscsdKK| ptii| ptd@o KdSnKti|}Kttii|}K|i Kx|dKr}Kt i d|}Ktii||}K|otii|oKti}KyKt|id|WnNKtj o3}Kd|dt|GHKtiinKKnXK|t_nq{WdS(Niis ^(.+)\.py$isError loading plugin s: (sdirsosspathsisdirsbundleslistdirsnamessmapsnormcasessortsnamesressearchsmsjoinsnsisfilessysspsloadGamesgroups Exceptionsexsstrsstdoutsflush(s_sdirsnamessnamesmsnspsexspysol.pys loadPluginsKs&*    cs!KKt}Kz%Kt|d}K|i}WdKK|oK|inXKtti |}Kti |dddjo KtSnKt }K|i|| o KtSnK|i|iijo KtSnKt}K||_K|i|iK|SdS(NsrisPySol(sNonesfsopensfilenames readlinesslinessclosesmapsstringsstripsfinds CardsetConfigsconfigs_s_parseCardsetConfigsCARDDstopswinfo_screendepthsCardsetscssdirsupdates__dict__(s_sdirsfilenamesfslinessconfigscsspysol.pys_readCardsetConfigKs&         csiKKt|djo KdSnKtttid|d}Ktti |}Kt|djoFKti d|d}K|oKt |i d|_nnK|idjoKt|djo KdSnK|d|_Kti d|d}K| o KdSnKt |i d|_Kti d|d }K| o KdSnKt |i d|_nK|id joKt|djo KdSnKti|dd }Kx|dKrt}Kti d |}K| o KdSnKt |i d}K||ij oK|ii|nqWnK|idjooKt|d jo KdSnKti d|d}K| o KdSnKt |i d|_nKt|idjp|idd jo KdSnK|d o KdSnK|d|_Kti d|i}K| o KdSnKti |i d|_Kti d|d}K| o KdSnKt |i dt |i dt |i df\|_|_|_Kti d|d}K| o KdSnKt |i d|_Kt |i d|_Kt |i d |_K|d }K| o KdSnKtid|d|_!Ktti |i!|_!Ktt|i!|_!K||i!joK|i!i"||_#n#K|i!i$d|Kd|_#KdSdS(Niis;is^(\d+)$iiiis,s ^\s*(\d+)\s*$is.s^(.*;)?([^;]+)$s^(\d+)\s+(\d+)\s+(\d+)s^(\d+)\s+(\d+)\s+(\d+)\s+(\d+)(%slenslinesfiltersNonesressplitsfieldssmapsstringsstripssearchsmsintsgroupscssversionsextstypesncardss splitfieldssstylessssappendsyearsidentsnamesCARDWsCARDHsCARDDsCARD_UP_YOFFSETsSHADOW_XOFFSETsSHADOW_YOFFSETsbacks backnamessindexs backindexsinsert(s_scsslinesfieldssmsstylessssbackspysol.pys_parseCardsetConfigKs " #        -    Q    csAKK|i}K|i|ddfd}K|ioK||i|d}nKy#K||i|ddf}Wn KKnXKghf\}}KxQ|dKrD}Kt i |}Ky Lg}L|o!t ii|o|i| o0Ld||<Lt i|}L|inLx|dLr}Ltid |ti}L| o LqBnLt ii||}  Lt ii|  o  LqBn Lt ii| d }  Lt ii| d }  Lt ii| ot ii| o LyL|i| | } L| oL| i| i } Lt ii| | } Lt ii| d | i"} Lt ii| ot ii| oL|i#| nnWn LLnXnqBWWnLt$j o }LnXqWLx>|dLr1}L|i'|i oL|i(|nqWdS( NscardsetsssPYSOL_CARDSETSs cardsets-*sPySol_CardsetssCardsetsiis ^cardset-s config.txts COPYRIGHTsshade()s_scardset_managersmanagers getSearchDirssdirssdebugsgetRegistryDirssfoundstsdirsstringsstripsnamessosspathsisdirshas_keyslistdirssortsnamesressearchsIsmsjoinsdsf1sf2sisfiles_readCardsetConfigscss backnamess backindexsbacksextsappendsEnvErrorsexsobjs getByNamesregister(s_smanagersdirssfoundstsdirsnamessnamesmsdsf1sf2scssbacksexsobjspysol.pys initCardsetsKsZ  #  .    ) )  cs!LL|i}L|i|dd}Ly L||i|d}Wn !L"LnX#Ldtitdd}$Lt i |t i }%Lt i d}&Lghf\}}'Lx|d'Lr}(Lti|})Ly*Lg} +L|otii|o#,Lti|} -L| in.Lxm| d.Lr`} /L| p|i|  o 0Lq5n1Ltii|| } 2Ltii|  o 3Lq5n4Lt} 5L| | _6L|i d ti| } 7L|i| }8L|o89L|i#d } :Ld ti$|i#d | _%n;Lt i d d| } L|i'| o'?Ld ||<@L|i(| | fnq5WWnALt)j o }BLnXqWCL|iDLxK|dDLr>} EL| d }FL|i,|i oGL|i-|nqWdS(Nstiles-*s PYSOL_TILESsTiless((\s)|(\s))$s^(.+)-([0-9A-Fa-f]{6})$isis#is_s (.s_stabletile_managersmanagers getSearchDirssdirssgetRegistryDirssstringsjoinsIMAGE_EXTENSIONSsssrescompilesIsext_res text_color_resfoundstsdirsstripsnamessosspathsisdirslistdirssortsnamessearchsfsisfilesTilestilesfilenamessubsnsmsgroupslowers text_colorskeyshas_keysappendsEnvErrorsexsobjs getByNamesregister(s_smanagersdirssssext_res text_color_resfoundstsdirsnamessnamesfstilesnsmskeysexsobjspysol.pys initTilesLs\         &  "    csHLILghf\}}JLx|dJLr}KLti|}LL|oMLtii|}nNLyOLg}PL|otii |o;QLti |}RLt tii |}SL|inTLx|dTLr } UL| p|i|  o VLqnWLtii|| } XLtii| } YLtii|  o ZLqn[L|} \L| | _]L|idti| } ^L| | __Lti| } `L|i|  o'aLd|| <bL|i| | fnqWWncLtj o }dLnXq$WeL|ifL|oUgLxK|dgLr>} hL| d} iL|i!| i ojL|i"| nq+WnkL|SdS(Nisi(#sfoundstsdirssdirsstringsstripsosspathsnormpathsnamessisdirslistdirsmapsnormcasessortsnamesext_ressearchsjoinsfsisfilesResource_Classsobjsfilenamessubsnslowerskeyshas_keysappendsEnvErrorsexsmanagers getByNamesregister(s_smanagersdirssext_resResource_Classsfoundstsdirsnamessnamesfsobjsnskeysexspysol.pys initResourceHLsL          "     csnlLmL|i}nL|i|dtiiddf}oLti dti }pL|i |||t dS(Nssoundsextras \.((wav))$(s_ssample_managersmanagers getSearchDirssosspathsjoinsdirssrescompilesIsext_res initResourcesSample(s_smanagersdirssext_respysol.pys initSampleslLs *csqLrL|i}sL|i|dd}tLyuL||i|d}Wn vLwLnXxLtidti}yL|i |||t dS(Nsmusic-*s PYSOL_MUSICsMusics&\.((it)|(mod)|(mp3)|(pym)|(s3m)|(xm))$( s_s music_managersmanagers getSearchDirssdirssgetRegistryDirssrescompilesIsext_res initResourcesMusic(s_smanagersdirssext_respysol.pys initMusicqLs (.s__init__smainloopsNonesrunGamesfreeGamesdumpMems wm_save_states wm_withdraws loadImages1s loadImages2s loadImages3s loadImages4sgetToolbarImagesDirssetTiles updateCardsets loadCardsetscheckCompatibleCardsetTypesgetCompatibleCardsetsrequestCompatibleCardsetTypesrequestCompatibleCardsetSizes!_Application__selectCardsetDialogs loadOptionssloadStatisticss loadCommentss_Application__saveObjects saveOptionsssaveStatisticss saveCommentss constructGamesgetGamesIdSortedByIdsgetGamesIdSortedByNames getGameInfos getGameClasssgetGameTitleNamesgetGameMenuitemNamesgetGameRulesFilenamesgetGameSaveNamesgetRandomGameIds loadPluginss_readCardsetConfigs_parseCardsetConfigs initCardsetss initTiless initResources initSampless initMusic(spysol.pys Application\IsZ T NC       ( /                     < ) , $ c sizL{L|i|Lt|idtd}Lddtd|iidtdLdd d d f}dS( Nstitles installation errorstextsNo s*s were found !!! Main data directory is: s Please check your s installation.sbitmapserrorsstringssQuit( sapps wm_withdraws MfxDialogstopsPACKAGEsCARDSETs dataloadersdirsd(sappsdspysol.pysfatal_no_cardsetszLs 'c sYLLyLti|iidWn LLnXLy)Ltitii|iidWn LLnXLy,Ltitii|iiddWn LLnXLy,Ltitii|iiddWn LLnXLy,Ltitii|iiddWn LLnXLtiidd}Lt |d||_ Ld|d j o}Lxstii|i i d tii|i i d |iifdLr-}LyL|i|Wn LLnXqWnLd }Ld}Lti}Ltii|d}L|otii|oPLtii|}Ltii|o!L|d tii|}nnLxn|d dLr]}Ltii|oL||i_n/L|djoLd }L|d |}nqWLtdt} L| |_L| id|_ L| id|_!LyL|i"Wn'Lt#j o } LnLLnXLd} Ld} Lt'|_(L| oLti)djo|i*i+djoLt,|_(nDLt-oLt.|_(n'Lti)djoLt,|_(nnL|i(oL|i(i/L|i(i0t'jo^Lti)djot1|i(t, o3L|i(i2Lt,|_(L|i(i/nnnLt3|_(Lt1|i(t.oLd |i*_+nLd|i*_+L| i4| L| i5td t6L| i7td t6L| i8ddL| i9d| i:L|oL| i|nL| i;| i<| i=f\} }}L| djp|djp |djoPL|iALtB| dtdLdtdLdddd f}Ld SnLd o7L| id!tDd"| d#d$tDd%|d#nLyLtE| |i iFWn LLnXLti)d&jo<Ld'}L| iHd(|d)|L| iId*d+d,nLti)d-joLd'd.f\}}Ld/d0d1d2d3d4d5d6d7d8d9d:d;f }LxO|dLrB}L| iId<|d=||L| iId<|d>||qdWnLtM|iNiOdjobL|iALtB| dtd?Ldd@|i i dAtdBLdddd f}Ld SnL|iPLt'}L|i*iQiRd}L|oML|iSiT|d}L|o|d oL|iUdC|d nnL| oL|iSiRd}nL|iSiMdjp| oLtV|LdDSnL|iW}LtY}L|i*i[|_GLdE|_)Lt'|_\L|i]|L|i^L|i*i_oSMxI|i`dMr6}M|i*i_|iajoM|ib|_cMPnq WnM|idM|ieM|i(if|M|i(igt'joMd|i*_hn Mt-o |i(ii o MtdFGH Md } n M|i(ij M|i(igoM|iki`}M|oMtm||_nM|ioip|inMd omMxc|indMrS}Mtris|i)dGjo1M|init|M|iniud|MPnq WnM|i(iv|innnMdH|_wM|ixM|iy o*M|izi{d|izi{d f|_ynM|iAM| oti)d&jo t-t'joMd o&|i*ihot|i}dIti~t|io* Md } !Mtt'jo "Md } nn#Mtt'jo$MtdJGHn &MtdKGH'Mtiin(M| oE)M| i*MtB| dtdL+MddM,MddNddOf}nP-M| oE.M| i/MtB| dtdL0MddP1MddNddOf}n2MdQt}3M|i*i[}4M|icdjo 5MdR}n6Mt|| d|dS|d|iwdT|iy|i_7M|i8M|i9M|i:M|ii};M|i|dU|dVd  onM|i|dU|dVd o?MPnq WAMtV|BMdDSnCMdSdS(WNismusics screenshotsstilesshtmls license.htmlis --nopluginsisgamesspluginsss s --nosounds classNamesbgscursorsntii,sWM_DELETE_WINDOWiiistitles init errorstextsg requires a minimum screen resolution of 640x480 with 256 colors. Please change your display settings.sbitmapserrorsstringssQuitswidthi i@sheightiXsposixs#d9d9d9s backgroundsactiveBackgrounds*fonts Helvetica -12i<smacs60sButtonsCanvass CheckbuttonsEntrysFramesLabelsListboxs MenubuttonsMessages RadiobuttonsScales ScrollbarsTexts*s *backgrounds*activeBackgrounds installation errors1No games were found !!! Main data directory is: s Please check your s installation.sbacknameisNones8: could not connect to pysolsoundserver, sound disabled.s bye_for_nows#c0c0c0slinuxs1: Python thread module not found, sound disabled.s4: pysolsoundserver module not found, sound disabled.s installation problemskYour Python installation is compiled without thread support. Sounds and background music will be disabled.swarningsOKsYThe pysolsoundserver module was not found. Sounds and background music will be disabled.s Welcome to s#008200scolorsimagessprogresssupdate(sossmakedirssappsdnsconfigsmkdirspathsjoins savegamessfs DataLoadersargss dataloadersdirspluginss loadPluginss wm_commands opt_nosoundssyss executablesprogsnormpathsargv0sisfilesabspathsas commandlinesloadgamesMfxRootsPACKAGEstopscgetstop_bgs top_cursors loadOptionssEnvErrorsexs warn_threadswarn_pysolsoundserversNonesaudiosnamesopts sound_modesWin32AudioClientspysolsoundserversPysolSoundServerModuleClients startServersservers isinstancesdestroysAbstractAudioClientswm_groupswm_titlesVERSIONs wm_iconnames wm_minsizes wm_protocolswmDeleteWindowswinfo_screenwidthswinfo_screenheightswinfo_screendepthsswsshssds wm_withdraws MfxDialogsdsmins wm_set_iconsfindIconscolors tk_setPalettes option_addsprioritysclassesscslensgdbsgetGamesIdSortedByNames initCardsetsscardsetsgetscardset_managers getByNamesupdateCardbacksfatal_no_cardsetsstabletile_managersmanagersTilestiles tablecolorsfilenamesregisters initTilesstabletile_namesgetAllsbasenamesindexstabletile_indexs initSampless initMusics connectServersaudiodevssounds connectedsupdateSettingss music_managersmusicslistsmusic_playlists miscrandomsshufflesmsstringslowersremovesinsertsplayContinuousMusics progress_bgs loadImages1sprogress_imagessgimagesslogossressearchsplatformsIsthreadsstdoutsflushsupdatestitlesPysolProgressBarsintrosprogresss loadImages2s loadImages3s loadImages4s loadCardsetsreset(sappsargssfsdirs wm_commands opt_nosoundsprogsargv0sastopsexs warn_threadswarn_pysolsoundserversswsshssdsdscolorsprioritysclassesscscardsetsmanagerstilesmusicsmstitlesprogressspysol.pys pysol_initLs),,,E    %       &  ' -*    7 0 &      !                 * (3          6         csGDMEM|itj o$FM|iiGMt|inHM|iIM|itj o$JM|iiKMt|inLM|itj o$MM|iiNMt|inOM|itj oPMt|inQM|i }RMt|SMt}TM|tj o5UMyVM|iWn WMXMnXYMt|ndS(N( sappsaudiosNonesdestroysdestructs wm_withdrawscanvasstoolbarsmenubarstop(sappstopspysol.pys pysol_exitDMs*    c sLZM[Mt}\My>]Mt||}^M|djo _M|Sn`M|iWnaMtj o}bMdGHcMndMtj o}eM|i o fMngMt |i }hMt |ohM|dt |}niMt |i dtdjMdd|kMdd fd d }nXlMymMt|Wn nMoMnXpMdSdS( NisExiting on SIGINT.s: stitles internal errorstexts*Internal errror. Please report this bug: sstringssQuitsbitmapserror(s Applicationsapps pysol_initsargssrsmainloopsKeyboardInterruptsexs StandardErrorstopsstrs __class__sts MfxDialogsPACKAGEsds pysol_exit(sargssappsrsexstsdspysol.pys pysol_mainZMs.    csqMrMttd osMdt_ntMttd ouMtt_nvMttd owMdt_nxMtid djo;yMtid d jo zMd ttifGH{Md Snn|Mt ot t djpt }Mt d jo~Mt d dddfjo#Mdttt fGHMd SnMttid pttid oMdtfGHMd SnnMd ddjoMtdnMt|}M|SdS(Nsplatformsunknowns executablesdefpathsisjavais1.5.2s-%s needs Python 1.5.2 or better (you have %s)istkiis+%s needs Tcl/Tk 8.0 or better (you have %s)s wm_aspects tag_lowersQ%s: please update the Python-Tk bindings (aka Tkinter) to version 1.5.2 or betteri i s -1 % 13 != 12(shasattrssyssplatformsNones executablesossdefpathsversionsPACKAGEs __debug__slens tkversionsAssertionErrorstknamesstrsTkintersWmsCanvass Exceptions pysol_mainsargssr(sargssrspysol.pysmainqMs,$ +N(sPACKAGEs PACKAGE_URLsosssyssbundlesnameshasattrsplatformsversionsexits __builtin__sglobsmathsoperatorsresstringsstructstimestypess formattershtmllibs cStringIOsStringIOsUserDictsUserListsmacfssMACFSs ImportErrorsexs tracebacks print_excscPicklesPicklers UnpicklersUnpicklingErrorspicklesNonesthreadspysolsoundserversargvspathsasisdirsinsertswin32apispysolfreecellsolversTkintersCanvasstkColorChoosers tkFileDialogsTclErrorsVERSIONs VERSION_DATEs VERSION_MAJORs VERSION_MINORs VERSION_TUPLEs StringTypess StringTypes UnicodeTypesustrsindicesstranges range_lensreversesirangescountsexistssforallstruthsboolssgnsIOErrorsOSErrorserrorsEnvErrors ExceptionsSubclassResponsibilitysstaticsifelses merge_dictslatin1_to_asciishtmlentitydefs_islatin1_to_htmlshexifys getusernames gethomedirs getprefdirsclocksuclockssleepsusleepsdestructsStructs kwdefaultsKwStructsunpicklesspawnvsspawnvps __SOUND_MIXERsspawnSystemSoundMixersspawnSystemDisplaySettingssopenURLs PysolRandoms LCRandom64s LCRandom31sWHRandomsconstructRandomsSUITSsCOLORSsRANKSsACEsJACKsQUEENsKINGsANY_SUITs ANY_COLORsANY_RANKsNO_SUITsNO_COLORsNO_RANKs NO_REDEALsUNLIMITED_REDEALSsVARIABLE_REDEALSsCARDSETsIMAGE_EXTENSIONSsget_version_tuplesTimers DataLoaderscyclopssResourcesResourceManagersCSIs CardsetConfigsCardsetsCardsetManagersTiles TileManagersSamples SampleManagersMusics MusicManagersGIsGameInfoExceptionsGameInfos GameManagersGAME_DBs registerGamesloadGamesAbstractAudioClientsPysolSoundServerModuleClientsWin32AudioClients Misc__destroysCanvas__tag_binds Canvas__xviewsCanvas__xview_movetosCanvas__xview_scrolls Canvas__yviewsCanvas__yview_movetosCanvas__yview_scrolls Wm__wm_statesText__xview_movetosText__xview_scrollsText__yview_movetosText__yview_scrollsMiscsdestroystag_bindsxviews xview_movetos xview_scrollsyviews yview_movetos yview_scrollsWmswm_statesstatesTextsCanvasItem__bboxs Group__bboxsCanvasItem__binds Group__bindsCanvasItem__unbinds Group__unbindsCanvasItem__tkraisesCanvasItem__lowersGroup__tkraises Group__lowers CanvasItemsbboxsGroupsbindsunbindstkraiseslowersCallWrapper____call__s CallWrappers__call__stknames tkversionssplitsstrs_tkinters TK_VERSIONsmsmapsintstuples TK_DASH_PATCHs EVENT_HANDLEDsEVENT_PROPAGATEs CURSOR_DRAGs CURSOR_WATCHsCENTERs ANCHOR_CENTERsNsANCHOR_NsNWs ANCHOR_NWsNEs ANCHOR_NEsSsANCHOR_SsSWs ANCHOR_SWsSEs ANCHOR_SEsWsANCHOR_WsEsANCHOR_Es getFont_cachesgetFonts wm_withdraws wm_deiconifyswm_maps wm_set_iconscompiles__wm_get_geometry_reswm_get_geometrys setTransients makeToplevelsmakeHelpToplevels __getWidgetXYs__mfx_bindingss__mfx_wm_protocolssunbind_destroysafters after_idles after_cancels makeImages loadImages copyImages fillImages createImagesMfxCanvasGroups ImageItemsMfxCanvasImagesLines MfxCanvasLines RectanglesMfxCanvasRectangles CanvasTexts MfxCanvasTexts MfxCanvass BooleanVarsMfxCheckMenuItemsIntVarsMfxRadioMenuItemsTksMfxRoots_ToplevelDialogs MfxDialogsMfxExceptionDialogsMfxSimpleSlidersMfxSimpleEntrys MfxTooltipsMfxScrolledCanvassMfxScrolledTextsMfxReadonlyScrolledTexts DumbWriters tkHTMLWriters HTMLParsers tkHTMLParsers tkHTMLViewersDisplayTextDialogsEditTextDialogsPlayerOptionsDialogsDemoOptionsDialogsHintOptionsDialogsSoundOptionsDialogs AboutDialogs helpAboutshelpAboutSimples helpCreditsshelp_html_indexshelpHTMLsStatus_StatsDialogsPysolStatsFormattersPysolMenubarActionssPysolToolbarActionss _MfxToolbars PysolToolbars _MfxStatusbarsPysolStatusbarsPysolProgressBarsMenus MfxMenubarsMfxMenus PysolMenubarsMfxTreeBaseNodes MfxTreeLeafs MfxTreeNodesMfxTreeInCanvassSelectDialogTreeLeafsSelectDialogTreeNodesSelectDialogTreeDatasSelectDialogTreeCanvassSelectDialogPreviewCanvassSelectGameLeafsSelectGameNodesSelectGameDatasSelectGameTreeWithPreviewsSelectGameTreesSelectGameDialogsSelectGameDialogWithPreviewsSelectCardsetLeafsSelectCardsetNodesSelectCardsetDatasSelectCardsetByTypeDatasSelectCardsetTreesSelectCardsetByTypeTreesSelectCardsetDialogWithPreviews$SelectCardsetByTypeDialogWithPreviewsSelectTileLeafsSelectTileNodesSelectTileDatasSelectTileTreesSelectTileDialogWithPreviewsSingleGame_StatsDialogs"AllGames_StatsDialogScrolledCanvassAllGames_StatsDialogsFullLog_StatsDialogsSessionLog_StatsDialogs AbstractCards_HideableCard_1s_HideableCard_2s _HideableCards _OneImageCards_OneImageCardWithHideByConfigs _TwoImageCards_TwoImageCardWithHideItemsCardsImagesCardbacksImagessSubsampledImagess AtomicMoves AMoveMoves AFlipMovesATurnStackMovesNEW_ATurnStackMovesAUpdateStackMovesAUpdateStackModelMovesAUpdateStackViewMovesANextRoundMoves ASaveSeedMovesAShuffleStackMoves cardsFaceUps cardsFaceDownsisRankSequencesisAlternateColorSequencesisSameColorSequencesisSameSuitSequencesisAnySuitButOwnSequencesgetNumberOfFreeStackssgetPileFromStackssStacksDealRow_StackMethodssDealBaseCard_StackMethodss TalonStacksDealRowTalonStacksInitialDealTalonStacks OpenStacksAbstractFoundationStacksSS_FoundationStacksRK_FoundationStacksAC_FoundationStacksSequenceStack_StackMethodss BasicRowStacksSequenceRowStacks AC_RowStacks SC_RowStacks SS_RowStacks RK_RowStacksFreeCell_AC_RowStacksFreeCell_SS_RowStacksSpider_AC_RowStacksSpider_SS_RowStacksYukon_AC_RowStacksYukon_SS_RowStacksKingAC_RowStacksKingSS_RowStacksKingRK_RowStacks WasteStacksWasteTalonStacksFaceUpWasteTalonStacksOpenTalonStacks ReserveStacksInvisibleStacks StackWrappersWeakStackWrappersFullStackWrappers HintInterfaces AbstractHints DefaultHintsCautiousDefaultHintsKlondikeType_HintsYukonType_HintsFreeCellType_Hints GolfType_HintsSpiderType_HintsFreeCellSolverWrappersGames _LayoutStacksLayoutsKlondikes VegasKlondikesCasinoKlondikesKlondikeByThreessThumbAndPouch_RowStacks ThumbAndPouchsWhitehead_RowStacks Whiteheads SmallHarps Eastcliffs Easthavens Westcliffs WesthavensPasSeuls BlindAlleyssSomersetsCanisters AgnesSorelsEightTimesEights AchtmalAchtsBatsford_ReserveStacksBatsfords Stonewalls FlowerGardens KingAlbertsRaglansBrigades Jane_TalonsJanesAgnesBernauer_Talons AgnesBernauers GT_KLONDIKEsGT_SCOREsGT_GYPSYsGT_OPENs GT_RAGLANsGypsysGiant_FoundationsGiants Irmgard_TalonsIrmgardsDieKoenigsbergerin_TalonsDieKoenigsbergerinsDieRussische_FoundationsDieRussische_RowStacks DieRussischesMissMilligan_ReserveStacks MissMilligansNomads MilliganCells MilliganHarpsCarltons LexingtonHarps Brunswicks MississippisGriffonsBlockades GT_2DECK_TYPEs GT_CONTRIBs GT_ORIGINALsGT_YUKONsFortyThieves_Hints FortyThievessBusyAcessLimiteds Courtyards WaningMoonsLucassDeucessCoronas Quadrangles FortyAndEights LittleFortysStreetssMarias NumberTens RankAndFiles TripleLines RedAndBlacksZebrasIndian_RowStacksIndians MidshipmansNapoleonsExiles DoubleRails SingleRailsGT_FORTY_THIEVESsDiplomatsLadyPalksCongresssDoubleKlondikesDoubleKlondikeByThreess GargantuasBigHarpsStepssPictureGallery_HintsPictureGallery_FoundationsPictureGallery_TableauStacksPictureGallery_RowStacksPictureGallerys Braid_HintsBraid_FoundationsBraid_BraidStacksBraid_RowStacksBraid_ReserveStacksBraids LongBraids GT_NAPOLEONs Spider_HintsSpider_SS_FoundationsSpider_AC_FoundationsSpider_RowStacks RelaxedSpidersSpidersBlackWidow_RowStacks BlackWidowsGroundForADivorce_TalonsGroundForADivorcesGrandmothersGames SpiderettesBabySpiderettes WillOTheWisps SimpleSimonsRachelsScorpion_RowStacksScorpionsWaspsRougeEtNoir_RowStacks RougeEtNoirs GT_SPIDERs GT_RELAXEDsFreeCell_RowStacksFreeCellsRelaxedFreeCellsForeCells Stalactitess GT_FREECELLsBakersGame_RowStacks BakersGamesKingOnlyBakersGamesEightOffsSeahavenTowerssRelaxedSeahavenTowerssPenguinsEiffelTower_RowStacks EiffelTowersStrictEiffelTowersGT_PAIRING_TYPEsMatriarchy_WastesMatriarchy_TalonsMatriarchy_UpRowStacksMatriarchy_DownRowStacks MatriarchysCalculation_HintsBetsyRoss_FoundationsCalculation_FoundationsCalculation_RowStacks Calculations Hopscotchs BetsyRosss GT_1DECK_TYPEs Canfield_HintsCanfield_AC_RowStacksCanfield_SS_RowStacksCanfield_RK_RowStacksCanfieldsSuperiorCanfieldsRainfallsRainbows Storehouses ChameleonsDoubleCanfields AmericanToadsVariegatedCanfieldsEagleWing_ReserveStacks EagleWings GT_CANFIELDs Golf_Hints Golf_Talons Golf_Wastes Golf_RowStacksGolfs DeadKingGolfs RelaxedGolfsElevator_RowStacksElevatorsTriPeaks_RowStacksTriPeakssBlackHole_FoundationsBlackHole_RowStacks BlackHolesGT_GOLFsGrandfathersClock_HintsGrandfathersClocks Numerica_HintsNumerica_RowStacksNumericas LadyBettys GT_NUMERICAs Yukon_HintsYukonsRussianSolitairesOdessasAlaska_RowStacksAlaskasChineseDisciplinesChineseSolitairesQueeniesRushdikes RussianPointsAbacus_FoundationsAbacus_RowStacksAbacussCastlesInSpainsMartha_RowStacksMarthas BakersDozensSpanishPatiences GoodMeasures Cruel_TalonsCruelsGT_BAKERS_DOZENsFan_HintsFansScotchPatiencesShamrocks_RowStacks ShamrockssLaBelleLucie_Talons LaBelleLuciesSuperFlowerGardensThreeShufflesAndADraw_RowStacks"ThreeShufflesAndADraw_ReserveStacksThreeShufflesAndADrawsTrefoilsIntelligence_TalonsIntelligence_RowStacksIntelligence_ReserveStacks Intelligences GT_FAN_TYPEsBeleagueredCastleType_HintsStreetsAndAlleyssBeleagueredCastlesCitadelsFortress_RowStacksFortresssChessboard_FoundationsChessboard_RowStacks ChessboardsGT_BELEAGUERED_CASTLEsUnionSquare_FoundationsUnionSquare_RowStacks UnionSquaresWindmill_FoundationsWindmill_RowStacksWindmills Pyramid_HintsPyramid_StackMethodssPyramid_Foundations Pyramid_Talons Pyramid_WastesPyramid_RowStacksPyramidsRelaxedPyramidsThirteensPileOn_RowStacksPileOns Bristol_Hints Bristol_TalonsBristols BelvederesAcesUp_FoundationsAcesUp_RowStacksAcesUpsFortunessRussianAces_Talons RussianAcessPerpetualMotion_TalonsPerpetualMotion_FoundationsPerpetualMotion_RowStacksPerpetualMotions Montana_Hints Montana_TalonsMontana_RowStacksMontanas Spaces_TalonsSpacessBlueMoonsRedMoons GT_MONTANAsPasDeDeux_HintsPasDeDeux_WastesPasDeDeux_RowStacks PasDeDeuxsGT_SEPARATE_DECKSsRoyalCotillion_FoundationsRoyalCotillions OddAndEvensKingdomsAlhambra_WastesAlhambrasCarpetsOsmosis_FoundationsOsmosissPeeksMonteCarlo_HintsMonteCarlo_TalonsMonteCarlo_RowStacks MonteCarlosMonacosWeddings_TalonsWeddingss SimpleCarlos SimplePairssNeighbour_FoundationsNeighbour_RowStacks NeighboursFourteen_RowStacksFourteensNestor_RowStacksNestorsDerLetzteMonarch_FoundationsDerLetzteMonarch_RowStacksDerLetzteMonarch_ReserveStacksDerLetzteMonarchs RoyalEasts TamOShanters AuldLangSynesStrategy_FoundationsStrategy_RowStacksStrategysInterregnum_Foundations InterregnumsDoublets_FoundationsDoubletssSiebenBisAs_HintsSiebenBisAs_FoundationsSiebenBisAs_RowStacks SiebenBisAss Maze_RowStacksMazesDieBoeseSieben_TalonsDieBoeseSiebens Terrace_TalonsTerrace_AC_FoundationsTerrace_SS_FoundationsTerrace_RowStacksTerracesGeneralsPatiencesBlondesAndBrunettess FallingStars GT_TERRACEsPokerSquare_RowStacks PokerSquaresPokerShuffle_RowStacks PokerShuffles GT_POKER_TYPEsDerKatzenschwanzs DieSchlangesNapoleon_TalonsNapoleon_FoundationsNapoleon_RowStacksNapoleon_ReserveStacksNapoleon_SingleFreeCellsNapoleon_FreeCellsDerKleineNapoleonsDerFreieNapoleonsNapoleons FreeNapoleonsLarasGame_HintsLarasGame_TalonsLarasGame_RowStacksLarasGame_ReserveStacks LarasGamesSanibelsFlower_FoundationStacksFlowerClock_FoundationsGaji_FoundationsPagoda_FoundationsSamuri_FoundationsMatsuKiri_FoundationsGreatWall_FoundationsGreatWall_BuildStacksFourWinds_FoundationsFlower_OpenStacksFlowerClock_RowStacks Gaji_RowStacksMatsukiri_RowStacksOonsoo_RowStacksSamuri_RowStacksGreatWall_RowStacksFourWinds_RowStacksAbstractFlowerGames FlowerClocksGajisOonsoosPagodas MatsuKirisSamuris GreatWalls FourWindssrs GT_HANAFUDAsTowerOfHanoy_HintsTowerOfHanoy_RowStacks TowerOfHanoysHanoiPuzzle_RowStacks HanoiPuzzle4s HanoiPuzzle5s HanoiPuzzle6sGT_PUZZLE_TYPEsrangesHexADeck_FoundationStacksHexATrump_FoundationsHexADeck_OpenStacks Bits_RowStacksBytes_RowStacksHexAKlon_RowStacks BitsNBytessHexAKlons GT_HEXADECKsMemory_RowStacksMemory24sMemory30sMemory40sConcentration_RowStacks Concentrations GT_MEMORYs Pegged_HintsPegged_RowStacksPeggeds PeggedCross1s PeggedCross2s Pegged6x6s Pegged7x7sPeggedTriangle1sPeggedTriangle2s Wicked_TalonsImperialTrump_FoundationsPonytail_FoundationsTarock_OpenStacksTarock_AC_RowStacks Skiz_RowStacksPagat_RowStacksTrumpWild_RowStacksTrumpOnly_RowStacksExcuse_RowStacksWheelOfFortune_RowStacksPonytail_PonytailStacksPonytail_RowStacksPonytail_ReserveStacksCavalier_RowStacksNasty_RowStacksTarock_GameMethodssAbstractTarockGamesWheelOfFortunesImperialTrumpssPagatsSkizs FifteenPlussExcuses GrasshoppersDoubleGrasshoppersPonytailsCavaliersFiveAcessWickedsNastys GT_TAROCKsPysolScrolledCanvassOptionss StatisticssCommentss Applicationsfatal_no_cardsetss pysol_inits pysol_exits pysol_mainsmain(spysol.pys?+s     3          "                                     *   5   0                  [  }_1U;N  w>               !                      '           {'V\ ?h ,"\  &h{9O=G K"\C]4;cT ) #      5,           DTd  %  i4i         '    ($<  .! ;  5]        :9)  / /_ , D*4 #      $ &&   ".!"% 1 " 05 #()-  "=  #+--4 /((  ? 7A5E$$       .-#;5P- &&&    A&..(V ..: F      0!++$682"   &&&''T<!