From 014de70790142efa29322e85f28a0577d2b2a6bb Mon Sep 17 00:00:00 2001 From: laloge_h Date: Fri, 10 Apr 2015 14:02:26 +0200 Subject: [PATCH] Envoie sur le github --- .gitignore | 57 ++++++++++++++++++ AlgoGenetiques.pdf | Bin 0 -> 57647 bytes Codifieur.py | 141 +++++++++++++++++++++++++++++++++++++++++++++ Decodeur.py | 123 +++++++++++++++++++++++++++++++++++++++ GeneCouleur.py | 24 ++++++++ IA.py | 71 +++++++++++++++++++++++ MasterMind.doc | 113 ++++++++++++++++++++++++++++++++++++ 7 files changed, 529 insertions(+) create mode 100644 .gitignore create mode 100644 AlgoGenetiques.pdf create mode 100755 Codifieur.py create mode 100755 Decodeur.py create mode 100755 GeneCouleur.py create mode 100755 IA.py create mode 100644 MasterMind.doc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba74660 --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ diff --git a/AlgoGenetiques.pdf b/AlgoGenetiques.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a28995ed32f15959360824c2d17ad7c10f8b4ce6 GIT binary patch literal 57647 zcma&MV~}nM@;uzOZQHhOp|I%Ut11Bg zCakDn{H+s}=Oo)3Fr2W+?y~-oV_L@Il_e(QY_jL8a;haIrU%Z;chLoGdGhG)c?qCw z!o^TA2uGtex?E;0RA~*4h~>M~xYc-NFlv^_q;T8YZfqpUJBKSISmBQV;LP^F;H)TXHN*hZ^R9lXEkQOOfg1!_ ztQWQg6@WWptHnOT_JjWYJqe`^c8d!G@Ks|uDOb0i?6+f{zkOEt zPtA_(hVr!q?O|1`X(%-6{l04b1|nTe#Ez^O8Qzn9ki2gFhC%DWH7rey%^x$a7?G$a zg-PRI-7|2#fb0V;GyeeEpK$yOG#0l11C8T9K;!&hKvR{C+7S2?w5g6=l?CrrFlGeu zHDNpG06ZzXtJdV!xt_-xb>ivhE0UQ~knGoZ)7B+8l+t&6q>9%0X&)@rJn?KH9 zjlqvUhP(ZUf@ZSy_+tDUuEg?J;fQ}=a^E(z5QAu39BvE|e0!xEUWjoRZxCnS_pLX; z$J{0_BN&r=c=P$0%bgs*A|bu$FyL{G(3Q_|h>Ci`9SCqH^_4vi$D6v6#J7Adk8fj| z(NZS`l{jC9W6bi~W)KVCUIxIB0~f#;hdZ*DO#XI~X#ees*U2T4fviPTqDa0geD7@G zJCSQ3GAW#xB*dA%63Hq1aq^35esnTP7c%#zPTh+`Y%PhESC4-BVt+_KaTH~%Jaj78 zb`@*3xLv>=m+Hq>*HA5Pc+;8RY74M-lUH;*h!9k8QMrMnK<_=4n1RH&delCrYKYL_ zHB``eE{oNR!}PKNTIJkIZEcnd;>zAKr8|;|yoq*G@fh9D7Y)RU*hHpx>z)B8GP>f} zMzY#D5`lHAOu7a70+03X5FqqO(l#gbz=hO&+)J?Md}{3_QMwsP2MIw59||X!|Bi7RdIDZK>M+q=<0|sR_p` zOj%PGE#JY_c_I`iXRoX#PSSn&RIas4`#}SSW>M#M;9YeCri6|wGo%-GFZ%Szn&xLx zkd^&N2P$tBt>IVX;8zNb*8_k2nD{ledwMb}Wa=fOOt|>(7f9zsp{119D{@D)yYx7eXkKANH z=y|7h#j2|G7t`xoLp@L*P{c`og zX~$#RKH6v3LYF>#olJUv-1T)kJ@k5A4#3!~lgn#Ut}x-xEd0?q0P!_pg(wkkPM=G-vgj=K%(TC7O3cR1D#@7+$#a zLj>TF)cga%(X}s$&Iw1B?;?`9xy+HNE-!aO`vI?7vy^a<8Gnvk-%UsHP&`f`_A?p( zX#cQ;LmWJ^^b{GzwLt3tCWV7d~Gryc)*1CseSI*wy0`RArghQZpz%BDTRV z3XcUJ{KH#938{k53c!UPM7EE1LU1yD)zUz7;6}Ze-8}v|RA9NSKXq(+1O8TuKiO6TCM+M;* zj<3pb=>DnmlXaZv)87H{`%|-ruO_NOS7v$`sPwiV3Vub(Ksb{%{DS=MI#9^c!Ndp;EATYhvD>*ut6qY@dvH95L`?x52B2Dd6x$k>wyeo1nt$ z!c!xnX2$w6-azQJZOLWrj^k)fH7sQCEm=Ly?Ly&2Je~A!o;~4RQYNYG5$GJqdd#_* z;+E!oOm}*M#n)y;V2Au6P;4HEqW}tbD_}J1c%*TNUo1tVNr=X5Tb_pIfMWMP&Q+>j zu>-I$oG~P)f!oG|OA{EyJ_)EZiK*GOI8f!V5_Un}nxwS4%Y0R!@BvJ`r4h3cgP;-< z97N|s@u$RIl49Bo?$6-8`=bvwO$URO_{pj}9B8i$qdb6l1tx zzNBK=E0_j2Xx0?Bjci~&ct=?ZZ;h8rMwzmhesM+18D8Oo%;yUgGO*}pDUrp^MKbFO z3CV0r5T=(*1?wWZYsmq;!{E;6=~R@V*iaF)9XUtW;mvD_E6XUmGd`w)y4K2>pS~!!&JsBruwVM_fyye0+nSu`^G>)V%5}r3mJ7s6B zqNu;cV7|k?Y@m7q(Pd6^@e;zYFpCQ{y7vz&b_TRw2F?Sp%2z-ZEqcy7c-G0F%3kg`e6ZuSR66ASb~~u9)n<`mhUx8@k>~EVQDbvAAyF1c}j~VCfnjng_!$Rc2hH**G;riB>X1AsJG(sUm~)WgFc$#~>QvZx@^A$uO>wPuo{B8lb3s zXfj^OIFxO6d%&c*QY^lNIh0t4ls!UxUAmfS9~6H-|MK=^>Z4}adwH%2WH9hmHAqg!SVJ|BBAr0v*Oi87hu@DBMvq0x@yhDr!~7ubTFy z-DOa($;PwZ@=r;i=nro%mqnq}u13y4>|XKEF^LNb2%aJ^oIwEfwh~OzS|-S!IXHe1 zZ53sFs-*A2HxMN%+G!_;WueIc7*^C7lpA;@T%A-*+;{c~CXzE%DA?}jG_ktCVdYup zR^N|K3M9%GWP3?>vQ|fI83U~eZ>AYAT4-$Vj}pQffXIy9BB(3J8FNLPwPVlK*2Z8R zJvgdR|e4od=^8VR5^}cW(4`eQKz1PlwD9dt82{W!{-b=<=ARX}mMlz7-mPlD@ ztQ6rj=_q$tW6yP>*aJgMQ;T1& zeJXg~wvmn+rG!QHu!$v3G9p_ct(bih!>!a-FXN(ke(j@_XEI0fo3(9o-j8ICWCJyf zlQ$^V@rFq|jODra-2l4_D->?%g7C0+|4DxX;*~uh_3=zQfO(#rk3?SlB36V0@Ixge zN;p;;3^5mt$hl3Fq6B(Pn$a)cnJ{dUbK|+NnF2A%x?}duc2m1ja1EQpiycw!T*Dh2 zPWO$3#fjs{M~&t#-IB)4uK9N$&ojIN-W7${RL3?VtXa0gF&@0M2vaKZeA?q+hDc&U znucEtOt13XN~HUF^Hx zKQZ*LX^w;W?+K5I;XfG4^rtQTZwyUQleOFU7eh~Z2=FTCC;bib<&uVML4ht6E?ZrO z>S6yJ%@4w?Co6MWA>t_#@m_yZC3`wO-JZO@ z1G*1<@ZFZGjr2vwLRy`{(*WyyI=H{tV;_^HR~bx2@E^K&<7LYluLX7Zvf|S(=d-Vr zjpEsJwDPX*tv>A+kbYn^bC_B zPQ4)Z`1P+(IemKGNgVuKl6$G5-Zg2WBQy&RA?^ z?5`&{iIXD3OR<=>{u&!Q-_`t3p)?aC9RE{ZF%ktVr)Y6DbZex<@S0sYaNnxw|pylX(!OXE# zj`^$!coiJ8T>wcwvQ|T)ymfO!p zr?!`QMUkD}n_dC@%6CK9exUe#No@bo3h6XS`#No#0XB!lW$hd*V`PA?_FdwgZ!Py8 z3n4kBF7f_-wac#Sr{N(EaPFT@`|56|xetfih`drrOpO<=`=zFnuRCFWc@WQjcclK3Yssdb{GQ2Y(c7t}9k4u4@l<2=rncBbiw|MJ7Er<=&o zuDwM(<>R5QDVKjv?b&8YqdcK(ZXf0}9zW~To$)l7dSX@94qOn>_9|H@7kS*w3d zi0Y>}Kiv38Hh_$N*tx>@fWq)5Z?88e7td+Gy>MfV>yA=$(tv5Co*YasW(8nP_np@P zI{9bHUUXbXKgd1X@lU0JKa>d}=eFgc2IC*MK#A2{>&a|J(T{^`v)|p+oxd9F#F(*f zcmB~m6Mi13FuEYE1!nYS$)huwPd|RNfaAc~z_Z|Z!&iGj+j7{$$KnFaBhH-RUi}R7Y!7Az`9$XFmCdVqP~o*9NU#av0k6?lS24F15lw`BN6=a>swD^V z*{GkuV+EvgUc0~&5ZP@i2&Nzzo%wM;Xs{o|HNHs;(|~4z&FH_yZ|B!MG#k9plzcWQ9;cv^GSdbR3xF$=F89 zZ)nwxi!Bn!VJc3_I{#5aCvZGL;M1(#JXcC6Wwy`>0;Q|vkMM43cW>(Z?wDUiv=oF= zqx-VJ-UPVMOxunN4%`bGTaTG0);+bb*Vj^~)?3E(1-SQax3!$NT>b$h3UoMe&@C1)IWOFS#sW%wD!u|V zya^v&V!P*q zxD((1RHc7Sd8`~Pe^=>W(c!;U>7T~$zg20Ex@_Dg8%)n^-7ROojEGdDwZ4A;K?aT^ zG=l(~pq-5-icP@rLZ4n_vGH0e*&1FXXt$*V$Srit3h*G!9!8m zQ=4Ar>`iB%+}v=UU0<#Y&*>M>uynwRpK~LbMlt_XXZ+%hoZe0kT9f3|^)ONCZ(;bI zT=FPj3)fPwug#usf86%#*Qd!}{myXeL5m*USd&&}AI`1nix0ZHH~L~7e0^~_YK+4(>VV2_cYUt16C43*$@ zClP$?zB0Yg(L_k}0VPJ+2Vx?Cl9myfiEzCn*c4ozTe`z&0G-CK05;v{FgE^HnJmt5 z;*rswnBa{kQkuDaE4AS5?nn@6jGX?Uz1oa267>L>V2z3}l5T-Or6ts`(Hn+%b{b}nbAlBT;pEO{+dG20pF(JFR7!nBqGAbb5X04ui9t>VR|}4B=H*~l z{^)HF`-sgtrI%zBPlA{~@#uYY3e>s19d(=i71-hnT#AcI$7fWt=(hV;>+ZKzN)$hf zb)lwTMsrtBVQ--2MLPkCE2||3eWoRoEUWK&uRgIa!D9oZ;GW{wH7rtW@2LW zl~Bcz(Lfu&-_BIeoxr3fB`18=IiWvZUk_KN~1zNw;ueIJX-_NUE7` zq^XmvsWoSiopA4Ta_nx?o{UrjnViGprN24T0@ydtrCcriuupqH&&jlC#DHKc6n~!{ zrb&G$D9*e3--HQE94S&S$IQdhzk@o)bQkF9+nv3CKSu?)&{CY#&W)3|OB6b0;vF_~ zC%b=S{**Cjq*Z5&`&~$uYHkE}9oM0|TqyCSAWHO;;F_vYVp738=U^zLNN_wqcn@ke zJa>?>Wf{!MqJ7Y)qL(v7m-oj6yBA;<)X$)pd;91+#u7rQi(w1RcJuh3vlghJEx;r! zhzZheD>`yw+0(q&#MB|?VlxZXEXVcceEN4VcfFOV&p``5>`r=*nbe5miFTkzLMV!d z=82j=0z?6q8h%nPr2 z*DlpINeGLrtpg`lQf03?kLT$qO|dNa38P9oXk{Wl2&txN&1!ChWm_5Tq+4!AWm=~4 z%{937y$FH+HpFjjQ!A%xZ>`wj_xe;n-%Hei`mor_X>#X2bcA*o*JkrZ-ht|5MWKoP zz{X2t%tdi3IN@U)RbSjK1IyQDSF&I*>8pU?wd#Ua2g^kKwe$(y8Pvb}Pm=Z549dvJ z!1=dk{T0amty#=}TH*huSvl$hu^SwJOs3S%bO?14lC7W^U`S@i^=*Jamj$aEY+V%V zKsnNWev(p+#^O>5f&k(PlILf42};i3=PP?<3+LtBMPPQFikvs*A77%MPm-S;{`<4< zec;pdOE19KuuNa2gX!K0zNb78cHi8ae7vsA_MmjQ3z@mT5^M zyvo{JCbZTlU4@cBOh~aYDTs+bwrLeW)PrAWI6>Pvo=wCp1o5sLi7G|6kee|4Gn8}( zR1^@+Vr_(Fm?c{}bU84DcePa}hIy$YH@?C_;8$nTnE-ab)0mMzR%$FWYijGdQ0<{? zLTXkT?$AB=xanuIuR$~^9^x6&(}X@_nORf#hIvk5b-#{6-mWflW1xiOKz5RnV1a2d zg;vHu?n0omZ-4AX{eS`u^&W#{m?1&Po6-P(Sqiarvw5n38gMzL0emui+J>=@u&A0> zB4R9^8~3S(61&*KZ9u~XwKGF~C^(|I7KmXA|8}EsBT0SrC&$h4&$%IBfGYur+;W=c zST>ESYR1a-*%r2tI$9K6CtH?l1$|&p3~5fmnj22&cejq*L>eH`;kSI}6CBU3P|;}- zm7!y(hzf|OlyyBLEtG6e587Qar?f)sl2eu~r(^Y@E2Nyo-FF&WyUIy@E?i|lbAXo6 z8vytK+w`EzGwmQ|r(9+Hji*U4h_ELClZ3kITe|T9l3xKGmlwq8>V_e;&><#jFr2(f zG#q~FoN=tsw)sHo5m8=QXIhEVX%bmoZHG+-G4^g|uTPn~zf!eH+t`%0F0=Hp1kV>% z(NhLSYNM{dWMnl?^ZJvZNn;Xs8?b_)$a21HoouYqVoxYk6K(i<(%d5rMZE%mIrE1o zbr1o=3y;RMP1gC59*s0!;!I>wZoUye#Fq7MzL1I^zP~P|Ja;zv*-z3ovJGjTRC=D6 z^Fm$6iZQZ$E^iT`z&3c@FksWaQGBEQjv!_zR+4D*i!R z{v{cIns!D8roU4!=6|?p_+O41YJNyp9k8KnpQxMjBB+bQPXZZ9I3|g@0SC~9UUMxn z$w24Ge*4Y}r{ap=$Jhz=Cz#|EJ-o&8X|d;jZG2WWuV0K*BG@ca;`7G(`KtE$D1BcF z%-@{kam&Il?QmGb)WvBJF1SutN4)zQY~JP&O@cOG^0ugHmi@t+>lyY=vuwAj66f0^J;{IN$j zhhyOYeSEM;kK9P#Zr<*&Q39Q=9Z|J(F|Koj7!U$ z-Zp^TfLJq~X3L74&bK*8z9L$FHE&MUw45in2xEkOCaKs<28h|S!SE6IOhj+S2EOs~ z!jQQ?i?N!To4dW05v;4xR3~d%mu$S-c5+Z-rkKA)qjuWcqO3BG8!-@-2mb*o%8Sl4 z*4n}_{W!pLxy)vxQDEkgCIx^o8k?v`s}u&Rt`uT`JZnpeT}RlOfD+$m96ItK4&p zv6=E@%mTx-3IjYPbpyYlO&8#Z_{?H68iYD07x)VyE5Pz_dQIscR@OW~auAd!whu zlD`g|8%cUHo)|8&5}+ogF`e>n0%{H!sLB7vIs3<9k zX|~8NmZwCg7;u(kiN+%SI=iFX)Ry<_+e#30^q=(Yul#|Lk@fFYAM;;P|G#;s|LK_L zkGqinOZ6*A{D$>`m@}pd+Cl{2rT@MQNlcPuivdsd7jGyjBR?Akrp@e|#s@wIsbOVY zYh~v1Xw~b@l!rfd3lhssvx6NAc>NWwtnyw)$u^4A*Ke7;cr*Pl^vTc_yylZ`pBRR$ zS306JItDlOIPBe?AZS*4QUQ_K zT4ftT&97ClLf_X#sHRe-eW0fPF_zrAtC=O1t27<){cO}gQCn{GE1~GPkY%4z`I1t( z?321%`G(1+J;kPTt3;^63msJ|pz9+wQU;=lx&r*H5jWX?eG`3(?fH5)I>}}%qBhOi zxQh+Pv?;CQt~lv-5@EK5ix#=esJsaY$2Fk_T*jctr4mIhP4?YKQ7A@4qQw&psWBEC z7W68qKQe0P?k8-!Qv(p6pEnf8#q#z|>gZA@aCLMo5zH?{F@2~TMWoQ!n{47vZqhv} zG`?na&P}$OcIKYpyS{+hN=M&3%pg-!dn$Bzaw3dh2pnmzju4JcCUzXOoWR z@rh>i@R+e~ASe)^Pw|S{a?E?m4wrAkQy$;cndHUAl}ZpGsALUN;%Vvv;*Rn8dNTiM z`^5ZL1i{Mjcec&^SK$3`b^536|8E|@=7((D!5_KA$sa3e0quxl5@-gP=%hai6%^=^ z;k0H8O;ju2>uiU<0^V<8hD-;<9!0~O=yi;I`gEk+PyU;tW~Ni{2$-#=ap3;nA4n)qZx|tXkOb&(g3jnVjCk7ImM=9ShtI zfwCQwnbY55G`_vx?wwomdFpfl5giM?4dc{B6doqlKRceykbMqLvUp?%UmD@PB<`kb zPDV-PHus6*A?cC#f#YoS0GNIRY&yW;CP`sL>g6M>*3G1UeTh%!!^-Ld@3bRHu>3yl zx0;Jh8r9`?fFI^{_*F(p<7DuQ}ol0P;ft~zCOqR?Bp?iCE11{=?9u+ zT4~}PA2rNQ{NQeS77k3YKFLMtQ2I1`(Q-83AgtF>qDWPZ0ijxyz>Ohv(|Q_D7g_v z#_Y!SThSLYtv$KwbL>;SeqqBp2)hQ@eq+rmfUsPi?0J2eqEtB?H_*_>5#=%9igGEkZzS@`$*!&OZ05R}t zMpaWjM=?V!Iozo`oI7hRi)?lG)@-HCJx(zm&<^RAAWx<{S|aUKkqr>HpH0w??tbvO zyd61IQ!@Ba=@t=A*2{1}!Z!^_f~z2cvX5ud@l(jpaA(D6tw%Co8r-`_{Q8 zTF+BqhDDB5c22I`yGO9k6*sjF9t8QaG-de)j5M&=J%CY*!rydZQMR$5vxRG`r_t;l zlznVJ!6yLk_~Sx=S(H{ca>E^vaE`po8#0)J!97w8h?MWy|W_dbBInFy1 zbyMl8-JskepPNX2LEqMUQoV3!)oiOTO$zn|t~_yL?smE@;D&tE3QndagLBi+8LHGx zUG2G`q@NI#M*_uc_^N#aPM7bu{8LZ-D>-0fVE+5OmE}Kgxmf1B+3aKA*`W6RGhICvW`p zc8N7i41f6Tsyd$tTiB0T`3Suv_NiUv>#Nl*{mA_oLP%$=Y@%?ed8i%8Q;k9IX5ZF< z+w`&S*N$8Cv@$+K$~im*ombca)H3;`GxT`cM*x2d>{Xx7@DHf`>(Bmk5@Tlkdk|y! zPou)}|7TSG-}N~o0TVkD1H-@HnqPH$d20=)aPT?Z{CcO=YNQ!oNFiNICGE>|l%W}o zUCLnabv@%SbSe86G8;h#^Ca68hX2 zY_Bi-0z$2;df3lA>dJwSF9Vfpgw<7PwoO!18|9JEYM-j{)TQWqF#Vs#s?KoTPYJd`u zU@O25Ji2&FqCCbX0Y`{;ls`F#g%Y|-20>&zb$;K=nRy$i$oSQ4q#zI zfUgN}^FD8o{>{M^qh*iI7m;TKFCA%ip>#&6eEw2_G9jMRzbE*JGv$DX4h%chZ`x#( z9fX~ftlN&K#^HZ0UN%qNKZ;H80zbE7&&OlOxWd?_jI9h`<_q3EmVm5UG&xU(BFa4{ z_vkWr{%{KVX!e0v1Tdkz`9iuPF;j94uy&kp((i?>P#4tj5|COt55rS8NClf7rmAwl z>Q0OI^Zjni9jq@_)YHj8NJj+}v%p$^+dL^wa-LSWsk-xFVK zN1Waed1e5#zEHj3J8TN66fxJ1p)8$!HEZ>Ab2O2DIyd8U=u*6*M*>W(73Yv477vi} z12QWB9KRQe{MIhuf%4cvZSq`$U29;u3D+9ki`fhPo%p#-JDYp(Q>sx3DHSIn#7x{w zPqL-BH(Vk)9!Rf)!hb>$b#)f4zO<%a4I82r!!#E<=?Q*eYXKS_^IXw!NSn(e?XeOSOb zOxrJd;bT^dAUIWDP4CkE5*4H&z{6VkP zAG&sR3HZEm`EWVA*5?F+z8l%DX$#Cgwl$Wsue+yvz?aBDDw{|+4xD&W!e-Io-1A6v z*0WHw;8ub^S={KVk$0)NHfuuJfnN9v-e60f2FgQpL79V4@}$;u8>Fwko^c$n8;^v{ zgliS?+4XscMC+C_b+m8LYt6vb>Kxme`GK7+lAU38-+Gy{!k{f*OA!j+VB2tpx$i`# zJ;($8#Nj)zZ%AYfOib$Fe3k>*t>{oEI9;z0%M_h&+&ix)p@;DarZR!YeDV~XcIWccLIj_U4dMk?iB(yXtR&B1M9FSxdZd0iT?yopwDP)O7D)-n_VO( zZ&x)ttRoR}pBTY`ULTw*s;vm)iwSD)W`AcFGx%=kQrMlf2+W2Q6Sg+6=7zi)`a4^- zkZzE8#z3Y$hjX;rEH5?Jl$s%w;?C|AYii%HKBr@a1`8CvJ!(88eHmo_(5xLrV~!W$ zW_FfOmZIKuO`UH-zHbnscOh#Jt2Anuq&Y4w7|SJCu)NG?VL_1H4YfBCCgQ0J&~abF9qOJTbuKdCBCJkH_dY> zmhj~gywKlW#H=w?^LUczO@jL;6NDqZ;d=g`r#p9i;TzO*bp&`G4WOUkJUd{qsZzaB z&yIb;s~TyYtWVI!Kpw_H!EgHLKG-(Gejpt+`tpU1YphcZD$LkHxaYFY9_Izg$kg)+ zmLNnoi>LK6Kn-R{oFrkw1qxdWla^^qAXQaV)Dx3Z(veY6&_G|_db+l;D+e>KcXHyX zTc*>^#_5ZT(O^AtRf<)~P#rQBhgV=SpA%EM%T+{J+r0&RY#}J3fy^|SXBfA%1{C<=p8^e}XRYeg06ZZ4Em&B1?`urmq zgmum$aUrxgT5bqF=~uqbM??R3Put9?qF$XI?=BvM-h77fkd8525dN`^jH&iR>yaTM z7(1KuwZ^KY(F>bKsE5*Kmm7Q@kF&?gpc=YlSEqh7$$`!F)&>mn4iu5K#^{jtl&nsU zq&Kq6SdvRTD`ZtvdzOUkjjFfOp6)T;x|b?F#YiW6#Ijs_Y0dIn#1f{l&Hjt4bEnQY zS5_DGra6CV>~n1nM=s_*GkO~eNbDJG;Ey;97ox&t8WExg8X$x6lR!Qrx=;QFY?Z%lc$JbK1UJJWAijCA*QPP4Q&tBP|^>Y9~@{YRk zOH%CV+v~D9#Xw&q+oo=d_BT-Wth2!cb)-fhtY5=Nq)`)5tI9Vf0S0to7H6x? zZgq}|TFf9-JziN`-VfW`J$o5T#(7yQT`#%%+-oyE4W-+hPqW3j>t@nyJL{lP7=x^! z^)<*_61xFe4KOWuMz?MmHv=7tBRt$OB%3e~J);`M$%u!L(M(55<4toj1ZeN^Kz76G zL{WO*23H~LtZxr3HRzU#xVvw0gp`!7nA%|UBp9wg<2;@ZM+qU{AmpIQ3;OU(We01f zVzYnG$II6KI%DxH5#FG`GKvUZtDQ(;Bs;<&CQ*my9UbHwt3zTmx1uJXVs z)bfi^#cb}}0(n~K<#cg^l?xRHZ>eU1^+KI%U0bI!=I!Y$C$`Et=#6j`?vtcVyi2`J zyl>P!>cI5Gr}O<09Oi{n?o{qHuOZjIyZF7~OI(BB^`q;W^%LLu=6uKHL+6G4bEoO+ z8iK-^mTly$fAvgXA$7<=-8_XYWG&Z#c@i^2)|RPwLq?t3*;DtXexnKY%~^QLe|)AS z$3Pbb6GNP9h$CAg3^Ch-Y>$LHC=a6I$P?F!DeK5FWRoxGo4R;T5dXNI%{bj4GOmrY z-YC?AzxYUa-Svu-w#p}br!%d*fP2xi;JtddlE3PP4?6RY&EDDTwdQBYI`6trpK;n( z2=CUqP?TSs@d~sr^g`b7TT-6f%c)zB0(DhLU!q}m&j$a?;GOMdqNMEEF-%fbVPj<@ zRGLAPfk%kd|zNh`gX_nKqAO(-{^2hV}SWYiITYxbtM z=R?Ny3EM_>cZG~zg6`QSjfX^UW#dffly!+!3akm6HV-f5!omXTy(B%GXN2>@FBcN{ zis;JDpzWe`M!A~7Dj|g~DiGDG^+ks_ zm{fksx_CVEepqH}Nr{{eDUIZa4QBE`0(7%=7Rr)Fnf6*xpw8u+hGF|J zR{<=M8f%BKLi&;U{m)_WsI~n_eM0WF0PgM?o^0{oQxo;6H?u=F9u3_|9%T>h-44D^ zcgJ(b!UQ1Wra}g46_e~%FFRY&S<>#z%Na(;%BIUaLp;b*+zMeAQju$}sTO98fg7wt ziKr%~DM=rar{i#T>mMk+SRM8EtF&l+-@<+PG6&WlLNCuvcWqB!SNfD+zt^tb+GgEG zX9G_H4sv2vblk=LTD`n-zO1$V@Bp}SK+R9RKawwG(HFN+`Tfu~Ba?gVJS8)JR}Q2j zvS0*(FpTfj6}KA@Im=FtWRl5;@KO&2l5%b@BsM1ABdKZTEv71;PS39GUez1DBZc9% zs5IZ3W7Zzbnsq$l#@eUVi3aD3|i^m9tncE z4s8Z37}`;t43ddMqw^!sQFOF452v%?#iK7ZMe0Y6pVujh)`siVE9%Tj73YfEgaYlG;~F+bz~kjt+YtLZSpJrdo+e zClTALv8NovR{tc2TH)N!W!sxRBO{BF;eDObQ@2!(Ep;X@SM7)X5tBPBI9tukaqmNm`KP zrDpM5E=UdlGfU&==jXMdGi3=Wv>`s+IkZ0V-?=t|h&0{MGTqlStkY82CXbd*7q+BL#lEepd8r zK`iy)KH!h3VZE4<_b_$TCQ>ehWW`+pNg?+R@_epuIH{Y~L9+>Wq;9r!dU*$9HX>50 zy@WX{Ml(zm{gL^)F~4+Zva4w@C-5lYBpaINGU6T*1`eFLJb1?C?_luv@VE9n(fZKyBT-+pgw95}-VDmb=o#1o2u75BB14!0HAS_9P~;Y3^tD`fy?3$Nyc zgVV0&sgaXaswI1EV#|st3p!+)t}STzIk}c96*_4Bp+nY&abJ&RumPJBrOrDkP1Ncq z>pXaI8aHgs2VcTzYc9DMKU`=f#KE|mp=>|C@g}nGcXj2bn2$IQIZqO9b6w$)i6X*& z{vnZ$nd&PL9)b<=T|F%DsHU2ew0z?0mDVw{2HHoiN2bdUaOy=|$~kPHK+r_VHK`?- zDas;+BsB8uD)BVMRaN?JmA^7&Vn&hf!D*e9>#8a98h2fxuUmf7D5naiI-y0FtoP_E z^GnZ&o)DrRLd|25bPD7SN|s?8YT(R{qf}Gb-1+8llPlTW;gHoSyI6ER@2#I8K}#lG8^W4Jlc9!|M6%@y z(Nt<^3$`KTI)%mzlUhlA2$(bBJ@Ht2CQr7EBH7jxt-}2KQ^6m6h=yiD%9K$9!YDS$ zePLtq))-67;;q?ueY|fK)brjs?}n@kC!11nE2J$#<9t?VaRWmJ z84$x@vhW?i8r*@OEjeS8fWv;cl4(C5VFK2cgC?=)pi*6rcG8KK^{|s18=Cv!yM#(H ze(xYR>r>+)#LkWO>FDVx?dg$OnC{^=GCO=X=~8dtoNC@LB(hTY6?NiVH$0K6j?S#n zvocd!Ew7qSXZo$Ay{EH{ORQ4pS9)5I3#RE0ow0bGU8lp^3AHyI&wA!OVzba+p-@|> z9U)Igv5{g^Cu&5=sJq7b+ChSKQ_b!u%2L@XhB-{7JmowkhslSlyR-sy@&!%#J^5_} zYW=ckGN=sWKrrBKfk~ic(CvZSmEdm59T9q52BV9EMH^5{osi5!&Z1 zN2{b6t~5znCK|3B7K66Xdv~4)M2= zTA6AZIGH+@P$^UzW=0O`b*r!x=Vpw$|2H+4`-yufPbV{;n6^KiQ5y?r&dsXAjne)!U0`=3Wpjk~_{$^yyke z2>3?gIiru9d5aINW3`HJ+njizYN^-PNtGHBeN+Q<#r$D%Lu)^`}{7n9Ha` ztD$NDE9;DOh0LVJFB006=@5Rka%WzdZxPKL9w0sFY|hnn9j&br;JLA+i9&6XJq^K% zV9=?4u3}nI5yl$QFC+)mfvMFO$tBmMucTBAYiyy}&mw>G9JS&ksWeWcCNO0}$dxsY zE##@kdMxT5lV*1JWCZWQuY=AaZ==IgPaZ#=4MUGTK1`lJn|uvEWVbBJW4V-eQW&Bf zH!Fv)hb@&Q(U6g)D{N+LmVPdIKC>HpgK`?U6J485Uv}=E%Q62PE5eC~AAMx*?9f=E ziyfsjZKlpn{E&2&FFLA`y%!5n<4xucEGT8k4UraOsn?l3x-j5I_m<6UrMOI)0Jq#$ z^-|#?^A(O){fv9%a}xK~OaCE2-!JK+HFQ%)vr3|=JT&U!a9XlrP1;d}6F5XTZ#ysa zZ7g%t;q}lGCJ#(BeoF}hVe=FCg4<5{?X>qhrK&j zPBuTy@ZcQ{m&*5T249t_vqKWD??Ty0Iq@=wu@-XpZNXmby->nKM)dB*eqvgkDa&=o z4L@Z#mHZeR@1aG%p4>Vf`&@9#+eiY}BlSDRdnN~oI3OZ--k1s4cCUUoG89Q95x1h` zpIM>a?EWAVOEYY8jh9R5I#Jt!NQgf#;3+}GfM5f0tP4JdG!>?#NSC8t4Pvh?K$n)z zEdUnAsiUx-vIM4gkd%N59$<%K>PfWC6+CDuCJQy;73FP6B8uy2AU=YfR^RmWWXo}2 zaLNgEJ>L+0z8`4#*c&4G{LGuasMc{Mt3Nobt^F*Yw{wTvU;gqlW#ChuKP^SnMMAM9 zeq_Ig3$v%FAU#llU3U4=gq z@$AvkpX(^_?!6CqPQB9LtA^g%-E!#OcV_@HFG03}=R>xG{kioq6X3DTXpmo{ylh6l zU|2Y*iBYP9ZCt2=f2aN<*1R#5F(2*Xq+T?Q$qD2HcEonidlyTXKK!}^D+jYNZ3E6S@b$n?KEUpf5jQctiW3twT z&+rbqo}y4yCW5QQL4XRkI!7R#NP6qigm5wbI5@PEgPrYnSLW11r%0#tjbg@FX(rza z)2o4X4|bny+#N_GD;lgct(tGL7Tm$06hklU4gHIO*7b1>{9<`k``@44JNg=n2{iP2@e9eGIY=14TN2VzQf zXCvvM)P*BrO^D6}SiO>lon3|ELclpx%?Jme(*rMr7ByH^ifGQ0Y{qWkK8bXclR<=j8DZGATf;tt$}f|rGUyVg~t?D^9vv? zS>lOu*2*Tg-vwO;YMRZELBKV~m6CWe(__~Zz!>8M*8;@T`o5`P2ZC-%zGcFl0tAcT z>O2r8@=3rm;c(a(W1%cSzC*!AdY!2-#K~c0O2FHmsT`1I$CK#okE-wg{VNBTyT?#z zblj@sm=x)7@l;!E_3(IJxt*rp#-OCqi0nJA5}o{7!_M~32kvw+s5YhGJczS-0-hvX z^%~27+|wE@9bf0|h@4649q&u)3`p#{Txw_=EgxI(SxW)RG=^VsQOsPDFjyQob9s2k z!s#SzD#v|4L{4D^0<);nhU1Vxw>L2kT%P&OjcCd9!^C>y5Sg&gfp=I@5QxYYQ2K5G zAEb$+QfAnL4$IeFmL$-AOZQkolU?7gW*Z-(1ux`{Y0dPf2~(n`_=DO?~mE#C#{_#FbSLP5zF3??ghUQ;H?bE{a(@GrcU2auiu_;8pQESjbhv^wIFyb zNyqzqih!1$E24lSwMR;gH$2n3%T(mDu^tUCEBzs}>{maJt4+5dd--}Mqp!G-FsG>%dgb@%|@E;VWP!n%|AM`@4p_`E87Xyb=yBUH0|!UtJ~K-y7z6DJ71Ar zh}Z=z_>6ofeEZ({z7*cO@4BzQMslXH$UDM2J}jRLHWPj71e<;!n2$H|hkn=a>R&UP z<;tvBKkM)Mkw11hSvO*$Tsaw%DSru12;UlyreIivrLdQuHt0J-Gy8i@Zlb_YZnVrt6n=*X^;9xl0F{qNz{Q+}TxH}S6b zBNSD*?6ma&g z>^DVDuUsxG#hr)Ye1aKdgI1w*sdB3usVu#8!1g{if0%+H;=E@T)BG6|?)rSuT$+?* zg5~#Cr2D;S?5lpR>1)0BCwNZSFdVO-mNCs<-H{>IYkJi+kKelHHRlyB1sp36nl7Sz zhi~VjSyK#Q%?-37dsS)eq=AyA7(Z_J;0rfkoAi&Fd7K*SeZQ|b*r=R8`E^=BR$Z6f z+x>#EHM(xQi3}XSgnE8Drb>0*(|vihy3OOw*}R!9eUN_WN|XZvm!!H1`^Nk zDDmz+)nh@DXO<-h{~IsBz&d$H$o3UBjILWd|0_;Z9(zn}cMqQEBgAR{y1HOn34Ge? z@FU9Z!_hRh>IvMvDAPyt_`G}4!{;iJr&M5yT_$prgEwCIeT(jr%4w24H~N12y4T{C zP8WB;WfUns8zyg@Q#3c+9l{c*0~d#A8qFF8e_><6_B$8~`$W_p=uWh@01^!Xe~*T~ z?+0h07of3MyqdqkAFg)Ccj}?p#9Pp!vIsZLRtCMepP@bpt<~Hle?UoK^LP6QJZ_pN zQjrfo*C(%jhFN%gRnA2Cwp~hcfXQ(NwHK#g&;`Z37vWwkQv}hgJ4_}HQh;JlIVt)} zZou?}%}a0KkUG>|a{%K+WK@|44nnJk;B>S!Z*WRR# z0!^^m`A?_je=MI7e>>GViQxm1yaoT-S84v*Ut?5sq?VGa^IIY+D7M8N*ebEyW|TW3 z_B`rR-k~CjL2W0xGxtuDigNZSx#g4g%(S|H@1-|f^GB>xNB3xB7QSK*W}*8A>=8262MVw`qux_(i-e zWtpdl6>4P^slp*qr#=Bx}!D&CI94|yEOr2wsgG`s!a z*#F9({qcnQrgJfim|z|JG)?%tuKG)q3Vfz1`mPJ(?3>1yr}v$rOaT*oeT>pn_`5qb zS_YHD!eb8!l2^j#f%daWm%8M-!4JMR4klR821Rgp6AR=;eSw zL4@Ku1%QV}Bk=wnF)~|8(8eL^juDIvEf0SWpk}fFvS1B-FmA|}C@*~vBbPYM2#Zcp zqDPq33(z?#z!&!hnD}J3NBT&;gsGg~0_Y3a-eI_=qWLwl=a+<|;XHKYUI~z$S*0n` z{h0az8=ShMm<|X$G}Rw*2@b;+a%nMag2Uv5?9#8qxTIZD79pY;5N?7*i;FHj5L{7; ztB*pZIcvH>cWksr+L%8F4gvPR-5AJq%G27X1jaH-l!kV*TZ)}bC$M+ zVc?i?F}Mh_s>zg0GR67yqC`;uY>#b9Wt9Yg3By?=NE{evrZrdjvH*-r;H>L#hXS(Z z@L=oyJ?p5kTUw&_?0jz5OchMW+D39Y%^RwNpG};iom2ypOpTXEzvKhzy%j#1ZCxxmTNDM(DZU5Eo3;O zydnG5i3`(aD%E!+dJ?CZQJn5e*tDl$n+*=+@gH3+6N3Q)xqfXn2vO7VTp^q!y>(`7R#sD}LNz5$WXM zW#8LD?gFnU1^1`6=Fc$J1{&D?!Y!nW=dI4&Y65PqlJN@~)5o5h(;w4-we3NbUY&_{ zNgPP6T?jsT3i%o`iQz zQh(Oq8Wx`xYY}_|A@1eGJrBl@zU4i9=ODhKIM^WBP(0e}5y<~&y@kk$3j1@q=j~wI zp>VDgmr@hJFQ)w(GJ6E5#`!T#Q7+-84%O3tIyA@^RBmBJ@ zueJ1`*Cy_rsvPNtwgpF3#D-}h&JHfoRcV{4tS6_VA?I!fQ-C0n6=7g{de6YH{*LXqU*+wZ*G zsOcbtd;Q@j7Jl1|8v>Zo_vQV!{v#*YVT~0H#ul8Q9mpyD-ef2~*7B*^A^YJ>{P>Y# zeWbBLnFl7CeSL<}<@x#GHF>imQ=;GTBL~3WG1Cl>XY9X_1$c+9;i+EyC5_zdS(z0_ z?&*eKNJ^xlo+(Jzhy6q2VY(RRh&C~I^Yc-d2~h^7EWAvJd+j2@z{77pKP5?PO}&EZ zhMtGXR6}5}qZz?u@bC!{VsF6v&d}cFkukdw7J6c15k>cMl7xRSvf{@+sE9qtc_~u@ z{azno;K3#G8BeHt_hxTn3j zP{FN9lXDa^?ChfA2A-w_qYMMec4K)v`NKf8TlBS%w7PCrTVV&dQ- zsc2gg!NkTO1ZIaqG6jms-^|8?@-wl6mR%CT4)@PsiR0m2DcpGP2l(`X?_%RPd>=zf za2Bn)ij9hjgN*fyenNOHC7CR#pFi5B*IFO4C^Ngr>4NemLCxBLlZviiIMcO zPOE6Nx3K=MuA)MQ3HvBZ0XA7TW7@{KVeBU3WtJC_=8O-EqW`X zh2K zDd$VhPg_O&<4!IdO=Q-=e#y;bn9-Vg0E)lUOBgyM$}cCPOY-Ds`I~hwgz?THma{A- zCT8oFcgZTa5cz^(ucq3Amzw@q_yG8&BV3nhV|amOS*meEE(9aO3ss2Dk9s92W_U%0|d0OD->;FaZbpTBlx%JT! z7E1F`xVH5snlqC3EEbgbTsVxMi`fO7;A%mw3f7*|g|f7tg(rvl%2!%a%ps|j`1ye> zzgJxw_9n)sICz>Z;r2F6rh}XF)x{;fV~XwL-wlf3D4t|ryBm6_GbL5lq$eJ}hm+o}(5SNm3VQ@qcJ$3T zJ>r)1TsTXHGCAgnT-Yh1`U#OdX$W4fL)iZz<7pzCl{WWqf^zwr}YDuDw!Tbf0Np5;z=~JJ)tyr!BZZ;xc|aQ8D*{B?C*rBs$V)R7KW+vWCl5 zrI@%j;_xda4t#ORgMK}>3#11KkmLh7{JU<&Ul+KfapWJY5?Vi?E^xjwbE$7{-9)Ww zLBY#0l~HQP_m{$51yhBC;5S#GuR2p3Ku?5Kuin8JjEKwAB?+%b`LrTH1n0eM|LMF5V~O& zJg)`y45i?kw1?lkUyi>H7zM%1sh>P_BX`N-?DqToY>JDYo?qGuZI)g7xyZ?MJf@$H z#iB6%>#;veTs9eY4=uGNu)se7szjcJ2t3q7(%sJmBxNZJ6r|iAP*wTU`WiBB?#U_1 ztcqUrjhQI4ua(N1^Rz$I%WW)Fq|y1YFxOf#O58ZMeRw@_*(oiuEq}{G?}2go$o6mK zVk5!P*@p90TSr^J&R?gkc9I4l&8aO*&pi8{vDx==c5%9jzcJ%nlR&rAlTBO9N6lbO zUq|}hnqf32ZK@$f{q&5%IHu3hgP8Bz4JAkX zfUmSeJ4KrH5I%%RJC_L9p~Ssn_s6ppb_U@CVFH2S9<&v;1M4~YJEakb1SqEq8ZX{z z^n~#Z?-=hGlyC-WB3k-njW;%eqjzVvQXsv>O+RaAYEkn{LrhV2oJ;aizgot1<(!vg zG9?x=B@#P3LRVx_Ra}|gy<2BdrQUw|a*qYhNHA+uc#(3#p1=$MK@L0@ka~3eV^Uu? zL!g~i-`TRMoi(*pQh?{BCPb>ZG@{_eHlr%fQeN_K;k~DH^<+Vni|rBj9VBFRmN|pl z!itRMb9}!|oIu$N>kE>tPtvVz={VC6dD7mht%pnpPB*Q}8>H?lqpEZMmGzUS zNE`3de(k=gek*8tKN+9qOKsvSN+XXfE+^0n`3_o%{z>?A@^tMS=7R(Hr2%|*PNJuJ z&=nxEVp~eIOxEDxPJbw?fuCK86p#-9@D%RuXl@#4+pe(Jg5PCK5j`loi2-4pPN-#$IB>&1rN zc)*vho#c6m%<4?yy$qLZ*a?H{#HpON?(_F9b11tsmu&cnk=)(Y9{9iqF$bqCr7R=@uV1Zz((F$i0SV=p zJ&(VE!Z+1H@F^@iJfo~l!IqlM@Kn+CC56VCbz|GiWHOa<>VLEo?w%&Ih8ep$;iRRG zj&P#5xqAhr7UkIQL?)?_hr~EG&B$IGIX0ITgS8W={wT>1<-FSyREW6078MM1P6SNw zoPBp5Dhx4j+NVg+W755G0!a}QKr|SY-rB6IVtJKR*QiS(F0H6aIdHr~o2E*;lx--z zg+L?I)HsImLa6Vwq%R#_W_6iN%(bS3GAT(h3A*4Mqcow$BPup2r@=|HbWz!_y|DH_ zaqmb#_J8G72!{%;*>P||?S{N89b9!bc&*nc$!@5c1?=P7Qk_63>RgpNZ{ZuS);KqmLXzh>I9VXh?oT;;@(mp!2TJa9=bxG{S9nnE* z(#dNLW)+Y;vLbP6jB6!?=aW3P(rkxsZg3?`%r`w~=CJU|RHEr6^029@GBxwIrg4s; z_%ZI>RLlvno-($btlFMR!3I)L3hV-Av--OxP}0BBIMrF3#Z0321wk zrGzhCRc-2f);w8Mns{}c*E=n4eD zU+8=EK{)|r1+HLT;5(e9hHxtZl;ief>9yku0Wrb!e0n-cT72N{Zjo`->*NP=zk)iN zx)#7*0lMjRdeG4JQP}|x!yw&YFGzl0U~x5t)-(iOIyGxm5YjJ9H3~kJCQ;-tU)Udf z#Igf?DK~#mK#g{Qpl|J+k(Y$K1Ds$=e!|4yq*}j;H;1J7pWg%~mo4T0C)VMAXy;6< zEdNb5gY`ctr~VSpRo(4P8N}^u0ivc(#*UWu06WKjoAQP>rVJuN{~UCxmNuqN@}{oJ zb~c8#iYjudu>a`Zm^%@({;m8SDlBa0rcKYr&Phzq!pKg{%*f0^%*4pZuFD_=FtoNb z7P2+BHYH|+We{>QHnjy1b8<1kGW;{&KMi_jCU#f`5kq@PQ%iFTz`p}w8B_qKHtNKj zf5-eY!C$c*Q)c3S>5|HSsgM8BY+?N$2=t7c{|9Lv-FP{>Kt}kG>sJgem(U3E2NhvS z0`%~He%2-;L9}@>ToTw*f8TD-Q+7+}8RI|R^utqSO}5cbtL48nd#}$)@HCval?`#F5!KSmE zWu*Yk|6F__(fkqkexVz8M{H`{Ki)%nS0y}!b{)?Vj(1>l&?&f8_>SV9bBA{zGDZ{^ z8~*D+Wsm;OcB+^^`+s6PX8R^Z*uO^IR}?_Hor3CWKC6R`e6GXC!fVo-550{jCfRYzyje{m&j z=w$lO`}_X`lBJ^)K*Yk(@gIE18vd_36DKT#hNTI>!bzKhgM*lZnfWj8m4ld#k@4S~ zg@xtc_J5xJ(}$Ing_wnti@!$IY>I?f%$@2HvKc((}!RdcPo%r8RK^c}o)lSXU z@*fo^;(tM<4Ex_;_IL1qiDUflJPmCBUpa{XUz#op2P+%+Tc{^A(BA}tp-+bZ@z9r(Ds{^l z8pyC^*9k!Oz#_3u?{G8RneG1G0rD#I?Y4E^s%RSLL$(QrL`f*@R~o!oz4?dYY>w+_i@4FeVmYt&odkTjKLC>S~^9b9JH=o`>V(?etG+*{9fvBpheAx zKRPlo7IOqRNm_4}(en{9R9fCkuq|{2FsOKLtk!E>^Lzh!Bx1BzeBB|zIQjA=s={eC ze75(D`yEY;B^+LD_!Uxgn;vd=;+&Ciy>nF5M3CEg0+Jn$2-KLh^uq9QMkbJmK9M^R z?VL%p;PQZ2BqNLtW_ivvtZ}gaM7fY>&6Bslx|#a{z`P=eR?jm#=&2fLw!qLD?m+6+ z3WcXecof92AZ#N-lKw8dKP%>fKr0+LqoW#lj%tjGL{2DwAwHeEKk++Uy+DMJ6{o2_ z{JK>E)mMmM2P-!3@`TjqCwGLZn+(CmD|$vOp}Em_d0B;bFt%@b?YW5GX(h~WX;6cU z6~y$7vGk@Mf{J;6TS#X5w|h~Cm;r~CSbp?)OU2>kP%C7LA-WBtx}CWIun7VyVLAhT z81T8W)$%xCv??KWWOLhz0J3ich~_!baNrH4vxSra_s<;dY4 z#49z`>yrH*_&&jz&Pq9k&R8f*!GdI^Hf`;HNqw)e)SqpPCV2c~L){j-In^_sXHxg@ zv9FU9b-VM``j^W&mIL}W@;0sjzMbql#%eASpJ1@6Dr{rUH*L0uXZ4+yz!UEZ=rwnH z_Ny3ZP*chsE1k$x5Q^o!;aexIP5nM9e`%t9BH$F%-u&4{JbE0@DDuh`sfrZ+sxTpC z^a0r&92q0`(7;N%bkH78! z|D?~~Gx~UIx9WyjAXI;v{1*DPX0+pxmyoIU*<46G5!fZza`U7Xx*uffnvMz|1r8tW4kp}ve z*iJLOaP5rs{R)ykz^x1wgx5bI6!iMeZ>8_Rt0h92NC$7G1ejZ`liZfFGtXW<0~OeCIA6k%2iN=VtwtZ)oW_6!H!!U3_wcYeH3QTk&uW4Dxq zy`okM)sIk>Kpwb(d%!Cg7Ux4N66(ctiBAWrnm9PUT5rW{ld`Nv4@BUh7(NS~M>ues zapGx38c*!MBORzTe9JO6eSoYdvht1T7)YwuXfxVqk+(#&2*q) zbH0=XNE>|RJK@$$ELZT|Uf^i1C{YpAnkNc^+=Wzu5zeIKgt*9z)I(-ZZn&`O<*W$( zxsQZpbHZMg804$FF88s^*$N3&Mpkk<3QTe6T!6o-Z^ZPuLwhD-`=k{U9c8{ybs~k* z4p#~Z_TdBKV<{}FXc_K`WQl$^Vgr80H!8|4m%K6(km9%Zr|b~HWEbt7X4f+N*pHz}n z@Nb^%T)j@bjaYFT@&myUbw{&Cpwp`9a3vN7%r zx0|V7Q&1D_YFBCQ)`P5?Gf)V26DOm#whgvzsJ<2yK^vF%;O1A-(BMskel?KMgTrYH{*{DR5dwhD0*HVKDYyFM_ z3LT{NdArVnwmx-Zcqk!SpQK=0i>qTd%^{kPu)3Ng7L+|xtT=q7)e01u+M`5;U8Dw; z^z$kKv*4+%D?p1Az%C%@D3uaR1kNaO0A%a%1rs|$F33)k+n(r} zee^KE6B*m`tu`5t92jLDkDOD z34E5&I3#~c%lLd~YO~=<=XKM&{*im-Se&;r0rnX{K*wOWJLJFr{?%hOiuGhC z#?&h~4aJH|&H}$(G*DUvsD5BC5v{wm{8#fj20N#6 zl&fgDmjzSeK-@(0c|!GD?b$lHG}=fD=zLw<digGj+Ct|Nc5wbwl|2?n4s@xvDO19tC~TG8pvJy2($Lj33kJZGunsZ zphyq1NWybVO(vLQh&t&Kw6GhVc?lws^6EjW&6@t@#k>Z$4QUxT$K+%Wt+5}ewDdQX z$K2u?)aGYAZ59EODSJjv4i24;M^U#E=^j7QU8V-X@c{kM>@WU}xSD8Wu#-EuzySr_ zU6t_TUF+H;ln=}Yf9FL#}L2Jf3uHwI=*J3gQ1 zkKcm)%YHTtU~kM8_YMOT@&q(z8PlM}_@fMxMXgzhmRdh$7Hc-s?e>&GpY#q^NbFn2 zm`ZgJG=?cSF~8BFQAR1L+)1&j@wr33@*wjESAiXfg8~S31F{Jxo+^R7DCJp1(J9I? z)Pd|)6fXzq_Y=QxExmU+T!%uLw`(^+%T4mjt&-)3R~-R{>%_WtcnpOtDvkgYZTXU) z8WwoKb7MS;sM*Px57I9S4j1@C69AI)GV1ulVAGSk6y>@87l4*ljD$6c;pqo&geAJ)g$-Rqz4 z5r>{g-?i&pqs%Q@#*=Er5PsXA9#SC=wH61P8kzxwP^cPVF1O`{Kb6%HuxQQJSNLuo;Ad$bQZ?H3wKPoO%%J5BB$ zNvb4qrEta2RJGUY?s4^Vnn7>~6Bg%8${rSt)j!tF55t<}$eYVxQ3w8^e2-IDFZCdkl@OC>MaA;otZF zo3yYg`{PgNN-V;4*Zq~Juh+3nT(UDTP7k^*Z5Fptn~F~TC%)1BYW7ZvyfIc?hY2Qy z67$c=1W=~G>0#YK?A zi#beGGg5ONDnngxO#5*N0|={V%^%|*wgN}P@U4L!%#Nelv*^!6or9}$_x+Tu>*~9; ziH1#g0w0d|c-c|24~QCcHPo)M+!ADia5O@ElO#_e)M*kxsf`v!QaahHfZI}Hy;Me7 zI6;LXs;8YaYJi1~X^$&A*_~v9#09!N(Z)cbHudKxx@R&)7(&f)?m%7Opmsu5()nCn zN`ZP{R^8*f)-R##EKro~nU$51&yS5(JQsGyz>p6`k3D_z-|I1%C0CpYLXknFuc#D1 zkwz9;bJ;xtqi_xs3reJp2>8X#mFE<3*?;zVWFil2DPPm(LZRPa`iu1_@B~BcCfV!l z1e+;G>$Kd=G?*M#=|Ww?iJ$xp5p!Q4Opl}=JnG;*q}Lj?V7({+!=zyh6x6#7R;nyGCdMJ>ElhZ?u%SZ4{k zEN-*B`(sp6CDCXn`MUKGdpkw!bdz>?+Gbx@4e-bos8)gZw)yL$MJ}*sfmO z+M^yz8~({fcn3Q|Y<+NIw;+_9jhf3xBvn^8yISx4=h;|uj?b>7h1YY21n#gbPD5Kz zG%vSXUjfr3bZnzpT(Ow~wL8G|-1y)ofdV5|VBw8M@<4E=!3UT^PzYpLpeY?Ory@(o z#!3`FD`Kv1ai3GoDj|lXBk#YXd5*knlQ^-aad3TltV#0pcnQ%OY7c#-)H-sbd`r2J zxmX@`P7T0cF|p^S!&i&Jh2FnOZ=&YG$fK@Urc(Ly7(lx#QOU1YubmbIBhGS*5kKtqy)S%Q0$vMZ=7{33)1cd zXh!f1N^Ad;VGD1zxQj7rap8BddRwj_Rva?>ja-nY8WtE2FD-ghb(DD>>x=gVy8d}b z!oK%=dn9yOZfnECAAZr5z5P z_y+iTy=T0qCVy{~Ub$aI+OjWx0DreA#KreOhLIvdmZwp_@KS!GOEXxbW0&BUQ|q41 zjCB~krKwkujF|pW(-qUEiu6>_u2xRBy(v0GfH_ycJC*7^cwFz$R1Ei_2I0|CHeULp zph89$Yfh{eyEtF4jpmZHPu1(2qpR)p!kS|bIsHAfN@ecjd85U+*JRI<@UnP5v1Tfb zS-LL{H+I*|^i%#()tlosPU*I;>Adu-m%#tKfZz7?S zlSL%qmHJ$)R2nw9twgyji4rNTujk_AY*CeHQ8^!_9+N9!h=(j;79|eZfK*P*A98_w zPCPeZULm1~U)f~^u+2A~iXPjC9;f*J;3V&24{#a2I-cX7;l2>q{+<__aj1sIpn> zJb8eL0q>2>Om{EIU75HejT@U}0P`6Z1*cnPLGJf52_wiPfo=nRVv&}4U}+Jd1n2D$ zisF0F)Axd?C5brA;PVl&i3wx%Ts3$Wq{)7hZ&k#8892ctvV3NsiRuKD=joKp@6?X< zIajmXl^u^-bhN*sErBTff?VZnv9Cs(0-t?de!91IYn8Ja#3YChRaS@CThdRoa$~6z z%S+`G&UDiO8s#ofrk$$2>q+-jGF3s52x08`lZK%6LGGbK?AVV(fGo4$0PL=|-X91% zD(eSrXQXUZSyfQWG+5_g$Ng6pED9-K{k&Z3a`SAHoU>q@!V5GDAPViyjyGmfn5IHz zZWKmG(R$Vi^fqH$o@~LxJvbRYOD#JbW38X*VmTU@Wr_zw7n&cK7lvf91Q)t0Tc%>? zV0AuMnS@B)>mH~pUHV>>PB0dE#6)kMZE_NMU&Ug@0^d^4Sc-Sg9j+V`EN zpL$DrTf0lUTcdwrX->!9}F{S1uE(Z$)w{sq5V<}ihi{GYo^trp7 zeGfaOWYgGIc=@vo4s3uf@w1i_B8FmIc6||2Y-;IevK5xOTpwyT1Prh+{+)$ZD(~I5 zm-#+A&4>epbKPtY!eQ)aH!*k~_`&;E{QjnCSr^rf9o3b<^6 z7Pr~@+jP+jc5K&yzNwdtW1^QrDyN-`Re_G%UI{zJ7)@~Q#{~9}=P`$a+!U}IIGCRV zuasloH8Hh)79!@w%0*%;5eWo!S$dd~j=!~M;wEz5(one|K3Nb4Glw6Sg)X?cc;NEF zAf1C|I>B{;OeKNMxeI1hu&#K+bu~2HLmL>C1&v83{`|R*gj9}=KncDJ8IQ$<(h{`j z885`@iE|=tJdoC9yo!Yy%}g zdN?$DK)`VS8B5D9vwEZDae(f2!3~7d8N`Bs$li*QwvXlvJV9v81&?=CGvwmJNF=v& zL_1+qfX6J%R0Ge{nY97(>M-=x_EIoOMc|z<6HBC0G>}wM&w;|ni_ZEF;6>$O%;sheVt@Vbz<$r z3(z5y$?(7h8wuB!ky$)H)?VBtxoT%CrMdfu|)$pg(v*OWrym4-cPJlxdR2z%2 zP$fo#hk#gZfQPnKDJVA<=`0d&6!yxVOV%@DLWA&ZQpGR_awu%UD&V2 zeJroZ5(6IN1sci&$PZ)jI)b;Mpa|%D2#fmD(2;M&3obTuNgs~GM|JN;!+>2 zq$OoJ^il@UABn4Xbf@bO^f>wUoReRLL2dGU^=JKJi$oQrYip;HzYM7a-wvL;~ zvZ3z#jDMwY|N4eb1`LrDCo}~KZm5D9jB}9~s#~NQPRWTx8ce;>S0LPObGXQ{YtVb) z|EzBLW=E9slJUXQ!G|@tNJYhxxC%KToPuDE&N$eWE$eHjD1E)4ck0a?!jjzgk~EwC ztQnmiBFQaf&fFJV^sZQKe=Tneo-a(+U+=saqB&&QR9aQoW*TBzgfW))0J-}(A-?Gy z5?%Bs+4=NW9}-?uM$_8IE+AiM7}A@@r<(fayNDaUyh5N8@A0#X8*+_aB)GGpJ&48* ztxjOG0b$7uFofsj12N>@HLe3?8iXdG&OW7BhS8`OWjqX|VQAC+uEj(nMIS1N1G_|Y zUjerPTu?%2lZ{q#2isD3kx~Vu)2dR;C+~FP{hL@nid@?#oO>-$Be92$kNMNIKZrwP z!qd=g@Wu9aRm5Cg|Fv2o`@@}Y*_yki+EBwmt%?a-2`mQgW`o`4nGo2xT+EpOLV)@u-Kj%a zb#Y@cT2x*AnAV|J0BQ{x|MBw*N~#Qo1U*KHzm>HIl~Dh%b1hRNS*@gM-yh0K!I;PSdWRGM45<;5Ig$Y_L0cVz#{Y-7uZ*f|S+hj~NzmYK z!QEX0!QFzpySuwXg1b8ecXxLW?(Xiq9dgg<+|&K~cAxRayFWJURXVHct64Jknx7ky zsR(nflTj!yig-6FaPaX-WnLNrO$@*b?DcjnzoqAm_QirfFv&dobajQ^b2Sqxbi<(P zqA;*`FI6o<-4d%YLb83K%nvOQ*qq1H3BOy9Z4Z|fuhwjA+fww#HNPd3BAm8^Wa_j| zQpM$n{(Yaurb_*nwWkP)705(=&i!6hU9L}<6B*To5+J3$!`VW`LriN9aw$SxX<(mj zDw_iHfToTH^9uGE6E5!J2#^LMA0tjhJION1!XuG8{W4>M z%pooD8KVQHE_Ep2kmF*e&R#Ik<`DG7RBK{VdTgCQYm*rDLZbEC`+KMN8$tpsScQnV zUZG?iU+?VDSnvtqzm^|{FKR!hWiR20-?@PP%w(=>wieN(0qIxkz8j-k5~;Jwby*K z+|;z3D0e!LSiw3}j_BtjFSRGud$2mlxq}SfXym$kM{StAd?{ouu68$8&Bt`eg78vc zt_{aD`EFHzHI&>eSvqgu(O(Fr=VQ5Idh*)3?K$O4x@%jJaH`>fJM?$IdBqI_%`gj3 z#$7j|X~&MPZ11>=mD4G!ChRAT_)LD_lDg#{B&Rlj%bDHK6~{Mm-5L)|g}0IsYmv7H z5nhmhclHfMdXs9rdE6KD`6|batG)Fedh-)dBoO<7~Bf0~q`9sZ<`ouk1V8srVC9Lw&t1zvr_HZ`VflEju8KCAA#4kK2`+ zg}=b8ls6oBdbu6Du|1=u+9+i2%tgXQn1|!6CXz=;HXqzIg+|#;!phs}`zK&c4m^ww zHk8YbIiyS*%uS5QG0}M;;s8-GuR|BMPkdg64+3*2XSwLk?Mjn-PgmE-EhL&Z4g9tL zV}cAZm}cxE&JCVh*Ym^&Jr3+o0)aX?5PD3hVniX+6P%72juBPwOA$_@+9+z71sijQ|WQGb;qLVgT(Xv zbykM_-H+JQJ4&J`by^h)I_*WKB1Y41W>PeJ;`(li#0$1;Ka9(FuhMZ`%@NK?xhDE= z3L|b4g?>m!$yevs5Yh2Y$0*4`CTKcM^HPZ4j_432`#ZbnIrnQr?8-5wk50pm(<9yc zrtYqVgsN=K*|<#c9Z$1#!Z%ao|ulgG6?JFAL>#PU%E(-!P!yHQMh zk}1g|H}-|f#IleR5$&c2#Rvu5e%H0lr1IQ%F$=}rf;${3zi&#vDxf^;F3;3v{hmMf z4$FB;-BhB|1WVz42|wa=Po^g%sb(JLNXJJLY;Z;>0jHSnDiTKAd8{3K>oyV| z*y5sL?mtk|mhd?p?(!dRFWp4+8ysRu{f14KS`4qwyLD&6m|>TdSd)zxu2w5^ylZ3_ zx>|8;oMqV*+OD?iDyID9A`=t02QQZPvRG27%Vngv`)K2^@AJiFl7-4FT%D7=&>uKa{&p$MJ@K?&xFz8zNcq zXp@n0F>kGFbGQ9_dZ#PTW5y4*j}_i~2&~VC5_K(6OV#3&6ST@%BlS*TPS@L&2BR|0qam zr%tPiyHoW@FD7T}XPlYxOd)0j7X@-U0^`@jH+{*H=&bFK*fJ3?iG{eQ5TFT&(OqI` ztjSc}>fgN0WR!+C>)9glNoJWT&}a|_LJ*zFC(6lW7pXmD$k`!dgpf`=0ycn*e+>Si{E%eJg5@o)usAy5LrQwCsQh#Z0Xb9%pIn(hS(P3$QzWWW>V`nOULq*3m%2@Fe|aUL%2y zXstRL&6BBZE{9!nu-pa!iWrMIVikBvC(un7#?hRc#?D9?BN zk1e;7oPuIX{u-V8l8%#)K_}P`**8K-c*k`PpJ%tKpZ19htEcxXL3@X9b+2GlYiv{x zgJyz~#Fsg{$HD0qat+laRU^x;$cWbPS zj96}bx-mPbzfLj2sJWgyC!T+~I!iG9&;$y3o@KLdqRHZ6@v45u?L}`v?0OOrI?~kwuBfIZ4>PN zN?*A9H1AjlZ~vFL>?a3X*f+!TTu@*vK89+#`sNqk4;l1eFD^pj zn(7SJy!p-&7RfOJV3v~Su1z0%az7D%XO3So7;U;(W4G{ts?Y_?oCfZ(&%`fWA<~L! zjAEbt-e9sQxtqptNFRvJmz&YPmsg<1kI9_jd9&ji+yaICKJhR0WlqCH@t(Q)-bN5P-LAmgU&FXqADi$GCj%HEL zT=M4?rtTq85LioZ1%eQi1g9vJ$^2zw%cb^?(b24pinjXJaIb|U+tBONaI7z*iQPUu zE{*nRGY5;T+h@bomFEwkH5`OD1&LL6+YI^85g%^o6g44Pv&o1sM)WIn>Do9(9z7Fi zC+Bjb(T5aVNzo85)a7Bbb9XA6)GN-_`_0xAyUqcp5=2Uf3Oc5CVrM(j9$Q4@itc<` z9He)I+RQrCxzwc)TkAY(lCl~XK!YrkG=mgc!7NJ^(HcY)h!GdVxjL~pcNj9cBgsK@ z&}cnkvi>3br8Mp*X28;V>i5sn4FuZDTU32qZ3m`azIp1s)wC1zRp(Y z9l@ybyuJ=r9xR(a#Fzo-HkXHDUydY4XhY=oW|BGQiD z2qV7Ma~l#+POCF@PZ}~?x*k!YJL&#`}qvg4Fp}Btt=~^zt2mc5Qs`CK*7MK%%4YY1=H+3}D>?TpUWpefE!E7>_TRPws7LJoyN-|cJKUOi7# z4?5q#T+PYlm!N%N%hL-~7G+CTgCCGAhdRFgWRy|b5I7&!A5>aDS`Ygb&S{*idO)Xx zsayX7U}&-Oib*2{7Znf5y`iNTXnB)cgkFf#99?W(1_a)kZt~TxPyk#%W>~FR=oA|UB?ms=L%LyFEOC+- zd1Nb1j209dxclCb#+8$bFDc}(Wr@EeOf7HP;wB<0BQ;yH7`h`;a}4TEcZvqlHBpyS zmFr<`;AF$1n|akmf(r{{%E|1JtK^4ag0tyJkfX_gJGg~9qkGsAP^mMxvB=KI?ikDT zh>d%p+lS7H!v08&fX`;z@sj16kofVyz^t0M6}@dDW=PWxCXlyd{kh8d7xP=Y9*q~C z*u$S(%FI0c#ar(f5Ss7sDq~H!K2R^+9;L^iLMpf4gNoC+uxZv1 zCmi)GzO>Ne5Cb_BFyZ1q8ckl&-Ek3$D+0gm6r_VDU_eJI-~*f_2F@Sw?K2dcKxrQb zOF+dro3q+S5maGZO?W=2Qj9XZVgplWPJB`LPS0@$&k=$150EvN%*9iA{kcI+RWdP2 zWjA^;rK<;31tpyFI-W|x6aGAW4@q&v8*#JB`5(=}TE*%?yszaCnIV*-u9@sGOfI^D z#dDpdWh?vf3B0$HV~DDiv&Lg&inHVrt@Zc z9NO6s0cwi)OcAZ{2oM09V9{>ou_HZ7iDg#c7csamtJ>HTocC zJDQXO48I)vI_i*{EgKJ|*$imrDbIX%H{kKbk2QTnlSNfV-f?DqwYZjsKZvgERE z0~SG<%1XexkOqPwazh@7{%B20_Vpp7<(z~gST0y6+sF|;fpjD~Hofs|Nw=WxbAw7r z@0Bj6Oo?BKt7 zK1CD)@x5#NK<%jfx!b7W}g98W4^BYcKez{7NZZSl5azxeAf&oJ7K$K z71*7W>)|G@v!G;`JG^(tn^c|MZ8@-8w=)d##RNuJ@RF66#5&MWwsdHWLzb*WxVxag zpP-;sf~X)2nJ3~)1@-Dp)ei#s!tgzjok&Bxxdq~AN6h0#2-WrvF$FxncqFVz`Pg*g zy0=;-2U|Vm-W?!=Dh38G*F(W%p_{xka zGr|jXb9U=$P8Z*b3)u>Qz{heFkcuQxUB4JJL=Mg8`Z309^f^Xl-4yqoo5%I?JEj!J zLDSuShXKeHYC2MHKxv1-!BCB(biw?<{H!d-iNRH5HL>b>mnSeO#Jh$Ywz*ircDsYp zTT-lAr+HctFj5kN)6osfIa}{=r&IYBC$M#paX}VbJUETLk{El1xqQ&8W2Cv&?YZbh z_rVCq2>)0aM`_`HH?GEsi#^zbgs7VB>V;U&AuB)C%{ zHbU%~jS$pW%sbr(W5jop0+!EA-X;SWyW(b8)%GfqQQS7et&a~ti*+cewJ@o~8D7RU z`Z_po>L$$f+q<~XaDlP#u$L$s$s90VH0-a=Dc^i}ut;i%yL;S5niy05bY#@;^=045 zj4zORJRVg&yM(ukU_MYm7v*5~U}cIvvZb}9HK<>^(;ssKRUfl)uB=PZ;)9(pLI|{9 z51uaWq^MN4b!Uoz6UL7bQ>2<;mjq4_3p^k-YgUkBXt*nIJ}P3~FH^Ae&{>sxfkG&o z2W@M#WJ1wGF*zf=6vMjIbgLr)te!`8m1GBmtm*p-du1gFp}YdcKIGZ&59IoNrQ77P zG;@MNomt!D37=3aZUPhbJ($NpN!BwvF&HA>JB@zt*h00I-uY5*cHuer;ISK}5$Dk4 zeHnzYYV7JOw2p6P*V_ipsX92749>Tn$0v}GI=u)6S_j##ts_x32Xx#4IL7P5eWY}$ z0!=;|)0ZIMnLN9TC!&ZiBmw-;Z-~Wrc)^klJMO>|W%YeLI~>k2a_&?{HL1$j#$w2jjsJ#N z)*5uDlP&Ak3aNe;VRv$5hweqfwy6egb*WagS(RI~3pg|R7WN>~;09D1@rrs=(jlXV zVU>5xH3?I9r%b@6rG7cn9xZ;QA}!vK^LKa7jjPH?cv@(lZ$LeBQ4sqAU6~6W>}4%x zx(mh7)1R|wgG*^s{G1;GRThNEp@XC+hnP}Z@Sg+7DbFI(SOQ&ApCL!~u8o)XR*oL5 zACpUGxF48#*> zsxyCle=Ps(d+L81E4f=*Iu$`PG9gJzRY_5~Y`|(%zh1xIyg%Mr=<-9PDOgfi`Vr#g zp-Y~?bAyzZjIg8-yR|rwFOsIej%n0lc;!`(YGLV7)ALwRUT>jj4(e#mIRiYe&w9w0^Z; zNYaL-tpEspu|Z!ocs4_qdq!Y^=!XgU{D7g!0yub9`&TqF4WOd|d}ef)Chqm}Ry*as zVt;kF8NjCv#)TZ1M z=B+JK1DRS_iA3+-XQ@Hu>8sO0rYF?|Rm`a58;`I;-C@C5@2>9dE7RWWhIU)WVrjVt zMA;hFcuqL(!1)qa>d@ZmRVJ!|1?L_MV9iOk6&8cYeQOtN&P7)4 z*)`b3nFUtf;KavDC=qRsTsQ0VY{w$KFIe#7eZ`SYoS zyZ{AcZF;R9P2{BdHj9$DFxX>oh@4M)uHU&|gQizm_vgIzLU12S95}x>K$KXFOl!mF zCNKENIUBRHp7pI0`AWH}%KzO*_O)pnFl`wpe8%cyU`o-l0= zw>@{(8+mTA%~JR`n1f1{m{02v{G_NF@{y5PEMv1;vphD*pK9xqqX9R?NRF(HQpMB5 zv($7HHs-t-XZrTdb;`A0T9++bFVrp$zKEhjE8Kx#C%yqmF`U5rkRgrc@r5Vikt+M< zp8fbRkX_l^J$3L>1?m~B6lB2U z!y|3PvLbu!m5IABaWnF|l5S;0GoyiOMbQPhP{q7hrUCnrW+djU$<|Lw#t0FS4WBS9 z1v41l7?^8JcF$qfLi5Pa4n6Nr%dQM3$^sl!-sh$DlyWl|Jr$!J949fk@d>|Bb}F23 zTAmbghBBL|T#Z1YI7qlqknarnN4@twD|oBXiLYO*Mz3Z4G@lf7PRW;A+IZvFjH^Z6 z)e7(@th74XE~p3OM13w^#~Y@ZizwF|y61^h)rfee<`)Urb=X!Td{~fB!JkIL$#k6Xt<8$fS45O9J;tEyFytJEkB>S<=f zhBszxl4Su`nR@RBmEf3m-|0+N>PrxhT`9AvpC*W_05q>{oq1$BDw_BMWbO1C@Yn=) zYUW`c8#D!y5a<=hV+YbJtj*qekNDMB+YTnjDU=2Z&zU14$$pm8rH&2dwQitPqvrD> zr#JYQ4wcKB-J`&EH;^IMq;Cg+#QHeo)9cZo6;a-Cz!fvAea ziadm*eX)y&15LsX+a=B4B@c5>Fy71PfEQ$JR0v|+d8(X^uer4~w7#v}^IQUHd_U&_ zKR6o&-2k0i8=6e8tD0SF_tnj_G0(x*uF0**CEg*HMwIyn+XC01+LoHg@ixjqY{LGX zS;v7T)Tl@lWkR2L4Q7qCr-ug0kMlx8ST?ssBwsy`bO)d;D?L4zz{Yafx~`mWJzRfR z<-!$M?xkqadGW+*Btcn$zvQ16lK#(7vHOZ6&hO{-6x(5Kkd;MC;c76CmenbaR8 zqEKPVF9PFvfG zvV1d=3TUh{Ik`|xT+&uI@2BvQJ>rJr7MJ#ol8xh+rVCmDo!L;*%dfeWj`|Hb4Nci9 zm-WJg^bV#!j#*sR8h46Pl~^2krVnp*5*6fqo_p+dUU**AM5ej>rhq9{9R&y$-_s#W z(CHp(Wu6bCCL4aWWp{>aMb!)v)D>mSFB38}kt796?OW=XT?WC46BKT+?N^GP0Ws~J zQ}1lDp&$8B;Y{uRDD)`ySdEYPK2*fDo6Qp^YuAl2ik=0k8TtU))Z)VMLYta?h*qVb zM%;>mj-vWIvuV}Rj@t;X4Y1i&xkRam{(w5n2MPhx@mRG7SAxqLLhL03q7HLg?y!&Ujw z;_Gmx%2-v4^R~W<&S_&@Y!j!+e6&k#SL@ww^&9n#dG!^`lXJD2y#7d}s1vnDCd(VQm2}A*t6e@>RtdyWTpa+c`${fv^-ze>VXbtKj;&V*T zl$>EmM?r|0KNjkNb@LqUKsA`g!XZJ6nU`E-%NNUzgw1&aGdaMbaD7yHV#ZPCbh$m` z2K!Y~MFYFyIzv`b)$yg8S;Z=)!fG-B;Ms>Gd+5`1J$H+v>*KwP1&8e|{4~TCk2t#} zNs66=;&A*{&#M1|OT7zNkFvlUeOg&xQtfIz5zUOczFG;@lLw*4HZ5dNehhk$44$v& zg{+gM=wwiDcw$jnxxFS}=493%)v1Op=rvb4Ka^yxfdvb&gW>Z_2UZXY=60QLXvGq;nV;sX&^~eDP;LJ^JcZ zZ`Bnu=`oX!jZgdyn>dfTX4%dCNMj=|t>GjIG_4jH+DY^DacOk1@(|3vuAHrwqxRv( zBS97EWi*Ysrnn3A%)05Mx;f9n9or?NVsFpvEv(Fs)OYt&?MJ{2Dp}~Gs5FooA1mNB z<@b%fv~&oYwSYT6%pc+<+H`-25LU%~!h!})a|O{Fz)c8H@H)50Sg8A)#2}^Y9=4CU z??GY)N^5Io5lLvwI0}D>LhTDd8Jih2G(LP5>*bfbG1UCh67jUvwk^03dmENJ3bT50 ziXl1CFd|5)84!VowO^Q`}9+28_EYF4twlW{s1o0bcw;G6H2<7^)&OXP2vs zE_gUaqw8i(z=}Se^AI~61&yFSUbR4E-hY?Z?wbx6-jL0h3nn->shA)M8ggo%W;lNn zF3=ktC5%QSGd(4L9j_@6$;5J$v$-PlT?mGI0~iY4$laN`u4xc$u=`+v{wf}7{!3hy zt3|U6H1zlU^91@turNWly{)|%Y0sR(FPt0ocSt7fE*^W6;pB^nC#hlXrQ30i;H*<) zEWNv94Ei-X;Reoz2?l;R6ooHVysHhCe|Uq zZ+UV(0)lfN9nEhL|W&Xd#niMLXd&6#pVRyD24Xob9dK0!BGhm=It4dF9pu zY}vZe*a!vHOu$(tN-8ULf_OczxqV{QM0RP!j=1Z;%; zPR=#o@V*&UWs@=DXM7?oM=irPPiRwm zQs9X6FVn(8v!61*6-wU|B|GF(^0aV(<*^a zs*P}D=bqI=iUgwAr1l6^T)!^j6Wm6WE5%p!DD}9J?7aGU@6il%7Y}GI^74b@!ID@N zdg4ca;Uvx=95cGk-g$Fz z9LpQ@CD`Hn0^4o5!A8C6#aHGyt~+TF7Pr%nQr}W$&5sKalu>A%_(dN^6eU?LWnGD^ zjL_j3Xa_&jO0#eUzk$>g^zwM$#2xnWp*v5%O7OlkhDc$oCgQu|r?&w^PS@hM?v}0w z5PUdKcaws9mGtZMR$14FuG75}1@jPmneS8_VXF2;DG-py-1pu?7?(ap?0D<&8>oX> z>A1G%rL8|~(Bo{;WBctO6Sn9R8QWY8%IlFOj8GGV+(P?9>#KiEkK!=?dX+>#`f*VE zGYX`lRa>Dld9nPLnP7aw^sRX0`b@~@5?KcrIa$#J@RSgDwXy`&xuv6YDf)U3yY0P! z*<-gOisile#-<(bn4wnlhNR_^XYU#-=2Q1XCKpZcu-;@D`r>QX*fY^{iMu8--S7`7 zB-YwIA8r+~-jR(HI*F-7K-^@;V{bA8dHP9MX&cE=ekoFoFxDX}Kd9|6?k=whf}O|F zml{Oz-Z-AzjGN3;aVn|5a-zGAq;o?fOe|L~Z`#h_0470U{$V@gKyuxEL2evCQ=kg6@jE%$s zx0?iO;OY@FAA7hX z<%YqH_;H&hTjdA!xO)Bp6AL$V$&IH?PML=9dDPd573csLjW!E{R4<32fODa_Ufve) z32Cz}>p5cMSvc!)n=XHe3P^b7dV#9Y8PL@7_t#K$>TmQ`QRM<#I@HeOE0Q1m_WC$F z(0}aI0Y8$>VefDw1kJ9`l{kmPc3Dzm!4$4ELsMvMO)?V!R2Jp^>OsM{-7Io z?%%EeXvvwMXtyrV&Rb2L1=+-1FdB4Jw_SN2WFJ&4oV4uy*mUY=UwkMo%{qx7C6`Tn zN_ZxFxha^Gy#e>b|>-ii6=Xd**^~9JS0arwk!G z9pGSfzkKk!GFk@LkmhHFfiX!{b~^OlKINe8_xB$2jrXhhB?s;+DoV=leSJ+KwS2F& z+dqB~;*F*Jz!b?tM+EUs)cd0dlw_miyn+4A_Z63-Y7PV!PK41eJDmyJ9^u7=bw{@E zlT*VV_43>HR%02A43!(h4kV5UY9=EJ@}l4ka>bwG?%8*io<6{bM_ore<5BJ`UyN|x zxUM`LyJR7mRHb)-uH$`IU(?GJxj=LeF&x8IaAdtrlXdjFjlFh(fDJCgmUYazg?>`< zQ;2zTO8>N0)b+Vr1ww<8$mfQvso@c$9R;aHAi0oLJ%5kbSRW}ovSca8QcZ4ZIqTHZ zu(VlnO>Z@b{1Lgl;Tp~_&gW$kqVxkob(*xJ)S~i3DMTrvPc;r%lL+(7vFt5iLd;zF zweGvkelI0&VzWH2@$8rltg%b;CR9e_ce`pZKyCG-t2hn`jiY~pMJ?65$K3eTQ%a{U z%&L6j=7%o`?NMa8nZIWC^XmyYCabcC)LP&8{ad7P%UU; z{oZy^;~sFf5Wj*Gyv5?&z1hdfxac> z>{E}!#DF0hAxGaed9qz~GLdVwB=;c8!$c&Ujw6lmds(q{QYvrt;8KvD&!K0X9mv9- zd36N#h8Uw#q~_3Ll-pm^yJ%aX=YS@|UUIUpz4c^5wF#&uz_3xO_;%gg8oRJv*}5eB z?C7d-=+}1zX$&Bk963zhoU3}`=Z*`sZ)q+95r>I=62w#(fj4mxVcCLi;#_ADwS~m~ z3f4F-G7ch)d}vFv4nl-yr4m$}G)!TQDS#QQ;4uW3MIv)?QalSRikHmeqq8#{UaLW zWJtVTtb}}huuNVStU0!DJ|!7NMU12<;#4Ss} zQZAn_e)+9>=8|xv)7yBYw#u!w2}_#-{fA z^CCWLDEtABkV<5ORK!xwR`e*2$(!t|hVQ(3;{zUYdPMCrQf3lG)mta*XWm%vTgbkY zI&`M=HMh40PSCc)PhjrtX3jHo+-)N)NCNZwtfo4d-d?htt+hR)0aA3pKP zq%R_~_u>M1CnvAYAHKNWP)7=Il5cNHBC(22&A4F_K>Q zJceAt2KpAwg52_X#kkM1`?g6xC>DQiuh+7*6~_`NM(~y<-}Y@C&Jl3}*Si4{<-%c~ zIs~Y7oA?5q%tVjL%-|b%(eDu$lAKNrtrCxcxpG4xjQ3~9+TBB&4x6s2#E!P$k9*!D zLRuCV2lbBJWJ{D!DOq(9_Xo2wF1bZBmx!XYkS-s;&sgPzeYvTc7bS*pz}LvTf&12f zl9JGItXqg=fNVU!_S7kR;3PA>VSP4G${QT7^f9L{IBq|rkR2D`a_uCvWg3BuUYO9S z9?DFw6j^X!N z+IHj|mWo)mJ=f%9QTdSm$Y#pYIQvKv!FjU!5Eep%O)N0;ylnH3o8yRZM5Q>*ySs)8 zl>R}>=TU1W(b0^%r}91{pIPpVT-J30?k}gkwMA782*!d}0GBg`(S;G~BaLx|;d1hdG?Jg1 zI0RE(D6Wbt7fH>Hu%8T(B#Yr<>us@i==B#r9Q11p%xg!-87sQBYM6d2kSNDK=5%_0 z={iCENbH52yw>=cIklQ#Uaf9Eh`5W2Cm_A{O>fuN^~2Q{&_YNYoD*aRV8a>Cb#o5L z4__}ej@569R?seVj+j4}T5@A12`5AebVX~#=+Mey*F@F4jpWc|CtaZB7?c>0J9uy;HYWmz`c|=8$K~YRZqfP)*znuuir<-%g#yW`bT!d}AW0o#HBD?g`_) zc-h#4gmAQ&FEY-WoJ?d9=&4YH<(<}!))nID{rLoY*8GxFn}oBzx2cVOwh6BH zyGTaTtXvauLI)vkDmY6tWN?HUodHEQEds5U&@QOnz&2=AMK~09RN+lYlJkP5k4AiE)eQPb53d@5KW%3NYx@K2h}TS`CTfge&3*!O(4}uLYGcu>>9bm*mca0{%@hH@KmA8ohab zVJn7V!3kYcHr}(iC?-|^&n#O`a>SNPwBHG(fgaKPvNz2XF3vn@m5mesn)uVhht9xFqaWn=v*HIPU6xyY&B2&cGC~J zS?E|C9Z&ld?d0vI6`{0-1;cp7SiLe%+cpBJD!b+YUZ&5Tv;{`yj1ti@jQNtCuqN_-OC>%H33Rgli4DsQ5*5d^its0Zz%DHE|JmrrV}!(>AtZF{Qh}Fz0zYB2M)QI0XQ+5&^J~C5EPO9i<+Wu()n=r$v%tRh}wkG@&+=|Zft!XzOX)AKA zZ+uc6u4oIa2lxB~SACz^eV`dR;c6FA_q-^$7vCe29SRo8&`(gSBV}|4vtS1hg^Y|J zUkT0IDnVa22ksHXybZ5NN?3|d2^TE)&!wc_uuu?PB<9kc=z{q`X>J9EqlIiy3|AVj zV?8AGMUsj-R-8&q>OlRyH+JU%p1)4kQ{DTj!{hyBqDF_K(01CLE9c&P5UCk z&S?X&;rGUnp*e8sKHN^WA+_bSZMETiZ<^3>%Ax+EzE}GCt@T{QV=Lx)fcz;&;hwzo zQsFNVFP#eaA*qicb?uLXVa*Pmm^S0=!0zOh2nkjtr;!I0xfN=9e0pyOkNFx6zJbsC zSP*T!D@B`kaXrydmUs~1Ic=!BOWr!`I5`jY`+j-j5&L|}9Fo|^W`$J-^e*tjynP$Z zD#I$~Do1+qU7$8-Dv&DhW3=Es$bo*VrNRnFgF#)A3(InUoWFt6S5?23P9^_tuq$&Xa>0Tm6F4!eiI!RxT-Ob=Wa#jodNg``XW8xj|nY@hltr zfG>IK0WZ1jZ!-n3k7{I4JAqw#`p5ett3w-BPMfel6kUQnHRL1UJ#k;A-QwR%ZqF1S zajd+&f9hR7@Fe&2eAaPYo?JnY+&!6Cx!_xXWPz;%afG(Sk}7Ep8D+nH6ncTHb0?Vx zZU%^+UjQ;3ctSh{7@Az+j9Gx%h&od9%zAj%eDT0AZw{*w@PM3CxmTe%dZ=7-VWXy< zm@oM{hU{0okp8vde#GhNM4x*RIdS&INTSAHefMN+I{?jg?xHc1D(kWVI8 z%uaH!sUq`HRbDa z4C)V1?!cLO=oocFi<|OIdjg>`?nt{6*PQajae+r=T)Sle1dIoGNh5GMp#z@RXf+MD zuU4L-hE@2MIt>_qXk;0D$brg?{uE7@DK+KTcaJGNP2kSkkHrP?$r)@-7}P5BzhjG6b_^nFYDuC=6wPi%9pp2kc? zNi4L<4@zbG%GelXhn1!lqw6uXMQCg0S;+&4C$|SS6U_~x&$b8y&IqwjNL8i4$hU>C zV&@WRPHqTS4kKnKSEUQiY)8*;FN@+Gk&NodmVu-3J}F2GDB$_Jvp0jAQ3EVmzRj-9 zTVf^BL$DRWKW(E1{AUkZqMyE5WlK*Uu7?@(`!4p#hA~qTik(aTM8@T?UMajXRa;(D zUQ>PT)mAU?Jy#gRT-k7?pp0r`ExBf(%9B~dn@L#iie`$#+dQ#w0{irEAto&+`bLog?4`J zS;km1*X$C*j&?pMQPusfJ!<3kZ!t{FD#|68^bJFDnALYu+ zwfVZu+8Z>@EX6JD%E(ZmV&4vWJ4?N>$ST#YorohhCojz@X$qaE>oM80cynGWWT-Le z-EiyMw}g&55g>45!dI_=uWiV?{cKX@q+aBFs(T!}{iIxCE(8^JG;gvczwu{&-zq(k%-DpTT1z1uK>Ef0rXPiqmfD4{UZ3jO6vXMZJl9$+OgU0 z_k~*f(I?PB1_L>j^Il{OsC%O$&|Y6C$WdU)i%N- z(ET1sRfxk$cP19z%eEG;v$G7RBbJNz1#UoGazk&2P)y+?Z+)Sd?p#M7TvcdrT$2hw zHS}`kI$TxA$P-G%@LM2{x7)oSlbGp8*)Ta1dew+Uol4ArM`J06WYdsl<9C$ZVjZm? z;&aO3D8$2tGMDhs6LO>*eU!pcl;)8JC&6O#lw^6x&l&DHrcbt=3Rl1+4|<p2+A97X? zosyz2FK}3XN=ClPUU&hDOqSZ+D}EZ080B z)dtUbq~bJNs>)Imw*qu}M#>ZWgV8&aVE-9U)hvH>?3G5NPQ4>SMmfmy`R%97Y0*Zb zaT-JD+ZWYG&&?dtRriJc<-@l+KJ{EWZCAdi17fu@|D^d1Pyqj3^P8Uezt;SI)n5Kx^P7?WKhTTmnH$&|;xaNZ{434xsp0S> z8bq*FPRVxb22?LMYAu1_k6Q`@ncT*?usm(T-_Ut{DbBCA7B^~SQ0UoEAI|T0+mh5==5n$gWu4X zX6&Rpdv;EZ9l{qPSB`+M&W-ljQ*H>yeDVS1`z3fv+jnGY*f2!|w!9fG};Bz-v#w$&L+=SkNJfEo; z{pJvR^TlTL&SevHr*qF*f6D68g=3JvbvVe~5%UR~5$g#o^&oSF?&$!U?kTvL{hpag zqE-8Z>VCHGGVV*-v)^#WO6SS0!r{1JtKK~dr0%^a$L!?ExQ(Po5L>Eywbeaj5npR2 zaq2TX=h-C+Aam{gxW#CWhsDL7!sYNJ;PDdjn*5S{86oHdcK_W|@QU)T!sQq37qevd zPaeMR?I(oe5u6ZDAUW|L|Fg9FE6@FtwEHV}{Ij$>**S4{q(8uQ+S@4l>wKLl~IlQlexKtt&Iu<0R_tf6!*2vZ7hG5s^dh>Ckt?{U~imb@!X9K_W5bbYk;42gT z|L!8%SHt}s(QlLE--GC<)%??_{nbOo|L;Dc`)M}6BLa}rzt@iFUWwzkQKS2f{r)YZ zM)%5hza#q1qszYs(JSx&hKTmxo3JHYBs`}5QSaDD^W=KN%eSLZjl%&+-=-$1;^{$mI6Dp!n;&XZmgZ_+J?UpnyzpbDDtG;0Q1I6o};D2Bjzh=@e6n|Ya0f)0c_Z9yu6s&)ucx~9fwu@iMexdm5 zev9cp@!S8DrT|n$^CyyDRQNAP<(CQlLh@Jc2e_g8d;I}$S@$2L`MU1^4@Tw}z5GJ* zR|aMJ8SrBFNY_RM_mv`X zU#BJRs|f&ZPyp#W@K*ie+s*r*0zBlde^VeB_yR_@7L@{D5bU(Lr;N} zo_cZ|IWcvlB1_Qb*Y}NV7w>MMh7Hlv?9S|HcXsr2nEA5npPGJR4sgytG#i}%&dk8@ zSU2;fm0=cO7Dz-e3TIMcu^Dz<3m)P7!&h!Muj}1@=x!hTvF&D$-T3zB3)qF-;R!_> z*Zt5OX50P)EW0qyT^vu7YpXSiKX%W^HJ(9j9J!8Se*dd!kLr$jNjZg`cHHmF>5stF z@5f=kYncz3TpMY*IDQu6@Y40CG{_+5aomvp*gG_&Mw|vQ&i^y+7HAyxs=isH(B-)+ zXHGS4L7a!+49X#^a=h@t?mUf~=ASGN1v!>sH3rw#o*IwC*%2?|acX_VFKqmb7^T(gJIwJv}6&9=ZoGzCUF{Yp!OWPDp5F_H>| z*>taLPZ+Lv4f5{-GainOFp`GLYepDyOOeV65y1AxawG|L7h?=^{KVt&r1RJo5k}I1 zv5YYxJ*tQ%7|J?gfhB#t%k(PZ*W5@>XyP)D5k@Fdn$1^p3Da0k7z08y#z;wyV$pbz z3t3+>BDDq9$#gtHCiAJV!lyb&8P2|9z2I9@zhDvj)c2&U$b5xGp84716(Z3=$}!g& z>-C0%T8stD#WN#}R1oPrM6eu~BRPo!FSQSEHraE79Dfpu`%1%!bA*wWA@voumrre$ z(sTY4_a&3fm*BwE2k4vaBi_BKEx;UtJ6KSuuav{)O8R1@W&Q(}%@<)PiwD@z z+4>_)B%K>#iAwbn`274C>5%zPV^=3OlSWj`Fqhk>L*Ca2{*)Q{kIXwZ8$9$(&M@nr z^rh^%Awp#FfQ--f8^NiWEhKZlkj00JL@zlePS3UsJr3EX=Pv`_c5e+r`~0En27Jxn zETNcxZMR+NVElAZmp{r+E7J91RSR=RwOiC=Lxp8tdAnL#E%oYi@qZD{E$VJly)>Jj xhw-(X8(XcG)ruqrM5!sg^vj?s6I-@|}Ye>#GQg4M;<)!qH7_zMsf5}E)2 literal 0 HcmV?d00001 diff --git a/Codifieur.py b/Codifieur.py new file mode 100755 index 0000000..789902c --- /dev/null +++ b/Codifieur.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +## Codifieur.py for mastermind in /home/laloge_h/Documents/ISN/Mastermind +## +## Made by Hugo Laloge +## Login +## +## Started on Fri Feb 20 18:01:57 2015 Hugo Laloge +## Last update Fri Feb 20 18:02:07 2015 Hugo Laloge +## + +#-----------Import des modules---------# + +from tkinter import * +from random import randint + + +#-------Definition des fonctions-------# + +def genererCode(): + global couleurs, code, grille + couleurs = ['ivory', 'black', 'blue', 'red', 'green', 'yellow'] # 6 Couleurs possibles, tableau de 0 à 5 + grille = [] + reponse = [] + tour = 0 + for i in range(10): + grille.append(['', '', '', '']) + reponse.append(['', '', '', '']) + code = [] + + for i in range(4): + code.append(couleurs[randint(0,5)]) + +def afficherCode(): + global code, canevas, codeAffiche + for i in range(4): + couleur=code[i] + canevas.create_oval(i*20+20, 220, i*20+40, 240, fill=couleur) + +def changerCouleur(event): + global couleurs, canevas, grille, tour + x = int((event.x-20)/20) + if x >= 0: + couleurSuivante = {'ivory':'black', 'black':'blue', 'blue':'red', 'red':'green', 'green':'yellow', 'yellow':'ivory', '':'ivory'} + couleur = couleurSuivante[grille[tour][x]] + grille[tour][x] = couleur + canevas.create_oval(x*20+20, tour*20, x*20+40, tour*20+20, fill=couleur) + +def valider(): + global tour, grille, code, reponse + nbPion = True + couleurCorrect = 0 + couleurPlace = 0 + recoCode = [] + for i in range(4): #On recopie le code + recoCode.append(code[i]) + + for i in range(4): + if grille[tour][i] == '': + nbPion = False + + for essai in grille[tour]: #Boucle pour vérifier les couleurs + for i in range(len(recoCode)): + if essai == recoCode[i]: + couleurCorrect += 1 + recoCode.pop(i) + break + + for i in range(4): #Boucle pour vérifier les couleurs bien placées + if grille[tour][i] == code[i]: + couleurPlace += 1 + + afficherRep(couleurCorrect, couleurPlace) + print('couleurCorrect =', couleurCorrect, 'et couleurPlacé =', couleurPlace) + + if tour < 9 and nbPion: + tour += 1 + elif tour == 9: + terminer() + +def afficherRep(couleurCorrect, couleurPlace): + global canevas, tour + for i in range(couleurCorrect): + if i == 0: + canevas.create_oval(0, tour*20, 10, tour*20+10, fill ='white') + if i == 1: + canevas.create_oval(10, tour*20, 20, tour*20+10, fill ='white') + if i == 2: + canevas.create_oval(0, tour*20+10, 10, tour*20+20, fill ='white') + if i == 3: + canevas.create_oval(10, tour*20+10, 20, tour*20+20, fill ='white') + + for i in range(couleurPlace): + if i == 0: + canevas.create_oval(0, tour*20, 10, tour*20+10, fill ='black') + if i == 1: + canevas.create_oval(10, tour*20, 20, tour*20+10, fill ='black') + if i == 2: + canevas.create_oval(0, tour*20+10, 10, tour*20+20, fill ='black') + if i == 3: + canevas.create_oval(10, tour*20+10, 20, tour*20+20, fill ='black') + terminer() + +def terminer(): + global canevas, valider + afficherCode() + canevas.unbind('') + valider.destroy() + + +#---------Création de la fenetre-------# + +fenetre = Tk() +fenetre.wm_title('Master Mind - Codifieur') + +canevas = Canvas(fenetre, width=100, height=240, bg='dark grey') +canevas.bind('', changerCouleur) +for i in range(10): + canevas.create_line(0, (i+1)*20, 100, (i+1)*20, fill='black') +canevas.create_rectangle(0, 200, 100, 215, fill='black') +canevas.create_line(20, 0, 20, 200, fill='black') +canevas.pack(side=LEFT) + +valider = Button(fenetre, text='Valider ligne', command=valider) +valider.pack(side=TOP) + +afficher = Button(fenetre, text='Afficher code', command=afficherCode) +afficher.pack(side=TOP) + +generer = Button(fenetre, text='Recommencer', command=genererCode) +generer.pack(side=TOP) + +quitter = Button(fenetre, text='Quitter', command=fenetre.destroy) +quitter.pack(side=BOTTOM) + +genererCode() +for i in range(4): + canevas.create_oval(i*20+20, 220, i*20+40, 240, fill='grey') + +tour = 0 + +fenetre.mainloop() diff --git a/Decodeur.py b/Decodeur.py new file mode 100755 index 0000000..f5818eb --- /dev/null +++ b/Decodeur.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +## Decodeur.py for mastermind in /home/laloge_h/Documents/ISN/Mastermind +## +## Made by Hugo Laloge +## Login +## +## Started on Fri Feb 20 18:03:29 2015 Hugo Laloge +## Last update Fri Feb 20 18:56:09 2015 Hugo Laloge +## + +#-----------Import des modules---------# + +from tkinter import * +from random import randint +from IA import * + + +#-------Definition des fonctions-------# + +def changerCouleur(event): + global couleurs, canevas, grille, tour + x = int((event.x - 20) / 20) + if x >= 0: + couleur = couleurs[(reponse[x] + 1) % 6] + reponse[x] = (reponse[x] + 1) % 6 + canevas.create_oval(x*20+20, 220, x*20+40, 240, fill=couleur) + +def afficherEval(hypot, reponse): + global tour + couleurCorrect = 0 + couleurPlace = 0 + recoCode = [] + for i in range(4): #On recopie le code + recoCode.append(reponse[i]) + + for i in range(4): + if grille[tour][i] == '': + nbPion = False + + for essai in hypot: #Boucle pour vérifier les couleurs + for i in range(len(recoCode)): + if essai == recoCode[i]: + couleurCorrect += 1 + recoCode.pop(i) + break + + for i in range(4): #Boucle pour vérifier les couleurs bien placées + if reponse[i] == hypot[i]: + couleurPlace += 1 + afficherRep(couleurCorrect, couleurPlace) + +def valider(): + global grille, reponse, score, tour, couleurs + while (tour < 10) : + hypot = hypothese(tour, grille, score) + print(hypot, reponse) + grille.append(hypot) + for x in range(4): + canevas.create_oval(x*20+20, tour*20, x*20+40, tour*20 + 20, fill=couleurs[hypot[x]]) + score.append(evaluer(hypot, reponse)) + afficherEval(hypot, reponse) + if (hypot == reponse): + break + tour += 1 + print('Fini') + +def afficherRep(couleurCorrect, couleurPlace): + global canevas, tour + for i in range(couleurCorrect): + if i == 0: + canevas.create_oval(0, tour*20, 10, tour*20+10, fill ='white') + if i == 1: + canevas.create_oval(10, tour*20, 20, tour*20+10, fill ='white') + if i == 2: + canevas.create_oval(0, tour*20+10, 10, tour*20+20, fill ='white') + if i == 3: + canevas.create_oval(10, tour*20+10, 20, tour*20+20, fill ='white') + + for i in range(couleurPlace): + if i == 0: + canevas.create_oval(0, tour*20, 10, tour*20+10, fill ='black') + if i == 1: + canevas.create_oval(10, tour*20, 20, tour*20+10, fill ='black') + if i == 2: + canevas.create_oval(0, tour*20+10, 10, tour*20+20, fill ='black') + if i == 3: + canevas.create_oval(10, tour*20+10, 20, tour*20+20, fill ='black') + terminer() + +def terminer(): + global canevas, valider + canevas.unbind('') + valider.destroy() + +score = [] +grille = [] +reponse = [0,0,0,0] +tour = 0 +couleurs = ['ivory', 'black', 'blue', 'red', 'green', 'yellow'] + +#---------Création de la fenetre-------# + +fenetre = Tk() +fenetre.wm_title('Master Mind - Codifieur') + +canevas = Canvas(fenetre, width=100, height=240, bg='dark grey') +canevas.bind('', changerCouleur) +for i in range(10): + canevas.create_line(0, (i+1)*20, 100, (i+1)*20, fill='black') +canevas.create_rectangle(0, 200, 100, 215, fill='black') +canevas.create_line(20, 0, 20, 200, fill='black') +canevas.pack(side=LEFT) + +valider = Button(fenetre, text='Valider reponse', command=valider) +valider.pack(side=TOP) + +quitter = Button(fenetre, text='Quitter', command=fenetre.destroy) +quitter.pack(side=BOTTOM) + +for i in range(4): + canevas.create_oval(i*20+20, 220, i*20+40, 240, fill='ivory') + +fenetre.mainloop() diff --git a/GeneCouleur.py b/GeneCouleur.py new file mode 100755 index 0000000..c826adb --- /dev/null +++ b/GeneCouleur.py @@ -0,0 +1,24 @@ +def geneCouleur(gene, nbCouleur=6): + """Retourne un tableau de couleur à partir d'un numero de gene""" + couleur = [] + for i in range(4): #Il génère un tableau de couleur + couleur.append(gene % nbCouleur) + gene = gene // nbCouleur + return couleur + +def couleurGene(couleur, nbCouleur=6): + gene = 0 + for i in range(4): + gene += couleur[i]*nbCouleur**(i) + return gene + +def inverseFitness(fitness): + score = [0, 0] + score[0] = fitness / 6 + score[1] = fitness % 6 + return score + +print(couleurGene([0,1,2,3])) +print(couleurGene([2,1,0,0])) +print(couleurGene([2,0,2,1])) +print(couleurGene([0,4,3,1])) diff --git a/IA.py b/IA.py new file mode 100755 index 0000000..673a9a3 --- /dev/null +++ b/IA.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +## IA.py for mastermind in /home/laloge_h/Documents/ISN/Mastermind +## +## Made by Hugo Laloge +## Login +## +## Started on Fri Feb 20 18:30:08 2015 Hugo Laloge +## Last update Fri Feb 20 18:37:57 2015 Hugo Laloge +## + +#-------Definition des fonctions-------# + +def geneCouleur(gene, nbCouleur=6): + """Retourne un tableau de couleur à partir d'un numero de gene""" + couleur = [] + for i in range(4): #Il génère un tableau de couleur + couleur.append(gene % nbCouleur) + gene = gene // nbCouleur + return couleur + +def fitness(score, nbCouleur=6): + """Calcule la 'fitness' d'un score""" + return (nbCouleur * score[0] + score[1]) + +def evaluer(hypo, repo): + """Retourne la M et B de l'hypothèse""" + hyp = [] + rep = [] + for i in range(4): #On recopie hyp et rep + hyp.append(hypo[i]) + rep.append(repo[i]) + valeur = [0, 0] #Pion bien placé / couleur correct + for i in range(4): #Verification des pion bien placés + if hyp[i] == rep[i]: + rep[i] = -1 + hyp[i] = -1 + valeur[0] += 1 + for essai in range(4): + for reponse in range(4): + if (hyp[essai] == rep[reponse]) and (hyp[essai] != -1): + valeur[1] += 1 + return valeur + +def hypothese(tour, grille, scoreG, nbCouleur = 6): + """Gener une hypothese de 'puissance' 0""" + if tour == 0: + return [0,1,2,3] + for i in range(nbCouleur ** 4): #Nombre de possibilité + hypo = geneCouleur(i, nbCouleur) + score = 0 + for tr in range(tour - 1): + score += abs((fitness(evaluer(hypo, grille[tr])) - fitness(scoreG[tr]))) + if score == 0: + return hypo + return hypo + +if __name__ == '__main__' : + reponse = [2,3,1,0] + scoreG = [] + grille = [] + tour = 1 + while 1: + hypot = hypothese(tour, grille, scoreG, 6) + print(hypot) + grille.append(hypot) + x = input('Blanc :') + y = input('Noir') + scoreG.append([x, y]) + if hypot == reponse: + break + tour += 1 diff --git a/MasterMind.doc b/MasterMind.doc new file mode 100644 index 0000000..60cec67 --- /dev/null +++ b/MasterMind.doc @@ -0,0 +1,113 @@ +{\rtf1\ansi\ansicpg1252\deff0\uc1 +{\fonttbl +{\f0\fnil\fcharset0\fprq0\fttruetype Cambria;} +{\f1\fnil\fcharset0\fprq0\fttruetype Calibri;} +{\f2\fnil\fcharset0\fprq0\fttruetype Times New Roman;} +{\f3\fnil\fcharset0\fprq0\fttruetype Courier New;} +{\f4\fnil\fcharset0\fprq0\fttruetype Liberation Sans;} +{\f5\fnil\fcharset0\fprq0\fttruetype Tahoma;}} +{\colortbl +\red0\green0\blue0; +\red255\green255\blue255; +\red255\green255\blue255; +\red255\green255\blue0;} +{\stylesheet +{\s5\tx1584\sbasedon31\snext30 Chapter Heading;} +{\s49\fi-431\li720\sbasedon34 Upper Roman List;} +{\s30\sl264\slmult1\sa200\f1\fs24\lang1036\snext30 Normal;} +{\s46\keepn\sl264\slmult1\sb240\sa60\f0\fs32\b\ul\lang1036\sbasedon22\snext46 Titre Romain;} +{\s28\fi-431\li720\sbasedon34 Lower Case List;} +{\s2\li1440\ri1440\sa120\sbasedon30 Block Text;} +{\s47\fi-431\li720 Triangle List;} +{\s22\keepn\sl264\slmult1\sb240\sa60\f0\fs32\b\lang1036\sbasedon30\snext30 Heading 1;} +{\s23\keepn\sl264\slmult1\sb240\sa60\f0\fs28\i\b\lang1036\sbasedon30\snext30 Heading 2;} +{\s4\fi-431\li720 Bullet List;} +{\s25\sb440\sa60\f4\fs24\b\sbasedon30\snext30 Heading 4;} +{\s26\fi-431\li720 Heart List;} +{\s1\fi-431\li720 Arrowhead List;} +{\s39\fi-431\li720 Square List;} +{\s10\qc\sb240\sa120\f4\fs32\b\sbasedon30\snext30 Contents Header;} +{\s36\f3\sbasedon30 Plain Text;} +{\s19\fs20\sbasedon30 Footnote Text;} +{\s37\f1\fs22\lang1036\snext37 Sans interligne;} +{\s13\keep\keepn\sl264\slmult1\sb480\cf3\f0\fs28\b\lang1036\sbasedon22\snext30\uc1 En-t\u234 ?te de table des mati\u232 ?res;} +{\s34\fi-431\li720 Numbered List;} +{\s12\fi-431\li720 Diamond List;} +{\s21\fi-431\li720 Hand List;} +{\s45\keepn\sl264\slmult1\fi-10\sb240\sa60\f0\fs28\i\b\lang1036\sbasedon23\snext45 Titre 2 Romain;} +{\s48\fi-431\li720\sbasedon34 Upper Case List;} +{\s3\fi-431\li720 Box List;} +{\s24\sb440\sa60\f4\fs24\b\sbasedon30\snext30 Heading 3;} +{\s27\fi-431\li720 Implies List;} +{\s44\fi-431\li720 Tick List;} +{\s41\sl264\slmult1\sa200\f1\fs24\lang1036\sbasedon30\snext30 TM 1;} +{\s35\sl264\slmult1\li720\sa200\f1\fs24\lang1036\sbasedon30\snext35 Paragraphe de liste;} +{\s40\fi-431\li720 Star List;} +{\s38\tx1584\sbasedon31\snext30 Section Heading;} +{\s43\f5\fs16\lang1036\sbasedon30\snext43 Texte de bulles;} +{\s42\f0\fs28\i\b\lang1036\snext42 Tableau Normal;} +{\s20\f0\fs28\i\b\lang1036\sbasedon42\snext20 Grille du tableau;} +{\s14\fi-288\li288\sbasedon30 Endnote;} +{\s11\fi-431\li720 Dashed List;} +{\s29\fi-431\li720\sbasedon30 Lower Roman List;} +{\*\cs18\fs20\super Footnote Reference;} +{\s16\sbasedon30 Endnote Text;} +{\*\cs15\fs20\super Endnote Reference;} +{\s31\tx431\sbasedon22\snext30 Numbered Heading 1;} +{\s32\tx431\sbasedon23\snext30 Numbered Heading 2;} +{\s33\tx431\sbasedon24\snext30 Numbered Heading 3;} +{\s17\fi-288\li288\fs20\sbasedon30 Footnote;} +{\s6\fi-431\li720\sbasedon30\snext30 Contents 1;} +{\s7\fi-431\li1440\sbasedon30\snext30 Contents 2;} +{\s8\fi-431\li2160\sbasedon30\snext30 Contents 3;} +{\s9\fi-431\li2880\sbasedon30\snext30 Contents 4;}} +{\*\listtable +{\list\listtemplateid1008\listsimple{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-360\li720{\leveltext\'02\'00);}{\levelnumbers\'01;}}\listid1001}} +{\*\listoverridetable +{\listoverride\listoverridecount0\listid1001\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-360\li720{\leveltext\'02\'00);}{\levelnumbers\'01;}\ls1}} + +\kerning0\cf0\ftnbj\fet2\ftnstart1\ftnnar\aftnnar\ftnstart1\aftnstart1\aenddoc\revprop3{\*\rdf}{\info\uc1{\author Hugo}{\company HP}}\deftab720\viewkind1\paperw11905\paperh16837\margl1440\margr1440\widowctrl +\sectd\sbknone\colsx360\headery708\footery709\margtsxn1416\margbsxn1416\marglsxn1416\margrsxn1416\pgncont\ltrsect +\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:-0.0799in; table-column-props:2.7500in/2.7500in/2.7500in/; table-sdh:0x42d76a0}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ +\trowd \itap1\trgaph10\trql\trrh0\trleft-115\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3866 +\pard\plain\ltrpar\ql\sa200\s37\intbl\itap1{\s37\f0\fs72\lang1036{\*\listtag0}\abinodiroverride\ltrch MasterMind}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row +\trowd \itap1\trgaph10\trql\trrh0\trleft-115\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3866 +\pard\plain\ltrpar\ql\sa200\s37\intbl\itap1{\s37\f1\fs40\lang1036{\*\listtag0}Avec algorithme g\'e9n\'e9tique}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row +\trowd \itap1\trgaph10\trql\trrh0\trleft-115\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3866 +\pard\plain\ltrpar\ql\sa200\s37\intbl\itap1{\s37\f1\fs28\lang1036{\*\listtag0}Par Hugo Laloge}\cell{\*\abiendcell}\row}{\*\abiendtable}\par +\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \page }{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sb480\sa60\s13\sl264\slmult1\itap0\keep\keepn{\s13\cf3\f0\fs28\b\lang1036{\*\listtag0}\abinodiroverride\ltrch Sommaire}{\s13\cf3\f0\fs28\b\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s41\sl264\slmult1\itap0{\s41\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\sl264\slmult1\itap0{\field\fldedit{\*\fldinst {\ TOC }}} +\pard\plain\ltrpar\ql\sb240\sa60\s46\sl264\slmult1\itap0\keepn{\s46\f0\fs32\b\ul\lang1036{\*\listtag0}\abinodiroverride\ltrch \page }{\*\bkmkstart _Toc373258062}{\s46\f0\fs32\b\ul\lang1036{\*\listtag0}Algorithme g\'e9n\'e9tique}{\*\bkmkend _Toc373258062}{\s46\f0\fs32\b\ul\lang1036{\*\listtag0}\par} +{\listtext\pard\fi-360\li720\sb240\sa60 1) }\pard\plain{\ltrpar\ql\fi-360\li720\sb240\sa60\s45{\*\abilist\abilistid1001\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L)}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta )}}\fn-360\li720\ls1\ilvl0\sl264\slmult1\itap0\keepn{\s45\f0\fs28\i\b\lang1036{\*\listtag0}\abinodiroverride\ltrch Principe}{\s45\f0\fs28\i\b\lang1036{\*\listtag0}\par} +}\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab Afin de r\'e9soudre une combinaison de 4 pions de 6 couleurs, on dispose de deux indices\~:}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch - Le nombre de couleur co\'efncident avec la solution}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch - Le nombre de pion dont la couleur et la place co\'efncident avec la solution}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sb240\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab On utilise pour cela un algorithme g\'e9n\'e9tique, chaque possibilit\'e9 repr\'e9sentant un g\'e8ne\~et chaque couleur repr\'e9sent\'e9 par un chiffre de 0 \'e0 5\~:}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch Exemple de combinaison\~: 0, 4, 3, 1 avec le nombre de couleur nbColor = 6}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f3\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch Gene = 0 \'d7 nbColor}{\s30\f3\fs24\super\lang1036{\*\listtag0} }{\s30\f3\fs24\lang1036{\*\listtag0}+ 4 \'d7 nbColor}{\s30\f3\fs24\super\lang1036{\*\listtag0}1 }{\s30\f3\fs24\lang1036{\*\listtag0}+ 3 \'d7 nbColor}{\s30\f3\fs24\super\lang1036{\*\listtag0} 2 }{\s30\f3\fs24\lang1036{\*\listtag0}+ 1 \'d7 nbColor}{\s30\f3\fs24\super\lang1036{\*\listtag0} 3 }{\s30\f3\fs24\lang1036{\*\listtag0}= 348}{\s30\f3\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\super\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab }{\s30\f1\fs24\lang1036{\*\listtag0}On dispose ensuite, apr\'e8s soumission de l\uc1\u8217\'92hypoth\'e8se, d\uc1\u8217\'92un score repr\'e9sent\'e9 par deux entiers S}{\s30\f1\fs24\sub\lang1036{\*\listtag0}1}{\s30\f1\fs24\lang1036{\*\listtag0} et S}{\s30\f1\fs24\sub\lang1036{\*\listtag0}2 }{\s30\f1\fs24\lang1036{\*\listtag0}de 0 \'e0 4, le premier signifiant que la bonne couleur est \'e0 la bonne place, l\uc1\u8217\'92autre que la couleur est bonne mais pas \'e0 la bonne place.}{\s30\f1\fs24\super\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab De ce score, on calcule la \'ab\~Fitness\~\'bb de l\uc1\u8217\'92hypoth\'e8se, avec la formule suivante\~:}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f3\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch Fitness = S}{\s30\f3\fs24\sub\lang1036{\*\listtag0}1 }{\s30\f3\fs24\lang1036{\*\listtag0}\'d7 nbColor + S}{\s30\f3\fs24\sub\lang1036{\*\listtag0}2}{\s30\f3\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab Chaque g\'e8ne poss\'e8de donc son score et sa fitness}{\s30\f1\fs24\lang1036{\*\listtag0}\par} +{\listtext\pard\fi-360\li720\sb240\sa60 2) }\pard\plain{\ltrpar\ql\fi-360\li720\sb240\sa60\s45{\*\abilist\abilistid1001\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L)}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta )}}\fn-360\li720\ls1\ilvl0\sl264\slmult1\itap0\keepn{\s45\f0\fs28\i\b\lang1036{\*\listtag0}\abinodiroverride\ltrch S\'e9lection d\uc1\u8217\'92une hypoth\'e8se}{\s45\f0\fs28\i\b\lang1036{\*\listtag0}\par} +}\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\abinodiroverride\ltrch \tab Pour s\'e9lectionner une hypoth\'e8se, on parcoure toutes les combinaisons possibles et on d\'e9termine celles qui peuvent \'eatre la solution en fonction des tentatives pr\'e9c\'e9dentes. Exemple pour une solution [0,3,4,1]\~:}{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:-0.0750in; table-column-props:1.4847in/1.7215in/1.6062in/1.6375in/1.4847in/1.7215in/1.6062in/1.6375in/1.4847in/1.7215in/1.6062in/1.6375in/; table-sdh:0x42e9e80}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ +\trowd \itap1\trgaph10\trql\trrh0\trleft-108\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2051\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4530\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6843\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx9201 +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}G\'e8ne}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}Hypoth\'e8se}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}Score}\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}Fitness}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row +\trowd \itap1\trgaph10\trql\trrh0\trleft-108\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2051\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4530\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6843\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx9201 +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}726}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}[0,1,2,3]}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}[1,2]}\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}8}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row +\trowd \itap1\trgaph10\trql\trrh0\trleft-108\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2051\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4530\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6843\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx9201 +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}8}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}[2,1,0,0]}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1{\s30\f1\fs24\lang1036{\*\listtag0}[0,2]}\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} +\pard\plain\ltrpar\qc\sa200\s30\sl264\slmult1\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} +\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\par} +\pard\plain\ltrpar\ql\sa200\s30\sl264\slmult1\itap0{\s30\f1\fs24\lang1036{\*\listtag0}\par}} \ No newline at end of file