- [T?csr+dZ,dZ.dkZdkZ0y 1eWn723dZ4eidjo5ddBZnnX7eed o8de_n9eid d joD:eid d jo);d eeifGH<ei dnn>y?dk Z @dk Z dk Z dk Z dkZdkZdkZdkZdkZAdkZdkZBd klZCdklZDdklZEeidjoFdkZdkZnWnaGej oRZHyIdkZeiWn JJnXKdeGHLei dnXNy Odkl Z l!Z!l"Z"Wn2Pej o#Qdk#l Z l!Z!l"Z"nXSe$Z%TyUdk%Z%WnVWe$Z%nXYe$Z&Ze%odei'dj o[ei(e$f\Z(Z)\y]xtei'dD]]bZ)^e)d djoH_e)dZ)`e)oei(i*e)oaei(i+de)nnqWbdk&Z&Wncde$Z&nXee(e_(f[([)nhe$Z,ieidjo-jykdk,Z,Wnlme$Z,nXnoe$Zre$Z-sytdk-Z-Wnuve$Z-nXxy+ydk.Z.dk/Z/dk0Z0dk1Z1Wnazej oRZ{y|dkZeiWn }}nX~deGHei dnXe.i2Z2dZ3dZ4dZ5dZ6ddfZ7yei8WnHyei9ei:fe_8Wnei9fe_8nXnXyei:Wne$e_:nXdZ;dZ<e$e$dZ=dZ>dZ?e$d Z@d!ZAd"ZBd#ZCe iDZEd$ZFeGeHeiIfZJd%eKfd&YZLd'ZMd(ZNdd)ZOd*ZPhaQd+ZRd,ZSd-ZTd.ZU e$d/ZVeiWZXeiYZZeid0joeiZXnd1Z[ d2fd3YZ\?d4Z]Cd5fd6YZ^Ydd7Z#bd8Z_mfd9Z`fd:Zafabdd;Zcd<Zdd=Zed>fd?YZfd@effdAYZgdBeffdCYZh$dDeffdEYZiDdFZj\dGdHdIdJfZk]dKdLfZl^dMdNdOdPdQdRdSdTdUdVdWdXdYf Zm_dZn`dZZoad[Zpbd\Zqcd]Zrdd]Zsed]Ztfd^Zugd^Zvhd^ZwidZxjd]Zykd_Zzld`Z{mdadbfZ|ndo eidjoodcdadbddfZ|pnqy reWnstdZnXudeZ}~dffdgYZ~dhfdiYZe$Zdje\fdkYZdlfdmYZqdnfdoYZdpe\fdqYZdrefdsYZdtefduYZmdvefdwYZtdxefdyYZvdzefd{YZ|d|efd}YZ~d~efdYZdefdYZdfdYZQdeKfdYZSde\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$a&@ dZ'^ defdYZ( dfdYZ) dfdYZ*edfdYZ+dfdYZ,de,e+fd YZ-d fd YZ.d e.fd YZ/dfdYZ0de.i1fdYZ2:de2fdYZ3Dde*fdYZ4UdfdYZ5de5fdYZ6de5fdYZ7defdYZ8#de6fdYZ9)d e7fd!YZ::d"fd#YZ;Od$e8fd%YZ<d&efd'YZ=d(e9fd)YZ>d*e:fd+YZ?d,e;fd-YZ@d.e<fd/YZAd0eAfd1YZBd2efd3YZCId4eCfd5YZDd6e9fd7YZEd8e:fd9YZFd:e;fd;YZGd<e;fd=YZHd>e<fd?YZId@e<fdAYZJ!dBefdCYZKdDeKfdEYZLdFe9fdGYZMdHe:fdIYZNdJe;fdKYZOdLe<fdMYZPdNefdOYZQdPefdQYZRdRefdSYZSdTefdUYZT/dVeTfdWYZU>dXeUfdYYZVJdZfd[YZWsd\eWfd]YZXd^eWfd_YZYeXZZdoedd`ddfjo eYZZndaeZfdbYZ[dce[fddYZ\deeZfdfYZ]dgeZfdhYZ^e^Z_e]Z_e\Z_e[Z_difdjYZ`dkfdlYZadmeafdnYZbdofdpYZcdqecfdrYZddsecfdtYZeduecfdvYZf#dwecfdxYZgOdyecfdzYZhcehZidehZjed{ecfd|YZkvd}ecfd~YZldecfdYZmdZndZodd]dZpdd]dZqdd]dZrdd]dZsdd]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+d efd YZ +d efd YZ+d efdYZ#+defdYZ/+defdYZ:+defdYZ@+defdYZE+defdYZN+defdYZf+defdYZj+defdYZ~+defd YZ+d!efd"YZ+d#efd$YZ+d%efd&YZ+d'e{fd(YZ+d)efd*YZ+eeded+eidd]+eed+ed,+eieiBdd+eed-ed.+eieiBdd+eed/ed0+eidd]+eed1ed2+eidd+eed3ed+eidd+eed4ed5+eidd]+eed6ed+eidd+eed7ed+eidd+eed8ed+eidd+eed9ed+eidd+eed:ed;+eidd+eed<ed=+eidd+eed>ed +eieiBdd+eed?ed +eieiBdd+eed@edA+eidd+eededB+eidd]+eedCedD+eidd+eedEed+eidd+eedFed+eidd+eedGedH+eieiBdd,eedIedJ,eieiBdd,eedKed,eieiBdd,eedLed!,eieiBdd,eedMed%,eidd,eedNedO ,eidd ,dPefdQYZ%,dRefdSYZ*,dTefdUYZ/,dVezfdWYZ8,dXefdYYZE,dZe{fd[YZG,d\efd]YZN,d^e~fd_YZY,d`efdaYZ^,dbefdcYZn,ddefdeYZu,dfefdgYZ,dhefdiYZ,djefdkYZ,dlefdmYZ,dnefdoYZ,dpefdqYZ,drefdsYZ,dtefduYZ,dvefdwYZ,dxefdyYZ,eededP,eidd,eedzedT,eidd,eed`edX,eidd,eed{ed|,eidd,eed}ed~,eieiBdd,dddddddZd[d\f,eeded,eidd,eededh,eieiBeiBdd,eeded,eidd,eeded,eidd,eededn,eidd,eeded,eidd,eededr,eidd,eededx,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-eidd`-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 .eede d .eidd.d efd YZ .d e~fd YZ .de}fdYZ.defdYZ/defdYZ/defdYZd/defdYZf/eed\edg/eiddh/eededi/eiddj/defdYZ|/de~fdYZ/defdYZ/d efd!YZ/d"efd#YZ/d$efd%YZ/d&eefd'YZ/d(efd)YZ/d*ezfd+YZ/d,efd-YZ/d.efd/YZ/d0efd1YZ/d2efd3YZ /d4efd5YZ!/d6efd7YZ"/d8efd9YZ#/d:eefd;YZ$/d<efd=YZ%0d>e%fd?YZ&0d@efdAYZ'0dBefdCYZ(:0eedZedD;0ei)ei*Bdd<0eed[ed$=0ei)dd>0eedEedF?0ei)dd@0eedGedHA0ei)ddB0eedIedJC0ei)ddD0eedKed0E0ei)ddF0eedLe dMG0ei)ddH0eedNe!dOI0ei)ddJ0eedPe"dQK0ei)ddL0eedRe%d<M0ei)ddN0eedSe&d>O0ei)ddP0eedTe(dUQ0eiddR0dVefdWYZ+b0dXefdYYZ,0dZe,fd[YZ-0d\e,fd]YZ.0d^e,fd_YZ/0eed e-d`0ei0ei*Bdd0eede,dX0ei0dd0eedae.d\0ei0dd0eedbe/d^0ei0dd0dcefddYZ10deefdfYZ20dge2fdhYZ30die3fdjYZ40dke3fdlYZ5 1dme5fdnYZ61doefdpYZ7H1eedqe2drI1ei0ddJ1eedse3dtK1ei0ddL1eedue4dvM1ei0ddN1eede5dwO1ei0ddP1eede6dxQ1ei0ei*BddR1eedye7doS1ei0ddT1dze}fd{YZ8\1d|efd}YZ9{1d~e9fdYZ:}1eede9d~1ei;dd1defdYZ<1defdYZ=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|4defdYZi4eedeid4eiHeiBdd4defdYZj4defdYZk4defdYZl4delfdYZm4eedeld4eineiBdd4dd4eedemd4eindd4defdYZo5defd YZp#5d epfd YZq(5d eqfd YZr35defdYZs85deqfdYZt:5depfdYZuE5deufdYZvG5depfdYZwQ5deqfdYZx[5dexfdYZyb5defdYZzf5defdYZ{j5d exfd!YZ|5eed"epd5eidd5eed#eqd$5eidd5eed%erd 5eidd5eed&etd5eidd5d'efd(YZ}5d)efd*YZ~5d+e}fd,YZ5d-e}fd.YZ5d/efd0YZ5d1efd2YZ5d3ezfd4YZ5d5e}fd6YZ6eed7e}d86eidd6eed9ed+6eidd6eed:ed; 6eidd 6eed<ed= 6eidd 6eed>ed? 6eidd6eed@ed56eidd]6dAefdBYZ6dCefdDYZ86dEefdFYZ;6dGefdHYZA6dIefdJYZC6dKezfdLYZi6dMefdNYZl6dOefdPYZn6dQefdRYZ6dSefdTYZ6dUefdVYZ6dWefdXYZ6dYefdZYZ6d[efd\YZ6d]eexfd^YZ6d_efd`YZ6eedaedC6eieiBdd6ddb6eedcedd6eieiBdd6eedeedI7eieiBdd7eedfedg7eieiBdd7eedhedi7eieiBdd7eedjedk7eieiBdd7eedledW7eieiBdd 7eedmed_ 7eidd 7dnefdoYZ 7dpefdqYZ+7drefdsYZ67dtefduYZI7dvefdwYZS7dxefdyYZn7dzefd{YZ}7d|efd}YZ7d~efdYZ7eeded7eieiBdd7eeded7eieiBdd7eededt7eieiBdd7eededx7eieiBdd7eeded~7eieiBdd7de~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:dhdNdYZN=eed?ed@O=ei;ddP=eedAedQ=ei;ddR=eedBed#S=ei;ddT=eedCedDU=ei;ddV=eedEedFW=ei;ddX=eedGed-Y=ei;ddZ=eedHed1[=ei;eiBdd\=eedIed5]=ei;eiBdd^=eedJedK_=eiHeiBdd`=dLefdMYZ=eedNedO=eiHdd=dPefdQYZ=dRefdSYZ=dTefdUYZ=dVefdWYZ=dXefdYYZ=dZefd[YZ=d\efd]YZ>eed^ed_>eindd>eed`eda>eindd>eedbedX>eindd>eedced\>eindd>dde~fdeYZ>dfefdgYZR>eedhedfS>eiHddT>diefdjYZf>dkefdlYZo>dmefdnYZ~>doefdpYZ>dqefdrYZ>dsefdtYZ>eeduedv>eidd>dddddddZd[d\f>eedweds>eieiBdd>dhdNd<>dxefdyYZ>dzefd{YZ ?eed|ed} ?eidd ?dddddddZd[d\f ?d~efdYZ?defdYZ?defdYZ*?defdYZD?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/fdYZ7GDdZ8MDe8d e0d ei9eiBddNDe8d e1dei9eiBddODe8d e2dei9ddPDe8d e3dei9ddQDe8de4dei9eiBddRDe8de5dei9ddSDe8de6dei9ddTDe8de7dei9ddUD[8VDdefdYZ:XDdefdYZ;aDdefdYZ<zDde;fdYZ=Dde<fdYZ>Dde>fdYZ?Dd e>fd!YZ@Deed"e<d#DeiAddDd$dfdeBdDeed%e>d&DeiAddDd$dfdeBdDd'd(Deed)e?d*DeiAddDd$dfdeBd Dd'd(Deed+e@d,DeiAddDd$dfdeBdDd'd(Dd-efd.YZCDd/eCfd0YZDDd1e}fd2YZEDd3efd4YZFDd5efd6YZGDd7efd8YZHDd9efd:YZIEd;efd<YZJ6Eeed=eId>7EeiKdd8Ed$eBddeBdd?eBd9Eeed@eJdA:EeiKdd];Ed$eBddeBdd?eBd|iD+]-},|ii| o-t|nqW.|ii|dS(N(sdictskeysskeys_s__dict__shas_keysAttributeErrorsupdate(s_sdictskey((spysol.pysupdate*s  cs/0x|iiD0]}1t|}2|tijo3g|i||SdS(N(sStructscs_s __class__s__dict__supdate(s_sc((spysol.pyscopy:s (s__name__s __module__s__init__s__str__saddattrsupdatesclearscopy(((spysol.pysStruct s      c sO?@xB|iD@]1\}}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_sseedsysxsz((spysol.pys _unpackSeed;s29///(s__name__s __module__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(sssgameidssssseedsysxsz((spysol.pysconstructRandomDs.!  # ]$!sClubsSpadesHeartsDiamondsblacksredsAces2s3s4s5s6s7s8s9s10sJacksQueensKingi i i ii?Biscardsets.gifs.ppms.pngs.jpgcsuvtid|}w| p |d oxdfSnyti|dd}ztd|}{| p |d o|dfSn}ttt|SdS(Ns[^\d\.]is.cs z|djS(Ns(sx(sx((spysol.pyszs( sressplitsversion_stringsvsstringsfilterstuplesmapsint(sversion_stringsv((spysol.pysget_version_tupleussTimercs>~tZddZdZdZdZRS(NscsZ||_ti|_tidjoti|_n|i|_dS(Nsnt(smsgs_stimesclocksossnamesstart(s_smsg((spysol.pys__init__s  cs|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__name__s __module__s__init__sresetsgets__repr__(((spysol.pysTimer~s   s DataLoadercsktZgdZeddZedZedZeedZedZRS(Nc s/t|_t|tijo|f}nto&t|titi fjpt |}t i i |\}} | ot i}n|i||it i i|dt idjont idjont idjondo t idjoJx@tdfD]/} x#ddd fD]}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 nXqkWqOWng|_ x|D]}| o qny^t i i|} | o!| |i j ot i i| o|i i| nWntj o nXqWx|i D]}d} xw|D]l}yGt i i||}t i i |o| d} nPWntj o nXqgW| t!|jo||_PnqKWt i"t#|dt#|dS(Nsdatasposixsntsmaciss@prefix@s /usr/locals/usrs share/pysols lib/pysolsshare/games/pysolslib/games/pysolsgames/share/pysolsgames/lib/pysolis: DataLoader could not find ($sNones_sdirstypes filenamesstypess StringTypes __debug__s TupleTypesListTypesAssertionErrorspathsosssplitsargv0sheadstailscurdirsappendsjoinsnamesVERSIONsvsprefixsisdirsEnvErrorspsnormpathsnpsnsfilenamesfsisfileslenserrorsstr( s_sargv0s filenamesspathsfilenamesfsheadspsprefixstailsvsnpsn((spysol.pys__init__st 0    """""*   .       ics|tjodf}n*t|tijo|f}nx_|D]T}tii|i||}tii |}||o |SnqVW|o0tid|d|idt|ntSdS(NssDataLoader could not find s in s (ssubdirssNonestypestypess StringTypesdirsosspathsjoins_sfilenamesfsnormpathsfuncsdo_raiseserrorsstr(s_sfuncsfilenamessubdirssdo_raisesfsdir((spysol.pys __findFiles  0cs#|itii||SdS(N(s_s_DataLoader__findFilesosspathsisfilesfilenamessubdirs(s_sfilenamessubdirs((spysol.pysfindFilescsxKtD]@}|itii|||d}|o |Snq Wti d|d|i dt |dS(Nis DataLoader could not find image s in s ( sIMAGE_EXTENSIONSsexts_s_DataLoader__findFilesosspathsisfilesfilenamessubdirssfserrorsdirsstr(s_sfilenamessubdirssextsf((spysol.pys findImages  % csr| otit}ntii|\}}| o|d}n|i ||SdS(Ns.xbm( sfilenamesstringslowersPACKAGEsosspathssplitextsrootsexts_sfindFilessubdirs(s_sfilenamessubdirssextsroot((spysol.pysfindIcons   cs#|itii||SdS(N(s_s_DataLoader__findFilesosspathsisdirsfilenamessubdirs(s_sfilenamessubdirs((spysol.pysfindDirs( s__name__s __module__s__init__sNones_DataLoader__findFilesfindFiles findImagesfindIconsfindDir(((spysol.pys DataLoaders < sResourcecs#tZdZdZRS(Nc skt|dddddddddddd }tti|f|idS( Nsnamessfilenamesbasenamesabsnamesindexiserrori(sKwStructskwsapplysStructs__init__s_sgetKw(s_skw((spysol.pys__init__s      cs tit|iSdS(N(sstringslowerslatin1_to_asciis_sname(s_((spysol.pys getSortKeys(s__name__s __module__s__init__s getSortKey(((spysol.pysResources  sResourceManagercstZdZdZdZdZdZdZdZdZ d Z d Z !d Z )d Z >ed 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 getSelectedscsKto.d|jot|ijnpt||_dS(Ni(s __debug__sindexslens_s_objectssAssertionErrors _selected_key(s_sindex((spysol.pys setSelecteds8cst|iSdS(N(slens_s_objects(s_((spysol.pyslenscs!to|idjptto(|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(sitem((spysol.pyss(s_s_objects_by_namesNonesmaps_objectsslssortstuple(s_sl((spysol.pysgetAllSortedByNames  "cs!"yf#|oX$tii|}%|otii|o ||j o&|i|nnWn'tj o }(nXdS(N( sdirsosspathsnormpathsisdirsresultsappendsEnvErrorsex(s_sresultsdirsex((spysol.pys_addDir!s +c sk)*t}+z,ti||dt}-ti|\}} } .xt | D.]}/y"0ti ||\} }}Wn12PnX3| p| o 4qXn5|djot|tijoF6x<ti|tiD6]"} 7|i|ti| qWnqXWWd89|tj o+:y;ti|Wn <=nXnXdS(Nii(sNoneskswin32apis RegOpenKeyExshkeyssubkeysKEY_READsRegQueryInfoKeysnsubkeyssnvaluesstsrangesis RegEnumValueskeysvaluesvtypestypestypess StringTypesstringssplitsosspathsepsds_s_addDirsresultsstrips RegCloseKey( s_sresultshkeyssubkeysvtypesisksnsubkeyssvaluesdstskeysnvalues((spysol.pys_addRegistryKey)s,  " & ,c sQ>?t|tijo@|f}nAg}B|oUCxKtiti i |dti DC]"}D|i|ti|qgWnEx}|ii|ii|iifDE]W}F| o GqnHtii|}I| ptii| o JqnKx|DK]}LyM|ddjoNtiitii||d }O|i||Pti|d} Q| iRx$| DR]}S|i||qWn#U|i|tii||WnVtj o }WnXqWqWX|i djoYdG|G|GdG|GHnZ|SdS(Nsis-*is getSearchDirss->(!stypessearchstypess StringTypesresultsenvsstringssplitsossenvironsgetspathsepsds_s_addDirsstripsapps dataloadersdirsdnsmaintsconfigspathsnormpathsisdirsssjoinsglobsglobdirsssortsEnvErrorsexsdebug( s_sappssearchsenvsresultsdsssdirsexsglobdirs((spysol.pys getSearchDirs>s>  ( $%     (  &c sm[\t o ]gSn^ddf}_tdf}`t|tijoa|f}nbg}cx|Dc]} dx|Dd]}ex|De]}fd|t | |f} gtt| } hti| d} ixDttfDi]3}jyk|i||| Wn lmnXqWqWqWqsWn|idjoodG|GdG|GHnp|SdS(NsMarkus OberhumerssSoftwares\isgetRegistryDirss->(swin32apisvendorssVERSIONsversionsstypes categoriesstypess StringTypesresultsversionsvendorscategorysPACKAGEstsfiltersNonesstringsjoinssubkeysHKEY_CURRENT_USERsHKEY_LOCAL_MACHINEshkeys_s_addRegistryKeysappsdebug( s_sapps categoriessvendorsresultscategorysversionsshkeysvendorssversionstssubkey((spysol.pysgetRegistryDirs[s2       (s__name__s __module__s__init__s getSelecteds setSelectedslensregistersgets getByNames getByBasenamesgetAllsgetAllSortedByNames_addDirs_addRegistryKeysNones getSearchDirssgetRegistryDirs(((spysol.pysResourceManagers            sCSIcs5qtZrdZsdZtdZudZvdZwdZxdZydZ zdZ {dZ |dZ }dZ ~dZd Zhd d<d d<d d<d d<dd<dd<dd<dd <d?d@<dAdB<dCdD}x2|iD]$}|id|d|fq/WqWx2|iD]$}|id|ddfqkWt ot ||i jpt |SdS(Ns%02d%sisz( snamess_ssuitsssuitsrankssranksappendstrumpsstrumps __debug__slensncardssAssertionError(s_srankstrumpssuitsnames((spysol.pysgetFaceCardNamess   & "'c s[|i}g}|i|if\}} t|t| f\}} |djp | djo|d dfSn |djo t | d} n ddf\}} xt d|t |||D ][} xOt | D ]>} | t|i|}|i||t|qWqW|| fSdS(Niiiii(s_sgetFaceCardNamessnamesspnamessranksssuitsslenslrslssmins low_rankss high_rankssrangesrankssuitsindexsappend( s_sindexsrankspnamessrankss high_rankss low_ranksslrsnamesssuitssuitssls((spysol.pysgetPreviewCardNamess  !$  &cst|tijo0||ijo|ii|}nnt|tijo|t |i|_n|i|i|_dS(N( stypesbacknamestypess StringTypes_s backnamessindexs backindexsIntTypeslen(s_sbacknames backindex((spysol.pysupdateCardbacks (s__name__s __module__s__init__sgetFaceCardNamessgetPreviewCardNamessNonesupdateCardback(((spysol.pysCardsets   sCardsetManagercs/tZdZ 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_scsss((spysol.pys_check sR            csTKL|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^])}_|ii|d d|i|]sics`tii|S(N(sCSIs NATIONALITYshas_keyss(ss((spysol.pys`sidcsdtii|S(N(sCSIsDATEshas_keyss(ss((spysol.pysds('s_s_checkscsslensranksssuitsstrumpssncardssnamessissizesCARDWsCARDHsCWsCHsCSIs SIZE_TINYs SIZE_SMALLs SIZE_MEDIUMs SIZE_LARGEs SIZE_XLARGEsstylesskeysstuplesfiltersssregistered_stylessgets nationalitiessregistered_nationalitiessyearsdatessregistered_datesstypesregistered_typessregistered_sizessupdateCardbacksResourceManagersregister(s_scssCHskeyssssCW((spysol.pysregisterKsF /( ! '! '! '## (s__name__s __module__s__init__s_checksregister(((spysol.pysCardsetManagers   +sTilecsmtZndZRS(Nc sGnot|pdtqdd}stti|f|idS(Nscolors text_colors#000000(sKwStructskwsNonesapplysResources__init__s_sgetKw(s_skw((spysol.pys__init__ns  (s__name__s __module__s__init__(((spysol.pysTilems s TileManagercsttZuRS(N(s__name__s __module__(((spysol.pys TileManagerts sSamplecsvtZwdZRS(Nc s>wxt|ydd}{tti|f|idS(Nsvolumei(sKwStructskwsapplysResources__init__s_sgetKw(s_skw((spysol.pys__init__ws (s__name__s __module__s__init__(((spysol.pysSamplevs s SampleManagercs|tZ}RS(N(s__name__s __module__(((spysol.pys SampleManager|s sMusiccs~tZRS(N(s__name__s __module__(((spysol.pysMusic~s s MusicManagercstZRS(N(s__name__s __module__(((spysol.pys MusicManagers sGIcOsu tZeiZeiZeiZei Z ei Z ei ZeiZeiZeiZdZdZdZdZdZdZdZdZd Zd Zd Zd Z d Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6dd >Z7dd>Z8dd>Z9dd>Z:dd>Z;dd>Z<dd>Z=dd>Z>dd>Z?dd>Z@dd>ZAd#ed$fd%ed&fd'ed(fd)ed*fd+ed,fd-ed.fd/e d0fd1e!d2fd3e$d4fd5e(d6fd7e*d8fd9e,d:fd;e-d<fd=e0d>fd?e2d@fdAe3dBfdCe5dDfdEe6dFfdGedHfdIedJfdKedLfdMedNffZBdOedPfdQe"dRfdSe#dTfdUe&dVfdWe)dXfdYe+dZfd[e'd\fd]e.d^fd_e/d`fdae4dbff ZCdce<e"e#e)e+ee4fddfdee<e)e+efdffdQe<e"dgfdSe<e#dhfdae<e4diffZDdce9e"e#e)e+ee4fdjfdee9e)e+efdkfdQe9e"dlfdSe9e#dmfdae9e4dnffZEhdod<dpd!<dqdr<dsdt<dudv<dpdw<dxdy<dzd{<d|d}d?ffd@dddAdBdCdDffdEdFfffZH(dd"dddddd&dqg ZI)ddd d dd ddddddddddddddgZJ-dddd d d dddd dddxdddqgZK1eLdGZMRS(HNiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!sBaker's Dozen typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssBeleaguered Castle typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Canfield typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssFan typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssForty Thieves typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss FreeCell typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Golf typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Gypsy typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Klondike typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Montana typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Napoleon typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Numerica typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Pairing typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Raglan typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Simple gamescs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Spider typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Terrace typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Yukon typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssOne-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssTwo-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssThree-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssFour-Deck gamescs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssDashavatara Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Hanafuda typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssHex A Deck typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Matrix typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssMughal Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysssNavagraha Ganjifa typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Memory typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Poker typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Puzzle typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss Tarock typecs|ii|jS(N(sgissis game_typesgt(sgisgt((spysol.pysss French typecs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysss Ganjifa typecs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscs$|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.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.10iminiritiuiviwixiii{i|i}is3.20iiiiiiiiiiiiiiiZi[i\i]i^i_i`s3.21iis3.30iiiiiiis3.40iiis4.00iiiiiiiis4.20iiiiiiiiiiiiiis4.30iiiiiis4.41iiiEiDiCiBiAi@ii>iii;i:is4.60iiiis4.70ics12x|iD2]\}}3td|}4d|t|fGH5x|D5]}6tot|t i jpt 7|i i |o$8|GHtodp t |n9|o|i | o$:|GHtodp t |nqWWqW;g}<x\|iD<]N\}}=td|}>d|t|t|t|fGH?x|D?]}@tot|t i jpt A|i i |o$B|GHtodp t |nC||jo$D|GHtodp t |nE|o|i | o$F|GHtodp t |nqxWG|it|qWHdGt|GdGHI|o{J|i}Kt|d|}Lt|}Mx!|DM]}N|i|qWO|oPd G|GHnndS( Ncs 3|djS(Ni(sid(sid((spysol.pys3ss%-20s: %d gamesics =|djS(Ni(sid(sid((spysol.pys=ss%s: %3d games, %3d totalstotal:sgamescsK|i|idjS(Ni(smsgetsidsplugin(sidsm((spysol.pysKssWARNING: games without version:(s_sGAMES_BY_COMPATIBILITYskeysgamessfilterslensids __debug__stypestypessIntTypesAssertionErrorsPROTECTED_GAMESsgetsmanagers all_gamessGAMES_BY_PYSOL_VERSIONsextendslistsgetGamesIdSortedByIdsgsremove(s_smanagers all_gamessgsgamesskeysid((spysol.pysassertGI1sH  '$,  + '$$(   (Ns__name__s __module__sCSIs 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 Z&$E9sGameInfoExceptioncsQtZRRS(N(s__name__s __module__(((spysol.pysGameInfoExceptionQs sGameInfoc s;StZThdeeededfedZRS(Niii c 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"d t| jo d jn oit|d njtii|okt|d t|nlxtitiftitiftitiffDl]h\}}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|dddS( Niismacii?Bs: invalid game ID is: invalid number of decks iis: invalid game names: protected game ID i s game_types game_flagssdeckssredealssncardssids gameclasssnames short_namesaltnamesscategoryssuitssranksstrumpsssisrules_filenamesplugini(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_filenames game_flagssncardssgi_sisfsl((spysol.pys__init__Tsf'      ""07" '(s__name__s __module__sNonesranges__init__(((spysol.pysGameInfoSs s GameManagercswtZdZdZdZdZdZdZdZdZ d Z RS( 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_sgameid((spysol.pys setSelecteds$cs|ii|SdS(N(s_s_GameManager__all_gamessgetskey(s_skey((spysol.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$|iD]}||i |scs |dS(Ni(sitem(sitem((spysol.pysscs |dS(Ni(sitem(sitem((spysol.pyss(s_s_GameManager__games_by_namesNonesl1sl2sl3s_GameManager__gamessitemssidsgisstringslowerslatin1_to_asciisnamesappends short_namesaltnamessnssortstuplesmaps!_GameManager__games_by_short_names_GameManager__games_by_altname(s_snsl2sl3sl1sidsgisname((spysol.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__name__s __module__s__init__s getSelecteds setSelectedsgetsregistersgetGamesIdSortedByIdsgetGamesIdSortedByNamesgetGamesIdSortedByShortNames#getGamesTuplesSortedByAlternateName(((spysol.pys GameManagers        csti||SdS(N(sGAME_DBsregistersgameinfo(sgameinfo((spysol.pys registerGamescsM|t_tidjodSnt|ttdS(Nsnt(spluginsGAME_DBsloading_pluginsossnamesexecfilesfilenamesglobals(smodnamesfilenamesplugin((spysol.pysloadGames  sAbstractAudioClientcs%tZdZdZdZdZdZ dZ dddd Zd Z %d Z .dddd Z >d Z GdZ IdZKdZMdZOdZQdZSdZUdZWdZYdZ[dZRS(Ncsst|_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_sapp((spysol.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 iics  |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_snamesprioritysloopsvolumesobj((spysol.pys playSample s /      csy|itjo dSny |iWn%!"to"tinnX#d|_$d|_dS(Nii(s_saudiodevsNones _stopSampless tracebacks print_excssample_prioritys sample_loop(s_((spysol.pys stopSampless   csy%&|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_sbasenamesprioritysloopsvolumesobj((spysol.pys playMusic.s /      csy>?|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_snamesprioritysloop((spysol.pys _playSampleKscs MNdS(N((s_((spysol.pys _stopSamplesMscsOP|idS(N(s_s _stopSamples(s_((spysol.pys_stopSamplesLoopOscsQRdSdS(Ni((s_snamesprioritysloopsvolume((spysol.pys _playMusicQscs STdS(N((s_((spysol.pys _stopMusicSscsUVdSdS(Ni((s_((spysol.pys getMusicInfoUscs WXdS(N((s_s music_list((spysol.pysplayContinuousMusicWscs YZdS(N((s_((spysol.pys playNextMusicYscs [\dS(N((s_((spysol.pysupdateSettings[s(s__name__s __module__s__init__s__del__s startServers connectServersdestroysstopAlls playSamples stopSamplessstopSamplesLoops playMusics stopMusics_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(((spysol.pysAbstractAudioClients,               sPysolSoundServerModuleClientcs]tZ^dZgdZidZpdZrdZudZwdZydZ |d Z ~d Z d Z d Z d ZRS(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_scmd((spysol.pyscmdgscsfij|id}k|djo ldSnmdo |iion|idnodSdS(Ns protocol 6isdebug 1i(s_scmdsrsappsdebug(s_sr((spysol.pys_connectServeris  cspq|iidS(N(s_saudiodevsexit(s_((spysol.pys_destroypscs1rs|id|d|||ftdSdS(Nsplaywav '%s' %d %d %d %dii(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolume((spysol.pys _playSamplers#csuv|iddS(Nsstopwav(s_scmd(s_((spysol.pys _stopSamplesuscswx|iddS(Ns stopwavloop(s_scmd(s_((spysol.pys_stopSamplesLoopwscs1yz|id|d|||f{dSdS(Nsplaymus '%s' %d %d %d %dii(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolume((spysol.pys _playMusicys#cs|}|iddS(Nsstopmus(s_scmd(s_((spysol.pys _stopMusic|scs/~|io|iiSndSdS(Ni(s_saudiodevs getMusicInfo(s_((spysol.pys getMusicInfo~s cs|itjp|i o dSnyqd}xN|D]C}|io0|id|i|i d||i fnqEW|idWn%t ot i nnXdS(Ni?Bsqueuemus '%s' %d %d %d %dis startqueue( s_saudiodevsNonesappsloops music_listsmusicsabsnamescmdsindexsvolumes tracebacks print_exc(s_s music_listsmusicsloop((spysol.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_smss((spysol.pysupdateSettingss  (s__name__s __module__s startServerscmds_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(((spysol.pysPysolSoundServerModuleClient]s           sWin32AudioClientcs/tZdZdZdZRS(Ncs]y.dk}||_~d|_Wn"t|_t|_nXdS(Ni(swinsounds_saudiodevsserversNone(s_swinsound((spysol.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_sfilenamesprioritysloopsvolumesflagssa((spysol.pys _playSamples !  cs9|i}|i|iB}|it|dS(N(s_saudiodevsas SND_NODEFAULTs SND_PURGEsflagss PlaySoundsNone(s_sasflags((spysol.pys _stopSampless (s__name__s __module__s startServers _playSamples _stopSamples(((spysol.pysWin32AudioClients  csn|itj oTx>|iD]0}y|ii|Wn nXq#Wt|_ndS(N(s_s _tclCommandssNonesnamestks deletecommand(s_sname((spysol.pys Misc__destroys  cs,|i|id|f|||SdS(Nsbind(s_s_binds_wstagOrIdssequencesfuncsadd(s_stagOrIdssequencesfuncsadd((spysol.pysCanvas__tag_bindscs| o&|i|ii|idSn|ddjo|it|dSn:|ddjo%|it |d|dSndS(Nsxviewismovetoisscrolli( sargss_s _getdoublesstkscalls_ws xview_movetosfloats xview_scrollsint(s_sargs((spysol.pys Canvas__xviews  &cs8t|d}|ii|idd|SdS(Nf0.0sxviewsmoveto(smaxsfractions_stkscalls_w(s_sfraction((spysol.pysCanvas__xview_movetoscs|djoG|i|ii|id}|ddjo dSnn|ii|idd||SdS(Nisxviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsv((spysol.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_sargs((spysol.pys Canvas__yviews  &cs8t|d}|ii|idd|SdS(Nf0.0syviewsmoveto(smaxsfractions_stkscalls_w(s_sfraction((spysol.pysCanvas__yview_movetoscs|djoG|i|ii|id}|ddjo dSnn|ii|idd||SdS(Nisyviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsv((spysol.pysCanvas__yview_scrolls $cs&|iidd|i|SdS(Nswmsstate(s_stkscalls_wsnewstate(s_snewstate((spysol.pys Wm__wm_statescs&|ii|idd|SdS(Nsxviewsmoveto(s_stkscalls_wsfraction(s_sfraction((spysol.pysText__xview_movetoscs)|ii|idd||SdS(Nsxviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhat((spysol.pysText__xview_scrollscs&|ii|idd|SdS(Nsyviewsmoveto(s_stkscalls_wsfraction(s_sfraction((spysol.pysText__yview_movetoscs)|ii|idd||SdS(Nsyviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhat((spysol.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_ssequencescommandsadd((spysol.pysCanvasItem__bindscs&|ii|i|||SdS(N(s_scanvasstag_bindsidssequencescommandsadd(s_ssequencescommandsadd((spysol.pys Group__bindscs#|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncid((spysol.pysCanvasItem__unbindscs#|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncid((spysol.pys Group__unbindscs |ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethis((spysol.pysCanvasItem__tkraisescs |ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthis((spysol.pysCanvasItem__lowerscs |ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethis((spysol.pysGroup__tkraisescs   |ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthis((spysol.pys Group__lower scs@|iot|i|}nt|i|SdS(N(s_ssubstsapplysargssfunc(s_sargs((spysol.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(snamescardwskeysfont((spysol.pysgetFont3s.   csLM|idS(N(swindows wm_withdraw(swindow((spysol.pys wm_withdrawLscsNOtidjotddddfj}P|oDQyR|iS|iWnTtij o UnXnV|i dS(Nsntiii( sossnames tkversionsneed_fixswindows wm_iconifysupdate_idletaskssTkintersTclErrors wm_deiconify(swindowsneed_fix((spysol.pys wm_deiconifyNs+   cs\WX|idjo?Y|o tidjoZ|idn\t|ndS(Nsiconicsntszoomed(swindowswm_states maximizedsossnames wm_deiconify(swindows maximized((spysol.pyswm_mapWscs\]^| o _dSn`tidjo,a|id|b|id|ndS(Nsposixs@(sfilenamesossnameswindows wm_iconbitmaps wm_iconmask(swindowsfilename((spysol.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(swidthsheightsfillsoutlinesimage((spysol.pys createImages $$ sMfxCanvasGroupcsAtZedZ!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_sargsskw((spysol.pys__init__:s        cs#DEtii||||SdS(N(sTkintersCanvass_creates_sitemTypesargsskw(s_sitemTypesargsskw((spysol.pys _x_createDscscFGtii||||}H|io*I|i i |i d||idnJ|SdS(Nsloweri( sTkintersCanvass_creates_sitemTypesargsskwsids_MfxCanvas__topsstkscalls_w(s_sitemTypesargsskwsid((spysol.pys_createFs *csjKL|tjo|io*M|ii|id||idn O|ii|id||dS(Nslowerisraise(s aboveThissNones_s_MfxCanvas__topsstkscalls_wsid(s_sids aboveThis((spysol.pys tag_raiseKs*csjPQ|tjo|io*R|ii|id||idn T|ii|id||dS(Nsraiseislower(s belowThissNones_s_MfxCanvas__tilesstkscalls_wsid(s_sids belowThis((spysol.pys tag_lowerPs*cs?UV|id|d|W|iddd||fdS(Nswidthsheights scrollregioni(s_sconfigswidthsheight(s_swidthsheight((spysol.pyssetInitialSizeUscsXYg|_Zxd|iiDZ]P}[to||ij pt\t|i|]|i|i q"W^to|ihjptdS(N( s_s _text_itemssitemsskeyssids __debug__s_MfxCanvas__tilessAssertionErrorsunbind_destroysdelete(s_sid((spysol.pysdeleteAllItemsXs  "cs_`t|iditioda|id}bxHt t |iDb].}c|i|ii |jo d|SnqNWndf|i dd}gxHt t |iDg].}h|i|ii|jo i|SnqWjdSdS(Niscurrentswithtagi(s isinstancesstackscardssitemsCanvassGroups_sgettagsscurrentsrangeslensistagsfindsid(s_sstackseventscurrentsi((spysol.pysfindCard_s   cstkl|tjp |itjom|id}nt|tij p!|ddjpt |djo odSnpg}qxGdddfDq]3}r|i t ti|||d!d qWsd |dd |dd |dd }tddf|dj}nu|i|jo@v||_wx*|iDw]}x|id|iqIWndS(Nsbgis#iiiiiif0.212671f0.71516000000000002f0.072168999999999997is#000000s#fffffff0.29999999999999999sfill(scolorsNones_s_MfxCanvas__tileimagescgetscstypestypess StringTypeslensvsisappendsintsstringsatois luminances _text_colors _text_itemssitemsconfig(s_scolors luminancesitemsiscsv((spysol.pys setTextColorks =   1-  c syzy@{|ot|tijo|td|dd}nWn }tij o~dSnX||ijo dSnx$|i D]}|i |qWg|_ ||_|t jo dSn|i |if\}}t|id}t|id}xtd|d|D]t}xhtd|d|D]M}|id||d|dd }|i||i i|qrWqOWdSdS( Nsfilesditheriiiisimagesanchorsnw(simagestypestypess StringTypes loadImagesTkintersTclErrors_s_MfxCanvas__tileimages_MfxCanvas__tilessidsdeletesNoneswidthsheightsiwsihsmaxswinfo_screenwidthsswswinfo_screenheightsshsrangesxsys _x_creates tag_lowersappend( s_simagesswsiwsihsshsysxsid((spysol.pyssetTileys2        !  $ic sy:|ot|tijotd|}nWn tij odSnXt|i djo||i djo dSnx$|i D]}|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_simagescwschsihsiwsysxsid((spysol.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 needcleanupscmdsfuncid((spysol.pys_binds$csLti}t|d|_t|d|_|fSdS(Nii(sTkintersEventsesintsargssxsy(s_sargsse((spysol.pys _substitutes(s__name__s __module__s__init__s _x_creates_createsNones tag_raises tag_lowerssetInitialSizesdeleteAllItemssfindCards setTextColorssetTiles setTopImages_binds _substitute(((spysol.pys MfxCanvas9s       sMfxCheckMenuItemcs&tZedZdZRS(Ncstii|dS(N(sTkinters BooleanVars__init__s_(s_smenubarspath((spysol.pys__init__scs| p |djo d}nto;t|tijod|jo djnpttii||dS(Nsfalseii( svalues __debug__stypestypessIntTypesAssertionErrorsTkinters BooleanVarssets_(s_svalue((spysol.pyssets E(s__name__s __module__sNones__init__sset(((spysol.pysMfxCheckMenuItems sMfxRadioMenuItemcs&tZedZdZRS(Ncstii|dS(N(sTkintersIntVars__init__s_(s_smenubarspath((spysol.pys__init__scsQto*t|tijo d|jpttii||dS(Ni( s __debug__stypesvaluestypessIntTypesAssertionErrorsTkintersIntVarssets_(s_svalue((spysol.pyssets4(s__name__s __module__sNones__init__sset(((spysol.pysMfxRadioMenuItems sMfxRootcswtZdZdZdZdZdZdZdZdZ d Z RS( Nc s/ttii|f|t|_dS(N(sapplysTkintersTks__init__s_skwsNonesapp(s_skw((spysol.pys__init__scs||_dS(N(sapps_(s_sapp((spysol.pys connectAppscst}|io|ii}n| o|inS|i}d|_|io|iin|i||_dS(Ni(sNonesgames_sappsupdatesbusysold_busyscanvas(s_sold_busysgame((spysol.pys busyUpdates       cs|i|idS(N(s_s after_idlesquit(s_((spysol.pysmainquitscs dS(N((s_sfilename((spysol.pys screenshotscs dS(N((s_scursor((spysol.pys setCursorscsti|dS(N(stimessleepsseconds(s_sseconds((spysol.pyssleepscstii|dS(N(sTkintersTksupdates_(s_((spysol.pysupdatescs;|io |iio|iiindS(N(s_sappsmenubarsmQuit(s_((spysol.pyswmDeleteWindows( s__name__s __module__s__init__s connectApps busyUpdatesmainquits screenshots setCursorssleepsupdateswmDeleteWindow(((spysol.pysMfxRoots        s_ToplevelDialogcswtZeZddddZ eddZ dZ3 dZ5 dZ8 d Z ; d Z RS( Nsiics||_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 resizablesdefault((spysol.pys__init__s    cs  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_sfocusstimeout((spysol.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_sevent((spysol.pyswmDeleteWindow5 s cs8 9 d|_: tdS(Ni(s_sstatuss SystemExit(s_sevent((spysol.pysmCancel8 s cs; < d|_= tdS(Ni(s_sstatuss SystemExit(s_sevent((spysol.pysmTimeout; s ( s__name__s __module__sNonesimgs__init__smainloopsdestroysgetDefaultFontswmDeleteWindowsmCancelsmTimeout(((spysol.pys_ToplevelDialogs  "    s MfxDialogcsS> tZ? 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_sparentstitleskwsmsgs top_frames bottom_framesfocus((spysol.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_skwssw((spysol.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 separators bottom_frames top_frame((spysol.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_sframeskwsbsbm((spysol.pys createBitmapsd s+, , c s$o p d} } q |idd|iddf\}}r t}s d}t x||i Dt ]n} u t | t i jov | d} nw | o4x tidd| } y t|t| }nq\Wz x|i Dz ]} { | 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| }  d o | |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\.\,]siistextsfontsstatesdisabledsdefaultsnormalscommandcs |i|S(N(s_smDonesbutton(s_sbutton((spysol.pys ssactiveswidthscolumnsrowsstickysewspadxspadycs |i|S(N(s_smDonesbutton(sevents_sbutton((spysol.pys sss (#sbuttonscolumnskwsgetspadxspadysNonesfocussmax_lensstringsssstypestypess TupleTypesressubsmaxslensxbuttons __debug__sAssertionErrorsintsTkintersButtonsframes buttonfontsbs_sdefaultsconfigslsgrid_configuresgrid_columnconfiguresbindstop( s_sframeskwsfocussmax_lensbspadyspadxsxbuttonscolumnsbuttonslss((spysol.pys createButtonso sP -      $ ' !  +cs  ||_ tdS(N(sbuttons_s SystemExit(s_sbutton((spysol.pysmDone s (s__name__s __module__s__init__sinitKws createFramess createBitmapss createButtonssmDone(((spysol.pys MfxDialog> s   (sMfxExceptionDialogcs tZ ddZRS(NsErrorc s  t|dd} t|idd} |o|ddjo |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_sparentsexstitleskwstextst((spysol.pys__init__ s #)(s__name__s __module__s__init__(((spysol.pysMfxExceptionDialog s sMfxSimpleSlidercs/ tZ 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_framesfocusssliders bottom_frame((spysol.pys__init__ s" $(csG  t| dddfdd dd} ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw s cs1  ||_ |ii|_ tdS(N(sbuttons_svarsgetsvalues SystemExit(s_sbutton((spysol.pysmDone s (s__name__s __module__s__init__sinitKwsmDone(((spysol.pysMfxSimpleSlider s   sMfxSimpleEntrycs tZ 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_framesfocussws bottom_frame((spysol.pys__init__ s"  !+ (s__name__s __module__s__init__(((spysol.pysMfxSimpleEntry s s MfxTooltipcs_ tZ 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_swidget((spysol.pys__init__ s       %%%    cs  ||_dS(N(stexts_(s_stext((spysol.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_sevent((spysol.pys_enter scs  t|i t|_ |io\ |ii t|i t|_ |ii t|i t|_ndS(N(s after_cancels_stimersNonestooltipslabelsdestroysdestruct(s_sevent((spysol.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_sysxsc((spysol.pys_showTip s( *( s__name__s __module__s__init__ssetTexts_unbindsdestroys_enters_leaves_showTip(((spysol.pys MfxTooltip s       sMfxScrolledCanvascsI tZ dddZ7 dZ= dZ? dZD dZH dZK dZO d Z S e d Z X e d Z b d Z i d Zl dZo ddZ ddZ dZ dZ dZ dZ dZ dZ dZ dZ dZ dZRS(Nic 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_sparentshbarsvbarskwsbgsw((spysol.pys__init__ sH                 csP7 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_skw((spysol.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_skwswidthsheight((spysol.pys createFrameD scsJH I tti|if||_J |iidddddddS(Nsrowiscolumnsstickysnews(sapplysTkintersCanvass_sframeskwscanvassgrid(s_skw((spysol.pys createCanvasH s!c s`K L ti|iddd|dddd|_M |i|id<N |ii|id s(swsNones_scanvassbinds unit_lefts unit_right(s_sw((spysol.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_sw((spysol.pysbindVbarX scseb c |ii}d |i}e |io f d|_g |ii nh |i|dS(Ni( seventswidgetswinfo_toplevelstops wm_geometrysgs_sresize_pendingscanvassupdate_idletasks(s_seventsgstop((spysol.pys_mapBarb s   cs*i j t|ii|k |idS(N(sapplys_shbarssetsargssshowHbar(s_sargs((spysol.pys_setHbari scs*l m t|ii|n |idS(N(sapplys_svbarssetsargssshowVbar(s_sargs((spysol.pys_setVbarl sics*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_sshowsview((spysol.pysshowHbaro s   8  & cs*  |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_sshowsview((spysol.pysshowVbar s   8  & cs$  |iidd dSdS(Nispagesbreak(s_scanvass yview_scroll(s_sevent((spysol.pyspage_up scs$  |iidd dSdS(Nispagesbreak(s_scanvass yview_scroll(s_sevent((spysol.pys page_down scs$  |iidd dSdS(Nisunitsbreak(s_scanvass yview_scroll(s_sevent((spysol.pysunit_up scs$  |iidd dSdS(Nisunitsbreak(s_scanvass yview_scroll(s_sevent((spysol.pys unit_down scs$  |iidd dSdS(Nispagesbreak(s_scanvass xview_scroll(s_sevent((spysol.pys page_left scs$  |iidd dSdS(Nispagesbreak(s_scanvass xview_scroll(s_sevent((spysol.pys page_right scs$  |iidd dSdS(Nisunitsbreak(s_scanvass xview_scroll(s_sevent((spysol.pys unit_left scs$  |iidd dSdS(Nisunitsbreak(s_scanvass xview_scroll(s_sevent((spysol.pys unit_right scs!  |iid dSdS(Nisbreak(s_scanvass yview_moveto(s_sevent((spysol.pys scroll_top scs!  |iid dSdS(Nisbreak(s_scanvass yview_moveto(s_sevent((spysol.pys scroll_bottom s(s__name__s __module__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 %                   sMfxScrolledTextcsJ tZ edZ dZ dZ dZ dZRS(Nc s  h} x\|iD ]K} t|tijp |djo ||||< ||=nqW |ido |d|dsss foregroundsblues underlinei( s_sanchorsurlstagstextstag_adds anchor_markstag_bindscreateCallbacks anchor_enters anchor_leaves tag_configsNone(s_surlstag((spysol.pys anchor_end s  "cs#  |iid|iidS(Nscursor(s_stextsconfigsviewers handcursor(s_sargs((spysol.pys anchor_enter scs#  |iid|iidS(Nscursor(s_stextsconfigsviewers defcursor(s_sargs((spysol.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_sfont((spysol.pysnew_font s  cs- . d||_dS(Ns (slevels_sindent(s_smarginslevel((spysol.pys new_margin- scs"/ 0 |i|i|ddS(Ns (s_s_tkHTMLWriter__writesindentsdata(s_sdata((spysol.pyssend_label_data/ scsn1 2 |idjo3 |idn4 |djo5 |id|n6 d|_7 d|_dS(Nis (s_scols_tkHTMLWriter__writes blanklinesatbreak(s_s blankline((spysol.pyssend_paragraph1 s  csc8 9 tt|idd}: |id|; |id< d|_= d|_dS(Nswidthf0.90000000000000002s_s i(sints_stextswidths_tkHTMLWriter__writescolsatbreak(s_sargsswidth((spysol.pys send_hor_rule8 s   (s__name__s __module__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 tkHTMLParsercs;> tZ? dZB dZF dZI dZRS(Ncs?? @ tii||||A |iii|||dS(N( shtmllibs HTMLParsers anchor_bgns_shrefsnamestypes formatterswriter(s_shrefsnamestype((spysol.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_sattrs((spysol.pysdo_dtF scs/I J |iiii||||||dS(N( s_s formatterswritersviewers showImagessrcsaltsismapsalignswidthsheight(s_ssrcsaltsismapsalignswidthsheight((spysol.pys handle_imageI s(s__name__s __module__s anchor_bgns anchor_endsdo_dts handle_image(((spysol.pys tkHTMLParser> s    s tkHTMLViewercsK tZL dZo dZ{ dZ dZ dZ dZ dZ dZ  d Z  e d d Z  d Z  d d d d dZ d d dZ 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_sparentsbasefontsframe((spysol.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_sw((spysol.pys initBindingso s csq{ | t|i} y~ |iiWn   nX y |iiWn   nX t|_dS(N(sunbind_destroys_sparents wm_withdrawsdestroysNone(s_sevent((spysol.pysdestroy{ scs$  |iidd dSdS(Nispagesbreak(s_stexts yview_scroll(s_sevent((spysol.pyspage_up scs$  |iidd dSdS(Nispagesbreak(s_stexts yview_scroll(s_sevent((spysol.pys page_down scs$  |iidd dSdS(Nisunitsbreak(s_stexts yview_scroll(s_sevent((spysol.pysunit_up scs$  |iidd dSdS(Nisunitsbreak(s_stexts yview_scroll(s_sevent((spysol.pys unit_down scs!  |iid dSdS(Nisbreak(s_stexts yview_moveto(s_sevent((spysol.pys scroll_top scs!  |iid dSdS(Nisbreak(s_stexts yview_moveto(s_sevent((spysol.pys scroll_bottom sics  |tjo |i}n  tii|} |o|otii| o tii |\}} tii |\}} t||djo tii|||}n tii|}n |SdS(Ni(sbaseurlsNones_surlsosspathsnormpathsrelpathsisabsssplitsh1st1sh2st2scmpsjoin(s_surlsbaseurlsrelpathsh2sh1st2st1((spysol.pysbasejoin s%csu  |ddjptii|o tii|d}n tii|} t|d|fSdS(Nis/s index.htmlsrb(surlsosspathsisdirsjoinsnormpathsopen(s_surl((spysol.pysopenfile s'ics  |iido5 |io |iio |iiinn xddddddfD ]n} ti||djoL t | o0 |i t d d |d d d |n dSnqjW |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 |iidjo |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:is 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 sxviewsyviewisstatesnormalsdisabledswatchscursors1.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_surlsaddsrelpathsxviewsyviewsold_c1sold_c2sparsersexsfilesdatasfmtswritersp((spysol.pysdisplay s| 0    "     #"  !!cs  |iidjo[ |ii|iid\}}} t||djo |i  dSnn |ii|ii3 |iii |||f |iid|i_dS(Nii( s_shistorysindexslistsusxvsyvscmpsurlsupdateHistoryXYViewsappendsxviewsyview(s_surlsxviewsyviewsusyvsxv((spysol.pys addHistory s& cs  |iidjo| |ii|iid\}}} |iid} |iid} |||f|ii|iid t|? dddfdd@ ddA dd }C ti||SdS( NsstringssOKsCancelsdefaultis resizableisseparatorwidthi(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw= s   cs2D E |iidd|_F ti|dS(Ns1.0send(s_stext_wsgetstextsDisplayTextDialogsdestroy(s_((spysol.pysdestroyD scs G H dS(N((s_sevent((spysol.pyswmDeleteWindowG scs I J dS(N((s_sevent((spysol.pysmCancelI s(s__name__s __module__sMfxScrolledTexts Text_ClasssinitKwsdestroyswmDeleteWindowsmCancel(((spysol.pysEditTextDialog; s     sPlayerOptionsDialogcs/K tZL 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_sparentstitlesappskwswidgetsfocussws bottom_frames top_frame((spysol.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_sbutton((spysol.pysmDonei s  cs\p q t|r dddfdds dddd t d d d d }v ti||SdS( NsstringssOKsCancelsdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKwp s  (s__name__s __module__s__init__smDonesinitKw(((spysol.pysPlayerOptionsDialogK s   sDemoOptionsDialogcs#w tZx 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.20000000000000001stof9.9000000000000004s resolutionf0.10000000000000001sorientslengths3islabelsSet 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_sparentstitlesappskwswidgetsfocuss bottom_frames top_frame((spysol.pys__init__x s4"(((csG  t| dddfdd dd} ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw s (s__name__s __module__s__init__sinitKw(((spysol.pysDemoOptionsDialogw s  sHintOptionsDialogcs tZ dZRS(Nc s^  t||d |iiddd} |i|_ |i |_  |i |_dS(NsSet hint delay in secondsf0.20000000000000001f9.9000000000000004f0.10000000000000001( sMfxSimpleSlidersparentstitlesappsopts hint_sleepsdsstatuss_sbuttonsvalue(s_sparentstitlesappskwsd((spysol.pys__init__ s (s__name__s __module__s__init__(((spysol.pysHintOptionsDialog s sSoundOptionsDialogcs\ tZ 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_sparentstitlesappskwswidgetsfocuss bottom_frames top_frame((spysol.pys__init__ sH "( ,(,cs  ddddg} |itjo ddf|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(sappstimeoutssoundstsd((spysol.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(sappsdocumentsdirsviewersdocstops maximizedsd((spysol.pyshelpHTML@ s:     )    sStatus_StatsDialogcs^ tZ_ dZRS(Nc sJ_ ` |i|if\}}a d}}b d}c x-|iiDc ]}d |t|i }qDWe 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_sparentsgamesstatssssnsgstatssw2sw1sdate((spysol.pys__init___ s2   (D(*)*$ "(s__name__s __module__s__init__(((spysol.pysStatus_StatsDialog^ s sPysolStatsFormattercs tZ dZ dfdYZ defdYZ ddZ dZ d Z d Z d Z RS( Ncs  ||_dS(N(sapps_(s_sapp((spysol.pys__init__ ss StringWritercs_ tZ dZ dZ ddZ dZ edZ dddZRS( Ncs  d|_dS(Ns(s_stext(s_((spysol.pys__init__ scs  |i||_dS(N(s_stextss(s_ss((spysol.pysp sics  |id|dS(Ns (s_spscount(s_scount((spysol.pysnl scs  |i|dS(N(s_spss(s_ss((spysol.pyspheader scs3  d|||||f} |i|dS(Ns%-30s %7s %7s %7s %7s (st1st2st3st4st5sss_sp(s_st1st2st3st4st5sgameidss((spysol.pyspstats sics'  |id||||fdS(Ns%-25s %-20s %17s %s (s_spsgamenames gamenumbersdatesstatus(s_sgamenames gamenumbersdatesstatussgameidswon((spysol.pysplog s( s__name__s __module__s__init__spsnlspheadersNonespstatssplog(((spysol.pys StringWriter s    s FileWritercs# tZ dZ dZRS(Ncs  ||_dS(N(sfiles_(s_sfile((spysol.pys__init__ scs  |ii|dS(N(s_sfileswritess(s_ss((spysol.pysp s(s__name__s __module__s__init__sp(((spysol.pys FileWriter s  iHcs  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 pagewidthsblankssdate((spysol.pys writeHeader s $& c s.  |i}  |i||d |i|pddddd |i dddf\}} } | i } x|D ]}  | 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_swritersplayersheaderstwonspercstgamessnamesgsappslostswonstlostsid((spysol.pys writeStats s4 #   0&  c sx  | p| o  dSn |i||d |idddd |i ddf\} } x|D ]} 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*isLoadedsNot wonsLostsWonsPerfectsgameidswon("splayers prev_gamess_s writeHeaderswritersheadersplogsnlstwonstlostspgstypestypess TupleTypeslensNonesgameidsIntTypesapps getGameInfosgisGIsPROTECTED_GAMESsgets short_namesnamesfs gamenumberstimesstrftimes localtimesdateswonsstatus(s_swritersplayersheaders prev_gamessstatussdatespgstloststwonsgameidsnamesfswonsgis gamenumber((spysol.pys _writeLog sV        %   /  "% %(-cs;  |iiii|} |i||||SdS(N( s_sappsstatss prev_gamessgetsplayers _writeLogswritersheader(s_swritersplayersheaders prev_games((spysol.pys writeFullLog scs;  |iiii|} |i||||SdS(N( s_sappsstatss session_gamessgetsplayers prev_gamess _writeLogswritersheader(s_swritersplayersheaders prev_games((spysol.pyswriteSessionLog s( s__name__s __module__s__init__s StringWriters FileWriters writeHeaders writeStatss _writeLogs writeFullLogswriteSessionLog(((spysol.pysPysolStatsFormatter s    - sPysolMenubarActionscs tZ dZdZ8dZ:dZ<dZ>dZ@dZBdZ Ed Z Gd Z Id Z Pd Z ud ZdZdZdZedZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d 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/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;d<Z<d=Z=d>Z>d?Z?d@Z@dAZA dBZBdCZCdDZDdEZEdFZFdGZG#dHZH(dIZI3dJZJ6dKZK9dLZL?dMZMBdNZNEdOZOGdPZPMdQZQ\dRZRRS(SNc0s#  ||_ ||_ 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_sappstop((spysol.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_sgamesoptstkopt((spysol.pys connectGames8  $cs 89dS(N((s_sgameids((spysol.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_sargsskw((spysol.pyschangedBs!csEFtdS(N(sSubclassResponsibility(s_sstatespath((spysol.pys setMenuStateEscsGHtdS(N(sSubclassResponsibility(s_sstatespath((spysol.pyssetToolbarStateGscsIJ|i}Kxj|iiDK]V\}}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_sargssdsfsid((spysol.pysmSelectGameByIds" $    csR|io dSn|io&|iid o dSnnxtdD]}|ii|ii }|t jo qdndo|i |ii jo qdndo|i |iii jo qdnPqdW|o|i |ii jo*|ii|ii|i ndS(NsSelect random gameii(s_s _cancelDragschangedsgames areYouSuresrangesisapps getGameInfosgetRandomGameIdsgisNonesidscategorysgameinfosendGamesquitGame(s_sargssisgi((spysol.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_sglsstepsindexsid((spysol.pys_mSelectNextGameFromLists $  cs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedById(s_sargs((spysol.pysmSelectNextGameByIdscs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedById(s_sargs((spysol.pysmSelectPrevGameByIdscs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedByName(s_sargs((spysol.pysmSelectNextGameByNamescs&|i|iiiddS(Ni(s_s_mSelectNextGameFromListsappsgdbsgetGamesIdSortedByName(s_sargs((spysol.pysmSelectPrevGameByNamescsp|io dSn |iio> |iio |ii|iin |indS(N(s_s _cancelDrags menustatessave_assgamesfilenamessaveGamesmSaveAs(s_sargs((spysol.pysmSaves  csN|io dSn|iidd|iidddS(Nsholdgamei(s_s _cancelDragsgamesendGamesquitGame(s_sargs((spysol.pys mHoldAndQuits csx|io dSn|io&|iid o dSnn|ii|iidS(Ns Quit PySol(s_s _cancelDragschangedsgames areYouSuresendGamesquitGame(s_sargs((spysol.pysmQuits csY|io dSn|iio'|iid|iindS(Nsundo(s_s _cancelDrags menustatesundosgames playSample(s_sargs((spysol.pysmUndos  csi|io dSn|iio7 |iid!|ii"|iindS(Nsredo(s_s _cancelDrags menustatesredosgames playSamples checkForWin(s_sargs((spysol.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_sargs((spysol.pysmRedoAll#s ( ics,-|io -dSn.|iii o .dSn/d|jo djn o /dSn0|ii|d|1|ii dS(Niisconfirm( s_s _cancelDragsappsopts bookmarkssnsgames setBookmarksconfirms updateMenus(s_snsconfirm((spysol.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_snsconfirm((spysol.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_sargs((spysol.pysmClearBookmarks8s    cs?@|io @dSnA|iiidjo BdSnC|iddo)D|iidd o DdSnnE|iidS(Nisrestartis Restart gamesRestart this game ?(s_s _cancelDragsgamesmovessindexschangeds areYouSures restartGame(s_sargs((spysol.pysmRestart?s  cs2FG|io GdSnH|iidS(N(s_s _cancelDragsgames dealCards(s_sargs((spysol.pysmDealFs cs>IJ|io JdSnK|iidddddS(Ns autofaceupisautodropi(s_s _cancelDragsgamesautoPlay(s_sargs((spysol.pysmDropIs cs>LM|io MdSnN|iidddddS(Ns autofaceupisautodrop(s_s _cancelDragsgamesautoPlay(s_sargs((spysol.pysmDrop1Ls cs5OP|io PdSnQ|idddS(Nsmodeid(s_s _cancelDrags mPlayerStats(s_sargs((spysol.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_sargsscsdsccstsgamesgi((spysol.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_methodsasdswriterstextsexsfile((spysol.pys _mStatsSave_s,   %  c svw|idd} xd}yxy| djoz| djo{| }|| d} n}tdddd}~|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!d"d#d"oT|i i"i#| d|ii$d|i i"i%|i ii|iinn| d$jo|ii!d%d&|d'| d d!d"d#d"oZ|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 ?sconfirmisdefaulti.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_sargsskwsdemosheadersp2sp0sp1sdsplayersnsmodes write_method((spysol.pys mPlayerStatsvsz    '."""      ??cs~|io dSn|iiioI|iid|iiio#|iii d|ii_ nndS(Nii( s_s _cancelDragsappsoptshintsgamesshowHints hint_sleepsstatsshints(s_sargs((spysol.pysmHints  "cs~|io dSn|iiioI|iid|iiio#|iii d|ii_ nndS(Ni( s_s _cancelDragsappsoptshintsgamesshowHints hint_sleepsstatsshints(s_sargs((spysol.pysmHint1s  "cs{|io dSn|iiioF|ii|iiio#|iiid|ii_nndS(Ni( s_s _cancelDragsappsoptshighlight_pilessgameshighlightPilesshighlight_piles_sleepsstats(s_sargs((spysol.pysmHighlightPiless  csR|io dSn|iitj o|iddndS(Nsmixedi(s_s _cancelDragsgames getHintClasssNones_mDemo(s_sargs((spysol.pysmDemos cs5|io dSn|idddS(Nsmixedi(s_s _cancelDrags_mDemo(s_sargs((spysol.pys mMixedDemos cs|io dSn|ioY|iiidjo|iiidjo&|iid o dSnnn|iid|dS(Nis Play demosmixed( s_s _cancelDragschangedsgamesstatss demo_movesshintss areYouSures startDemosmixed(s_smixed((spysol.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_sargssdsn((spysol.pysmOptPlayerOptionss #'csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkopts autofaceupsgetsappsoptsgamesautoPlay(s_sargs((spysol.pysmOptAutoFaceUps  csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkoptsautodropsgetsappsoptsgamesautoPlay(s_sargs((spysol.pys mOptAutoDrops  csg|io dSn|iii|ii_|iiio|iindS(N( s_s _cancelDragstkoptsautodealsgetsappsoptsgamesautoPlay(s_sargs((spysol.pys mOptAutoDeals  cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkopts quickplaysgetsappsopt(s_sargs((spysol.pys mOptQuickPlays csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptsundosgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableUndos csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkopts bookmarkssgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableBookmarkss csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshintsgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableHints csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_pilessgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableHighlightPiless csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_cardssgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableHighlightCardss csP|io dSn|iii|ii_|iidS(N( s_s _cancelDragstkoptshighlight_sameranksgetsappsoptsgames updateMenus(s_sargs((spysol.pysmOptEnableHighlightSameRanks csk|io dSn |iii|ii_ |iii o |iiindS(N( s_s _cancelDragstkoptssoundsgetsappsoptsaudiosstopAll(s_sargs((spysol.pys mOptSounds  cs\  |io  dSnt|id|i}|iii|ii idS(NsSound settings( s_s _cancelDragsSoundOptionsDialogstopsappsdstkoptssoundssetsopt(s_sargssd((spysol.pysmOptSoundDialog s cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkopts animationssgetsappsopt(s_sargs((spysol.pysmOptAnimationss cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsshadowsgetsappsopt(s_sargs((spysol.pys mOptShadows cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsshadesgetsappsopt(s_sargs((spysol.pys mOptShades cs@|io dSn|iii|ii_dS(N(s_s _cancelDragstkoptsirregular_pilessgetsappsopt(s_sargs((spysol.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_sargssd((spysol.pysmOptDemoOptionss #csy#$|io $dSn%t|id|i}&|idjo |idjo'|i|ii _ndS(NsSet hint optionsi( s_s _cancelDragsHintOptionsDialogstopsappsdsstatussbuttons hint_sleepsopt(s_sargssd((spysol.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_sargssexsd((spysol.pysmOptSave(s cs834|io 4dSn5t|idddS(Ns index.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargs((spysol.pysmHelp3s cs867|io 7dSn8t|idddS(Nshowtoplay.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargs((spysol.pysmHelpHowToPlay6s cs~9:|io :dSn;|ii o <dSn=tiidd}>t|i |i i |i i |dS(Nshtmlsrules( s_s _cancelDrags menustatesrulessosspathsjoinsdirshelpHTMLsappsgetGameRulesFilenamesgamesid(s_sargssdir((spysol.pys mHelpRules9s   cs8?@|io @dSnAt|idddS(Ns license.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargs((spysol.pys mHelpLicense?s cs8BC|io CdSnDt|idddS(Ns news.htmlshtml(s_s _cancelDragshelpHTMLsapp(s_sargs((spysol.pys mHelpNewsBs csEFttdS(N(sopenURLs PACKAGE_URL(s_sargs((spysol.pys mHelpWebSiteEscs^GH|io HdSnI|iotd@oJt|inLt|idS(Ni(s_s _cancelDragsappsbundleshelpAboutSimples helpAbout(s_sargs((spysol.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_sargssfsisfn((spysol.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_sargssindexsmusic((spysol.pysmPlayNextMusic\s & (Ss__name__s __module__s__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  .           %                            ?                                sPysolToolbarActionscsetZfdZidZldZndZrdZvdZzdZ~dZ d Z d Z d Z d Z d ZdZdZRS(Ncsfgt|_ht|_dS(N(sNones_sgamesmenubar(s_((spysol.pys__init__fs csij||_k||_dS(N(sgames_smenubar(s_sgamesmenubar((spysol.pys connectGameis cslmtdS(N(sSubclassResponsibility(s_((spysol.pys_busylscs3no|i op|iinqdSdS(Ni(s_s_busysmenubarsmNewGame(s_sargs((spysol.pysmNewGamenscs3rs|i ot|iinudSdS(Ni(s_s_busysmenubarsmOpen(s_sargs((spysol.pysmOpenrscs3vw|i ox|iinydSdS(Ni(s_s_busysmenubarsmRestart(s_sargs((spysol.pysmRestartvscs3z{|i o||iin}dSdS(Ni(s_s_busysmenubarsmSaveAs(s_sargs((spysol.pysmSavezscs3~|i o|iindSdS(Ni(s_s_busysmenubarsmUndo(s_sargs((spysol.pysmUndo~scs3|i o|iindSdS(Ni(s_s_busysmenubarsmRedo(s_sargs((spysol.pysmRedoscs3|i o|iindSdS(Ni(s_s_busysmenubarsmDrop(s_sargs((spysol.pysmDropscs3|i o|iindSdS(Ni(s_s_busysmenubarsmStatus(s_sargs((spysol.pysmStatusscs3|i o|iindSdS(Ni(s_s_busysmenubars mPlayerStats(s_sargs((spysol.pys mPlayerStatsscs3|i o|iindSdS(Ni(s_s_busysmenubars mHelpRules(s_sargs((spysol.pys mHelpRulesscs3|i o|iindSdS(Ni(s_s_busysmenubarsmQuit(s_sargs((spysol.pysmQuitscs3|i o|iindSdS(Ni(s_s_busysmenubarsmOptPlayerOptions(s_sargs((spysol.pysmOptPlayerOptionss(s__name__s __module__s__init__s connectGames_busysmNewGamesmOpensmRestartsmSavesmUndosmRedosmDropsmStatuss mPlayerStatss mHelpRulessmQuitsmOptPlayerOptions(((spysol.pysPysolToolbarActionses               s _MfxToolbarcstZddZdZdZdeiedZdddZ ddZ d Z d Z d Z RS( Nicsd}||_t|_|i|d|_g|_g|_d|_ t i |idddd|_ t i |i dddd|_|i|i idt idt idS(Niiisbdshighlightthicknessssidesfill(sreliefstops_sNones button_bgs_MfxToolbar__setReliefssides _tooltipss_widgetss _icon_heightsTkintersCanvasscanvassFramesframes _initFramespacksTOPsX(s_stopsrelief((spysol.pys__init__s       $$ cst|tijotitif|}n0|titifjon ti}||_|tijoti|_ nti|_ |SdS(N( stypesreliefstypessIntTypesTkintersRAISEDsFLATs_s button_reliefsseparator_relief(s_srelief((spysol.pys __setReliefs  cs)|iidtidtidS(Nssidesfill(s_sframespacksTkintersTOPsX(s_((spysol.pys _initFramesi cs)|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_swidthssidesreliefssepspadxsheight((spysol.pys_createSeparators   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_ssidesresizess((spysol.pysshows     cs|id|dS(Ni(s_sshowsresize(s_sresize((spysol.pyshidescs|iSdS(N(s_sside(s_((spysol.pysgetSidescsx/|iD]!}|o|inqWg|_x/|iD]!}|o|inqQWg|_dS(N(s_s _tooltipsswsdestroys_widgets(s_sw((spysol.pysdestroys     cs>|io*|iid||iindS(Nscursor(s_ssidesframesconfigscursorsupdate_idletasks(s_scursor((spysol.pys setCursors (s__name__s __module__s__init__s_MfxToolbar__setReliefs _initFramesTkintersLEFTsNones_createSeparatorsshowshidesgetSidesdestroys setCursor(((spysol.pys _MfxToolbars    s PysolToolbarcstZddZdZdZdedZ-dZ7dei edZ Ad Z Gd Z \d Z ^d Zbd Z{dZ~dZdZRS(Nics 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_stopsdirssizesrelief((spysol.pys__init__s0       csdp 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}xct D]X}tii|i||}tii |ot i d|}Pnq1W|SdS(Nsfile(sosspathsjoins_sdirsnamesfilesNonesimagesIMAGE_EXTENSIONSsextsisfilesTkinters PhotoImage(s_snamesfilesimagesext((spysol.pys _loadImages   ics|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_snamespadxssidestooltipsbslabelsaspect((spysol.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_sgamesmenubarstkopt((spysol.pys connectGameGs"   444 48cs \]dS(N((s_srelief((spysol.pys setRelief\sc sQ^_xD|iD_]3}`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_underline((spysol.pys__init__;s (s__name__s __module__sNones__init__(((spysol.pysMfxMenu:s s PysolMenubarcs(DtZEdZQdZTdZXdZdZdZ)dZ-dZ @d Z Qd Z [d Z cd Z md ZodZvdZdZdZdZdZdZedjo dZn dZeddefddffZdZdZdZdZ dZ d Zd!Zd"Z d#Z!d$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_sappstopssh((spysol.pys__init__Es      cs;QR|ii| oS|||f|i|d|d?|id d@d|dAt|d dB}|id d:d|dC|id d<d|dD|i dE}|id dFd|i-ddGt%d0jo&|id dHd|i.ddIn#|id dJd|i.ddI|i|id dKd|i/d|d2|id dLd|i0|i dM}|id dNd|i1t%d0jot|d dO}|i)d dPd8|i*i2d|i3|i)d dQd8|i*i4d|i5|i)d dRd8|i*i6d|i7|i)d dSd8|i*i8d|i9nt|d dT}|i)d dUd8|i*i:d|i;|i)d d3d8|i*i<d|i=|i)d dVd8|i*i>d|i?|i|i)d dWd8|i*i@d|iAt|d dO}|i)d dPd8|i*i2d|i3|i)d dQd8|i*i4d|i5|i)d dRd8|i*i6d|i7|i)d dXd8|i*i8d|i9|i)d dYd8|i*iBd|iC|i)d dZd8|i*iDd|iE|i|iFiGiHtIjo5|i)d d[d8|i*iJd|iKd\tLiMn_tNo,|i)d d]d8|i*iJd|iOn)|i)d d[d8|i*iJd|iK|iFiP}|iR}t%d0joW|id d^d|iTdd_t|d d`}|id dad|iUnT|id dbd|iTdd_t|d dc}|id ddd|iUt|d de}|iVd dfd8|i*iWdgdhd|iX|iVd did8|i*iWdgdjd|iX|iVd dkd8|i*iWdgdd|iX|iVd dld8|i*iWdgdmd|iX|iVd dnd8|i*iWdgdod|iXt%d0joT|i)d dpd8|i*iYd|iZ|i)d dqd8|i*i[d|i\n|i|id drd|i]|id dsd|i^|it|d dt}|iVd dud8|i*i_dgdhd|i`|iVd dvd8|i*i_dgdd|i`|iVd dwd8|i*i_dgdjd|i`|i|iVd dxd8|i*iadgdhd|ib|iVd dyd8|i*iadgdd|ib|i)d dzd8|i*icd|id|i d{}|id d|d|ied|d}|id d~d|if|id dd|igdd}thdo@dhjo<|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&x@td&D]/}|im|tx|d||dqWW 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 s Bookmark %dcsy|i|S(N(s_s mSetBookmarksi(s_si((spysol.pysyssGo&to bookmarks%dcs~|i|S(N(s_s mGotoBookmarksi(s_si((spysol.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&Nonesvalueis &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_si((spysol.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_saccsmanagersnssubmenusismenusctrlsmslabelskw((spysol.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_smodifierskeysfuncssequence((spysol.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_seventsrsfunc((spysol.pys_keyPressHandlers   cs8)*d}+t|i|d|dd},|SdS(Nistearoffs underlinei(stearoffsMfxMenus_s_PysolMenubar__menubarslabelsmenu(s_slabelsmenustearoff((spysol.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(sgi((spysol.pys3ssPyJonggs&Special games(smaps_sappsgdbsgetsgetGamesIdSortedByShortNamesgamesstuplesmenus add_commandsmSelectGameDialogsmSelectGameDialogWithPreviews add_separatorsdatas_addSelectGameSubMenusmSelectGamePopularstkoptsgameid_popularsPACKAGEs_addSelectMahjonggGameSubMenus mSelectGamesgameidsMfxMenussubmenusGIsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_GAME_BY_TYPE(s_smenussubmenusgamessdata((spysol.pys_addSelectGameMenu-s$'""  "  c s@Ad}Bx|DB]\} }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_datascommandsvariablessubmenusneed_seps select_funcsgslabel((spysol.pys_addSelectGameSubMenu@s          c sQRxddddddfDR]}St|d|dd |}T| o UqnV|d}W|d|djoX|dd |d}nYt|d |}Z|i ||||qWdS( NsACsDFsGKsLRsSTsUZiics%S||idjo |jnS(Ni(sc0sgis short_namesc1(sgisc0sc1((spysol.pysSss - slabel( scsfiltersgsggslabelsMfxMenusmenussubmenus_s_addSelectGameSubSubMenuscommandsvariable( s_smenusgscommandsvariablessubmenuscslabelsgg((spysol.pys_addSelectMahjonggGameSubMenuQs #   c s[\d|ift|ddj}]xtt|D]]j}^||}_|djo||dj}`|i d|d|ad|bd|i d|iq?WdS( Niiiscommandsvariables columnbreaksvalueslabel(s_s_PysolMenubar__cb_maxslensgscbsrangesisgis columnbreaksmenusadd_radiobuttonscommandsvariablesids short_name( s_smenusgscommandsvariablesiscbs columnbreaksgi((spysol.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_sd((spysol.pys_mSelectGameDialogcs9#cs#mn|iid|iidS(Nscursor(s_sgames setCursorsapps top_cursor(s_sevent((spysol.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_seventsd((spysol.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_seventsbookmarksd((spysol.pysmSelectGameDialogWithPreviewvs  c s|idd}|iddd|ift|ddj}d}x|D]}|i i |}| o qcn|djo||dj}|id|id|iid |d |i d |i|d }qcWdS( Ns.menubar.file.recentgamesiislastiiscommandsvariables columnbreaksvalueslabeli(s_s_PysolMenubar__menupathssubmenusdeletes_PysolMenubar__cb_maxslensgameidsscbsisidsapps getGameInfosgis columnbreaksadd_radiobuttons mSelectGamestkoptsgameids short_name(s_sgameidsssubmenus columnbreaksiscbsgisid((spysol.pysupdateRecentGamesMenus&      c s|i}|iid} |iid}|iid}| tjp|tjp |tjo dSn|i i i o |i i } | \}}}x3tdD]"}|i|d|| qW|i|d|| |\}}}d} xktdD]Z}|i ii i|tj }|i|d||o| | p|} q7W|i|d|| o| |\}}}|i|d|| o| dS(Ns.menubar.edit.setbookmarks.menubar.edit.gotobookmarks.menubar.edit.clearbookmarksi sstatei(s_s_getEnabledStatesstates_PysolMenubar__menupathsgetsmp1smp2smp3sNonesappsopts bookmarkssgamescanSetBookmarksxsmenusindexssubmenusrangesis entryconfigsmss gsaveinfoss( s_ssubmenusindexsismenusssstatesmp2smp3smssmp1sx((spysol.pysupdateBookmarkMenuStates, * "    !##csH|iid}tdjo |tjo|iid}n|d}|idd|ii i }t t it it|}xtt|D]}}|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_ssubmenusmbackssiscbs columnbreaksmp((spysol.pysupdateBackgroundImagesMenus '  5csd|}|ii|}tdjo |tjo dSn|\}}}|i |}|i |d|dS(Ns .menubar.sPyJonggsstate(spaths_s_PysolMenubar__menupathsgetsmpsPACKAGEsNonesmenusindexssubmenus_getEnabledStatesstatesss entryconfig(s_sstatespathssubmenusindexsmpsssmenu((spysol.pys setMenuStates  csB|i|}t|ii|d}||d|io dSn|i|iiidS(N(s_s _cancelDrags_mOptTableTilestkopts tabletilesget(s_sevent((spysol.pys mOptTableTiles csx|io dSn|iii}|djo1|iiid|}|i |ndS(Nii( s_s _cancelDragsappstabletile_managerslensnstkopts tabletilesgetsis_mOptTableTile(s_seventsisn((spysol.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_seventsdskey((spysol.pysmSelectTileDialog s $))csv,-|io -dSn.tid|iii/dd}0|o|do1|i|dndS(Ns initialcolorstitlesSelect table colori( s_s _cancelDragstkColorChoosersaskcolorsappsopts tablecolorscs_mOptTableColor(s_seventsc((spysol.pysmOptTableColor,s  cs>23|io 3dSn4|i|iiidS(N(s_s _cancelDragssetToolbarSidestkoptstoolbarsget(s_sevent((spysol.pys mOptToolbar2s cs>56|io 6dSn7|i|iiidS(N(s_s _cancelDragssetToolbarSizestkopts toolbar_sizesget(s_sevent((spysol.pysmOptToolbarSize5s cs>89|io 9dSn:|i|iiidS(N(s_s _cancelDragssetToolbarReliefstkoptstoolbar_reliefsget(s_sevent((spysol.pysmOptToolbarRelief8s cs;<|io <dSn=|ii o =dSn>|iii}?||ii_@|iii|oA|i i ndS(N( s_s _cancelDragsapps statusbarstkoptsgetssidesoptsshowstopsupdate_idletasks(s_seventsside((spysol.pys mOptStatusbar;s  cswBC|io CdSnD||ii_E|iii|F|iii|oG|i i ndS(N( s_s _cancelDragssidesappsoptstoolbarstkoptssetsshowstopsupdate_idletasks(s_sside((spysol.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_ssizesdir((spysol.pyssetToolbarSizeHs csZPQ|io QdSnR||ii_S|iii|T|ii dS(N( s_s _cancelDragsreliefsappsoptstoolbar_reliefstkoptssetstopsupdate_idletasks(s_srelief((spysol.pyssetToolbarReliefPs  (,s__name__s __module__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                #                sMfxTreeBaseNodecsqUtZVdZ`dZedZjeedZwdZdZdZ dZ RS( NcssVW||_X||_Y||_Z||_[d|_\t|_]t|_^t|_ _t|_ dS(Ni( strees_s parent_nodestextskeysselectedsNonessubnodess symbol_idstext_ids textrect_id(s_strees parent_nodestextskey((spysol.pys__init__Vs        csb`a|itj oHb|iii|ig}c|i|d||ii|issfillsexpandi(skwsgetsparentscgetsbgsapplysMfxScrolledCanvass__init__s_s rootnodessupdateNodesWithTreesNones selection_keysnodesskeyssStylesstylescanvasstext_normal_fgstext_normal_bgsbinds singleClicks doubleClickspacksTkintersBOTH(s_sparents rootnodesskwsbg((spysol.pys__init__s*    csLx/|ii|igD]}d|_qWti|dS(Ni(s_skeyssgets selection_keysnodesselectedsMfxScrolledCanvassdestroy(s_snode((spysol.pysdestroys csK|iiti}|o|ii|dSntSdS(Ni( s_scanvass find_withtagsTkintersCURRENTsidsnodessgetsNone(s_seventsid((spysol.pysfindNodes cs |ii|iif\}}||ii}||iid}xm|iD]_}||_ y+|i ||t t \}}}}Wntij o nXq[W|iid}|iiddd|d|df|iid|iidS(Nisalls scrollregioniisyscrollincrement(s_sstylesoriginxsoriginysnxsnysdistxsheights rootnodessnodestreesdrawsNoneslxslysTkintersTclErrorscanvassbboxsconfigsdisty(s_snxsnysnodesbboxslxsly((spysol.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_skeysnodesl2sl1((spysol.pysupdateSelections      csQxD|D]9} ||_!|io"|i|i|nq WdS(N(snodessnodestreessubnodess_supdateNodesWithTree(s_snodesstreesnode((spysol.pysupdateNodesWithTrees    (s__name__s __module__sStyles__init__sdestroysNonesfindNodesdrawsclearsredraws getContentss singleClicks doubleClicksupdateSelectionsupdateNodesWithTree(((spysol.pysMfxTreeInCanvass       sSelectDialogTreeLeafcs#tZ$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(s__name__s __module__sNonesimgs__init__(((spysol.pysSelectDialogTreeData:s  sSelectDialogTreeCanvascs\OtZPedddddZodZtdZvedZedZRS( Niiic 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_sdialogsparentskeysdefaultsfontswidthsheightshbarsvbarsdisty((spysol.pys__init__Ps:          ! cs^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_snode((spysol.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_skw((spysol.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_sappskwstile((spysol.pyssetups(s__name__s __module__s createCanvasspackssetup(((spysol.pysSelectDialogPreviewCanvass   sSelectGameLeafcstZRS(N(s__name__s __module__(((spysol.pysSelectGameLeafs sSelectGameNodecstZdZRS(Ncsg}t|itogx]|iD]O\}}|o|o2t|i||d|}|i |nq/Wnsxl|ii i D]X}|o |i|o8t|i||id|i}|i |nqW|p |ii iSdS(Nskey(scontentss isinstances_s select_funcsUserListsidsnamesSelectGameLeafstreesnodesappendsdatas all_games_gisgisno_games(s_snodesnamesgisidscontents((spysol.pys _getContentss   $(s__name__s __module__s _getContents(((spysol.pysSelectGameNodes sSelectGameDatacstZdZRS(Ncsti|t|ii|ii|_t t t dt g|_ t }} }} g} xtitititifD]}g}xy|D]n\} }| 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\}}xsti!D]e\} } | d }| t jpt||i o q/n|itt | |q/Wdo|o"tt d t|}nt gf\}}xti$D]r\} } | 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)s&siis by Game Typesexpandeds Special GamesisOriginal Gamesics|i|jS(N(sgisidsgames(sgisgames((spysol.pysssby Compatibilitycs|i|jS(N(sgisidsgames(sgisgames((spysol.pysssNew games in vsPySolsby PySol versions All GamescsdS(Ni((sgi((spysol.pysssAlternate Namess Popular Gamescs|iiti@S(N(sgissis game_flagssGIs GT_POPULAR(sgi((spysol.pysssby Game Featuresby Number of Cardss32 cardscs|iidjS(Ni (sgissisncards(sgi((spysol.pysss48 cardscs|iidjS(Ni0(sgissisncards(sgi((spysol.pysss52 cardscs|iidjS(Ni4(sgissisncards(sgi((spysol.pysss64 cardscs|iidjS(Ni@(sgissisncards(sgi((spysol.pysss78 cardscs|iidjS(NiN(sgissisncards(sgi((spysol.pysss 104 cardscs|iidjS(Nih(sgissisncards(sgi((spysol.pysss 144 cardscs|iidjS(Ni(sgissisncards(sgi((spysol.pysss Other numbercs(|iidddddddfjS(Ni i0i4i@iNihi(sgissisncards(sgi((spysol.pysssby Number of Deckss 1 deck gamescs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 2 deck gamescs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 3 deck gamescs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 4 deck gamescs|iidjS(Ni(sgissisdecks(sgi((spysol.pysssby Number of Redealss No redealcs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss1 redealcs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss 2 redealscs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss 3 redealscs|iidjS(Ni(sgissisredeals(sgi((spysol.pysssUnlimited redealscs|iidjS(Ni(sgissisredeals(sgi((spysol.pysscs"|iidddddfjS(Niiiii(sgissisredeals(sgi((spysol.pysssOther CategoriessGames for Children (very easy)cs|iiti@S(N(sgissis game_flagssGIs GT_CHILDREN(sgi((spysol.pysssGames with Scoringcs|iiti@S(N(sgissis game_flagssGIsGT_SCORE(sgi((spysol.pysssGames with Separate Deckscs|iiti@S(N(sgissis game_flagssGIsGT_SEPARATE_DECKS(sgi((spysol.pysssOpen Games (all cards visible)cs |iiti@S(N(sgissis game_flagssGIsGT_OPEN(sgi((spysol.pys ssRelaxed Variantscs |iiti@S(N(sgissis game_flagssGIs GT_RELAXED(sgi((spysol.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 select_funcs s_originalsul_alternate_namessggss_by_pysol_versionsdatasnamesgs s_contribs s_specialsgamesss_by_compatibility((spysol.pys__init__sb$ "   $  % $   $   (s__name__s __module__s__init__(((spysol.pysSelectGameDatas sSelectGameTreeWithPreviewcstZeZeZRS(N(s__name__s __module__sNonesdatas html_viewer(((spysol.pysSelectGameTreeWithPreviews  sSelectGameTreecstZedZRS(Ncs|i|dS(N(s_s doubleClicksevent(s_sevent((spysol.pys singleClicks(s__name__s __module__sNones singleClick(((spysol.pysSelectGameTrees sSelectGameDialogcsVtZeZeZeZdZ)dZ 2dZ 7dZ 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_sparentstitlesappsgameidskwsfocuss bottom_frames top_frame((spysol.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_skw((spysol.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_sbuttonsurlsdocsviewersdir((spysol.pysmDone7s      ( s__name__s __module__sSelectGameTrees Tree_ClasssSelectGameTreeWithPreviewsTreeDataHolder_ClasssSelectGameDatasTreeData_Classs__init__sinitKwsdestroysmDone(((spysol.pysSelectGameDialogs      sSelectGameDialogWithPreviewcsYItZJeZKedZldZqdZuddZddZ RS(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_sparentstitlesappsgameidsbookmarkskwsswsfocussw2sw1s bottom_frames top_frame((spysol.pys__init__Ks>"    -6:   csAlmt|nddtdfdd}pti||SdS(NsstringssSelectsCancelsdefaulti(sKwStructskwsNonesSelectGameDialogsinitKws_(s_skw((spysol.pysinitKwls cs:qr|idds|iitti|dS(Nsdestroyi(s_s deletePreviewspreviews unbind_allsSelectGameDialogsdestroy(s_((spysol.pysdestroyqsicsuvd|_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_sdestroy((spysol.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)d nn| 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 - iidiispreviewsanchorssstexts 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 animationssgwstxstysrandomscanvasschsgisghscw((spysol.pys updatePreviews~           # !!# !( s__name__s __module__sSelectGameTreeWithPreviews Tree_ClasssNones__init__sinitKwsdestroys deletePreviews updatePreview(((spysol.pysSelectGameDialogWithPreviewIs  !  sSelectCardsetLeafcstZRS(N(s__name__s __module__(((spysol.pysSelectCardsetLeafs sSelectCardsetNodecstZdZRS(Ncsg}xh|iiiD]T}|i|o;t|i|d|id|i }|i |nqW|p |iii SdS(Nstextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectCardsetLeafsnamesindexsnodesappends no_contents(s_snodesobjscontents((spysol.pys _getContentss  '(s__name__s __module__s _getContents(((spysol.pysSelectCardsetNodes sSelectCardsetDatacstZdZRS(Nc sfti||i|_td|i|_tttddtg|_ t} t i i }|idg}xS|D]H\}}|ii|o&|itt||dnqW|o%ttdt|dd} nt}t ii }|id g}xS|D]H\}}|ii|o&|itt||d nqaW|o>|ittd d ttd t|}nt}t ii }|idg}xS|D]H\}}|ii|o&|itt||dnq9W|o>|ittd dttdt|}nt}t ii }|idg}xS|D]H\}}|ii|o&|itt||dnqW|o>|ittd dttdt|}nttttdddt |idjttdttddttddttddttd d!ttd"d#fdd| |||f|_!dS($Ncs |i S(N(sobjserror(sobj((spysol.pysss (no cardsets)skeycst|d|dS(Ni(scmpsasb(sasb((spysol.pysscs||iijS(N(skeyscsssistype(scsskey((spysol.pysssby Typesexpandedicst|d|dS(Ni(scmpsasb(sasb((spysol.pysscs||iijS(N(skeyscsssisstyles(scsskey((spysol.pysss Uncategorizedcs|ii S(N(scsssisstyles(scs((spysol.pysssby Stylecst|d|dS(Ni(scmpsasb(sasb((spysol.pysscs||iijS(N(skeyscsssis nationalities(scsskey((spysol.pysscs|ii S(N(scsssis nationalities(scs((spysol.pysssby Nationalitycst|d|dS(Ni(scmpsasb(sasb((spysol.pysscs||iijS(N(skeyscsssisdates(scsskey((spysol.pysscs|ii S(N(scsssisdates(scs((spysol.pysssby Dates All CardsetscsdS(Ni((scs((spysol.pyssi sby Sizes Tiny cardsetscs|iitijS(N(scsssissizesCSIs SIZE_TINY(scs((spysol.pysssSmall cardsetscs|iitijS(N(scsssissizesCSIs SIZE_SMALL(scs((spysol.pysssMedium cardsetscs|iitijS(N(scsssissizesCSIs SIZE_MEDIUM(scs((spysol.pysssLarge cardsetscs|iitijS(N(scsssissizesCSIs SIZE_LARGE(scs((spysol.pysssXLarge cardsetscs|iitijS(N(scsssissizesCSIs SIZE_XLARGE(scs((spysol.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_datesnamesitemssselect_by_nationalitysselect_by_stylesnodessselect_by_type((spysol.pys__init__sb!   * %   *    *    * (s__name__s __module__s__init__(((spysol.pysSelectCardsetDatas sSelectCardsetByTypeDatacstZdZRS(Ncs ti||i|_tttddtg|_t i i }|i dg}xS|D]H\}}|ii|o&|itt||dnq~Wttdt|dd}tt|f|_dS(Ns (no cardsets)skeycst|d|dS(Ni(scmpsasb(sasb((spysol.pysscs||iijS(N(skeyscsssistype(scsskey((spysol.pysssby Typesexpandedi(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssSelectCardsetLeafsNones no_contentssCSIsTYPEsitemsssortsnodesskeysnamesregistered_typessgetsappendsSelectCardsetNodestuplesselect_by_typesfilters rootnodes(s_smanagerskeysnamesitemssnodessselect_by_type((spysol.pys__init__s!  *!(s__name__s __module__s__init__(((spysol.pysSelectCardsetByTypeDatas sSelectCardsetTreecstZeZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectCardsetTrees sSelectCardsetByTypeTreecstZ eZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectCardsetByTypeTrees sSelectCardsetDialogWithPreviewcse!tZ"eZ#eZ$eZ%edZ@dZ FdZ OdZ ddZ RS(Nc s6%&|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_sparentstitlesappsmanagerskeyskwsw1sfocussw2s bottom_frames top_frame((spysol.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_skw((spysol.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_sbuttonsdsfstextsfilescs((spysol.pysmDoneOs(    c snde||ijo fdSng|ii}h|iig|_j|ii|} k| old|_mdSnn| i \}} oynp| i \}} qxO|Dq]D} rtii| i| | i}s|iitd|qWWn)tud|_vg|_wdSnXxddddd| id| idf\}}} }}}} yx|iDy]}zt ||| ddd|{t!||t!| |f\}}||d}}|| djo~d| | f\}} n||}qW|i"d dd|||| f|i"d |d | ||_dS( Nisfileii sanchorsnwsimageis scrollregionsxscrollincrementsyscrollincrement(#skeys_s preview_keyspreviewscanvassdeleteAllItemsspreview_imagessmanagersgetscssgetPreviewCardNamessnamesscolumnssnsosspathsjoinsdirsextsfsappends loadImagesCARDWsCARDHsisxsyssxssysdxsdysimagesMfxCanvasImagesmaxsconfig(s_skeyscanvasssxsdxsfsisimagessysnsyscolumnssdyscssxsnames((spysol.pys updatePreviewds@       "$   A ' '( s__name__s __module__sSelectCardsetTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(((spysol.pysSelectCardsetDialogWithPreview!s      s$SelectCardsetByTypeDialogWithPreviewcs&tZeZeZeZRS(N(s__name__s __module__sSelectCardsetByTypeTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetByTypeDatasTreeData_Class(((spysol.pys$SelectCardsetByTypeDialogWithPreviews   sSelectTileLeafcstZRS(N(s__name__s __module__(((spysol.pysSelectTileLeafs sSelectTileNodecstZdZRS(Ncsg}xh|iiiD]T}|i|o;t|i|d|id|i }|i |nqW|p |iii SdS(Nstextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectTileLeafsnamesindexsnodesappends no_contents(s_snodesobjscontents((spysol.pys _getContentss  '(s__name__s __module__s _getContents(((spysol.pysSelectTileNodes sSelectTileDatacstZdZRS(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(sobj((spysol.pysscs|idjo|iS(Ni(stilesindexsfilename(stile((spysol.pysss (no tiles)skeyiis Solid ColorssBlues#0082dfsGreens#008200sNavys#000086sOlives#868200sOranges#f79600sTeals#008286sexpandedsAll BackgroundscsdS(Ni((stile((spysol.pyss(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssfiltersSelectTileLeafsNones no_contentsstypeskeystypess StringTypeslense1se2sSelectTileNodes rootnodes(s_smanagerskeyse1se2((spysol.pys__init__s!. (s__name__s __module__s__init__(((spysol.pysSelectTileDatas sSelectTileTreecstZeZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectTileTrees sSelectTileDialogWithPreviewcsetZeZeZeZedZdZ dZ dZ dZ RS(Nc sE|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_sparentstitlesappsmanagerskeyskwsw1sfocussw2s bottom_frames top_frame((spysol.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_skw((spysol.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_sbuttonsc((spysol.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(Nsbgsfilesditherii(skeys_s preview_keyspreviewscanvasstypestypess StringTypesconfigsdeleteAllItemsssetTilesNones setTextColors tablecolorsimsmanagersgetstiles loadImagesfilenamesTkintersTclErrorsexs text_color(s_skeyscanvassimstilesex((spysol.pys updatePreviews0         ( s__name__s __module__sSelectTileTrees Tree_ClasssTreeDataHolder_ClasssSelectTileDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(((spysol.pysSelectTileDialogWithPreviews      sSingleGame_StatsDialogcstZdZdZdZ%dZ8dZTdZYdZldZ d Z d 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(sasb((spysol.pys scs|ddjS(Nii(sa(sasb((spysol.pysscs|ddjS(Nii(sa(sasb((spysol.pysssCurrent session(&s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssplayerstops wm_minsizesbuttonscreate3DBarCharts createChartscreatePieChartswinfo_screenwidthswinfo_screenheightscreateSimpleChartsappsstatssgetStatssgameidswonslosts session_gamessgetsgsfilterslens createButtonssfocussmainloopstimeout(s_sparentstitlesappsplayersgameidskwslostsfocussgs createChartswons bottom_frames top_frame((spysol.pys__init__s*"  ) csddf\}}||djoCt|||}tt|dd}d|}n||fSdS(Nf0.0if1.0000000000000001e-05f0.99999000000000005f1.0(spwonsplostswonslostsfloatsminsmax(s_swonslostspwonsplost((spysol.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_sframeswshstextscstfontsfgsl((spysol.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_scstxstyswonslostsxsfgstfontsplostsyspwonspw((spysol.pys_createChartTexts%s$ ///337# 3c s89|djo :dSn;t|}<xddddfD<]}=|||d|||df||<>|d}?tt||d|} @tt||d|} A||d| ||d| f||iiiiiiiiis#00ff00s#008200s#00c300ifii1i=iiiiiiiis#ff0000s#860400s#c70400iii0stextsfontsfill(sappsgimagessstatssimageswidthsheightsiwsihs_s_createChartInitsframestextscstfontsfgs_getPwonswonslostspwonsploststxsyystys create_imagespscols_createChart3DBars_createChartTextss create_textsplayer(s_sframesappswonsloststextscspwonstxstysplostsiwscolsyysihstfontsfgspsimage((spysol.pyscreate3DBarChartYs !( *Q#Q#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_sframesappswonsloststextscspwonstxstysplostselostssstfontsfgsysxsewon((spysol.pyscreatePieChartls$$#37+/!' +'+cskt|ddddfddffddd d d d d ddd}ti||SdS(NsstringssOKs All games...ifsReset...i.sdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKws  $cstdSdS(Nssmall(sgetFont(s_((spysol.pysgetDefaultFonts( s__name__s __module__s__init__s_getPwons_createChartInits_createChartTextss_createChart3DBarscreateSimpleChartscreate3DBarChartscreatePieChartsinitKwsgetDefaultFont(((spysol.pysSingleGame_StatsDialogs         s"AllGames_StatsDialogScrolledCanvascstZRS(N(s__name__s __module__(((spysol.pys"AllGames_StatsDialogScrolledCanvass sAllGames_StatsDialogcstZddf\ZZeidjo dZndZdZdZdZ d Z e d Z d Z d eifd 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_sparentstitlesappsplayerskwslinessfocussbboxs bottom_frames top_frame((spysol.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_skw((spysol.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_seventsgameidsids gamenumber((spysol.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_splayersheadersaswriter((spysol.pys fillCanvass !" s CanvasWritercsttZdZdZdZdZedZdZdZ (ddd Z RS( Ncs||_|id|_||_||_d|_|_t|_ t|_ |ii d|dS(Nsinsertbackgroundisyscrollincrement( scanvass_scgetsfgsfontshsxsysNonesgameids gamenumbersconfig(s_scanvassfontsh((spysol.pys__init__s     cs)|i|if|iii|is iistextsanchorsnwsfontsfill( s_sysh1sh2ssshscanvass create_textsxsfontsfgsids_addItem(s_sssh2sh1sid((spysol.pysps     <cs dS(N((s_ss((spysol.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_st1st2st3st4st5sgameidshspsysx((spysol.pyspstatss     -1111 c sat|d|id|it|ii||f|}|i ||i SdS(Nsfontsfill( s kwdefaultskws_sfontsfgsapplyscanvass create_textsxsysids_addItemsh(s_sxsyskwsid((spysol.pys _pstats_texts!c s6|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 D]}  || 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.10000000000000001(stsintsroundsstringsatofsstrspercsxsys_shsrxsrysrwsrhswsmaxsminscanvasscreate_rectanglesidsNonesfillspsixsisrsgsbsc(s_sxsystsixsbsidsfillspercscsrwsgsisrxsryspsrswsrh((spysol.pys pstats_percsZ- $ 4  &*  & &*   ( #(. ics()|djo"d|dd!jo djno*||_+||_n,|id||||f-t|_.t|_dS(Nis0is9s%-25s %-20s %17s %s (sgameids gamenumbers_spsgamenamesdatesstatussNone(s_sgamenames gamenumbersdatesstatussgameidswon((spysol.pysplog(s 5   ( s__name__s __module__s__init__s_addItemspspheadersNonespstatss _pstats_texts pstats_percsplog(((spysol.pys CanvasWriters      -(s__name__s __module__sCHAR_WsCHAR_HsossnamesYVIEWs__init__sinitKwsgetDefaultFontsdestroysNones singleClicks fillCanvassPysolStatsFormatters StringWriters CanvasWriter(((spysol.pysAllGames_StatsDialogs        sFullLog_StatsDialogcs,/tZ0dZ1dZ7dZRS(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_splayersheadersaswriter((spysol.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_skw((spysol.pysinitKw7s  $(s__name__s __module__sYVIEWs fillCanvassinitKw(((spysol.pysFullLog_StatsDialog/s   sSessionLog_StatsDialogcs#>tZ?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_splayersheadersaswriter((spysol.pys fillCanvas?s !"csMEFt|Gddddfddffdd}Iti||SdS( NsstringssOKs Full log...igs Save to fileisdefaulti(sKwStructskwsFullLog_StatsDialogsinitKws_(s_skw((spysol.pysinitKwEs *(s__name__s __module__s fillCanvassinitKw(((spysol.pysSessionLog_StatsDialog>s  s AbstractCardcsJtZKdddZWdZYdZ[dZ]dZcddZgd Zid Z ke d Z mdd Z odd Z qdZRS(NicsKL||_M||_N||_O|d|_P||_Q||_R||_St|_ Td|_ Ut|_ Vd|_ |_ dS(Nii(sids_sdeckssuitscolorsranksxsysNonesitemsface_ups hide_stackshide_xshide_y(s_sidsdeckssuitsranksgamesxsy((spysol.pys__init__Ks         cs*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_sxsy((spysol.pysmoveTo[scsy]^t|t|f\}}_|p|o@`|i||_a|i||_b|ii||ndS(N(sintsdxsdys_sxsysitemsmove(s_sdxsdy((spysol.pysmoveBy]s !ics2cd|oe|inf|iidS(N(sunhides_sitemstkraise(s_sunhide((spysol.pystkraisecs cs ghdS(N((s_sstack((spysol.pyshidegscs ijdS(N((s_((spysol.pysunhideiscs kldS(N((s_sssgroup((spysol.pys setSelectedkscsmntdS(N(sSubclassResponsibility(s_sunhide((spysol.pysshowFacemscsoptdS(N(sSubclassResponsibility(s_sunhide((spysol.pysshowBackoscsqrtdS(N(sSubclassResponsibility(s_simage((spysol.pysupdateCardBackgroundqs(s__name__s __module__s__init__s__str__sisHiddensmoveTosmoveBystkraiseshidesunhidesNones setSelectedsshowFacesshowBacksupdateCardBackground(((spysol.pys AbstractCardJs       s_HideableCard_1cs#stZtdZdZRS(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_sstacksitemshxshy((spysol.pyshidets  - +!cs|itjo dSn|i}|iii|iid|i|i |i ddf\|_ |_ t|_dSdS(Nismovei( s_s hide_stacksNonesitemscanvasstkscalls_wsidshide_xshide_y(s_sitem((spysol.pysunhides  3 (s__name__s __module__shidesunhide(((spysol.pys_HideableCard_1ss  s_HideableCard_2cs#tZdZdZRS(NcsG||ijo dSn|iidd||_dS(Nsstateshidden(sstacks_s hide_stacksitemsconfig(s_sstack((spysol.pyshides csN|itjo dSn|iiddt|_dSdS(Nisstatesnormali(s_s hide_stacksNonesitemsconfig(s_((spysol.pysunhides   (s__name__s __module__shidesunhide(((spysol.pys_HideableCard_2s  is _OneImageCardcs_tZdddZdZddZddZdZdZRS( Nic 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_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s +cs@||ij o&|iid|||_ndS(Nsimage(simages_s _active_imagesitemsconfig(s_simage((spysol.pys _setImagesicsK|i o6|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _face_imagestkraisesunhide(s_sunhide((spysol.pysshowFacescsJ|io6|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _back_imagestkraisesunhide(s_sunhide((spysol.pysshowBacks cs8||_|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups _setImage(s_simage((spysol.pysupdateCardBackgrounds cst|t|f\}}|i||_|i||_|i}|iii |ii d|i ||dS(Nsmove( sintsdxsdys_sxsysitemscanvasstkscalls_wsid(s_sdxsdysitem((spysol.pysmoveBys ! (s__name__s __module__s__init__s _setImagesshowFacesshowBacksupdateCardBackgroundsmoveBy(((spysol.pys _OneImageCards   s_OneImageCardWithHideByConfigcsMtZdZdZddZddZdZRS(NcsD||ijo dSn|idt||_dS(Nsimage(sstacks_s hide_stacks _setImagesNone(s_sstack((spysol.pyshides csu|itjo dSn|io|id|in|id|it|_dSdS(Nisimagei(s_s hide_stacksNonesface_ups _setImages _face_images _back_image(s_((spysol.pysunhides   icsY|i oD|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _face_imagesitemstkraise(s_sunhide((spysol.pysshowFaces  csX|ioD|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _back_imagesitemstkraise(s_sunhide((spysol.pysshowBacks   csC||_|i o|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups hide_stacks _setImage(s_simage((spysol.pysupdateCardBackgrounds (s__name__s __module__shidesunhidesshowFacesshowBacksupdateCardBackground(((spysol.pys_OneImageCardWithHideByConfigs   s _TwoImageCardcsGtZdddZddZddZdZRS(Nic 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_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s +<<ics|i ojto0|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__backsconfigs_TwoImageCard__facestkraisesunhide(s_sunhide((spysol.pysshowFaces cs~|iojto0|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__facesconfigs_TwoImageCard__backstkraisesunhide(s_sunhide((spysol.pysshowBacks  cs|iid|dS(Nsimage(s_s_TwoImageCard__backsconfigsimage(s_simage((spysol.pysupdateCardBackgrounds(s__name__s __module__s__init__sshowFacesshowBacksupdateCardBackground(((spysol.pys _TwoImageCards s_TwoImageCardWithHideItemcsGtZdddZddZddZdZRS(Nic 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_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s +@<icsa|i oL|iidd|iidd|i|d|_ndS(Nii'ii(s_sface_ups_TwoImageCardWithHideItem__backsmoves_TwoImageCardWithHideItem__facestkraisesunhide(s_sunhide((spysol.pysshowFaces cs`|ioL|iidd|iidd|i|d|_ndS(Nii*i(s_sface_ups_TwoImageCardWithHideItem__facesmoves_TwoImageCardWithHideItem__backstkraisesunhide(s_sunhide((spysol.pysshowBacks  cs|iid|dS(Nsimage(s_s_TwoImageCardWithHideItem__backsconfigsimage(s_simage((spysol.pysupdateCardBackgrounds(s__name__s __module__s__init__sshowFacesshowBacksupdateCardBackground(((spysol.pys_TwoImageCardWithHideItems sImagesCardbackcstZ edZRS(NcsT  |tjo  |}n ||_ ||_ ||_||_dS(N(s menu_imagesNonesimagesindexs_sname(s_sindexsnamesimages menu_image((spysol.pys__init__ s     (s__name__s __module__sNones__init__(((spysol.pysImagesCardbacks sImagescstZddZ$dZ&dddZ1dZ6dZEeddZzd Z }d Z d Z d Z d dZ dZdZdZdZdZRS(Nicst||_||_||_|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 dataloaderscssr((spysol.pys__init__s&    9 ))      cs $%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_hsimgsfshsw((spysol.pys __loadCard&s!1cs12t|id|id}3tdtt|}4|i|}5|i i t t |i |||dS(Nf40.0f60.0i(smaxs_sCARDWsCARDHsrsintsroundsim1s subsamplesim2s_backsappendsImagesCardbackslensname(s_sim1snamesrsim2((spysol.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_simsnamesbottom((spysol.pys_createMissingImages6s $ & ((ic s.EF|iid} Gd}H|ozI|iit|ii|ii|ii }J| oK||ii d}nLt dd|i |}nMxt|iiDM]`}N|ii|i||iiO||id_P|oP|id|nqWQto#t|i|iijptRxa|iiDR]P}Sy7T|o)U|i|} V|i| |nWn WXnXqZWY|oY|iddnZxt|iiDZ]q}[y7\d|d| f}]|ii|i|Wn ^_nX`|o`|id|nqWaxt|ii Da]q}by7cd|d| f}d|ii|i|Wn efnXg|og|id|nqvWhxt|ii Dh]}i|oj|iit nbld|| f}my"n|i|d dd d} Wnopt } nXq|ii| r|or|id|nqWs|ot|i!it n!v|i!i|id | w|ow|id|nx|i"ydSdS( Niif80.0issteps 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_sappsprogresssfastsrankspstepsnamesisnsextsim((spysol.pysloadEsz  3 ! & -            "      cs<z{|t|ii|}||i||iiSdS(N( ssuitslens_scssrankssranksindexs_cardsncards(s_sdeckssuitsranksindex((spysol.pysgetFacezscs4}~|iit|i}|i|iSdS(N(s_scss backindexslens_backsindexsimage(s_sdeckssuitsranksindex((spysol.pysgetBack}scs|idSdS(Ni(s_s_bottom(s_((spysol.pysgetTalonBottomscs|idSdS(Ni(s_s_bottom(s_((spysol.pysgetReserveBottomsicstot|tijpt|djo|idSnd|}|t |ijo|idSn|i|SdS(Niii( s __debug__stypessuitstypessIntTypesAssertionErrors_s_bottomsislen(s_ssuitsi((spysol.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_srank((spysol.pys getLetters/csWto|djpt|t|ijo tSn|i|SdS(Ni(s __debug__sncardssAssertionErrorslens_s_shadowsNone(s_sncards((spysol.pys getShadows cs|i|iSdS(N(s_s_shades _shade_index(s_((spysol.pysgetShadescs|iSdS(N(s_s_back(s_((spysol.pys getCardbackss(s__name__s __module__s__init__sdestructs_Images__loadCards_Images__addBacks_createMissingImagessNonesloadsgetFacesgetBacksgetTalonBottomsgetReserveBottoms getSuitBottomsgetBraidBottoms getLetters getShadowsgetShades getCardbacks(((spysol.pysImagess    5        sSubsampledImagescs2tZddZdZdZRS(Nicsti|t|id||i|i||_|i|i ||_ |i|i ||_ x~|i D]p}|tjo|i i tnD|i i|}|i i tt|i |i||qW|i|if\}}xy|iD]k}|tjptddddfjo|ii tn&|ii t|dd||qWdS(Nsriii(sImagess__init__s_sNonesimagesscssrs _subsamples_cards_bottoms_letters_backsappendsimages subsamplesimsImagesCardbackslensnamesCARDWsCARDHsCWsCHs_shades tkversions copyImage(s_simagessrsCHs_backsimsCW((spysol.pys__init__s  2 )cstSdS(N(sNone(s_sncards((spysol.pys getShadowscsxg}x[|D]P}|tjp |djo|i|n|i|i|qW|SdS(Ni(ssslsimsNonesrsappends subsample(s_slsrsimss((spysol.pys _subsamples  (s__name__s __module__s__init__s getShadows _subsample(((spysol.pysSubsampledImagess  s AtomicMovecs;tZdZdZdZdZRS(Ncs|i|dS(N(s_sredosgame(s_sgame((spysol.pysdoscst|iSdS(N(sstrs_s__dict__(s_((spysol.pys__repr__scst|iSdS(N(sstrs_s__dict__(s_((spysol.pys__str__scsdSdS(Ni((s_sother((spysol.pys cmpForRedos(s__name__s __module__sdos__repr__s__str__s cmpForRedo(((spysol.pys AtomicMoves    s AMoveMovecsJtZddZdZdZdZdZRS(Nicsgto||j pt||_|i|_|i|_||_ ||_ dS(N( s __debug__s from_stacksto_stacksAssertionErrorsncardss_sids from_stack_ids to_stack_idsframessshadow(s_sncardss from_stacksto_stacksframessshadow((spysol.pys__init__s   c s*|ii|ijo0to"|i||i| pt ng} x6t |D]%}|i }| i|qeW| i|idjoN|i| d\} }|i||| | |d|id|inx!| D]}|i|q WdS(Nisframessshadow(sgamesmovessstatesS_PLAYs __debug__sto_stacks acceptsCardss from_stackscardssncardssAssertionErrorsrangesis removeCardscardsappendsreverses_sframessgetPositionForsxsysanimatedMoveTosshadowscsaddCard( s_sgamesncardss from_stacksto_stackscsisyscardscardssx((spysol.pys__doMoves0   2 cs:|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss from_stack_ids to_stack_id(s_sgame((spysol.pysredoscs:|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss to_stack_ids from_stack_id(s_sgame((spysol.pysundoscsIt|i|ip)t|i|ipt|i|iSdS(N(scmps_sncardssothers from_stack_ids to_stack_id(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__s_AMoveMove__doMovesredosundos cmpForRedo(((spysol.pys AMoveMoves   s AFlipMovecsGtZdZdZdZdZdZRS(Ncs|i|_dS(N(sstacksids_sstack_id(s_sstack((spysol.pys__init__scsB|id}|io|in|idS(Ni(sstackscardsscardsface_upsshowBacksshowFace(s_sgamesstackscard((spysol.pys__doMoves cs$|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysredoscs$|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysundoscst|i|iSdS(N(scmps_sstack_idsother(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__s_AFlipMove__doMovesredosundos cmpForRedo(((spysol.pys AFlipMoves     sATurnStackMovecs>tZddZdZ dZdZRS(NicsOto||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_flags((spysol.pys__init__scs|i|i}|i|i}tot|i djpt tot|i djpt t|i }xt |D]t}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_sgamesto_stacks from_stacksiscardsunhidesl((spysol.pysredos*''  $4 cs  |i|i} |i|i} tot|i djpt  tot|i djpt t|i }xt |D]u}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_sgamesto_stacks from_stacksiscardsunhidesl((spysol.pysundo s,''   !$! csI t|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysATurnStackMoves   sNEW_ATurnStackMovecsJ#tZ$ddZ)dZ;dZCdZKdZRS(NicsO$%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_flags((spysol.pys__init__$scsU)*tot|idjpt+tot|idjpt,x|iD,]}-|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_facescard((spysol.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_sgamesto_stacks from_stack((spysol.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_sgamesto_stacks from_stack((spysol.pysundoCs$!csIKLt|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sother((spysol.pys cmpForRedoKs(s__name__s __module__s__init__s_NEW_ATurnStackMove__doMovesredosundos cmpForRedo(((spysol.pysNEW_ATurnStackMove#s    sAUpdateStackMovecsGOtZPdZSdZ[dZ^dZadZRS(Ncs"PQ|i|_R||_dS(N(sstacksids_sstack_idsflags(s_sstacksflags((spysol.pys__init__PscsvST|id@oU|i||inEW|id@oX|inY|id@oZ|indS(Ni@ii (s_sflagssstacks updateModelsundos updateTexts refreshView(s_sgamesstacksundo((spysol.pys__doMoveSs csH[\|id@ddfjo$]|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysredo[scsH^_|id@ddfjo$`|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysundo^scs3abt|i|ipt|i|iSdS(N(scmps_sstack_idsothersflags(s_sother((spysol.pys cmpForRedoas(s__name__s __module__s__init__s_AUpdateStackMove__doMovesredosundos cmpForRedo(((spysol.pysAUpdateStackMoveOs     sANextRoundMovecs;etZfdZhdZndZtdZRS(Ncsfg|i|_dS(N(sstacksids_sstack_id(s_sstack((spysol.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_sgamesstack((spysol.pysredohs $4csno|i|i}pto||iijptqto|i djptr|i d|_ s|i dS(Ni( sgames allstackss_sstack_idsstacks __debug__ssstalonsAssertionErrorsrounds updateText(s_sgamesstack((spysol.pysundons $!cstut|i|iSdS(N(scmps_sstack_idsother(s_sother((spysol.pys cmpForRedots(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysANextRoundMovees    s ASaveSeedMovecs;vtZwdZydZ{dZ}dZRS(Ncswx|ii|_dS(N(sgamesrandomsgetSeeds_sseed(s_sgame((spysol.pys__init__wscsyz|ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgame((spysol.pysredoyscs{||ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgame((spysol.pysundo{scs}~t|i|iSdS(N(scmps_sseedsother(s_sother((spysol.pys cmpForRedo}s(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pys ASaveSeedMovevs    sAShuffleStackMovecs;tZdZdZdZdZRS(NcsL|i|_ttd|i|_|i i |_ dS(Ncs |iS(N(scsid(sc((spysol.pyss( sstacksids_sstack_idstuplesmapscardsscard_idssgamesrandomsgetSeedsseed(s_sstacksgame((spysol.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(sc((spysol.pyssii(sgames allstackss_sstack_idsstacks __debug__ssstalonsAssertionErrorscard_idsstuplesmapscardssrandomssetSeedsseedsseqslensnsrandintsjs refreshView(s_sgamesseqsjsstacksn((spysol.pysredos$6 %cs|i|i}g}xU|iD]G}|i|}t o|i|jpt |i |q,W||_|i i |i|idS(N(sgames allstackss_sstack_idsstackscardsscard_idssidscs __debug__sAssertionErrorsappendsrandomssetSeedsseeds refreshView(s_sgamescscardssidsstack((spysol.pysundos  ! csIt|i|ip)t|i|ipt|i|iSdS(N(scmps_sstack_idsotherscard_idssseed(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysAShuffleStackMoves   csT| o dSnx*|D]}|i o dSnq#WdSdS(Nii(scardsscsface_up(scardssc((spysol.pys cardsFaceUps  csS| o dSnx)|D]}|io dSnq#WdSdS(Nii(scardsscsface_up(scardssc((spysol.pys cardsFaceDowns   i cst| o dSn|d}xG|dD]8}|i|||ijo dSn|}q:WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmod(scardssmodsdirsc2sc1((spysol.pysisRankSequences     cst| o dSn|d}xZ|dD]K}|i|||ijp|i|ijo dSn|}q:WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc2sc1((spysol.pysisAlternateColorSequences   1  cst| o dSn|d}xZ|dD]K}|i|||ijp|i|ijo dSn|}q:WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc2sc1((spysol.pysisSameColorSequences   1  cst| o dSn|d}xZ|dD]K}|i|||ijp|i|ijo dSn|}q:WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc2sc1((spysol.pysisSameSuitSequences   1  cst| o dSn|d}xZ|dD]K}|i|||ijp|i|ijo dSn|}q:WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc2sc1((spysol.pysisAnySuitButOwnSequences   1  cs ttd|SdS(Ncs |i S(N(ssscards(ss((spysol.pyss(slensfiltersstacks(sstacks((spysol.pysgetNumberOfFreeStacksscsg}xS|D]H}|i p|idi o tSn|i|idqW|o|in|SdS(Ni(scardssstackssssface_upsNonesappendsreverse(sstackssreversescardsss((spysol.pysgetPileFromStackss     sStackcstZhdZdZ!dZ%dZ0dZZdZbdZkdZ od d d Z ze d d d Z d Z d ZdZdZe dZdZdZe dZdZdZdZdZdZdZdZdZdZdZdddZd Z d d!Z!ddd 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/d0Z0d1Z1d d2Z2d3Z3d4d5Z4d6Z5d7Z6d8Z7d9Z8d:Z9d;Z:d<Z;d=Z<d>Z=d?Z>d@Z?dAZ@d dBZAdCZBdDZCd4d4dEZD3dFZE8dGZFgdHZGse dIZH{e dJZIRS(KNc s}t|i}|ii|tt|}tt|}||f}||i |<|||f\}} }||_||_g|_tdddddddddddddd 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#| _'| idjo | i dj| _(d| _)d| _*d| _+dS(Nssuitiscolorsranks base_suits base_colors base_ranksdirismodi smax_moves max_accepts max_cardsi?Bsmin_moveis min_accepts min_cardssbottomsredeals redeal_imgsncardssroundss redeal_strsmisci(,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_sxsysgamescaps controllersmapkeysmodelsidsview((spysol.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_sgroup((spysol.pys initBindings%s cs~01|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|djoIddf\|_|_ nJ|d|djoKddf\|_|_ n]L||ii!d|djoMddf\|_|_ nOddf\|_|_ nP|i"djoGQ|i o1t#|iddjpt#|iddj|_"nT|i$djoIUd|_$Vt#|id|iiiijoWd|_$nnX|i oY|i%ndS( Niiiii'ii?Bi(&s_s CARD_XOFFSETs CARD_YOFFSETsoxsoystypestypessIntTypestuplesmapsintsroundscan_hide_cardss is_visiblescaps max_cardssfiltersNonescanvasspreviewsgamesappsimagessCARDWsCARDHsCWsCHsxscxsyscyshide_xshide_ysheightsis_opensabssmax_shadow_cardss prepareBottom(s_sCHsCWscyscxsoysox((spysol.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_simg((spysol.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_simages((spysol.pysprepareInvisibleBottombs.!csqklto|iidjptmto|iidjptntot|d ptdS(Nissuit(s __debug__s_scapsmin_movesAssertionErrors min_acceptshasattr(s_((spysol.pys assertStackks$$icsop||f\}}q|ii|r|id|s|iot |idjot|idi |nu|i i |i v|i|w|ox|iny|SdS(Nsunhideii(s_smodelsviewscardssappendscardstkraisesunhidescan_hide_cardsslenshidesitemsaddtagsgroups _positionsupdates updateText(s_scardsunhidesupdatesmodelsview((spysol.pysaddCardos# csz{||f\}}|tot|idjpt}|tjo~|id}|i i |i |o|i oB|i t|idjo|idi nn|id=n|i i |i |o|i oq|i t|idjoG||idjp||idjo|idi nnn|ii||o|in|SdS(Niiiii(s_smodelsviews __debug__slenscardssAssertionErrorscardsNonesitemsdtagsgroupsunhidescan_hide_cardssremovesupdates updateText(s_scardsunhidesupdatesmodelsview((spysol.pys removeCardzs('  +  cs-|io|idSntSdS(Ni(s_scardssNone(s_((spysol.pysgetCards cs|iidjoj|i|ii }xIt||iijo,|i|o |Sn|d=q6WntSdS(Ni(s_scapsmax_movescardsslensmin_moves canMoveCardssNone(s_scards((spysol.pysgetPiles cs2|i|\}}|i||dS(N(s_sgetPositionForscardsxsysmoveTo(s_scardsysx((spysol.pys _positionscsW||f\}}|tj o|io|ii||SndSdS(Ni(s_smodelsviewseventsNonescardsscanvassfindCard(s_seventsmodelsview((spysol.pys _findCardsc s||f\} } |tjo| i}n|iii}d}xt t |D]}||}|i |i|i |i|i|if}||djo0||djo||djo||djo |}nqiW|SdS(Niiiii(s_smodelsviewscardssNonesgamesappsimagessindexsrangeslensiscsxsysCARDWsCARDHsr( s_sxsyscardssindexsiscsimagessrsmodelsview((spysol.pys _findCardXYs   /Gcs dS(N((s_sundosflags((spysol.pys updateModelscs4|i|_|i|_|i|_dS(N(s_sidsclonesgamescap(s_sclone((spysol.pys copyModelscs|tjo|id}nt|djo dSn|di|di|ii}||iidjo||iiSn|SdS(Niiii(scardssNones_slensrankscapsmodsdir(s_scardssdir((spysol.pys getRankDirs %csdSdS(Ni((s_((spysol.pysbasicIsBlockedscs8||jp |io dSn|i}t|}||ijp ||ijo dSn|t|i}||i jo dSnx|D]}|i o dSn|i djo|i |i jo dSn|i djo|i |i jo dSn|idjo|i|ijo dSnqW|io|idi Sn|d}|idjo|i |ijo dSn|idjo|i |ijo dSn|idjo|i|ijo dSndSdS(Niii(s from_stacks_sbasicIsBlockedscapslenscardssls min_accepts max_accepts max_cardsscsface_upssuitscolorsranks base_suits base_colors base_rank(s_s from_stackscardsscscapsl((spysol.pysbasicAcceptsCardss:  #    & & &  & & & cs|io dSn|i}t|}||ijp ||ijo dSnt|i|}||ijo dSnt |SdS(Ni( s_sbasicIsBlockedscapslenscardsslsmin_movesmax_moves min_cardss cardsFaceUp(s_scardsscapsl((spysol.pysbasicCanMoveCardss  #  csdSdS(Ni((s_s from_stackscards((spysol.pys acceptsCardsscsdSdS(Ni((s_scards((spysol.pys canMoveCardsscsdSdS(Ni((s_((spysol.pys canFlipCardscstdfSdS(Ni(sNone(s_sstacks((spysol.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.pysflipMovesics9|ii|||d|d||idS(Nsframessshadow(s_sgamesmoveMovesncardssto_stacksframessshadows fillStack(s_sncardssto_stacksframessshadow((spysol.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_ssound((spysol.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_stacksframessshadowssound((spysol.pys playMoveMoves cstSdS(N(sNone(s_((spysol.pysgetBottomImagesc s||f\}} | io| i| ifSn| i| if\}}ddt| it| if\}}}} xv|i D]h}||joPn|| i|}|| i|}|d|}|d| }qW||fSdS(Nii(s_smodelsviewscan_hide_cardssxsyslens CARD_XOFFSETs CARD_YOFFSETsixsiyslxslyscardsscscard( s_scardsiysixscslxsysxsmodelsviewsly((spysol.pysgetPositionFors 3 c s||f\} }  | i}!| i pt|djo "dSn#| ioW$x%|d D$]}%|i|qkW&x"|dD&]}'|i qWn(|di })| i | i f\}}*ddt| i t| if\}}}} +x|dD+]},|i i|-|i }.| i oa/|| i |}0|| i|}1|d|}2|d| }3|i||nq WdS(Niiii(s_smodelsviewscardss is_visibleslenscan_hide_cardsscshidesunhidesitemsxsys CARD_XOFFSETs CARD_YOFFSETsixsiyslxslystkraisesmoveTo( s_siysixscsysitemslxscardssxsmodelslysview((spysol.pys refreshViews0 !    3  cs45|iidjp|iitjo 6dSn7d}8d}9|iiitj oM:|iii};|djo'<d}=|i o >d}nnn?|o@|t |i }nAdo |ii i oBd}Cx|i DC]}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_svisiblestsformatsc((spysol.pys updateText4s0)        !5 !5csxMNto||ijptO|i p|i o PdSnQ||idjo RdSnS|iSdS(Niii(s __debug__scards_scardssAssertionErrors is_visiblesface_upsis_open(s_scard((spysol.pysbasicShallHighlightSameRankMs !  csTU|i|SdS(N(s_sbasicShallHighlightSameRankscard(s_scard((spysol.pysbasicShallHighlightMatchTscs}VW|i|}X|djo YdSnZ|i|}[|i| o \dSn]|iii i }^||||dfg}_x|ii D_]}`x|iD`]w}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_seventsinfosssiscscardscol((spysol.pyshighlightSameRankVs(      ,c sgh|i|}i|djo jdSnk|i|}l|i| o mdSnn|iii i }o|} } pg}qd} rx_|iiDr]N}s||iiijo||iiijo tqnux |iDu]}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_seventsinfoscsisjscolssscardsc2sfoundsc1((spysol.pyshighlightMatchingCardsgsF      /     ,  # &csdSdS(Ni((s_sevent((spysol.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 positions((spysol.pysmiddleclickHandlers / (csdSdS(Ni((s_sevent((spysol.pysrightclickHandlerscs|i|SdS(N(s_s clickHandlersevent(s_sevent((spysol.pysdoubleclickHandlerscsdSdS(Ni((s_sevent((spysol.pyscontrolclickHandlerscs8|iiiio|i|SndSdS(Ni(s_sgamesappsoptshighlight_samerankshighlightSameRanksevent(s_sevent((spysol.pysshiftclickHandlerscsdSdS(Ni((s_sevent((spysol.pysshiftrightclickHandlerscsL|io8|o|iidn|i||ndS(Nsnomove(sdragscardsssounds_sgames playSamplesmoveCardsBackHandlersevent(s_seventsdragssound((spysol.pysreleaseHandlers  cs1x$|iD]}|i|qWdS(N(sdragscardsscards_s _position(s_seventsdragscard((spysol.pysmoveCardsBackHandlers ics|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_dragssoundsr((spysol.pys__defaultClickEventHandlers   cs |i||idSdS(Ni(s_s _Stack__defaultClickEventHandlersevents clickHandler(s_sevent((spysol.pys__clickEventHandlerscs |i||idSdS(Ni(s_s _Stack__defaultClickEventHandlerseventsdoubleclickHandler(s_sevent((spysol.pys__doubleclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsmiddleclickHandler(s_sevent((spysol.pys__middleclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsrightclickHandler(s_sevent((spysol.pys__rightclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventscontrolclickHandler(s_sevent((spysol.pys__controlclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftclickHandler(s_sevent((spysol.pys__shiftclickEventHandlerscs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftrightclickHandler(s_sevent((spysol.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_seventsdrag((spysol.pys__motionEventHandlers  csp|iio|ii|n|iio tSn|i||i|tSdS(N( s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDskeepDrags finishDrag(s_sevent((spysol.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_seventsoptst((spysol.pys__enterEventHandlers  "cs?t|iit|i_t|i_tSdS(N(s after_cancels_smagnetic_mousestimersNonesevents EVENT_HANDLED(s_sevent((spysol.pys__leaveEventHandlerscsH|ii}|it|o|iii ondS(N(s_smagnetic_mousesevents_Stack__leaveEventHandlersNonesgamesdragsstack(s_sevent((spysol.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!|iD]}|iqFW| i | i f\}}x4|i D]&} | 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_seventssoundssxsissssysdragsgamescardsimages((spysol.pys startDrags6'(        cs6|ii}|i o dSnto||ijpt|i|i } |i |i } |p|o |i|_  |i |_  |iiiio|inx'|iD]}|i||qWx'|iD]}|i||qWnt|_dS(N(s_sgamesdragscardss __debug__sstacksAssertionErrorseventsxslastxsdxsyslastysdysappsoptsshades _updateShadesshadowssssmovescardsmoveBysNone(s_seventssscardsdxsdysdrag((spysol.pyskeepDrags$ !  csV|ii}t|it|_|io|i|indS(N(s_sgamesdrags after_cancelstimersNoneseventskeepDrag(s_sdrag((spysol.pys keepDragTimers   c sG|iiii p|iidjo fSnt|}|djp ||i jo fSn |iii } !|di |di f\}} "x\|dD"]M}#|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(Niiisimagesanchor(!s_sgamesappsoptsshadowscanvasspreviewslenscardsslsmax_shadow_cardssimagessxsyscxscyscsabss CARD_YOFFSETs getShadowsimg0simg1sCARDWsdxsCARDHsdysMfxCanvasImagesheights ANCHOR_SEss1ss2slowersitem( s_scardssdxsdyscscxss2ss1slscysimagessimg1simg0((spysol.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|DD]}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ɚ;iiiisimagesanchor(,s_sgamesappsimagessgetShadesimgsNonesCARDWsCARDHsCWsCHsdragscardsscsgetClosestStacksstacksstackssxsysr1_0sr1_1sr1_2sr1_3ssstackssdiffssxssysssnoshade_stackssr2scanshade_stackss acceptsCardssappendsdiffs shade_stacks _deleteShades shade_imgsmoveTosMfxCanvasImagescanvass ANCHOR_NWsshadowsslowersitem(s_sCHsr1_2sr1_3sr1_0sr1_1ssysimagessgamessdiffsdiffsCWscssxsr2simgsdragssssstacksstacks((spysol.pys _updateShade8sV   5!    -)G %1     $  csgh|ii}it|ijt|_k|ilg|_mg|_nx!|i Dn]}o|i q`Wpg|_ qt|_ rg|_ dS(N(s_sgamesdrags after_cancelstimersNones _deleteShadescanshade_stackssnoshade_stackssshadowssssdeletesstackscards(s_sssdrag((spysol.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_seventsdrag((spysol.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_seventsdrag((spysol.pys cancelDrag{s&  !(Js__name__s __module__s__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_StackMethodscsntZedddddZedddddZddddZdddddZRS(Niiics|tjo|iii}n|o|o|iiii o|ii n|i ||||}|o|iin|SdS(N(srowssNones_sgamessssoundsframessappsopts animationssstartDealSamples dealToStackssflipsreversesns stopSamples(s_srowssflipsreversesframesssoundsn((spysol.pysdealRows$ cs|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_srowssflipsreversesframesssoundsn((spysol.pys dealRowAvails$ cs|i p| o dSnto#t|it|jpt|ii|ii}|o t |}|i nx|D]}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_statescsr((spysol.pys dealToStackss* -  ",  #c s|djo |iiidii}n|i p| o dSn|ii |ii } |o t |}|i nd}x?|D]4}to||j ptx |io|d}|o|ii|n|o|idi|jox||iiiD]h}to||j pt|i||ido'|iid||d|PnqHWn$|iid||d|PqWqW|ii| |SdS(Niiisframes(sranks_sgamesss foundationsscaps base_rankscardssstackss enterStatesS_DEALs old_statesreverseslistsnsrs __debug__sAssertionErrorsflipsflipMoves acceptsCardssmoveMovesframess leaveState( s_sstackssflipsreversesframessranksnsssrs old_state((spysol.pysdealToStacksOrFoundationss8        !  (s__name__s __module__sNonesdealRows dealRowAvails dealToStackssdealToStacksOrFoundations(((spysol.pysDealRow_StackMethodss  sDealBaseCard_StackMethodscs2tZdddZddddZRS(Niics|id}|iddd|ddxq|iiiD]]}|i|i _ |o;t d|i}|ii ii|i|fnqEW|SdS(Nisncardsisframessupdate_saveinfois base_rank(s_scardsscs dealBaseCardssframessgamesss foundationssrankscaps base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsid(s_sframessupdate_saveinfossscapsc((spysol.pysdealSingleBaseCards  *csto#|iii|iijptto|i ptxh|djoWto|i pt|i d}xz|ii i D]E}|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_rankisframes(s __debug__s_sgamesmovessstatesS_INITsAssertionErrors base_cardssncardsscardsscsss foundationsscaps base_suitssuitsNonesranks base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsidsface_upsflipMovesmoveMovesframes(s_sncardssframessupdate_saveinfoscscapss((spysol.pys dealBaseCardss(- 7   &(s__name__s __module__sdealSingleBaseCards dealBaseCards(((spysol.pysDealBaseCard_StackMethodss  s TalonStackcstZdddZdZdZdZdZdZdd Zd Z ddd Z d Z 5d Z 7dZ RS(Nic sKti||||d|||_||_|i dS(Nscap( sStacks__init__s_sxsysgamescaps max_roundssnum_deals resetGame(s_sxsysgames max_roundssnum_dealscap((spysol.pys__init__s  csd|_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_sn((spysol.pys assertStacks %cs|iiddSdS(Nssoundi(s_sgames dealCards(s_sevent((spysol.pys clickHandlerscs|i|SdS(N(s_s clickHandlersevent(s_sevent((spysol.pysrightclickHandlerscst|idjSdS(Ni(slens_scards(s_((spysol.pys canDealCardssics dS(N((s_ssound((spysol.pys dealCardsscsxH|iiD]7}x+|io|iddddq"WqWx$|iiD]}|iqaWdS(Nsunhideisupdate(s_sgames allstackssstackscardss removeCards updateText(s_sstack((spysol.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_redealstsdealsimg((spysol.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_scxsimgsimagesscascy((spysol.pys prepareViews<! )  7#'cs56|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage5scs78|iiiiSdS(N(s_sgamesappsgimagessredeal(s_((spysol.pysgetRedealImages7s(s__name__s __module__s__init__s resetGames assertStacks clickHandlersrightclickHandlers canDealCardss dealCardssremoveAllCardss updateTexts prepareViewsgetBottomImagesgetRedealImages(((spysol.pys TalonStacks        sDealRowTalonStackcs9tZ:ddZRS(Nics:;|id|SdS(Nssound(s_s dealRowAvailssound(s_ssound((spysol.pys dealCards:s(s__name__s __module__s dealCards(((spysol.pysDealRowTalonStack9s sInitialDealTalonStackcs#<tZ=dZ?dZRS(Ncs =>dS(N((s_((spysol.pys initBindings=scs?@tSdS(N(sNone(s_((spysol.pysgetBottomImage?s(s__name__s __module__s initBindingssgetBottomImage(((spysol.pysInitialDealTalonStack<s  s OpenStackcsAtZBdZEdZGdZIdZMdZVdZ\dZfdZ rd Z vd 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_sxsysgamescap((spysol.pys__init__BscsEF|i||SdS(N(s_sbasicAcceptsCardss from_stackscards(s_s from_stackscards((spysol.pys acceptsCardsEscsGH|i|SdS(N(s_sbasicCanMoveCardsscards(s_scards((spysol.pys canMoveCardsGscs?IJ|ip|i o KdSnL|idi SdS(Nii(s_sbasicIsBlockedscardssface_up(s_((spysol.pys canFlipCardIs csMN|ip|i oOtdfSnP|id}Q|i|oORxE|DR]:}S||j o|i||oT|dfSnq\WnUtdfSdS(Niii(s_sbasicIsBlockedscardssNones canMoveCardssstackssss acceptsCards(s_sstacksscardsss((spysol.pys canDropCardsMs #csaVW|ii|\}}}X||jo |ioY|iZdSn[dSdS(Nii( s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMove(s_sevents quickstackss dropstackss flipstacks((spysol.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 quickstackss flipstackss dropstackssn((spysol.pysrightclickHandler\s csfg|ii|\}}}h||jo |ioi|ijdSnk||joll|i |ii i \}}m|o=n|iidddo|i||ddpdSnnqdSdS(Nisautodropspriorityissoundii(s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMoves canDropCardssss foundationssto_stacksncardss playSamples playMoveMove(s_sevents quickstackss flipstackssto_stacks dropstackssncards((spysol.pysdoubleclickHandlerfs  ! cs8rs|iiiiot|i|SnudSdS(Ni(s_sgamesappsoptshighlight_cardsshighlightMatchingCardssevent(s_sevent((spysol.pyscontrolclickHandlerrsics-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_seventsdragssoundsstacksdxsdyscards((spysol.pysreleaseHandlervs )), c s|tjo|iii}n|tjo#|iii|iii}ng} |i ox|D]}||j o|i o|i } | o|i || oQ|iit| ||}| i|t|  t| ||fnnq}WnVt|i f\}}|os|i|}|djoM|i |} t| t|jo |i| o | }nnnx||fD]} | o qnx|D]z}||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_stacksspile1spile2sisssscorespilesmoves((spysol.pysquickPlayHandlersH#  !< ,    #!8   +(s__name__s __module__s__init__s acceptsCardss canMoveCardss canFlipCards canDropCardss clickHandlersrightclickHandlersdoubleclickHandlerscontrolclickHandlersreleaseHandlersNonesquickPlayHandler(((spysol.pys OpenStackAs        sAbstractFoundationStackcsYtZdZdZdZdZeedZdZRS(Nc s]t|d|d|dtddddddtti||||f|dS( Nssuits base_suits base_ranksdiris max_accepts max_cardsi ( s kwdefaultscapssuitsACEsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamessuitscap((spysol.pys__init__scstdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCardsscsdSdS(Ni((s_sevent((spysol.pys clickHandlerscsdSdS(Ni((s_sevent((spysol.pysrightclickHandlerscsdSdS(Ni((s_sevents from_stackss to_stacks((spysol.pysquickPlayHandlerscs&|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscaps base_suit(s_((spysol.pysgetBottomImages( s__name__s __module__s__init__s canDropCardss clickHandlersrightclickHandlersNonesquickPlayHandlersgetBottomImage(((spysol.pysAbstractFoundationStacks     sSS_FoundationStackcstZdZRS(Ncsti||| o dSn|ioD|idi|ii|ii|dijo dSnndSdS(Niii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsdirsmod(s_s from_stackscards((spysol.pys acceptsCardss   5(s__name__s __module__s acceptsCards(((spysol.pysSS_FoundationStacks sRK_FoundationStackcs&tZedZdZRS(Nc s,tti|||||f|dS(N( sapplysSS_FoundationStacks__init__s_sxsysgamessuitscap(s_sxsysgamessuitscap((spysol.pys__init__scs_ti|to|iitjptto|iit jptdS(N( sSS_FoundationStacks assertStacks_s __debug__scapssuitsANY_SUITsAssertionErrorscolors ANY_COLOR(s_((spysol.pys assertStacks$(s__name__s __module__sANY_SUITs__init__s assertStack(((spysol.pysRK_FoundationStacks sAC_FoundationStackcs#tZdZdZRS(Nc s?t|d|tti||||t f|dS(Ns base_suit( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgamesANY_SUIT(s_sxsysgamessuitscap((spysol.pys__init__scspti||| o dSn|io0|di|idijo dSnndSdS(Niii(sSS_FoundationStacks acceptsCardss_s from_stackscardsscolor(s_s from_stackscards((spysol.pys acceptsCardss   !(s__name__s __module__s__init__s acceptsCards(((spysol.pysAC_FoundationStacks  sSequenceStack_StackMethodscsGtZdZdZdZdZdZRS(NcstdS(N(sSubclassResponsibility(s_scards((spysol.pys _isSequencescs|i|SdS(N(s_s _isSequencescards(s_scards((spysol.pys_isAcceptableSequencescs|i|SdS(N(s_s _isSequencescards(s_scards((spysol.pys_isMoveableSequencescs|i|| o dSn|i| o dSn|io|i|idg| o dSndSdS(Niii(s_sbasicAcceptsCardss from_stackscardss_isAcceptableSequence(s_s from_stackscards((spysol.pys acceptsCardss  , cs'|i|o |i|SdS(N(s_sbasicCanMoveCardsscardss_isMoveableSequence(s_scards((spysol.pys canMoveCardss(s__name__s __module__s _isSequences_isAcceptableSequences_isMoveableSequences acceptsCardss canMoveCards(((spysol.pysSequenceStack_StackMethodss     s BasicRowStackcstZdZRS(Nc sWt|dddttti||||f||i i i |_ dS(Nsdiris base_rank( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__s"(s__name__s __module__s__init__(((spysol.pys BasicRowStacks sSequenceRowStackcstZdZRS(Nc sBt|ddddtti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__s(s__name__s __module__s__init__(((spysol.pysSequenceRowStacks s AC_RowStackcstZdZRS(Ncs&t||ii|iiSdS(N(sisAlternateColorSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys AC_RowStacks s SC_RowStackcstZdZRS(Ncs&t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys SC_RowStacks s SS_RowStackcstZdZRS(Ncs&t||ii|iiSdS(N(sisSameSuitSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys SS_RowStacks s RK_RowStackcstZdZRS(Ncs&t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys RK_RowStacks sFreeCell_AC_RowStackcstZdZRS(NcsIt|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCardss(s__name__s __module__s canMoveCards(((spysol.pysFreeCell_AC_RowStacks sFreeCell_SS_RowStackcstZdZRS(NcsIt|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCardss(s__name__s __module__s canMoveCards(((spysol.pysFreeCell_SS_RowStacks sSpider_AC_RowStackcstZdZRS(Ncs&t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequences(s__name__s __module__s_isAcceptableSequence(((spysol.pysSpider_AC_RowStacks sSpider_SS_RowStackcstZ dZRS(Ncs&  t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequence s(s__name__s __module__s_isAcceptableSequence(((spysol.pysSpider_SS_RowStacks sYukon_AC_RowStackcs/ tZ dZ dZ dZRS(Nc sB  t|dddd tti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ scsA  |i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2scolor(s_sc1sc2((spysol.pys _isSequence scsg  |i|| o  dSn |io|i|id|d o  dSn dSdS(Niii(s_sbasicAcceptsCardss from_stackscardss _isSequence(s_s from_stackscards((spysol.pys acceptsCards s  , (s__name__s __module__s__init__s _isSequences acceptsCards(((spysol.pysYukon_AC_RowStack s   sYukon_SS_RowStackcs tZ dZRS(NcsA  |i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2ssuit(s_sc1sc2((spysol.pys _isSequence s(s__name__s __module__s _isSequence(((spysol.pysYukon_SS_RowStack s sKingAC_RowStackcs tZ dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingAC_RowStack s sKingSS_RowStackcs tZ dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys SS_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingSS_RowStack s sKingRK_RowStackcs tZ dZRS(Nc s<  t|dt tti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys RK_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingRK_RowStack s s WasteStackcs tZ RS(N(s__name__s __module__(((spysol.pys WasteStack s sWasteTalonStackcsD tZ dedZ# dZ' dZ/ ddZRS(Nic s; ! tti||||||f|" ||_ dS(N( sapplys TalonStacks__init__s_sxsysgames max_roundssnum_dealscapswaste(s_sxsysgames max_roundssnum_dealswastescap((spysol.pys__init__ s(csC# $ 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_cards((spysol.pys canDealCards' s  $  ic s/ 0 |ii|ii}1 d}2 |i}3 |io4 |o |ii o5 |ii dn6 t t |i|i }7 to't |i||iijpt8 xut|D8 ]d}9 |idi o: |ii|n; |iid||dddd< |iqWnz= |io|i|ijoY> |o? |ii dd d n@ t |i}A |ii||d dnB |ii|C |SdS( Nis dealwasteiisframesisshadows turnwastespriorityis update_flags(s_sgames enterStatesS_DEALs old_states num_cardsswastescardsssoundsdemos playSamplesminslensnum_deals __debug__scaps max_cardssAssertionErrorsrangesisface_upsflipMovesmoveMoves fillStacksrounds max_roundss turnStackMoves leaveState(s_ssoundsis old_stateswastes num_cards((spysol.pys dealCards/ s*   1 %   (s__name__s __module__sNones__init__s prepareStacks canDealCardss dealCards(((spysol.pysWasteTalonStack s   sFaceUpWasteTalonStackcs#D tZE dZG dZRS(Ncs/E F t|idjo|idi 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__name__s __module__s canFlipCards fillStack(((spysol.pysFaceUpWasteTalonStackD s  sOpenTalonStackcskJ tZK eiZL eiZM eiZN dZQ dZS dZU dZ X dZ RS(Nc s<N O t|ddP tti||||f|dS(Nsmax_movei( s kwdefaultscapsapplys TalonStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__N scsQ R dSdS(Ni((s_((spysol.pys canDealCardsQ scs/S T t|idjo|idi 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_sevent((spysol.pys clickHandlerX s( s__name__s __module__s OpenStacks canMoveCardss canDropCardssreleaseHandlers__init__s canDealCardss canFlipCards fillStacks clickHandler(((spysol.pysOpenTalonStackJ s        s ReserveStackcs#] tZ^ dZa dZRS(Nc sB^ _ t|dddd` tti||||f|dS(Ns max_acceptis max_cards( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__^ scsa b |iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImagea s(s__name__s __module__s__init__sgetBottomImage(((spysol.pys ReserveStack] s  sInvisibleStackcs;c tZd dZh dZk dZm dZRS(Nc sad e ddt|if\}}f t|ddddg ti||||d|dS(Ni smax_moveis max_acceptscap( slensgames allstackssxsys kwdefaultscapsStacks__init__s_(s_sgamescapsysx((spysol.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__name__s __module__s__init__s assertStacks initBindingssgetBottomImage(((spysol.pysInvisibleStackc s    s StackWrappercs#o tZp dZu dZRS(Nc sgp q tot|tijptr tot|tpts ||_t ||_ dS(N( s __debug__stypes stack_classstypess ClassTypesAssertionErrors issubclasssStacks_scap(s_s stack_classscap((spysol.pys__init__p s'! c sNu v |ii}w tt|f|x t|i|||f|SdS(N( s_scapscopyscsapplys kwdefaults stack_classsxsysgame(s_sxsysgamescapsc((spysol.pys__call__u s(s__name__s __module__s__init__s__call__(((spysol.pys StackWrappero s  sWeakStackWrappercsy tZz dZRS(Nc s?z { tt|f|i| t|i|||f|SdS(N(sapplys kwdefaultscaps_s stack_classsxsysgame(s_sxsysgamescap((spysol.pys__call__z s(s__name__s __module__s__call__(((spysol.pysWeakStackWrappery s sFullStackWrappercs} tZ~ dZRS(Nc s)~  t|i|||f|iSdS(N(sapplys_s stack_classsxsysgamescap(s_sxsysgamescap((spysol.pys__call__~ s(s__name__s __module__s__call__(((spysol.pysFullStackWrapper} s s HintInterfacecs& tZ dZ edZRS(Ncs   dS(N((s_sgameslevel((spysol.pys__init__ scs  gSdS(N((s_s taken_hint((spysol.pysgetHints s(s__name__s __module__s__init__sNonesgetHints(((spysol.pys HintInterface s  s AbstractHintcs  tZ dZ dZ dZ dfdYZ dZ dZ eedZ  d Z  d Z  d Z  ed Z  d Z dZ dZ dZ eZ dZ edZ dZ dZ dZRS(Ncss  ||_ ||_ d|_ |idjo d|_n t|_ g|_ |idS(Nii'(sgames_slevelsscore_flatten_valuesNones bonus_colors_AbstractHint__clonessreset(s_sgameslevel((spysol.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 tZ dZRS(Ncs3  |i|_ |i| ||_dS(N(sstacks __class__s_s copyModels stackcardsscards(s_sstacks stackcards((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pys AClonedStack s cs6  |i||} |ii| |SdS(N(s_s AClonedStacksstacks stackcardssss_AbstractHint__clonessappend(s_sstacks stackcardsss((spysol.pys ClonedStack scsI  x0|iD ]"} |i|_ t|qW g|_dS(N(s_s_AbstractHint__clonessss AClonedStacks __class__sdestruct(s_ss((spysol.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_movespossah((spysol.pysaddHint s 1$csA  |i} |i |i |i |SdS(N(s_shintssresetssortsreverse(s_shints((spysol.pys __returnHints s     iics3  |i |i} |o|do |dgSn |idjor xh|iD ]Z} |ioD |i|i d|| |i djo |i SnnqcWn |i  |idjo: |i o& |i|i d|iitnn |i SdS(Niiii_i(s_sresetsgames taken_hintslevels allstackssrs canFlipCardsaddHints SCORE_FLIPs_AbstractHint__returnHintss computeHintss canDealCardss SCORE_DEALssstalonsNone(s_s taken_hintsgamesr((spysol.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_stackspilesrpile((spysol.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_stackspilesrpilesrr((spysol.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_stackspilesrpilesrr((spysol.pys_cautiousDemoShallMovePile s$ cs  to||j pt dS t} |i xd|D ]Y} xM|D ];} ||j o% |i ||go Pnnq]W dSqJW dSdS(Nii( s __debug__s from_stacksstackssAssertionErrorspilescardssreversescardsss acceptsCards(s_s from_stacksstackss stackcardsssscardscards((spysol.pys_canDropAllCards s     isblacksredsblue(s__name__s __module__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 tZ dZ dZ dZ dZ dZ!dZ!dZ !dZ  !d Z  !d Z  !d Z !d Z $!d Z,!dZE!dZP!dZ\!dZ^!dZw!eZx!dZ!dZ!dZ!dZRS(Ncs  dSdS(Ni((s_((spysol.pys_preferHighRankMoves si,iidcsU  to|pt d} |oL |i|d|} |i |i i i do |i }nn |io|idi|dijo# ||id|di}n |io# ||id|di}nP |o&!||i|i|di}n !||id|di}!|SdS(Nis stackcardsii(s __debug__spilesAssertionErrorsbonussrpiles_s ClonedStacksrsrrs canDropCardssgamesss foundationssBONUS_DROP_CARDstscardsssuitsBONUS_SAME_SUIT_MOVEsranks_preferHighRankMovessBONUS_NORMAL_MOVEsK(s_srstspilesrpilesrrsbonus((spysol.pys_getMoveCardBonus s   +## &icsL!!to|o|pt!t|it|d}!|SdS(Ni( s __debug__spilesrpilesAssertionErrorsmaxs_sBONUS_FLIP_CARDslensbonus(s_srstspilesrpilesbonus((spysol.pys_getFlipSpecialBonus!si(#iics. ! !| o!|iSn!|di o!|i||||Sn!|i||i i i d|o$!|i |_ !|i|iSn!|i|o|!xr|i i iD!]^}!||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_srstspilesrpilesx((spysol.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_sscorescolorsrstspilesrpilesb1sb2((spysol.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_sscorescolorsrstspilesrpilesb2((spysol.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}no!|i||iiid |d o?!d }@!|i}n B!d }C!||i|i }D!||fSdS( NiiHkiiii`giaixcs stackcardsi_iP(s __debug__stsrsAssertionErrorsncardsscolorscardsspilescscaps base_rankslensdsranksmodsabssscores_sgamessgs talonstackss_canDropAllCardssss foundationssREDsK( s_sscorescolorsrstsncardsscsdspile((spysol.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_sgame((spysol.pys computeHintsE!s #,#c sP!Q!x|DQ!]}R!|i|iii\}}S!|oqT!dt f\}}U!|i |||||\}}V!|i |||||W!|djoX!PnnY!x>|i|DY!]*}Z!|o[!|i|||nqWq WdS(Nii_(s dropstackssrs canDropCardss_sgamesss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHintsstep010b_getPilesspilesstep010_movePilesrows( s_s dropstackssrowssrspilesncardsscolorsscorest((spysol.pysstep010P!s ! $   cs\!]!|ifSdS(N(sstacksgetPile(s_sstack((spysol.pysstep010b_getPiles\!sc s^!_!t|} `!t|i} a!to%d| jo | jnptb!|i| |  } c!d}d!||i i i j}e!x |De!]}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_srspilesrowss r_is_wastesscoresempty_row_seenscolorstslpsrpileslr((spysol.pysstep010_movePile^!s./    +      'c sAx!y!x4|Dy!])} z!x|i| Dz!] } {!| pt| djo |!q)n}!g} ~!d} !x| D!]}!|i | d|g}!|i |\}}!|o || j o>!to|djpt!| i|||| fn!| d} qvW!x| D!] }!|d}!| |dd} !to| i| pt!x|D!]}!|| jp|i| |  o !qxn!d}!|d|i| ii}!dd|d| |d|itf}!|i|t| | ||id |qxWq"Wq)Wq WdS( Niis stackcardsiii@ii?Bs forced_move( srowssrs_sstep020_getPilesspileslens drop_infosiscs ClonedStacksrrs canDropCardss foundationssstacksncardss __debug__sAssertionErrorsappendsdissub_piles canMoveCardssts acceptsCardssscoresKsgetCardsranksBLUEsNonesforcesaddHintsRED(s_srowss foundationssscorescsforcesncardssrrsdisisrspilessub_piles drop_infosstackst((spysol.pysstep020x!s:         ! $  !)c s!!x|D!]} !| i}!| p| i|g o !q n!x|D!]} !| | jp| i| |g o !qXn!|i | d| i |g}!x'|D!]} !| | jo !qn!| i} !| o !qn!|i| |  o !qn!| i t| i t|  } !|i | d| }!|i| | o !qn!d|i}!ddt| | | |itf}!|i|d| | |id|qWqXWq WdS(Ns stackcardsi Ni?Biis forced_move(s foundationssssgetCardscards canMoveCardssrowssts acceptsCardss_s ClonedStackscardsstts dropstackssrsgetPilespileslensrpilesrrsranksscoresBLUEsNonesforcesaddHint(s_s foundationssrowss dropstacksscardsforcesscoresrrsttsssrspilesrpilest((spysol.pysstep030!s4   ' "     # 'c sn!!| o !dSn!xK|D!]@}!|i}!| p|i|g o !q#n!|g}!|it|it| } !|i |d| }!x|D!]} !| |jp| i|| o !qn!|i| |o !qn!d}!|i|t|| || \}}!|i|t||| |!PqWq#WdS(Ns stackcardsi'(s reservestackssrowssrsgetCardscards canMoveCardsspilescardsslensrpiles_s ClonedStacksrrsts acceptsCardssscores_getMovePileScoresNonescolorsaddHint( s_srowss reservestacksscardsscoresrrscolorsrspilesrpilest((spysol.pysstep040!s(     # $   '"cs!!| o !dSndS(N(s reservestacks(s_s reservestackssrows((spysol.pysstep050!s (s__name__s __module__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#!tZ!eiZ!dZRS(Ncs!!dSdS(Ni((s_((spysol.pys_preferHighRankMoves!s(s__name__s __module__s DefaultHints_cautiousShallMovePiles shallMovePiles_preferHighRankMoves(((spysol.pysCautiousDefaultHint!s  sKlondikeType_Hintcs!tZ!RS(N(s__name__s __module__(((spysol.pysKlondikeType_Hint!s sYukonType_Hintcs!tZ!dZRS(NcsX!!|i}!g}!x,!|o!!|i|!|d}q!W!|SdS(Ni(sstacksgetPilespspilessappend(s_sstackspspiles((spysol.pysstep010b_getPiles!s  (s__name__s __module__sstep010b_getPiles(((spysol.pysYukonType_Hint!s sFreeCellType_Hintcs!tZ!RS(N(s__name__s __module__(((spysol.pysFreeCellType_Hint!s s GolfType_Hintcs!tZ!RS(N(s__name__s __module__(((spysol.pys GolfType_Hint!s sSpiderType_Hintcs!tZ!RS(N(s__name__s __module__(((spysol.pysSpiderType_Hint!s sFreeCellSolverWrappercs<!tZ!defdYZ!dZ"dZRS(NsFreeCellSolver_Hintcs/!tZ!dZ!dZ!dZRS(Ncs !!d|id|iSdS(Ns A23456789TJQKsCSHD(scardsrankssuit(s_scard((spysol.pysstr1!scs$!!d|idd|iSdS(NsCSHDs-s A23456789TJQK(scardssuitsrank(s_scard((spysol.pysstr2!sc s!!d} !d}!xL|iiiD!]8}!|io%!|d|i|id}nq(W!|o!| d|d} n!d}!xY|iiiD!]E}!|io%!|d|i |id}n!|d}qW!|o!| d|d} n!xq|iii D!]]}!d}!x.|iD!] }!||i |d}qGW!| t i |d} q(W!tti|i}!y!|i| }Wn!!t}nX!|o!t|}!to|dd jpt!t}!|iii|iii |iii}!xt!|d joc!|d}!tid |||d!} !d d | d || d || d t|f}qIW!|ii |ndS(Nss isFounds:s s -sFC:iis$dd>Z?$d?Z@$d@ZA$dAZB$dBZC$d dCZD$dDZE$eFZG$dEZH$dFZI$dGZJ$dHZK$dIZL$dJZM$dKZN$ddLZO$dMZP$ddNZQ%dOZR=%dPZSB%dQZTG%dRZUJ%dSZVQ%dTZWW%edUZXY%d4d4d4d dVZYf%dWZZ%d dXZ[%dYZ\%dZd[Z]%dZd\Z^%d]Z_%d^Z`%d_Za%d`Zb%daZc%dbZd%dcZe%eddZf%ddZedeZg&d dfdgZh+&edhZi2&diZj&djZk&dkZl&dlZm&dmZn&dnZo&doZp&dpZq&dqZr&d4d4drZs'dsZt'd dtZu 'duZv'dvZw'dwZx'dxZy"'dyZzG'dzZ{['d{Z|m'd d|Z}'d4d d}Z~'d~Z'dZ'd dZ'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_sgameinfo((spysol.pys__init__"s6   !                  csD5"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"x.|iDJ"] }K"|i!L"|i"qWM"|ii#oRN"t$ot%|ii#dpt&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(ss((spysol.pys>"scs?"|iidjS(Ni(ssscapsmax_move(ss((spysol.pys?"ssrounds 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_sappsold_busystimersstack((spysol.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_sapp((spysol.pys__createCommon\"s.                 csx"y"td}z"|i}{"|i||"td|ii |_ }"|i ~"t d|i i |i _ "t d|i i|i _"x.|iD"] }"|i"|iqW"|i"|i|_"||_dS(NsGame.createPreviewics~"|ii|iijS(N(ssscaps max_accepts min_accept(ss((spysol.pys~"scs"|iidjS(Ni(ssscapsmax_move(ss((spysol.pys"s(sTimerstimers_sbusysold_busys_Game__createCommonsappsmaxscanvasspreviews createGamesfilterssgs openstackss dropstackss hp_stackss allstackssstacks prepareStacks assertStacksoptimizeRegionss createCardsscards(s_sappsold_busystimersstack((spysol.pys createPreviewx"s  !!   csb""x!|iD"]}"t|qW"x.|iD"] }"|i"t|q7WdS(N(s_scardssobjsdestructs allstacks(s_sobj((spysol.pysdestruct"s   cs""d|_"t|_"tdt"dd"dd|_"tdg|_"tdt"dd "d d |_"td d "d d "dd "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_roundisncardsishintsshighlight_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_srestart((spysol.pysreset"sL                              cs""|ii|iSdS(N(s_sappsgetGameTitleNamesid(s_((spysol.pys getTitleName"scs9""t|i}"|o"d|Sn"|SdS(Ns#(sstrs_srandomsssformat(s_sformatss((spysol.pys getGameNumber"s cs:""tt|tt|f\|_|_dS(N(sintsroundswshs_swidthsheight(s_swsh((spysol.pyssetSize"scse""|io"|iid|n"|io |iio"|iiid|ndS(Nscursor(s_scanvassconfigscursorsappstoolbars setCursor(s_scursor((spysol.pys setCursor"s cs""|idf\}|_"|idt"|i"|id|"|i"|i |"|i "t o)t |iii|iijpt"x!|iD"]}"|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"]}"|iqW"|i"|idd"|i*"|i$"|o "|i,"d|i_-n"|id|ii."t/i/|i_0"||_dS( Niscursorsrestartsplayers gamenumbersformatsmovesisstatss 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_busysstack((spysol.pysnewGame"sF   3  %1         c s5""|idf\}|_"|o"|in"|i"|i|_"|i|_"|i|_"|i |_ "|i |_ "|i |_ "|i |_ "|i |_ "|i|_"|ii|ii_"to)t|it|iijpt"xtt|iD"]}"xy|ii|D"]d} #| \}}#|i|} #|o#| i n#| i!#|i|i"| qNWq1W#x:|i i#D#])\}}#|i|i%i&|i'qW #|i(| #x!|iD #]}  #| i*qW #|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( Nisplayers 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_busysiscapscard_idsstack_idsface_upsstackscardst((spysol.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_busysgamesfilesp((spysol.pysrestoreGameFromBookmark#s$ cs# #t|i_!#|iii"#x!|iD"#]}##|i q2W$#|i djoN%#xD|i i |i i fD%#]'}&#|o'#|iddnq{WndS(Nistexts(sNones_shintsslistssstalonsremoveAllCardss allstackssstacks resetGamespreviewstextssscores base_rankstsconfig(s_sstackst((spysol.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_sidsrandomsf((spysol.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 startdemosbookmarksholdgamespsfile((spysol.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_srestartsbookmarksholdgamesbsstats((spysol.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_srandomsdummysseed((spysol.pys createRandom]#s   cs@l#m#|ii}n#||joo#||i_np#|SdS(N(s_smovessstates old_state(s_sstates old_state((spysol.pys enterStatel#scsq#r#||i_dS(N(s old_states_smovessstate(s_s old_state((spysol.pys leaveStateq#sc sVs#t#td}u#|i}v#d}w#|ox#d|i|i}ny#g} z#d} {#|i i i |i i if\} }|#xxt|iD|#]d}}#x|iD}#]}~#x|iD~#]}#|i| |||d| d|} #| tjo #qn#| i| #| d} #|o#|id|nqWqW#t|i} #x|iD#]}#|i| || |d| d|} #| tjo #qsn#| i| #| d} #|o#|id|nqsWqW#|o#|idd n#tot| |ijpt#| SdS( NsGame.createCardsif100.0sxsyisstepspercentid( sTimerstimers_sgameinfosgispstepsprogressspercentsncardsscardssidssstalonsxsysrangesdeckssdeckssuitsssuitsrankssranks _createCardscardsNonesappendsupdateslens trump_suitstrumpss __debug__sAssertionError(s_sprogresssrankspstepsdeckssuitstimersysgis trump_suitscardssxscardsid((spysol.pys createCardss#sF     '   '    '    'c s/##t||||d|d|d|SdS(Nsgamesxsy(sCardsidsdeckssuitsranks_sxsy(s_sidsdeckssuitsranksxsy((spysol.pys _createCard#scs+##t|i}#t|itot|djon#g}#xRtdD#]A}#x5ddddfD#]}#|i |||qvWqWW#|}n#|ii #|ii |#|i|}#x@|D#]5}#|iii|dd#|iddqWdS(Ni4i ii'isupdatesunhide(slists_scardss isinstancesrandoms LCRandom31slensfcardssrangesisjsappendsresetsshuffles _shuffleHookscardssstalonsaddCardsshowBack(s_sisjsfcardsscardsscard((spysol.pysshuffle#s )      cs##g}#|ii#|ii|ii}#xjt|iiD#]S}#||}#t |i|||!}#|ii |#|i|qKW#|i|}#x@|D#]5}#|iii|dd#|iddqWdS(Nsupdateisunhide(scardss_srandomsresetsgameinfosncardssdeckssnsrangesdecksislists deck_cardssshufflesextends _shuffleHookscardssstalonsaddCardsshowBack(s_siscardsdeckscardss deck_cardssn((spysol.pysshuffleSeparateDecks#s    cs##|SdS(N(scards(s_scards((spysol.pys _shuffleHook#si?Bcs0##|i|||\}}#||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscards((spysol.pys_shuffleHookMoveToTop#scs0##|i|||\}}#||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscards((spysol.pys_shuffleHookMoveToBottom#sc s##gt|f\}}#x|D#]}}#||\}}#|oK#|i|#|i |||f#t||jo#Pnn#|d}q)W#|i #|i #t d|} #|| fSdS(Nics #|dS(Ni(sitem(sitem((spysol.pys#s(slenscardsssitemssiscsfuncsselects sort_ordersremovesappendsncardsssortsreversesmapsscards( s_scardssfuncsncardsscsisselects sort_orderssitemssscards((spysol.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_sargs((spysol.pys clickHandler#s c s##|io #dSn#|ii|iif\}}#x|iD#]\}}#|djo#|t jo+#|o#|i ddn#qLn#t |tijo+#|o#|i d|n#qLnn#|djo#|t jo+#|o#|i ddn#qLn#t |tijo+#|o#|i d|n#qLnn#|djo#|t jo+#|o#|i ddn#qLn#t |tijo/#|o#|i dd|n#qLn#t |tijo+#|o#|i d|n#qLnn#|djo#|t jo+#|o#|i ddn#qLn#t |tijoh#|oT#t|}#|iiio$|i dd|n$|i d|n$qLnn$|djo$|t jo+$|o$|i ddn$qLn$t |tijoU $d |d |d |d |d f} $|o $|i d|n $qLnn $|d jo  $qLn$t|qLWdS( Ns gamenumberssinfosmovessMoves %dsplayersPlayer sstatss %d: %d/%diistime(s_spreviewsappstoolbars statusbarstbssbskwsitemssksvsNones updateTextstypestypess StringTypesIntTypes StringTypessustrsopts toolbar_sizes TupleTypestsAttributeError(s_skwstbsksvssbst((spysol.pys updateStatus#sz  !                *  csD$$|iio&$|iii|d|d|Sn$dSdS(Nsprioritysloopi(s_sappsaudios playSamplesnamesprioritysloop(s_snamesprioritysloop((spysol.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_sloopsa((spysol.pysstartDealSample$s   ic 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_stitlestextsconfirmsdefaultsd((spysol.pys areYouSure$$s       #cs13$4$t|idd5$dd6$dd}dS(NstitlesNot yet implementedstexts%This function is not yet implemented.sbitmapserror(s MfxDialogs_stopsd(s_sd((spysol.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$]}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$]}[$|i'||qW\$x$|D\$]}]$|i(||q,W^$|djo |o|oC_$|ii*i+|ii*i,f\} }`$|i/|| |}na$|i0i1b$d} c$|od$|||}e$||} f$|o | d jog$t5| n_h$| o| d |joCi$| d} j$|djo| d |joj$| d} nnnk$|| }qWl$x|Dl$]}m$|i6qWn$||i||if\} }o$x$|Do$]}p$|i(| |qWq$|i0i1dS( Niiif0.14999999999999999iiiiif0.0050000000000000001f-0.75f-1.5(7s_sappsopts animationssframessdebugstopswinfo_ismappedsNonesclocksdelaysskipsuclocksSPFs __debug__sAssertionErrorsmovessstatesS_INITsshadowsshadowsstkraisescardsscardsc0sxsfloatsysdxsdystxstysis starttimesintsroundsmxsmysssmovesmoveBys from_stacksimagessSHADOW_XOFFSETsSHADOW_YOFFSETssxssys createShadowsscanvassupdate_idletaskssstepsendtimessleepsusleepsdelete(s_s from_stacksto_stackscardssxsystkraisesframessshadowsskipsstepssxssleepsdxsdysendtimesc0scardsshadowsssystxsclocksistysdelaysss starttimesmysmxsSPF((spysol.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} }$x^|i D}$]P}~$||i i j o4$x*|iD$]}$| i ||fqWnqW$g}$xZtdD$]I}$|iii| \}}$||j o$|i |nq2W$|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_sperfectscssxsissssysacardsstswshscardssold_a((spysol.pys winAnimationr$sF !    "  ' #3/csO$$|djo8$|io$|ii|n$ti|ndS(Ni(ssecondss_stopssleepstime(s_sseconds((spysol.pyssleep$s csd$$|iiitijo%$|djo$|d}nn$|iii|||SdS(Ni i( s_sappscardsetstypesCSIs TYPE_TAROCKsranksimagessgetFacesdeckssuit(s_sdeckssuitsrank((spysol.pysgetCardFaceImage$scs#$$|iii|||SdS(N(s_sappsimagessgetBacksdeckssuitsrank(s_sdeckssuitsrank((spysol.pysgetCardBackImage$sc s$$tdf\}}$x]|D$]R}$|i|d|i|d}$||jo$||f\}}nq"W$|SdS(Niɚ;i( sNonesclosestscdistsstackssstacksxscxsyscysdist( s_scxscysstackss dragstacksdistsclosestscdistsstack((spysol.pys_getClosestStack$s #cs$$|i|if\}}$x|iiD$]p\}}$||djo0||djo||djo||djo$|i ||||Snq.W$|i |||ii |SdS(Niiii( scardsxsyscxscys_sregionssinfosstackssrects_getClosestStacks dragstacks remaining(s_scards dragstacksrectscyscxsstacks((spysol.pysgetClosestStack$s G!c s$$tot|djpt$toDt|djo'|d|djo|d|djpt$x|D$]}$to|o ||ijpt$|i|i |f\}}}$toK||djo0||djo||djo||djpt$xR|i i D$]A}$||djo'$to||dj ptnq6WqW$|i i i|t|i i  t|t|fdS(Niiiii(s __debug__slensstackssAssertionErrorsrectsss_s allstackssxsysrsregionssdatasdsprioritysappendstuple( s_sstackssrectsprioritysdsssrsysx((spysol.pys setRegion$s$N (!U /cs'$$|iii$|iii$g|i_$x;|iiD$]*}$|iii|d|dfqHW$t|ii|i_$t |i i }$x_|iiD$]N\}}$x<|D$]1}$x%$||jo$|i|qWqWqW$t||i_ dS(Nii(s_sregionssdatassortsreversesinfosdsappendstupleslistssgs openstackss remainingsstackssrectsstacksremove(s_srectsdsstacks remainingsstacks((spysol.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_statesn((spysol.pys dealCards$s   cs $$dS(N((s_sstack((spysol.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_version((spysol.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_srestart((spysol.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_swon((spysol.pys getWinStatus$s 1Ocs$$|io %dSn%|i\}}}%|o|idjo/%||i_ %|i ii t ||nB%|i o%||i_%|i iioZ%|i ii |i ii|| %|id|i ii|i ii|inn %| o %|i iio %|iio) %|i ii|i ii|dnS%|iidjo|ii djo)%|i ii|i ii|dnnndS(Nisstatsii(s_spreviews getWinStatusswonsstatussupdatedsdemosgetPlayerMovessstatss demo_updatedsapps updateStatssNoneschangedsgstatssoptsupdate_player_statssplayers updateStatussgetStatssidsloadeds updateLog(s_sdemosstatussupdatedswon((spysol.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_sstatussupdatedswonsd((spysol.pys checkForWin%sN      3& 3&  # #csY=%>%d}?%x-|iiD?%]}@%|t|i}qWA%|t|ijSdS(Ni(scs_sss foundationsslenscards(s_scss((spysol.pys isGameWon=%s   csUB%C%xA|iiDC%]0}D%t|idjoE%|iSnqWF%dSdS(Nii(s_sss foundationsslenscardss getRankDir(s_ss((spysol.pysgetFoundationDirB%s  csG%H%|ii}I%|SdS(N(s_sstatss player_moves(s_s player_moves((spysol.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_sdst((spysol.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_st((spysol.pysgetTimeQ%s  cs)W%X%|ii|ii|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.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_busysmovessn((spysol.pysautoPlayY%s   # c sf%g%|i\} } }h%d}i%xi%|oj%d}k%|o| ol%x| Dl%]|} m%| iofn%|oo%|i dddnp%| i q%d}r%|i s%|i o t%dSnnqXWnu%|o| ov%x| Dv%]} 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 autofaceupsautodropsautodealssoundsncardssto_stacksdone_somethings quickstackssss flipstackss dropstacks((spysol.pys _autoPlayf%sF                csa%%|ii}%|o t|idjo |io%|id|Sn%dSdS(Nissound( s_ssswasteswslenscardss canDealCardss dealCardsssound(s_ssoundsw((spysol.pys _autoDeal%s-cs8%%|iio%|iidffSn%fSdS(Ni(s_ssgs hp_stacks(s_((spysol.pysgetHighlightPilesStacks%sf1.5c s%%| o %dSn%g}%x|D%]\}} } }%to'| |ijo | |ijpt%|i d} %| djo%|i | \} } %|i | \}}%| |idj o | djo%|| }n%||iii}n|%|i | \} } %|i | \}}%||iii}%| |idj o%| |iii| } n%||iii}%t|i| d| d|d|d%dddtd|}%|i| i%|i|q,W%| o %dSn%|ii%|i|%|i%x|D%]}%|iqYW%|ii%t SdS(Niiiswidthisfillsoutline(!sinfositemssssc1sc2scolors __debug__scardssAssertionErrors CARD_YOFFSETssy0sgetPositionForsx1sy1sx2sy2s_sappsimagessCARDHsCARDWsMfxCanvasRectanglescanvassNonesrstkraisesitemsappendsupdate_idletasksssleepsreversesdeletes EVENT_HANDLED(s_sinfossleepsrsy2scolorsitemssx2ssssy0sy1sc2sc1sx1((spysol.pys_highlightCards%sB    1$(    cs%%|i}%| o %dSn%|iii}%g}%x|D%]}}%xq|dD%]b}%|i }%|ot ||djo,%|i ||d|d|dfnqdWqMW%|i||SdS(Niii(s_sgetHighlightPilesStackss stackinfosappsoptshighlight_piles_colorsscolshississsgetPilespileslensappends_highlightCardsssleep(s_s stackinfossleepssishissscolspile((spysol.pyshighlightPiles%s     !4cs%%dSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch%scs%%t|idjSdS(Ni(slensto_stackscards(s_sncardss from_stacksto_stack((spysol.pysgetQuickPlayScore%scs %%dS(N((s_((spysol.pys updateText%scs%%tSdS(N(sNone(s_((spysol.pys getGameScore%scsX%%t|i }%x1|iiD%] }%|dt|i}q&W%|SdS(Ni(slens_scardssvsss foundations(s_sssv((spysol.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_hintshints hint_class((spysol.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_hintsncardssimagessposs text_colorsx2sto_stacks from_stacksy1sy2sinfosx1shs forced_movesscoresarrow((spysol.pysshowHint%sv  ".$ 4 8,  ##,'*  &ics&&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_smixedslevel((spysol.pys startDemo&s         csX+&,&|i o -&dSn.&|iit/&t|_0&t|_1&|idS(N(s_sdemoscanvass setTopImagesNones demo_logos updateMenus(s_sevent((spysol.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_sstatussindexs player_movessdstextsssbitmapsdemosfinishedstimeoutsglsid((spysol.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|nS&||jo&|i&g|_n&&|i||dd &g|_&dSdS( Niif-1.0issoundis taken_hintsframesi(s_smovessindexsdemossleepsappsdebugstopswinfo_ismappedshints _autoDealsshowHintslevelshsscorespossncardss from_stacksto_stacks text_colors forced_moves dealCardsssstalonsgetCardscs last_dealsappendsflipMovesmoveMove( s_sdemoscsncardsshs from_stackspossto_stacks text_colors forced_movesscoressleep((spysol.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_stinfostasfont((spysol.pyscreateDemoInfoText&s% U $cs&&|iiSdS(N(s_sgameinfos short_name(s_((spysol.pysgetDemoInfoText&scs&&ggf\}}&x|iD&]}&|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_stinfositems2sssitems1sti((spysol.pysgetDemoInfoTextAttr&s  !! c s&&|iii|iiif\} }&d| d|id| df\}}&|d|i d|df\} } &ddddg}&x|D&]}&|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(sexprstext((spysol.pyscheck's  csq''|i}'t|tijo;'t||j o!'dtd}'t |nn'|SdS(NsInvalid or damaged s save file( spsloadsobjstypeststypessTypeTypesPACKAGEstexts Exception(stspsobjstext((spysol.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_spsapps version_tuplesdummyscard_idsvtsidsmovessstatssploadsbookmarkschecksversions gsaveinfosnstackss game_versionsncardssgamessaveinfosstackstalon_base_cardsspackagesisjsgstatssvsface_up((spysol.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_sfilenamesbinmodespsf((spysol.pys _saveGame>(s  csWH(I(|iJ(to%d|jo djnptK(|itL(|itM(|it N(|i|O(|i|i P(|i|i Q(|i|i R(|it |iS(xm|iDS(]_}T(|it |iU(x:|iDU(],}V(|i|i W(|i|iq WqWX(|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_spsbookmarkscardsstack((spysol.pys _dumpGameH(s: /  !!cs d(e(dS(N((s_sgame((spysol.pys_restoreGameHookd(scs f(g(dS(N((s_sp((spysol.pys _loadGameHookf(scs h(i(dS(N((s_sp((spysol.pys _saveGameHookh(s(s__name__s __module__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(tZk(edZq(dedZRS(Ncs[k(l(tt||_m(tt||_n(||_o(h|_p(d|_dS(Ns%d(sintsroundsxs_syssuits text_argss text_format(s_sxsyssuit((spysol.pys__init__k(s   scenterc sjq(r(||id<s(||id<t(||id<u(|ii|v(|tj ow(||_ ndS(Nsxsysanchor( sxs_s text_argssysanchorsupdateskwsformatsNones text_format(s_sxsysanchorsformatskw((spysol.pyssetTextq(s (s__name__s __module__sNones__init__ssetText(((spysol.pys _LayoutStackj(s sLayoutcsx(tZy(dddZ(edZ(dZ(ddddZ(dZ(d Z(d Z (d Z (d Z (dd dZ (dddZ )ddddZ5)dddZT)ddddZ{)dddZ)ddddZ)ddddZ)ddddZ *ddddZ2*ddddZQ*ddd Zn*dd!d"ZRS(#Ni c 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_sgamesXMsYMskwsimages((spysol.pys__init__y(s2          csm((t|||}(|i|if}(to|ii | pt (||i|<(|SdS(N( s _LayoutStacksxsyssuitsstacksmapkeys __debug__s_sstackmapshas_keysAssertionError(s_sxsyssuitsmapkeysstack((spysol.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_sstacksanchorsfsysx((spysol.pys getTextAttr(s2))))%  %)isc 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_formatstxstystfsta((spysol.pys createText(s  $!,cs ((|ii||fdS(N(s_sregionssappendsstackssrects(s_sstackssrects((spysol.pys setRegion(scs((|i}(|iio((|i|ii|iii_n(|iio((|i|ii|iii_n(|i(|i dS(N( s_sgamessstalons defaultTextstextssncardsswastesdefaultStackGroupssdefaultRegions(s_sgame((spysol.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_stackst((spysol.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_sgameswaste((spysol.pysdefaultStackGroups(s  #)cs((x|iD(]}(g}(xW|dD(]H}(|i|if}(|ii |}(|i |ii |q0W(|ii ||dqWdS(Nii(s_sregionssregionsstackssssxsysmapkeysgamesstackmapsidsappends allstackss setRegion(s_sssmapkeysregionsidsstacks((spysol.pysdefaultRegions(s   i cs((|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(]-} (|iii||| ||q7W(xFt|| D(]1} (|iii||| ||| qW(|| ||f\}}(|i|iidd|| ddf(xnt|D(]]}(xDt|D(]3} (|iii||| ||d|q*W(|| }qW(|d| } (||| | |i_ }(|o(t"odpt#n(|| ||| f|_$dS( Niiiiii?Bssuiti(%s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsshalfrowssmins playcardssYOFFSETshsmaxsxsysrangesisssappends setRegionssuits foundationsstalonstextss __debug__sAssertionErrorssize(s_srowsstextss playcardssCHsYMsXMsSsXSsYSsCWsishshalfrowsssssuitsssuitsysxsdecks((spysol.pysbakersDozenLayout(s< +%) + /-  1  ics((|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\}})xCt|D)]2} )|iii|||)|| }qHW )xft|D )]U} )xIt|D )]8}  )|| } )|ii i|||d|qWqW )||| |d|| f\}})xCt|D)]2} )|iii|||)|| }q&W)|i!|iid||dddf)||| f\}})||||i_"})|o+)|i$|| ||ddd d n)|||| |f|_%dS( Niiissuitii?Bsanchorsswsformats%3d(&s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssreservesstoprowssmaxsrowssmaxrowssws playcardssYOFFSETshsxsysrangesisssappendssuits foundationss setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardssCHsYMsXMsSsmaxrowssXSsYSsCWsishssssuitsstoprowsswssuitsysxsdecks((spysol.pysfreeCellLayout(sB + %    -) - +iics))|i})|i|if\} })|i|if\}})|i|if\} } )|i i i })t |i i i t|i i i})|dd|d|i} )|t| |d| }  )||f\}}!)xCt|D!)]2} ")|iii|||#)|| }qW$)|i|iidd|| ddf%)xnt|D%)]]}&)xDt|D&)]3} ')|iii||| | |d|qW()|| }qvW))||d| | | f\}}*)|o+)|| d}n,)||||i_}-)|o+.)|i || ||ddd d n/)|ob0)|| }1)||||i_!}2)|o+3)|i ||||dd d d nn4)|||| | f|_"dS( Niiiii?Bssuitsanchorsswsformats%3dsse(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstextsstalonssetTextswastessize(s_srowsswastestextss playcardssCHsYMsXMsSsXSsYSsCWsishssssuitsssuitsysxsdecks((spysol.pys gypsyLayout)s@ +  -  1%  +   /ics5)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)xCt|DA)]2} B)|iii|||C)|| }qJWD)||| f\}}E)|i|iiddd|| dfF)xft|DF)]U}G)xIt|DG)]8} H)|iii|||d|I)|| }qWqWJ)|odK)|d| }L)||||i_}M)|o)N)|i!|| d||ddnnO)|| }P)||||i_"}Q)|o)R)|i!|| d||ddnS)||| | f|_#dS( Niiiii?Bssuitsanchorss($s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssmaxsrowsswastesws playcardssYOFFSETshsxsysrangesisssappends setRegionssuits foundationsstextsssetTextstalonssize(s_srowsswastestextss playcardssCHsYMsXMsSsXSsYSsCWsishssssuitsswssuitsysxsdecks((spysol.pys harpLayout5)sB += % -  %  -  )icsT)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)xft!|Dq)]U}r)xIt!|Dr)]8}s)|ii$i%| ||d |t)|| }qWqWu)||| |f\}}v)|i&|iid ||dd d fw)xCt!|Dw)]2}x)|iii%| ||y)|| }qLWz)|| | || ||f|_'dS(Niiiisanchorsnisnwsformats%3dssuitii?B((s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsrangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersCHsYMsXMsSsmaxrowssfrowssXSsYSsCWsishssuitsssstoprowsssuitsysxsyextrasdecks((spysol.pysklondikeLayoutT)sP +    #% '   -'  %- icsb{)|)|i}})|i|if\} }~)|i|if\}})|i|if\}} )|i i i })t |i i i t|i i i})|dd|d|i} )|t| || } )||f\}})xCt|D)]2} )|iii|||)||}qW)|i|iidd|| ddf)xnt|D)]]})xDt|D)]3} )|iii||| ||d|qW)|| }qrW)|| | f\}})||||i_} )|o+)| i ||||ddd d n)||||| f|_!dS( Niiiii?Bssuitsanchorsswsformats%3d("s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstalonstextsssetTextssize(s_srowsstextss playcardssCHsYMsXMsSsXSsYSsCWsishssssuitsssuitsysxsdecks((spysol.pys yukonLayout{)s2 +  -  1 +cs))|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)]})xIt#|D)]8})|ii&i'| || d |)|| }qW)|djo |djo&)|||f\}} )| }nqW)|||||djf\}})|i(|iid ||dddf)xCt#|D)]2})|iii'| ||)|| }qW)|| | ||||f|_)dS(Niiiiisanchorsnisnwsformats%3dssuitii?B(*s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersCHsYMsXMsSsmaxrowssy0sfrowssXSsYSsCWsx0sishssuitsssstoprowsssuitsysxsyextrasdecks((spysol.pys easyLayout)sX +   #% '   -'  %'- cs))|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)]})xt"|D)]})|| ||| |f\}} )|ii%i&| || d |)||djo |d jo@)|| |||f\}} )d|| f\}}}nqtW)|d}q[W)|| ||f\}})|i'|ii||dd|| |df)xCt"|D)]2})|iii&| ||)|| }qW)||| || ||f|_(dS(Niiiisanchorsnisnwsformats%3di ssuitiii?B()s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsstoprowssyextras playcardssYOFFSETshsmaxsxsyssstalonstextsswastescenterssetTextsdsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersCHsYMsXMsSsy0sXSsYSsCWsx0sdsishssuitsssstoprowsssuitsysxsyextrasdecks((spysol.pys samuriLayout)sT +    #% '   -  %%!!#5 i cs))|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)]n})xItdD)]8})|i i!i"| ||d|)|| }q_W)||| f\}}qFW)|| ||d|| |f\}})xCt|D)]2})|i ii"| ||)|| }qW)|i#|i i| |d| ||d| d|ddf)||| |f\}})xGt|dD)]2}*|i ii"| ||*|| }qW*|| || |f\}}*xGt|dD*]2}*|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 playcardsscentersCHsYMsXMsSsmaxrowssXSsYSsCWsishssssuitsstoprowsswssuitsysxsdecks((spysol.pys sumoLayout)sR +"    %- E !  +cs * *|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*]n} *xIt|D*]8}*|ii i!| ||d|*|| }qW*|| |f\}}qjW*||f\}}*xGt|dD*]2}  *|iii!| ||!*|| }qW"*|| |df\}}#*xGt|dD#*]2} $*|iii!| ||%*|| }qrW&*|i"|iidd| |d|ddf'*|| ||| df\}}(*xt|D(*]t} )*xGt||D)*]2} **|iii!| ||+*|| }q2W,*|| || 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 playcardsscentersCHsYMsXMsSsXSsYSsCWsishssssuitsstoprowsswssuitsysxsdecks((spysol.pys funLayout *sX +""   %  5%  % +cs12*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*xKt|dDB*]6} C*|ii i| ||D*|| |}qWE*| |d| |df\}}F*xKt|dDF*]6} G*|ii i| ||H*|| |}qWI*|i|ii | |d d d fJ*||d| f\}}K*xt|DK*]t} L*xGt||DL*]2} M*|iii| ||N*|| }qWO*|| || d f\}}qWP*||| |f|_ dS( Niiiisanchorsnsformats%dii?Bi(!s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckss __debug__srowssAssertionErrorstoprowssws playcardssYOFFSETshsmaxsxsyssstalonstextsssetTextsrangesisappends setRegionsreservesssize(s_srowssreservesstextss playcardsscentersCHsYMsXMsSsXSsYSsCWsishssstoprowsswsysxsdecks((spysol.pys oonsooLayout2*sD "  / % )  %csFQ*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\} } [*xvtdD[*]e}\*|iii| | | d|]*| |} ^*|djo_*| ||f\} } nqW`*|d|} a*xBt|dDa*]-}b*|ii i| | |||qWc*xFt|dDc*]1}d*|ii i| | |||dqWe*|i|ii ||d| ||d ff*xFt|dDf*]1}g*|iii| ||||d qZWh*xJt|dDh*]5}i*|iii| | ||||d qWj*| | |d|||i_} k*|ol*t odptnm*| |f|_dS( Niiii iissuitii?Bi(s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckss __debug__srowssAssertionErrorsreservesswshsxsysrangesisss foundationssappends setRegionstalonstextsssize(s_srowssreservesstextssYMsXMsishsCHsSssswsxsysXSsYSsCWsdecks((spysol.pys ghulamLayoutQ*sB "") % ! + /1 / 3( ic s_n*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}*xjt|dD*]U}*xIt|D*]8} *|ii i!|||d|*|| }qWqW*||| | d}*|| }*xrt|dD*]]}*xQt|D*]@} *|ii i!|||d||d*|| }q}WqdW*||d| df\}}*xCt|D*]2} *|iii!|||*|| }qW*|i"|iid||d d fdS( Niisanchorsswsformats%3dssuitii?B(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowssrowssfspacesheightswshssizesxsyssstalonssetTextswastesrangessuitsis foundationssappends setRegion(s_srowsswastesheightsfspacesCHsYMsXMsSsfrowssXSsYSsCWsishssuitsssswssuitsysxsdecks((spysol.pysgeneriklonLayoutn*sH +)' +  %   -! (s__name__s __module__s__init__sNones_Layout__createStacks getTextAttrs createTexts setRegions defaultAlls defaultTextsdefaultStackGroupssdefaultRegionssbakersDozenLayoutsfreeCellLayouts gypsyLayouts harpLayoutsklondikeLayouts yukonLayouts easyLayouts samuriLayouts sumoLayouts funLayouts oonsooLayouts ghulamLayoutsgeneriklonLayout(((spysol.pysLayoutx(s,       '+)%'sKlondikecsk*tZ*eiZ*eZ*eZ*e Z *e Z *dddZ *dddZ*dZRS(Niic 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*xH|iiD*]7}*|ii|i|i |i |d |iq W*x?|iiD*].}*|ii|i|i |i |qXW*|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_dealslayoutslsssr((spysol.pys createGame*s %!$. 5 , ic s**x[tdt|iiD*];}*|iiid|ii|d|ddd|q"W*|i *|iiid|*|ii o*|iii ndS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSampleswastes dealCards(s_sflipsreversesi((spysol.pys startGame*s 9 csH**|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s(s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysKlondike*s      s VegasKlondikecsJ*tZ*eiZ*eiZ*ddZ*dZ*dZRS(Nic sW**ti|d|*t|id|id*dddtd|i_ dS(Ns max_roundsisanchorsswsfonts canvas_large( sKlondikes createGames_s max_roundss MfxCanvasTextscanvassheightsgetFontstextssscore(s_s max_rounds((spysol.pys createGame*scs**|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_sb2sb1st((spysol.pys updateText*s cs**|dSdS(Ni(stinfo(s_stinfo((spysol.pysgetDemoInfoTextAttr*s( s__name__s __module__sGamesgetGameScoreCasinos getGameScoresgetGameBalances createGames updateTextsgetDemoInfoTextAttr(((spysol.pys VegasKlondike*s    sCasinoKlondikecs*tZ*dZRS(Ncs**ti|dddS(Ns max_roundsi(s VegasKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s createGame(((spysol.pysCasinoKlondike*s sKlondikeByThreescs*tZ*dZRS(Ncs**ti|dddS(Nsnum_deali(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s createGame(((spysol.pysKlondikeByThrees*s sThumbAndPouch_RowStackcs*tZ*dZRS(Ncs&**t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequence*s(s__name__s __module__s _isSequence(((spysol.pysThumbAndPouch_RowStack*s s ThumbAndPouchcs,*tZ*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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s(s__name__s __module__sThumbAndPouch_RowStacksRowStack_Classs createGamesshallHighlightMatch(((spysol.pys ThumbAndPouch*s   sWhitehead_RowStackcs*tZ*dZRS(Ncs&**t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequence*s(s__name__s __module__s_isAcceptableSequence(((spysol.pysWhitehead_RowStack*s s WhiteheadcsA*tZ*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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s( s__name__s __module__sWhitehead_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys Whitehead*s     s SmallHarpcs#*tZ*eiZ*dZRS(Ncs**xRtt|iiD*]5}*|iiid|ii| ddddqW*|i*|iii*|iii dS(Nsrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame*s  3 (s__name__s __module__sLayouts gypsyLayouts Layout_Methods startGame(((spysol.pys SmallHarp*s  s Eastcliffcs,*tZ*eZ*dZ*dZRS(Ncs**ti|dddS(Ns max_roundsi(sKlondikes createGames_(s_((spysol.pys createGame*scs**x6tdD*]%}*|iiiddddqW*|i*|iii*|iio*|iiindS(Nisflipisframes( srangesis_ssstalonsdealRowsstartDealSampleswastes dealCards(s_si((spysol.pys startGame*s # (s__name__s __module__s AC_RowStacksRowStack_Classs createGames startGame(((spysol.pys Eastcliff*s   s Easthavencs *tZ*eZ*dZRS(Ncs#**ti|dddddS(Ns max_roundsiswastei(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__sDealRowTalonStacks Talon_Classs createGame(((spysol.pys Easthaven*s  s Westcliffcs,*tZ*eeddZ*dZRS(Nsmax_moveics#**ti|dddddS(Ns max_roundsisrowsi (sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs createGame(((spysol.pys Westcliff*s s Westhavencs *tZ*eZ*dZRS(Ncs)**ti|dddddddS(Ns max_roundsisrowsi swastei(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__sDealRowTalonStacks Talon_Classs createGame(((spysol.pys Westhaven*s  sPasSeulcs#*tZ*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__name__s __module__s createGames startGame(((spysol.pysPasSeul*s  s BlindAlleyscs/+tZ+dZ+dZ +dZRS(Ncs#++ti|dddddS(Ns max_roundsisrowsi(sKlondikes createGames_(s_((spysol.pys createGame+scs++|i|dSdS(Ncs+|idj|ifS(Ni(scsrankssuit(sc((spysol.pys+s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook+scs< + +|iiid|iidd +ti|dS(Nsrowssframesi(s_ssstalonsdealRows foundationss Eastcliffs startGame(s_((spysol.pys startGame +s%(s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pys BlindAlleys+s   sSomersetcsJ +tZ +eZ+eeddZ+eZ+dZ +dZ RS(Nsmax_moveic s/++ti|dddddddddS(Ns max_roundsisrowsi swasteistexts(sKlondikes createGames_(s_((spysol.pys createGame+scs++x@tdD+]/}+|iiid|ii|ddqW+|i+|iiid|iid+|iiid|iiddS(Nisrowssframesii(srangesis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame+s  - #( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(((spysol.pysSomerset +s    sCanistercs5+tZ+eZ+eZ+dZ+dZRS(Nc s/++ti|dddddddddS(Ns max_roundsisrowsiswasteistexts(sKlondikes createGames_(s_((spysol.pys createGame+scs++x0tdD+]}+|iiiddqW +|i!+|iii"+|iiid|iidd!dS(Nisframesisrowsii(srangesis_ssstalonsdealRowsstartDealSamplesrows(s_si((spysol.pys startGame+s   (s__name__s __module__sInitialDealTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(((spysol.pysCanister+s    s AgnesSorelcst#+tZ$+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_sc((spysol.pys startGame)+scsP,+-+|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch,+s( s__name__s __module__sDealRowTalonStacks Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(((spysol.pys AgnesSorel#+s  !  sEightTimesEightcs8/+tZ0+eiZ1+eZ2+dZ4+dZRS(Ncs2+3+ti|dddS(Nsrowsi(sKlondikes createGames_(s_((spysol.pys createGame2+scsp4+5+x0tdD5+]}6+|iiiddqW7+|i8+|iii9+|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame4+s   ( s__name__s __module__sLayouts gypsyLayouts Layout_Methods AC_RowStacksRowStack_Classs createGames startGame(((spysol.pysEightTimesEight/+s    s AchtmalAchtcs:+tZ;+dZRS(Ncs;+<+ti|dddd}=+|i}>+|ii|i|iif\}}?+t |i ||dd|i i _ dS(Nsrowsis max_roundsisanchorsne(sKlondikes createGames_slssswastesxsXMsys MfxCanvasTextscanvasstalonstextssrounds(s_sssysxsl((spysol.pys createGame;+s ((s__name__s __module__s createGame(((spysol.pys AchtmalAcht:+s sBatsford_ReserveStackcs@+tZA+dZRS(Ncs@A+B+ti||| o C+dSnD+|ditjSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscards((spysol.pys acceptsCardsA+s (s__name__s __module__s acceptsCards(((spysol.pysBatsford_ReserveStack@+s sBatsfordcsE+tZF+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_slayoutsssysxsl((spysol.pys createGameF+s$ "%6(s__name__s __module__s createGame(((spysol.pysBatsfordE+s s StonewallcsSN+tZO+eZP+eZQ+dddddddfZR+dZ\+dZRS(Niiic s#R+S+ti|dddddd}T+|i}U+t|i|id|i}V+|i |i |i d|i |W+xtdDW+]}}X+xqtdDX+]`}Y+|i |d|i |i||if\}}Z+|iit|||ddqWqW[+|idS( Nsrowsis max_roundsistextsiis max_accept(sKlondikes createGames_slsssmaxsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups(s_sisjslssshsysx((spysol.pys createGameR+s$ #(  5-cs\+]+d}^+x]|iD^+]O}_+|djo`+d}a+|in c+|iiid|d|qWd+|iiid|iie+t o#t |iii djpt dS(Niisflipsframessrows( sframess_sDEALsflipsstartDealSamplessstalonsdealRowsreservess __debug__slenscardssAssertionError(s_sframessflip((spysol.pys startGame\+s   #( s__name__s __module__sInitialDealTalonStacks Talon_Classs AC_RowStacksRowStack_ClasssDEALs createGames startGame(((spysol.pys StonewallN+s    s FlowerGardencsGf+tZg+eeddZh+eZi+dddddddfZRS(Nsmax_moveii(s__name__s __module__s StackWrappers RK_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssDEAL(((spysol.pys FlowerGardenf+s  s KingAlbertcshj+tZk+eZl+eeddZm+eZn+dZ o+ddddfZ p+dZ {+dZ RS(Nsmax_moveii ic s^p+q+ti|ddd|idddd}r+|i}s+t|it|if\}} t+t|i |i | |i }u+|i|id|i||i|v+xt| Dv+]}w+xxt|i|Dw+]`}x+|i|||i|i ||i f\}}y+|iit|||ddqWqWz+|idS( Ns max_roundsisrowsswasteistextsis max_accept(sKlondikes createGames_sROWSslsssmaxsRESERVESslensrwsrhsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups( s_sxsrwsisjslssshsysrh((spysol.pys createGamep+s- '#,  5-csB{+|+ti|dddd}+|iiid|iidS(Nsflipisreverseisrows(sKlondikes startGames_ssstalonsdealRowsreserves(s_((spysol.pys startGame{+s( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssROWSsRESERVESs createGames startGame(((spysol.pys KingAlbertj+s     sRaglancs5~+tZ+dddfZ+dZ+dZRS(Nics++|i|dSdS(Ncs+|idj|ifS(Ni(scsrankssuit(sc((spysol.pys+s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook+scs++x@tdD+]/}+|iiid|ii|ddqW+|i+|iiid|iid+|iiid|ii+|iiid|ii dS(Nisrowssframesi( srangesis_ssstalonsdealRowsrowssstartDealSamplesreservess foundations(s_si((spysol.pys startGame+s - #(s__name__s __module__sRESERVESs _shuffleHooks startGame(((spysol.pysRaglan~+s  sBrigadecsV+tZ+eeddZ+dZ+ddddfZ+dZ+dZRS(Nsmax_moveiiics++x0tdD+]}+|iiiddqW+|i+|iii+|iiid|ii+|iiid|iidS(Nisframesisrows( srangesis_ssstalonsdealRowsstartDealSamplesreservess foundations(s_si((spysol.pys startGame+s  cs5++|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+s( s__name__s __module__s StackWrappers RK_RowStacksRowStack_ClasssROWSsRESERVESs startGamesshallHighlightMatch(((spysol.pysBrigade+s   s Jane_Taloncs2+tZ+dZ+dZ+ddZRS(Ncs++dSdS(Ni((s_((spysol.pys canFlipCard+scs++t|idjSdS(Ni(slens_scards(s_((spysol.pys canDealCards+sics++d}+t|idjo%+|i|iiid|}n+t|idjoe+|ii |+|ii d||iii dddd+|ii |+|d}n+|SdS(Niissoundisframesisshadow( scslens_scardssdealRowsgamesssreservesssoundsflipMovesmoveMoveswaste(s_ssoundsc((spysol.pys dealCards+s %.(s__name__s __module__s canFlipCards canDealCardss dealCards(((spysol.pys Jane_Talon+s   sJanecs+tZ+eZ+eedddeddZ+eedddeZ +dddZ +ddd Z +d Z +dd Z RS( Nsmodi s base_ranks min_cardsiic s++t|dd+tti||f|}+|i}+t |i |i d|i }+|i|i|id|i|+|id|i|i f\} } +xt|D+]}+| |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_roundssreservesslayoutsxsishslsssysx0sstack((spysol.pys createGame+s& #(&   "ic s1++x[tdt|iiD+];}+|iiid|ii|d|ddd|q"W+|i +|iiid|+|iiid|ii +|iii }+td|idd}+xL|iiD+];}+|ii|i+|iii|i|fqWdS( Nisrowssflipsframesisreverses base_ranki (srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSamplesreservessdealSingleBaseCardscsStructsrankscapsupdates__dict__ssaveinfos stack_capssappendsid(s_sflipsreversesssiscscap((spysol.pys startGame+s 9  csP++|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+scs++dSdS(Ni((s_ssound((spysol.pys _autoDeal+s(s__name__s __module__s Jane_Talons Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs AC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatchs _autoDeal(((spysol.pysJane+s  ! sAgnesBernauer_Taloncs+tZ+ddZRS(Nics&++|i|iiid|SdS(Nssound(s_s dealRowAvailsgamesssreservesssound(s_ssound((spysol.pys dealCards+s(s__name__s __module__s dealCards(((spysol.pysAgnesBernauer_Talon+s s AgnesBernauercsM+tZ+eZ+eedddeddZ+dZ+dZ RS(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( s__name__s __module__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 BernauersGypsycs_ ,tZ ,eiZ ,eZ ,eZ,e Z ,e Z ,dZ ,dZ",dZRS(Nc s,,t||if\}},t|dddddd,t|i|f|,|i|i d|i d,|i |ii i |ii i ||_ ,|iio.,t|iii |iii ||_n,xH|iiD,]7},|ii|i|i |i |d|iqW,x?|iiD,].},|ii|i|i |i |qCW,|idS(Nsrowsiswasteistextsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutsssrsl((spysol.pys createGame,s!-. 5 ,csc,,x6tdD,]%},|iiiddddqW ,|i!,|iiidS(Nisflipisframes(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame,s  # csH",#,|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch",s(s__name__s __module__sLayouts gypsyLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysGypsy ,s       sGiant_Foundationcs%,tZ&,dZRS(NcsH&,',ti|| o (,dSn),t|iiiidjSdS(Ni(sSS_FoundationStacks canMoveCardss_scardsslensgamessstalon(s_scards((spysol.pys canMoveCards&,s (s__name__s __module__s canMoveCards(((spysol.pysGiant_Foundation%,s sGiantcs *,tZ+,eZ,,dZRS(Ncs',,-,|i.,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,,s (s__name__s __module__sGiant_FoundationsFoundation_Classs startGame(((spysol.pysGiant*,s  s Irmgard_Taloncs/,tZ0,ddZRS(Nics0,1,|ioe2,t|idjo3,|id|}n)5,|i|iiidd!d|}6,|Sn7,dSdS(Nissoundiii( s_scardsslensdealRowssoundscsgamesssrows(s_ssoundsc((spysol.pys dealCards0,s  ( (s__name__s __module__s dealCards(((spysol.pys Irmgard_Talon/,s sIrmgardcsJ8,tZ9,dZ:,eiZ;,eZ<,eZ =,dZ ?,dZ RS(Nics#=,>,ti|dddddS(Nsrowsi s playcardsi(sGypsys createGames_(s_((spysol.pys createGame=,scs?,@,|ii}A,xPtddDA,]<}B,|iiid||t||!ddddq%WC,|i D,|iiidS(Niisrowssflipisframes( s_sssrowssrsrangesistalonsdealRowslensstartDealSample(s_sisr((spysol.pys startGame?,s  : ( s__name__s __module__s GAME_VERSIONsLayouts harpLayouts Layout_Methods Irmgard_Talons Talon_ClasssKingAC_RowStacksRowStack_Classs createGames startGame(((spysol.pysIrmgard8,s      sDieKoenigsbergerin_TaloncsE,tZF,eiZRS(N(s__name__s __module__sDealRowTalonStacksdealToStacksOrFoundationss dealToStacks(((spysol.pysDieKoenigsbergerin_TalonE,s sDieKoenigsbergerincs5G,tZH,eZI,eeddZJ,dZRS(Nsmax_moveicsDJ,K,|iL,x*tdDL,]}M,|iiiq WdS(Ni(s_sstartDealSamplesrangesissstalonsdealRow(s_si((spysol.pys startGameJ,s  (s__name__s __module__sDieKoenigsbergerin_Talons Talon_Classs StackWrappersSS_FoundationStacksFoundation_Classs startGame(((spysol.pysDieKoenigsbergerinG,s  sDieRussische_FoundationcsN,tZO,dZRS(NcsO,P,ti||| o Q,dSnR,|iojS,|idi}T,|tjo U,d}nV,||ii|ii |dijo W,dSnnX,dSdS(Niiii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksACEscapsdirsmod(s_s from_stackscardssrank((spysol.pys acceptsCardsO,s   +(s__name__s __module__s acceptsCards(((spysol.pysDieRussische_FoundationN,s sDieRussische_RowStackcsY,tZZ,dZRS(NcsIZ,[,ti||| o \,dSn],|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCardsZ,s (s__name__s __module__s acceptsCards(((spysol.pysDieRussische_RowStackY,s s DieRussischecsV^,tZ_,eZ`,eeddZa,eZb,dZ d,dZ f,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(sc((spysol.pyse,si(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHookd,scsf,g,x0tdDg,]}h,|iiiddqWi,|ij,x*tdDj,]}k,|iiiqVWl,|iiid}m,|iiid|ii |i dfdS(Nisframesiiisrowsi( srangesis_ssstalonsdealRowsstartDealSamplescardsscs foundationsssuit(s_sisc((spysol.pys startGamef,s   ( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappersDieRussische_FoundationsFoundation_ClasssDieRussische_RowStacksRowStack_Classs createGames _shuffleHooks startGame(((spysol.pys DieRussische^,s     sMissMilligan_ReserveStackcs#n,tZo,dZs,dZRS(Ncsao,p,ti||| o q,dSnr,t|idjot|iiiidjSdS(Ni( s AC_RowStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscards((spysol.pys acceptsCardso,s css,t,|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImages,s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysMissMilligan_ReserveStackn,s  s MissMilligancsPu,tZv,eeddZw,eZx,eZy,dddZ ,dZ RS(Nsmax_moveiiic sy,z,t||if\}}{,|i|idtd||i|i dtd||i |,|i|i f\} }},|i| |||_~,xStdD~,]B},| |i} ,|ii|i| ||d|dqW,|i||i f\} },| |i|id||i df\}},xIt|D,]8},|i i|i| ||,||i }qZW,|i o*,|i|i d||ddfn ,|i|id,d},|id||id|i |i f\} },xIt|D,]8},| |i} ,|ii|i| ||q4W,|i|i||ddf,|idS( Niiissuitiii?Bsss(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsreservessYSsxsys Talon_Classstalonsrangesis foundationssappendsFoundation_ClasssrxsrysReserveStack_Classs setRegions createTextsRowStack_ClasssdefaultStackGroups( s_srowssreservessrysisrxslsssysx((spysol.pys createGamey,s2I 02 " * 5 &"cs',,|i,|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,s ( s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssMissMilligan_ReserveStacksReserveStack_Classs createGames startGame(((spysol.pys MissMilliganu,s   sNomadcs2,tZ,eZ,eZ,eZ,dZRS(Ncs],,x0tdD,]},|iiiddqW,|i,|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame,s   ( s__name__s __module__sSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_Classs ReserveStacksReserveStack_Classs startGame(((spysol.pysNomad,s    s MilliganCellcs,,tZ,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__name__s __module__s ReserveStacksReserveStack_Classs createGames startGame(((spysol.pys MilliganCell,s   s MilliganHarpcs/,tZ,eeddZ,ddZRS(Nsmax_moveics,,xVtt|iiD,]9},|iiid|ii|dd|ddqW,|i ,|iiidS(Nsrowsisflipsframesi( srangeslens_sssrowssistalonsdealRowsflipsstartDealSample(s_sflipsi((spysol.pys startGame,s  7 (s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs startGame(((spysol.pys MilliganHarp,s sCarltoncs,tZ,dZRS(Ncs,,ti|dddS(Nsflipi(s MilliganHarps startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pysCarlton,s s LexingtonHarpcs&,tZ,dZ,eZ,eZRS(Ni(s__name__s __module__s GAME_VERSIONsYukon_AC_RowStacksRowStack_ClasssYukonType_Hints Hint_Class(((spysol.pys LexingtonHarp,s   s Brunswickcs,tZ,dZRS(Ncs,,ti|dddS(Nsflipi(s LexingtonHarps startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pys Brunswick,s s Mississippics,tZ,dZRS(Ncs,,ti|dddS(Nsrowsi(s LexingtonHarps createGames_(s_((spysol.pys createGame,s(s__name__s __module__s createGame(((spysol.pys Mississippi,s sGriffoncs,tZ,dZRS(Ncs,,ti|dddS(Nsflipi(s Mississippis startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pysGriffon,s sBlockadecsD,tZ,eiZ,eZ,dZ,dZ,dZ RS(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_state((spysol.pys fillStack,s 1( s__name__s __module__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,tZ,RS(N(s__name__s __module__(((spysol.pysFortyThieves_Hint,s s FortyThievescs,tZ,eZ,eZ,eZ,dZ,dZ ,ddfZ ,dZ ,dddddddZ -dZ -d Z-d ZRS( Niiii i i@c sj,,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},x`td|D,]K} ,|ii|i|||d | |d |i,|| i }quW,| i||| i d},| i| i},xRt|D,]A} -|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 isXMsXOFFSETsYBOTTOMiiissuitsmax_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 playcardssXCARDSsXOFFSETsmaxrowssXMsw2sw1sishslsssysxsdecks((spysol.pys createGame,sB0*+/#  5 +$ 4cs--x=t|idD-]%}-|iiiddddqW-x;t|iddD-]}-|iiiddqaW-|i-|iii-|iiidS(Nisflipsframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_si((spysol.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_state((spysol.pys fillStack-s+csH- -|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(((spysol.pys FortyThieves,s         sBusyAcescs&"-tZ#-ddfZ$-dZRS(Niics$-%-ti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame$-s(s__name__s __module__sDEALs createGame(((spysol.pysBusyAces"-s sLimitedcs&-tZ'-ddfZRS(Nii(s__name__s __module__sDEAL(((spysol.pysLimited&-s s Courtyardcs(-tZ)-dZ*-dZRS(Ni?Bi(s__name__s __module__s ROW_MAX_MOVEsFILL_EMPTY_ROWS(((spysol.pys Courtyard(-s  s WaningMooncs+-tZ,-dZRS(Ncs,---ti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame,-s(s__name__s __module__s createGame(((spysol.pys WaningMoon+-s sLucascs.-tZ/-dZRS(Ni?B(s__name__s __module__s ROW_MAX_MOVE(((spysol.pysLucas.-s sDeucescsb0-tZ1-eeddddZ2-eeddZ3-ddfZ4-dZ6-dZ RS(Nsmodi s base_rankiics4-5-|i|dSdS(Ncs5-|idj|ifS(Ni(scsrankssuit(sc((spysol.pys5-s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook4-scsC6-7-|i8-|iiid|ii9-ti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss FortyThievess startGame(s_((spysol.pys startGame6-s ( s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssDEALs _shuffleHooks startGame(((spysol.pysDeuces0-s  sCoronacs8:-tZ;-dZ<-ddfZ=-dZ>-dZRS(Niiics>-?-ti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame>-s(s__name__s __module__sFOUNDATION_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(((spysol.pysCorona:-s   s QuadranglecsG@-tZA-eedddeZB-eeddZC-dZRS(Nsmodi s base_rankcs*C-D-ti|E-|iiidS(N(s FortyThievess startGames_ssstalonsdealSingleBaseCard(s_((spysol.pys startGameC-s( s__name__s __module__s StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SS_RowStacksRowStack_Classs startGame(((spysol.pys Quadrangle@-s s FortyAndEightcsF-tZG-dZRS(Nc s/G-H-ti|dddddddddS(Ns max_roundsisrowsisXCARDSiHsXOFFSET(s FortyThievess createGames_(s_((spysol.pys createGameG-s(s__name__s __module__s createGame(((spysol.pys FortyAndEightF-s s LittleFortycs2I-tZJ-eZK-dZL-dZM-dZRS(Ni?Bics)M-N-ti|dddddddS(Ns max_roundsisnum_dealisXOFFSETi(s FortyThievess createGames_(s_((spysol.pys createGameM-s(s__name__s __module__sSpider_SS_RowStacksRowStack_Classs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(((spysol.pys LittleFortyI-s    sStreetscs O-tZP-eZQ-dZRS(NcsHQ-R-|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchQ-s(s__name__s __module__s AC_RowStacksRowStack_ClasssshallHighlightMatch(((spysol.pysStreetsO-s  sMariacsT-tZU-dZRS(NcsU-V-ti|dddS(Nsrowsi (sStreetss createGames_(s_((spysol.pys createGameU-s(s__name__s __module__s createGame(((spysol.pysMariaT-s s NumberTencs#W-tZX-dZY-ddfZRS(Ni?Bi(s__name__s __module__s ROW_MAX_MOVEsDEAL(((spysol.pys NumberTenW-s  s RankAndFilecs#Z-tZ[-dZ\-ddfZRS(Ni?Bii(s__name__s __module__s ROW_MAX_MOVEsDEAL(((spysol.pys RankAndFileZ-s  s TripleLinecsJ]-tZ^-dZ_-dZ`-dZa-ddfZb-dZc-dZRS(Niii?Biics#c-d-ti|dddddS(Ns max_roundsisrowsi (sStreetss createGames_(s_((spysol.pys createGamec-s(s__name__s __module__s GAME_VERSIONsFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(((spysol.pys TripleLine]-s     s RedAndBlackcsPe-tZf-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(sc((spysol.pysl-s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookk-scsCm-n-|io-|iiid|iip-ti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationssStreetss startGame(s_((spysol.pys startGamem-s ( s__name__s __module__sAC_FoundationStacksFoundation_Classs ROW_MAX_MOVEsDEALs createGames _shuffleHooks startGame(((spysol.pys RedAndBlacke-s     sZebracs2q-tZr-dZs-dZt-dZu-dZRS(Niics)u-v-ti|dddddddS(Ns max_roundsisrowsisXOFFSETi(s FortyThievess createGames_(s_((spysol.pys createGameu-s(s__name__s __module__sFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(((spysol.pysZebraq-s    sIndian_RowStackcsw-tZx-dZRS(Ncs&x-y-t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequencex-s(s__name__s __module__s _isSequence(((spysol.pysIndian_RowStackw-s sIndiancs;z-tZ{-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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sIndian_RowStacksRowStack_ClasssDEALs createGamesshallHighlightMatch(((spysol.pysIndianz-s   s Midshipmancs&-tZ-ddfZ-dZRS(Nics--ti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__sDEALs createGame(((spysol.pys Midshipman-s sNapoleonsExilecs/-tZ-eZ-ddfZ-dZRS(Niics5--|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__s RK_RowStacksRowStack_ClasssDEALsshallHighlightMatch(((spysol.pysNapoleonsExile-s  s DoubleRailcs/-tZ-dZ-ddfZ-dZRS(Ni?Biics--ti|dddS(Nsrowsi(s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__s ROW_MAX_MOVEsDEALs createGame(((spysol.pys DoubleRail-s  s SingleRailcs-tZ-dZRS(Ncs#--ti|dddddS(NsrowsisXCARDSi0(s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__s createGame(((spysol.pys SingleRail-s i 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 RailsDiplomatcs-tZ-eZ-eZ-eZ-dZ-dZ -ddfZ -dZ -dZ -dZ -dZ-dZRS(Niiic s--t||if\}}-|i|id|i|id|i-|i|if\}}-x_t dD-]N}-|i i|i|||d|d-d|i-||i}q{W-|i||if\}}-xUt dD-]D}-|ii|i|||-d|i-||i}qW-|i|i|if\}}-t|||dd|_-|i|id-||i}-t||||_-|i|id-|idS( Niissuitismax_moves max_roundsisnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsrowssRowStack_Classs ROW_MAX_MOVEsheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisssysxsl((spysol.pys createGame-s*/ % "cs--x7t|idD-]}-|iiiddqW-|i-x1t|idD-]}-|iiiqdW-|iiidS(Nisframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_si((spysol.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_state((spysol.pys fillStack-s+cs5--|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sSS_FoundationStacksFoundation_Classs RK_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(((spysol.pysDiplomat-s          sLadyPalkcs-tZ-dZRS(Ni?B(s__name__s __module__s ROW_MAX_MOVE(((spysol.pysLadyPalk-s sCongresscs/-tZ-ddfZ-dZ-dZRS(Niic sD--t||if\}}-|i|id|i|id|i-xt dD-]}-xt dD-]o}-|id||i|i||if\}}-|ii|i|||d|-d|iqyWq`W-xt dD-]}-xt dD-]}-|idd||i|i||if\}}-|i|||d|i}-d|_-|ii|qWqW.|i|if\}}.t|||dd |_.|i|id .||i}.t||||_.|i|id .|idS( Niiissuitsmax_moveiis max_roundsisss(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsys foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsRowStack_Classs ROW_MAX_MOVEsstacks CARD_YOFFSETsrowssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjssslsxsysstack((spysol.pys createGame-s0/  5!  9! (s__name__s __module__sDEALsFILL_EMPTY_ROWSs createGame(((spysol.pysCongress-s  iis Lady PalkisDoubleKlondikecsS .tZ.eiZ.eZ.eZ.dddZ %.dZ +.dZ RS(Niic s<..t||if\}}.t|dddddddd.t|i|f|.|i|i d|i d.t |ii i |ii i |.d |d ||_ .t|iii |iii ||_.xE|iiD.]4} .|iit| i | i |d | iqW.x?|iiD.].} .|ii|i| i | i |q>W.|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_dealslayoutstxstyslstfsssrsta((spysol.pys createGame.s*%!!* 2 , '$+cs%.&.xVtt|iiD&.]9}'.|iiid|ii|dddddqW(.|i).|iii*.|iii dS(Nsrowsisflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame%.s  7 csH+.,.|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+.s( s__name__s __module__sLayouts harpLayouts Layout_MethodsKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysDoubleKlondike .s     sDoubleKlondikeByThreescs..tZ/.dZRS(Ncs/.0.ti|dddS(Nsnum_deali(sDoubleKlondikes createGames_(s_((spysol.pys createGame/.s(s__name__s __module__s createGame(((spysol.pysDoubleKlondikeByThrees..s s Gargantuacs1.tZ2.dZRS(Ncs2.3.ti|dddS(Ns max_roundsi(sDoubleKlondikes createGames_(s_((spysol.pys createGame2.s(s__name__s __module__s createGame(((spysol.pys Gargantua1.s sBigHarpcs,4.tZ5.eZ6.dZ8.dZRS(Ncs#6.7.ti|dddddS(Ns max_roundsisrowsi (sDoubleKlondikes createGames_(s_((spysol.pys createGame6.scs8.9.xRtt|iiD9.]5}:.|iiid|ii| ddddqW;.|i<.|iii=.|iii dS(Nsrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame8.s  3 (s__name__s __module__s AC_RowStacksRowStack_Classs createGames startGame(((spysol.pysBigHarp4.s   sStepscs >.tZ?.eZ@.dZRS(Ncs#@.A.ti|dddddS(Ns max_roundsisrowsi(sDoubleKlondikes createGames_(s_((spysol.pys createGame@.s(s__name__s __module__s AC_RowStacksRowStack_Classs createGame(((spysol.pysSteps>.s  isDouble KlondikeisDouble Klondike by ThreesiisBig Harpi3sPictureGallery_HintcsL.tZM.dZRS(Nc sM.N.|i}O.x|iiDO.]}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||nqW[.|i oQ\.xG|iiD\.]6}].|i}^.| pt|djo _.qFn`.||iijoZa.|i|d|id } b.| it|o c.qFnd.dd|ii}n f.d}g.xz|iiDg.]i}h.||j o|i||o@i.|d|i|di}j.|i|d||k.PnqWqFWnl.|i om.x |iiDm.]}n.|i}o.| pt|djo p.qnq.|i|d|id } r.| it|o s.qnt.xz|ii Dt.]i}u.||j o|i||o@v.d d|i|di}w.|i|d||x.Pnq4WqWny.|i oz.x|ii Dz.]}{.|i}|.| p,t|djpt|t|ijo }.qn~.d }.xz|ii D.]i}.||j o|i||o@.|d|i|di}.|i|d||.Pnq?WqWn.|i!d jo:.|i"o&.|i|i#d|ii$tnndS( Nii_iids stackcardsii8iipi`i(%s_sgamessgs dropstackssrs canDropCardssss foundationsstsnsgetCardscs __debug__sAssertionErrorsranksACEstableauxscaps base_ranks base_scoresKsscoresaddHintshintssgetPilespileslens ClonedStackscardssrrs acceptsCardssNonesrowsslevels canDealCardss SCORE_DEALstalon( s_scsscores base_scoresnsgamesrspilestsrr((spysol.pys computeHintsM.s|  %! !     #    # :   #(s__name__s __module__s computeHints(((spysol.pysPictureGallery_HintL.s sPictureGallery_Foundationcs#.tZ.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_sxsysgame((spysol.pys__init__.s1cs ..|iiiitSdS(N(s_sgamesappsimagess getLettersACE(s_((spysol.pysgetBottomImage.s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysPictureGallery_Foundation.s  sPictureGallery_TableauStackcs/.tZ.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_ranksyoffset((spysol.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_stackscards((spysol.pys acceptsCards.s  * cs&..|iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_((spysol.pysgetBottomImage.s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysPictureGallery_TableauStack.s   sPictureGallery_RowStackcs#.tZ.dZ.dZRS(Ncs^..ti||| o .dSn.|ip|iiiio .dSn.dSdS(Nii(s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalon(s_s from_stackscards((spysol.pys acceptsCards.s    cs..|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage.s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysPictureGallery_RowStack.s  sPictureGallerycs\.tZ.eZ.dZ.dZ.dZ.dZ.dZ.dZ RS(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.]t}.|i} .xOtdD.]>}.|iit| |||d|.| |i } q`W.||}q;W.|i||if\} }.xLtdD.];}.|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 iistableauxisyoffsets max_acceptsseii?B('sLayouts_ssslsminsmaxsYOFFSETsTABLEAU_YOFFSETsYSsthsCHshssetSizesXSsXMsYMsaddattrsxsys foundationssappendsPictureGallery_FoundationsisrangesjstableauxsPictureGallery_TableauStacksrowssPictureGallery_RowStacksheightsDealRowTalonStackstalons createTexts setRegionsCWssgs openstackss talonstackss dropstacks( s_sisjsTABLEAU_YOFFSETslsssthshsysx((spysol.pys createGame.s>"#7"    ( %"4 csL..|iiid|iidd.|i.|iiidS(Nsrowssframesi(s_ssstalonsdealRowstableauxsstartDealSample(s_((spysol.pys startGame.s% cs}..t|iididjo .dSn.x;|iiD.]*}.t|idjo .dSnqAW.dSdS(Niiii(slens_sss foundationsscardsstableauxsstack(s_sstack((spysol.pys isGameWon.s#  csj..|iiioP.||iijot|idjo .|iiid|gnndS(Nisrows(s_ssstalonscardssstacksrowsslensdealRow(s_sstack((spysol.pys fillStack.s,csv..|itjp |itjo .dSn.|i|ijo+|id|ijp|id|ijSdS(Nii(scard1sranksACEscard2ssuit(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch.s# cs..fSdS(N((s_((spysol.pysgetHighlightPilesStacks.s( s__name__s __module__sPictureGallery_Hints Hint_Classs createGames startGames isGameWons fillStacksshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysPictureGallery.s       sPicture Gallerys Braid_Hintcs.tZ.RS(N(s__name__s __module__(((spysol.pys Braid_Hint.s sBraid_Foundationcs#.tZ.dZ.dZRS(Nc sQ..t|dddddtdd.tti|||||f|dS(Nsmodi sdiris base_ranksmax_move( s kwdefaultscapsNO_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__.s%cs..ti||| o .dSn.|i o .dSn.|ii}.|djo=.|id|id|df}.|ddfjSn-.|idi ||i i |di jSdS(Niiscardsi( sAbstractFoundationStacks acceptsCardss_s from_stackscardssgamesgetFoundationDirs stack_dirs getRankDirscard_dirsrankscapsmod(s_s from_stackscardss stack_dirscard_dir((spysol.pys acceptsCards.s  &(s__name__s __module__s__init__s acceptsCards(((spysol.pysBraid_Foundation.s  sBraid_BraidStackcs.tZ.ddZRS(Nic s ..ti||||.|iiii|_.|iiii } .|o.g|_ .d}.d| dti|}.d}.x]t|D.]L}.tt|ti|d}.|i i||.|}qWn).d| d| d| d| f|_ dS( Ni f0.40000000000000002iiif-0.45000000000000001f0.34999999999999998f0.55000000000000004(s OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSETsCARDWsCWssines CARD_XOFFSETsnsmathspisdxslast_xsrangesisintsroundssinsappend( s_sxsysgamessineslast_xsisnsdxsCW((spysol.pys__init__.s     &(s__name__s __module__s__init__(((spysol.pysBraid_BraidStack.s sBraid_RowStackcs#.tZ.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__name__s __module__s fillStacksgetBottomImage(((spysol.pysBraid_RowStack.s  sBraid_ReserveStackcs#/tZ/dZ/dZRS(NcsW//||iiijp||iiijo /dSn/ti|||SdS(Ni( s from_stacks_sgamesssbraidsrowss ReserveStacks acceptsCardsscards(s_s from_stackscards((spysol.pys acceptsCards/s/ cs//|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage/s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysBraid_ReserveStack/s  sBraidcs/tZ/eZ /dZ /eZ /dZ4/dZ:/dZI/dZ L/dZ N/dZ R/dZ U/d Z W/d ZRS( Nic s / /t||if\}} /td|id|i|id|i}/|i d|i |i |i |/t |_/|idt /|i |i f\}}/xtdD/]n}/|iit|d|i ||/|iit|d|i ||/|d |i}qW/|i |i}/xtdD/]}/|iit|||/|iit||i ||/|iit|||i|/|iit||i ||i|/|d|i }q]W/|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 }*/xrtdD*/]a}+/|i$it%||||,/|i$it%||i |||-/||i}qqW./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 sbraidif0.5f4.5iiis max_roundsssssanchorssisnsfonts canvas_cardscardw(,sLayouts_ssslsmaxsYSs BRAID_CARDSsYOFFSETshssetSizesXSsXMsYMsNones base_cardsaddattrsxsysrangesisrowssappendsBraid_RowStacksBraid_ReserveStacksBraid_BraidStacksbraidsWasteTalonStackstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes foundationssBraid_FoundationsgetFontsinfossgs talonstackss openstackss dropstacks(s_sislssshsysx((spysol.pys createGame /sV2(  ** &&-*5   ") *cs4/5/d|it|ii}}6/x56/||it|i i jo7/|d}q-W8/||||f\||<||<9/|SdS(Nii( s_s BRAID_CARDSslensssrowssnsmscardsssuitsgameinfossuits(s_scardssmsn((spysol.pys _shuffleHook4/s $#%csH:/;/t|_/xBt|iD>/].}?/|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/]}G/|ii|i_qWH/|ii idS(Nsrowssframesiiii(sNones_s base_cards updateTextsstartDealSamplesranges BRAID_CARDSsissstalonsdealRowsbraidscardss foundationsssuitsto_stacksflipMovesmoveMovesrankscaps base_ranks dealCards(s_sssisto_stack((spysol.pys startGame:/s     ,  csPI/J/|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchI/scsL/M/fSdS(N((s_((spysol.pysgetHighlightPilesStacksL/scsRN/O/|i|ii|_P/x,|iiDP/]}Q/|ii|i _ q,WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHookN/s cs2R/S/|iidtT/|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHookR/scsU/V/|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHookU/scsW/X/|idjp |ii o Y/dSnZ/|i o [/d}nh]/|i|ii}^/|i}_/|djo`/|d}n"a/|djob/|d}nc/|iii d|dS(Niss Ascendingis Descendingstext( s_spreviewstextssinfos base_cardstsRANKSsranksgetFoundationDirsdirsconfig(s_sdirst((spysol.pys updateTextW/s!  (s__name__s __module__s Braid_Hints Hint_Classs BRAID_CARDSsRANKSs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackss_restoreGameHooks _loadGameHooks _saveGameHooks updateText(((spysol.pysBraid/s     )       s LongBraidcsd/tZe/dZRS(Ni(s__name__s __module__s BRAID_CARDS(((spysol.pys LongBraidd/s is Long Braids Spider_Hintcs,j/tZk/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 di jo@v/t |djp|di |di jo w/dSnnx/|i djot |djo y/dSnz/dSn{/dSdS(Nis stackcardsii(sSpiderType_Hints shallMovePiles_srstspilesrpiles ClonedStacksrrs acceptsCardsslenscardsssuitslevel(s_srstspilesrpilesrr((spysol.pys shallMovePilen/s   !1&  (s__name__s __module__sBONUS_SAME_SUIT_MOVEs_preferHighRankMovess shallMovePile(((spysol.pys Spider_Hintj/s   sSpider_SS_Foundationcs&|/tZ}/edZ/dZRS(Nc sZ}/~/t|dddt/dddddd/tti|||||f|dS( Nsdiris base_ranks min_accepti s max_acceptsmax_movei( s kwdefaultscapsKINGsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__}/scsK//ti||| o /dSn/t||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisSameSuitSequencescapsmodsdir(s_s from_stackscards((spysol.pys acceptsCards/s (s__name__s __module__sANY_SUITs__init__s acceptsCards(((spysol.pysSpider_SS_Foundation|/s sSpider_AC_Foundationcs/tZ/dZRS(NcsK//ti||| o /dSn/t||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisAlternateColorSequencescapsmodsdir(s_s from_stackscards((spysol.pys acceptsCards/s (s__name__s __module__s acceptsCards(((spysol.pysSpider_AC_Foundation/s sSpider_RowStackcs/tZ/dZRS(Ncs//t|idjo/tdfSn/|id}/xE|D/]:}/||j o|i||o/|dfSnqGW/tdfSdS(Ni ii(slens_scardssNonesstackssss acceptsCards(s_sstacksscardsss((spysol.pys canDropCards/s #(s__name__s __module__s canDropCards(((spysol.pysSpider_RowStack/s s RelaxedSpidercs_/tZ/eiZ/eZ/eZ/e Z /e Z /dZ /dZ/dZRS(Nc s//t||if\}}/t|dddddddd/t|i|f|/|i|i d|i d/|i |ii i |ii i ||_ /|iio./t|iii |iii ||_n/xE|iiD/]4}/|ii|i|i |i |d tqW/x?|iiD/].}/|ii|i|i |i |qFW/|idS( Nsrowsi swasteistextsis playcardsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClasssANY_SUITsrowssRowStack_Classs defaultAll(s_slayoutsssrsl((spysol.pys createGame/s%!-. 2 ,cs//x6tdD/]%}/|iiiddddqW/|i/|ii}/|d|d|d|df}/|iiid|dd/|iiidS( Nisflipisframesiii srows( srangesis_ssstalonsdealRowsstartDealSamplesrowssr(s_sisrowssr((spysol.pys startGame/s # %csI//|id|ii|ijp|id|ii|ijSdS(Ni(scard1sranksstack1scapsmodscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch/s(s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSpider_SS_FoundationsFoundation_ClasssSpider_RowStacksRowStack_Classs Spider_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys RelaxedSpider/s       sSpidercs/tZ/dZRS(Ncsc//ti| o /dSn/x0|iiD/]}/|i o /dSnq2W/dSdS(Nii(s RelaxedSpiders canDealCardss_sssrowssrscards(s_sr((spysol.pys canDealCards/s  (s__name__s __module__s canDealCards(((spysol.pysSpider/s sBlackWidow_RowStackcs/tZ/dZRS(Ncs//ti||SdS(N(sSpider_RowStacks canDropCardss_sstacks(s_sstacks((spysol.pys canDropCards/s(s__name__s __module__s canDropCards(((spysol.pysBlackWidow_RowStack/s s BlackWidowcs/tZ/eZRS(N(s__name__s __module__sBlackWidow_RowStacksRowStack_Class(((spysol.pys BlackWidow/s sGroundForADivorce_Taloncs/tZ/ddZRS(Nics{//|io`/td|iii}/| o/|iiid }n/|id|d|Sn/dSdS(Ncs /|iS(N(srscards(sr((spysol.pys/sisrowsssoundi(s_scardssfiltersgamesssrowss dealRowAvailssound(s_ssoundsrows((spysol.pys dealCards/s   (s__name__s __module__s dealCards(((spysol.pysGroundForADivorce_Talon/s sGroundForADivorcecsh/tZ/eiZ/eZ/eede ddZ /ee ddZ /dZ /dZRS(Ns base_ranksmodi cs//ti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame/scs]//x0tdD/]}/|iiiddqW/|i/|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s   (s__name__s __module__sLayouts harpLayouts Layout_MethodsGroundForADivorce_Talons Talon_Classs StackWrappersSpider_SS_FoundationsANY_RANKsFoundation_ClasssSpider_RowStacksRowStack_Classs createGames startGame(((spysol.pysGroundForADivorce/s    sGrandmothersGamecs//tZ/eiZ/dZ/dZRS(Ncs//ti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame/scs]//x0tdD/]}/|iiiddqW/|i/|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s   (s__name__s __module__sLayouts harpLayouts Layout_Methods createGames startGame(((spysol.pysGrandmothersGame/s   s Spiderettecs#/tZ/dZ/dZRS(Ncs#//ti|dddddS(Nsrowsis playcardsi(sSpiders createGames_(s_((spysol.pys createGame/scs//xUtdt|iiD/]5}/|iiid|ii|ddddq"W/|i/|iiidS(Nisrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s  3 (s__name__s __module__s createGames startGame(((spysol.pys Spiderette/s  sBabySpiderettecs/tZ/eZRS(N(s__name__s __module__sBlackWidow_RowStacksRowStack_Class(((spysol.pysBabySpiderette/s s WillOTheWispcs/tZ/dZRS(Ncsc//x6tdD/]%}/|iiiddddqW/|i/|iiidS(Nisflipisframes(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s  # (s__name__s __module__s startGame(((spysol.pys WillOTheWisp/s s SimpleSimoncs,/tZ/eZ/dZ/dZRS(Ncs#//ti|dddddS(Nsrowsi stextsi(sSpiders createGames_(s_((spysol.pys createGame/scs|//xOdddddddfD/]/}/|iiid|ii| d d q"W/|i/|iiidS( Ni iiiiiisrowssframesi(sls_ssstalonsdealRowsrowssstartDealSample(s_sl((spysol.pys startGame/s  - (s__name__s __module__sInitialDealTalonStacks Talon_Classs createGames startGame(((spysol.pys SimpleSimon/s   sRachelcsA/tZ/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__name__s __module__s StackWrappersWasteTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(((spysol.pysRachel/s   sScorpion_RowStackcs/tZ/eiZRS(N(s__name__s __module__sSpider_RowStacks canDropCards(((spysol.pysScorpion_RowStack/s sScorpioncsP/tZ0eedeZ0dZ0dZ 0dZ 0dZ RS(Ns base_rankcs#00ti|dddddS(Nsrowsis playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame0scs00xddddddfD0]d}0|iiid|ii| dddd0|iiid|ii|ddddqW0|i0|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame0s  /3 csH 0 0|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch 0scs 0 0fSdS(N((s_((spysol.pysgetHighlightPilesStacks 0s( s__name__s __module__s StackWrappersScorpion_RowStacksKINGsRowStack_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysScorpion/s    sWaspcs 0tZ0eZ0dZRS(Ncs00xddddddfD0]d}0|iiid|ii| dddd0|iiid|ii|ddddqW0|i0|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame0s  /3 (s__name__s __module__sScorpion_RowStacksRowStack_Classs startGame(((spysol.pysWasp0s  sRougeEtNoir_RowStackcs0tZ0dZRS(Ncs00|i o0tdfSn0xv|D0]k}0x_|id|idfD0]@}0||j o|i||o0|t|fSnqSWq,W0tdfSdS(Niii(s_scardssNonesstackssss acceptsCardsslen(s_sstacksssscards((spysol.pys canDropCards0s  #(s__name__s __module__s canDropCards(((spysol.pysRougeEtNoir_RowStack0s s RougeEtNoircsG0tZ 0eiZ!0eZ"0eZ#0dZ 50dddZ RS(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+0]J},0|ii|}-0|iit|i |i |d |d dqW.0xStd D.0]B}/0|ii|d }00|iit|i |i |q\W10x?|iiD10].}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_slayoutsislsssr((spysol.pys createGame#0s(%!-. 5 ) , iic s5060x\tdt|iiD60]<}70|iiid|ii| d|ddd|q"W80|i 90|iiid|iid d|dS(Nisrowssflipsframesisreversei( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGame50s  : ( s__name__s __module__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/R0tZS0dZ\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_movesn((spysol.pys _getMaxMoveS0s cs?\0]0|id}^0t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCards\0scsK_0`0|it|i}a0t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves AC_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_move((spysol.pys acceptsCards_0s(s__name__s __module__s _getMaxMoves canMoveCardss acceptsCards(((spysol.pysFreeCell_RowStackR0s  sFreeCellcskb0tZc0eiZd0eZe0eZf0e Z g0e e ddZ h0dZu0dZ}0dZRS(Nic sh0i0t||if\}}j0t|ddddddk0t|i|f|l0|i|i d|i dm0|i |ii i |ii i ||_ n0xH|iiDn0]7}o0|ii|i|i |i |d|iqWp0x?|iiDp0].}q0|ii|i|i |i |qWr0x<|iiDr0]+}s0|iit|i |i |qJWt0|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutsssrsl((spysol.pys createGameh0s!- 5 , )csu0v0x0tdDv0]}w0|iiiddqWx0|iy0|iiiz0|ii}{0|iiid|d |0t o#t |iii djpt dS(Nisframesisrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrs __debug__slenscardssAssertionError(s_sisr((spysol.pys startGameu0s  csH}0~0|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch}0s(s__name__s __module__sLayoutsfreeCellLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssFreeCell_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysFreeCellb0s      sRelaxedFreeCellcs,0tZ0eZ0eedddZRS(Nii(s__name__s __module__s AC_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Class(((spysol.pysRelaxedFreeCell0s  sForeCellcs,0tZ0eedeZ0dZRS(Ns base_rankcs00x0tdD0]}0|iiiddqW0|i0|iii0|iiid|ii0to#t |iii djpt dS(Nisframesisrows( srangesis_ssstalonsdealRowsstartDealSamplesreservess __debug__slenscardssAssertionError(s_si((spysol.pys startGame0s  (s__name__s __module__s StackWrappersFreeCell_AC_RowStacksKINGsRowStack_Classs startGame(((spysol.pysForeCell0s s Stalactitescst0tZ0eededdddZ0eeddddZ0eZ 0d Z 0d Z 0d Z RS( Nssuitsmodi s min_cardsismax_moves max_acceptics00ti|dddS(Nsreservesi(sFreeCells createGames_(s_((spysol.pys createGame0scs00x0tdD0]}0|iiiddqW0|i0|iii0|iiid|ii0to#t |iii djpt 0|i t dS(Nisframesisrows(srangesis_ssstalonsdealRowsstartDealSamples foundationss __debug__slenscardssAssertionErrors_restoreGameHooksNone(s_si((spysol.pys startGame0s  -cs=00x0|iiD0]}0|idi|i_qWdS(Ni(s_sss foundationsscardssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook0s ( s__name__s __module__s StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs BasicRowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGames_restoreGameHook(((spysol.pys Stalactites0s !   sRelaxed FreeCelli.iMsBakersGame_RowStackcs/0tZ0dZ0dZ0dZRS(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_movesn((spysol.pys _getMaxMove0s cs?00|id}0t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCards0scsK00|it|i}0t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves SS_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_move((spysol.pys acceptsCards0s(s__name__s __module__s _getMaxMoves canMoveCardss acceptsCards(((spysol.pysBakersGame_RowStack0s  s BakersGamecsM0tZ0eiZ0eZ0eZ0dZ 0dZ 0dZ RS(Nc s00t||if\}}0t|dddddd0t|i|f|0|i|i d|i d0t |ii i |ii i ||_ 0xH|iiD0]7}0|iiit|i |i |d|iqW0x?|iiD0].}0|ii|i|i |i |qW0x?|iiD0].}0|iiit|i |i |qGW0|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizesInitialDealTalonStackstalonsxsys foundationssrsappendsSS_FoundationStackssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutslsssr((spysol.pys createGame0s!* 5 , ,cs00x0tdD0]}0|iiiddqW0|i0|iii0|ii}0|iiid|d 0t o#t |iii djpt dS(Nisframesisrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrs __debug__slenscardssAssertionError(s_sisr((spysol.pys startGame0s  csH00|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch0s( s__name__s __module__sLayoutsfreeCellLayouts Layout_MethodsBakersGame_RowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys BakersGame0s     sKingOnlyBakersGamecs 0tZ0eedeZRS(Ns base_rank(s__name__s __module__s StackWrappersFreeCell_SS_RowStacksKINGsRowStack_Class(((spysol.pysKingOnlyBakersGame0s sEightOffcs)0tZ0dddZ0dZRS(Nic so00t||if\}}0td|i|idd|i}0t||}0|i |i ||i |i|i||i0|i |d|i d|if\} }0xItdD0]8}0|iit| |||0| |i } qW0|i |||i d||if\} }0xIt|D0]8}0|ii|i| ||0| |i } qSW0|i |||i d|i|if\} }0xFt|D0]5}0|i it| ||0| |i } qW0|i|i d||idddf0t|i |i||_0|idS(Niiiiii?B(sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsxsysrangesis foundationssappendsSS_FoundationStacksRowStack_Classsheights ReserveStacks setRegionsCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservessislsssmaxrowsshsysx((spysol.pys createGame0s,+6. "2 "5 -cs00x0tdD0]}0|iiiddqW0|i0|iii0|ii}0|iiid|d|d|d|dg0t o#t |iii djpt dS(Nisframesisrowsiii( srangesis_ssstalonsdealRowsstartDealSamplesreservessrs __debug__slenscardssAssertionError(s_sisr((spysol.pys startGame0s  5(s__name__s __module__s createGames startGame(((spysol.pysEightOff0s sSeahavenTowerscs#0tZ0dZ1dZRS(Ncs`00t||if\}}0td|id|i}0|i|i d|i |i |i|0|i |i f\}}0xEtdD0]4}0|iit||d|i ||qW0x]tdD0]L}0ddddf|}0|iit|||i |||qW0|i |i |if\}}0xItdD0]8}0|ii|i|||0||i }qkW0|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 ii iiiiii?B(!sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsysrangesisreservessappends ReserveStackssuits foundationssSS_FoundationStacksrowssRowStack_Classs setRegionsInitialDealTalonStacksheightstalonssgs openstackss talonstackss dropstackss reservestacks(s_sissuitslssshsysx((spysol.pys createGame0s, / 2 1" "-% cs11x0tdD1]}1|iiiddqW1|i 1|iii 1|iiid|iidd! 1to#t |iii djpt dS(Nisframesisrowsii( srangesis_ssstalonsdealRowsstartDealSamplesreservess __debug__slenscardssAssertionError(s_si((spysol.pys startGame1s  &(s__name__s __module__s createGames startGame(((spysol.pysSeahavenTowers0s  sRelaxedSeahavenTowerscs 1tZ 1eZRS(N(s__name__s __module__sKingSS_RowStacksRowStack_Class(((spysol.pysRelaxedSeahavenTowers 1s sPenguincs1tZ1dZ1eZ1eZ1dddZ(1dZ*1dZ 81dZ ;1dZ >1dZ A1d Z C1d ZRS( Niic s11t||if\}}1td|i|idd|i}1t||}1|i |i |d|i |i||i1t|_1|i|i |if\} }1xUtdD1]D}1|iit| |||dddd1||i}qW1|i|i| |id d d d f1|i |||i d |if\} }1xOt|D1]>}1|ii|i| ||dd 1| |i } qW!1|i |||i d |i|if\} }"1xFt|D"1]5}#1|i it| ||$1| |i } qW%1|i|i d ||id d d f&1t|i d|||_ '1|i!dS( Niiiismodi smax_moveiiii?B("sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsNones base_cardswidthsxsysrangesis foundationssappendsSS_FoundationStacks setRegionsCWsRowStack_Classsheights ReserveStacksCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservessislsssmaxrowsshsysx((spysol.pys createGame1s0+3 " .-. (5 -cs'(1)1|i||didSdS(Nics)1|i|jdfS(Ni(scsrank(scsrank((spysol.pys)1s(s_s_shuffleHookMoveToTopscardssrank(s_scards((spysol.pys _shuffleHook(1scsa*1+1|iiid|_,1|i-1xtdD-1]}.1|iii}/1t o|i |ii jpt 01|ii |i|ii}11|i|ii21|id|ii|ddq9W31x0tdD31]}41|iiiddqW51|i61|iii71t o#t|iiidjpt dS(Niiisframesii(s_ssstalonscardss base_cards _updateStackssrangesisgetCardscs __debug__sranksAssertionErrors foundationsssuitsgameinfosdeckssto_stacksflipMovesmoveMovesdealRowsstartDealSampleslen(s_siscsto_stack((spysol.pys startGame*1s  ' &  csP8191|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch81scs-;1<1|i|ii|_=1|idS(N(s_scardssgamesloadinfos base_card_ids base_cards _updateStacks(s_sgame((spysol.pys_restoreGameHook;1scs2>1?1|iidt@1|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook>1scsA1B1|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHookA1scssC1D1x,|iiDD1]}E1|ii|i_qWF1x4|iiDF1]#}G1|iidd|i_qEWdS(Nii (s_sss foundationss base_cardsrankscaps base_ranksrows(s_ss((spysol.pys _updateStacksC1s   (s__name__s __module__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_RowStackcs#T1tZU1dZX1dZRS(Nc s8U1V1ti||||ddddW1d|_dS(Nsmax_moveis max_accepti(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgame((spysol.pys__init__U1s%csNX1Y1ti||| o Z1dSn[1|idi|didjSdS(Niii (s OpenStacks acceptsCardss_s from_stackscardssrank(s_s from_stackscards((spysol.pys acceptsCardsX1s (s__name__s __module__s__init__s acceptsCards(((spysol.pysEiffelTower_RowStackT1s  s EiffelTowercs\\1tZ]1eZ^1eZ_1dZq1dZu1dZw1e dZ y1dZ RS(Ncs_1`1t||if\}}a1|i|id|i|id|ib1|i}c1xddfddfddfddfd d fd d ffDc1]}d1|i|d|i}e1xJt |d De1]5}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_sisssdsysxsl((spysol.pys createGame_1s&/ @  !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_sevent((spysol.pys getAutoStacksw1scsy1z1|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchy1s( s__name__s __module__sWasteTalonStacks Talon_Classs WasteStacks Waste_Classs createGames startGames isGameWonsNones getAutoStackssshallHighlightMatch(((spysol.pys EiffelTower\1s      sStrictEiffelTowercs {1tZ|1eeddZRS(Ns max_cardsi(s__name__s __module__s StackWrappers WasteStacks Waste_Class(((spysol.pysStrictEiffelTower{1s is Eiffel TowersMatriarchy_Wastecs1tZ1dZRS(NcsJ11ti|1|iiiio1|iiiindS(N(s WasteStacks updateTexts_sgamessstalons_updateMaxRounds(s_((spysol.pys updateText1s(s__name__s __module__s updateText(((spysol.pysMatriarchy_Waste1s sMatriarchy_Taloncs}1tZ1ddddddddd d d d d dddddfZ1d Z1d Z1ddZ1dZRS(Niiiiiiii i i i csf11|i}1d|_1|iii}1xddddfD1]}1t||dit||di}1t||dit||di}1t o||d jpt 1||d jo1|id|_n51|d jp |d jo1|id|_nqCW1|id jo1d |_n1||ijSdS( Ni iiiiiii ii ii( s_s max_roundssoldsgamesssrowssislenscardssl1sl2s __debug__sAssertionError(s_srowssoldsl1sisl2((spysol.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_sncards((spysol.pys canDealCards1s" ics911|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_ssoundswastesncardsscards update_flagssn((spysol.pys dealCards1s2   %&'1$0cs11|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_st((spysol.pys updateText1s (s__name__s __module__sDEALs_updateMaxRoundss canDealCardss dealCardss updateText(((spysol.pysMatriarchy_Talon1s ?  sMatriarchy_UpRowStackcs#1tZ1dZ1dZRS(NcsZ11ti||||d|1dtdddd1dddd 1|i |_dS( Nssuits base_ranksmodi sdiris min_cardss max_cardsi ( s SS_RowStacks__init__s_sxsysgamessuitsKINGs CARD_YOFFSET(s_sxsysgamessuit((spysol.pys__init__1scs&11|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_((spysol.pysgetBottomImage1s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysMatriarchy_UpRowStack1s  sMatriarchy_DownRowStackcs#1tZ1dZ1dZRS(NcsJ11ti||||d|1dtdddd1ddd d dS( Nssuits base_ranksmodi sdiris min_cardsis max_cardsi (s SS_RowStacks__init__s_sxsysgamessuitsQUEEN(s_sxsysgamessuit((spysol.pys__init__1scs&11|iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_((spysol.pysgetBottomImage1s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysMatriarchy_DownRowStack1s  s MatriarchycsP1tZ1eZ1dZ1dZ1dZ1dZ1dZRS(Nc s11t||if\}}1td|idd|i|idd} 1|i d|i |i | |i | 1|i d| |i | f\}} }1|i | |if\}}1xMtdD1]<}1|iit||||d1||i }qW1|i |f\}}1xMtdD1]<}1|iit||||d1||i }qCW1||i d| |id|if\}}1||id}1t||||_1|i|id1||id}1t|||dt|_ 1|i|i d 1t!|i"1|||id d |i i#_$1t!|i"1||d d 1d t%d|i i#_&1|i'dS(Nii iii issss max_roundssnnsanchorsnscentersfonts canvas_large((sLayouts_ssslsmaxsYSsYOFFSETsCHshssetSizesXSsXMsYMsheightscentersc1sc2sxsysrangesisrowssappendsMatriarchy_UpRowStacksMatriarchy_DownRowStacksCWstxsMatriarchy_Wasteswastes createTextsMatriarchy_TalonsVARIABLE_REDEALSstalons MfxCanvasTextscanvasstextssroundssgetFontsmiscsdefaultStackGroups( s_scenterstxsislsssxsysc2sc1sh((spysol.pys createGame1s63,) & &2 % cs 11|i|ddSdS(Ncs1|idj|ifS(Ni (scsrankssuit(sc((spysol.pys1si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch1s ( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(((spysol.pys Matriarchy1s      isCalculation_Hintcs1tZ1dZRS(Ncs911to0||iiijot|djpt1d}1t|i djo#1|t |i di d}n1|i di |i di jo(1d|i di t|i }n[1|i di |i di jo 2d}n*2||i di |i di d}2||fSdS(Nii0uiiii'i N(s __debug__srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore1s: #$($ )(s__name__s __module__s_getMoveWasteScore(((spysol.pysCalculation_Hint1s sBetsyRoss_Foundationcs2tZ2dZRS(Ncs22|iidjo 2dSn2|iio 2t|idjo0 2|ii} 2|iii dt |n 2t|i|ii jo 2|iii ddnE2|idi |ii |ii}2|iii dt |ndS(Niistextsi(s_sgamespreviewstextssmiscslenscardsscaps base_ranksranksconfigsRANKSs max_cardssdirsmod(s_srank((spysol.pys updateText2s !'(s__name__s __module__s updateText(((spysol.pysBetsyRoss_Foundation2s sCalculation_Foundationcs2tZ2dZRS(Ncs&22|iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_((spysol.pysgetBottomImage2s(s__name__s __module__sgetBottomImage(((spysol.pysCalculation_Foundation2s sCalculation_RowStackcs#2tZ2dZ2dZRS(NcsU22ti||| o 2dSn2||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscards((spysol.pys acceptsCards2s cs22|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage2s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysCalculation_RowStack2s  s CalculationcsD2tZ2eZ2dZ<2dZD2dZH2dZRS(Nc s22t||if\}}2td|id|i} 2|id|i |i |i |id|!2|i |i dd}"2||i f\}}#2xtdD#2]}$2t|||d|dd d |d } %2|ii| &2t|i||id||i'2d d dtdd|i| i_(2||i }qW)2dddd}.2t|i||i ||idd|/2d ddtd|i_02|}12|i |id}22xRtdD22]A}32|iit|||dd dd 42||i }qW52|i|id|ddf62|i }72t |||dd |_!82|i"|i!d92||i}:2t#|||dd |_$;2|i%dS(Niif5.5iiis 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_shelpsislssshsysxsx0sstack((spysol.pys createGame2s8 3 +$**!  +" cs<2=2tgd}>2x]|D>2]Q}?2|idjo||itjo$@2|||i<A2|i|nqWB2|iC2||SdS(Nii(sNonestopcardsscardsscsranksremovesreverse(s_scardsscstopcards((spysol.pys _shuffleHook<2s ' csFD2E2|iF2|iiid|iiG2|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGameD2s csH2I2fSdS(N((s_((spysol.pysgetHighlightPilesStacksH2s(s__name__s __module__sCalculation_Hints Hint_Classs createGames _shuffleHooks startGamesgetHighlightPilesStacks(((spysol.pys Calculation2s     s HopscotchcsJ2tZK2dZRS(NcsK2L2tgd}M2xm|DM2]a}N2|idjo!|idjo||itjo$O2|||i<P2|i|nqWQ2|iR2||SdS(Niii(sNonestopcardsscardsscssuitsranksremovesreverse(s_scardsscstopcards((spysol.pys _shuffleHookK2s 7 (s__name__s __module__s _shuffleHook(((spysol.pys HopscotchJ2s s BetsyRosscs#S2tZT2dZu2dZRS(Nc sT2U2t||if\}}V2|id|i|i|i|idd|iW2|i|idd}X2||if\}}Y2xjt dDY2]Y}Z2t|||d|[2ddd d d d }\2|ii|]2||i}qW^2|}_2|i|id}`2xt dD`2]}a2t|||dd|dd d d|db2ddd d }c2t|i||id||id2dddtdd|i|i_e2|ii|f2||i}q.Wg2dddd}l2t|i||i||idd|m2dddtd|i_n2|i}o2t|||dd|_p2|i|idq2||i}r2t||||_s2|i|idt2|idS(Nf5.5iiiis base_ranks max_cardsismax_moveis 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_shelpsislsssysxsx0sstack((spysol.pys createGameT2s<:   -$**! csu2v2tgd}w2x|Dw2]}x2|idjo||itjo$y2|||i<z2|i|nq{2|iddddfjoQ|2d|idd}}2||tjo!~2|||<2|i|nnqW2|i2||SdS(Niiiiiii(sNonestopcardsscardsscsranksremovesisreverse(s_scardssiscstopcards((spysol.pys _shuffleHooku2s '  (s__name__s __module__s createGames _shuffleHook(((spysol.pys BetsyRossS2s  !ii^is Betsy Rosss Canfield_Hintcs2tZ2dZRS(NcsB22ti|||||||\}}2|d|fSdS(Ni( sCautiousDefaultHints_getMovePileScores_sscorescolorsrstspilesrpile(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore2s*(s__name__s __module__s_getMoveWasteScore(((spysol.pys Canfield_Hint2s sCanfield_AC_RowStackcs2tZ2dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss AC_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s2(s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_AC_RowStack2s sCanfield_SS_RowStackcs2tZ2dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss SS_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s2(s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_SS_RowStack2s sCanfield_RK_RowStackcs2tZ2dZRS(Ncsw22||iiijoA2t|djot|t|ijo 2dSnn2ti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss RK_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s2(s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_RK_RowStack2s sCanfieldcs2tZ2eZ2eeddZ2eZ2e Z 2dZ 2dZ 2dZ 2ddddZ2d Z2d Z2d Z2d Z2d Z2dZ2dZRS(Nsmodi iiiiic s22t||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 }2xutdD2]d} 2xXt|D2]G} 2|| i }2| ii|i|||| dd d d qsWqZW2|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 }2xIt|D2]8} 2| i i|i1|||2|| i }qhW2| i2dS(Niiiis max_roundssnum_dealsssmodi smax_moveisses 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_dealsysxsfontstxstysishsjslssstfsdeckssta((spysol.pys createGame2sH K $  9!(!$*&"# "csl22|idjo 2dSn2|i o 2d}n2t|ii}2|iiid|dS(Nisstext( s_spreviews base_cardstsRANKSsrankstextssinfosconfig(s_st((spysol.pys updateText2s   c s22|i2t|_2|i2|iii|_2x,|iiD2]}2|ii |i _ qQW2|ii |i i}2|ii|io52to|i idjpt2|d}n2|i|ii2|id|ii|ii|2|i2xst|iD2]_}2|io2|i|iin2|id|ii|iidddddq4W2|iidio2|i|iidn2|iiidd2|iiidS(Niisframesisshadowsreverse(s_sstartDealSamplesNones base_cards updateTextssstalonsgetCards foundationssrankscaps base_rankssuitsgameinfosdeckssnscardss __debug__sAssertionErrorsflipMovesmoveMovesrangesINITIAL_RESERVE_CARDSsisINITIAL_RESERVE_FACEUPsreservess canFlipCardsdealRows dealCards(s_sisssn((spysol.pys startGame2s.    $&   6cs22||iijo |iio2|io2|i o|iidio[2|iididi o2|iidin2|iidi d|nnn<2||iijo%2|i o2|inndS(Niii( sstacks_sssrowssreservessFILL_EMPTY_ROWSscardssface_upsflipMovesmoveMoves canFlipCard(s_sstack((spysol.pys fillStack2s# ")csP22|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch2scsR22|i|ii|_2x,|iiD2]}2|ii|i _ q,WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook2s cs222|iidt2|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook2scs22|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHook2s(s__name__s __module__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       #     sSuperiorCanfieldcs2tZ2dZ2dZRS(Nii(s__name__s __module__sINITIAL_RESERVE_FACEUPsFILL_EMPTY_ROWS(((spysol.pysSuperiorCanfield2s  sRainfallcs3tZ3dZRS(Ncs#33ti|dddddS(Ns max_roundsisnum_deali(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s createGame(((spysol.pysRainfall3s sRainbowcs,3tZ3eeddZ3dZRS(Nsmodi cs#33ti|dddddS(Ns max_roundsisnum_deal(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s StackWrappersCanfield_RK_RowStacksRowStack_Classs createGame(((spysol.pysRainbow3s s Storehousecs\3tZ3eeddZ 3dZ 3dZ 3dZ3dZ3dZ RS(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(sc((spysol.pys 3s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3scs 33dS(N((s_((spysol.pys updateText3s( s__name__s __module__s StackWrappersCanfield_SS_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pys Storehouse3s     s ChameleoncsA3tZ3eeddZ3dZ3dZ3dZRS(Nsmodi i cs)33ti|dddddddS(Nsrowsis max_roundsisnum_deal(sCanfields createGames_(s_((spysol.pys createGame3scs=33|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s(s__name__s __module__s StackWrappersCanfield_RK_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSs createGamesshallHighlightMatch(((spysol.pys Chameleon3s   sDoubleCanfieldcs3tZ3dZRS(Ncs33ti|dddS(Nsrowsi(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s createGame(((spysol.pysDoubleCanfield3s s AmericanToadcs> 3tZ!3eeddZ"3dZ#3dZ$3dZRS(Nsmodi iics)$3%3ti|dddddddS(Nsrowsis max_roundsisnum_deali(sCanfields createGames_(s_((spysol.pys createGame$3s(s__name__s __module__s StackWrappersCanfield_SS_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSsINITIAL_RESERVE_FACEUPs createGame(((spysol.pys AmericanToad 3s   sVariegatedCanfieldcsY&3tZ'3eZ(3dZ)3dZ+3dZ-3dZ13dZ43dZ RS(Nics#)3*3ti|dddddS(Nsrowsis max_roundsi(sCanfields createGames_(s_((spysol.pys createGame)3scs+3,3|i|dSdS(Ncs,3|idj|ifS(Ni(scsrankssuit(sc((spysol.pys,3s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch13scs 4353dS(N((s_((spysol.pys updateText43s( s__name__s __module__sCanfield_AC_RowStacksRowStack_ClasssINITIAL_RESERVE_FACEUPs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pysVariegatedCanfield&3s       sEagleWing_ReserveStackcs63tZ73dZRS(Ncs/7383t|idjo|idi SdS(Nii(slens_scardssface_up(s_((spysol.pys canFlipCard73s(s__name__s __module__s canFlipCard(((spysol.pysEagleWing_ReserveStack63s s EagleWingcsA93tZ: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|idF3xctdDF3]R}G3|i|d|i}H3|ii|i||||dd d d qWI3|it d \}}} }J3|||i||f\}}K3td d|i} L3t|i ||d| d| |i!_"M3|id|i} N3xtdDN3]y}O3|i||dj|i}P3| ddddddddf||i$}Q3|i%i|i&|||q WR3|id|i| f\}}S3|i'i|i(|||T3|i|i'd dU3|i)dS(Ni is max_roundsisnum_dealissssmodi smax_moveisses canvas_cardscardwsanchorsfontiif0.20000000000000001f0.40000000000000002f0.59999999999999998(*sLayouts_ssslssetSizesXMsXSsYMsYSsNones base_cardsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsFoundation_Classs getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosrysCHsrowssRowStack_ClasssreservessReserveStack_ClasssdefaultStackGroups( s_stxstysissslstfsxsysfontsrysta((spysol.pys createGame<3s66 $ 5!$* !0&#"(s__name__s __module__s StackWrappers SS_RowStacksRowStack_ClasssEagleWing_ReserveStacksReserveStack_Classs createGame(((spysol.pys EagleWing93s ! iiiesSuperior Canfieldicilids Straight Upi+sKansasijsDouble Canfieldigs American ToadifsVariegated Canfieldips Eagle Wings Golf_Hintcsl3tZm3dZRS(Nc sm3n3|i}o3x}|iiDo3]l}p3|i|ii\}}q3| o r3qns3t o|djpt t3|i |d|i |i dgf}u3d|itf\}}v3x|iiDv3]}w3|i o x3qny3||jo#z3|i |d|i d }n{3|io|3|d}n)}3|i|do~3|d}nqW3|i|||||qWdS(Nis stackcardsii'idi(s_sgamessgs dropstackssrs canDropCardssss foundationsswsncardss __debug__sAssertionErrors ClonedStackscardsswwsidsNonesscorescolorsts canFlipCardsaddHint( s_swwsgamesrsncardsswscolorsscorest((spysol.pys computeHintsm3s(    ,  #(s__name__s __module__s computeHints(((spysol.pys Golf_Hintl3s s Golf_Taloncs3tZ3dZRS(Ncs733ti| o 3dSn3|ii SdS(Ni(sWasteTalonStacks canDealCardss_sgames isGameWon(s_((spysol.pys canDealCards3s (s__name__s __module__s canDealCards(((spysol.pys Golf_Talon3s s Golf_Wastecs#3tZ3dZ3dZRS(Nc sB33t|dddd3tti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys WasteStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__3scs33ti||| o 3dSn3|idi|dif\}}3|ii djo3|t jo 3dSnn3|d|i i |jp|d|i i |jSdS(Niii( s WasteStacks acceptsCardss_s from_stackscardssranksr1sr2sgames getStrictnesssKINGscapsmod(s_s from_stackscardssr1sr2((spysol.pys acceptsCards3s &(s__name__s __module__s__init__s acceptsCards(((spysol.pys Golf_Waste3s  s Golf_RowStackcs3tZ3dZRS(Ncs33|i|SdS(N(s_sdoubleclickHandlersevent(s_sevent((spysol.pys clickHandler3s(s__name__s __module__s clickHandler(((spysol.pys Golf_RowStack3s sGolfcsh3tZ3eZ3eZ3dZ3dZ3dZ3dZ 3dZ 3e dZ RS(Ncs33t|dd|if\}}3d|i|id|if\}}3|d|i|jo3t ||d|_n3|i |d|i |i 3|i|id|i f\}}3xFtdD3]5}3|iit|||3||i}qW3|i|i|i f\}}3t|||dd |_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 iii4iis max_roundsisnn( sLayouts_ssslsXSsXMsw1sw2sXOFFSETsintssetSizesYSsYMsxsysrangesisrowssappends Golf_RowStacksheights Golf_Talonstalons createTexts Waste_Classswastes CARD_XOFFSETs foundationsssgs openstackss talonstackss dropstacks(s_slsisssw2sw1sysx((spysol.pys createGame3s*$*!& "csp33x0tdD3]}3|iiiddqW3|i3|iii3|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame3s   csC33x/|iiD3]}3|io 3dSnqW3dSdS(Nii(s_sssrowssrscards(s_sr((spysol.pys isGameWon3s   cs533|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3scs33fSdS(N((s_((spysol.pysgetHighlightPilesStacks3scsM33|tjo3|iifffSn3|ii|iiffSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks3s( s__name__s __module__s Golf_Wastes Waste_Classs Golf_Hints Hint_Classs createGames startGames isGameWonsshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysGolf3s        s DeadKingGolfcs#3tZ3dZ3dZRS(Ncs33dSdS(Ni((s_((spysol.pys getStrictness3scsA33|itjo 3dSn3ti|||||SdS(Ni( scard1sranksKINGsGolfsshallHighlightMatchs_sstack1sstack2scard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s (s__name__s __module__s getStrictnesssshallHighlightMatch(((spysol.pys DeadKingGolf3s  s RelaxedGolfcs,3tZ3eeddZ3dZRS(Nsmodi cs=33|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s(s__name__s __module__s StackWrappers Golf_Wastes Waste_ClasssshallHighlightMatch(((spysol.pys RelaxedGolf3s sElevator_RowStackcs_3tZ3dddddddddddddddddddddfZ3dZRS(Niiiiiics33|iii|if\}}3|idt|f\}}}3xs3||job3|||}3|d}3x:t |||D3]"}3||io 3dSnqWqNW3dSdS(Nii(s_sgamesssrowssSTEPsrsstepsidslensisnslsrangesjscards(s_sstepsrsisjslsn((spysol.pysbasicIsBlocked3s!$  (s__name__s __module__sSTEPsbasicIsBlocked(((spysol.pysElevator_RowStack3s HsElevatorcs#3tZ3dZ3dZRS(Ncs33t||if\}}3|id|i|id|i|i3xt dD3]}3|id||id}3|i||id}3xJt |dD3]5}3|iit|||3||i}qWq`W3|i|if\}}3t|||dd|_3|i|id3||i}3|i||||_3|i|id3|ii|i3|ig|i_3|ig|i_3|i|i_dS( Ni iiiiis max_roundssss(sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsElevator_RowStacks Golf_Talonstalons createTexts Waste_Classswastes foundationsssgs openstackss talonstackss dropstacks(s_sisjssslsysx((spysol.pys createGame3s(/  css33|i3|iiid|iid dd3|iiid|iid3|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_((spysol.pys startGame3s )#(s__name__s __module__s createGames startGame(((spysol.pysElevator3s  sTriPeaks_RowStackcsn3tZ3dddddddddddddddddddddddddddfZRS(Niiii i i(s__name__s __module__sSTEP(((spysol.pysTriPeaks_RowStack3s sTriPeakscsh3tZ3dZ4dZ4dZ)4eZ*4dZ24dZ44dZ64dZ RS(Nc s33t|dd|if\}}3|id|i|id|i|i3h|_ 3xt dD3]}3xddfddfddfddfddfddffD3]o}3|id|d|d|id}3|i|d|id}3|iit|||qWqrW3|id|idf\}}3xFt dD3]5}4|iit|||4||i}qhW4|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_sdsissslsysx((spysol.pys createGame3s8$/  @ +'# " !cs44|i4|iiid|iid dd4|iiid|iid4h|_4x-|iiiD4]}4d|i|i 4|d|ii |jp|d|ii |jSn?4dSdS(Niii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksr1sr2scapsmod(s_s from_stackscardssr1sr2((spysol.pys acceptsCards94s   &:(s__name__s __module__s acceptsCards(((spysol.pysBlackHole_Foundation84s sBlackHole_RowStackcs@4tZA4dZRS(NcsA4B4|i|SdS(N(s_sdoubleclickHandlersevent(s_sevent((spysol.pys clickHandlerA4s(s__name__s __module__s clickHandler(((spysol.pysBlackHole_RowStack@4s s BlackHolecseC4tZD4eeddddZE4eZF4ddZ`4dZb4dZ h4e d Z RS( Ns max_acceptis max_cardsiic sF4G4t|dd|if\}}H4td|i|i|d|i}I4|i |i d||i d|i J4|i }K4xMtdDK4]<}L4|i ||} M4|ii|i| ||qWN4xtdDN4]o}O4||i }P4xSddddfDP4]<}Q4|i ||} R4|ii|i| ||qWqWS4||i }T4xMtdDT4]<}U4|i ||} V4|ii|i| ||qWW4x/|iDW4]!}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 playcardssisjslsssrswsysx((spysol.pys createGameF4s<$+,  &  * & 2:*cs `4a4|i|ddSdS(Ncsa4|idj|ifS(Ni (scsidssuit(sc((spysol.pysa4si(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook`4scs|b4c4x0tdDc4]}d4|iiiddqWe4|if4|iiig4|iiid|iidS(Nisframesisrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_si((spysol.pys startGameb4s   csMh4i4|tjoj4ff|iifSnl4f|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksh4s( s__name__s __module__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_Hintcsy4tZz4dZRS(Ncsz4{4d|fSdS(Ni`g(scolor(s_sscorescolorsrstsncards((spysol.pys_getDropCardScorez4s(s__name__s __module__s_getDropCardScore(((spysol.pysGrandfathersClock_Hinty4s sGrandfathersClockcs_|4tZ}4eZ~4dZ4dZ4dZ4dZ4dZ4e dZ RS(Nc s~44t|dd|if\}}4td|id|i|idd|i}4|i d|i |i |i d|4xt dD4]}4|i |i ||f\} }4xRt dD4]A}4|iit| ||ddd d4| |i } qWqW4|i ||id}4|i|id d d | |i d|f4|i|idd || |i dd f4d d fdd fddfddfddfddfg}4xKt t|D4]4}4|id ||d d||dfqW4|i |i ||if\} }4xt dD4]}4|dd}4tt| d||d |i } 4tt|d||d|i}4ddd df|d} 4|iit| ||| 4d|ddd4dd qdW4t|i |i |i!|i||_"4|i|i|i#_$4|i"g|i#_%4|i|i#_&dS(NsXOFFSETi iii iismax_moves max_acceptii?Bif0.14999999999999999f0.5f2.5f1.5f2.8500000000000001i if6.5f-1.5s base_ranksmodi ('sLayouts_ssslsmaxsYSsCHsYOFFSETsdhssetSizesXSsXMsYMsrangesisxsysjsrowssappends RK_RowStacks setRegionsdslensx0sy0sintsroundssuits foundationssSS_FoundationStacksInitialDealTalonStackswidthsheightstalonssgs openstackss talonstackss dropstacks( s_sdsdhsisjslsssy0sysxsx0ssuit((spysol.pys createGame~4s>$6, # +11? 2& ,,,c s 44ddddddddf\}}}}4d|d|d|d|d|d|d |d |d |d |d |d|f }4g}4xI|D4]=}4|i|jo$4|i |4|i |nqW4|i d4||SdS(Nii iiiiiiiii i i i cs4t|i|iS(N(scmpsbsranksa(sasb((spysol.pys4s( sCsSsHsDsidssclocksscardsscsidsappendsremovessort( s_scardssCsclockssDsHscsSsids((spysol.pys _shuffleHook4s1]  cs44|iddd4x0tdD4]}4|iiiddq)W4|iii4|iiid|iidS(Nsgrandfathersclocksloopiisframesisrows(s_s playSamplesrangesissstalonsdealRows foundations(s_si((spysol.pys startGame4s  cs544|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4scs44fSdS(N((s_((spysol.pysgetHighlightPilesStacks4scs44ffffSdS(N((s_sevent((spysol.pys getAutoStacks4s( s__name__s __module__sGrandfathersClock_Hints Hint_Classs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysGrandfathersClock|4s      isGrandfather's Clocks Numerica_Hintcs4tZ4dZRS(Ncs944to0||iiijot|djpt4d}4t|i djo#4|t |i di d}n4|i di |i di jo(4d|i di t|i }n[4|i di |i di jo 4d}n*4||i di |i di d}4||fSdS(Nii0uiiii'i N(s __debug__srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore4s: #$($ )(s__name__s __module__s_getMoveWasteScore(((spysol.pys Numerica_Hint4s sNumerica_RowStackcs#4tZ4dZ4dZRS(NcsU44ti||| o 4dSn4||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscards((spysol.pys acceptsCards4s cs44|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage4s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysNumerica_RowStack4s  sNumericacs\4tZ4eZ4eedeZ4ddZ4dZ 4dZ 4dZ RS(Nssuitic s44t||if\}}4td|id|i}4|i|i d||i |i |i |i|4|i |i dd}4||d|i d|i f\}}4xOtdD4]>}4|ii|i|||d|4||i }qW4||i |if\}}4xLt|D4];}4|i it|||dd4||i }qEW4|i|i ||i d|d d f4|i }4t|||d d|_4t|i4||id||i 4d d |ii_4||i}4t|||d d|_4|i|i |i _!4|ig|ig|i _"4|i |ig|i _#dS(Niif1.5iissuits max_acceptii?Bs max_roundssanchorsss max_cards($sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsrowssXSsYMsx0sxsysrangesis foundationssappendsFoundation_ClasssNumerica_RowStacks setRegionsWasteTalonStackstalons MfxCanvasTextscanvassCWstextssncardss WasteStackswastessgs openstackss talonstackss dropstacks( s_srowssislssshsysxsx0((spysol.pys createGame4s2 :+ ( %-  cs'44|i4|iiidS(N(s_sstartDealSamplessstalons dealCards(s_((spysol.pys startGame4s csH44|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4scs44fSdS(N((s_((spysol.pysgetHighlightPilesStacks4s( s__name__s __module__s Numerica_Hints Hint_Classs StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysNumerica4s    s LadyBettycs 4tZ4eZ4dZRS(Ncs44ti|dddS(Nsrowsi(sNumericas createGames_(s_((spysol.pys createGame4s(s__name__s __module__sSS_FoundationStacksFoundation_Classs createGame(((spysol.pys LadyBetty4s  is Sir Tommyis Lady Bettys Yukon_Hintcs)4tZ4dZ4dZ4dZRS(Ni(#idcs'44ti|||||||\} }4| |} 4t o%d| jo djnpt 4|i }4|o4x|D4]{} 4|i|d| g}4xT|D4]I} 4|i|| go*4| d} 5| d| d} 5PnqWqWn5|| |fSdS(Nii's stackcardsiid(sYukonType_Hints_getMovePileScores_sscorescolorsrstspilesrpilesssbonuss __debug__sAssertionErrorsgetPilestpilescrs ClonedStacksrrscts acceptsCardssd(s_sscorescolorsrstspilesrpilestpilesrrsdsbonusssscrsct((spysol.pys_getMovePileScore4s* /    (s__name__s __module__sBONUS_FLIP_CARDsBONUS_CREATE_EMPTY_ROWs_getMovePileScore(((spysol.pys Yukon_Hint4s   sYukoncsw5tZ5eiZ5eZ5eZ5e e de Z 5e Z 5dZ5dZ5dZ 5dZRS(Ns base_rankc sU 5 5t||if\}} 5t|dddd 5t|i|f| 5|i|i d|i d5|i |ii i |ii i ||_ 5xQ|iiD5]@}5|ii|i|i |i |d|i5ddqW5x?|iiD5].}5|ii|i|i |i |qW5|i5|SdS(Nsrowsistextsiissuitsmax_move(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutsssrsl((spysol.pys createGame 5s!- * , cs55xUtdt|iiD5]5}5|iiid|ii|ddddq"W5xFtdD5]5}5|iiid|iidddddqnW5|i5|iii5t o#t|iii djpt dS(Nisrowssflipisframesi( srangeslens_sssrowssistalonsdealRowsstartDealSamples __debug__scardssAssertionError(s_si((spysol.pys startGame5s 3 3 cs55fSdS(N((s_((spysol.pysgetHighlightPilesStacks5scsH 5!5|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch 5s(s__name__s __module__sLayouts yukonLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersYukon_AC_RowStacksKINGsRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStackssshallHighlightMatch(((spysol.pysYukon5s       sRussianSolitairecs,#5tZ$5eedeZ%5dZRS(Ns base_rankcsH%5&5|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch%5s(s__name__s __module__s StackWrappersYukon_SS_RowStacksKINGsRowStack_ClasssshallHighlightMatch(((spysol.pysRussianSolitaire#5s sOdessacs(5tZ)5dZRS(Ncs)5*5x6tdD*5]%}+5|iiiddddqW,5x0tdD,5]}-5|iiiddqOW.5xCtdD.5]2}/5|iiid|iidd!ddqW05|i15|iii25to#t |iii djpt dS( Nisflipisframesisrowsii( srangesis_ssstalonsdealRowsrowssstartDealSamples __debug__slenscardssAssertionError(s_si((spysol.pys startGame)5s #  0 (s__name__s __module__s startGame(((spysol.pysOdessa(5s sAlaska_RowStackcs35tZ45dZRS(Ncsh4555|i|ijoK|i|ii|ii|ijp$|i|ii|ii|ijSdS(N(sc1ssuitsc2sranks_scapsdirsmod(s_sc1sc2((spysol.pys _isSequence45s(s__name__s __module__s _isSequence(((spysol.pysAlaska_RowStack35s sAlaskacs 85tZ95eedeZRS(Ns base_rank(s__name__s __module__s StackWrappersAlaska_RowStacksKINGsRowStack_Class(((spysol.pysAlaska85s sChineseDisciplinecs8:5tZ;5eiZ<5eZ=5dZ?5dZRS(Ncs#=5>5ti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_((spysol.pys createGame=5scs?5@5xddddddfD@5]d}A5|iiid|ii| dddd B5|iiid|ii|dd dd qWC5|iD5|iiidS( Niiiisrowssflipisframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame?5s  /3 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysChineseDiscipline:5s    sChineseSolitairecsE5tZF5eZRS(N(s__name__s __module__sYukon_AC_RowStacksRowStack_Class(((spysol.pysChineseSolitaireE5s sQueeniecs>G5tZH5eiZI5eZJ5dZL5dddZRS(Ncs#J5K5ti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_((spysol.pys createGameJ5sic sL5M5x[tdt|iiDM5];}N5|iiid|ii|d|ddd|q"WO5|i P5|iiid|dS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGameL5s  9 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysQueenieG5s    sRushdikecs>Q5tZR5eiZS5eZT5dZV5dddZRS(Ncs#T5U5ti|ddddSdS(Nswasteistextsi(sRussianSolitaires createGames_(s_((spysol.pys createGameT5siic sV5W5x[tdt|iiDW5];}X5|iiid|ii|d|ddd|q"WY5|i Z5|iiid|dS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGameV5s  9 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysRushdikeQ5s    s RussianPointcs[5tZ\5dZRS(Ncs\5]5|ii}^5xYddddddfD^5]<}_5|iiid||t||!ddddq.W`5|ia5|iiidS(Niiisrowssflipisframes( s_sssrowssrsistalonsdealRowslensstartDealSample(s_sisr((spysol.pys startGame\5s  : (s__name__s __module__s startGame(((spysol.pys RussianPoint[5s sAbacus_Foundationcsb5tZc5dZRS(Nc sUc5d5t|d|ddd|ddde5tti|||||f|dS(Ns base_ranksmodi sdirismax_movei( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgame(s_sxsysgamessuitscap((spysol.pys__init__c5s)(s__name__s __module__s__init__(((spysol.pysAbacus_Foundationb5s sAbacus_RowStackcsf5tZg5dZRS(NcsRg5h5|id df\}}i5|i|ijo|i|||ijSdS(Nii (sc1ssuitsdirsmodsc2srank(s_sc1sc2sdirsmod((spysol.pys _isSequenceg5s(s__name__s __module__s _isSequence(((spysol.pysAbacus_RowStackf5s sAbacuscsSj5tZk5eZl5eZm5dZv5dZx5dddZ~5dZ RS(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_shelpsl((spysol.pys createGamem5s%csv5w5|i|dSdS(Ncs%w5|iddddfj|ifS(Niiii*(scsidssuit(sc((spysol.pysw5s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookv5sic sx5y5|iiid|iiddz5x[tdt|iiDz5];}{5|iiid|ii|d|ddd|qGW|5|i }5|iiid|dS(Nsrowssframesiisflipsreverse( s_ssstalonsdealRows foundationssrangeslensrowssisflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGamex5s % 9 csm~55|id df\}}5|i|ijo3|i|||ijp|i|||ijSdS(Nii (scard1ssuitsdirsmodscard2srank(s_sstack1scard1sstack2scard2smodsdir((spysol.pysshallHighlightMatch~5s( s__name__s __module__sAbacus_FoundationsFoundation_ClasssAbacus_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatch(((spysol.pysAbacusj5s    iisRussian SolitaireiisCastlesInSpaincs_5tZ5eiZ5eZ5eZ5e Z 5e Z 5dZ 5dddfdZRS(Nc sQ55t||if\}}5t|dddd5t|i|f|5|i|i d|i d5|i |ii i |ii i ||_ 5xE|iiD5]4}5|ii|i|i |i ||iqW5xN|iiD5]=}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_slayoutsssrsl((spysol.pys createGame5s!- 2 !ics]55x0|D5]%}5|iiid|ddq W5|i5|iiidS(Nsflipsframesi(sflipsfs_ssstalonsdealRowsstartDealSample(s_sflipsf((spysol.pys startGame5s  # (s__name__s __module__sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(((spysol.pysCastlesInSpain5s       sMartha_RowStackcs5tZ5dZRS(NcsI55ti||| o 5dSn5|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCards5s (s__name__s __module__s acceptsCards(((spysol.pysMartha_RowStack5s sMarthacs>5tZ5eeZ5dZ5dZ5dZRS(Ncs#55ti|dddddS(Nsrowsi s playcardsi (sCastlesInSpains createGames_(s_((spysol.pys createGame5scs55|i|dSdS(Ncs5|idj|ifS(Ni(scsrankssuit(sc((spysol.pys5s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook5scsE55ti|ddddf5|iiid|iidS(Nsflipiisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_((spysol.pys startGame5s(s__name__s __module__sFullStackWrappersMartha_RowStacksRowStack_Classs createGames _shuffleHooks startGame(((spysol.pysMartha5s   s BakersDozencsD5tZ5eedeZ5dZ5dZ5dZRS(Ns base_rankcs 55dt|iif\}}5g}5xE|D5]:}5|i t jo5|i |n5|d}q7W5x|D5]}5||}5xf5||joU5||i t jo-5||||f\||<||<5Pn5||}qWqW5|i 5|SdS(Nii(slens_sssrowssisnskingsscardsscsranksKINGsappendsjsreverse(s_scardssiscskingssjsn((spysol.pys _shuffleHook5s$!    % cs&55ti|ddddfdS(Nsflipi(sCastlesInSpains startGames_(s_((spysol.pys startGame5scs555|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch5s( s__name__s __module__s StackWrappers RK_RowStacksNO_RANKsRowStack_Classs _shuffleHooks startGamesshallHighlightMatch(((spysol.pys BakersDozen5s   sSpanishPatiencecs5tZ5eZRS(N(s__name__s __module__sAC_FoundationStacksFoundation_Class(((spysol.pysSpanishPatience5s s GoodMeasurecs/5tZ5dZ5dZ5dZRS(Ncs55ti|dddS(Nsrowsi (sCastlesInSpains createGames_(s_((spysol.pys createGame5scs555ti||}5|i|ddSdS(Ncs5|idj|ifS(Ni(scsrankssuit(sc((spysol.pys5si(s BakersDozens _shuffleHooks_scardss_shuffleHookMoveToBottom(s_scards((spysol.pys _shuffleHook5scs55ti|dddddf5xtdD5]|}5|iiid}5t o|i t jpt 5|i |ii5|id|ii|ii|iq5W5t o#t|iiidjpt dS(Nsflipiiii(sCastlesInSpains startGames_srangesissstalonscardsscs __debug__sranksACEsAssertionErrorsflipMovesmoveMoves foundationsssuitslen(s_sisc((spysol.pys startGame5s" !-(s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pys GoodMeasure5s   s Cruel_Taloncs&5tZ5dZ5ddZRS(NcsI55|iio|iiidjo 5dSn5|ii SdS(Nidi(s_sgamesdemosmovessindexs isGameWon(s_((spysol.pys canDealCards5s& ic s55t|iii} 5d}5tot|idjpt 5t |iii}5|i 5xc|D5]X} 5xLt t| iD5]2}5|d}5|iid| |ddqWq{W5tot|i|jpt 5|djo 5dSn5|ii|5|df\}}5dg| }5|d| } 5xH5| djo75||d||<5|d| }5| d} qkW5xt | D5]}5t|||}5ddf|ddj} 5xCt |D5]2}5|iid||iii|d| qW5||}5|djo5PnqW5to.|t|ijo djnpt 5|SdS(Niisframesii(slens_sgamesssrowsslrs num_cardss __debug__scardssAssertionErrorslistsreversesrsrangesismoveMoves nextRoundMovesnsdeals extra_cardssminsksframessj( s_ssoundsrowssdealsisksjs num_cardssnsrslrs extra_cardssframes((spysol.pys dealCards5sF '    ''   0  8(s__name__s __module__s canDealCardss dealCards(((spysol.pys Cruel_Talon5s  sCruelcsY5tZ5eeddZ5eedeZ5dZ5dZ 6dZ RS(Ns max_roundsis base_rankcs55ti|dddS(Nsrowsi (sCastlesInSpains createGames_(s_((spysol.pys createGame5scs56|i|dSdS(Ncs6|idj|ifS(Ni(scsrankssuit(sc((spysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook5scsE66ti|ddddf6|iiid|iidS(Nsflipisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_((spysol.pys startGame6s( s__name__s __module__s StackWrappers Cruel_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Classs createGames _shuffleHooks startGame(((spysol.pysCruel5s   iSsCastles in SpainiTis Baker's DozeniUsSpanish PatienceiVs Good MeasureihsFan_Hintcs6tZ6RS(N(s__name__s __module__(((spysol.pysFan_Hint6s sFancsq6tZ6eZ6eZ6eZ6eZ 6ddddfddZ -6dZ 36dZ 66dZ RS(Niii c sw66t|dd|if\}}6td|i|i|d|i}6t d|i|}6|dd@}6|i |i t|||i dt||i6|i ||i f\} }6xyt|iiD6]b}6xVtdD6]E} 6|ii|i| ||d|!6| ||ii} qWqW"6xtt|D"6]}#6|i ||if\} }$6x}t||D$6]h}%6|i| ||d dd d} &6|id f\| _| _'6|i i| (6| |} qWqlW)6|i|i|i|if\} }*6|i | |||_!+6|i",6|SdS( NsXOFFSETi iiiiissuitsmax_moves max_accepti(#sLayouts_ssslsmaxsXSs playcardssXOFFSETswsminssetSizesXMsrowssYMslensYSsxsysrangesgameinfosdeckssjsis foundationssappendsFoundation_ClasssRowStack_Classsstacks CARD_XOFFSETs CARD_YOFFSETswidthsheights Talon_ClassstalonsdefaultStackGroups( s_srowss playcardssisjslssswsysxsstack((spysol.pys createGame6s2$+<  (  $) cs-6.6x@tdD.6]/}/6|iiid|iid ddqW06|i16|iii26to#t |iii djpt dS(Nisrowsisframesi( srangesis_ssstalonsdealRowsrowssstartDealSamples __debug__slenscardssAssertionError(s_si((spysol.pys startGame-6s  - csH3646|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch36scs6676fSdS(N((s_((spysol.pysgetHighlightPilesStacks66s(s__name__s __module__sInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingSS_RowStacksRowStack_ClasssFan_Hints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysFan6s       sScotchPatiencecs)86tZ96eZ:6eedeZRS(Ns base_rank(s__name__s __module__sAC_FoundationStacksFoundation_Classs StackWrappers RK_RowStacksNO_RANKsRowStack_Class(((spysol.pysScotchPatience86s  sShamrocks_RowStackcs;6tZ<6dZRS(Ncs<6=6ti||| o >6dSn?6|id|df\}}@6|i|id|ii jp|i|id|ii jSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardssc1sc2srankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards<6s  (s__name__s __module__s acceptsCards(((spysol.pysShamrocks_RowStack;6s s Shamrockscs&A6tZB6eededdZRS(Ns base_ranks max_cardsi(s__name__s __module__s StackWrappersShamrocks_RowStacksNO_RANKsRowStack_Class(((spysol.pys ShamrocksA6s sLaBelleLucie_TaloncsMC6tZD6dZF6ddZQ6dZZ6dZ_6ddZRS(Ncs+D6E6|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_((spysol.pys canDealCardsD6sicsF6G6|i}H6|djo I6dSnJ6|iK6|oL6|iinM6|iN6|oO6|iinP6|SdS(Ni( s_s redealCards1sns redealCards2ssoundsgamesstartDealSamples redealCards3s stopSamples(s_ssoundsn((spysol.pys dealCardsF6s     csQ6R6tot|idjptS6d}T6xi|iiiDT6]U}U6|ioBV6|t|i}W6|ii t|i||ddnqFWX6tot|i|jptY6|SdS(Nisframes( s __debug__slens_scardssAssertionErrors num_cardssgamesssrowssrsmoveMove(s_srs num_cards((spysol.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$ics_6`6|iii}a6tt|idt|}b6xt dDb6]}c6|d|dd|ddf|}d6dddf|}e6xe|| De6]V}f6|idi|jog6|ii|nh6|iid||d|qWqJWdS(Niiiiiisframes(s_sgamesssrowss to_stackssminslenscardssnsrangesisjsframessrsface_upsflipMovesmoveMove(s_sface_upsisjsns to_stackssrsframes((spysol.pys redealCards3_6s% * (s__name__s __module__s canDealCardss dealCardss redealCards1s redealCards2s redealCards3(((spysol.pysLaBelleLucie_TalonC6s   s LaBelleLuciecs5i6tZj6eeddZk6eedeZRS(Ns max_roundsis base_rank(s__name__s __module__s StackWrappersLaBelleLucie_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Class(((spysol.pys LaBelleLuciei6s sSuperFlowerGardencs l6tZm6eedeZRS(Ns base_rank(s__name__s __module__s StackWrappers RK_RowStacksNO_RANKsRowStack_Class(((spysol.pysSuperFlowerGardenl6s sThreeShufflesAndADraw_RowStackcs)n6tZo6dddZ6dZRS(Nic 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@sdropspriorityii(s_sgamesssreservessrsto_stacks SS_RowStacksmoveMovesncardssframessshadows _canDrawCardsfs __debug__s draw_donesAssertionErrorsupdateStackMovesdemos playSamples enterStatesS_FILLs old_states leaveState( s_sncardssto_stacksframessshadows old_statesgamesrsf((spysol.pysmoveMoveo6s$%" 5" ""cs66t|idjor6|idd!}6xU|iii|iiiD6]4}6||j o|i||o 6|SnqOWn6t SdS(Niii( slens_scardsspilesgamesss foundationssrowss acceptsCardssNone(s_ssspile((spysol.pys _canDrawCard6s #(s__name__s __module__smoveMoves _canDrawCard(((spysol.pysThreeShufflesAndADraw_RowStackn6s s"ThreeShufflesAndADraw_ReserveStackcs;6tZ6dZ6dZ6dZ6dZRS(Ncs66ti||| o 6dSn6||iiij o 6dSn6|iip |i o 6dSn6dSdS(Nii( s ReserveStacks acceptsCardss_s from_stackscardssgamesssrowss draw_dones _canDrawCard(s_s from_stackscards((spysol.pys acceptsCards6s   csA66to||iijpt6|ii |i_dS(N(s __debug__sundos_sgames draw_donesAssertionError(s_sundosflags((spysol.pys updateModel6s$css66|iidjp|iitjo 6dSn6ddf|iidj}6|iiid|dS(NisXsDrawistext( s_sgamespreviewstextssmiscsNones draw_donestsconfig(s_st((spysol.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_sysimagessx((spysol.pys prepareView6s ! 1(s__name__s __module__s acceptsCardss updateModels updateTexts prepareView(((spysol.pys"ThreeShufflesAndADraw_ReserveStack6s    sThreeShufflesAndADrawcs\6tZ6eedeZ6dZ6dZ6dZ6dZ 6dZ RS(Ns base_rankcs66ti|}6|i}6|idi|idif\}}6|ii t |||6|i 6d|_ dS(Niii( s LaBelleLucies createGames_slsssrowssxsysreservessappends"ThreeShufflesAndADraw_ReserveStacksdefaultStackGroupss draw_done(s_sssysxsl((spysol.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_sgame((spysol.pys_restoreGameHook6scs#66|iid|idS(Ns draw_done(s_sloadinfosaddattrspsload(s_sp((spysol.pys _loadGameHook6scs66|i|idS(N(spsdumps_s draw_done(s_sp((spysol.pys _saveGameHook6s( s__name__s __module__s StackWrappersThreeShufflesAndADraw_RowStacksNO_RANKsRowStack_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysThreeShufflesAndADraw6s     sTrefoilcsM6tZ6dZ6eeddZ6dZ6dZ6dZRS(Nis min_cardsics)66ti|dddddfSdS(Nsrowsii(sFans createGames_(s_((spysol.pys createGame6scs66|i|dSdS(Ncs6|idj|ifS(Ni(scsrankssuit(sc((spysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook6scs|66x0tdD6]}6|iiiddqW6|i6|iii6|iiid|iidS(Nisframesisrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_si((spysol.pys startGame6s   ( s__name__s __module__s GAME_VERSIONs StackWrappersSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysTrefoil6s    sIntelligence_Taloncs26tZ6eiZ6dZ6ddZRS(NcsS66tot|idjpt6|iiid}6t|i}6|ii t|i||dd6xz|iii D6]f}6|t|i}6xD6|io66|ii d||dd6|ii |qWqW6tot|i|jpt6tot d|ipt6|SdS(Nisframesics 6|i S(N(scsface_up(sc((spysol.pys6s(s __debug__slens_scardssAssertionErrorsgamesssreservessrs num_cardssmoveMovesrowssflipMovesforall(s_srs num_cards((spysol.pys redealCards16s'(  ''ics66xp|iiiD6]\}6xP6t|idjo66|i|gdd6|i o 6dSnq%WqW6|iit|i||iii ddddS(Nisframesii( s_sgamesssrowssrslenscardss dealToStackssmoveMovesreserves(s_sface_upsr((spysol.pys redealCards36s (s__name__s __module__s TalonStacksdealToStacksOrFoundationss dealToStackss redealCards1s redealCards3(((spysol.pysIntelligence_Talon6s   sIntelligence_RowStackcs#6tZ6dZ6dZRS(Ncs66ti||| o 6dSn6to|ipt6|id|df\}}6|i |i jo 6dSn6|i |i d|i i jp|i |i d|i i jSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardss __debug__sAssertionErrorsc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards6s   csb66|i oM6|iiid}6|io&6|id|||fddnndS(Nisrowsssoundi(s_scardssgamesssreservessrsdealRow(s_sr((spysol.pys fillStack6s (s__name__s __module__s acceptsCardss fillStack(((spysol.pysIntelligence_RowStack6s  sIntelligence_ReserveStackcs#6tZ6dZ6eiZRS(Ncs66dSdS(Ni((s_((spysol.pys canFlipCard6s(s__name__s __module__s canFlipCards TalonStacksdealToStacksOrFoundationss dealToStacks(((spysol.pysIntelligence_ReserveStack6s  s IntelligencecsM6tZ6eeddZ6eedeZ6dZ6dZ RS(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_sssysxsl((spysol.pys createGame6s  (1cs66|ii}6x*tdD6]}6|iddq"W6|i6|i6|it|i ||ii ddddS(Nisframesi( s_ssstalonsrangesisdealRowsstartDealSamplesmoveMoveslenscardssreserves(s_sistalon((spysol.pys startGame6s   ( s__name__s __module__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 7tZ 7RS(N(s__name__s __module__(((spysol.pysBeleagueredCastleType_Hint 7s sStreetsAndAlleyscs/ 7tZ7eZ7ddZ$7dZRS(Ni c s977t|dd|if\}}7td|i|i|d|i}7|i } 7| |d|i } 7| |id|i }7|||i } 7|i| |id|i7| |if\}}7xOtdD7]>}7|iit||||dd7||i}qW7x| |if||iffD7]\}}7xytdD7]h}7t|||ddd d} 7|idf\| _| _7|ii|  7||i}qtWqUW!7|i|i|i|if\}}"7t||||_ #7|i!dS( NsXOFFSETi iiiismax_moveis max_accept("sLayouts_ssslsmaxsXSs playcardssXOFFSETswsXMsx0sx1sx2sx3ssetSizesYMsYSsxsysrangesis foundationssappendsSS_FoundationStacks RK_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowsswidthsheightsInitialDealTalonStackstalonsdefaultStackGroups( s_s playcardssislsyssswsxsx2sx3sx0sx1sstack((spysol.pys createGame7s.$+ ! (" !)cs$7%7x0tdD%7]}&7|iiiddqW'7|i(7x*tdD(7]})7|iiiqVW*7to#t |iii djpt dS(Nisframesii( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvails __debug__slenscardssAssertionError(s_si((spysol.pys startGame$7s   (s__name__s __module__sBeleagueredCastleType_Hints Hint_Classs createGames startGame(((spysol.pysStreetsAndAlleys 7s  sBeleagueredCastlecs#+7tZ,7dZ.7dZRS(Ncs,7-7|i|dSdS(Ncs-7|idj|ifS(Ni(scsrankssuit(sc((spysol.pys-7s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook,7scs.7/7x0tdD/7]}07|iiiddqW17|i27x*tdD27]}37|iiiqVW47|iiid|ii57to#t |iii djpt dS(Nisframesiisrows( srangesis_ssstalonsdealRowsstartDealSamples foundationss __debug__slenscardssAssertionError(s_si((spysol.pys startGame.7s   (s__name__s __module__s _shuffleHooks startGame(((spysol.pysBeleagueredCastle+7s  sCitadelcs#67tZ77dZ97dZRS(Ncs7787|i|dSdS(Ncs87|idj|ifS(Ni(scsrankssuit(sc((spysol.pys87s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook77scs 97:7d};7|ii}<7|i=7|id|iid|>7x>7|io?7x|iiD?7]}@7|i |A7xt|iiDA7]G}B7|i ||ido$C7|i d||d|D7PnqWF7|i d||d|G7|i oH7PnqjWqMWdS(Nisrowssframesii( sframess_ssstalonsstartDealSamplesdealRows foundationsscardssrowssrsflipMoves acceptsCardssmoveMove(s_sframesstalonsssr((spysol.pys startGame97s"      (s__name__s __module__s _shuffleHooks startGame(((spysol.pysCitadel67s  sFortress_RowStackcsI7tZJ7dZRS(NcsJ7K7ti||| o L7dSnM7|ioN7|idi|dijo O7dSnP7|idi|dif\}}Q7|d|i i |jp|d|i i |jSnR7dSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardsssuitsranksr1sr2scapsmod(s_s from_stackscardssr1sr2((spysol.pys acceptsCardsJ7s  ! &:(s__name__s __module__s acceptsCards(((spysol.pysFortress_RowStackI7s sFortresscs_S7tZT7eiZU7eZV7eZW7e e ddZ X7e Z Y7dZg7dZRS(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 ||_na7xH|iiDa7]7}b7|ii|i|i |i |d |iqWc7x?|iiDc7].}d7|ii|i|i |i |qIWe7|if7|SdS( Nsrowsi swasteistextss playcardsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutsssrsl((spysol.pys createGameY7s%!-. 5 , csg7h7x0tdDh7]}i7|iiiddqWj7|ik7x*tdDk7]}l7|iiiqVWm7to#t |iii djpt dS(Nisframesi( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvails __debug__slenscardssAssertionError(s_si((spysol.pys startGameg7s   (s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersFortress_RowStacksRowStack_ClasssBeleagueredCastleType_Hints Hint_Classs createGames startGame(((spysol.pysFortressS7s      sChessboard_Foundationcs#n7tZo7dZr7dZRS(Nc sKo7p7t|ddddddq7tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__o7scsr7s7|i ot7t|djp |di o u7dSnv7|di|iijo w7dSnx7xI|iii Dx7]5}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_stackscardsss((spysol.pys acceptsCardsr7s%    & (s__name__s __module__s__init__s acceptsCards(((spysol.pysChessboard_Foundationn7s  sChessboard_RowStackcs}7tZ~7dZRS(Ncs~77|iio7ti||Sn7x>|iiiD7]*}7|io7ti||Snq=W7t dfSdS(Ni( s_sgamesdemosFortress_RowStacks canDropCardssstackssss foundationsscardssNone(s_sstacksss((spysol.pys canDropCards~7s  (s__name__s __module__s canDropCards(((spysol.pysChessboard_RowStack}7s s ChessboardcsG7tZ7eZ7eeddddZ7dZ7dZRS(Ns max_acceptismodi cs77ti|}7|i|iidd\}}}}7t dd|i }7t|i||i|d|d||i_dS(Nises canvas_cardscardwsanchorsfont(sFortresss createGames_sls getTextAttrsss foundationsstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvassXMstextssinfo(s_stxstystfsfontslsta((spysol.pys createGame7s+cs77|idjo 7dSn7d}7xC|iiD7]2}7|io7t|idi}7Pnq:W7|ii i d|dS(Nisistext( s_spreviewstsss foundationsscardssRANKSsrankstextssinfosconfig(s_ssst((spysol.pys updateText7s     ( s__name__s __module__sChessboard_FoundationsFoundation_Classs StackWrappersChessboard_RowStacksRowStack_Classs createGames updateText(((spysol.pys Chessboard7s   isStreets and Alleysi"sBeleaguered CastleiiisUnionSquare_Foundationcs7tZ7dZRS(Ncs77ti||| o 7dSn7t|idjo%7|didt|ijSn7|dit|ijSdS(Nii i(sAbstractFoundationStacks acceptsCardss_s from_stackscardsslensrank(s_s from_stackscards((spysol.pys acceptsCards7s  %(s__name__s __module__s acceptsCards(((spysol.pysUnionSquare_Foundation7s sUnionSquare_RowStackcs/7tZ7dZ7dZ7dZRS(Nc sc77t|dddddt7dddd7tti||||f|7d|_ dS( Nsmodi sdiris base_ranks max_acceptismax_move( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__7s"cs77ti||| o 7dSn7|i o 7dSn7|di|idijo 7dSn7t|idjo<7|di|idi}7|djp |djSnX7|idi|idi|i i }7|idi||i i |dijSdS(Niii( s OpenStacks acceptsCardss_s from_stackscardsssuitslensrankscard_dirscapsmods stack_dir(s_s from_stackscardsscard_dirs stack_dir((spysol.pys acceptsCards7s  ! +cs77|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage7s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysUnionSquare_RowStack7s   s UnionSquarecsD7tZ7eZ7dZ7dZ7dZ7dZRS(Nc s77t|dd|if\}}7|i|id|i|id|i7|i|if\}}7t |||dd|_ 7|i |i d7||i}7t||||_7|i |id7xtdD7]r}7d|i}7xFtdD7]5}7|iit|||7||i}qW7||i}qW7d |i|if\}}7xztdD7]i}7t||||d d 7d d d d}7|i |d7|ii|7||i}qW7|idS(NsYMii is max_roundsissiismax_moveisdirs max_cardsissw(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesisjsrowssappendsUnionSquare_RowStacksUnionSquare_Foundationsstacks foundationssdefaultStackGroups(s_sisjslsssxsysstack((spysol.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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch7scs77fSdS(N((s_((spysol.pysgetHighlightPilesStacks7s(s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pys UnionSquare7s     i#s Union SquaresWindmill_Foundationcs7tZ7dZRS(NcsJ77|iitjo7|iiiitSn7ti |SdS(N( s_scaps base_ranksACEsgamesappsimagess getLettersRK_FoundationStacksgetBottomImage(s_((spysol.pysgetBottomImage7s(s__name__s __module__sgetBottomImage(((spysol.pysWindmill_Foundation7s sWindmill_RowStackcs7tZ7dZRS(NcsB77ti||| o 7dSn7||iiijSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgamessswaste(s_s from_stackscards((spysol.pys acceptsCards7s (s__name__s __module__s acceptsCards(((spysol.pysWindmill_RowStack7s sWindmillcsb7tZ7dZ8dZ8dZ 8dZ8dZ8dZ8edZ RS(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 ffD7]X}7||d |i||d|if\}}7|iit|||qUW7|d|i|d|if\}}7|iit|||7d d dddd7xddfd dfddfd dffD7]g}7||d |i||d|if\}}7|iit|||8dtddqAW8|idS(NsXMiiis max_roundsisssiiiismodi s min_cardss max_cardsi4f0.59999999999999998f3.3999999999999999s base_ranksdiri(sLayouts_ssslssetSizesXSsXMsYSsYMsxsysWasteTalonStackstalons createTexts WasteStackswastesx0sy0sdsrowssappendsWindmill_RowStacks foundationssWindmill_FoundationsKINGsdefaultStackGroups(s_sxsdslsssysy0sx0((spysol.pys createGame7s.$6  R 3#+. 3csW88x,|D8]!}8|idjo8Pnq W8|i|8||gSdS(Ni(scardsscsidsremove(s_scardssc((spysol.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_sstack((spysol.pys fillStack 8s &&cs588|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8scs88fSdS(N((s_((spysol.pysgetHighlightPilesStacks8scs88ffffSdS(N((s_sevent((spysol.pys getAutoStacks8s( s__name__s __module__s createGames _shuffleHooks startGames fillStacksshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysWindmill7s       is Pyramid_Hintcs8tZ8dZRS(Ncs688||iiif}8ti|||SdS(N(srowss_sgamessstalons DefaultHintsstep010s dropstacks(s_s dropstackssrows((spysol.pysstep0108s(s__name__s __module__sstep010(((spysol.pys Pyramid_Hint8s sPyramid_StackMethodscsG8tZ 8dZ'8dZ08dddZ:8dddZRS(Ncs 8!8|io "8dSn#8||jp|i pt|djo $8dSn%8|id}&8|io&|dio|di|idjSdS(Niiii (s_sbasicIsBlockeds from_stackscardsslenscsface_upsrank(s_s from_stackscardssc((spysol.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(Niisautodropspriorityiissound( s_scardsscsface_upsranksKINGsbasicIsBlockedsgames playSamples playMoveMovesss foundations(s_seventsc((spysol.pys_dropKingClickHandler'8s +& ics0818|iiddd28to1|djo|i||idgpt38|ii |ii }48|ii i d}58|ii|||d|d|68|ii|||d|d|78|ii|88|i98|idS( Nsdroppairspriorityiiiisframessshadow(s_sgames playSamples __debug__sns acceptsCardss other_stackscardssAssertionErrors enterStatesS_FILLs old_statesss foundationssfsmoveMovesframessshadows leaveStates fillStack(s_sns other_stacksframessshadowsfs old_state((spysol.pys _dropPairMove08s;%% csu:8;8||iiijo6<8|ii|||d|d|=8|i n ?8|i ||ddd|dS(Nsframessshadowi( sto_stacks_sgamesss foundationssmoveMovesncardssframessshadows fillStacks _dropPairMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove:8s%(s__name__s __module__s acceptsCardss_dropKingClickHandlers _dropPairMovesmoveMove(((spysol.pysPyramid_StackMethods8s    sPyramid_Foundationcs@8tZA8dZRS(Ncs@A8B8ti||| o C8dSnD8|ditjSdS(Ni(sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscards((spysol.pys acceptsCardsA8s (s__name__s __module__s acceptsCards(((spysol.pysPyramid_Foundation@8s s Pyramid_Taloncs/E8tZF8dZJ8dZN8dZRS(Ncs8F8G8|i|o H8dSnI8ti||SdS(Ni(s_s_dropKingClickHandlerseventsFaceUpWasteTalonStacks clickHandler(s_sevent((spysol.pys clickHandlerF8s cs7J8K8ti| o L8dSnM8|ii SdS(Ni(sFaceUpWasteTalonStacks canDealCardss_sgames isGameWon(s_((spysol.pys canDealCardsJ8s csN8O8|io_P8|id}Q8xE|DQ8]:}R8||j o|i||oS8|dfSnq*WnT8tdfSdS(Niii(s_scardssstackssss acceptsCardssNone(s_sstacksscardsss((spysol.pys canDropCardsN8s  #(s__name__s __module__s clickHandlers canDealCardss canDropCards(((spysol.pys Pyramid_TalonE8s   s Pyramid_WastecsU8tZV8dZRS(Ncs8V8W8|i|o X8dSnY8ti||SdS(Ni(s_s_dropKingClickHandlersevents WasteStacks clickHandler(s_sevent((spysol.pys clickHandlerV8s (s__name__s __module__s clickHandler(((spysol.pys Pyramid_WasteU8s sPyramid_RowStackcswZ8tZ[8dZ^8dddddddddddddddddddddfZ_8dZi8d ZRS( Nc s8[8\8ti||||dddd]8d|_dS(Ns max_acceptis max_cardsi(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgame((spysol.pys__init__[8s%iiiiiics_8`8|iii|if\}}a8|idf\}}b8xsb8|djobc8|||}d8|d}e8x:t |||De8]"}f8||i o g8dSnqWqBWh8dSdS(Niii( s_sgamesssrowssSTEPsrsstepsidsisnsrangesjscards(s_sstepsrsisjsn((spysol.pysbasicIsBlocked_8s!  cs8i8j8|i|o k8dSnl8ti||SdS(Ni(s_s_dropKingClickHandlersevents OpenStacks clickHandler(s_sevent((spysol.pys clickHandleri8s (s__name__s __module__s__init__sSTEPsbasicIsBlockeds clickHandler(((spysol.pysPyramid_RowStackZ8s  H sPyramidcsJm8tZn8eZo8ddZ8dZ8edZ8dZRS(Nic so8p8t||if\}}q8|i|id|i|id|ir8xt dDr8]}s8|id||id} t8|i||id} u8xJt |dDu8]5}v8|iit| | |w8| |i} qWq`Wx8|i|if\} } y8t| | |ddd 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!| | |8d t"dddt#8dddd8|ig|ig|i$_%8|i|i$i%|i$_&8|i|i$i%|i$_'dS(Ni iiiiis max_roundsis max_acceptssesnesanchorssuitsdiris base_ranksmax_moves max_cardsi4((sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysjsrowssappendsPyramid_RowStacks Pyramid_Talonstalons createTexts getTextAttrstxstystastfs MfxCanvasTextscanvasstextssroundss Pyramid_Wasteswasteswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks( s_srowsstxstysisjslstfsssysxsta((spysol.pys createGameo8s2/  $$'"cs:88|i8|iii8|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame8s cs#88|ii|iiffSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks8scs88|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8s( s__name__s __module__s Pyramid_Hints Hint_Classs createGames startGamesNones getAutoStackssshallHighlightMatch(((spysol.pysPyramidm8s   sRelaxedPyramidcs8tZ8dZRS(Ncs,88t|iit|iijSdS(N(sgetNumberOfFreeStackss_sssrowsslen(s_((spysol.pys isGameWon8s(s__name__s __module__s isGameWon(((spysol.pysRelaxedPyramid8s sThirteencs#8tZ8dZ8dZRS(NcsZ88t||if\}}8|id|i|id|i|i8xt dD8]}8|id||id}8|i|i||id}8xJt |dD8]5}8|iit|||8||i}qWq`W8|i|if\}}8t|||dd|_8|i|id8||i}8t||||_8|i|id8d|i_8|i|i|if\}}8|iit|||8d td d d t8d d dd8|ig|ig|i_8|i|ii|i_8|i|ii|i_dS(Niiiiis max_roundsssissuitsdiris base_ranksmax_moves max_cardsi?B( sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsPyramid_RowStacksWasteTalonStackstalons createTexts Pyramid_Wasteswastes CARD_XOFFSETswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks(s_sisjssslsxsy((spysol.pys createGame8s0/ " "css88|i8|iiid|iid dd8|iiid|iid8|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_((spysol.pys startGame8s )#(s__name__s __module__s createGames startGame(((spysol.pysThirteen8s  i&isRelaxed PyramidsPileOn_RowStackcs8tZ8dZRS(Ncs88|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage8s(s__name__s __module__sgetBottomImage(((spysol.pysPileOn_RowStack8s sPileOncsG8tZ8eZ8ddZ8dZ8dZ8dZRS(Nic s88t|dd|if\}}8td|i|i|d|id|i}8|i |id||i d|i 8|i }8xtdD8]}8|i}8xtdD8]}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( NsXOFFSETiiiisdiris max_cardsi( sLayouts_ssslsmaxsXSs playcardssXOFFSETsXMswssetSizesYMsYSsysrangesisxsjsPileOn_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowssappendswidthsheightsInitialDealTalonStackstalonssgs openstackss talonstackss dropstacks( s_s playcardssisjslssswsysxsstack((spysol.pys createGame8s*$6,    !  )cs88|iid }8x6tdD8]%}8|iiid|ddq&W8|i8|iiid|8t o#t |iii djpt dS(Ni isrowssframesi( s_sssrowssrsrangesistalonsdealRowsstartDealSamples __debug__slenscardssAssertionError(s_sisr((spysol.pys startGame8s # cst88x`|iiD8]O}8|io<8t|idjp|i|i o 8dSnnqW8dSdS(Niii(s_sssrowssrscardsslens _isSequence(s_sr((spysol.pys isGameWon8s   -cs88|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8s(s__name__s __module__s DefaultHints Hint_Classs createGames startGames isGameWonsshallHighlightMatch(((spysol.pysPileOn8s    i)s Bristol_Hintcs28tZ8dZ8dZ8dZ8dZRS(Nics88||iiij oA8|d}8t|t|ijo8d|fSnn8t i |||||||SdS(Ni'i(srs_sgamesssreservessscoreslenspilescardsscolorsCautiousDefaultHints_getMovePileScorestsrpile(s_sscorescolorsrstspilesrpile((spysol.pys_getMovePileScore8s  (s__name__s __module__sBONUS_CREATE_EMPTY_ROWsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs_getMovePileScore(((spysol.pys Bristol_Hint8s    s Bristol_Taloncs8tZ8ddZRS(Nics)88|id|iiid|SdS(Nsrowsssound(s_s dealRowAvailsgamesssreservesssound(s_ssound((spysol.pys dealCards8s(s__name__s __module__s dealCards(((spysol.pys Bristol_Talon8s sBristolcsD8tZ8eiZ8eZ8dZ9dZ9dZ RS(Nc s88t|dd|if\}}8|i|id|i|id|i8|id|i|if\}}8xLt dD8];}8|i it|||dd8||i}qW8xt dD8]}8|i|dd|id}8xt dD8]w}8|i|d|id}8t|||d tdd }8|idf\|_|_8|ii|qWqW8|id|i|id|if\}}8t||||_8|i|id 8xRt dD8]A}8||i}9|iit|||d dd dq W9|i |i|i_9|ig|i_9|i|i|i_ dS(NsXOFFSETi iiismax_moveiis 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_slayoutsisjslsssysxsstack((spysol.pys createGame8s4$/& % # !1 /cs$99dt|iif\}}9g}9xI|d D9]:}9|i t jo 9|i |n 9|d}q;W 9x|D 9]} 9||} 9xf 9||joU9||i t jo-9||||f\||<||<9Pn9||}qWqW9|i 9|SdS(Niii(slens_sssrowssisnskingsscardsscsranksKINGsappendsjsreverse(s_scardssiscskingssjsn((spysol.pys _shuffleHook9s$!    % cs99|ii}9x6tdD9]%}9|iiid|ddq"W9|i9|iiid|9|iii dS(Nisrowssframesi( s_sssrowssrsrangesistalonsdealRowsstartDealSamples dealCards(s_sisr((spysol.pys startGame9s # ( s__name__s __module__sLayoutsklondikeLayouts Layout_Methods Bristol_Hints Hint_Classs createGames _shuffleHooks startGame(((spysol.pysBristol8s     s Belvederecs#9tZ9dZ#9dZRS(Ncsx99x<|D9]1}9|idjo9|i| 9Pnq W!9ti||}"9|d |g|dSdS(Nii(scardsscsranksremovesBristols _shuffleHooks_(s_scardssc((spysol.pys _shuffleHook9s  cs#9$9|ii}%9x6tdD%9]%}&9|iiid|ddq"W'9|i(9|iiid|)9t o$|iii di t jpt *9|iiid|iid +9|iiidS(Nisrowssframesiii(s_sssrowssrsrangesistalonsdealRowsstartDealSamples __debug__scardssranksACEsAssertionErrors foundationss dealCards(s_sisr((spysol.pys startGame#9s # .#(s__name__s __module__s _shuffleHooks startGame(((spysol.pys Belvedere9s  i*isAcesUp_Foundationcs09tZ19dZRS(Ncs1929ti||| o 39dSn49|d}59x|iiiD59]}69||j o!|io|idi |i joL79|idi |i jp|idi t jo89|i t jSnnqHW99dSdS(Nii( sAbstractFoundationStacks acceptsCardss_s from_stackscardsscsgamesssrowsssuitsranksACE(s_s from_stackscardsscss((spysol.pys acceptsCards19s   44(s__name__s __module__s acceptsCards(((spysol.pysAcesUp_Foundation09s sAcesUp_RowStackcs#:9tZ;9dZ?9eiZRS(NcsB;9<9ti||| o =9dSn>9t|idjSdS(Ni(s BasicRowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCards;9s (s__name__s __module__s acceptsCardss BasicRowStacksdoubleclickHandlers clickHandler(((spysol.pysAcesUp_RowStack:9s  sAcesUpcs\@9tZA9eZB9eeddZC9dZS9dZV9dZ ]9e dZ RS(Ns max_acceptic sC9D9t||if\}}E9|i|id|i|id|iF9|i|if\}}G9|i ||||_ H9|i |i dI9|d|id}J9xItdDJ9]8}K9|ii|i|||L9||i}qWM9|id|i}N9t|||tddO9d dd td d }P9|i |dQ9|ii|R9|idS( Niisssiiismax_moveisdirs base_ranks max_cardsi0(sLayouts_ssslssetSizesXMsXSsYMsYSsxsys Talon_Classstalons createTextsrangesisrowssappendsRowStack_ClasssAcesUp_FoundationsANY_SUITsANY_RANKsstacks foundationssdefaultStackGroups(s_slayoutsislsssxsysstack((spysol.pys createGameC9s / "cs'S9T9|iU9|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGameS9s csV9W9t|iididjo X9dSnY9xR|iiDY9]A}Z9t|idjp|iditjo [9dSnqAW\9dSdS(Nii0i(slens_sss foundationsscardssrowssranksACE(s_ss((spysol.pys isGameWonV9s#  0csY]9^9|tjo _9|iif|iifSn#a9|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks]9s ( s__name__s __module__sDealRowTalonStacks Talon_Classs StackWrappersAcesUp_RowStacksRowStack_Classs createGames startGames isGameWonsNones getAutoStacks(((spysol.pysAcesUp@9s     sFortunescs&b9tZc9eeddddZRS(Nsmax_movei?Bs max_accept(s__name__s __module__s StackWrappersAcesUp_RowStacksRowStack_Class(((spysol.pysFortunesb9s sRussianAces_Taloncsd9tZe9ddZRS(Nics_e9f9td|iii}g9| oh9|iii}ni9|id|d|SdS(Ncs f9|i S(N(ssscards(ss((spysol.pysf9ssrowsssound(sfilters_sgamesssrowss dealRowAvailssound(s_ssoundsrows((spysol.pys dealCardse9s (s__name__s __module__s dealCards(((spysol.pysRussianAces_Talond9s s RussianAcescsj9tZk9eZRS(N(s__name__s __module__sRussianAces_Talons Talon_Class(((spysol.pys RussianAcesj9s sPerpetualMotion_Taloncs&l9tZm9dZq9ddZRS(NcsIm9n9|iio|iiidjo o9dSnp9|ii SdS(Nii(s_sgamesdemosmovessindexs isGameWon(s_((spysol.pys canDealCardsm9s& ics/q9r9|ios9ti|d|Snt9|it|if\}}u9t|i i }v9|i w9xz|Dw9]o}x9xcx9|ioUy9|d}z9|i d||dd{9|idio|9|i|nqWqxW}9tot|i|jpt~9ti|d|SdS(Nssoundisframesii(s_scardssDealRowTalonStacks dealCardsssoundsgameslens num_cardsslistsssrowssreversesrsmoveMovesface_upsflipMoves __debug__sAssertionError(s_ssoundsgamesrowssrs num_cards((spysol.pys dealCardsq9s !    '(s__name__s __module__s canDealCardss dealCards(((spysol.pysPerpetualMotion_Talonl9s  sPerpetualMotion_Foundationcs9tZ9dZRS(Ncs?99ti||| o 9dSn9t|ddSdS(Nisdir(sAbstractFoundationStacks acceptsCardss_s from_stackscardssisRankSequence(s_s from_stackscards((spysol.pys acceptsCards9s (s__name__s __module__s acceptsCards(((spysol.pysPerpetualMotion_Foundation9s sPerpetualMotion_RowStackcs9tZ9dZRS(Ncs99|i}9| pt|djo9tdfSn9xE|D9]:}9||j o|i||o9|dfSnqKW9tdfSdS(Nii(s_sgetPilespileslensNonesstackssss acceptsCards(s_sstacksssspile((spysol.pys canDropCards9s #(s__name__s __module__s canDropCards(((spysol.pysPerpetualMotion_RowStack9s sPerpetualMotioncs/9tZ9dZ9dZ9dZRS(Nc s99t||if\}}9|i|id|i|id|i9|i|if\}}9t |||dd|_ 9|i |i d9|d|id}9xRtdD9]A}9|iit|||dd d t9||i}qW9|id |i}9t|||td t9d d dd 9dddd}9|i |d9|ii|9|idS(Niis max_roundsisssiisdiris base_rankis max_cardsi4smax_moves min_accepts max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysPerpetualMotion_Talonstalons createTextsrangesisrowssappendsPerpetualMotion_RowStacksNO_RANKsPerpetualMotion_FoundationsANY_SUITsANY_RANKsstacks foundationssdefaultStackGroups(s_slayoutsislsssysxsstack((spysol.pys createGame9s"/ +cs'99|i9|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame9s cs99|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch9s(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pysPerpetualMotion9s   isAces UpsIdiot's Delightiis Russian AcesisPerpetual Motions First Laws Montana_Hintcs9tZ9dZRS(Nc s99|i}9|i|i|if\}}}9td|ii} 9xv|iiD9]e}9|i o 9q^n9t o.t |i djo|i di pt9|i d|i gf\}}} 9|i|djo9|ii|id} n'9t} 9|i|jo 9q^n9x| D9]~} 9|i|| || o\9| o| i o"9d|i| i di}n 9d}9|i|d|| nqAWq^WdS(Ncs 9|i S(N(ssscards(ss((spysol.pys9siiii@iP(s_sgamesRLENsRSTEPsRBASEsfiltersssrowssfreerowssrscardss __debug__slensface_upsAssertionErrorscspilesrpilesidsleftsNonesranksts shallMovePilesKsscoresaddHint( s_scsscoresRSTEPsRLENsRBASEsgamesrspilestsrpilesfreerowssleft((spysol.pys computeHints9s* $  8%   " (s__name__s __module__s computeHints(((spysol.pys Montana_Hint9s s Montana_Taloncs29tZ9dZ9ddZ9dZRS(Ncs+99|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_((spysol.pys canDealCards9sics}99|i} 9| i| i| if\}}}9d} 9tot|idjpt 9| i i }9g}9t gd} 9xtdD9]}9||}9||}9|io|idi|jo#9d|idif\}} n9dtf\}} 9xt|D9]} 9||| }9|oQ9|i p/|idi| jp|idi|| jo 9d}nn9| os9|i|9| |t jo9|| |:||j o?:|i|nqW@:|SdS(Ni( sspacesslens_sgamesrandomschoicesstackssrsappend(s_sstackssgapssspacessr((spysol.pysgetRedealSpaces::s (s__name__s __module__sgetRedealSpaces(((spysol.pys Spaces_Talon9:s sSpacescsA:tZB:eZRS(N(s__name__s __module__s Spaces_Talons Talon_Class(((spysol.pysSpacesA:s sBlueMooncs2C:tZD:dddf\ZZZE:dZRS(Ni8iicsSE:F:d}G:d}H:xtdDH:]}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:]3}T:|id||ii |U:|d}qWdS( Nii4iii'isrowssframescs!Q:|io|iditjS(Ni(srscardssranksACE(sr((spysol.pysQ:s(sframessjsrangesis_sstartDealSamplessstalonsdealRowsrowss __debug__slenscardssAssertionErrorsfiltersace_rowssrsmoveMove(s_sisrsframessjsace_rows((spysol.pys startGameE:s$     ,-   (s__name__s __module__sRLENsRSTEPsRBASEs startGame(((spysol.pysBlueMoonC:s sRedMooncs#V:tZW:dZY:dZRS(NcsW:X:|i|dSdS(NcsX:|idj|ifS(Ni(scsrankssuit(sc((spysol.pysX:s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookW:scsY:Z:d}[:|ii}\:|iiid|d|d|d|dfd|]:x|tdD]:]k}^:|djo_:|i `:d}na:|dd }b:|iiid|||d !d|qfWdS( Nisrowsiii*sframesiiii ( sframess_sssrowssrstalonsdealRowsrangesisstartDealSamplesn(s_sisrsframessn((spysol.pys startGameY:s ;   (s__name__s __module__s _shuffleHooks startGame(((spysol.pysRedMoonV:s  i5ssisncardssGapsiti?s Blue MooniusRed MoonsPasDeDeux_Hintcs#m:tZn:dZu:dZRS(Ncsmn:o:d}p:|i|idjoq:|d}nr:|i|idjos:|d}nt:|SdS(Nii i(sdscardsranksstacksidssuit(s_sstackscardsd((spysol.pys getDistancen:s  csu:v:g}w:xH|iiiDw:]4} x:| i| ioy:|i| z:PnqW{:x;|D{:]0} |:|i| | id}}:| i d| i df\}}~:t |ddt d|d|d} :x| D:]}:|iii|} :| | jo :qn:to| i| | ipt:|i| | id}:|i| | id} :|i| | id}:ddf\} }:|iiiidjo:ddf\} }n:|ii| idi d}:do||iiiijo:| d} n:t| |||| | ||d}:|d jo:|i|d| | nqWqdWdS( Nii i4iiiiii( srowss_sgamesssrs canMoveCardsscardssappends getDistancesr1_dsidscolumnsrowsranges stack_idssists __debug__s acceptsCardssAssertionErrorst1_dsr2_dst2_dsrwstwstalonsroundscswastesintsscoresaddHint(s_scsrowssscoresistwsr1_dst1_dscolumnsrsrwstsr2_ds stack_idsst2_dsrow((spysol.pys computeHintsu:s:    #.  '!#/(s__name__s __module__s getDistances computeHints(((spysol.pysPasDeDeux_Hintm:s  sPasDeDeux_Wastecs:tZ:dZRS(Ncs::dSdS(Ni((s_((spysol.pys canFlipCard:s(s__name__s __module__s canFlipCard(((spysol.pysPasDeDeux_Waste:s sPasDeDeux_RowStackcse:tZ:dZ:dZ:dddZ:dddZ:dZ:eedZRS(Ncs::ti|| o :dSn:|iiii o :dSn:|iiiid}:|io+|di |i jo|di |i jSdS(Nii( s ReserveStacks canMoveCardss_scardssgamessswastescsface_upssuitsrank(s_scardssc((spysol.pys canMoveCards:s   csB::ti||| o :dSn:|ii||SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgames isNeighbour(s_s from_stackscards((spysol.pys acceptsCards:s ics::to*|djo||iiijpt:tot|i djpt:|i ||dddd:|iii i o:|iii i nH:to!|iiii dipt:|ii|iiidS(Nisframesisshadowi(s __debug__sncardssto_stacks_sgamesssrowssAssertionErrorslenscardss _swapPairMovestalons canDealCardss dealCardsswastesface_upsflipMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove:s4'+cs::|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_statesswap((spysol.pys _swapPairMove:s "cs0::|id}:|iiii|SdS(Ni (s_sidssuitsgamesappsimagess getSuitBottom(s_ssuit((spysol.pysgetBottomImage:scs::xx|iiiD:]d}:|i|ioH:|i||io':|it |i|:dSn:PnqW:dSdS(Nii( s_sgamesssrowssrs canMoveCardsscardss acceptsCardss playMoveMoveslen(s_sevents from_stackss to_stackssr((spysol.pysquickPlayHandler:s   ( s__name__s __module__s canMoveCardss acceptsCardssmoveMoves _swapPairMovesgetBottomImagesNonesquickPlayHandler(((spysol.pysPasDeDeux_RowStack:s     s PasDeDeuxcsk:tZ:eZ:dZ:dZ:dZ:edZ:dZ :dZ :dZ RS(Nc s::t|dd|if\}}:|i|id|i|id|i:xt dD:]}:xst dD:]b}:|i||i|i||if\}}:|iit|||ddddqWqfW:|id|i|i|if\}}:t|||d d|_:|i|id :t|i:||i|d d |ii_:||i}:t|||d d|_:|i|id:|iit|:|idS(NsXMii is max_acceptis max_cardsis max_roundsssesanchorsnwsmax_moveissw(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsPasDeDeux_RowStackswidthsheightsWasteTalonStackstalons createTexts MfxCanvasTextscanvasstextssroundssPasDeDeux_Wasteswastes internalssInvisibleStacksdefaultStackGroups(s_sisjssslsxsy((spysol.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_sevent((spysol.pys getAutoStacks:scs::x|iiD:]v}:t|idjo :dSn:|id}:|i|idjp|i |idjo :dSnqW:dSdS(Niiii ( s_sssrowssrslenscardsscssuitsidsrank(s_scsr((spysol.pys isGameWon:s  1csg::|id|idf\}}:|id|idf\}}:||jp ||jSdS(Ni (sstack1sidscolumn1srow1sstack2scolumn2srow2(s_sstack1sstack2srow1srow2scolumn1scolumn2((spysol.pys isNeighbour:s##cs::|iidffSdS(Ni(s_sssrows(s_((spysol.pysgetHighlightPilesStacks:s( s__name__s __module__sPasDeDeux_Hints Hint_Classs createGamesshuffles startGamesNones getAutoStackss isGameWons isNeighboursgetHighlightPilesStacks(((spysol.pys PasDeDeux:s       is Pas de DeuxsRoyalCotillion_Foundationcs:tZ:dZRS(NcsY::|iidjo:|iiiidSn:|iiii|iiSdS(Ni( s_scaps base_ranksgamesappsimagess getLetters getSuitBottoms base_suit(s_((spysol.pysgetBottomImage:s(s__name__s __module__sgetBottomImage(((spysol.pysRoyalCotillion_Foundation:s sRoyalCotillioncsS:tZ:eZ:dZ;dZ ;dZ;dZ;edZ RS(Nc s::t||if\}}:|i|id|i|id|i:xbt dD:]Q}:|i||i|if\}}:|i it|||ddq`W:xt dD:]}:|id|i|i||if\}}:|ii|i||||dddd:||i}:|ii|i||||ddddd d qW:xt dD:]}}:xqt dD:]`}:|i|d |i|i||if\}}:|iit|||ddqWqW:|i|i|i|if\}}:t|||d d |_:|i|id :||i};t||||_;|i|id;|idS(Ni is max_acceptisdirismodi s base_rankiis max_roundssswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysrowssappends BasicRowStacks foundationssFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame:s2/ &) 11;  5-)cs|;;|iiid|iidd;|i;x*tdD;]};|iiiqEW;|iiidS(Nsrowssframesii( s_ssstalonsdealRowsreservessstartDealSamplesrangesis dealCards(s_si((spysol.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_state((spysol.pys fillStack ;s&&cs;;fSdS(N((s_((spysol.pysgetHighlightPilesStacks;scsY;;|tjo ;|iif|iifSn#;|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks;s ( s__name__s __module__sRoyalCotillion_FoundationsFoundation_Classs createGames startGames fillStacksgetHighlightPilesStackssNones getAutoStacks(((spysol.pysRoyalCotillion:s      s OddAndEvencs#;tZ;dZ/;dZRS(Nc s;;t||if\}};|i|id|i|id|i;|i|if\}};xXt dD;]G};|i i|i||||dddd;||i}q{W ;x^t dD ;]M}!;|i i|i||||dddddd";||i}qW#;xt dD#;]}$;|idd f||i|i|d|if\}}%;xVt dd f|D%;];}&;|iit|||d d ';||i}qWq=W(;|i|i|if\}});t|||d d|_*;|i|id+;||i},;t||||_-;|i|id.;|idS(Niisdirismodi s base_rankiiis max_acceptis max_roundssnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjslsssxsy((spysol.pys createGame;s2/ 1 7 ? %"csF/;0;|i1;|iiid|ii2;|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRowsreservess dealCards(s_((spysol.pys startGame/;s (s__name__s __module__s createGames startGame(((spysol.pys OddAndEven;s  sKingdomcs83;tZ4;eZ5;dZG;dZI;dZRS(Ncs5;6;t||if\}}7;|i|id|i|id|i8;|i|if\}}9;xLt dD9;];}:;|i i|i|||t;;||i}q{W<;|i||if\}}=;xLt dD=;];}>;|iit|||dd?;||i}qW@;|id|i|d|idf\}}A;t|||dd|_B;|i|id C;||i}D;t||||_E;|i|id F;|idS( Niis max_acceptiiis max_roundsisswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssANY_SUITsreservess ReserveStacksWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sislsssxsy((spysol.pys createGame5;s&/ % %2cs G;H;|i|ddSdS(NcsH;|idj|ifS(Ni(scsrankssuit(sc((spysol.pysH;si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookG;scslI;J;|iK;|iiid|iidfL;|iiid|iiM;|iiidS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssreservess dealCards(s_((spysol.pys startGameI;s &(s__name__s __module__sRK_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysKingdom3;s    sAlhambra_WastecsN;tZO;dZRS(NcsO;P;ti||| o Q;dSnR;|i o S;dSnT;|id|df\}}U;|i|ijo?|id|i i |ijp|id|i i |ijSdS(Niii( s WasteStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCardsO;s    (s__name__s __module__s acceptsCards(((spysol.pysAlhambra_WasteN;s sAlhambracs/V;tZW;dZn;dZp;dZRS(NcsnW;X;t||if\}}Y;|i|id|i|id|iZ;|i|if\}}[;xRt dD[;]A}\;|i it|||d|dd];||i}q{W^;xat dD^;]P}_;|i it|||d|dd`;dtdda;||i}qWb;|i||if\}}c;xLt dDc;];}d;|iit|||d de;||i}qYWf;|id |i|d |if\}}g;t|||d d |_h;|i|id i;||i}j;t|||ddd d|_k;|i|idl;|ii|im;|idS(Niissuitsmax_moveis base_ranksdiris max_acceptiis max_roundssswsmodi isse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsSS_FoundationStacksKINGsreservess BasicRowStacksWasteTalonStackstalons createTextsAlhambra_WasteswastesrowssdefaultStackGroups(s_sislsssysx((spysol.pys createGameW;s2/ + $ %.$cs n;o;|i|ddSdS(Ncs8o;|idjo|iddfj|i|iffS(Nii (scsdecksrankssuit(sc((spysol.pyso;si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookn;scsp;q;|iiid|iiddr;x<tdDr;]+}s;|iiid|iiddq8Wt;|iu;|iiid|iidS(Nsrowssframesii( s_ssstalonsdealRows foundationssrangesisreservessstartDealSample(s_si((spysol.pys startGamep;s % ) (s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pysAlhambraV;s   sCarpetcs8v;tZw;eZx;dZ;dZ;dZRS(Nc s&x;y;t||if\}}z;|i|id|i|id|i{;xt dD{;]w}|;xkt dD|;]Z}};|i|d|i|i||if\}}~;|iit|||qyWq`W;xt dD;]};ddfddfddfddff|\}};|i||i|i||if\}};|ii|i||||qW;|i|if\}};t|||dd|_;|i|id ;||i};t||||_;|i|id ;|idS( Ni iiiiiis max_roundssse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends ReserveStacksdxsdys foundationssFoundation_ClasssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_sisjssslsdxsdysysx((spysol.pys createGamex;s(/  5' 71)cs;;|i|dSdS(Ncs;|idj|ifS(Ni(scsrankssuit(sc((spysol.pys;s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook;scsY;;|i;|iiid|ii;|iii;|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGame;s (s__name__s __module__sSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysCarpetv;s    i6sRoyal Cotillioni7s Odd and EveniiiasOsmosis_Foundationcs;tZ;dZRS(Ncs;;ti||| o ;dSn;tot|djpt;tdf\}};xU|i i i D;]A};t|i|jo";|t|if\}}nqtW;t|i|jo9;|di|it|iijo ;dSnn;dSdS(Niii(sAbstractFoundationStacks acceptsCardss_s from_stackscardss __debug__slensAssertionErrorsNonesmax_ss max_cardssgamesss foundationssrank(s_s from_stackscardssmax_ssss max_cards((spysol.pys acceptsCards;s $ &*(s__name__s __module__s acceptsCards(((spysol.pysOsmosis_Foundation;s sOsmosiscs,;tZ;dddZ;ddZRS(Niic sJ;;t|dd|if\}};|i|id|i|id|i;|i|if\}};xyt dD;]h};t |||dddd};|idf\|_|_;|ii|;||i}qW;|id |i|if\}};x|t dD;]k};t||||d tdd};|idf\|_|_;|ii|;||i}q&W;|i|i|i|if\}};t|||d |d ||_;|i|id ;||i};t||||_;|i|id ;|idS(NsXOFFSETi iismax_moveis max_acceptiis 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_dealsislsssysxsstack((spysol.pys createGame;s.$/ !& $)$ics;;|iii};|i|ii};|ii |};|i ;|i |ii;|i d|ii|;x0tdD;]};|iiid|qW;|iii;|iiidS(Niisflip(s_ssstalonsgetCards base_cardssuitsgameinfosdeckssns foundationssto_stacksstartDealSamplesflipMovesmoveMovesrangesisdealRowsflips dealCards(s_sflipsis base_cardsto_stacksn((spysol.pys startGame;s  (s__name__s __module__s createGames startGame(((spysol.pysOsmosis;s sPeekcs;tZ;dZRS(Ncs;;ti|dddS(Nsflipi(sOsmosiss startGames_(s_((spysol.pys startGame;s(s__name__s __module__s startGame(((spysol.pysPeek;s i;i<sMonteCarlo_Hintcs;tZ;RS(N(s__name__s __module__(((spysol.pysMonteCarlo_Hint;s sMonteCarlo_Taloncs&;tZ;dZ;ddZRS(Ncsw;;d};xJ|iiiD;]6};|i o ;d}n;|o ;dSnqW;|o t|iSdS(Nii(sfrees_sgamesssrowssrscardsslen(s_srsfree((spysol.pys canDealCards;s    icsf;;|ii|iiiddB;|ii};|ii|iiiddB;|SdS(Niii(s_sgamesupdateStackMovessstalonsfillEmptyStackssn(s_ssoundsn((spysol.pys dealCards;s##(s__name__s __module__s canDealCardss dealCards(((spysol.pysMonteCarlo_Talon;s  sMonteCarlo_RowStackcs;;tZ;dZ;dddZ;dddZRS(Ncsn;;ti||| o ;dSn;|idi|dijo ;dSn;|ii||SdS(Nii(s OpenStacks acceptsCardss_s from_stackscardssranksgames isNeighbour(s_s from_stackscards((spysol.pys acceptsCards;s  ! ics;;to*|djo||iiijpt;|io#;|i ||ddd|n#;t i |||d|d|dS(Nisframesisshadow(s __debug__sncardssto_stacks_sgamesssrowssAssertionErrorscardss _dropPairMovesshadows BasicRowStacksmoveMovesframes(s_sncardssto_stacksframessshadow((spysol.pysmoveMove;s4 #cs,;;|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_statesf((spysol.pys _dropPairMove;s ""  (s__name__s __module__s acceptsCardssmoveMoves _dropPairMove(((spysol.pysMonteCarlo_RowStack;s  s MonteCarlocs;tZ;eZ;eeddZ=|djSdS(Nii3(scs_sss foundationsslenscards(s_scss((spysol.pys isGameWon:=s   cs?=@=f|iiffSdS(N(s_sssreserves(s_sevent((spysol.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=|dddfjSnDJ=|djoK=|dddfjSnM=|ddddfjSdS(Nii3i iii i(sstack1sidsstack2scolumnsdiff(s_sstack1sstack2scolumnsdiff((spysol.pys isNeighbourC=sF ( s__name__s __module__s createGames startGames isGameWonsNones getAutoStackssgetDemoInfoTexts isNeighbour(((spysol.pysDerLetzteMonarch#=s     iYs Monte CarloiiiZs Simple Carloi[s Simple Pairsi\i`iisDer letzte Monarchs RoyalEastcsP`=tZa=eZb=dZy=dZ=dZ=dZ=dZRS(Nc sb=c=t||if\}}d=|i|id|i|id|ie=t |_ f=xt dDf=]}g=ddfddfddfddff|\}}h=|id|d|id|id|d|idf\}}i=t||||ddd d}j=d|_k=|ii|qlWl=xt dDl=]}m=ddfddfddfddfddff|\}}n=|id|d|id|id|d|idf\}}o=t|||ddd d}p=d|_q=|ii|qLWr=|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_sissslsdxsdysysxsstack((spysol.pys createGameb=s0/  7I$  @I! *csy=z=|iiid|_{=x,|iiD{=]}|=|ii|i_q,W}=|iii }~=|ii|i |i i }=|i|ii=|id|ii|dd=|i=|iii=|iiidS(Niisframesi(s_ssstalonscardss base_cards foundationssrankscaps base_ranksgetCardscssuitsgameinfosdeckssto_stacksflipMovesmoveMovesstartDealSamplesdealRows dealCards(s_sssto_stacksc((spysol.pys startGamey=s  " csR==|i|ii|_=x,|iiD=]}=|ii|i _ q,WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook=s cs2==|iidt=|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook=scs==|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHook=s( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys RoyalEast`=s     i]s Royal Easts TamOShantercs2=tZ=dZ=dZ=edZRS(Nc s==t||if\}}=|i|id|i|id|i=|i|if\}}=t |||dd|_ =|i |i d=x`tdD=]O}=|i|d|i|if\}}=|iit|||qW=xtdD=]r}=|i|d|i|i|if\}}=|iit|||dddd =||i}qW=|idS( Niis max_roundsisssismax_moves max_accepti(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysDealRowTalonStackstalons createTextsrangesis foundationssappendsRK_FoundationStacksrowss BasicRowStacksdefaultStackGroups(s_sislsssysx((spysol.pys createGame=s/ *# 1+cs'==|i=|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame=s cs==ff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks=s(s__name__s __module__s createGames startGamesNones getAutoStacks(((spysol.pys TamOShanter=s   s AuldLangSynecs#=tZ=dZ=dZRS(Ncs==|i|dSdS(Ncs=|idj|ifS(Ni(scsrankssuit(sc((spysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook=scsL==|iiid|iidd=|i=|iiidS(Nsrowssframesi(s_ssstalonsdealRows foundationssstartDealSample(s_((spysol.pys startGame=s% (s__name__s __module__s _shuffleHooks startGame(((spysol.pys AuldLangSyne=s  sStrategy_Foundationcs=tZ=dZRS(NcsK==ti||| o =dSn=t|iiiidjSdS(Ni( sSS_FoundationStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscards((spysol.pys acceptsCards=s (s__name__s __module__s acceptsCards(((spysol.pysStrategy_Foundation=s sStrategy_RowStackcsG=tZ=dZ=dZ=dZ=dZ=dZRS(NcsU==ti||| o =dSn=||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalonslen(s_s from_stackscards((spysol.pys acceptsCards=s cs;==|iiiio =dSn=ti||SdS(Ni(s_sgamessstalonscardss BasicRowStacks canMoveCards(s_scards((spysol.pys canMoveCards=s csW==|iiiio'=|iiiid|=dSn=ti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacks clickHandlersevent(s_sevent((spysol.pys clickHandler=s csW==|iiiio'=|iiiid|=dSn=ti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacksdoubleclickHandlersevent(s_sevent((spysol.pysdoubleclickHandler=s cs==|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage=s(s__name__s __module__s acceptsCardss canMoveCardss clickHandlersdoubleclickHandlersgetBottomImage(((spysol.pysStrategy_RowStack=s     sStrategycs/=tZ=dZ=dZ=dZRS(Nc s==t||if\}}=|i|id|i|id|i=|i|if\}}=t ||||_ =|i |i d=xltdD=][}=|i|d|i|if\}}=|iit|||d|ddqW=xtdD=]n}=|i||i|i|if\}}=|iit|||ddd d=||i}qW=|idS( Niisseissuitsmax_moveiis max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysOpenTalonStackstalons createTextsrangesis foundationssappendsStrategy_FoundationsrowssStrategy_RowStacksdefaultStackGroups(s_sislsssysx((spysol.pys createGame=s/ */ -+cs==|i|dSdS(Ncs=|idj|ifS(Ni(scsrankssuit(sc((spysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook=scsF==|i=|iiid|ii=|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss fillStack(s_((spysol.pys startGame=s (s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pysStrategy=s   sInterregnum_Foundationcs=tZ=dZRS(Ncsv==ti||| o =dSn=t|idjo=|i|idjSn=||iii jSdS(Nii i( sRK_FoundationStacks acceptsCardss_s from_stackscardsslensidsgamesssrows(s_s from_stackscards((spysol.pys acceptsCards=s  (s__name__s __module__s acceptsCards(((spysol.pysInterregnum_Foundation=s s Interregnumcsn=tZ=dZ=ddZ=dZ=edZ=dZ>dZ>dZ  >d Z RS( Niic s==t||if\}}=|i|itd||i|i d|i =t |_ =xbt dD=]Q}=|i||i|i f\}}=|iit|||ddquW=xot dD=]^}=|i||i|i |i f\}}=|iit|||ddddqW=xt |D=]r}=|id |d||id |i d |i f\}}=|iit|||dddd qRW=t|i|i|i|i ||_=|i|id =|idS( Ni iis max_acceptismodi smax_moveiisnn(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsNones base_cardssrangesisxsysreservessappends ReserveStacks foundationssInterregnum_Foundations RK_RowStacksDealRowTalonStackswidthsheightstalons createTextsdefaultStackGroups(s_srowssislsssysx((spysol.pys createGame=s$8  &) -/ A/,cs==|i=g|_=xtdD=]}=|ii|iii=|i|i dd|ii |i _ =|i |ii=|id|ii|ii|q,W=|iiidS(Niii (s_sstartDealSamples base_cardssrangesisappendssstalonsgetCardsranks foundationsscaps base_ranksflipMovesmoveMovesreservessdealRow(s_si((spysol.pys startGame=s   +*cs==ff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks=scs===|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch=scs>>tgd|_>xltdD>][}>|ii|}>|i ||i|<>|i|i dd|i i |i _q&WdS(Niii (sNones_s base_cardssrangesisgamesloadinfos base_card_idssidscardssranksss foundationsscaps base_rank(s_sgamesisid((spysol.pys_restoreGameHook>s  csY>>g}>x-tdD>]} >|i|iqW >|iid|dS(Nis base_card_ids( sidssrangesisappendspsloads_sloadinfosaddattr(s_spsisids((spysol.pys _loadGameHook>s   cs4 > >x'|iD >]} >|i|iqWdS(N(s_s base_cardsscspsdumpsid(s_spsc((spysol.pys _saveGameHook >s ( s__name__s __module__s GAME_VERSIONs createGames startGamesNones getAutoStackssshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys Interregnum=s      is Tam O'Shanteri_sAuld Lang Syneii{sDoublets_Foundationcs>tZ>dZRS(Ncs>>ti||| o >dSn>|ioB>d|idid|ii|dijo >dSnn>dSdS(Niiii(sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsmod(s_s from_stackscards((spysol.pys acceptsCards>s   3(s__name__s __module__s acceptsCards(((spysol.pysDoublets_Foundation>s sDoubletscs_>tZ>eZ >dZ3>dZ>>dZC>dZG>dZP>e dZ RS(Ncsy >!>t||if\}}">|i|id|i|id|i#>xddfddfddfddfddfddfddffD#>]t\}}$>|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_slsssdxsdysysx((spysol.pys createGame >s&/II#I*cs3>4>ggf\}}5>xw|D5>]k}6>|i|7>|itjo8>|i|n/:>|i|;>t|djo<>Pnq#W=>|||SdS(Ni( skingsstopcardsscardsscsremovesranksKINGsappendslen(s_scardsscstopcardsskings((spysol.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_state((spysol.pys fillStackG>s!csP>Q>ff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksP>s( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWons fillStacksNones getAutoStacks(((spysol.pysDoublets>s      iosSiebenBisAs_HintcsT>tZU>dZRS(Nc sU>V>|i}W>td|ii} X>xi|iiDX>]X}Y>|i o Z>q:n[>t o.t |i djo|i di pt \>|i d|i gf\}}}]>|i|iii\}}^>|oY_>dtf\} }`>|i| ||||\} }a>|i| ||||nb>xS| Db>]H}c>|i||||o&d>d} e>|i| d||nqFWq:WdS(Ncs W>|i S(N(ssscards(ss((spysol.pysW>siiiiP(s_sgamesfiltersssrowssfreerowsssgs dropstackssrscardss __debug__slensface_upsAssertionErrorscspilesrpiles canDropCardss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHints shallMovePile( s_scsncardsscolorsgamesrspilestsrpilesfreerowssscore((spysol.pys computeHintsU>s$   8%! $   (s__name__s __module__s computeHints(((spysol.pysSiebenBisAs_HintT>s sSiebenBisAs_Foundationcsf>tZg>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_stackscards((spysol.pys acceptsCardsg>s   (s__name__s __module__s acceptsCards(((spysol.pysSiebenBisAs_Foundationf>s sSiebenBisAs_RowStackcs#o>tZp>dZ|>dZRS(Ncs_p>q>ti||| o r>dSns>|iddjo}t>|iii|id}u>|ioA|idi |di jo#|idi dd|di jo v>dSnnw>|idddjo}x>|iii|id}y>|ioA|idi |di jo#|idi dd|di jo z>dSnn{>dSdS(Nii iii ( s BasicRowStacks acceptsCardss_s from_stackscardssidsgamesssrowsssuitsrank(s_s from_stackscardsss((spysol.pys acceptsCardsp>s QQcs|>}>|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage|>s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysSiebenBisAs_RowStacko>s  s SiebenBisAscs,~>tZ>eZ>dZ>dZRS(Nc s>>t||if\}}>|i|id|i|id|i>xt dD>]}>xwt dD>]f}>|i||i|i|d|if\}}>|iit|||ddddqyWq`W>xft dD>]U}>|i|d|i|if\}}>|iit|||dd qW>xt dD>]o}>|i|d|i|id|if\}}>|iit||||d d d d dd qfW>t|i|i|i||_>|idS(Ni iiis max_accepts max_cardsiiis base_rankismodi smax_move(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsSiebenBisAs_RowStacksreservess ReserveStacks foundationssSiebenBisAs_FoundationsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame>s$/  53 *) 58%cs>>|i>|iii>|iiid|ii>td|ii}>x;|D>]0}>|i d||ii |i di qgWdS(Nsrowscs>|ididjS(Nii(srscardssrank(sr((spysol.pys>sii(s_sstartDealSamplessstalonsdealRowsreservessfiltersrowssstackssrsmoveMoves foundationsscardsssuit(s_srsstacks((spysol.pys startGame>s  (s__name__s __module__sSiebenBisAs_Hints Hint_Classs createGames startGame(((spysol.pys SiebenBisAs~>s   s Maze_RowStackcs/>tZ>dZ>eiZ>dZRS(Ncsl>>ti||| o >dSn>|iii|idd}>|io>|idi |di jo|idi d|di jo >dSn>|idi t jo|di t jo >dSnn>|iii|idd}>|ioR>|idi |di jo|idi d|di jo >dSnn>dSdS(Niii6i( s BasicRowStacks acceptsCardss_s from_stackscardssgamesssrowssidssuitsranksQUEENsACE(s_s from_stackscardsss((spysol.pys acceptsCards>s ! C .! Ccs>>|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage>s(s__name__s __module__s acceptsCardssStacksprepareInvisibleBottoms prepareBottomsgetBottomImage(((spysol.pys Maze_RowStack>s   sMazecsA>tZ>dZ>eZ>dZ>dZ>dZRS(Nic sL>>t|dddd|if\}}>|i|id|i|id|i>xt dD>]}>xst dD>]b}>|i||i|i||if\}}>|iit|||ddddqWqlW>t|i|id|i|i||_>|iit|>|idS( NsXMisYMi is max_acceptis max_cards(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends Maze_RowStacksInitialDealTalonStackswidthsheightstalons internalssInvisibleStacksdefaultStackGroups(s_sjsissslsysx((spysol.pys createGame>s*/  130cs)>>d}>xtdD>]}>|djo >qn>|iiid}>|it jo)>|iii d|ii ddnd>|djo |djo>|i >d}n>|iii d|ii |fd|qW>to#t|iiidjptdS(Nii6i4isrowssframesi$(sframessrangesis_ssstalonscardsscsranksKINGsdealRows internalssstartDealSamplesrowss __debug__slensAssertionError(s_sisframessc((spysol.pys startGame>s   )  0cs>>td|ii}>t|djo >dSn>d}>doG>x0>||iditjo>|d}qXW>||}n>x|d|d|d|dfD>]}>||}>||d }>|i |i d d jo >dSn>|iditjp|idit jo >dSn>t|||d!}>| pt|d d o >dSnqW>dSdS( Ncs >|iS(N(ssscards(ss((spysol.pys>si0iiii ii$i i6sdir(sfilters_sssrowsslensiscardssranksACEsjsr1sr2sidsQUEENsgetPileFromStacksspilesisSameSuitSequence(s_srowssr2sisjspilesr1((spysol.pys isGameWon>s*   &   1 (s__name__s __module__s GAME_VERSIONsSiebenBisAs_Hints Hint_Classs createGames startGames isGameWon(((spysol.pysMaze>s    ivs Sieben bis AsisDieBoeseSieben_Taloncs&>tZ>dZ>ddZRS(Ncs*>>t|ip|i|ijSdS(N(slens_scardssrounds max_rounds(s_((spysol.pys canDealCards>sics>>|io>ti|d|Sn>|it|if\}}>x|ii D>]o}>xc>|ioU>|d}>|idi o>|i |n>|i d||ddqjWq[W>tot|i|jpt>|o>|in>|i|>|i|>t|ii }>||d@}>xU>|ioG>t|i|jo >d}n>|id|>| }q_W>|o>|in>|SdS(Nssoundiisframesisflip(s_scardssDieKoenigsbergerin_Talons dealCardsssoundsgameslens num_cardssssrowssrsface_upsflipMovesmoveMoves __debug__sAssertionErrorsstartDealSamplesshuffleStackMoves nextRoundMovesnsflipsdealRows stopSamples(s_ssoundsgamesflipsrs num_cardssn((spysol.pys dealCards>s6 !   %'    (s__name__s __module__s canDealCardss dealCards(((spysol.pysDieBoeseSieben_Talon>s  sDieBoeseSiebencs&>tZ>ddZ?dZRS(Nic s>>t||if\}}>|i|itd||i|i d|i >xit dD>]X}>|i||i|i f\}}>|iit||||dddqiW?xst |D?]b}?|id|d||id|i |i f\}}?|iit|||qW?t|i|i|i |dd|_?|i|id?|idS(Niiismax_moveis max_roundssse(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsrangesisxsys foundationssappendsDieRussische_Foundations AC_RowStacksDieBoeseSieben_Talonsheightstalons createTextsdefaultStackGroups(s_srowssislsssysx((spysol.pys createGame>s8 &0 =#+csY??|i?x?dddddddfD?]} ?|iiid|q/WdS(Niisflip(s_sstartDealSamplesflipssstalonsdealRow(s_sflip((spysol.pys startGame?s  (s__name__s __module__s createGames startGame(((spysol.pysDieBoeseSieben>s  ixsDie bse Siebens Terrace_Taloncs ?tZ?dZRS(Ncs;??|iidjo ?dSn?ti|SdS(Ni(s_sgamesgetStatesWasteTalonStacks canDealCards(s_((spysol.pys canDealCards?s (s__name__s __module__s canDealCards(((spysol.pys Terrace_Talon ?s sTerrace_AC_Foundationcs#?tZ?dZ?dZRS(Nc sK??t|dddddd?tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysAC_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.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_stackscards((spysol.pys acceptsCards?s%  (s__name__s __module__s__init__s acceptsCards(((spysol.pysTerrace_AC_Foundation?s  sTerrace_SS_Foundationcs#?tZ?dZ"?dZRS(Nc sK? ?t|dddddd!?tti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.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_stackscards((spysol.pys acceptsCards"?s%  (s__name__s __module__s__init__s acceptsCards(((spysol.pysTerrace_SS_Foundation?s  sTerrace_RowStackcsA*?tZ+?dZ.?dZ4?dddZB?dZRS(Nc sB+?,?t|dddd-?tti||||f|dS(Nsmodi smax_movei( s kwdefaultscapsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__+?scse.?/?|iidjo 0?dSn1?||iiijo 2?dSn3?ti|||SdS(Ni( s_sgamesgetStates from_stacksssreservess AC_RowStacks acceptsCardsscards(s_s from_stackscards((spysol.pys acceptsCards.?s   icst4?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(ss((spysol.pys??ssrowsssound(s_sgamesgetStatesstates AC_RowStacksmoveMovesncardssto_stacksframessshadows __debug__sss foundationssAssertionErrorswastescardssrankscaps base_ranksfiltersrowssfreerowsstalonsdealRows dealCards(s_sncardssto_stacksframessshadowsstatesfreerowsss((spysol.pysmoveMove4?s" '%% "csB?C?|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageB?s(s__name__s __module__s__init__s acceptsCardssmoveMovesgetBottomImage(((spysol.pysTerrace_RowStack*?s   sTerracecsD?tZE?eZF?eZG?eZH?eZ I?dZ J?ddddZ e?dZ j?dZ o?dZw?dZz?d Z|?d ZRS( Ni i ic 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\} } ]?xSt!dD]?]B}^?|i#i |i$| | |d|d_?| |i} qW`?|i| | |i f\} } a?xIt!|Da?]8}b?|ii |i%| | |c?| |i} qWd?|i&dS(NsXOFFSETii iiiis max_roundssnum_dealsswsses text_formats%Dssuit('sLayouts_ssslsmaxsrowssmaxrowssXSsw1sw2sYSsYOFFSETshssetSizesXMsYMsNones base_cardsxsys Terrace_Talons max_roundssnum_dealstalons createTexts WasteStackswastesReserveStack_ClasssstacksXOFFSETs CARD_XOFFSETsreservessappendsrangesis foundationssFoundation_ClasssRowStack_ClasssdefaultStackGroups(s_srowss max_roundssnum_dealsw1sislsssmaxrowsshsysxsstacksw2((spysol.pys createGameJ?s8$3 : $# ,# "csCe?f?x/|iiDf?]}g?|io h?dSnqWi?dSdS(Nii(s_sss foundationsscards(s_ss((spysol.pysgetStatee?s   csvj?k?|il?x9t|iDl?]%}m?|iiid|iiq#Wn?|iiid|ii d dS(Nsrowsi( s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessrows(s_si((spysol.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_state((spysol.pys fillStacko?s&&cs9w?x?x,|iiDx?]}y?|ii|i_qWdS(N(s_sss foundationssgamesloadinfos base_rankscap(s_sgamess((spysol.pys_restoreGameHookw?s cs#z?{?|iid|idS(Ns base_rank(s_sloadinfosaddattrspsload(s_sp((spysol.pys _loadGameHookz?scse|?}?t}~?x?|iiD~?].}?|io?|idi}?PnqW?|i|dS(Ni( sNO_RANKs base_ranks_sss foundationsscardssrankspsdump(s_spsss base_rank((spysol.pys _saveGameHook|?s    (s__name__s __module__sTerrace_AC_FoundationsFoundation_ClasssTerrace_RowStacksRowStack_Classs OpenStacksReserveStack_ClasssCautiousDefaultHints Hint_ClasssINITIAL_RESERVE_CARDSs createGamesgetStates startGames fillStacks_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysTerraceD?s           sGeneralsPatiencecs?tZ?eZ?dZRS(Ni (s__name__s __module__sTerrace_SS_FoundationsFoundation_ClasssINITIAL_RESERVE_CARDS(((spysol.pysGeneralsPatience?s  sBlondesAndBrunettescs,?tZ?dZ?dZ?dZRS(Ni cs??|i?x9t|iD?]%}?|iiid|iiq#W?|iii?|iii }?x)|ii D?]}?|i |i _qW?|iiid|ii d|if?|iiidS(Nsrowsi(s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessgetCardscs foundationssrankscaps base_rankssuits dealCards(s_sisssc((spysol.pys startGame?s  # -cs??dSdS(Ni((s_((spysol.pysgetState?s(s__name__s __module__sINITIAL_RESERVE_CARDSs startGamesgetState(((spysol.pysBlondesAndBrunettes?s   s FallingStarcs?tZ?dZRS(Ni (s__name__s __module__sINITIAL_RESERVE_CARDS(((spysol.pys FallingStar?s isQueen of ItalyisGeneral's PatienceisBlondes and Brunettesis Falling StarsPokerSquare_RowStackcs ?tZ?dZ?eZRS(NcsO??|i o'?|iiiid|?dSn?ti||SdS(Ni( s_scardssgamessstalons playMoveMoves ReserveStacks clickHandlersevent(s_sevent((spysol.pys clickHandler?s (s__name__s __module__s clickHandlersrightclickHandler(((spysol.pysPokerSquare_RowStack?s  s PokerSquarecs?tZ?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?]z}?xntdD?]]}?|i| ||i|i||if\}}?| ii|i|||q#Wq W?|i|if\}}?|i|||| _?|i | id|?| i!it"|?|i djo_?|ii#dg?xdddddfD?]i}?|i$| i|dd \}}}} ?t |i |d|d|} ?|ii(i| q5W?xytddD?]e}?|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_sbbsystxstysishsjslsssrstswstfsxsta((spysol.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_sevent((spysol.pys getAutoStacks?scs??|idjo ?dSn?d}?dgd}?xtdD?]}?|i|i|\}}?d|jo djno?||d||@d|iiii_ndS(Ns%D( s PokerSquares createGames_slssstalonstextssncardss text_format(s_sl((spysol.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( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappersPokerShuffle_RowStacksRowStack_Classs WIN_SCOREs createGames startGames checkForWin(((spysol.pys PokerShuffle7@s     is Poker Squareis Poker ShufflesDerKatzenschwanzcsVK@tZL@eedeZM@dddZm@dZu@dZx@dZ RS(Ns base_ranki ic 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@])}T@| idU@|i|i qWV@x>td|DV@])}W@| i|iX@|idqWY@|i | ||i d|i f\} } Z@xFt|DZ@]5}[@|iit| | |\@| |i } qZW]@|i | ||i d|i |i f\} } ^@|i|iddd | |i df_@xjt|D_@]Y}`@|i| | |} a@| | _b@|| _c@|ii| d@| |i } qWe@|i | |i |i f\} } f@xttdDf@]c}g@xGtdDg@]6}h@|iit| ||i | |d |qWi@| |i } qWj@|i|ii| |i ddd | 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_srowssreservess playcardssissuitslsyoffsetsssmaxrowssxsysstacksxoffset((spysol.pys createGameM@sJ$3  . 5-   &  464csm@n@|io@d}p@xp@|iiio|q@|iiiditjo,r@|ii|ios@|d}nnt@|iii d|ii|gddqWdS(Niiisrowssframesi( s_sstartDealSamplesissstalonscardssranksKINGsrowssdealRow(s_si((spysol.pys startGamem@s   csHu@v@|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchu@sc sx@y@tdf\}}z@x|Dz@]}{@|io ||j o5|@|idi|d|idi |d}n$~@|i|d|i |d}@||jo@||f\}}nq"W@|SdS(Niɚ;ii( sNonesclosestscdistsstackssstackscardss dragstacksxscxsyscysdist( s_scxscysstackss dragstacksdistsclosestscdistsstack((spysol.pys_getClosestStackx@s 5#( s__name__s __module__s StackWrappers AC_RowStacksNO_RANKsRowStack_Classs createGames startGamesshallHighlightMatchs_getClosestStack(((spysol.pysDerKatzenschwanzK@s   s DieSchlangecsA@tZ@eedeZ@eZ@dZ@dZ RS(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(Niiiisrowssframesi(s_sstartDealSamplesissstalonscardsscsranksACEs foundationsssuitsto_stacksKINGsrowssdealRow(s_scsisto_stack((spysol.pys startGame@s   &'( s__name__s __module__s StackWrappersFreeCell_AC_RowStacksNO_RANKsRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGame(((spysol.pys DieSchlange@s   isDer Katzenschwanzis Die SchlangesNapoleon_Taloncs@tZ@RS(N(s__name__s __module__(((spysol.pysNapoleon_Talon@s sNapoleon_Foundationcs@tZ@RS(N(s__name__s __module__(((spysol.pysNapoleon_Foundation@s sNapoleon_RowStackcs/@tZ@dZ@dZ@dZRS(Nc sH@@t|dddddd@tti||||f|dS(Nsmodi smax_moveis max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__@scs@@ti||| o @dSn@|i o @dSn@|id|df\}}@|i|ijo @dSn@|i|id|i i jp|i|id|i i jSdS(Niii( s OpenStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards@s    cs@@|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage@s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysNapoleon_RowStack@s   sNapoleon_ReserveStackcs@tZ@dZRS(Nc sB@@t|dddd@tti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__@s(s__name__s __module__s__init__(((spysol.pysNapoleon_ReserveStack@s sNapoleon_SingleFreeCellcs#@tZ@dZ@dZRS(Ncs@@ti|||SdS(N(s ReserveStacks acceptsCardss_s from_stackscards(s_s from_stackscards((spysol.pys acceptsCards@scsV@@|iiidio|iiidio @dSn@ti||SdS(Nii i(s_sgamesssrowsscardss ReserveStacks canMoveCards(s_scards((spysol.pys canMoveCards@s1 (s__name__s __module__s acceptsCardss canMoveCards(((spysol.pysNapoleon_SingleFreeCell@s  sNapoleon_FreeCellcs@tZ@dZRS(NcsF@@|iii|idio @dSn@ti||SdS(Nii(s_sgamesssrowssidscardss ReserveStacks canMoveCards(s_scards((spysol.pys canMoveCards@s! (s__name__s __module__s canMoveCards(((spysol.pysNapoleon_FreeCell@s sDerKleineNapoleoncsJ@tZ@ddZ@dZ@dZ@dZ@dZRS(Nic s@@t||if\}}@|i|iddd|id|i|id|id|i@|idd|i} @| |i|i} @| |i|i}@|i}@xet dD@]T}@|iit| ||@|iit|||@||i}qW@|i|i}@|djoa@|iit| ||@|iit|||@|iit| ||n@|iit| |i||@|iit||i||@|iit| ||@|iit|||@| |if\}}@xIt dD@]8}@|iit||||@||i}qdW@|djo@|i|i}n@|i|i}@t||||_@x~|iD@]p}@|id@djo&@d|i gdd g|_n"@d|igddg|_@d|_qW@|i dS( Niii iiiii i(!sLayouts_ssslssetSizesXMsXSsYMsYSsx0sx1sx2sysrangesisrowssappendsNapoleon_RowStacksheightsreservessNapoleon_ReserveStacksNapoleon_SingleFreeCellsNapoleon_FreeCellsxs foundationssNapoleon_FoundationsNapoleon_Talonstalonsrsids CARD_XOFFSETs CARD_YOFFSETsdefaultStackGroups( s_sreservessrsislsx2sssxsysx0sx1((spysol.pys createGame@sHM  #&& " &!cs0@@|di}@|i||dSdS(Nics@|i|j|ifS(N(scsrankssuit(scsrank((spysol.pys@s(scardssranks_s_shuffleHookMoveToBottom(s_scardssrank((spysol.pys _shuffleHook@scs@@x@tdD@]/}@|iiid|iid ddqW@|i@|iiid|iid @x:tdD@])}@|iiid|iidqW@|iiidddS(Nisrowsisframesisncards( srangesis_ssstalonsdealRowsrowssstartDealSamples dealBaseCards(s_si((spysol.pys startGame@s - # 'csP@@|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch@scs@@|idjp |ii o @dSn@d}@|iid}@|iol@t |idi }@|i }@|djo@|d}n"@|djo@|d}nn@|iii d|dS(Nisis Ascendingis Descendingstext(s_spreviewstextssinfostsss foundationssfscardssRANKSsranksgetFoundationDirsdirsconfig(s_sdirstsf((spysol.pys updateText@s!   (s__name__s __module__s createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pysDerKleineNapoleon@s %   sDerFreieNapoleoncs@tZ@ddZRS(NicsM@@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}AxMtdDA]<}A| i || i } A| iit| ||qWAxJtdDA]9} A||| i }  A| iit| ||q/W A|i| id|| i dddf A| i } A|djo.A| iit|| i d||nFA| iit|||A| iit|| i ||A| i d| i } AxItd DA]8} A| iit| ||| A| | i } qRWA| i| id d \}}}} At"d d | i#}At%|i&|| i |d|d||i'_(A| i |i)| if\} }At*| ||| _+A| i,dS(Niiiii iii?Biisses canvas_cardscardwsanchorsfont(-sLayouts_ssslsCHsYOFFSETshsYSsmaxssetSizesXMsXSsYMsx1sysrangesjsxsrowssappendsNapoleon_RowStacksNapoleon_ReserveStacks setRegionsreservessNapoleon_SingleFreeCellsNapoleon_FreeCellsis foundationssNapoleon_Foundations getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosheightsNapoleon_TalonstalonsdefaultStackGroups(s_sreservessysx1sfontstxstyshsjslsistfsxsssta((spysol.pys createGame@s># 3" # #- .& "(1"(s__name__s __module__s createGame(((spysol.pysDerFreieNapoleon@s sNapoleoncsAtZAdZRS(NcsAAti|dddS(Nsreservesi(sDerKleineNapoleons createGames_(s_((spysol.pys createGameAs(s__name__s __module__s createGame(((spysol.pysNapoleonAs s FreeNapoleoncsAtZ AdZRS(Ncs A!Ati|dddS(Nsreservesi(sDerFreieNapoleons createGames_(s_((spysol.pys createGame As(s__name__s __module__s createGame(((spysol.pys FreeNapoleonAs isDer kleine NapoleonisDer freie Napoleoniis Free NapoleonsLarasGame_Hintcs*AtZ+ARS(N(s__name__s __module__(((spysol.pysLarasGame_Hint*As sLarasGame_TaloncsG,AtZ-AeddddZ6AddddZOAddZRS(Niiics-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_statestemp((spysol.pysdealRow-As(,cs6A7At|idjo 8AdSn9AxG|D9A]<}: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|nq1WNAt|SdS(Niisframesi(slens_scardssstackssrs __debug__sgetCardsface_upsAssertionErrorsflipsgamesflipMovesmoveMovesframessranksidssswastesACEsJACKsQUEENsKING(s_sstackssflipsreversesframessr((spysol.pys dealToStacks6As2   "  , (,E 0c s!OAPAd}QA|iii}RA|ioSA|ii}TAxt |ii DTA]u}UAt |iii |idjoIVA|iid|iii ||iii|iiddddnqSWWA|ii|XA|iid||iii dddddYAt |iii|id}ZAxtt t |iii|iDZA]M}[A|iid|iii||iii ||dddddq]W\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_ssoundsiswastes curr_ranks num_cardss res_begin((spysol.pys dealCardsOAs&   &M2#& K  (s__name__s __module__sNonesdealRows dealToStackss dealCards(((spysol.pysLarasGame_Talon,As  sLarasGame_RowStackcsaAtZbAdZRS(Nc s5bAcAtti||||f|dAd|_dS(Ni( sapplys OpenStacks__init__s_sxsysgamescaps CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__bAs"(s__name__s __module__s__init__(((spysol.pysLarasGame_RowStackaAs sLarasGame_ReserveStackcseAtZfARS(N(s__name__s __module__(((spysol.pysLarasGame_ReserveStackeAs s LarasGamecsgAtZhAeZiAdZjAdZAdZAdZAdZAddZ AdZ Ad Z Add Z Ad Z Ad ZAd ZRS(Nic sjAkAt|dd|if\}}lA|i|i|i|id|id|i mAd|_ nA|i|i}oA|i|i }pAxt dDpA]}qA|iit|||ddrA||i}sA|d jp |d jo'tA|i|i}uA||i }nqWvA|i}wA|i}xAxUt d DxA]D}yA|iit||||d d d tzA||i }qMW{A|i|i|i}|A|i}}AxIt d D}A]8}~A|iit||||A||i}qWAxt dDA]}A|i|id||i f\}}AxMt |idDA]5}A|iit|||A||i}qgWqWA|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 sdiris base_rankiis max_roundssse( sLayouts_ssslssetSizesXMs NUMRESERVESsXSsYMsYSsold_ranksxsysrangesisrowssappendsLarasGame_RowStacks foundationssSS_FoundationStacksKINGsreservessLarasGame_ReserveStacksLarasGame_Talonstalons createTexts WasteStackswastessgs openstackss talonstackss dropstacks(s_sislsssysx((spysol.pys createGamejAsP$6  %   .  " * csAAd}AxvtdDA]e}A|iii oAPnA|djoA|iAd}nA|iiid|qWA|i t |ii i|ii |iidddS(Niiisframes( sframessrangesis_ssstalonscardssstartDealSamplesdealRowsmoveMoveslenswaste(s_sframessi((spysol.pys startGameAs    csHAA|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchAscsAAfSdS(N((s_((spysol.pysgetHighlightPilesStacksAsicsAAdSdS(Ni((s_ssound((spysol.pys _autoDealAscsAAdSdS(Ni((s_((spysol.pyscanUndoAscsAAdSdS(Ni((s_((spysol.pys canSaveGameAscsAA|idS(N(s_snotYetImplemented(s_sfilenamesbinmode((spysol.pyssaveGameAscsAA|ii|_dS(N(sgamesloadinfosold_ranks_(s_sgame((spysol.pys_restoreGameHookAscs2AA|iiddA|i|i_dS(Nsold_ranki(s_sloadinfosaddattrspsloadsold_rank(s_sp((spysol.pys _loadGameHookAscsAA|i|idS(N(spsdumps_sold_rank(s_sp((spysol.pys _saveGameHookAs(s__name__s __module__sLarasGame_Hints Hint_Classs NUMRESERVESs createGames startGamesshallHighlightMatchsgetHighlightPilesStackss _autoDealscanUndos canSaveGamessaveGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys LarasGamegAs    $      i%s Lara's GamesSanibelcswAtZAeiZAeeddZAeeddZ Ae Z Ae Z AdZAdZAdZRS(Ns max_roundsismax_moveics)AAti|dddddddS(Nsrowsi swasteis playcardsi(sGypsys createGames_(s_((spysol.pys createGameAscsAAx6tdDA]%}A|iiiddddqWAx0tdDA]}A|iiiddqOWA|iA|iiiA|iiidS(Nisflipisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGameAs #  csAAfSdS(N((s_((spysol.pysgetHighlightPilesStacksAs(s__name__s __module__sLayoutsklondikeLayouts Layout_Methods StackWrappersWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssYukon_AC_RowStacksRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStacks(((spysol.pysSanibelAs      isFlower_FoundationStackcs/AtZAdZAdZAdZRS(Nc sKAAt|dddddtAtti|||||f|dS(Ns max_cardsi smax_moveis base_rank( s kwdefaultscapsANY_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__Ascs AAxtt|dDA]}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_sssasbsi((spysol.pysisOonsooSequenceAs " ''csAA|i|if\}}A|djo |djp|djo |djoAddf\}}nEA|djo |djp|djo |djo Ad}nA||fSdS(Niiii(scardassuitscardbsasb(s_scardascardbsasb((spysol.pysswapTrashCardsAs 77 (s__name__s __module__s__init__sisOonsooSequencesswapTrashCards(((spysol.pysFlower_FoundationStackAs   sFlowerClock_FoundationcsAtZAdZRS(NcsAA|i|| o AdSnA|i}A| oA|didjSnA|di|dij o AdSnA|di}A|di}A|djo Ad}nA|d|jSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksisj(s_s from_stackscardssisjs stackcards((spysol.pys acceptsCardsAs     (s__name__s __module__s acceptsCards(((spysol.pysFlowerClock_FoundationAs sGaji_Foundationcs#AtZAdZAdZRS(Nc sDAAtti|||||f|A|ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__As%cssAA|i|| o AdSnA|i}A|di|dijo |didd|dijSdS(Niiii (s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsAs  (s__name__s __module__s__init__s acceptsCards(((spysol.pysGaji_FoundationAs  sPagoda_FoundationcsAtZAdZRS(NcsVAA|i|| o AdSnA|i}A| o/A|didjo|di|ijSnA|di|dij o AdSnA|di}A|di}A|djo Ad}nAt |djoB||djSnVBt |djo2B|djo Bd}nB||djSnB||jSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsisjslen(s_s from_stackscardssisjs stackcards((spysol.pys acceptsCardsAs$   /   (s__name__s __module__s acceptsCards(((spysol.pysPagoda_FoundationAs sSamuri_Foundationcs/BtZBdZ BdZBdZRS(Nc sEB Btti|||||f| B|ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__Bs%cs B B|i|| o  BdSnB|i}B| o/B|didjo|di|ijSnB|di}B|djo Bd}nB|di|dijo|di|djSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsi(s_s from_stackscardssis stackcards((spysol.pys acceptsCards Bs   / csBB|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImageBs(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysSamuri_FoundationBs   sMatsuKiri_Foundationcs/BtZBdZBdZ%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_sxsysgamessuitscap((spysol.pys__init__Bs%csBB|i|| o BdSnB|i} B|i| o !BdSn"B| o,#B|didjo|didjSn$B|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs    ,cs %B&B|iiiidSdS(Ni(s_sgamesappsimagess getLetter(s_((spysol.pysgetBottomImage%Bs(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysMatsuKiri_FoundationBs   sGreatWall_Foundationcs#'BtZ(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_sxsysgamessuitscap((spysol.pys__init__(Bs%cs,B-B|i|| o .BdSn/B|i}0B|didjo 1BdSn2BxDtdD2B]3}3B||i|i ddjo 4BdSnqcW5Bt |ddSdS(Nii iisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssranksrangesissuitsidsisRankSequence(s_s from_stackscardssis stackcards((spysol.pys acceptsCards,Bs    "(s__name__s __module__s__init__s acceptsCards(((spysol.pysGreatWall_Foundation'Bs  sGreatWall_BuildStackcs#6BtZ7BdZ;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_sxsysgamessuitscap((spysol.pys__init__7Bs%cs;BB|i}?B|o1@B|di|didjo ABdSnn#BB|didjo CBdSnDBx:|DDB]/}EB|i|iddjo FBdSnqWGBt |ddSdS(Niiiisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssrankscssuitsidsisRankSequence(s_s from_stackscardsscs stackcards((spysol.pys acceptsCards;Bs   "  (s__name__s __module__s__init__s acceptsCards(((spysol.pysGreatWall_BuildStack6Bs  sFourWinds_FoundationcsHBtZIBdZRS(NcsIBJB|i|| o KBdSnLB|i}MB|di|ijo NBdSnOB| oPB|didjSn RB|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsIBs    (s__name__s __module__s acceptsCards(((spysol.pysFourWinds_FoundationHBs sFlower_OpenStackcs/SBtZTBdZXBdZeBdZRS(Nc sNTBUBt|ddddVBtti||||f|WB||_ dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscap((spysol.pys__init__TBs"csXBYBxtt|dDYB]}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_sssasbsi((spysol.pysisOonsooSequenceXBs " ''cseBfB|i|if\}}gB|djo |djp|djo |djohBddf\}}nEiB|djo |djp|djo |djo jBd}nkB||fSdS(Niiiii(scardassuitscardbsasb(s_scardascardbsasb((spysol.pysswapTrashCardseBs 77 (s__name__s __module__s__init__sisOonsooSequencesswapTrashCards(((spysol.pysFlower_OpenStackSBs   sFlowerClock_RowStackcslBtZmBdZRS(NcsnmBnB|i|| o oBdSnpB|i}qB| o rBdSnsB|didd|dijSdS(Niiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuit(s_s from_stackscardss stackcards((spysol.pys acceptsCardsmBs     (s__name__s __module__s acceptsCards(((spysol.pysFlowerClock_RowStacklBs s Gaji_RowStackcstBtZuBdZRS(NcsuBvB|i|| o wBdSnxB|i}yB| o zBdSn{B|didjo|didjp%|didjo|didjo }BdSn*~B|di|dijo BdSnB|i|d|d\}}B|d|jSdS(Niii i( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardssasbs stackcards((spysol.pys acceptsCardsuBs    S  #(s__name__s __module__s acceptsCards(((spysol.pys Gaji_RowStacktBs sMatsukiri_RowStackcsBtZBdZRS(NcsvBB|i|| o BdSnB|i}B| oB|didjSnB|i|d|dgSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisOonsooSequence(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs    (s__name__s __module__s acceptsCards(((spysol.pysMatsukiri_RowStackBs sOonsoo_RowStackcsBtZBdZRS(NcsBB|i|| o BdSnB|i}B|i| o BdSnB| oB|didjSnB|di|dijo BdSnB|i|d|dgSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs     (s__name__s __module__s acceptsCards(((spysol.pysOonsoo_RowStackBs sSamuri_RowStackcsBtZBdZRS(NcsBB|i|| o BdSnB|i}B| oB|didjSnB|di}B|djo Bd}nB|di|dijo|di|djSdS(Niiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisrank(s_s from_stackscardssis stackcards((spysol.pys acceptsCardsBs    (s__name__s __module__s acceptsCards(((spysol.pysSamuri_RowStackBs sGreatWall_RowStackcsBtZBdZRS(NcsBB|i|| o BdSnB|i}B| oB|didjSnB|di|dijo'B|didd|dijSnB|i|d|d\}}B|d|jSdS(Niiii ( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardssasbs stackcards((spysol.pys acceptsCardsBs   '#(s__name__s __module__s acceptsCards(((spysol.pysGreatWall_RowStackBs sFourWinds_RowStackcs#BtZBdZBdZRS(NcsBB|i|| o BdSnB|i}B| o BdSnB|di|dijo|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs     csBB|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageBs(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysFourWinds_RowStackBs  sAbstractFlowerGamec sDBtZBddddddddd 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_sstack1scard1sstack2scard2sasb((spysol.pysshallHighlightMatchBs   (s__name__s __module__sSUITSsshallHighlightMatch(((spysol.pysAbstractFlowerGameBs -s FlowerClockcsJBtZBdZBdZBdZBdZBedZRS(Nc sBBt||if\}}Btdd|i} B|i|i|i d|i |i dBddddddd d d d d df } Bd d dddddddd d df }B|i|i d}B|id}BxtdDB]}B|| ||i } B||||i }B|iit| ||tBt|i| |id||i Bddd| Bd|i|} qWBxtdDB]}B|i|i |i |df\}}Bx\tdDB]K}B|iit|||d|idBddB||i }qWqWB|i |idd|i ddfBt!|i"|i |i#|i ||_$B|i%dS(Ns canvas_cardscardwf10.5f5.5iif2.5iiif-2.5f0.25f0.75f1.8999999999999999if3.5f3.75ii sanchorscentersfontstextf2.7000000000000002isyoffsets max_cardsii?B(&sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxoffsetsyoffsetsxsCHsysrangesisx0sy0s foundationssappendsFlowerClock_FoundationsANY_SUITs MfxCanvasTextscanvassSUITSstsjsrowssFlowerClock_RowStacks setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups( s_sisjslsyoffsetsssy0sysxsfontsx0sxoffsetst((spysol.pys createGameBs4/-- "$ * %),csBBto#t|iiidjptBx0tdDB]}B|iii ddq@WB|i B|iii Bto#t|iiidjptdS(Ni0isframesi( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSample(s_si((spysol.pys startGameBs-  cswBBxc|iiDB]R}Bt|idjo BdSnB|idi|ijo BdSnqWBdSdS(Niii(s_sss foundationssislenscardssranksid(s_si((spysol.pys isGameWonBs  csBBdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchBscsYBB|tjo B|iif|iifSn#B|ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksBs (s__name__s __module__s createGames startGames isGameWonsshallHighlightMatchsNones getAutoStacks(((spysol.pys FlowerClockBs     sGajics;BtZBdZCdZ 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\tdDB]K}B|ii t|||d |idBd dB||i}qWB|i|i|i|idd d |i|iddd fB|d}C|i i t |||dC||id}C|i i t |||dCt|i|i|i|i||_C|idS(Nii iiii iisyoffsets max_cardsi ii?Bii(sLayouts_ssslssetSizesXMsXSsYMsYSsxsys foundationssappendsGaji_Foundationsrangesisrowss Gaji_RowStacksCHs setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups(s_sislsssysx((spysol.pys createGameBs(7  "" %F "",csCCttttg}Cxp|DC]d}C||i oL C|idjo |idj o$ C|||i< C|i|nnq#W C||SdS(Ni i(sNonestopcardsscardsscssuitsranksremove(s_scardsscstopcards((spysol.pys _shuffleHookCs $c s CCto#t|iiidjptCx0tdDC]}C|iii ddq@WC|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( Ni0isframesisrowsiiiiii(s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrowssrs foundations(s_sisr((spysol.pys startGame Cs-  C5'5csTCC||iijo7C|io|idi oC|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackCs(s__name__s __module__s createGames _shuffleHooks startGames fillStack(((spysol.pysGajiBs    sOonsoocs;CtZCdZ0CdZ5CdZcsTC|io|idi o?C|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackcsCC|idjo DdSnDxtdDD]}D|djo0Dt|ii|iddf\}}n)Dt|ii|idf\}}D|djo Dd}nD||jo  Dd}n D|i |i d t |q1WdS( Niiii iissFullstext( s_spreviewsrangesislensss foundationsscardsstsfsfoundation_textssconfigsstr(s_stsfsi((spysol.pys updateTextCs  0(  cs D Dto't|iiiddjpt D|iDx6tdDD]%}D|iii ddddqQWD|i D|iii Dto#t|iiidjptdS(Ni0iisflipisframes( s __debug__slens_ssstalonscardssAssertionErrors updateTextsrangesisdealRowsstartDealSample(s_si((spysol.pys startGame Ds1  # csTDD||iijo7D|io|idi oD|i|nndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackDscsPDD|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchDs(s__name__s __module__s createGames updateTexts startGames fillStacksshallHighlightMatch(((spysol.pys GreatWallCs  3  s FourWindscs;DtZDdZD|i?D|iiidS(Ni0( s __debug__slens_ssstalonscardssAssertionErrorsstartDealSamples dealCards(s_((spysol.pys startGameDs(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookDscs]DD|iDxCtt|iDD])}D|iiid|ii d q)WdS(Nsrowsi( s_sstartDealSamplesrangeslenscardssissstalonsdealRowsrows(s_si((spysol.pys startGameDs  cs0DDt|iidit|ijSdS(Ni(slens_sssrowsscards(s_((spysol.pys isGameWonDs(s__name__s __module__sHanoiPuzzle_RowStacksRowStack_Classs _shuffleHooks startGames isGameWon(((spysol.pys HanoiPuzzle4Ds    s HanoiPuzzle5csDtZDRS(N(s__name__s __module__(((spysol.pys HanoiPuzzle5Ds s HanoiPuzzle6csDtZDRS(N(s__name__s __module__(((spysol.pys HanoiPuzzle6Ds i|sTower of HanoyssuitsisHanoi Puzzle 4srules_filenameshanoipuzzle.htmlisHanoi Puzzle 5isHanoi Puzzle 6sHexADeck_FoundationStackcsDtZDdZRS(Nc sEDDt|ddddDtti|||||f|dS(Nsmax_moveis max_cardsi ( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__Ds(s__name__s __module__s__init__(((spysol.pysHexADeck_FoundationStackDs sHexATrump_FoundationcsDtZDdZRS(NcsxDD|i|| o DdSnDxB|iiid DD]*}Dt|idjo DdSnq<WDdSdS(Niiii(s_sbasicAcceptsCardss from_stackscardssgamesss foundationsslen(s_s from_stackscardsss((spysol.pys acceptsCardsDs  (s__name__s __module__s acceptsCards(((spysol.pysHexATrump_FoundationDs sHexADeck_OpenStackcsDtZDdZRS(Nc sHDDt|ddDtti||||f|D||_ dS(Nsmax_movei?B( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscap((spysol.pys__init__Ds"(s__name__s __module__s__init__(((spysol.pysHexADeck_OpenStackDs s Bits_RowStackcsDtZDdZRS(NcsDD|i|| o DdSnD|i}D|p|didjo DdSnD|id}DxA|ii i |d|i!DD]}D|i o DdSnqWD|ii i |idi d|id?d|di ddjSdS(Niiiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardssisrs stackcards((spysol.pys acceptsCardsDs   ! (s__name__s __module__s acceptsCards(((spysol.pys Bits_RowStackDs sBytes_RowStackcsDtZDdZRS(NcsDD|i|| o DdSnD|i}D|p|didjo DdSnD|id}D|d}DxE|ii i d|d|i!DD]}D|i o DdSnqWD|ii i |idi |di jSdS(Niiiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardssisrsids stackcards((spysol.pys acceptsCardsDs    % (s__name__s __module__s acceptsCards(((spysol.pysBytes_RowStackDs sHexAKlon_RowStackcsDtZDdZRS(NcsgDDti|||o DdSnD|i}D| p%|didjp|didjSdS(Niiii(s AC_RowStacks acceptsCardss_s from_stackscardss stackcardsssuit(s_s from_stackscardss stackcards((spysol.pys acceptsCardsDs  (s__name__s __module__s acceptsCards(((spysol.pysHexAKlon_RowStackDs s BitsNBytescsPDtZDdZDdZDdZEdZ EdZEdZRS(Nics7DDt||if\}}Dtdd|i}D|i|id|i d|i |i dD|i }Dxt dDD]}D|id|i d}Dxat dDD]P}D|iit|||ddDddd |d d D||i }qWD||i }qWD|i }Dxt dDD]}D|id |i d }Dxat d DD]P}D|iit|||ddDddd td d D||i }qwWD||i }qCWD|id |i }D|i }Dx^t dDD]M}D|iit||||ddDd d ddD||i }qWD|i|id d ddfD|i}D|i }Dt|||dd dd |_D|i|idD||i |i d }Dt||||_D|i|idD|idS(Ns canvas_cardscardwiiis max_cardsis max_accepts base_suitsmax_moveiiismodi?Bsnum_deals max_roundssss(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsysrangesjsxsisrowssappends Bits_RowStacksBytes_RowStacksANY_SUITs foundationssSS_FoundationStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjslsssysxsfont((spysol.pys createGameDsN3        !"  $csDDtgdtgdf\}}Dx|DD]}D|idj oD||i oDd}Dx;tdDD]*}D|i ||jo Dd}nqyWD| o7D|||i<D|i ||i<E|i |nnnq1WE||}E|i E|SdS(Niii( sNonestopcardssranksscardsscssuitshaveranksrangesisranksremovesreverse(s_scardssranksshaveranksistopcardssc((spysol.pys _shuffleHookDs"#       cssEEto#t|iiidjptE|iE|iiid|ii E|iii dS(NiDsrows( s __debug__slens_ssstalonscardssAssertionErrorsstartDealSamplesdealRows foundationss dealCards(s_((spysol.pys startGameEs- csD E Ex0|iiD E]} E|i o  EdSnqW EdSdS(Nii(s_sssrowsscards(s_ss((spysol.pys isGameWon Es  csEEdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchEs(s__name__s __module__s GAME_VERSIONs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(((spysol.pys BitsNBytesDs   #   sHexAKloncs8EtZEeZEdZ-EdZ4EdZRS(Ncs{EEt||if\}}Etdd|i}E|i|i|i d|i |i dE|i}E|i }Et|||dddd|_E|i|id E||i }Et||||_E|i|id E|i|i d }Ex^td DE]M}E|iit||||d d  Edd dd !E||i }qW"E|iit|||d d d #Edddd $E|i}%E|i d |i }&ExjtdD&E]Y}'E|iit|||dd(Edddt)Edddd*E||i }qW+E|i|id||i dddf,E|idS(Ns canvas_cardscardwiisnum_dealis max_roundsisssiismodismax_moves max_cardsiics max_accepts base_suits base_rankiii?B(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsSS_FoundationStacksHexATrump_FoundationsrowssHexAKlon_RowStacksANY_SUITs setRegionsdefaultStackGroups(s_sislsssxsysfont((spysol.pys createGameEs8/  $ !!  -cs-E.Eto#t|iiidjpt/ExVtt|iiD/E]9}0E|iii d|ii|dddddqLW1E|i 2E|iii 3E|iii dS(NiDsrowsisflipisframes( s __debug__slens_ssstalonscardssAssertionErrorsrangesrowssisdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame-Es- 7 cs4E5EdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4Es(s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysHexAKlonEs    is Bits n Bytesstrumpsis Hex A KlonsMemory_RowStackcsSE|i}?Et|idjp|idio @EdSnAE|itjo3BE|idddCE|iDE||_naFEt o4t|iidjo|iidipt GE|id|iidf\}}HE|iIE|ii ||oJE|id|inLE|idddME|id|_NE|id|iidOE|iPE|iiQE|idRE|iiSE|iiTE|id UE|iVEt|_WE|iiXEdSdS( Niisflipspriorityiismovesf0.5f0.20000000000000001(s_sgameslenscardssface_ups other_stacksNones playSamplesflipMoves __debug__sAssertionErrorsc1sc2s cardsMatchs _dropPairMovesscores updateStatussmovessindexs updateTextscanvassupdate_idletasksssleeps finishMove(s_seventsgamesc2sc1((spysol.pys clickHandler=Es2 *  >&    icsOYEZE|i}[E|iddd\E|id|_]E|id|_dS(Nsdroppairspriorityiii(s_sgames playSamples closed_cardssscore(s_sns other_stacksframessshadowsgame((spysol.pys _dropPairMoveYEs cs`EaEdSdS(Ni((s_sevent((spysol.pyscontrolclickHandler`EscsbEcEdSdS(Ni((s_sevent((spysol.pysshiftclickHandlerbEs(s__name__s __module__s clickHandlers _dropPairMovesrightclickHandlersdoubleclickHandlerscontrolclickHandlersshiftclickHandler(((spysol.pysMemory_RowStackEsiii'i'(s_sgamesfiltersssrowssstacksstsSTEPSsdxsdysmapsgetspossrscardss acceptsCardssapps miscrandomsrandintsscoresaddHint(s_sgamesrstsdxsdysscoresstacks((spysol.pys computeHintsEs   1- (s__name__s __module__s computeHints(((spysol.pys Pegged_HintEs sPegged_RowStackcsMEtZFdZFdZFdddZFdZFdZRS(NcsBFFti||| o FdSnF|i|tj SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardss_getMiddleStacksNone(s_s from_stackscards((spysol.pys acceptsCardsFs csFFtdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCardsFsicsFF|i|}F|ii|ii} F|iii d} F|ii |||dd F|ii ddd F|ii |||ddd| F|ii|F|iF|idS(Nisframessdropspriorityiisshadow(sto_stacks_getMiddleStacks_s other_stacksgames enterStatesS_FILLs old_statesss foundationssfsmoveMovesncardss playSamplesshadows leaveStates fillStack(s_sncardssto_stacksframessshadows other_stacksfs old_state((spysol.pysmoveMoveFs% csFF|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_stacksssdxsdy((spysol.pys_getMiddleStackFs9  < cs)FFti||F|i|_dS(N(s ReserveStacks copyModels_sclonespos(s_sclone((spysol.pys copyModelFs(s__name__s __module__s acceptsCardss canDropCardssmoveMoves_getMiddleStacks copyModel(((spysol.pysPegged_RowStackEs    sPeggedcsFtZFeZFddfddfddfddffZFdddddddfZFdZ 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_srowssn((spysol.pys startGameOFsii(sGames getWinStatuss_swonsstatussupdatedsfiltersgamesssrowssstackss __debug__slensAssertionErrorsidsEMPTY_STACK_IDsU_WON(s_sstatussupdatedswonsstacks((spysol.pys getWinStatusLFs$c sTFUFg}VFx|iiDVF]}WF|i o XFqnYF|i\}}ZFx|iDZF]\}}[F|i i ||||f}\F|o|i oW]F|i i ||d||df}^F|o|io_F|i|nnq\WqW`F|dffSdS(Nii(srowss_sssrscardsspossrxsrysSTEPSsdxsdysmapsgetsmsappend( s_smsssrsdxsdysrowssrxsry((spysol.pysgetHighlightPilesStacksTFs    #+ (s__name__s __module__s Pegged_Hints Hint_ClasssSTEPSsROWSsEMPTY_STACK_IDs createGames startGames isGameWonsNones getAutoStackss getWinStatussgetHighlightPilesStacks(((spysol.pysPeggedFs  -    s PeggedCross1cs)aFtZbFdddddddfZRS(Nii(s__name__s __module__sROWS(((spysol.pys PeggedCross1aFs s PeggedCross2c s/cFtZdFdddddddddf ZRS(Nii (s__name__s __module__sROWS(((spysol.pys PeggedCross2cFs s Pegged6x6cs/eFtZfFdZgFddddddfZRS(Nii(s__name__s __module__sEMPTY_STACK_IDsROWS(((spysol.pys Pegged6x6eFs  s Pegged7x7cs)hFtZiFdddddddfZRS(Ni(s__name__s __module__sROWS(((spysol.pys Pegged7x7hFs sPeggedTriangle1cskjFtZkFddfddfddfddfddfddffZlFdddddfZmFdZRS( Niiiiiiii(s__name__s __module__sSTEPSsROWSsEMPTY_STACK_ID(((spysol.pysPeggedTriangle1jFs ?sPeggedTriangle2cs&nFtZoFddddddfZRS(Niiiiii(s__name__s __module__sROWS(((spysol.pysPeggedTriangle2nFs c spFqFd}rFx!|iDrF]}sF||}qWtFt|||uFtiddvFdh|d<wFdd}xFt |yF|SdS(Niissisncardssrules_filenames pegged.html( s si_ncardss gameclasssROWSsnsGameInfosidsnamesGIsGT_PUZZLE_TYPEsgis registerGame(sids gameclasssnames si_ncardssgisn((spysol.pysrpFs   iisPegged Cross 1isPegged Cross 2is Pegged 6x6is Pegged 7x7isPegged Triangle 1isPegged Triangle 2s Wicked_TaloncsFtZFRS(N(s__name__s __module__(((spysol.pys Wicked_TalonFs sImperialTrump_FoundationcsFtZFdZRS(NcsVFFti||| o FdSnF|dit|iii dijSdS(Niii( sSS_FoundationStacks acceptsCardss_s from_stackscardssrankslensgamesss foundations(s_s from_stackscards((spysol.pys acceptsCardsFs (s__name__s __module__s acceptsCards(((spysol.pysImperialTrump_FoundationFs sPonytail_FoundationcsFtZFRS(N(s__name__s __module__(((spysol.pysPonytail_FoundationFs sTarock_OpenStackcsFtZFddZRS(Nic stFFt|ddddFtti||||f|F|djoF|i i i }nF||_ dS(Nsmax_movei?Bs max_accepti( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsetsappsimagess CARD_YOFFSET(s_sxsysgamesyoffsetscap((spysol.pys__init__Fs "(s__name__s __module__s__init__(((spysol.pysTarock_OpenStackFs sTarock_AC_RowStackcsFtZFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|di|ididjo FdSnXF|didjp|ididjo FdSnF|di|idijSdS(Niiii(s_sbasicAcceptsCardss from_stackscardssrankscolor(s_s from_stackscards((spysol.pys acceptsCardsFs  % . (s__name__s __module__s acceptsCards(((spysol.pysTarock_AC_RowStackFs s Skiz_RowStackcsFtZFdZRS(NcsFF|i|| o FdSnF|i o|F|dit|iiijo+F|di t|iii djSn(F|di t|iii djSnF|idi|dijo|idi d|di jSdS(Niii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitssrankstrumpssranks(s_s from_stackscards((spysol.pys acceptsCardsFs &++(s__name__s __module__s acceptsCards(((spysol.pys Skiz_RowStackFs sPagat_RowStackcsFtZFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|idi|dijo|idid|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardsssuitsrank(s_s from_stackscards((spysol.pys acceptsCardsFs   (s__name__s __module__s acceptsCards(((spysol.pysPagat_RowStackFs sTrumpWild_RowStackcsFtZFdZRS(Ncs:FF|i|| o FdSnF|i o|F|dit|iiijo+F|di t|iii djSn(F|di t|iii djSnF|di |idi djo FdSnXF|di djp|idi djo FdSnF|di |idi jSdS(Niiii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitssrankstrumpssranksscolor(s_s from_stackscards((spysol.pys acceptsCardsFs &++% . (s__name__s __module__s acceptsCards(((spysol.pysTrumpWild_RowStackFs sTrumpOnly_RowStackcs#FtZFdZFdZRS(NcsFF|i|| o FdSnF|i o'F|dit|iiijSnF|di djo|di |idi djSdS(Niiii( s_sbasicAcceptsCardss from_stackscardsssuitslensgamesgameinfossuitsscolorsrank(s_s from_stackscards((spysol.pys acceptsCardsFs  'csFF|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageFs(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysTrumpOnly_RowStackFs  sExcuse_RowStackcsFtZFdZRS(NcsdFF|i|| o FdSnF|i o FdSnF|di|ididjSdS(Niii(s_sbasicAcceptsCardss from_stackscardssrank(s_s from_stackscards((spysol.pys acceptsCardsFs   (s__name__s __module__s acceptsCards(((spysol.pysExcuse_RowStackFs sWheelOfFortune_RowStackcs#FtZFdZFdZRS(NcsFF|i|| o FdSnF|i o FdSnF|di|idijo|di|ididjSdS(Niii(s_sbasicAcceptsCardss from_stackscardsssuitsrank(s_s from_stackscards((spysol.pys acceptsCardsFs   csFF|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageFs(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysWheelOfFortune_RowStackFs  sPonytail_PonytailStackcsFtZFRS(N(s__name__s __module__(((spysol.pysPonytail_PonytailStackFs sPonytail_RowStackcsFtZFRS(N(s__name__s __module__(((spysol.pysPonytail_RowStackFs sPonytail_ReserveStackcsFtZFRS(N(s__name__s __module__(((spysol.pysPonytail_ReserveStackFs sCavalier_RowStackcs#FtZFdZFdZRS(NcsIFFti||| o FdSnF|ipt|djSdS(Nii(sTarock_AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCardsFs csFFxtt|dDF]}F||idj o1F||i||dijo FdSnnF||id||dijo FdSnqWFdSdS(Niii(srangeslenscardssissuitscolorsrank(s_scardssi((spysol.pys canMoveCardsFs "&(s__name__s __module__s acceptsCardss canMoveCards(((spysol.pysCavalier_RowStackFs  sNasty_RowStackcsFtZFdZRS(NcsFF|i|| o FdSnF|ioDF|di|ididjo|di|idijSnF|didd|didjjSdS(Niiii ii(s_sbasicAcceptsCardss from_stackscardssrankssuit(s_s from_stackscards((spysol.pys acceptsCardsFs   D(s__name__s __module__s acceptsCards(((spysol.pysNasty_RowStackFs sTarock_GameMethodscsbFtZFdddddfZFdddd d d d d ddddddfZFdZRS(NsWandsSwordsCupsCoinsTrumpsAces2s3s4s5s6s7s8s9s10sPagesValetsQueensKingcs#FF|iii|||SdS(N(s_sappsimagessgetFacesdeckssuitsrank(s_sdeckssuitsrank((spysol.pysgetCardFaceImageFs(s__name__s __module__sSUITSsRANKSsgetCardFaceImage(((spysol.pysTarock_GameMethodsFs 3sAbstractTarockGamecsFtZFRS(N(s__name__s __module__(((spysol.pysAbstractTarockGameFs sWheelOfFortunecs8FtZFeZFdZ!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} Gdddddddddddddddd dddddf}G|i|i d}G|i }GxtdDG]w}G|| ||i }  G||||i } G|iit| ||d|id Gddddddq+W G|i|idd|i d d!f G|i|i d}G|i }G|iit|||d dd"G||i }G|iit|||ddd"G||i }G|iit|||ddd"G||i }G|iit|||ddd"G||i d}G||i }G|iit|||ddd#G|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.8999999999999999iiiif-3.8999999999999999f0.20000000000000001f0.5f1.1000000000000001f2.2000000000000002f3.2999999999999998f4.2000000000000002f4.4000000000000004f1.8f2.1000000000000001f2.3999999999999999f2.6000000000000001iisyoffsets max_cardssmax_moves max_acceptii i?Biif1.5snum_deals max_roundssnn(#sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxoffsetsyoffsetsxsysrangesisx0sy0srowssappendsWheelOfFortune_RowStacksCHs setRegionswidths foundationssSS_FoundationStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_sislsyoffsetsssy0sysxsfontsx0sxoffset((spysol.pys createGameFsD/HH  % ) ((((($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_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch(Gs(s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysWheelOfFortuneFs   % sImperialTrumpscs2*GtZ+GdZBGddZIGdZRS(Nc s:+G,Gt||if\}}-Gtdd|i}.G|i|i|i d|i |i d/G|i|i d}0G|i }1GxOtdD1G]>}2G|iit||||dd3G||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_cardscardwiiiis max_cardsiisnum_dealis max_roundsisssf1.25ii?B(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsImperialTrump_FoundationsSS_FoundationStacksWasteTalonStackstalons createTexts WasteStackswastesintsroundsrowssTrumpWild_RowStacks setRegionsdefaultStackGroups(s_sislsssysxsfont((spysol.pys createGame+Gs0/  (( $ # "icsBGCGto#t|iiidjptDGxUtdt|iiDDG]5}EG|iii d|ii|ddddqOWFG|i GG|iii d|HG|iii dS(NiNisrowssflipisframessreverse(s __debug__slens_ssstalonscardssAssertionErrorsrangesrowssisdealRowsstartDealSamplesreverses dealCards(s_sreversesi((spysol.pys startGameBGs- 3 csIGJGdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchIGs(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pysImperialTrumps*Gs  sPagatcs/KGtZLGdZlGdZrGdZRS(Ncs8LGMGt||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 }]GxFtdD]G]5}^G|iit|||_G||i }qW`G||i d}aGxFtdDaG]5}bG|iit|||cG||i }q/WdG|i }eG|i|id}fGxFtdDfG]5}gG|iit|||hG||i }qWiG|i|idt|ddfjGt|i |i|i||_kG|idS(Ns canvas_cardscardwiii f3.5is max_cardsiiiiiif1.1000000000000001ii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsys foundationssappendsSS_FoundationStacksrangesisreservess ReserveStacksrowssPagat_RowStacks setRegionsintsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_sislssshsysxsfont((spysol.pys createGameLGsD / (((((     (%cslGmGto#t|iiidjptnGx0tdDnG]}oG|iii ddq@WpG|i qG|iii d|ii dd!dS(NiNisframesisrowsii ( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrows(s_si((spysol.pys startGamelGs -  csHrGsG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchrGs(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pysPagatKGs  sSkizcs/vGtZwGdZGdZGdZRS(Ncs8wGxGt||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 }GxFtdDG]5}G|iit|||G||i }qWG||i d}GxFtdDG]5}G|iit|||G||i }q/WG|i }G|i|id}GxFtdDG]5}G|iit|||G||i }qWG|i|idt|ddfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii f3.5is max_cardsiiiiiif1.1000000000000001ii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsys foundationssappendsSS_FoundationStacksrangesisreservess ReserveStacksrowss Skiz_RowStacks setRegionsintsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_sislssshsysxsfont((spysol.pys createGamewGsD / (((((     (%csGGto#t|iiidjptGx0tdDG]}G|iii ddq@WG|i G|iii d|ii dd!dS(NiNisframesisrowsii ( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrows(s_si((spysol.pys startGameGs -  csHGG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchGs(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pysSkizvGs  s FifteenPluscs/GtZGdZGdZGdZRS(Nc sGGGt||if\}}Gtdd|i}Gtd|id|i }G|i |i d|i |i|i|G|i|i }G|i}G|iit|||dddG||i}GxOtdDG]>}G|iit||||dd G||i}qWG|i }G|i}Gxtd DG]~}GxRtd DG]A}G|iit|||d d dd G||i }quWG|i }G||id}q\WG|i|idd|i |i d dfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii is max_cardsiiiismax_moveis max_acceptiii?B(sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMswidthsxsys foundationssappendsSS_FoundationStacksrangesisjsrowssTarock_AC_RowStacks setRegionsInitialDealTalonStacksheightstalonsdefaultStackGroups( s_sisjslssshsysxsfont((spysol.pys createGameGs2 / ( (    + 0%csGGto#t|iiidjptGx6tdDG]%}G|iii ddddq@WGxFtdDG]5}G|iii d|ii d ddddq|WG|i G|iii dS(NiNisflipisframessrowsi( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsrowssstartDealSample(s_si((spysol.pys startGameGs- # 3 csHGG|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchGs(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pys FifteenPlusGs   sExcusecsDGtZGdZGdZGdZGdZGdZRS(Nic sPGGt||if\}}Gtdd|i}Gtd|id|i }G|i |i d|i |i|i|G|i|i }G|i}G|iit|||dddG||i}GxOtdDG]>}G|iit||||dd G||i}qWG|i }G|i}Gxtd DG]}Gx[td DG]J}G|iit|||Gd d dd dtG||i }quWG|i }G||id}q\WG|i|idd|i |i d dfGt|i |i|i||_G|idS(Ns canvas_cardscardwiii is max_cardsiiiismax_moveis max_accepts base_rankiii?B( sLayouts_ssslsgetFontsCWsfontsmaxsYSsYOFFSETshssetSizesXMsXSsYMswidthsxsys foundationssappendsSS_FoundationStacksrangesisjsrowssExcuse_RowStacksNO_RANKs setRegionsInitialDealTalonStacksheightstalonsdefaultStackGroups( s_sisjslssshsysxsfont((spysol.pys createGameGs4 / ( (     0%cs'GGd}Gdt|iif\}}Gg}GxB|DG]7}G||oG|i |nG|d}qCWGx|DG]}}G||}GxdG||joSG||| o-G||||f\||<||<GPnG||}qWqWG|i G|SdS(NcsGGG|idjo |idjp|idjo |idjSdS(Nii i(scssuitsrank(sc((spysol.pysisKingGsii( sisKingslens_sssrowssisnskingsscardsscsappendsjsreverse(s_scardssiscsjskingssisKingsn((spysol.pys _shuffleHookGs& !    % csGGto#t|iiidjptGx0tdDG]}G|iii ddq@WG|iii d|ii d ddG|i G|iii d|ii d dS(NiNisframesisrowsi( s __debug__slens_ssstalonscardssAssertionErrorsrangesisdealRowsrowssstartDealSample(s_si((spysol.pys startGameGs- ) cs5GG|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchGs(s__name__s __module__s GAME_VERSIONs createGames _shuffleHooks startGamesshallHighlightMatch(((spysol.pysExcuseGs     s GrasshoppercsDGtZGdZGdZHdZ(HdZ/HdZRS(Nic syGGt||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 } Hxltd D H][} HxOt| D H]>} H|iit||||d d H||i }q|WqcWHxOt| DH]>}H|iit|||d d dH||i }qWH|i }H|i d|i }H|iit |||H|i|f| dj|id_!H||i |i }HxLt| DH];}H|i"it#|||d|H||i }qWHxNtd | dDH]5}H|i"it$|||H||i }qWH|i%|i"d||i ddfH|i&dS(Ns canvas_cardscardwiiii snum_dealis max_roundssssis max_cardsiiisyoffsetii?B('sLayouts_ssslsgetFontsCWsfontsgameinfosdecksssetSizesXMsXSsYMsYSsminsYOFFSETsmaxsyoffsetsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesjsis foundationssappendsSS_FoundationStacksreservess OpenStacks CARD_YOFFSETsrowssTrumpOnly_RowStacksTarock_AC_RowStacks setRegionsdefaultStackGroups( s_sisjslsyoffsetsssysxsfontsdecks((spysol.pys createGameGsL?%  $  ( ( & % )csH H|ii}!Hto't|iiid|jpt"H|i #HxFt d|D#H]1}$H|iii d|ii ddddqdW%H|ii di&H|iii d|ii|'H|iiidS(NiNisrowssflipisframesi(s_sgameinfosdeckss __debug__slenssstalonscardssAssertionErrorsstartDealSamplesrangesisdealRowsreservessflipMovesrowss dealCards(s_sisdecks((spysol.pys startGameHs1  /#cs(H)H|iid}*H|i o||iijoB+H|io|i||ido,H|id|nn-H|i o.H|i ndS(Niii( s_sssreservessrsstackscardssrowss acceptsCardssmoveMoves canFlipCardsflipMove(s_sstacksr((spysol.pys fillStack(Hs !'csH/H0H|id|ijp|id|ijo|i|ijSdS(Ni(scard1srankscard2scolor(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch/Hs(s__name__s __module__s GAME_VERSIONs createGames startGames fillStacksshallHighlightMatch(((spysol.pys GrasshopperGs   " sDoubleGrasshoppercs3HtZ4HRS(N(s__name__s __module__(((spysol.pysDoubleGrasshopper3Hs sPonytailcs5HtZ6HdZRS(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}DHxtdDDH] }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[H]y}\H|i$it%||||dddd]H|i$it%||i |||dddd^H||i}qW_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 sbraidif0.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_sislssshsysx((spysol.pys createGame6Hsf2(  **** &&-*1    .5.5 "*(s__name__s __module__s createGame(((spysol.pysPonytail5Hs sCavaliercsegHtZhHeiZiHeZjHeZkHe Z lHdZ yHdddfddZ HdZ RS(Nc sklHmHt||if\}}nHt|ddddoHt|i|f|pH|i|i d|i dqHxn|ii DqH]]}rHdd|i d j}sH|i i|i|i|i||i tHd |d |qWuHx?|iiDuH].}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_slayoutsssrslsn((spysol.pys createGamelHs! ' ,-iicsyHzHto#t|iiidjpt{Hx0|D{H]%}|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(NiNsflipsframesisrowsii( s __debug__slens_ssstalonscardssAssertionErrorsflipsfsdealRowsstartDealSamples foundationssrows(s_sflips foundationssf((spysol.pys startGameyHs- #  &#cshHH|id|ijp|id|ijo0|idjp |idjp|i|ijSdS(Nii(scard1srankscard2ssuitscolor(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchHs(s__name__s __module__sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssCavalier_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(((spysol.pysCavaliergHs       sFiveAcescs#HtZHdZHdZRS(NcsHH|i|dSdS(NcsH|idj|ifS(Ni(scsrankssuit(sc((spysol.pysHs(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHookHscsHHti|dddS(Ns foundationsi(sCavaliers startGames_(s_((spysol.pys startGameHs(s__name__s __module__s _shuffleHooks startGame(((spysol.pysFiveAcesHs  sWickedcsbHtZHeeddZHeedddddeZHeZ HdZ HdZ RS( Ns max_roundsismax_moveis max_accepts base_rankcs,HHti|ddddfdddS(Nsflipis foundations(sCavaliers startGames_(s_((spysol.pys startGameHscsHHH|id|ijp|id|ijo|i|ijSdS(Ni(scard1srankscard2ssuit(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchHs( s__name__s __module__s StackWrappers Wicked_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_ClasssCautiousDefaultHints Hint_Classs startGamesshallHighlightMatch(((spysol.pysWickedHs !  sNastycs,HtZHeedddddeZRS(Nsmax_moveis max_accepts base_rank(s__name__s __module__s StackWrappersNasty_RowStacksANY_RANKsRowStack_Class(((spysol.pysNastyHs c srHH|tiBtiBtiB}Ht||||||Hdt ddt d}Ht |H|SdS(Nsranksistrumpsi(s game_typesGIs GT_TAROCKs GT_CONTRIBs GT_ORIGINALsGameInfosids gameclasssnamesdeckssredealssrangesgis registerGame(sids gameclasssnames game_typesdeckssredealssgi((spysol.pysrHs ! isWheel of FortuneisImperial Trumpsiiis Fifteen plusiiisDouble Grasshopperiiis Five AcesiisPysolScrolledCanvascsAHtZHdZHdZHedZHedZRS(NcsTHHtti||if|H||_H|iidddddddS(Nsrowiscolumnsstickysnews(sapplys MfxCanvass__init__s_sframeskwscanvassgrid(s_skw((spysol.pys createCanvasHs csHH|iioHd|_nH|iid|d|H|iid|d|H|iiddd||fdS(Niswidthsheights scrollregioni(s_scanvasswinfo_ismappedsresize_pendingsframesconfigswidthsheight(s_swidthsheight((spysol.pyssetInitialSizeHs cs HHdS(N((s_sw((spysol.pysbindHbarHscs HHdS(N((s_sw((spysol.pysbindVbarHs(s__name__s __module__s createCanvasssetInitialSizesNonesbindHbarsbindVbar(((spysol.pysPysolScrolledCanvasHs   sOptionscs>HtZHdZHedZHdZ 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_stopsshsswscssd((spysol.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_sopt((spysol.pyscopy Is  (s__name__s __module__s__init__sNones setDefaultss setConstantsscopy(((spysol.pysOptionsHs  ' s Statisticscs_ItZIdZIdZIdZ+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_splayersgamessgameid((spysol.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__name__s __module__s__init__snews resetStatss_Statistics__resetPrevGamessgetStatss updateStatss updateLog(((spysol.pys StatisticsIs     sCommentscs;MItZNIdZRIdZTIdZXIdZRS(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_splayershomesconfigsksv((spysol.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_stmpgamesrandomsgamesidsdir((spysol.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_sidsrandomsstatussgsgisautoplay((spysol.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  scs MJNJdS(N((s_sinfo((spysol.pysdumpMemMJscspOJPJ|io\QJ|ii}RJ|djoSJd|i_n$TJ|djoUJd|i_nndS(Nszoomedisnormali(s_stopswm_statesssopts wm_maximized(s_ss((spysol.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 csy^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 fDhJ]+}iJ|ii i|i i ||qCWdS( Nsimagesslogossjoker07_40_774sjoker08_40_774sjoker07_50_774sjoker08_50_774sjoker11_100_774s joker10_100spysol_40sstopsignsredeal( sosspathsjoinsdirs_sgimagesslogossappends loadImages dataloaders findImagesfsredeal(s_sdirsf((spysol.pys loadImages1^Js++%%%%%  csjJkJtiidd}lJxEdddddfDlJ]+}mJ|iii|i i ||q4WnJtiidd}oJx9d fDoJ]+}pJ|ii i|i i ||qWdS( Nsimagessdemosdemo01sdemo02sdemo03sdemo04sdemo05sstatssbarchart( sosspathsjoinsdirsfs_sgimagessdemosappends dataloaders findImagesstats(s_sdirsf((spysol.pys loadImages2jJs ) cs qJrJdS(N((s_((spysol.pys loadImages3qJscssJtJx|iiiDtJ]\}}uJt|tijovJxt t |DvJ]k}wJt||ti joHxJt ||||<yJ|iiozJ|iiiddnnqWW{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_stsdskeyscs((spysol.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_soptscardset((spysol.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_sstats((spysol.pysloadStatisticsOKs  csCVKWKt|ii}XK|oYKt|ii|indS(N(sunpickles_sfnscommentss merge_dicts__dict__(s_scomments((spysol.pys loadCommentsVKs cs<ZK[Kt|_\K|id|_]Kt||dddS(Nisbinmode(s VERSION_TUPLEsobjs version_tuplessavedspicklesfn(s_sobjsfn((spysol.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_sidsgi((spysol.pys constructGamedKscsiKjK|iiSdS(N(s_sgdbsgetGamesIdSortedById(s_((spysol.pysgetGamesIdSortedByIdiKscskKlK|iiSdS(N(s_sgdbsgetGamesIdSortedByName(s_((spysol.pysgetGamesIdSortedByNamekKscsmKnK|ii|SdS(N(s_sgdbsgetsid(s_sid((spysol.pys getGameInfomKscsAoKpK|ii|}qK|tjo qKtSnrK|iSdS(N(s_sgdbsgetsidsgisNones gameclass(s_sidsgi((spysol.pys getGameClassoKs csAsKtK|ii|}uK|tjo uKtSnvK|iSdS(N(s_sgdbsgetsidsgisNonesname(s_sidsgi((spysol.pysgetGameTitleNamesKs csAwKxK|ii|}yK|tjo yKtSnzK|iSdS(N(s_sgdbsgetsidsgisNones short_name(s_sidsgi((spysol.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_sidsgisn((spysol.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_sidsmsn((spysol.pysgetGameSaveNameKs  0cs#KK|ii|iiSdS(N(s_s miscrandomschoicesgdbsgetGamesIdSortedById(s_((spysol.pysgetRandomGameIdKscsbKK| ptii| ptd@o KdSnKti|}Kttii|}K|i Kx|DK]}Kt i d|}Ktii||}K|otii|oKti}KyKt|id|WnNKtj o3}Kd|dt|GHKtiinKKnXK|t_nqyWdS(Nis ^(.+)\.py$isError loading plugin s: (sdirsosspathsisdirsbundleslistdirsnamessmapsnormcasessortsnamesressearchsmsjoinsnsisfilessysspsloadGamesgroups Exceptionsexsstrsstdoutsflush(s_sdirsnamesmsnspsexsnames((spysol.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_sdirsfilenamesfslinesscssconfig((spysol.pys_readCardsetConfigKs&         csgKKt|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|DK]t}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_scsslinesstylessfieldssmsbackss((spysol.pys_parseCardsetConfigKs " #        -    Q    cs;KK|i} K| i|ddfd}K|ioK|| i|d}nKy#K|| i|ddf}Wn KKnXKghf\}}KxM|DK]B}Kt i |}Ky Lg} L|o!t ii|o|i| o0Ld||<Lt i|} L| inLx| DL]}Ltid|ti}L| o Lq>nLt ii||} Lt ii| o  Lq>n 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 LLnXnq>WWnLt$j o } LnXqWLx<|DL]1}L| i'|i oL| i(|nqWdS( NscardsetsssPYSOL_CARDSETSs cardsets-*sPySol_CardsetssCardsetsis ^cardset-s config.txts COPYRIGHTsshade()s_scardset_managersmanagers getSearchDirssdirssdebugsgetRegistryDirssfoundstsdirsstringsstripsnamessosspathsisdirshas_keyslistdirssortsnamesressearchsIsmsjoinsdsf1sf2sisfiles_readCardsetConfigscss backnamess backindexsbacksextsappendsEnvErrorsexsobjs getByNamesregister(s_sdirssf1sf2sobjsnamesmsdirsdsexsmanagersnamessbackscssfoundst((spysol.pys initCardsetsKsZ  #  .    ) )  csLL|i}L|i|dd}Ly L||i|d}Wn !L"LnX#Ldtitdd} $Lt i | t i }%Lt i d} &Lghf\}} 'Lx|D'L]}(Lti|})Ly*Lg}+L|otii|o#,Lti|}-L|in.Lxk|D.L]`}/L| p|i| o 0Lq1n1Ltii||}2Ltii| o 3Lq1n4Lt}5L||_6L|i dti|} 7L| i| } 8L| o89L| i#d } :Ld ti$| i#d |_%n;Lt i d d | } L| i'| o'?Ld | |<@L|i(| |fnq1WWnALt)j o }BLnXqWCL|iDLxI|DDL]>}EL|d }FL|i,|i oGL|i-|nqWdS(Nstiles-*s PYSOL_TILESsTiless((\s)|(\s))$s^(.+)-([0-9A-Fa-f]{6})$sis#is_s (.s_stabletile_managersmanagers getSearchDirssdirssgetRegistryDirssstringsjoinsIMAGE_EXTENSIONSsssrescompilesIsext_res text_color_resfoundstsdirsstripsnamessosspathsisdirslistdirssortsnamessearchsfsisfilesTilestilesfilenamessubsnsmsgroupslowers text_colorskeyshas_keysappendsEnvErrorsexsobjs getByNamesregister(s_sdirssmanagersexskeysext_resobjsnamesfsms text_color_resnssststilesfoundsdirsnames((spysol.pys initTilesLs\         &  "    csyHLILghf\} }JLx|DJL]} KLti| } LL| oMLtii| } nNLyOLg} PL| otii | o;QLti | } RLt tii | } SL| inTLx| DTL] }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|oSgLxI| DgL]>}hL|d}iL|i!|i ojL|i"|nq%WnkL| SdS(Nsi(#sfoundstsdirssdirsstringsstripsosspathsnormpathsnamessisdirslistdirsmapsnormcasessortsnamesext_ressearchsjoinsfsisfilesResource_Classsobjsfilenamessubsnslowerskeyshas_keysappendsEnvErrorsexsmanagers getByNamesregister(s_smanagersdirssext_resResource_Classsobjsfsnamesexsnamesskeysfoundsnsdirst((spysol.pys initResourceHLsL          "     csnlLmL|i}nL|i|dtiiddf}oLti dti }pL|i |||t dS(Nssoundsextras \.((wav))$(s_ssample_managersmanagers getSearchDirssosspathsjoinsdirssrescompilesIsext_res initResourcesSample(s_sdirssext_resmanager((spysol.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_sdirssext_resmanager((spysol.pys initMusicqLs (0s__name__s __module__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(sappsd((spysol.pysfatal_no_cardsetszLs 'c sMLLyLti|iidWn LLnXLy)Ltitii|iidWn LLnXLy,Ltitii|iiddWn LLnXLy,Ltitii|iiddWn LLnXLy,Ltitii|iiddWn LLnXLtiidd}Lt |d||_ Ld|d j o{Lxqtii|i i d tii|i i d |iifDL]-}LyL|i|Wn LLnXqWnLd }Ld}Lti}Ltii|d}L|otii|oPLtii|}Ltii|o!L|d tii|}nnLxl|d DL]]}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 }LxM|DL]B}L| iId<|d=|| L| iId<|d>|| q^WnLtM|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_oQMxG|i`DM]6} 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 okMxa|inDM]S}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  olM|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(sappsargss opt_nosoundscardsetscolorswarn_pysolsoundserversmanagersexs warn_threadstopsprioritysshsmusicstilesprogresss wm_commandsmsprogsascsdsfsswsclassessargv0stitlesdirssd((spysol.pys pysol_initLs),,,C    %       &  ' -*    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(sappstop((spysol.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(sargssdsappsrsexst((spysol.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 SnnMdddjoMtdnMt|}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 betterii i s -1 % 13 != 12(shasattrssyssplatformsNones executablesossdefpathsversionsPACKAGEs __debug__slens tkversionsAssertionErrorstknamesstrsTkintersWmsCanvass Exceptions pysol_mainsargssr(sargssr((spysol.pysmainqMs,$ +(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(sFan_HintsCanvassPerpetualMotionsFortress_RowStacksTowerOfHanoy_HintsFreeCell_RowStacksSelectGameTreeWithPreviewsSelectGameLeafsChessboard_RowStacks createImagesPeeksAShuffleStackMovesBabySpiderettesThreeShufflesAndADraw_RowStacksSubclassResponsibilitysSelectDialogTreeDatasRussianSolitairesPagodas BelvederesPysolStatsFormattersSequenceRowStacks LCRandom31sOpenTalonStacks SingleRails Golf_TalonsDieRussische_RowStacksgetFontsstringsEagleWing_ReserveStacksANCHOR_Es _HideableCards MusicManagersANCHOR_NsAlaskasANCHOR_SsVERSIONsANCHOR_WsAlaska_RowStacksGIsSubsampledImagess Spider_Hints AgnesSorelsMatriarchy_DownRowStacks LaBelleLuciesNapoleons BlackWidowsindicess makeToplevels_OneImageCardWithHideByConfigsCarpets pysol_initsRushdikes __getWidgetXYsFourWinds_RowStacks DieRussisches WasteStacksNO_COLORsJanes Canvas__yviewsStrategy_Foundations pysol_exits PeggedCross1s PeggedCross2sPagatsYukonType_HintsTriPeaks_RowStacksUserLists TileManagers _MfxToolbars Spaces_TalonsNapoleon_Talons loadImagesMemory24sIntelligence_RowStacksNO_SUITsPagat_RowStacksExcuse_RowStacksSelectTileDialogWithPreviewspysolfreecellsolvers_HideableCard_1sUnionSquare_RowStacksTimerspathsNumerica_RowStackshexifys wm_withdrawsStringIOs FourWindss Intelligences SmallHarpsAlhambra_WastesDieBoeseSiebensFortunessOsmosissJACKsKlondikeByThreessunbind_destroys Terrace_Talons ANCHOR_SEs FortyAndEights DefaultHintsCanvas__yview_scrollsSUITSsCOLORSsPyramid_RowStacksSelectDialogTreeLeafs ANCHOR_SWssgnsSpider_AC_RowStacks EagleWingsMissMilligan_ReserveStacksDoubletssGreatWall_RowStacks Wicked_TalonsBytes_RowStacks cardsFaceDownsSelectDialogTreeNodesCanistersKingRK_RowStacksYukon_AC_RowStacksAUpdateStackModelMoves__wm_get_geometry_resGameInfoExceptions AMoveMoves PasDeDeuxs WaningMoonsStatus_StatsDialogs LittleFortysRoyalCotillion_FoundationsAbstractFlowerGamesFreeCell_AC_RowStacksspawnSystemSoundMixersTkintersCanvasItem__bindsPysolSoundServerModuleClientsCitadelsSamurisNastys_ToplevelDialogsDerLetzteMonarch_FoundationsPyramidsCardsets SiebenBisAssQUEENsSelectDialogTreeCanvassAC_FoundationStacks CURSOR_WATCHs Group__bboxs RedAndBlacks RelaxedSpiderspicklesText__yview_scrolls ANCHOR_NEs AtomicMoves tracebacksStructs Montana_HintsScotchPatiences RelaxedGolfsHexAKlon_RowStacks ANCHOR_NWsOonsoos VegasKlondikesSiebenBisAs_HintsNeighbour_Foundations LongBraids Westhavens HintInterfaces Spiderettes__mfx_bindingss TowerOfHanoysSpanishPatiences Stalactitess NO_REDEALsDieRussische_Foundations ReserveStacksStacksSamuri_RowStacksBlackWidow_RowStacksLarasGame_HintsLucassRainfallsaftersPileOnsCavaliers VERSION_MINORs EastcliffsSelectCardsetDatasStreetsAndAlleyssFortresssAbstractFoundationStacksATurnStackMoves LexingtonHarpsBraid_ReserveStacks Easthavensspawnvps"AllGames_StatsDialogScrolledCanvassEditTextDialogsCanvas__xview_movetos MilliganCellsTrumpOnly_RowStacksPeggedTriangle2sCalculation_RowStacksYukons Mississippis merge_dicts helpAboutsMonacosPasDeDeux_RowStacks range_lens SimpleSimonsRK_FoundationStacksStrictEiffelTowersOptionssSeahavenTowerssCanfields Brunswicks after_cancels MfxTreeLeafsText__xview_movetosACEsGaji_FoundationsExcuses NeighboursPysolStatusbarsCanvasItem__bboxsWheelOfFortune_RowStacks AFlipMovesCanvas__tag_binds KingAlbertsmains BakersGamesPonytail_RowStacksTriPeakssBigHarpsBatsford_ReserveStacks PysolRandomsWHRandomsAUpdateStackViewMovesCanfield_RK_RowStacksStepss Golf_HintsPerpetualMotion_FoundationsTarock_AC_RowStacksDerLetzteMonarch_RowStacksInterregnum_FoundationsSkizsMfxMenus PokerShuffles CalculationsPictureGallery_HintsSpider_SS_RowStacksWhitehead_RowStacks Bristol_TalonsIntelligence_Talons MfxMenubarsRainbowsNestor_RowStackslatin1_to_htmls tkHTMLViewers tkversionsexs FlowerGardensPasDeDeux_Hints SimplePairss Wm__wm_statesMatsukiri_RowStacksMfxCheckMenuItemsPysolProgressBarsBeleagueredCastlesGrandfathersClock_Hints Courtyardsres MfxCanvasLinesGajis FreeNapoleonsRelaxedPyramidsBetsyRoss_FoundationsWasteTalonStacksFreeCellType_Hints StackWrappersmaths RoyalEastsCSIsNapoleon_FreeCellsmacfssNapoleon_ReserveStacksFullStackWrappersPyramid_StackMethodss MfxCanvassMfxRadioMenuItems PACKAGE_URLs EVENT_HANDLEDsDoubleCanfieldstrangesthreadswm_get_geometrysKingOnlyBakersGamesForeCells ChameleonsEiffelTower_RowStacks FifteenPluss helpCreditssGAME_DBsHexADeck_FoundationStacks Maze_RowStacksGiantsFlowerClock_RowStacksAbstractAudioClientsSelectTileNodes WillOTheWispsYukon_SS_RowStacksIndiansKwStructsDerKleineNapoleonsCardsetManagersTilesFiveAcessNestors Misc__destroysCastlesInSpainsusleepsDerKatzenschwanzsPonytail_FoundationsCongresssImperialTrump_FoundationsAlhambras GreatWalls MatriarchystypessSpider_AC_FoundationsMonteCarlo_TalonsSessionLog_StatsDialogsCavalier_RowStacksasUnpicklingErrorsGeneralsPatiences SimpleCarlosHintOptionsDialogsTerrace_RowStacksAllGames_StatsDialogsRelaxedFreeCells CardsetConfigslatin1_to_asciis RussianPointsShamrocks_RowStacksSpacessSingleGame_StatsDialogsZebrasbindsIntelligence_ReserveStacks ConcentrationsSelectCardsetDialogWithPreviews DataLoadersWin32AudioClients RougeEtNoirs TK_DASH_PATCHsThreeShufflesAndADrawsPictureGallerysTarock_GameMethodssWindmill_RowStacksMfxCanvasRectanglesRoyalCotillions ShamrockssGriffonsAcesUp_RowStacks"ThreeShufflesAndADraw_ReserveStacksgetNumberOfFreeStackssSomersetsOdessasDealRow_StackMethodssSuperFlowerGardensMatriarchy_UpRowStacksIrmgards CURSOR_DRAGs HanoiPuzzle5s DieSchlanges MonteCarlosCalculation_FoundationsAbstractTarockGamesMfxScrolledTextsMfxScrolledCanvassspawnvsisRankSequencesRANKSsglobsGrandfathersClocks Pyramid_Hints Group__unbinds kwdefaultsOsmosis_FoundationsSelectCardsetNodesWheelOfFortunesUnionSquare_FoundationsGameInfosRougeEtNoir_RowStacks pysol_mainsBlondesAndBrunettessmsdestructsMfxTreeBaseNodesSampleshelpHTMLsThirteensMazesWeakStackWrappersInvisibleStacksPokerSquare_RowStacksMonteCarlo_RowStacksLaBelleLucie_Talonsfatal_no_cardsetss RankAndFiles tkFileDialogs UnpicklersCommentssMatriarchy_WastesBraid_BraidStacksCanvasItem__unbindsSelectCardsetTrees RussianAcessEVENT_PROPAGATEsSelectCardsetByTypeDatasPonytailsKingdomsPysolScrolledCanvassDerFreieNapoleonsCanvasItem__tkraisesCanvasItem__lowers MatsuKirisGames MfxDialogs HanoiPuzzle4sFourteensPerpetualMotion_RowStacksPegged_RowStacksSelectGameDialogWithPreviewsSpider_SS_FoundationsPyramid_FoundationsisSameColorSequencesPenguins VERSION_TUPLEsPicklers MilliganHarpsPagoda_FoundationsPerpetualMotion_TalonsmakeHelpToplevelsMatriarchy_TalonsBatsfords EiffelTowerstknames MissMilligansDisplayTextDialogs Gaji_RowStacks FortyThievess FallingStarsPysolMenubarActionssSiebenBisAs_RowStacksGreatWall_BuildStacks RK_RowStacksSelectGameTreeswm_mapsDieKoenigsbergerinsHexATrump_FoundationsEightOffs Skiz_RowStacks AuldLangSynes GoodMeasures WhiteheadsDealBaseCard_StackMethodssBlackHole_RowStacksexistssScorpionsFullLog_StatsDialogsThumbAndPouch_RowStacks ANY_COLORsAcesUp_Foundations SC_RowStacksMfxTreeInCanvassloadGamesFourWinds_Foundations setTransients Pegged_Hints Canvas__xviews Golf_RowStacks formatters ThumbAndPouchs AchtmalAchts DeadKingGolfs QuadranglesTrumpWild_RowStacksRedMoons Stonewalls_HideableCard_2s DoubleRailsSuperiorCanfields AC_RowStacksstructs AbstractCardsAbacus_RowStacksreversesUNLIMITED_REDEALSsSpiders AmericanToadsPictureGallery_RowStacksforallsBraid_Foundations _LayoutStacks StatisticssChineseDisciplines$SelectCardsetByTypeDialogWithPreviewsSiebenBisAs_FoundationsgetPileFromStackssFaceUpWasteTalonStacksMusicsPileOn_RowStacksMonteCarlo_HintsMfxCanvasImages OpenStacks _OneImageCardsWindmill_FoundationsWeddings_Talons VERSION_DATEsBlueMoonsEnvErrorsMfxSimpleEntrysNomadsMfxSimpleSlidersFreeCellSolverWrappersCardsLarasGame_RowStacksHexADeck_OpenStacksMfxRootsTerrace_AC_Foundations cardsFaceUpsQueeniesDeucessMatsuKiri_FoundationsCanfield_AC_RowStacksElevator_RowStacksFreeCell_SS_RowStacksNapoleon_RowStacksSpiderType_Hints VERSION_MAJORsWaspsGroup__tkraisesRachels AbstractHintsGreatWall_Foundations getprefdirs NumberTensOonsoo_RowStacksFourteen_RowStacks BitsNBytessKlondikeType_HintsBlockades wm_set_iconsElevatorsStrategys tkHTMLWritersTarock_OpenStacks GolfType_HintsSS_FoundationStacksPeggedsDieBoeseSieben_TalonsTrefoilsDemoOptionsDialogsCalculation_Hints HopscotchsNapoleon_SingleFreeCellsANY_RANKs Montana_TalonsRelaxedSeahavenTowerss BasicRowStacksCautiousDefaultHintsDerLetzteMonarch_ReserveStacksResources Group__bindssyssunpicklesBristols wm_deiconifysFlower_FoundationStacksIMAGE_EXTENSIONSsLimiteds Bristol_Hints TripleLinesCanfield_SS_RowStacks PysolMenubars UnionSquaresCallWrapper____call__sPeggedTriangle1s HanoiPuzzle6sCarltonshtmllibsGrandmothersGamesTerracesFlower_OpenStacksTowerOfHanoy_RowStacksSamuri_FoundationsLadyPalksPasSeuls Chessboards Numerica_HintsDiplomatsRaglansImperialTrumpssBrigadesisAnySuitButOwnSequencesAUpdateStackMovesDerLetzteMonarchsconstructRandoms__mfx_wm_protocolss registerGames Pyramid_Wastes Irmgard_TalonsResourceManagersBeleagueredCastleType_Hints getFont_cachesSelectCardsetLeafsPlayerOptionsDialogsMemory_RowStacks SS_RowStacks Pegged7x7sCoronaspysolsoundservers Braid_HintsCruelsSelectTileLeafsLarasGame_ReserveStacks TamOShantersiranges WestcliffsChineseSolitaires SampleManagers PysolToolbars MidshipmansSelectCardsetByTypeTreesFreeCells GrasshoppersBakersGame_RowStacksAbacus_Foundations FlowerClocks OddAndEvensDealRowTalonStacksNEW_ATurnStackMovesisSameSuitSequencesMemory40sGroundForADivorcesSoundOptionsDialogs Cruel_TalonsMartha_RowStacks ASaveSeedMovesSequenceStack_StackMethodssget_version_tuplesConcentration_RowStacksspawnSystemDisplaySettingssMfxCanvasGroupsMontana_RowStacksImagesCardbacksGiant_FoundationsAgnesBernauer_TalonsKingSS_RowStacksNapoleon_Foundations copyImagesSelectGameDatasKINGs BetsyRosss Pegged6x6sisAlternateColorSequencesCanvas__yview_movetosMontanasifelsesSelectGameNodesText__xview_scrollsNeighbour_RowStacksANextRoundMoves LadyBettysUserDictsInitialDealTalonStacks BlackHolesMemory30sKlondikesFlowerClock_FoundationsrsBlackHole_Foundations getusernameshelpAboutSimples Jane_TalonsTerrace_SS_FoundationsMACFSs LCRandom64sImagessosswin32apisPasDeDeux_WastesDoubleKlondikes Interregnums __builtin__s Golf_WastesNumericas Canfield_HintsPictureGallery_TableauStacksoperatorsMarthasNO_RANKsTclErrorsDoubleGrasshoppersWindmills TalonStacks BlindAlleyssSanibelsSpider_RowStacks MfxCanvasTextsNasty_RowStacks LarasGamesDoubleKlondikeByThreessStrategy_RowStacksFansKingAC_RowStacks _TwoImageCardsBusyAcess after_idles Gargantuas_TwoImageCardWithHideItems fillImagesScorpion_RowStacks Pyramid_TalonscountsChessboard_FoundationsGolfsCARDSETs ApplicationsStreetss Yukon_HintsCanvas__xview_scrollsPysolToolbarActionssBraid_RowStackscyclopssstaticsLarasGame_Talons BakersDozensVARIABLE_REDEALSs AgnesBernauersCasinoKlondikes Bits_RowStacksLayoutsPonytail_ReserveStacksIndian_RowStacksPonytail_PonytailStacks gethomedirsSelectTileTreesWickedsSelectTileDatasDieKoenigsbergerin_TalonsMfxExceptionDialogs Storehouses ANCHOR_CENTERs _MfxStatusbarsPACKAGEs makeImages tkHTMLParsersboolsText__yview_movetosAbacuss MfxTooltipsMarias PokerSquaresNapoleonsExilesMfxReadonlyScrolledTextsopenURLsEightTimesEights Group__lowers AboutDialogsHexAKlonsbundlesDoublets_FoundationsPictureGallery_FoundationsHanoiPuzzle_RowStacksRussianAces_TalonstkColorChoosersSelectGameDialogs MfxTreeNodesANY_SUITsustrsWeddingssVariegatedCanfieldsSelectDialogPreviewCanvassuclocksGypsysGroundForADivorce_TalonstimesPokerShuffle_RowStacksBraidsFortyThieves_Hints GameManagersAcesUp((spysol.pys?+s     K  !     "       +                           *   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<!