From efc638c733378add6781c106d0bf4a23d96a08a4 Mon Sep 17 00:00:00 2001 From: "Andreas M. Antonopoulos" Date: Wed, 21 May 2014 18:51:45 -0400 Subject: [PATCH] typo fix and addition of key-relationships (privK to pubK to addressA) diagram --- ch04.asciidoc | 9 +++++++-- images/privk_to_pubK_to_addressA.png | Bin 0 -> 23207 bytes 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 images/privk_to_pubK_to_addressA.png diff --git a/ch04.asciidoc b/ch04.asciidoc index afef4548..59cdc065 100644 --- a/ch04.asciidoc +++ b/ch04.asciidoc @@ -27,7 +27,12 @@ In most implementations, the private and public keys are stored together as a _k === Keys -Your bitcoin wallet contains a collection of key pairs, each consisting of a private key and a public key. +Your bitcoin wallet contains a collection of key pairs, each consisting of a private key and a public key. The private key (k) is a number, usually picked at random. From the private key, we use elliptic curve multiplication, a one-way cryptographic function, to generate a public key (K). From the public key (K), we use a one-way cryptographic hash function to generate a bitcoin address (A). In this section we will start with generating the private key, look at the elliptic curve math that is used to turn that into a public key and finally, generate a bitcoin address from the public key. The relationship between private key, public key and bitcoin address is shown below: + +[[k_to_K_to_A]] +.Private Key, Public Key and Bitcoin Address +image::images/privk_to_pubK_to_addressA.png["privk_to_pubK_to_addressA"] + ==== Private Keys @@ -122,7 +127,7 @@ Starting with a private key in the form of a randomly generated number +k+, we m [[key_derivation]] where +k+ is the private key, +G+ is a fixed point on the curve called the _generator point_, ((("generator point"))) and +K+ is the resulting public key, another point on the curve. Since the generator point is always the same, a private key k multiplied with G will always produce the same public key K. -To visualize multiplication of a point with an integer, we will use the simpler elliptic curve over the real numbers - remember, the math is the same. Starting with the generator point G, we take the tangent of the curve at G until it crosses the curve again at another point. This new point is the negative of G+G, or -2G. Reflectign that point across the x-axis gives us 2G. If we take the tangent at 2G, it crosses the curve at -3G, which we can reflect on the x-axis to find 3G. Continuing this process, we can bounce around the curve finding the multiples of G, 2G, 3G, 4G etc. As you can see, a randomly selected large number k, when multiplied against the generator point G is like bouncing around the curve until we land on the point kG which is the public key. This process is irreversible, meaning that it is infeasible to find the factor k (the secret k) in any way other than trying all multiples of G (1G, 2G, 3G etc) in a brute-force search for k. Since k can be an enormous number, that brute-force search would take forever. +To visualize multiplication of a point with an integer, we will use the simpler elliptic curve over the real numbers - remember, the math is the same. Starting with the generator point G, we take the tangent of the curve at G until it crosses the curve again at another point. This new point is the negative of G+G, or -2G. Reflecting that point across the x-axis gives us 2G. If we take the tangent at 2G, it crosses the curve at -3G, which we can reflect on the x-axis to find 3G. Continuing this process, we can bounce around the curve finding the multiples of G, 2G, 3G, 4G etc. As you can see, a randomly selected large number k, when multiplied against the generator point G is like bouncing around the curve until we land on the point kG which is the public key. This process is irreversible, meaning that it is infeasible to find the factor k (the secret k) in any way other than trying all multiples of G (1G, 2G, 3G etc) in a brute-force search for k. Since k can be an enormous number, that brute-force search would take forever. [[ecc_illustrated]] diff --git a/images/privk_to_pubK_to_addressA.png b/images/privk_to_pubK_to_addressA.png new file mode 100644 index 0000000000000000000000000000000000000000..22bfefe105d79236f37750f93dc99a731b40c598 GIT binary patch literal 23207 zcmZ5{Wmr_}_cqPYGjzw$UDAz&3QEHe0s~5ScMdJxjf5gOh;$DvDT+fVEg>D!@s8)5 z-~Yq=Wv;pQv-e)>S$nN}#l3f&_6v0)d|G@oG&G{8PgHc#&@iE>|DymL)NfU_Gz%J< ziOW+JC4Ikz{Vt-6%-LLy_FY^qco+sgcY-nx0K(&-3bNN-sG#Vx1Ppm7WpJr2OoLeS z@?ex+%+(@mX|JD<7|-Cn5M>zR5EvJ#-bqT&q4=J;=q}PcHZJCy%J{DStMil?nM?9d zYZFc2=KzV*gjQzglDa{NL{10Ua5Uw+P6zlr^4)@6AlYhG(Kq78 zbZuQ3xU*uc7b_)u^VW*Zpkg~=G@L>9H91t}HRSCi33|nsc&8Z0Rr*(uSRI&wZSiQ+ zBa=k`Eae)WIjVF_iKC1P&#d(v>-Ss;-GnAQ8Qw=GHco!a)&{=BB0K{^V{OQW7DvDC zA59F!&f z*6g}4eD~QdV|%(&qz zaO+>C92oOnu$U?j{096+tqiEa>0>AaK~{%OIa2KH+MsNr#$pJ3(^MrD*!UWY_g^JU zHlyZ#epX^{?o$PM|5dXG%!NiyImVPA7@B zER+OZ;JJ|!jA6@uocO=HHAg{w$Ca*|r1!Umr16FRJ_nJ&qqrN5e}ICuS90BG|2!ie z>FO^3a@UFZw`v7oEDS)fi~I3GJ@CiW-I(ir!pR}S_0)sSw?M7C(H<|`%C-CR(98Mo zlZS?V2YQm`wkt#!`ThMyhoA8?b)hY+vyu3d&XB{*<(tp8>V>D3i%nA>{3pAX zNJMVM&(V=RdB}0``R?(cwfj}U&-km;IyS=%b;jq@>Un`!Ec{T zK6{|yCec0f&C6Np_nO_+=WSCR&Nuz)&soIvEiK%F0i29FfAH2h9AYc+!pNaCK8TFkl<-q54Ke_?xI%+J>!9r~NxBI2lwR zL~*y~u16L3yAA$cJk+II=QcSM4E@ zw%8&bP8%8{APSsm^KQ6l*Cm|{ywSSet2QqTn`4K zA%o`3W76bB65=2kLO%`u6t`-f2&XKLvP3v!2DzdTqAs_m?PAI&Q(nTWrGp4o<5x=> zN3`_tH2cln0J9;)Fl009q&GQu;B$hUq}A+G!(zCrq+u*G41dkFep+oW|4O=>bv5$R zd^#k5ixOkTanQwF%Xeo}>nG4}vMXt<(`HjD`v&KRZ;O7pZx<*#XS*kZke={-l>p~L zj>}WVYWg#kLR9EO)CWW+!=0#Z60MtB!W}Uh>v8214%Z~%!MBsy#UWg0wB-7+gCOY5 zZl617C?~1L&H1|uwF-KX0^TB~;G8o07u*xs#Y2LJ6&m%CVk*uR<4jw~f%(Z6{y zaTF_X?dW7|GLCaQwPdY#*ADLOgeuuo2{(6~MDO%W^BXnUp$$dX4Z`}bvs^qY$&>Pl_ zA1azzp``=~&;SGK%vbO^oiM>Xc4F$2{7Lh~PX`neJh7Fkm6a9u*G1}c{U?8k)jP)b zH1zn96c>utH}28HqF50$LiIEu^{#_|eq9`gnyKF=T)4ZqxirY#;!M(XCoijPmv;rk zoJJh3-dfSMG986>a%>S64~q4R1LN_b2~%c){j+AEu_S5P$HAg$n9GAwgWW3+m$J?1#P5K-Z-4|2KZSuhHS<0x2V$z! zsc-<<`$h5e>GgOa!bc)yvEgKq5;#OX(~_Pkuv2_xu}~(_y16Z`{J1IJxTpC@cv9 zYhn@63wtg{s!$vDI&mt>3-a1rJ}@x`c<5KMnD=YeTS%6+O-Ujp6*jMiU2}->ralU7Z)jf{{U>c2jI?@iIrCanuTU{p%SZcWPr-WdnVBmNr zTP((^;HbBl(HOgx5-hJ6Kt@bzp1MW@xxyG;^G;{&uLFhP4zG(%KFv_m2ibUJ#p;}P zT4Frq$lef@fR1LDSsl`62@$PB5Yk$CMCK)s^96io2uIe|ys&|%=Wtdx>+#s6-GfByhhe}|=HG*oh z^JnbzWNkL*ZRFwL8*&bWP}yEnX_O}ihD8B|rvjX$Dk<)eo6^dj92#Tbw}h~yY!fE} zYZh@XstApWVi1d}q7`wvMPAXkF%^WUp!*$vta-Nx^%9Sn1CJBCNBe<@dp(I8pj2mZ zV8ks}CA}>@$|#+3j1i3!v+}vq5pDzigrv|pfy*&Q1z}1n%>js29c(@`X=0!9i;$8n zUPC8-Jjxc;Nj3~pz|39TZ7URD;>E*FV5|$+98S3MC|E~JFm(pKsDp_c>cRXo`4-@F-v*gDCx~s9`*^9TN;_q^+AZ4%{ zAAn)4u3cTZlv6sle)WA1VErh7*qc@y6^>0K?LfAhLVi-ef}JnR=`$ILEl4TjrVlmoLzQW1D3n>m0VK^JT4n*j{GLD zE*SR<3MSNK+qTZS_6CY}4SbbK&69{E$g3t&x;sM>cRRBgepl9R!IAp+uYSEaV$ z5I%bH;bknd9^4WeZ!z6DCz7ojGln6OCWPP$XGE)CJmND@!yFTf&@fHtF@X;HdnyhL zCBuBTA8zq1dF2rX#c1sBuj29#X>>e6$Bx5N*R! zh-a*m#;E9j#?0fK8+UpxHt3JInezpC>*6asfvwWcBMBRuTS?p|+-@aFNZaF11-8s! zZ^xzk(LpSZ(w3J3^2rw!>NH8{^|>r>?J1$$WLEY-C_}(`v-w00H$wIj+X~-|qX6$k zN}%B-W^wq_Ix_R&Q-MK$louSyeaJ|d_1+l6KTI@$#ZC9!uROS|_2sVAN`f_8X>Rcv z;!h)m(bp4cC?Xp0daOg4*2~H1(hk>U*Jb@E9=!$dW&rb<5SgdEFemv3saVgc!y^q^O1+D>%~mTr2|qcn@+p6x4@&-@4od6|6> z&CYIED`+E!JcZR^eN((hytk1bL#dD42*Hv^^%hBFA;W@vI0!W2h+Fw25Qa$2aIXKJ zZss((izISWYWSR4t(;GAk_0C-NR6H|utQQ!YU`5dG}s-h{3F#p35ZLyep7zrysIuZ zBR4ykG=`|h)?7={s}yDF!e#f5U9!iN;|E z*&q6j93p*i3H}i;I=Lg7hp91plms;OH%NLy5;}eRPno24Qz-ri(Z#3+oK`{*aKoP--)SMx&3_ zqkE<(5k}pK7eqB26ch3f%x89y}Z+EpKkuGa_VjAJV z>h}Q0@5DM?`NC9cFas+;!wOg+P@S{S8~kl=b3aY}m%(@`DcODX(D4&}#jb8Gnc=1^ zpyO!eA=NiJC(jXIs=bce6_I*`hEV5I&cY`tsWJleDIr*5^J=WB^QXM zM$4?oqjbtH-@@ht`UJRAW}VGAssnmNUfnCoik;&3!j8gY-%>3|USHyGOVN#AZQoq@ zdBuU{Zx6|UNt;M1SWkjY@*@*I6y5W}ZAHTb_NV$tWHcYu$I{kPM$4|%C3}5-Hs{Xo z@-ZyYfK-E@r;{PpzIw-n$_U2N{l`wZ8KsU|+3e%6x7T?ry=i^AkA`FYiPp^k5YXO#D5E`n)6t6TT)!(-+kV$jx`V8 z&W#E&d%EfI_Atu`FYxRRqZm9q9zyawz1rZM@%5SekEa>O?|(fD<7Qx487@4mx*Sw( zxAF)r2IF%h+^kuM&%@%W`e}ztPA)#AzEX{c7c5kH^O}XfmS|Qfv(}$e?$-=bJMmy1 zPtycuMGslILEx@Jrjn%%?qYNvh$}^J;Vj>}bTmi1%NuEF>?TSm!@>^U!a+XI&(Y5{oUOaLx*C%(XAvcN~w(bP)TTjxnTF6+P8&WXsJE352!l57s=Bsz|T&pQ^7 z3}Etz^6elJ4&L;CkA`UxU+&gat)^I8MneHAYD^i<<8>g#)UabjbnZ=m0n*X`3ZUXVkff^J0|8RcV~q$!CIy z8b@230YCei_vVdHTYgD2q{YmeNs@s1Rxd4Onx_YLfu$!BhHGw}W<=Fp+e2c{7zg-z5l$8-T!fm-pS4MMH7PUN#G1YFVuj7rePki~b_gu+>zBD=$8U*ScixU8WO; zy<$1SX83pL_HfD_%!SCH)Xv0*%ke14k!(||n0be__A1(u3@L5BKwzov^|}wO`1frP z{LrSoT_!di@L?$uIwe?*nWn1oV2R$g%I1g(wbGB}^M>0v?=2{n(%l!ikNyFr}fXHFVzQAYYV%(%fXK!*{wif#u&C=gd-syS^8nrf?Jnue>c<_71LKT0t_%WzL5>@6DHHTNl#B}jETuZEheL}ljn4Jt@>*zE;sflJlV|u$p zsI#^IBDj2yf)mdZkIqeaF(H`3c8JiZFHj^f0sZGVQ-4TalngU`;6v&(t)!rvb~#4b z_`pKuDA3AUhVYXa0o)-Tjy}<()7)5Smal;Mey*(+g5BT6bS4)xObG>tjPH*$vy{V6 z4k^An*Bu1X7`DG!(+ttLBs+Ynf`LUL`E}!os6JgW`up{q1|E+3RaY4A=jB){A)}>N zGM6t!r6bkQHzS!}$fdfyqT!fY;11LLqERyd4sK@!Dcwe7~!Va{axUwuqRi$6kHh;h13;!bkaF zO~YK!1x;F(}L07LLTlm1aI`D3m&sRj;J=_BJBmwEqoKZdD~Fczy~ zmTxMs(a+g#TtierlhttCLr#1+078x^TdX>wa|VH_G)>j79)r#u29}p3%0oLq z1IydX&V7|6^jMN&4d%z5l243P`x|2q$x|q$T_HUWY!kP@>4PQ+-6kUM@X5osg#6i7 zV{}xhTgMY@RgZFH2}Ij~i-;0%*brMD!$Z^n^=&}x`o z5mk#fC-2X{<;)>cjn#zYTIWU$GP{!e&;^0&^WVymez%fP8zijfN32L%J_z;mHV&GL z&Ooo|KKZ?V&=ctW&5aPcSxni9B#7spXa z**vh~e75VXqr##JNx&EMCtNg3aa0^;ju;KICHb9`s8UI2SjcQ5#JncTx94IWyn9_Eu3@|6xr4pZ3EZj7aL zEMGxRo(~+e{t~f22?6kcc%hxyInBC>80fEIKH67WXwVbfEud^dsUp}%bCp~b7LM#~ z1p3T~tDIPt0q8ymIVSK>gK3T!{T725I^*|Qd6Z82%9ZQ*5wOUHV41`3)d>DXjB(5s z_U*0nfsK81RdQX}{yVfXYwaDvS~iWvRVzpv0!{D&h+`o+eU27qK-6(UMUN*MM6wte zoBD%~aNzRAwkIlc|kMmKAQxNBa+s!O_reVy)3sp_;2XE9@Q zHfg0F*eMt`oz;Zhf#XF8rnTYd_b6m;ubQuv+%cZy>WQH-?fDG_miZ*pnH*q4%s|mc zIb~T4daTd0he@+qGtBan>7T@=!%tyxhh^kh8^BeC$`uA#(QoyZIbEz@| zj$Zv{T98q-N^r3cF%QU!n$zTO(ML|r^ZOMs$1#vLZX379GwhVikU!1P4jl*f2glSR za@h=&-WW)s0{}&b-^o!Fu=$xP)uS^+Qsab&hc}pr!i`1nTF!Qnk(mhiz4WIM3_izn zNiCj>Ee)gQ~RHIk<>`NQSCaSEjhW*?JwEU#76ADCQ!*R+M)smR0no z6x4rYpnORH!lAEGgs~t?5>X7&7ksYXFgS)+wd3U?oz;mqRfV>^>f9y}J$mDa(Huh> z=MgP7#6cC3A8+K&8<%VTw+=_oGJLd)jicbAf?jTNzWqCXbe3)>dP@toufICm#?`w` zJ#9yBxkCw63>`rY5{c3r?f+KuIWyH}N}a8O;lX~aI9fd_60!*%A1Er8@EcpG?IM%BiG!1aY`*B< z9s`pHPh()uRl?Oif(vJgQa=pc-J@aV6&Ksg_%LevviIq}2J&NGJ18XVeLiz+fE2D2 zrRCFj__Kaei(kxIz^ko!3<9`$=Kl0Id3oX;3h1ov0^bOVXh$VKxgP9on@7*<-80M}SUMV8C5jj|jQ^@dmii8**^E10W-;zJzk~cVela187y|4(9@#ch8mqT6SC9 zRdt@)is*(~pzk$2ykl>KqntGW9?oj0+tj>aq3GV$*0Q*8rf`jTGxbzWmD=q|gA%$#Ap1?L(NgIvp)-$kMmD%WBCfWl!sMnWQ@lhjM?8A_ABb%Ogv8NjW6dQ(OD5 z1e~*~&j`|s6y?|kxBb?kp><-{A)Z*Yx>+*ZjRkyvN(`sT&Ph`2oCFEIgRO&v(Xrj9 z67v+$T9C^Vb2o5x?_C$hi!jztA)sIP2LT>88;Xs&Nu_XXNS7+)D!{<9B^5=A)p^4V%R5gU+-t4t zDPkS1Px-LtxcHLX6lOcr4@%;PM`NBSpyZ<=(3kX%Px>Lvl8ceAi|E{0eX$$sA*g@CR z{=vn?4_}KNN5}6O-Jd*O?`-ncalI6RA}Vd)eP}oi-dfK7_Jn!>ERDN`2L}^_|4>3R zquIgw?-Cz9tD~rMcCfotprxY?Nyn-4mV7`;Z7o1#HPC$+&nu7aTPL_z5+zgd{}30K z1L(>CnBS`}@9=V%QslfUJzrOyij@5N*{8n(am?)@U|VxmH)m_> zb&IV`M+V}XW#bhSTg}VYlda++CVdw6-{^j!!Pj+ZR?V4F84Pcw#^57? zRxp2?2uR^y&L)tSen#ig{^9KQF-hjqHS$3kq|QA4VsGi?^*JU<>#De?%{aWD@IW>aty6@1Ep4as7_gef~q7g$ZRMi-SZc zk`!}T*l<~-nc9w&_1@fR-O0Y5RRVYuGxu_6Io}asL#k9D70|fDs?;?C6*$_MEHba! z+<(PHY(`zI+KldVBe`WaV3#N>T3baaIi88*#Va!yy8CHA@bk>@SQ-(!xbMM_#>mJ> zV{bw?`VQ~$oANT{uOliMg8Zp{+8j;{nJE!!tu|{zjx`i!z#>S=!^O& z0Lu5{o}#ie-ZW_(QEO_Yj1u!%4y?}?#VLw<3&)YH_dPJnHqznOp^1_M9&lxnrJhDn z)G92se)+Z6P%|)ZR;^~}-H2%FM)@;kEQ&{W)N7t{*Ml{miflcGq2pSc-)8SXDlEe8 zW-aavvgk3#UmT>*^Rk6l3*8^DCns}1!Zv7UE~;z4ToZksm}txEB^&IFXmvk8BXKv3 zJH^1oOiE@MS^>Vj^;mdpD_e-E5yrr(Rc;7dZSOSclS>|nbHRsy!Qe|UTb!Ogf{L|L z&Js5KhQ-y=33k*xvPZzGPHO;7S{A;Ayazm>*WyTNA0AAz-BHvNe=EtjTJ&r&-tI?) zzw436mO6|@VGmY{Kb46#mSR24c_FPrr1DiOCdQiNBUcom@FTe0mmLBQ%_DqO$=W!A z*Nzf9o)Po#5a*u@<4QE4Wsgov?kC|sX*v_zt&$>E+uo70Vl`QV+!KVjfaS=?<%4sf zIy(YwK}DV`EWHpNu`V#-_Ln3(vzW_Sj08t5^elE1IBf1WxbeqB6#+`q<9X759{;k? zp-JyBJ-Z4cvMYL7?%&i;8ZCEy_vbor#lEJT$@B6kbgn0SBOlFLnLN#jPiGUEL8LU-r->ePD5 zt@M#dm3Qs!wz`%K<{ujGkZnGk;|Y`PS*sy3W$PyEz{2GR(;F$J7YOTWqmCpEeO&ZJ zjV9oYtr)35LBJMTQr}tb*B3fr2C6WI7j8XkhQCM`mC>{0>N1~}J!_?8nS%(^E&p&j z<@2abvU}0`eAXoj9pM~#!kwFJtqfpAOqO}b0bht2o)^;viRDnh?$ddWfVcFf` z5gcMZsX`6s-Xuahc|BN@fe+7+!Fjo0?2D`YX#LGsM;sQR5ed6u*(*#(E3^%1$Z(&1 zH{*D6PTT>YLaFsd#;ox8Z>wme$LFt<(mFoGE7aq8a;L%g@Txd?8J^5mCX9W}m{-@z zuLMm)1}QG~==L?c8SfWts+N{TUUR#Y&KI-39E>1*(;+c22G3T*1k0aalU zX~^oN>@x85&WtyGbRf@kWN%-|;;ol;{Pm@~w)mzlL*6=)Y&bczzuQ)-; ztAqx)F}B-I-r9;uf1qs>HMY;4-i>Xb+JEJz40Zdcg&0p328k?C8-}^HOi?qT3hZvB|Wcyv@+$BS=epTiyy!CsHHW2 z{uC40F1z^cn+iH*QXO^rQ~QaND0=JafN3$UjBu(%6Tu9A737alxA3PU!EWx%2uOL^=FOe-xX8BHwn>x0o`U`I= zx#c~CHeF-+L%+Ou_2pphiFvd9M>GvOq_o+wMT4MS3nZ2E=PBgRy873$NLIwq2jz8n)Cbi`D zAPhK@`%PH|FuhCdbMu?X6XjnYibLxsq>A_Zw6Se+ki{qmpioxGhtDdWA$3?+<3e9< zq5H=sDZQ$xwY02_seD<_gL;<;zAK2*j|?eowf;)K4tuIJXK*7cOB83yWePOaPG(U{ z#u2nACHUT80Iu1&EEas7OYTPR-z-k{vO_n3K1TmFeP>aNqBGD|tZJc>4SMr@kmmRs z0G=Ubvyispsas)21%;^e0iZV$?-xroYLSSSFgrtkU!TyEL(s9 zgAY4N$-hTOUa}^eV9BD(@A!tYf&48I22LtJX{q0Sr+@gbGEiw-N!jB`kY~fp)cRrN z-iC>RG#M|5#+b^A0uTP^pW>8Ercy+cMZarKp-()+$IQT1wD zbHm%!Kb2-0Mc!YwVjI$R+M3I1_X*p?Gv{P+>H_#xOWTbTZX4VL!CR30xAC$0>hShx ziD5d5A3#Tcyj|Yj-`mum@ZXLXi|smPkoF0UKlzNG{DM!=YG+n_7<5}FtNtYG!n5lB zq}sweaIMmFf^&zy9M{dsH_=^Nl^oFyySQl*K4_H0>=4=fk^D3aHDaj1rEV3)N9M`O z_^%CERIO#Tx_DyEX`nOQncbj<9>R}6W`vC8AwvDE)jK#RYe91Yu$I# z9*jv>o$TSkrKNDF3x0&}mo_(#V2l@dt4K0-FQXa>Ua>ScQx&Han<+ru7+Vr!cspil_JYVAD(_uzJnCm9iMS zzA}~cfNSWB(KlS585mxVLU-F$i%zT0+T}5L;5_a3Z=9M>Ox0km!Wm?vppyH~cX#WN zJR$5Sm0cW0M}{ znlNFWT8yaMs;VISCQ1pdF=|&>SA3=^DV3$S8{rQu;|v*M4}9&W-J@x3%Rd78wQ1dA z?UsW>rAs6>h%O5;K}p;hbhnhrlt?v zJjkllOfnCC6!Qv+4%g=0@F=J`iBtH{Vrp+zIZ$Io_r9vt0vI=v3;C>JVTztrVy%6^ z9V2g~RO+xlQ(-%P1D!nE>A@qYnD<-`-sG9OkB|m*nV7W^r!Ti%pLrv5qoiYB6)*q6 zGZt%*SJKdUx?M#8XKV8@)BEbE(|S&3WFf~R2vSXpXgyDsaN&y)(<+n%u^6lJ4=?db zS#2zMz0AgHt1`R@QAZTyb1XgQcVJk*Hhe~Lqho%(fDgw)H68d_?Kb0*boz`}aWV%& zwj^VtO_RN$(spW8=ZJoiYz7!Akv~ARanUKXUn<3)u6h@RoPX1EiA}4r=(mV?B8L2~ z{MTHl_6WeI`tVCDnbVilq*u64;xb!Ym^oo- z%VPe^0(12u=p%#0@?QJT3HwHE%88jgg`%9`Pdl^#z41 z1Xak_l5aF5b>0LRnzRb{e3x^FHwp}l0@-k1`Go0C1un3{BUE{GQ;Dkk!O0^{8z$gL z$#+q@wR@1Lo2E}gH{L1P-OU(;&9fi@p77Rnt+VrM;@|C`T+8<@oA?}(^WS;0#78|U zh#~9n4cv@4n=CZl_9Pqh>Z6jzCAVx_T`+2Pm3Z6|O!TA8@u&3ieu-vB2Apa6hZ!Wv z&cy-$*8=a>I7@MwBVI%a+Nm$GkcO#q$A0sonvDjhrrTiZvZcK5rsjnw0hPen&+i{! zk3CCV@P~x1Cw6CkaKeSo48&Dv1^?C)lj{DouqA)dHlrE*!nJ!1f65bzU^nq2=`N*^e56-U^<-GL71o@fJ3}YAL+TD?iP3 zY5QH(TY%d*Oa!Cu&TsORr0kayZEKp9yFZk>uH2G}$Qiup>gtM;mf&`-(bzBxo6T_S zXjg9Y+4+^NzPZ34E@7MczI_5zw0_a zLz7zS&0k*cXoZ?^bzf3hT*}8X9wuQlCNdi=#j)=#p z=#L@kctO@J^S-N#+z=5mTu}h%RfHgP$=N^X+y-B?7I!_|_lAf!7C0*XtH*h( zPsFB4PgV5FLR%g#N)_Mk)54Q-DlE0>a;o_7Cs7NpHL}}p4B6@mYdur@ThEm}_)!rA zz=xa6lWEDWru|OLen~lZOIF;rk*2|uCwBKGIb$6)6f&Xf5lcUrm<_7>HZ8p?CO3?^VPeXRM~t;Lf|v@v3&{6`0a*;dMQLy?`RQNE3{>tjB@p&D(| zj7+BgS+Sie@@Ur}vH(Mp=yJUHey7-Q-?!%^vp%ERKe)MG5S~YMu4LnodZ-P{HQ~m* zeLc*5D$SYT#Xe?Rbil8q5;G1ZSQL$RvVjW(aKO_G@aY#?ez3^MmdYe|5*CIeS!ag znq3t83jD?QgTNdqL0tn;X&e-Q{W9soH{`9uws>}iZrB-7O5#&%Y9#RH)9>`+@n9(1 z1|rIR-|v5xbeNAMk%zb(>=+>+?9=d*sr$XD&$FEZdE)$^U|sW0XQ}Fpqx+T;l9JRp z5*NZRd&{_>kN^4~YL*1(s^dh0ks75Wy-Z49aHkZ`wA+Mc{v_FrHKMhN!W?xb(#$mK z*Z~n3H4Yqzt-xe?TI%>%?JSeSu`gxnV{cQbK7E2^!PR49$GMu0BzeU;XYI4TzbS@FElz^qxHuk0 zUHHSSjo$%r4apBwQ?l!f3d(P^)AIiH6LQa5R-4;a!_PCEgH6j1_ZMU7Zgce|+mWcD z-$yg*55d=7MgzYZ{6#$yM^ULLf|;w=!Ns)2#XHXHE>Yt8d|S62YBzJ^Q_R}^X!ORg zhV=16{s)sv=3_Zm%<@>>4Ld&u1^m29;dAm*Yens_*-33Y@kFzPBZS9U9}F+NYhaJ` z+~0|uDbum%IMFrbKX*)gxh?BH%us|msrJ*trazj=O!NBSfj4Eab*LrbGqAdO~Do}}{_`s3&B?Cp6ag126Yvt!UkcsQ~1`(It( zn90}#9<*&eOXt*L+#wMU?KY*EPPYB>1M+N+m5IuL%5$p8bMt>s*uX~e1-<9iC;K8y zUeXZ*eCuV<3HXXa=h-#*nQY1aZ!3x12NpXyq4nW5nMn!5TQdQKTC&F~QscN%mP$`I zVh^d_di*L?&81UJMZWX;5K_OsTPV|VFgyDXf*!Y>rzcRo&vO*Ej|vi_U?Kc5IgG7t zyB`qcQ9JpZ!v`pE}n%If&rL4Ix{FwXg+(j&Te zIALVA>aSVcebD|bCV57fivyX&q;UVzqgDYq>Et*@j&%9i-b9bneLqBp+20FlhX_Cq z%|i8C+5a&hbAU=L5g{S@q?Dg-_QGJ;n%Fd7p6GC}f`&m|N{1y1qe=2heqiT*fjvea z29NpUe{9dr%#@SH8C){~p&FOd;-9={8#-AiD#eHtCrNv|M9A&Tiw{+?CyDLzhWu9u zT8SNEl979a8!L7eH{lz#Mpt{uV|Y-ZX8o>~BX2Td47sOXDi(|Gv3l@F7z#8lmBl2X zM?t={p1bfbQ*jsVT2x+uQbUnXSC%h_By{~X|J8expuvJ_LMo+?t+JhBM7(+!_r0126%e01qa$oub@XLx z$Y|QPKcxM^altq1iF8wo7fA0`y)9L$FTy3(DFJofMWcGCR}|d%dCbi}7@ejh-^^t3 zheKDu(qCzD7~>peWd23Ls@U#QyoMJHjB5tZ-H`3x2Z1QICs$sL%~<0AL)ivJZtd?f z-%h&&*nC%Kq6qX1UUV2`m#FuM)-&2Yo%|sCKqzi5n!WtR{rK+gE>~fa%G?jCj~6&@b1jAI zrxg$fea+3^HJ~CCxPQ~aDQf2 z1|} z^oZ#KHQM{0oRL4qMrbu1Ki{NSpc5D>| zs*xfJ!v`6imhLwt#v-lFs}xyY*^H*Kr=kEwrTcfDcO;4w2l+)qj$fEK!3$^yC$9UPZISKLhD{2(pifkj^ z_Fh#D%d=|Y-KBzEdLR<{&J*K=v(tQhrY|hzjc<9UIz5_{$-DQQ)uv% z!l7z1qj$HXS|PeVuR5=fa(J`sT_f_WLCyM$?sxTsBd*4nX9CW{f5MhFg%y46(3{5A z-rfax@3s=xACsZJLBX!+XJy+8E2_=B*pfNVTgoPOR{vAuK7&D=ZqAhEcskg$jmvS> z+U2>0b50uhB>g^v3tIeX+P&@j)k_cOQm|8D11ZNX>yH+lhar}U(EYsZb7}D!f5-ac zm#Zz0heGg}K8sWBE-zLpJoxl(Snu6Ep_^>btIewIJXcEzceJQnXu8_0s=q z=B(eEe#1QuN=$MfBHf5|cR5l@LXaA*AdH?gj2JN*R6<$=>Cq)6tu!hjAPCZo6b24~ z^TF>q|HHYi{kUDvv-`>W{eImKPcWt3ul>!?@F}91{V79=j|EBXAHCY`4$g%-E^Y=c z+!v5Lw)O3iSr&$+u|^_?l=TbJH>d7iW_H#-vsrws+t46dno$VfVuEhU5Xv+GoBCM* zl7jD+eIsbu--3yVn)3$ijF8P+bV#bJ|bOD!9?^;5dqrsgBOi>s{bbi0Cd zm*yKJvT+Olpj6bL^I2t_&(3%j@`N!E&wZL*wpXdXXg$HDEsvZwZ*f%|%_K>L^O+7B zo%^0yeZ?Y`li@b!OvNOslmV2zn4?CsWW_UK%t8$Ls%XXFvl>Rn(ihbY1=jW`r88F> z8(AFN=bA3D8JxtF5Zui}xYgH{1H(M(LEOl;O=6~3XZqQfzFl?+EG%rO5yDupaH_nmwkmQ?>%J|p!tj)cfCi`e7D1*XdPe0avSVcbe$RIO8VkXk| z^Do;7dYAf0#W-&@Z4N&*ed@87#*9I(C)*znG6SQuX^kUyrx#iuC62X{+_vi-SW?yS z*GU0cR`8q^Msrd)cTYLCHycx~P*Vq(k*XBuhMhLZU}^}=t)k2p<5(9$W~`#tENC=d zy0im&qvCK^Hc_XJ94-u+eWpz({gEE`^+7WX z5p}Fgy(iWZkQMsE(_u=vy3^=m8QKhcrcmG{D9xx-7-GRhwl&_wz;88wO!fdqK-Hwq zk6>&ro4nIBmw2&Vcj^B5&xs&utwO3ukGiMs!vrjYe`k}U-k#1;Az4Qys8HcTpPA>= zxUB!PbF8;;?OrP!wy2|v9fo1)mgP%VqUe7~oJjB+$P^}uP&NH<0#i`iStET?K(DT{ z9SpmCtv`_O)OEH!x^fR?Xn7Jz*D9qPt;O#gnV`aDoyM^X){9m8cnTIW`F%yp+J((*%3# zbo8Q)YP80>`gMmZMm2^aN}kOaXW~^5yZO=Hqk|yknWtlo}Ru3>;nJWt|F|P1zH>IkjAq@*)btLafMdn@ zdKN_rZ{ZZwW?A?v9rX#QqCYqLB|@5~&bsnJJJS`G$bqGjsZE7ispOh0i8Y#4Bb1dw zkT0NHWxcjUtJ9q_2ue{Q{(Q6Y>*uperao$1o#R;7oH36)vB+^bpWNRfB!x!}Lq$?P zU%g6~3DV3R9w(=^6U66mE%6B+4GdlN!#dw)5~_JrY0M=XRLDh;%YaJwC{)efs_VlE*21 z1Le+AZAE9p7Nl(ooa(_qnJCNXS&3I++e&NCDCO#T>rU;N_00(Y0&3k?KKjJj%3>z+ zxXtx@o%gMvRXhUjR2^Yaka48sborYm8~=nz;kB|tiy`$)P(=a4#$)?)g%yi<`~Gtw zt169{RF8=qF`M7p?4uPNElJKv15y+gH-^Y`zB?QoAr#jIB$=XTj-@CzLqvK579VeH zyfj1s8Hv5k-<7+=%h8lVHZ1r1z=R^2cTXR<(|eD6YJ9V1;k;98Ell0+D8SdS*&qKd zTK`X7Q*IWk$5&|cV-Fn_3Tc--CW8$U6I9Cg>d+FsdCRPP?w-o02Sv82>*In0u$4ib zo#cMpzExmoUxxeRjU$AO7_G5(biu;Aan&~N`%4l%OhAZUYkjzr)x0E9xR&(Xkj|K; ztA^i>&zAR#hxu_P3n=JYYoGJ8NKyAwkYug;taC{C=zD)R{AHAzoN+%UoQ>agT}sMQ zypzA-ab11bjGUS-q9Dr<_vVLHGK_Kg)CZ)pY{kYQUH zP8CFkyn&VI9&T7zNkjpeEqYhlwYDGWHW1`CKrk7$_RBY@{T_#NRHL`!Z|9i)v<_PR z?6)YXnNxpEK1L_IyO(*u<2;eLF4sL-v`9a+x*z9u*lL-uD?D8-{6x(}ZI-ACaauYV z>pM8r`n0bmt;Wx|VehBoqgl7WdkurLOGY0_W*im2dOjfZqZ${N+W0J+V$gn<1u+W; ztNqqa`yE}LHuh~LYgf;1wR4}epF=KpFe?F24lA}8FKF<9teMzVzf)_jhEyE%bSu|Nw$1UDyc1Yq4PB9kNTJ_8uFajj$B<8ih z1YO_lZbgm2rnKdVV)5$Bc}|L~;ZItmKG&_Ctjyi(I5HwYhb%|k9qQ-{1cVa|H<1z) z@Eq1Qk+n%}*Lh58K7GHU#cKg9{R5GSs;2Zu#ecF|R~mG3S@StTvw)v?nVq@oV62#3-V2-15pb6jzJ*ka z=v?x6c!XHQ-JcX?i{t2fvfxeHIxV(psTEEJ`c`9Yzl8W1Zpe-K702~Y+NmR|oM2wz zGgFG9bL8Y!S`xNd1}v9!!T~dty*jg=%cEgoVIEInSb`ZGzrxqgf0rEu2%6d6EXR}s*M1{p$H zX$LFv*S=81>=dTgczAdSD;`g%zJ&%+{fn@gP;JGu3K=2i)3EYl_Ps?|m` zNlB>>gt8Ik0a~GN?lDWMsDuOA@-L>PqNb3ZAusu|I*KnM+8o2)uS% z*4KNKzXGX#Iz?uSX7R5V@0l4vo70utjh*0Ivm z2%&jWM`2Ab@PS-;f%C@C%5h26!)&8@!n-*aTL(28zK9l|itMWi5%11ZnuB1?#>OI6 zAl_cP2yeH7j)E8Zk18z!P7cL*I+WhRhnUb8iI;#gh7qr8-51A8IQS~-U84B>$lBLU-j++@!8M@R&vQYBj0IZX#$l; z3~A-5LnQjl`7xEQ-J%DwPz=Jj-A-=O;GKXW$w~I0hl6!_N}{& zuEDJ!3A1z;>!eLwI)k%Q_`R*YAjs0!r9bj(OAm6{fJe&&`d+SB#N1tsA8Jfu7G|5l z%3!6ELN6=LooqsnK7UjYT}`D2e6mps%)zm;=9*EY>)s z=K>WDs0cWt2}6O=zDDP?;YDH4_}Fe~ufO6Yy0Y;s))18u%sgEhjHkIFhyA~Xi@Qai zr$Z>0eGvirnQ3a@eI==H9N9yn%wph}E3K_yB+#b6{@6@i6zMoF*Hp#|)HOMS<5toj zNUa3xyo3!(O0gvO0s*(u1p>|==B~6?bnAAoYKtB^jW34PvZaQmuTe*+b@jhU=gXK0 zvZs3{Q$&Wh*u|n6DH$+NqXwxsL(y^cStti3jP-`suNykEoV-lz;)p-wp0o)D<6S14 z^&bf!k@`%`<>_FZELb)J**%QMM4ymC)VQHt(=b@}+@ZeT)P*mc2bJt~zf z&>c|x={rwBm7{O1Otl=|yN{N?4?d|zqnz~6J{aa}BUMc_2l-XF^UOZ|!_?CI7tjy` z4}lRm?W9aJQ%h^XOyEP)4R5DLWZ=SV^vhG+-wTUGnte7q%zYN zKCxhV69e=Qu3yxFLH*0-uV7Q3xHzwE!ovGw-LH8cBOb@X4R{9e=)QF^(z(R+c{_N% zN_m65VZ8$>`xNDwQNSYYYa%RYdw$jeR=bEaBWlHZ;&P)N8R;a9ZZ6y_ehvOXZ3Syr*12B$LL^)p1wf|KN zkhUW7@5O`b0mHxfzH%jri(NiVjL09I~Nsq_qtI*UAFy#_zKD`uedq zJl(p)(SH^A#z|)EssD{0WaH;^D0})1pzHDax@|ur4A`S(E_n7@-U*21Kz=)ob;01< zY%dZ$T;#YObw?y68JW>P8(CnuaE(4Q1FKDi53~)g0Dr?v5J#x7JSSXj@hmPu+E^*b z+K1Q5%gkR&Kuon|T1NWXC_+WNGs!`gst9lc+?g*ul0ogsEZ!NQ4Z4dP(aSK4Vwa9Z zS0M@ApXb+e;+Oao;fZkS*Y}f7D}$4M1T%pOu~0@6RB<9qH1$ptjD1?JL{Gex(B4&q z7#e@ER2WaIzG8koZ3w77%VtWs%@He~byL>;r27yzpax!jM`~}G%I-}uYH}d+K9G|zGdXOYjW2nIQrjgh?FDF&CT5>mL&!V zMS}Y+;Vk^cNli@?2WnIfsL>2>tVP0w5oL;KvA*DsY}BJH&cpK(UbL zsmnAcM_3-zYOC+wLaS5#Kw}oqk2G{C6s8~i>|w%*e3Ol7d?M3|o3|SPA;nzB7gWfn zA`q2?Ke0SJtR2I{A2Pjb7u|6>1_tb`pCDMG$L;2vr z=ApeKLx(Gw=B6zX0S|=c392|3U^5L{r!^CDBR?5(%6@QO=J34qWo9>AG^O#6>#6^* zHAfYJ;w1bqa}(oL?`)^ViLY=e0fF%bz|LROj!W+-(@^ok8P|z7gOb&5j=vpC}-m)o7~)iRxTX0)MlVsM{?kUx-GiMGC|q;&GLU+y*!R6r=DHg}&mTNTLhOb8Fdp{{^sB z6MYoM7ehmx0R+w{b*IJtAsM8I&<*$In8qF`+K4H+WI6X=e$89l0wwJ}YLtXQsho_T zORCbIZaVDyRkjU9kj^7U$s{A~l$GjT-^lac-7t%USq>zgr~I1}353imOtUHiH-RDA zo7EAkxg3iibmF5orV5PMR}9{%+S`657n(LgRuM2-+v`$vH02nA=xZuXHIbtW+{euL ze$vHCk-t^S6ufk`$Svl$IHHi3sZW)QB+J#hqNI9T|`M?dfj zeCT;PgSqH@^`CF6-xG<(d$0`9puC?(8c*>_80?M&E5|cfXRsrA7nc9lj-k&+K}E$* zzD>Ydnt&|PjY_jLcqw{oPYH=HzQ+c8@V1EDbpuztTM$Pv9q))-P2JQIx;Q5~ss>}Ed$ z3Y(^^472AK5d)r}MFY;aA}>H74q_<4U%xh?S|7eXopMJxW-M0X|IHAtJ*IXyGPNCX zgu*C}?$P~vfkS}5gSgZ3g_yj|Fd-FxHSMIAD_8DP=nH!C8_R`S!0RYq{45Xb=DbzV zwmk<{`L9X=NB?z#xUd*-notZQ_kgP#C7{F}OE{{Ca%L5YhcVRy z$F7i--)C;8tg$MkI0)JPW6ozszyh0b%z_O{OXow%aDm>tl0SZw0OeF;DgV}9!;Sg| zMq`AkXu4dJUZRANq8r7h`uDoBQS?SMOAqwvxKO=z5A2e(i9(OLg07{sLRluT@m|*A zT;QBH!Nl?HM77CJFQ_~qKr`!aVDcq;@`-6z7T&weI_Wv?*%Dhf|4m0o5#{suac?X~ zB0H;YXtO#rl5p$}$-)=AwvL9CQ_4}9b{AiU(%etbzIUu<<|kZ27Z8IMv!K+Lp-zPTMg<-Dwp~nwSu^P{K3Gf rhnZB@ZyaBr+Q66o-+VY|FGEu$;tn1@Eh`2dpvKcuf24+1v5oj2OA-Z^ literal 0 HcmV?d00001