Aller au contenu

Coloration propre d'un graphe

La coloration d'un graphe est dit propre lorsque deux sommets voisins quelconques n'ont pas la mĂŞme couleur.

Test d'une coloration d'un graphe⚓︎

La coloration du graphe ci-dessous est propre.

Coloration

Les sommets sont colorés avec quatre couleurs. Aucun sommet n'a un voisin de la même couleur.

Coloration propre

Un graphe est implémenté à l'aide d'un dictionnaire. Un sommet est représenté par son numéro. Les clés du dictionnaire sont les sommets. La valeur associée à une clé s est la liste des voisins du sommet s. Par exemple, la graphe plus haut est représenté par: {0: [1, 2, 3], 1: [0, 4, 6, 7], 2: [0, 4], ...}.

La coloration du graphe est créée par un autre dictionnaire qui associe à chaque numéro de sommet une chaîne de caractères qui désigne sa couleur. Par exemple, la coloration du graphe plus haut est représentée par: {0: "jaune", 1: "bleu", 2: "vert", ...}.

Compléter la fonction coloration_propre qui prend en paramètres un graphe graphe supposé connexe et un dictionnaire couleurs qui stocke les couleurs associées et renvoie True si la coloration du graphe est propre et False sinon.

Exemples
1
2
3
4
5
6
7
8
>>> g = {0: [1, 2], 1: [0, 2], 2: [0, 1]}
>>> couleurs = {0:"rouge", 1:"bleu", 2:"vert", 3:"jaune"}
>>> coloration_propre(g, couleurs)
True
>>> g = {0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}
>>> couleurs = {0:"rouge", 1:"rouge", 2:"vert", 3:"jaune"}
>>> coloration_propre(g, couleurs)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013/p:iF,vl4P)Th=obk56uancgrtS_ef12w y]m[-s(d3050Q0D0A0v0e0i0O0I0x0i0v0O0O0o010A0e0c010406050O0u0L0L0v0z0J040B0p0i0u0,0p0w050b0?0^0`0|0;0c04051c151f0b1c0;0Q0e0h0!0$0(0*0$0w0y0u0v0y0D0N0c0J0A0n130I0n0e0y0n0i1H0n0A0/050V0q0i0D1o0%0)011G1I1K1I0A1Q1S1O0A0z1d1C0!0 0O0c0v0w0*0G011U1q010E0X0D0w0v0L0D1O1:1=1`1W1}1S20220/0a0I0k0z0p0c0p0O0e120w0I0T1.0z0z0D0x2n15250w1d0b1C2A1*1,1+1P0Q271r0e0w1 2k1O1l1n0#1V2K2M0w0p2Q1O0c2t1d2y2A2%0=1;2o2S1{2W0z0_0i1O0v1F2t0E0*030C0C0x2X0D1K2V0p0N0F350/0F150v2(2+0:2*262-1W2/2;2?2^0D2`012|2~30322N350N1^040G3a3c1=3e2y2J013j0v2=1d2@0n2_2{2}2 0T3t2W3v0R0/0R3A2x3d0;3E3h0*3H3J053L3N3p3P3s2L3u360j0/0j3Y163!3f2,1p3i0p2:3I3l3M3n3O3r3R3;3T360s0/0s3`2%3#2+3F3)443-3q3Q314a34360t0/0t4g3d1g2#152Q2D0Q1,2I3%014p2P1m1d2!0D2$4y3{3C054p4P260e0Q0*2}2y3v0F3l4X4Z484q334$1_2b0D4*4p3S4s372A3b3}3F0r0/0T0E3Z4S3$3 0*0H0/0I522z4|4H0w0E0/2 0i410v2n0C2!2i2t5a4V3~2T010.040P5q5c553G0/0y0z0v0c0n0D5y545t5v0g5q595K2.5g0p0u1S0u0z0O5J4j4H5v0l0d5q0;4R5b3E4)014!2+3v3x3+0I5.3/494-361^0I4:4=3:5|3w1O0b3b0I685P5!5A4~040E415O5z5t0w0/0O0p0^0U6h5Q1W0p57042L6q6b6j5C5E5G5I5+5r3F5v5(6E5*2)5-4Y5/0C4#363V3K5^6N5`4,3=0N3V5 214;6O4?4r3U6567696.6i1{6d6f0z6x3g5A6k040h0p0e2l146E6a6_5t6t0/6w726:3i6A5F5H5Z741{5v0M7f5s5R046m6o0A7k6G0/0K6I4h7r5_6P5;3?4(6V4+4@3v3@6#22615{6Y3@4`046.7Q697a0*6d0e51796r3(5S5U0D5W5Y6E7T5u0/7j7*7Z5B6|6~707r5#7t6^7l6s0/0o0o7{4k7#5V5X7^5A7i866z7n6n227q7/6y7h7t7v3|8f4W7D6Q0N4d6T7y6)634d7I6%6W7F4c6,7P7R8D687+6d2t0A5W712%737|7U0x0/0f3I0O6D7w8l2o7y8o4u8r7D8t6Y4u8w7K6X4b0N8#3A6/7:8H0U8K814H0r8Q040m0z0u8V8k2)0b4U4z4O4B4L150A4E9b2G2B0v1R980b4C5*0T0V0X0O04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013/p:iF,vl4P)Th=obk56uancgrtS_ef12w y]m[-s(d3050Q0D0A0v0e0i0O0I0x0i0v0O0O0o010A0e0c010406050O0u0L0L0v0z0J040B0p0i0u0,0p0w050b0?0^0`0|0;0c04051c151f0b1c0;0Q0e0h0!0$0(0*0$0w0y0u0v0y0D0N0c0J0A0n130I0n0e0y0n0i1H0n0A0/050V0q0i0D1o0%0)011G1I1K1I0A1Q1S1O0A0z1d1C0!0 0O0c0v0w0*0G011U1q010E0X0D0w0v0L0D1O1:1=1`1W1}1S20220/0a0I0k0z0p0c0p0O0e120w0I0T1.0z0z0D0x2n15250w1d0b1C2A1*1,1+1P0Q271r0e0w1 2k1O1l1n0#1V2K2M0w0p2Q1O0c2t1d2y2A2%0=1;2o2S1{2W0z0_0i1O0v1F2t0E0*030C0C0x2X0D1K2V0p0N0G0N0F0/0F150v2(2+0:2*262-1W2/2;2?2^0D2`012|2~30322N35350/0G3b3d1=3f2y2J013k0v2=1d2@0n2_2{2}2 0T3u2W3w0R0/0R3A2x3e0;3E3i0*3H3J053L3N3q3P3t2L3v360j0/0j3Y163!3g2,1p3j0p2:3I3m3M3o3O3s3R3;3T360s0/0s3`2%3#2+3F3)443-3r3Q314a34360t0/0t4g3e1g2#152Q2D0Q1,2I3%014p2P1m1d2!0D2$4y3{3C054p4P260e0Q0*2}2y3w383K0I4X4Z484q334$1_2b0D4+4p3S4s371O0b3c3}3F0r0/0T0E3Z4S3$3 0*0H0/0I542z4~4H0w0E0/2 0i410v2n0C2!2i2t5c4V3~2T010.040P5s5e573G0/0y0z0v0c0n0D5A565v5x0g5s5b5M2.5i0p0u1S0u0z0O5L4j4H5x0l0d5s0;4R5d3E4*014!2+3w1^4(5:3/494.361^0I4;4?3:5}3x2A3c0I685R5$5C50040E415Q5B5v0w0/0O0p0^0U6h5S1W0p59042L6q6b6j5E5G5I5K5-5t3F5x5*6E5,2)5/4Y5;0C4#363V5_6N5{4-3=0N3V60214=6O4@4r3U4{67696-6i1{6d6f0z6x3h5C6k040h0p0e2l146E6a6^5v6t0/6w716/3j6A5H5J5#731{5x0M7e5u5T046m6o0A7j6G0/0K6I4h7q5`6P5?3?3m7x6(643@6!22625|6X3@66046-7O69790*6d0e53786r3(5U5W0D5Y5!6E7R5w0/7i7(7X5D6{6}6 7q5%7s6@7k6s0/0o0o7_4k7Z5X5Z7?5C7h846z7m6n227p7-6y7g7s7u3|8d4W6U7y1=3w4d6T7I6W4b0N4d7G6$6V4^8o6+7N7P8D687)6d2t0A5Y702%727`7S0x0/0f3I0O6D7v8j2o7x6Q0N4u8q6%636X4u8w8r8z4t8B6.7.8H0U8K7 4H0r8Q040m0z0u8V8i2)0b4U4z4O4B4L150A4E9a2G2B0v1R970b4C5,0T0V0X0O04.

Coloration gloutone⚓︎

On veut colorier les sommets d’un graphe de manière à ce que :

  • deux sommets voisins n’aient jamais la mĂŞme couleur ;
  • on utilise les couleurs une par une, de façon « gloutonne ».

Le principe glouton est :

pour chaque sommet, on choisit la plus petite couleur encore disponible, donc pas déjà utilisée par un somme adjacent.

On se propose de colorer de cette façon avec les 16 couleurs VGA (début des écrans couleurs de l'informatique) :

Les couleurs VGA
Python
# Palette VGA / EGA 16 couleurs historiques
colors = [
'noir',
'bleu',
'vert',
'cyan',
'rouge',
'magenta',
'marron',
'gris clair',
'gris foncé',
'bleu clair',
'vert clair',
'cyan clair',
'rouge clair',
'magenta clair',
'jaune',
'blanc',
]

Voici un exemple de coloration propre gloutonne.

L'algorithme suivant, à compléter :

  • initialise la couleur de tous les sommets Ă  la valeur 16 (couleur non disponible en VGA, puisque les valeurs sont comprises entre 0 et 15)
  • parcours tous les sommets du graphe, et, en remplaçant dans la liste left_colors la valeur de la couleur d'un voisin par 16, cela retire les couleurs non disponibles,
  • pour chaque sommet, le colorie avec la plus petite des valeurs disponibles.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013/*p.:i,vl4P)h=obk!56uan{}àcgrtS_xef1é2w y]0m[-s789(dj3050!0I0E0w0g0j0V0O0B0j0w0V0V0o010E0g0d010406050V0v0S0S0w0D0P040F0p0j0v0`0p0x050b111315170 0d04051n1g1q0b1n0 0!0g0i0/0;0?0^0;0x0C0v0w0C0I0U0d0P0E0n1e0O0n0g0C0n0j1S0n0E0}050*0q0j0I1z0=0@011R1T1V1T0E1#1%1Z0E0D1o1N0/1a0V0d0w0x0^0M011)1B010J0,0I0x0w0S0I1Z1~20251+281%2b2d0}0a0O0l0D0p0d0p0V0g1d0x0O0(1|0D0D0I0B2y1g2g0x1o0b1N2L1^1`1_1!0!2i1C0g0x2a2v1Z1w1y0:1*2V2X0x0p2#1Z0d2E1o2J2L2=101 2z2%262+0D140j1Z0w1Q2E0J0^030G0G0B2,0I1V2*0p0U0k0U0K0}0O0K1g0w2?2_0~2^2h2{1+2}2 31330I350137393b3d2Y3g0U23040O0M3n3p203r2J2U013w0w301o320n3436383a0(3G2+3I0$3k0$3O2I3q0 3S3u0^3V3X053Z3#3C3%3F2W3H3h0k3k0k3:1h3=3s2`1A3v0p2~3W3y3!3A3$3E3)423+3h0t3k0t482=3?2_3T3`4i3~3D3(3c4o3f3h0u3k0u4u4a3@4d3_4f3x3Y3z3B4C413e3I0W3k0W4L3Q4w3t4O3U4Q4h4S4j4U404n4X3h0X3k0X4$2K4(4c2(4+4g3{3}4k3 4m4E4?0U0Y3k0Y4{3R4x3^504R3|4T4l4D3*4G3i0R0}0K0R5d4}4y4,525k555m4F3I0K3j045E5u4b5w514A544V4=433i3K0K3N0b3o3;4%5J5g4z4.4B4;575Q0K3-5G3/5V3P4|5Z4*5#5j4/5l4W5*455G475/5X5;4N4 5@534:565n5D4r5G4t60495Y632|5x5M675B580K4I5G4K6e4v5=646j5$5N5(693h0K4Z5G4#6s4M5f5?6w5^5%685C6B4^5G4`6G6g6I6v5L6x6l5{4p3i5a5G5c6T626V6i6X6L6y6N580M5q046?5I6h4e6.665`5P6#0M5F726`6,6|5i6~5A6!5o0M3K7d754)6W785z5O5)715,0M5.5W6f6+7h6-7j5_7a707c5}0M5 7r6t6{4P6}7k6z6O3J6b0M6d7E6H7u774-6/6Z7z3I0M6p7Z7g4~7v7U797l6A3J6D0M6F7Q6U7S7H7w6M6m5Q0M6Q7|7$5K7^6:7`716%0M6)7;7t7%7T5y7x7+7L0$6@8g7 5!6K7*7K580$5F8p8j6J7I8d8n5Q0$3K8y8s7i7)7J6;8x5,0$7q5:5e7?5h8D8v8F6#0$5}8S8B7(8c7_7b3,6b0$7P8K5v8k8u8Y7X3h0$6p8/8V8b6k6 7m5o0$6D8{8=7@8O8,8_3,6Q0$6S888L8a8 8X828Z8.6%0$878(6u8W8@7y92446@0k5t6*9880909c8-3g5F0k3m9s8)8t817W9n3g3K0k5U979D8C9b9G7,0k5,9S8~8N9P8^9R5}0k7D9i7G9W9l8e580k6b9-9V658E835o0k6p9^9:8l9=9d3g6D0k7:9%769a9*8w6#0k6Qa99{8+9w9H0k6%agac9F9Y7L0t6@anaj9v9Qam5F0t9B9M9j8?6Yal580t3KaDaq9X9m7,0t5,aKaGa68Q5o0t5}aRaNaAaIam6b0t8%612L2/0I2L2#2O0!1`2T5g4D2!1x1oa%2;3qa#054Da^2h0g0!0^382J5D3ya b1aPb40O2m0Ib79?b42L5W9(0x0}0Ca#0Oay0^0p0}0obmbo010|040ya#0 7sa}2zb601b22_7Yb5b0bFb83h23ba2cbcbLbebN1Z5/0ObXbn9(0S0g0}9r2@9(bw0fbmbZa4bv0}0Ta`b!b$5Gb?b/bw0hbtb@0}5Ub)b{0}b}bBb.8Mb#0}5.c28Mb|b~b/c9045 cc99b:04c52=c7clch6dck3Tcec6buch6rcu5gbw0Qco4abB5JbEbG203,bJbd9~3-bP2dcO9x5,3ObYcq3Tch9BcB4*b+b-bubwb=cHb 04b(a_b*c4cfc8b^c1c;c3cnc@crb^cjc{cdc?cxc.6Fc$4 cwcpcyb^6Sd826cDcF5Yc-4xcJ0Gb344cNbS9~45cRbRa79@bV3ocXdcc0b`d304b,c6cYcCb;dDc b%dLcvd4dbc.c#d2clda3qdI4*chcbdUdPc}d5cgb^ctd$dJd(dRd*0}ded-c%dQdXdB046)df1+dhbzdOdmdo0U6b5jdmbTe524bbcT9He6bWbYd{d#3Qc*0}dGcpdYd9dKdkc^dNesdVd_3Qep26chc`ekc=d/d`c.d1eDc|di2Kez1+czdOd.eL3Ld{d}d@eqeFeyd{5seQd^04cEe1ev0Oe3bH4Hdqdw3I4Idued7,6pcWeheHe$eXendXeN0^c+e~eAb^c:eJdEeSf201c!f5d exeMeifff3fheTc.d,f9eweYfid6fkcmfbe!f82Kelfsfnd;5GdTfqd%e)bBbAcue-cL3h6De7bKe;fPebbQe^7LfQegbXd{fpfAeEf0eyfcf4e+5gchfzbCd%fxc.eCf(eKc~cZd0fvdWeZc.cAeWdgfmfcchd?fHeRf|f/b^5Hf.e%f@fE5Tf 0}fJ6te+fN0x3I6QfRfX584^e@dr9xgtf!g7b^g3gae%f*eMf,erd~0^f:glfCgDcagPgiet04f%f=gbd)gVeVgGeXgUdM5Gf_gYghgcdZgeejf`dEgncGfMfSdne.59e:bMg~gyfTg~bg3rgpg{e45sg e9hah2h0hah5dAfugge c)eEc,gMfdgegTg/4 cheIg?frg)f}d=hsg!g*e#hkg5gQe!hwg-eXg^djg`b7h95Fgugz9H5EfVcShU7,hWhhe|fEg9hxd%gI3LgK04hog4eOhrhGfghIf^hCd:gVgXfBhzgd0}d7h;flh_fEg$h*gZh|hEhKh htf65rh~eEhN5;h7hQg}5Thb9~iphehc3Ke{f#c.i8hLhHh,ixc|h:g%ig6^h{eGfEg=iAh^i0g:0}gFi9g.hDhA04h)iNi5iPhugef;ieiVi16ciJg1gjiSiZcmikh6hPbLh9cV32e8ircQechZ7L5+dyh-iDgVhFhpc(i*e%iFiTi$gSh@i!ifh=0}ideEi#iHi3iGiOjjgNb^izi)ibiWgfj9g6e!i:jxiKj7jqjehHi?fLd$gq5D5}hTh30Kdtj0jSjQgCe!fGjJh^iCfBjdi;hvi-ftfEiif{jbjf5Gi(jnjthq5rg,jFi.jHj,fDj7iYfBjLe2h8ioe6i|g{hc4ritirefdzh%j7j|f)j_f-hpcsk0gR04jEj^j;iHjAi4fwj_c!iMj}j-k2kqe!jwijeSjMfHjO6Be`kagv5*e?jVhfe`jYdSkCklkvh^j)d{ktj:jyi+gkjhkzk#ju5rk)fakAgekIc|k5imi_iofQkQj16n4Zke9x6Cj4kLh*kN3igtl1jSgxkUhcgBkhj6icgPj%hnfvchjIi;g0kEg*k3kuk+iQi,k.luk1hElsk4kKk6infO6$iql65al5hV6%iwkr0Kj/dEloiElqddkGiyl$gjjmk*jGhEk?hyk^5rlxk{lIk}cKgrbN6@jRh06?hXdvl~l|kXi/lnkmgLkychk`k@k:j`j?l(j7kZl+j~hElWl/mdc!lGlyl,jzmbfrk|i^l_7YhSlel~3jlQ7,72j4higjmqc|lYdEk%dSj@mjlvjzj!ltjCdSl*mclzj=6omghEl=g@l@mxg|lL7dlN9Hm/mE7Lm/h$lljzm)frmMfrmOgjmUkDlEjzkkmRn4k,mmf?l:6Em%mtgPmwjNk7m.i{e,kb9~7pm0kR7nmHkihEmuh+m7h/l!j{nek,mimZmsk,l.nbmogem|fIm+nilKl`3JjQmBe97Cnql27{jXbhc|0ze*m,e47Om:mFkdlhnokgi@nPk~m.kPnmnr7ckTfWnY71kW3ol9f=lb7/n,m@l4n/9xo6h5bu0r0}0(0Jfv0N3kfv0x0Jbk2E0w0!0P3E0j4fgP0ZombkgP0mh,o3cInjnR7|o76=lgn~h3oIm_fcbj043aov0D0Vj_bq04bsmd0x0q0}1V0V0Eoxomo%040D201Io,k.c!nId.0m0mn(n?mybNlSnUnolPoam;lS5/oE3Slb8goJ8x5qm?8om3lkfc0B5F030O0w0v0B0v2X1|0v1%0v0Dpo1;0D0g0q0v0L1(pp2A0L1 0Do+fKlJn@nR8ppd8RmDp57,pRoPbuoR0i0IpL0I0HouowmdoYo!m!hHn0j7o_e%0QoX0}0cj_o$o(2ao?hpoRbllC0}o|pNl^m-pQivp2cUbOpV8fivp8pOo 0U8IpS8`i oMh0qmpY9(pl0}pnpK3apx0.0(0.0V0p130)oWq7n)g}8Sqn3,jUqqe9qMqtb/of040Jp+p/3v0}p#p%0HoXok042Wp|oAq4dFo}kMoG8!qN8.n.qQcPn;p9dlq?8.n_i}cUn}hYh38/ntcXm`a/pm1|0d0g1(qCpupwoV2A0g1~1epC1%qIgoqKlL8{q^qlo9q{cUfZpjmI8MoR1%0J0Ep*oVp_oZq-oS1a4frskyoY0eozrP1Loxq6rto~q993rx95nXr7ljn=q=nQ3,p1n`n 8`p4rA9H9gr9rabuqv04qx15qzrlri0i0prn2WrShOr$e49qrxsfpg5QsfoPrEclqVqX0DrOor0#q)0}q,o#q.jBnzk.p!p$0Ep(ngoDqjr%44mAr?h39Ar+h0sOh5q~a~r09Isgqer`9RqhrDrarb4*s0pnqzrk2A0v0Os7s91fqJsdg}9Ssgqpr6sQcVgCs%s(640}ssrKrMp.nG5?q#sDp(t6q/p;cloRssngq;lasV9#sgqPs}e9tosSsIsek9sMsQq`trdsn;t1r~qurd2w0O1%s:s82w2z0Io*pI0#0A1|oU0g0Ltlo4tnr2nn9x9^sPtso1j5tEfcqV0goisx04t5oTqYt94 oY0st8mkjzp?hls@r/pP3Ia1sgrztBt%rCr.tmr:44ldtytsoLuaafr-t-t1r rd0B0)sErj0Ipx2A0I0irg0x0Ee,uCp$1wsEtYoFuf3gr=r3afr_ul9Rp7s$uopZp~rIrKsbj#i5tg4yt40!0#teszp^p,brncm$u3ueu54ql|qceepfqfaCpiudtZuLavrxv4si6#v4slnu3Ts*0/1O0g0HuytJ320d1b0.0d0)2x1(s,uwpy1wro0xrq0IuJpasVaDv5sYuRams#t,smu(04q$sEp)t^sqtfrWvNsFq/u.qZbpu:o#o.b#s?szoysBuXrJvQu!mV04r!g_s^lLaKv5s|m1e9v_tuq8e4aRv5tqv|9~w2qT8MvdtI0;tJrnuu2E0E0ppx0xpF1|uCuBuDri6o0hvjtU4f0w2y0O0Cov1c1ept320L0B1OpEvzu?v2u^e5txuOaJtAw59xaZr}oe0}wgwjrOvUvPrQvRr#ek0ba|1r2:1ga*1g0Ea,w;2R2M0w1$a(w/a=bA0(0*0,0V04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013/*p.:i,vl4P)h=obk!56uan{}àcgrtS_xef1é2w y]0m[-s789(dj3050!0I0E0w0g0j0V0O0B0j0w0V0V0o010E0g0d010406050V0v0S0S0w0D0P040F0p0j0v0`0p0x050b111315170 0d04051n1g1q0b1n0 0!0g0i0/0;0?0^0;0x0C0v0w0C0I0U0d0P0E0n1e0O0n0g0C0n0j1S0n0E0}050*0q0j0I1z0=0@011R1T1V1T0E1#1%1Z0E0D1o1N0/1a0V0d0w0x0^0M011)1B010J0,0I0x0w0S0I1Z1~20251+281%2b2d0}0a0O0l0D0p0d0p0V0g1d0x0O0(1|0D0D0I0B2y1g2g0x1o0b1N2L1^1`1_1!0!2i1C0g0x2a2v1Z1w1y0:1*2V2X0x0p2#1Z0d2E1o2J2L2=101 2z2%262+0D140j1Z0w1Q2E0J0^030G0G0B2,0I1V2*0p0U0t0U0K0}0O0K1g0w2?2_0~2^2h2{1+2}2 31330I350137393b3d2Y3g0U23040O0M3n3p203r2J2U013w0w301o320n3436383a0(3G2+3I0$3k0$3O2I3q0 3S3u0^3V3X053Z3#3C3%3F2W3H3h0k3k0k3:1h3=3s2`1A3v0p2~3W3y3!3A3$3E3)423+3h0t3k0t482=3?2_3T3`4i3~3D3(3c4o3f3h0u3k0u4u4a3@4d3_4f3x3Y3z3B4C413e3I0W3k0W4L3Q4w3t4O3U4Q4h4S4j4U404n4X3h0X3k0X4$2K4(4c2(4+4g3{3}4k3 4m4E4?0U0Y3k0Y4{3R4x3^504R3|4T4l4D3*4G3i0R0}0K0R5d4}4y4,525k555m4F3I0K3j045E5u4b5w514A544V4=433i3K0K3N0b3o3;4%5J5g4z4.4B4;575Q0K3-5G3/5V3P4|5Z4*5#5j4/5l4W5*455G475/5X5;4N4 5@534:565n5D4r5G4t60495Y632|5x5M675B580K4I5G4K6e4v5=646j5$5N5(693h0K4Z5G4#6s4M5f5?6w5^5%685C6B4^5G4`6G6g6I6v5L6x6l5{4p3i5a5G5c6T626V6i6X6L6y6N580M5q046?5I6h4e6.665`5P6#0M5F726`6,6|5i6~5A6!5o0M3K7d754)6W785z5O5)715,0M5.5W6f6+7h6-7j5_7a707c5}0M5 7r6t6{4P6}7k6z6O3J6b0M6d7E6H7u774-6/6Z7z3I0M6p7Z7g4~7v7U797l6A3J6D0M6F7Q6U7S7H7w6M6m5Q0M6Q7|7$5K7^6:7`716%0M6)7;7t7%7T5y7x7+7L0$6@8g7 5!6K7*7K580$5F8p8j6J7I8d8n5Q0$3K8y8s7i7)7J6;8x5,0$7q5:5e7?5h8D8v8F6#0$5}8S8B7(8c7_7b3,6b0$7P8K5v8k8u8Y7X3h0$6p8/8V8b6k6 7m5o0$6D8{8=7@8O8,8_3,6Q0$6S888L8a8 8X828Z8.6%0$878(6u8W8@7y92446@0k5t6*9880909c8-0U0k5F9z8~8N9b7W9n9y3K0k5U978)8t819F7,0k5,9R9C658E835o0k5}9Z9U8l9W9d9y6b0k8%619t8*9O8^9Q6p0k6r9L9j8?6Y9=7L0k6Da09$8+9w9G0k6Qa7a39;9m9Q6%0k9h9.9M8C9E9~580t6@anaa9v9P7L0t5Fauaqakacat3K0t9K9i7G9D9l8eam5,0t8Jah9{9aaH8w6#0t5}aTaxaQ8Q5o0t6ba!5d1r2:1g2#2O0!1`2T5g4D2!1x1o2/0I2;3q9.054Da`2h0g0!0^382J5D3yb1b3aYb60O2m0Ib99Xb62L5WaF0x0}0C9.0OaO010p0}0obobq0|040yaN7sa 2zb801b42_7Yb7b2bFba3h23bc2cbebLbgbN1Z5/0ObXbpaF0S0g0}9r2@aFbx0fbobZ760^bx0Ta|b!b$5Gb?b/01bx0hbvb@0}5Ub)b{b}b b{b#0}5.c38Mc5bBb.8Mc8045 cb99b|0}b~cebqch6dck3Tcd2=cfclch6rct5gbx0Qco6tbB5JbEbG203,bJbf9)3-bP2dcO9x5,3ObYcx3Tch3mcHb*0}b,cecYcC0}b=c$c7b^b(a{c%04cF3qc+4*chc2c?c4cnc6cgb^cjc ccd1cpc0046FcB4*cvc`cqb^6Sdd4 cDc_5Yc/b0bKcK0x3I5}5jcJbM9y24bdcTa6bV3ocXdhc1b`d704c)cwc{dlc-dJcyc;dRcud8cwdHb_dpcldf3QdO26chcad6d#dWdgdacsd,dVc^d2dS0}djd=c,d@d9c:0}6)dk26dmbActdxb54qcNbS9)4rcRbRaRaZdE3LbYdYd+3Qbwc(b-ep04c.e31+chc=eoc@dn2Kd(ewb^c~ezd0d~dXdad5eHdKeB3LdYcAd|ded.d%dYe2eTdPeJd/e05Gey2KescEe6d=e8bH4Hebeh3I4IefdC7,6pcWeleLdUd}dMc`eDb:dQd!cZdTf7d}ePf401c!f0eUe#eWdaene*eAd^f80}d;eNd-fieCdYdceZe4eVfvda5sfge!fcdY5Hfafhe,bB0 f7e/cL3h6Ddwdrdy4Ze_ec9xfSbWe~e%frfmeIf2d%fdb;fEd)f9evf5fueQdaeGf)eOfo5gcheMf{ftfGdaeSfsd?g3e%d{g6fbf}c|b^fIf=cmf@fdc!f`bCd?fLcGe7fUe90U6QfTe`7L4^fXe?4@ejdGg4f/1+b+erc@eufyeEb%gGf?g8d3c9gPgigRd_04f(gngcd gS04eYgbfhgWfp5Ggmesg,f~gfflg!fKePfNgrb9gt6%gwfY9G5agAdyg 5/g{e.gse:5pe=dy5sdAbQgx6n6@e}bXfwgUgIc*esgLg*4 fffJfFgdhud4hofAf^g9hBgjfHe)g^hxg$gX0Kg0hJfz04gp4afOhafQ3i5Fh0gBhXhgcSh17,5EgDf$g%gag1d?f+eCf-f6ghhvghd$fBe%g/fnhLg-gZg:hyf:0}fxhthQg;gee1hFiahz5rhOi3i0g=5ri2c@hSdog|bLgt5ThdbT5Rh$eghe3Khlgkb^g)h/f1gJeIhsiFib6^idi4gN04g@iieKe%g5iKhKiTh-iNijiLfDhwi9iO0^c!imeIiei56qhFio5;hUg}hb5+iu9)i{h4ivi{biekhmfChIesh;hDdKiJhPiPiRh iYgXihjfe$g%i7iWi)i#ifg(i!jgg-gggMgQi*fegfiVjcjxjpi:6Ci=g`dUfPdt6Bdv32dxj045i i}dvf#j4e%jvi8gHeqjEj!etgUf jsjkgXi-f|j$i+gfj6jjfjjXh~i.jyc!jmjCgVj|gfh.j e5fMjJhVjL3i6bhZheeedBh(7L0KkbjViC5rj`dKj8h?j(i(iPj.g2k10}jBiSj,juc#h`hCkl5-j+j^g%0Kk3kzkIhMiEk40}i?3ri^iri`e|jOfUj0e^kfh!6oh+jWkJjef*jyf.ksj;kxkHh|kJknkvj:jz5rkyj@k@kOjHe-g6jK5DfSkYhi5*fWk$hef!3oh8l4k85Dgvl8kg6ngzlcj0gvkkfHjik-k{k/h^b^j~kMl0g-kLk j9hMkug7kw6El2k6kUds5Dg llk%h3lpi}h6dFh,lHhFkphrj)dik?lGg-kPlBl+ik5~l*kF6ol=fHlEeIkSlgh/l5bNhklSdy6?ixl971hklsfCk~lvjtd}jbeXl^j5mhjXk,j/mdi$lIg#mnjqjGk:k0k{c!l-injIlO0Ggt72i|9xmEjSmGhYm9jXlAc@l$gKl(5rj?j{mwgfkCjwmvmrjFlummkAl:l@muh{l/i$l`dKl|k7i_hW7dmF9Gm^mIm`iAmLkJm/ftmPiImR5GmXjZjDm!iP5TmjkJmpg+lKmtkDhGfCmyl{mAiqlPbNcVm2iv7pm5lm7{cVm l1m+j#naf?mffCk_lJmV5rmlk`nEk|i;nCnkjXn1gonoh9m?k97Cm_7,n!m|n$jUbjeI0zl3l~libNkbnt9)7Onwh!n^j2l}gnl 3JkX0OjPn@k#hhnx71e|h7m=kVm@l7o2kZn@lbo6n`lej 0r0}0(0JgU0N3kgU0x0Jbm2E0w0!0P3E0j4fhF0ZoubmhF0mj8n}cIn:3Jlkofm67cloojm3lrlYk*clbl043aoD0D0Vjybs04buk{0x0q0}1V0V0EoFouo;040D201Io_muc!mbdK0m0mn.n~oO86n#7Lpan(pclXkTnpmChb8gpb8o5qpepnk)fd0B5F030O0w0v0B0v2X1|0v1%0v0Dpw1;0D0g0q0v0L1(px2A0L1 0Do^lNpigt8ppm8x3jppp!prbqo#0i0IpT0I0HoCoEk{o,o.nOlxmYp2i=o+0}0cjyo:o=2ap0gho#bnnRp6pVnXock98ypZ8RbOlVcUm~lfobnq0U8Iqf8`cQqi9Gqpj2gEb{pt0}pvpS3apF0.0(0.0V0p130)o*qalhnY3,jNoRo78`jRqt7,8Sp(aFon040Jp;nOp*p,0Ep.o+os042Wq0oInRoLqmpjhW8$qq8!n_dyq|n|q_pXo1o3cUo5h%h!8/prqx8Mqz04pv3a0d0g1(qGpCpEo)2A0g1~1epK1%qMgqqbqn8{q}8.oir9r0olcXrdo!q20J0Ep:o)p}o-q=o$1a4frwmYo,0eoHrS1LoFq9rxqOqc93rBqooUrEiv95ejoM3Sn 9gr,r_p$8RpgrHlZ3TrfqB15qDrprm0i0prr2WrVipryq`k99qr,shr|9Ym8oYrHbqq#q%0DrRoz0#q.0}q;o/q?njnGb{q*p-0Hi=q^mBgt9zsip#qW9 mKqlsJhb9JsiqhoVivsUqwr soaFs2rn0IpF2A0v0Os8sa1fqNn/qP44nsqSh!9Rq sYnzsns#fdo#surNrPp@m(5?0}p+sFt5nRsC8Mt30!svnR0Qp7oNs@9yqRr6a6qVsX9)9Zr=r3sTn=s`dy9,s}tvkjt0s#bqs(2w0O1%s.s92w2z0Io@pQ0#0A1|o(0g0Ltmr@oO9^sir8iysYo9tHr spsxoqsz04t4o%q(t84 o,0st7kNjup3n2t#4xn a0sirDt+tvolr?u5t%oQtr9Qr.ua9xa7rct1s0a:pu0/0)q,s)s+0(0irk0x0Eo2uAp,1wq,u4dqtoafsilUtuulr~uot/bkrKrMt_rOterZt^rTsstkt6nhjBuduIr*4qm1tBivantE9xu;r2sShWaur,u{sk3Iu{s!uRqyur0B1O0g0H2A1(0;0O0d1b0.0d0)2x1(qDrorqrs0xru0IuHbDoOaCu|sWr/edqkj3s$sDtaq+p.tdsBrZtbq,sGu$p=btq0o{b#s;njoGmuo#1%rLrNscjnj%r%hTpWhbaLu|qsuN9Gv+u^v)u`tqogu?ttvxv_qZv3qA0OtLvbo?uu2E0E0ppF0xpN1|uAuzuBrm6o0htM32uV0w2y0O0CoD1c1epB320Lv5w7pNvrtBgta!u|kev.7,wBv1fdq#w5w8rRvJvFuVtm0ba~a(a_a*a?1g0Ea-wX2R2M0w1$wU0ba+fN0(0*0,0V04.