From b0a439bfd5fe43d23bac6f8c98080cf1cd33e2cc Mon Sep 17 00:00:00 2001
From: Stancu Florin This application does not know who you are! Click the Sign in link above. Now this application knows that you are the user with ID = \"$userid\". Please click here to grant consent so that we may access your Windows Live data.
The rewrite rules on your server appear to be setup correctly for Social Connect to work.', 'social_connect' );
+} else {
+ $msg = sprintf( __( 'Test was unsuccessful. Expected "http://www.example.com", received "%s".', 'social_connect' ), $testing );
+}
+?>
+
+
+
+
+
+
+ YU*+S*Yrbtx5&Faz2xIWzLJtko!z{sFWFL^-OX*P
zM^V_dxei>M+c;lUX9uY@VX0HwjWQP4a6`Ww#i1@;k?OuJGabd%morA^Cgth1g&UoL
ziTew>m)hO6g(D}Q&KA~>tUR6Rvq>_D0+UBB)|c7v%#vAGvlq9^#IEWyS)RJMyZ%z@
zMwv~|EY;uDOLo_#_5mr+nZclAg1)|X_44#-IdS^vxt?V~-itEbakq5tw2e(?U>ntz
z2Cj=PMHa
Please check with your domain administrator as this may require changes to your mail server."
+msgstr "Integracja z Twitterem wymaga generowania fikcyjnych adresów email w celu autoryzowania użytkowników.
Proszę sprawdź u swojego administratora serwera czy to wymaga zmian w Twoim serwerze poczty."
+
+#: .././admin.php:76
+msgid "Consumer Key"
+msgstr "Klucz konsumenta (API)"
+
+#: .././admin.php:80
+msgid "Consumer Secret"
+msgstr "Sekretny klucz"
+
+#: .././admin.php:85
+msgid "OpenID Providers"
+msgstr "Dostawcy OpenID"
+
+#: .././admin.php:86
+msgid "Choose the OpenID providers your visitors can use to register, comment and login."
+msgstr "Wybierz dostawców OpenID dzięki którym odwiedzający będą mogli się logować, rejestrować i komentować wpisy."
+
+#: .././admin.php:109
+msgid "Save Changes"
+msgstr "Zapisz zmiany"
+
+#: .././admin.php:112
+msgid "Rewrite Diagnostics"
+msgstr "Diagnostyka przekierowań"
+
+#: .././admin.php:113
+msgid "Click on the link below to confirm your URL rewriting and query string parameter passing are setup correctly on your server. If you see a \"Test was successful\" message after clicking the link then you are good to go. If you see a 404 error or some other error then you need to update rewrite rules or ask your service provider to configure your server settings such that the below URL works correctly."
+msgstr "Kliknij w link poniżej aby sprawdzić czy ustawienia serwera dotyczące przekierowań są prawidłowe. Jeśli widzisz komunikat \"Pozytywny wynik testu\" po kliknięciu poniższego linku to znaczy, że konfiguracja jest prawidłowa. Jeśli widzisz błąd 404 lub jakiś inny błąd musisz zaktualizować ustawienia przekierowań lub skontaktować się z dostawcą hostingu w sprawie odpowiedniej konfiguracji serwera."
+
+#: .././admin.php:114
+msgid "Test server redirection settings"
+msgstr "Sprawdź ustawienia serwera"
+
+#: .././social-connect.php:20
+#, php-format
+msgid "Sorry, but you can not run Social Connect. It requires WordPress 3.0 or newer. Consider upgrading your WordPress installation, it's worth the effort.
Return to Plugins Admin page »"
+msgstr "Przykro nam, ale nie możesz korzystać z Social Connect. Wymagany jest WordPress w wersji 3.0 lub wyższej. Proszę rozważyć aktualizację WordPressa.
Return to Plugins Admin page »"
+
+#: .././social-connect.php:22
+#, php-format
+msgid "Sorry, but you can not run Social Connect. It requires the PHP libcurl extension be installed. Please contact your web host and request libcurl be installed.
Return to Plugins Admin page »"
+msgstr "Przykro nam, ale nie możesz korzystać z Social Connect. Wymagana jest rozszerzenie PHP libcurl. Proszę skontaktować się z obsługą hostingu w celu zainstalowania tego rozszerzenia.
Wróć do listy wtyczek »"
+
+#: .././social-connect.php:24
+#, php-format
+msgid "Sorry, but you can not run Social Connect. It requires PHP 5.1.2 or newer. Please contact your web host and request they migrate your PHP installation to run Social Connect.
Return to Plugins Admin page »"
+msgstr "Przykro nam, ale nie możesz korzystać z Social Connect. Wymagana wersja PHP to 5.1.2 lub nowsza. Proszę skontaktować się z obsługą hostingu w celu uruchomienia odpowiedniej wersji PHP.
Wróć do listy wtyczek »"
+
+#: .././ui.php:21
+msgid "Connect with"
+msgstr "Połącz z"
+
+#: .././ui.php:63
+#, php-format
+msgid "Welcome back %s, %scontinue?%s"
+msgstr "Witaj %s, %skontynuujemy?%s"
+
+#: .././ui.php:66
+msgid "Not you?"
+msgstr "To nie Ty?"
+
+#: .././ui.php:67
+msgid "Use another account"
+msgstr "Użyj innego konta"
+
+#: .././ui.php:82
+msgid "Enter your OpenID URL"
+msgstr "Wprowadź adres URL dostawcy OpenID"
+
+#: .././ui.php:85
+#: .././ui.php:93
+msgid "Proceed"
+msgstr "Dalej"
+
+#: .././ui.php:90
+msgid "Enter your WordPress.com blog URL"
+msgstr "Uzupełnij adres swojego bloga na WordPress.com"
+
+#: .././ui.php:162
+msgid "Login or register with Facebook, Twitter, Yahoo, Google or a Wordpress.com account"
+msgstr "Logowanie oraz rejestracja za pomocą konta Facebook, Twitter, Yahoo, Google lub WordPress.com."
+
+#: .././ui.php:214
+msgid "Title:"
+msgstr "Tytuł:"
+
+#: .././ui.php:216
+msgid "Before widget content:"
+msgstr "Dodaj przed treścią:"
+
+#: .././ui.php:218
+msgid "After widget content:"
+msgstr "Dodaj za treścią:"
+
+#: .././ui.php:220
+msgid "Hide for logged in users:"
+msgstr "Ukryj dla zalogowanych:"
+
+#: .././diagnostics/test.php:8
+msgid "Test was successful!
The rewrite rules on your server appear to be setup correctly for Social Connect to work."
+msgstr "Pozytywny wynik testu!
Zasady przepisywania adresów na Twoim serwerze są odpowiednie dla poprawnego działania Social Connect."
+
+#: .././diagnostics/test.php:10
+#, php-format
+msgid "Test was unsuccessful. Expected \"http://www.example.com\", received \"%s\"."
+msgstr "Test nieudany. Oczekiwano \"http://www.example.com\", otrzymano \"%s\"."
+
+#: .././diagnostics/test.php:20
+msgid "Social Connect Diagnostics"
+msgstr "Diagnostyka Social Connect"
+
diff --git a/www/wp-content/plugins/social-connect/liveid/callback.php b/www/wp-content/plugins/social-connect/liveid/callback.php
new file mode 100755
index 0000000..6107370
--- /dev/null
+++ b/www/wp-content/plugins/social-connect/liveid/callback.php
@@ -0,0 +1,110 @@
+$liveid_appid,"secret"=>$liveid_secret,"securityalgorithm"=>$liveid_secalgo,"returnurl"=>$liveid_return,"policyurl"=>$liveid_policy);
+
+// Initialize the WindowsLiveLogin module.
+$wll = WindowsLiveLogin::initFromXml(false,$liveid_settings);
+$wll->setDebug($DEBUG);
+
+// Extract the 'action' parameter, if any, from the request.
+$action = @$_REQUEST['action'];
+
+// If action is 'logout', clear the login cookie and redirect to the
+// logout page.
+//
+// If action is 'clearcookie', clear the login cookie and return a GIF
+// as a response to signify success.
+//
+// If action is 'login', try to process sign-in. If the sign-in is
+// successful, cache the user token in a cookie and redirect to the
+// site's main page. If sign-in failed, clear the cookie and redirect
+// to the main page.
+//
+// If action is 'delauth', get user token from the cookie. Process the
+// consent token. If the consent token is valid, store the raw consent
+// token in persistent storage. Redirect to the site's main page.
+switch ($action) {
+ case 'logout':
+ setcookie($WEBAUTHCOOKIE);
+ header("Location: $LOGOUT");
+ break;
+ case "clearcookie":
+ ob_start();
+ setcookie($WEBAUTHCOOKIE);
+
+ list($type, $response) = $wll->getClearCookieResponse();
+ header("Content-Type: $type");
+ print($response);
+
+ ob_end_flush();
+ break;
+ case 'login':
+ $user = $wll->processLogin($_REQUEST);
+
+ if ($user) {
+ if ($user->usePersistentCookie()) {
+ setcookie($WEBAUTHCOOKIE, $user->getToken(), $COOKIETTL);
+ }
+ else {
+ setcookie($WEBAUTHCOOKIE, $user->getToken());
+ }
+ header("Location: $LOGIN");
+ }
+ else {
+ setcookie($WEBAUTHCOOKIE);
+ header("Location: $LOGIN");
+ }
+ break;
+ case 'delauth':
+ $user = null;
+ $logintoken = @$_COOKIE[$WEBAUTHCOOKIE];
+
+ if ($logintoken) {
+ $user = $wll->processToken($logintoken);
+ }
+
+ if ($user) {
+ $consent = $wll->processConsent(@$_REQUEST);
+ if ($consent && $consent->isValid()) {
+ //$tokens = new TokenDB($TOKENDB);
+ //$tokens->setToken($user->getId(), $consent->getToken());
+ update_option($user->getId(),$consent->getToken());
+ } else {
+ update_option($user->getId(),"");
+ }
+ }
+ header("Location: $LOGIN");
+ break;
+ default:
+ header("Location: $LOGIN");
+ break;
+}
+?>
diff --git a/www/wp-content/plugins/social-connect/liveid/connect.php b/www/wp-content/plugins/social-connect/liveid/connect.php
new file mode 100755
index 0000000..be4a37f
--- /dev/null
+++ b/www/wp-content/plugins/social-connect/liveid/connect.php
@@ -0,0 +1,182 @@
+$liveid_appid,"secret"=>$liveid_secret,"securityalgorithm"=>$liveid_secalgo,"returnurl"=>$liveid_return,"policyurl"=>$liveid_policy);
+
+
+if($liveid_appid && $liveid_secret && $liveid_secalgo) {
+ // Initialize the WindowsLiveLogin module.
+ $wll = WindowsLiveLogin::initFromXml(false,$liveid_settings);
+ $wll->setDebug($DEBUG);
+ $APPID = $wll->getAppId();
+
+ $login_html = "
Delegation token | {$consenttoken->getDelegationToken()} |
Location ID | {$consenttoken->getLocationID()} |
Refresh token | {$consenttoken->getRefreshToken()} |
Expiry | {$expiry} |
Offers | {$consenttoken->getOffersString()} |
Context | {$consenttoken->getContext()} |
Token | {$consenttoken->getToken()} |
X}zGEMFWnvk8 zfVU1CD^%=oMi3Pv0s}1p*(5}>7s-f+2s+cynG}dUL;}WRGKcW#e*BglQ1w~21fw_B zaaItcP=UimQaJ$yh&gd@WBFWP9j#casP$lg7_bnwpQwAx@7M=MN7iX-ZsDQh9UOZ{ z7A^4F%m(K#E`j&llPRB``<7mWOaTY`_PYs= pMj=8zHZGYBU^RrVu zEG#U*;;ZPm5^c2v4sae~Fxi8|x&vS5nzv&K!Z55mX?}hlfX2ZuvuqzF{f{q@Tpp`9 zhp2ggQvatg_dJGKuYb+kR)S)&NIIRaJ7KG=t*sF^^x{AA5+$u`3~y{~5QZV%-x=Wc z0IMaKj-u$^R4VnB0jki&V)3r#07OxQb8Z?ccR~?)rcfwUsQ31JV5^2 q|<3Knao{Bwv!Z#MZz#-ad8pv{ne8vPaXw~07;+)NS!-(?rbKL z`M6T5dr!Sr#5p%xEEb<18XEcm 5C2DTfcY<)pZlDT&aO8A O0000 dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf cmkPxlXU zXtB<+gOG(}tgL~v&u}}Jf*d3QNAgIcm1g#v`M#N5Ydju*dU|^5y}Z0A-e8{R>1;N8 zXx-f0{8CGM3m&aCT5D|wL7>v XKqoOZiS5CjYc14LxW zz! a)oK;b^Oh1E3)is_5w5PTI5;? DKHExzyL`#$eJ zerA7v|J8S}TI0jR14=0#A0Nr*^X%^K;<_#(!Ym9i^Z5o?YrQOxN~QF0I8-8nQi?DP z3Bzz}$G^dMcXy;xDedNRxkIgWuix*#={sh#S*?^h{0$N2aLV)6RV)Ai002ovPDHLk FV1lU+C+q+K literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/social-connect/media/img/openid_32.png b/www/wp-content/plugins/social-connect/media/img/openid_32.png new file mode 100755 index 0000000000000000000000000000000000000000..073c0e6fb403c4ed07712d763138acd136b2c58a GIT binary patch literal 1204 zcmV;l1WWsgP) dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf HNGZ4w7p@ij0J`@J2o7CzQC!S?1i@9Q zFv}@Ya3P4U+z4vp3r3R)(b1?7o41?$+J(uT#3Xj&OAkB{F6Z3yJOAgL=gAf1*~!Vt zdtk=4?RH+lgb?Sz@4daf@0@43AHiU7ANZl8ql2odDufWF-tlC!ZJSIcLnIObI8YR2 zzyUZuK7Mam*1V!90GOtUWmzu@AW0G~mkWSkFo+~cANu wSYkN_;pdh$wyxA^ R`8f*<3k3kSZ8JAFM`L3nJv}}6d_H_W zU)lE+O+h(;P$ &bH^YioN z0ZK`@y1L5N))oM6w;O=Awl)R^2CyuvXbYyNrwN5Z1Ofq6RmC(-Ha9nml75u}D=RDP z?d>7UG63D(-AqhO(9+U^X`1M|UbF>+gM;|}ekLa;Sz21+^767swUPj~Z5PmOZ*OyW zc<59;H8sW1&=8qShEyu$_&roW(=?*dDC_I%+}_?g@ud_fn1Y82?C$P5m5+^$(cj-+ zkT_?qJc3+&b#*o4 !rTF z9w7u>U0wHnl7tX~bUIxgAYYzb^#Gct6-nv% BE^|ZFO($v(%n`c}`|9KE4 zlSu{#2kGqWBoGL2eSHnwPe?c%CL9j)HVa_4{PcW)QW7SUNjx48V`F1vG8xX!&bYa` z;qLAZUDq++&SEzINal?nE0K5}Ks+AD>-82n>bib^>`D^d-Q6gPg3IMX2*F)CjbRuV z@pwha6NyA20PtB=)$eO+Y91vv45Ok% rtrjJN*K SneTxB0000 dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf pozInVzolurkvfHew2jZmO$({jX{|c-4w8S(bHyEaDUvAlTI^Xi#eH z#+C4Fy%vQC{ 4%2L-_VLwSuBLI_{kh0V%w}PYG6bI{X-eaqIfJgTi z(0ICfBH$=D$gMyb23SgO?!>4})zI9Dz4$0M43J@lg%o6p&KIj2A7zFaWLUsX9#tyE z{^i ti6t6lBakz-eLg(;=oWPnHBtfD2#-8S4+RIu;?#hk>{6zJtxL;_T*p z1 N`ax=D`IGKjQ_zjm^zYXVF}8f~R9H{Qd&S`|7_9^gy2hrSRxiN#?z18Ei0 uxlpZi61% $_r0000 ~X@ literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/social-connect/media/img/twitter_32.png b/www/wp-content/plugins/social-connect/media/img/twitter_32.png new file mode 100755 index 0000000000000000000000000000000000000000..38d05450fd8c400d7cb0b6207b4049e4ea46471b GIT binary patch literal 1089 zcmV-H1it%;P) dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf 3W2idN&Q3k%YPx)2nKLS0!DkuD0>oh$zV z7b>_A7lpbIe{4#GB4(qA2!f!NVlWb`NsKr#(_}K4zIpfF<6>sQOlRJmbe#6UgW=A3 z=X~xt=YH>uBO*AC1HgqVSKrQr;R`9>&vP5hRI7jAC>B3{>DYs>H`bg6z{P7Tzj_A- zX733CM%*-BD%IEIu`z5a&7V<3yjxj%@$jMh_5eQk>B>9ViHX-9%^sj^4BJW*i}V%1 za~yJRnrte?kL6v;>+A2nI`{DT6o4C!oSqH>)?-B>RzxBg=<5@SP>2=lv0^$1aKn+) z04@N2kQbn$O<#B2$tv35xoPl&{2qW3LrH54{VjWvm9$1lZL= #?tzH4Jj-T(hEe#E3?C*3jO*4QI#CGmIuWjkzaQ1&` zg|3&pUIDT0#_0g?=3AE%{r$k@xo3|vb9gKnfF=MX_8Gu!2M8vPB>RhS>C3B}f8}JN zi)uavMg*~GK!*x+GvnQ5jcKI00$p0r3&4Pvw#HPgEs#B;j@F?C-IAX@F^RIoRLvF8 z(&ZR-sKEQDl9f=4@JAF;wcIVbMF~Z)o~RB0Kkw{XUg&OG+K%C^wcwYP>)by*+&e(a z40MrVymlr0YVjY$amaYJ8+|+s2)y*Z0a~OumTsrOZCjF&JPV5j#MDGp;wqS0lx!x= ziHF9Sofu3E88^4Uh+T?D2Lm>v_V4}i>5l$N#eB28$-Vh(V$568fhQ)@e7fpbJX+21 zJS3CBP)+n{)d6GIfvKG0_}Bp77xxbl`d}nV1~4}ZktJ9mRy>uja!*iw&1zYzGNF z;mlOThD!EPtup{yu_osxPx0@Sh_OKP#*B~e*a4~{{8qV >3kxXFs#^pLw1)yV*< x|B2F_nVS?KyMp3yij{E12<^H&B z9B3j 6Of(5++%zy>5}4&?E=h%}mcUYVo5BL$ z{TM6VI4|B^e%`qce iPtc=omY%2w? )%0cFE)J4 zO&mpO59T5TeUUuph1E^mExSlM4q8qF?STcY27WcSxrKdqpz;&qFV~}KHK@|US_g+R zAJb+yv{@^}tM%@H`)(5%k&`D(1csGc!kvevjn82j@BF>i5jLVho=+c=u25N`-hBK9 q&+QVyK7t1hcM#Cq@_pQzyNEyWA1L4wB!iv+0000 dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf 7C{S%==xYhc6FV}WM?undmk3+%7RU9c@O8i=l>7aYBrmbS(eQeMG>%! z<9S}>`~I|5uh+vM2!d+0x*R`Y7!pNM 3EQb;L#!k5_tEZu*E>ser1Bzq4scI*V6=k-8&o+E@nDTOPg?7f!fIh&q6p*7-Q z4_H`^#qdItgD;No{pAOa%p9i?*17ilG7n~7A*IAsO7#Gp#}65I!FFtHVNo)Woj%Xf z+&*ekEiQdH#!_ZjIXTE*Umu`!^#UXv)(ikPplupjga4Is*#--&Ma|)zr~U!{jv%GP zK6#ceD_5hGLI^>%QRidwmKCmzD1nsF^$Z(UZ0&hmr4(9g;y7l{^#G?7GgOguf zA7|Xr99?&dJKwG`Ra?dO>NaYX35ufVPw@Ox%y6pleSvU&y7n+@MheWkwdkcY>>u2M z6F+5a{w~?BD;Q(?mw0 2CX#!wrw*sFhIQH2}S!J(k^2;gXro`idGANBuRb)9LI@TtyZ9v zqEe{ 00000 dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf H$R zK~z|Uy_aijTt^jvzcX`p*Sqoh{n%D($G9Ozi4#F8-fAlHqlHQp4M8BGAS@d74+VsT zcqsz$D*QnL35mZ^5fw %GtOHi(G)M?`*^&*#6jIaUQ2A0PiG za5$ICkw_#qq4r9=_ZVX+6bb-WdV6~ZHvw+kxbY+48~gX~$9s>p7U$fa0w|@>T33Sw z_;Fuf-!~P2wf1x_m%|uC6h&BT@!s#LT5E}-2xAPnTn=mPX@CI0IhR*TVXfWMsP81! zTC~@1)btkQk3^VogPnjRSz{ctlC_#W!Ybyg^{SIA^oW3gv=iFwn)ePXh zuRGyiU;G@|;sOVfie$4!lz@QoD@^|ID}+ S7F`XB zR6 R(7D zK(ru%lz%md0z^=)T_o}cxIFe8x^so^KKFUrGd;94bzoe~%*_JR(=()-Gd%I&Q`<7I zD?l`Qk(3rxq830Y1qu?6J&v`OD}`Yi8ihn(f{pcQCf24fvBzphQ(p6#<3lw*wgJ@L z_hXmKjyDywR-gqDFg=F|oMS4yL@KE;$|IuCNly@YN)b@<9BO+{jgK0D>R#O{YgaDN zaB~t#RU!{S2kL(?0@5?Un}tg(2iHhSd8}*`obx1{U@i2wAFJ{4mexQx@^_j$J81aC z8C36mBnIxsE#JhwaRK|A@1frNQEW>m EZsLLd4u&2$Krr}0e5pitOCMuJ!Nr1BptMJc zAmR~$qg}_h+22-ztr_^$%j5j~h3ho5wUTJcv9B*nkO`R6G0)DfGWPr>zW>N!03N*W zaRy5dF;aMeTcuf|*pgJuysPs=40OB?7s<9xyX!U_n=>R^d(i0s2?Fqd^QeXtx@jLr zx&`kee^rxa}}a-S=~%@5#+$+ X}zGEMFWnvk8 zfVU1CD^%=oMi3Pv0s}1p*(5}>7s-f+2s+cynG}dUL;}WRGKcW#e*BglQ1w~21fw_B zaaItcP=UimQaJ$yh&gd@WBFWP9j#casP$lg7_bnwpQwAx@7M=MN7iX-ZsDQh9UOZ{ z7A^4F%m(K#E`j&llPRB``<7mWOaTY`_PYs= pMj=8zHZGYBU^RrVu zEG#U*;;ZPm5^c2v4sae~Fxi8|x&vS5nzv&K!Z55mX?}hlfX2ZuvuqzF{f{q@Tpp`9 zhp2ggQvatg_dJGKuYb+kR)S)&NIIRaJ7KG=t*sF^^x{AA5+$u`3~y{~5QZV%-x=Wc z0IMaKj-u$^R4VnB0jki&V)3r#07OxQb8Z?ccR~?)rcfwUsQ31JV5^2 q|<3Knao{Bwv!Z#MZz#-ad8pv{ne8vPaXw~07;+)NS!-(?rbKL z`M6T5dr!Sr#5p%xEEb<18XEcm 5C2DTfcY<)pZlDT&aO8A O0000 dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf MCB3i~s X0b6un;0_uk#zLA)Fu_6vf+AiivEVdOsex9Uens8lL{ z6sVF2&xim3->Ow4lgWQ#f7;l9y!QftB!WUjAR h7nJ~%iC zBEsb4Bpz~#M+A}*pEo!0JQl |KCZ2Sq=ff7!B{4P z4@*nf+uQRC9LE6>;o#r^0MP68FgrVou}tQXfIQFNYkqznKW}cZzrT-myN%Z6B~n8} za2y8!VB0p{&CU7yljl7WG#U-W<8e$(Ou)8n*tU&aE{Bzs73}Wr;_B)OtyT*Q3kzs8 z8a@F+p%6zR5iS;s%*?#Av%`r*f=5S3xn8exr_ nVGp*EOI0g;ZP{V zFbsoD(`3uC*mYg*bUJLBCa2SBe$e{*I-91+wOWl`*JaDH*fdQx41*QV^B|=}x7$Ub zP{75-1r`?
wCS0Qc!Szepze z>-M%!a9ppm)!)y3y3WBsfCHMwnx?U)s%KCXB`Sny3L*H3r>Q7P^cT~kRon5z2?hWF N002ovPDHLkV1k0GPniG! literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/social-connect/media/img/wordpress_32.png b/www/wp-content/plugins/social-connect/media/img/wordpress_32.png new file mode 100755 index 0000000000000000000000000000000000000000..7aa7ec11bf71c4f0b33ac5ef6a44b0f8ddbfcccb GIT binary patch literal 1740 zcmV;-1~d7IP) dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf ;E zK~z|Uy_aolQ`Z^CfA`$P*aYk?ad=UZF}fD w%%05h@RGYN258Je|ZevpEUZk$A)N~Z7&Z}7 j$||;0n)&TV>`ju_nduj zeB+DlOqJ3-(j(pTJolXc|NPH$9^I>vVZmVV2=FLS&ZlG7fIoJ0bo?+K(9#bL_4WS* zwv?5XQR4ODC@fr3be;fq?;lqut%zKhOaDe*aimSy_237GrjHc1eNnHJ8gpQBe`& dgb)a!<8U}|I+vkoTHg8bcnp`ziIiqJz&ruT z^z<}R%0+?W@mcEX>e#et6JD>EjT<)tFf}#B)YKIH{r&XxbR(t2>2&5Ll8L1Oe5s~J zIi1d&FDs>p#$wdg*3#D2hS%#|RH1l0PJ4Sh@18n^5CUD-bG|n>H^ Uu_SrqtQ8yg$r#EBDJyEc}WK!5-HS^
r03?2%FxOD0A0+>=+^^nF(DWD`uWh-#( z*h>I-JRVlM-5fdc0s{jBoILp|Bg4Zu91Z}Ai%VEuw45iO{5I>?ucx%M6w^#1gaE+d zSjODktTj$!W+)(SH^49qlF1}4mkWT($||0I<{1EdJ|8}xk6#=+#+fr=05lDb9(~c8 z@ALUszP!k~*6Y@Nj){p0W@ctG6iDF-Sg3)tS65f__~TDl<8x>G&~@GB+js0hnkGt0 zCU4$kbo3)z{@LfABWW0@`OUSo?9IZl2uP)DzO}N7x nrM$e{ik S;dA88x~VQ+FYA&AYa?J&x(b^;jCk*ZwOlX8#k|W_3BkyUeh39 zBxnc*(RCeDnl_xg3J6U@2thE|h>=L3q$D~MAsp_t?eOZqM{M&>zkAA-*L9uk+jro0 zyAeXLqNpg30`q+!?V3mtaJ$`X-{H67;T}7IciP*D#o|`Jx2MOJ@9pU!5U97tk;se< zXF&m_tX`m$WMpK-l5tN<3sRaWCF$<&wBnPKlNiY)FaGpr7)Ao6B-gJ`Fg!eL T)2>hV=uytL@4wgH*VZmxN`ONR<5fvMc}PB-(=UWFC&DY zv2iD+X(FYhBh-Nqg08L(8XI?7Yy9c8lXe2OB2+5Ne|!98OYX-G97M{LY#pKZIR5f) zSiNQq6%`fey3T{m&A41Hlu}GgjC1A66;7W%&4bO&=( !SsyOH{?#w7-3uY`csv9fcUp75vHuYo8iIH{9%8W=KYsp4IWh7U zVcNfY=sSG);SfRyT3cJKcrt0wynDB;;`g<+S;Z=)Nn6_^#G+B2_|^d;k?9=k-_r?m zF`S;h!@ &>lO|kc$AA52Xn5i z?p44{N|aPtK7D7J*1awK;rG9zysR806%Rf1a8_5;b)Dws-6*N>taQ`5w}p#?gE`kU zlM4zI%-@3R2-c=6Gnc*c%5m#i*9FmN6t~-L#m D~L?nbI zCb}VUjmEe%u3Tv%qKPK3F+@y&1;j)WG>y^)1_i+=2q+YgPbt`ze(B8A`(Clpoj2)p z-po1Y-gECAAx1I!c?JSvfFR(1f+*060?JE^A-s4!8f)*fBUv(VF3CVqRmifMI1?5+ ztp?(50)`37K |6NmCKI_;!>X*ou8`-0f;`guk@`DA28ks(KA z2%< Q9!z zY)XNba4Lzg36W0$;Ybu0s!HKp_uxU#8%`+9F;mxd=%vzG9NnMG$2q^gg^@2#DnOtL zNP#Pn- LCl6aQ*V*1BoyWw;vbKVt8^6qDDa1;Cq~_Ea3}f zPD>?Q2O-gt9VxWpcE {gCO&{SKE-xZ@Yg(|2
dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf xMyKlo#m zyBC}2`#wlnc?mU_n(1o&ff1j*hf2s@y`09HP8{W8=4+IHH4abo)79I{&ZGIP%wNjG zx(7tU*(?e#;cC?_3fC1e`b+-RXtc(NKTmMr@NV`T+d?RPE~wg<*ZK6am(Hf|965V} z2UlJ&B6F)XTB9m9SJ~|JEJA@`QX@*pG(!_3c)pg7k@%nDNN@q+K dbVG7wVRUJ4ZXi@?ZDjy9FETVQ zFgf _yd%BQ9&amfCfEi+Lt@_JpXoH%){QDU!T{YxpqMfl~r+c zLoX`1a0Tg<$?)JP3OaV~-Mriv@X?M#9|CPn%kIR ->eaq=zh=tSBmR4z3WS?F`YFPHk<1p@HG8fG0o*(TLKpEvF>p z`LHcXSv=x#0+RwHwkeT9m0SRTZAygjwm7#1xOQo*4})|)&M5&>A?5A)dSApOU# n6Ss_9=sS%8Zl^E_yAF(48!p9)BTRmk>i{a5K;rlfeaUa z9bwhe4FD`?OmOt*S*qvM1JJmnju&>dgbHwM!7ra*VIt-D4&3Oq0~}IJ?}CsSaP?f0 z+PmT`SvilIx+ $>MWkvwAy>W{RX|4Qlthg%w*Oh$T=|R z1ULd+5avJ*=YHs8Uc+2!>f=1Jb|pRkp2X_O;D{_KEy+vU*CAav^G!EB7m_pb4Z|Qk zYGRwgDVuX30w7$k3&JkTbUAbQD!Q(t>pB~^w~~^5L~6#_*0vtyL^%1`Wv-pS5t^^- zI(`2oXT(LI2Ba)F2ZpbY(SEX*2cKF@MWw;^ch-}rt7N2ioMQ*t$!2ce5r$!q>bGXB zFQuGvAU6jJU4I@kE*{^s z%D=bF?5sHlUi~RFo^!yT1Ja%SEYOJfZKV{m=JX}IFzpoavML&?n}Py@bD(eyjF|nn z!ohM9ep^M$;o9&e02&iZL-V%1`wXidy`R5MUEuruok0PCEl{%HY1q1DIkoi(TGllC z0@kc+;qGON0QhS6+0eYztt$X{xOD}`_jLpXsQk0QmA)lm*!;@c8L^70IL$5hc#FBG zL-Ve64zpy%0 9a!k RW!=+MxX#-r7g>E*=q@}hoqR%Eb62GdERQ2!jc^l>xbYCsgI0HV(}z5c$g85 %e<}1B?X(koU7%VyJup8eTEx?r)a>1-SnMC6e}6Cb>A^00000 LNkvXXu0mjf^uuSG literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/social-connect/media/js/connect.js b/www/wp-content/plugins/social-connect/media/js/connect.js new file mode 100755 index 0000000..b566cbc --- /dev/null +++ b/www/wp-content/plugins/social-connect/media/js/connect.js @@ -0,0 +1,143 @@ +jQuery.noConflict(); +(function($) { + $(function() { + // ready to roll + var _social_connect_wordpress_form = $($('.social_connect_wordpress_form')[0]); + _social_connect_wordpress_form.dialog({ autoOpen: false, modal: true, dialogClass: 'social-connect-dialog', resizable: false, maxHeight: 400, width:350, maxWidth: 600 }); + + var _do_google_connect = function() { + var google_auth = $('#social_connect_google_auth'); + var redirect_uri = google_auth.find('input[type=hidden][name=redirect_uri]').val(); + + window.open(redirect_uri,'','scrollbars=no,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + }; + + var _do_yahoo_connect = function() { + var yahoo_auth = $('#social_connect_yahoo_auth'); + var redirect_uri = yahoo_auth.find('input[type=hidden][name=redirect_uri]').val(); + + window.open(redirect_uri,'','scrollbars=no,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + }; + + var _do_openid_connect = function() { + var openid_auth = $('#social_connect_openid_auth'); + var redirect_uri = openid_auth.find('input[type=hidden][name=redirect_uri]').val(); + + window.open(redirect_uri,'','scrollbars=no,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + }; + + var _do_twitter_connect = function() { + var twitter_auth = $('#social_connect_twitter_auth'); + var redirect_uri = twitter_auth.find('input[type=hidden][name=redirect_uri]').val(); + + window.open(redirect_uri,'','scrollbars=no,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + }; + + var _do_wordpress_connect = function(e) { + var wordpress_auth = $('#social_connect_wordpress_auth'); + var redirect_uri = wordpress_auth.find('input[type=hidden][name=redirect_uri]').val(); + var context = $(e.target).parents('.social_connect_wordpress_form')[0]; + var blog_name = $('.wordpress_blog_url', context).val(); + var blog_url = "http://" + blog_name + ".wordpress.com"; + redirect_uri = redirect_uri + "?wordpress_blog_url=" + encodeURIComponent(blog_url); + + window.open(redirect_uri,'','scrollbars=yes,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + }; + + var _do_facebook_connect = function() { + var facebook_auth = $('#social_connect_facebook_auth'); + var client_id = facebook_auth.find('input[type=hidden][name=client_id]').val(); + var redirect_uri = facebook_auth.find('input[type=hidden][name=redirect_uri]').val(); + + if(client_id == "") { + alert("Social Connect plugin has not been configured for this provider") + } else { + window.open('https://graph.facebook.com/oauth/authorize?client_id=' + client_id + '&redirect_uri=' + redirect_uri + '&scope=email', + '','scrollbars=no,menubar=no,height=400,width=800,resizable=yes,toolbar=no,status=no'); + } + }; + + // Close dialog if open and user clicks anywhere outside of it + function overlay_click_close() { + if (closedialog) { + _social_connect_already_connected_form.dialog('close'); + } + closedialog = 1; + } + + $(".social_connect_login_facebook").click(function() { + _do_facebook_connect(); + }); + + $(".social_connect_login_continue_facebook").click(function() { + _do_facebook_connect(); + }); + + $(".social_connect_login_twitter").click(function() { + _do_twitter_connect(); + }); + + $(".social_connect_login_continue_twitter").click(function() { + _do_twitter_connect(); + }); + + $(".social_connect_login_google").click(function() { + _do_google_connect(); + }); + + $(".social_connect_login_continue_google").click(function() { + _do_google_connect(); + }); + + $(".social_connect_login_yahoo").click(function() { + _do_yahoo_connect(); + }); + $(".social_connect_login_openid").click(function() { + _do_openid_connect(); + }); + + $(".social_connect_login_continue_yahoo").click(function() { + _do_yahoo_connect(); + }); + + $(".social_connect_login_wordpress").click(function() { + _social_connect_wordpress_form.dialog('open'); + }); + + $(".social_connect_wordpress_proceed").click(function(e) { + _do_wordpress_connect(e); + }); + }); +})(jQuery); + + +window.wp_social_connect = function(config) { + jQuery('#loginform').unbind('submit.simplemodal-login'); + + var form_id = '#loginform'; + + if(!jQuery('#loginform').length) { + // if register form exists, just use that + if(jQuery('#registerform').length) { + form_id = '#registerform'; + } else { + // create the login form + var login_uri = jQuery("#social_connect_login_form_uri").val(); + jQuery('body').append(""); + jQuery('#loginform').append(""); + } + } + + jQuery.each(config, function(key, value) { + jQuery("#" + key).remove(); + jQuery(form_id).append(""); + }); + + if(jQuery("#simplemodal-login-form").length) { + var current_url = window.location.href; + jQuery("#redirect_to").remove(); + jQuery(form_id).append(""); + } + + jQuery(form_id).submit(); +} diff --git a/www/wp-content/plugins/social-connect/openid/connect.php b/www/wp-content/plugins/social-connect/openid/connect.php new file mode 100755 index 0000000..02391e1 --- /dev/null +++ b/www/wp-content/plugins/social-connect/openid/connect.php @@ -0,0 +1,45 @@ +identity = urldecode($_GET['openid_url']); + $openid->required = array('namePerson/first', 'namePerson/last', 'contact/email'); + header('Location: ' . $openid->authUrl()); + } else { + $openid = new LightOpenID; + if($openid->validate()) { + $open_id = $openid->identity; + $attributes = $openid->getAttributes(); + $email = $attributes['contact/email']; + $first_name = $attributes['namePerson/first']; + $last_name = $attributes['namePerson/last']; + $signature = social_connect_generate_signature($open_id); + ?> + + + + + + + + getMessage(); +} +?> diff --git a/www/wp-content/plugins/social-connect/openid/openid.php b/www/wp-content/plugins/social-connect/openid/openid.php new file mode 100755 index 0000000..126896b --- /dev/null +++ b/www/wp-content/plugins/social-connect/openid/openid.php @@ -0,0 +1,706 @@ + +* $openid = new LightOpenID; +* $openid->identity = 'ID supplied by user'; +* header('Location: ' . $openid->authUrl()); +* +* The provider then sends various parameters via GET, one of them is openid_mode. +* Step two is verification: +* +* if ($this->data['openid_mode']) { +* $openid = new LightOpenID; +* echo $openid->validate() ? 'Logged in.' : 'Failed'; +* } +*
+* +* Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias). +* The default values for those are: +* $openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; +* $openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI']; # without the query part, if present +* If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess. +* +* AX and SREG extensions are supported. +* To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl(). +* These are arrays, with values being AX schema paths (the 'path' part of the URL). +* For example: +* $openid->required = array('namePerson/friendly', 'contact/email'); +* $openid->optional = array('namePerson/first'); +* If the server supports only SREG or OpenID 1.1, these are automaticaly +* mapped to SREG names, so that user doesn't have to know anything about the server. +* +* To get the values, use $openid->getAttributes(). +* +* +* The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled.. +* @author Mewp +* @copyright Copyright (c) 2010, Mewp +* @license http://www.opensource.org/licenses/mit-license.php MIT +*/ +class LightOpenID +{ + public $returnUrl + , $required = array() + , $optional = array(); + private $identity, $claimed_id; + protected $server, $version, $trustRoot, $aliases, $identifier_select = false + , $ax = false, $sreg = false, $data; + static protected $ax_to_sreg = array( + 'namePerson/friendly' => 'nickname', + 'contact/email' => 'email', + 'namePerson' => 'fullname', + 'birthDate' => 'dob', + 'person/gender' => 'gender', + 'contact/postalCode/home' => 'postcode', + 'contact/country/home' => 'country', + 'pref/language' => 'language', + 'pref/timezone' => 'timezone', + ); + + function __construct() + { + $this->trustRoot = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; + $uri = $_SERVER['REQUEST_URI']; + $uri = strpos($uri, '?') ? substr($uri, 0, strpos($uri, '?')) : $uri; + $this->returnUrl = $this->trustRoot . $uri; + + $this->data = $_POST + $_GET; # OPs may send data as POST or GET. + } + + function __set($name, $value) + { + switch ($name) { + case 'identity': + if (strlen($value = trim((String) $value))) { + if (preg_match('#^xri:/*#i', $value, $m)) { + $value = substr($value, strlen($m[0])); + } elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) { + $value = "http://$value"; + } + if (preg_match('#^https?://[^/]+$#i', $value, $m)) { + $value .= '/'; + } + } + $this->$name = $this->claimed_id = $value; + break; + case 'trustRoot': + case 'realm': + $this->trustRoot = trim($value); + } + } + + function __get($name) + { + switch ($name) { + case 'identity': + # We return claimed_id instead of identity, + # because the developer should see the claimed identifier, + # i.e. what he set as identity, not the op-local identifier (which is what we verify) + return $this->claimed_id; + case 'trustRoot': + case 'realm': + return $this->trustRoot; + } + } + + /** + * Checks if the server specified in the url exists. + * + * @param $url url to check + * @return true, if the server exists; false otherwise + */ + function hostExists($url) + { + if (strpos($url, '/') === false) { + $server = $url; + } else { + $server = @parse_url($url, PHP_URL_HOST); + } + + if (!$server) { + return false; + } + + return !!gethostbynamel($server); + } + + protected function request_curl($url, $method='GET', $params=array()) + { + $params = http_build_query($params, '', '&'); + $curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : '')); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*')); + if ($method == 'POST') { + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $params); + } elseif ($method == 'HEAD') { + curl_setopt($curl, CURLOPT_HEADER, true); + curl_setopt($curl, CURLOPT_NOBODY, true); + } else { + curl_setopt($curl, CURLOPT_HTTPGET, true); + } + $response = curl_exec($curl); + + if($method == 'HEAD') { + $headers = array(); + foreach(explode("\n", $response) as $header) { + $pos = strpos($header,':'); + $name = strtolower(trim(substr($header, 0, $pos))); + $headers[$name] = trim(substr($header, $pos+1)); + } + + # Updating claimed_id in case of redirections. + $effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); + if($effective_url != $url) { + $this->claimed_id = $effective_url; + } + + return $headers; + } + + if (curl_errno($curl)) { + throw new ErrorException(curl_error($curl), curl_errno($curl)); + } + + return $response; + } + + protected function request_streams($url, $method='GET', $params=array()) + { + if(!$this->hostExists($url)) { + throw new ErrorException('Invalid request.'); + } + + $params = http_build_query($params, '', '&'); + switch($method) { + case 'GET': + $opts = array( + 'http' => array( + 'method' => 'GET', + 'header' => 'Accept: application/xrds+xml, */*', + 'ignore_errors' => true, + ) + ); + $url = $url . ($params ? '?' . $params : ''); + break; + case 'POST': + $opts = array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type: application/x-www-form-urlencoded', + 'content' => $params, + 'ignore_errors' => true, + ) + ); + break; + case 'HEAD': + # We want to send a HEAD request, + # but since get_headers doesn't accept $context parameter, + # we have to change the defaults. + $default = stream_context_get_options(stream_context_get_default()); + stream_context_get_default( + array('http' => array( + 'method' => 'HEAD', + 'header' => 'Accept: application/xrds+xml, */*', + 'ignore_errors' => true, + )) + ); + + $url = $url . ($params ? '?' . $params : ''); + $headers_tmp = get_headers ($url); + if(!$headers_tmp) { + return array(); + } + + # Parsing headers. + $headers = array(); + foreach($headers_tmp as $header) { + $pos = strpos($header,':'); + $name = strtolower(trim(substr($header, 0, $pos))); + $headers[$name] = trim(substr($header, $pos+1)); + + # Following possible redirections. The point is just to have + # claimed_id change with them, because get_headers() will + # follow redirections automatically. + # We ignore redirections with relative paths. + # If any known provider uses them, file a bug report. + if($name == 'location') { + if(strpos($headers[$name], 'http') === 0) { + $this->claimed_id = $headers[$name]; + } elseif($headers[$name][0] == '/') { + $parsed_url = parse_url($this->claimed_id); + $this->claimed_id = $parsed_url['scheme'] . '://' + . $parsed_url['host'] + . $headers[$name]; + } + } + } + + # And restore them. + stream_context_get_default($default); + return $headers; + } + $context = stream_context_create ($opts); + + return file_get_contents($url, false, $context); + } + + protected function request($url, $method='GET', $params=array()) + { + if(function_exists('curl_init') && !ini_get('safe_mode')) { + return $this->request_curl($url, $method, $params); + } + return $this->request_streams($url, $method, $params); + } + + protected function build_url($url, $parts) + { + if (isset($url['query'], $parts['query'])) { + $parts['query'] = $url['query'] . '&' . $parts['query']; + } + + $url = $parts + $url; + $url = $url['scheme'] . '://' + . (empty($url['username'])?'' + :(empty($url['password'])? "{$url['username']}@" + :"{$url['username']}:{$url['password']}@")) + . $url['host'] + . (empty($url['port'])?'':":{$url['port']}") + . (empty($url['path'])?'':$url['path']) + . (empty($url['query'])?'':"?{$url['query']}") + . (empty($url['fragment'])?'':":{$url['fragment']}"); + return $url; + } + + /** + * Helper function used to scan for / tags and extract information + * from them + */ + protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName) + { + preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1); + preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2); + + $result = array_merge($matches1[1], $matches2[1]); + return empty($result)?false:$result[0]; + } + + /** + * Performs Yadis and HTML discovery. Normally not used. + * @param $url Identity URL. + * @return String OP Endpoint (i.e. OpenID provider address). + * @throws ErrorException + */ + function discover($url) + { + if (!$url) throw new ErrorException('No identity supplied.'); + # Use xri.net proxy to resolve i-name identities + if (!preg_match('#^https?:#', $url)) { + $url = "https://xri.net/$url"; + } + + # We save the original url in case of Yadis discovery failure. + # It can happen when we'll be lead to an XRDS document + # which does not have any OpenID2 services. + $originalUrl = $url; + + # A flag to disable yadis discovery in case of failure in headers. + $yadis = true; + + # We'll jump a maximum of 5 times, to avoid endless redirections. + for ($i = 0; $i < 5; $i ++) { + if ($yadis) { + $headers = $this->request($url, 'HEAD'); + + $next = false; + if (isset($headers['x-xrds-location'])) { + $url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location']))); + $next = true; + } + + if (isset($headers['content-type']) + && strpos($headers['content-type'], 'application/xrds+xml') !== false + ) { + # Found an XRDS document, now let's find the server, and optionally delegate. + $content = $this->request($url, 'GET'); + + preg_match_all('#(.*?)#s', $content, $m); + foreach($m[1] as $content) { + $content = ' ' . $content; # The space is added, so that strpos doesn't return 0. + + # OpenID 2 + $ns = preg_quote('http://specs.openid.net/auth/2.0/'); + if(preg_match('# \s*'.$ns.'(server|signon)\s* #s', $content, $type)) { + if ($type[1] == 'server') $this->identifier_select = true; + + preg_match('#(.*)#', $content, $server); + preg_match('#<(Local|Canonical)ID>(.*)\1ID>#', $content, $delegate); + if (empty($server)) { + return false; + } + # Does the server advertise support for either AX or SREG? + $this->ax = (bool) strpos($content, ' http://openid.net/srv/ax/1.0 '); + $this->sreg = strpos($content, 'http://openid.net/sreg/1.0 ') + || strpos($content, 'http://openid.net/extensions/sreg/1.1 '); + + $server = $server[1]; + if (isset($delegate[2])) $this->identity = trim($delegate[2]); + $this->version = 2; + + $this->server = $server; + return $server; + } + + # OpenID 1.1 + $ns = preg_quote('http://openid.net/signon/1.1'); + if (preg_match('#\s*'.$ns.'\s* #s', $content)) { + + preg_match('#(.*)#', $content, $server); + preg_match('#<.*?Delegate>(.*)#', $content, $delegate); + if (empty($server)) { + return false; + } + # AX can be used only with OpenID 2.0, so checking only SREG + $this->sreg = strpos($content, ' http://openid.net/sreg/1.0 ') + || strpos($content, 'http://openid.net/extensions/sreg/1.1 '); + + $server = $server[1]; + if (isset($delegate[1])) $this->identity = $delegate[1]; + $this->version = 1; + + $this->server = $server; + return $server; + } + } + + $next = true; + $yadis = false; + $url = $originalUrl; + $content = null; + break; + } + if ($next) continue; + + # There are no relevant information in headers, so we search the body. + $content = $this->request($url, 'GET'); + if ($location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content')) { + $url = $this->build_url(parse_url($url), parse_url($location)); + continue; + } + } + + if (!$content) $content = $this->request($url, 'GET'); + + # At this point, the YADIS Discovery has failed, so we'll switch + # to openid2 HTML discovery, then fallback to openid 1.1 discovery. + $server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href'); + $delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href'); + $this->version = 2; + + if (!$server) { + # The same with openid 1.1 + $server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href'); + $delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href'); + $this->version = 1; + } + + if ($server) { + # We found an OpenID2 OP Endpoint + if ($delegate) { + # We have also found an OP-Local ID. + $this->identity = $delegate; + } + $this->server = $server; + return $server; + } + + throw new ErrorException('No servers found!'); + } + throw new ErrorException('Endless redirection!'); + } + + protected function sregParams() + { + $params = array(); + # We always use SREG 1.1, even if the server is advertising only support for 1.0. + # That's because it's fully backwards compatibile with 1.0, and some providers + # advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com + $params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1'; + if ($this->required) { + $params['openid.sreg.required'] = array(); + foreach ($this->required as $required) { + if (!isset(self::$ax_to_sreg[$required])) continue; + $params['openid.sreg.required'][] = self::$ax_to_sreg[$required]; + } + $params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']); + } + + if ($this->optional) { + $params['openid.sreg.optional'] = array(); + foreach ($this->optional as $optional) { + if (!isset(self::$ax_to_sreg[$optional])) continue; + $params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional]; + } + $params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']); + } + return $params; + } + + protected function axParams() + { + $params = array(); + if ($this->required || $this->optional) { + $params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0'; + $params['openid.ax.mode'] = 'fetch_request'; + $this->aliases = array(); + $counts = array(); + $required = array(); + $optional = array(); + foreach (array('required','optional') as $type) { + foreach ($this->$type as $alias => $field) { + if (is_int($alias)) $alias = strtr($field, '/', '_'); + $this->aliases[$alias] = 'http://axschema.org/' . $field; + if (empty($counts[$alias])) $counts[$alias] = 0; + $counts[$alias] += 1; + ${$type}[] = $alias; + } + } + foreach ($this->aliases as $alias => $ns) { + $params['openid.ax.type.' . $alias] = $ns; + } + foreach ($counts as $alias => $count) { + if ($count == 1) continue; + $params['openid.ax.count.' . $alias] = $count; + } + + # Don't send empty ax.requied and ax.if_available. + # Google and possibly other providers refuse to support ax when one of these is empty. + if($required) { + $params['openid.ax.required'] = implode(',', $required); + } + if($optional) { + $params['openid.ax.if_available'] = implode(',', $optional); + } + } + return $params; + } + + protected function authUrl_v1() + { + $returnUrl = $this->returnUrl; + # If we have an openid.delegate that is different from our claimed id, + # we need to somehow preserve the claimed id between requests. + # The simplest way is to just send it along with the return_to url. + if($this->identity != $this->claimed_id) { + $returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id; + } + + $params = array( + 'openid.return_to' => $returnUrl, + 'openid.mode' => 'checkid_setup', + 'openid.identity' => $this->identity, + 'openid.trust_root' => $this->trustRoot, + ) + $this->sregParams(); + + return $this->build_url(parse_url($this->server) + , array('query' => http_build_query($params, '', '&'))); + } + + protected function authUrl_v2($identifier_select) + { + $params = array( + 'openid.ns' => 'http://specs.openid.net/auth/2.0', + 'openid.mode' => 'checkid_setup', + 'openid.return_to' => $this->returnUrl, + 'openid.realm' => $this->trustRoot, + ); + if ($this->ax) { + $params += $this->axParams(); + } + if ($this->sreg) { + $params += $this->sregParams(); + } + if (!$this->ax && !$this->sreg) { + # If OP doesn't advertise either SREG, nor AX, let's send them both + # in worst case we don't get anything in return. + $params += $this->axParams() + $this->sregParams(); + } + + if ($identifier_select) { + $params['openid.identity'] = $params['openid.claimed_id'] + = 'http://specs.openid.net/auth/2.0/identifier_select'; + } else { + $params['openid.identity'] = $this->identity; + $params['openid.claimed_id'] = $this->claimed_id; + } + + return $this->build_url(parse_url($this->server) + , array('query' => http_build_query($params, '', '&'))); + } + + /** + * Returns authentication url. Usually, you want to redirect your user to it. + * @return String The authentication url. + * @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1. + * @throws ErrorException + */ +function authUrl($identifier_select = null) +{ + if (!$this->server) $this->discover($this->identity); + + if ($this->version == 2) { + if ($identifier_select === null) { + return $this->authUrl_v2($this->identifier_select); + } + return $this->authUrl_v2($identifier_select); + } + return $this->authUrl_v1(); +} + +/** +* Performs OpenID verification with the OP. +* @return Bool Whether the verification was successful. +* @throws ErrorException +*/ +function validate() +{ + $this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity']; + $params = array( + 'openid.assoc_handle' => $this->data['openid_assoc_handle'], + 'openid.signed' => $this->data['openid_signed'], + 'openid.sig' => $this->data['openid_sig'], + ); + + if (isset($this->data['openid_ns'])) { + # We're dealing with an OpenID 2.0 server, so let's set an ns + # Even though we should know location of the endpoint, + # we still need to verify it by discovery, so $server is not set here + $params['openid.ns'] = 'http://specs.openid.net/auth/2.0'; + } elseif(isset($this->data['openid_claimed_id'])) { + # If it's an OpenID 1 provider, and we've got claimed_id, + # we have to append it to the returnUrl, like authUrl_v1 does. + $this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?') + . 'openid.claimed_id=' . $this->claimed_id; + } + + if ($this->data['openid_return_to'] != $this->returnUrl) { + # The return_to url must match the url of current request. + # I'm assuing that noone will set the returnUrl to something that doesn't make sense. + return false; + } + + $server = $this->discover($this->data['openid_identity']); + + foreach (explode(',', $this->data['openid_signed']) as $item) { + # Checking whether magic_quotes_gpc is turned on, because + # the function may fail if it is. For example, when fetching + # AX namePerson, it might containg an apostrophe, which will be escaped. + # In such case, validation would fail, since we'd send different data than OP + # wants to verify. stripslashes() should solve that problem, but we can't + # use it when magic_quotes is off. + $value = $this->data['openid_' . str_replace('.','_',$item)]; + $params['openid.' . $item] = get_magic_quotes_gpc() ? stripslashes($value) : $value; + + } + + $params['openid.mode'] = 'check_authentication'; + + $response = $this->request($server, 'POST', $params); + + return preg_match('/is_valid\s*:\s*true/i', $response); + } + + protected function getAxAttributes() + { + $alias = null; + if (isset($this->data['openid_ns_ax']) + && $this->data['openid_ns_ax'] != 'http://openid.net/srv/ax/1.0' + ) { # It's the most likely case, so we'll check it before + $alias = 'ax'; + } else { + # 'ax' prefix is either undefined, or points to another extension, + # so we search for another prefix + foreach ($this->data as $key => $val) { + if (substr($key, 0, strlen('openid_ns_')) == 'openid_ns_' + && $val == 'http://openid.net/srv/ax/1.0' + ) { + $alias = substr($key, strlen('openid_ns_')); + break; + } + } + } + if (!$alias) { + # An alias for AX schema has not been found, + # so there is no AX data in the OP's response + return array(); + } + + $attributes = array(); + foreach ($this->data as $key => $value) { + $keyMatch = 'openid_' . $alias . '_value_'; + if (substr($key, 0, strlen($keyMatch)) != $keyMatch) { + continue; + } + $key = substr($key, strlen($keyMatch)); + if (!isset($this->data['openid_' . $alias . '_type_' . $key])) { + # OP is breaking the spec by returning a field without + # associated ns. This shouldn't happen, but it's better + # to check, than cause an E_NOTICE. + continue; + } + $key = substr($this->data['openid_' . $alias . '_type_' . $key], + strlen('http://axschema.org/')); + $attributes[$key] = $value; + } + return $attributes; +} + +protected function getSregAttributes() +{ + $attributes = array(); + $sreg_to_ax = array_flip(self::$ax_to_sreg); + foreach ($this->data as $key => $value) { + $keyMatch = 'openid_sreg_'; + if (substr($key, 0, strlen($keyMatch)) != $keyMatch) { + continue; + } + $key = substr($key, strlen($keyMatch)); + if (!isset($sreg_to_ax[$key])) { + # The field name isn't part of the SREG spec, so we ignore it. + continue; + } + $attributes[$sreg_to_ax[$key]] = $value; + } + return $attributes; +} + +/** +* Gets AX/SREG attributes provided by OP. should be used only after successful validaton. +* Note that it does not guarantee that any of the required/optional parameters will be present, +* or that there will be no other attributes besides those specified. +* In other words. OP may provide whatever information it wants to. +* * SREG names will be mapped to AX names. +* * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email' +* @see http://www.axschema.org/types/ +*/ +function getAttributes() +{ + if (isset($this->data['openid_ns']) + && $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0' + ) { # OpenID 2.0 + # We search for both AX and SREG attributes, with AX taking precedence. + return $this->getAxAttributes() + $this->getSregAttributes(); + } + return $this->getSregAttributes(); +} +} diff --git a/www/wp-content/plugins/social-connect/readme.txt b/www/wp-content/plugins/social-connect/readme.txt new file mode 100755 index 0000000..dd48846 --- /dev/null +++ b/www/wp-content/plugins/social-connect/readme.txt @@ -0,0 +1,161 @@ +=== Social Connect === +Contributors: thenbrent +Tags: facebook, wordpress.com, twitter, google, yahoo, social, login, register +Requires at least: 3.0 +Tested up to: 3.2.1 +Stable tag: 0.9 + +Allow your visitors to comment, login and register with their Twitter, Facebook, Google, Yahoo or WordPress.com account. + +== Description == + +Social Connect adds social login buttons on the login, register and comment forms of your WordPress site. + +The buttons offer login and registration using a Twitter, Facebook, Google, Yahoo or WordPress.com account. + +It makes it super easy for new members to register with your site and existing members to login. + += Props = + +Special thanks to: + +* [markusdrake](http://wordpress.org/support/profile/markusdrake) for patches and helping in the support forums; +* [L D](http://wordpress.org/support/profile/enochfung) for patches and helping in the support forums; +* [Geodanny](http://wordpress.org/support/profile/geodanny) for helping in the support forums; and +* [Wirone](http://blog.wirone.info/) for polish translation and patches. + +And everyone else in the forums sharing the fixes they find and answering each others questions. + += Contribute = + +Social Connect is rapidly growing in popularity and help with the growing pains is appreciated. + +If you're a developer, you can contribute fixes & optimisations via [Social Connect on GitHub](https://github.com/thenbrent/social-connect). + +Everyone can help out by answering questions in the [Support Forums](http://wordpress.org/tags/social-connect?forum_id=10#postform). + + +== Installation == + +1. Upload everything into the "/wp-content/plugins/" directory of your WordPress site. +2. Activate in the "Plugins" admin panel. +3. Visit the "Settings | Social Connect" administration page to configure social media providers. + +== Frequently Asked Questions == + += Does Social Connect work with WordPress Multisite? = + +Yes. + += Does Social Connect work with the Theme My Login plugin? = + +Yes. + += Can visitors connect with Social Connect to make a comment? = + +Yes. + += Do I need to add template tags to my theme? = + +Social Connect attempts to work with the default WordPress comment, login and registration forms. + +If you want to add the social connect login or registration forms to another location in your theme, you can insert the following code in that location: + +`` + += What do I do if the Rewrite Diagnostics fail? = + +If you get a 403 and 404 on the Rewrite Diagnostics test, please request your hosting provider whitelist your domain on mod_security. This problem has been encountered with **Host Gator* and **GoDaddy**. + +For more information, see [Geodanny's](http://wordpress.org/support/profile/geodanny) kind responses in the forums to similar issues [here](http://wordpress.org/support/topic/plugin-social-connect-url-rewriting-and-query-string-parameter-passing) and [here](http://wordpress.org/support/topic/plugin-social-connect-url-rewrite). + += Where can I report bugs & get support? = + +First, a few caveats on support. + +This is free software. Please be patient. I attempt to answer all questions, just not on the same day or even week. Polite and descriptive questions will always be given priority. + +Please search the support forums before asking a question - duplicate questions will not receive a reply. + +With those caveats in mind, ask questions in the [Support Forums](http://wordpress.org/tags/social-connect?forum_id=10#postform). + +To help me diagnose the issue, please include the following information in your post on the [Forums](http://wordpress.org/tags/social-connect?forum_id=10#postform): + +* what specifically is broken in Social Connect (eg. the buttons don't show up or it doesn't redirect back form Google) +* what you did just before Social Connect stopped working (eg. activated, enabled all OpenID providers, clicked the Google login button) +* version of the plugin +* version of WordPress +* list of other plugins installed +* error messages you receive (if any) + += Why doesn't Social Connect Work? = + +Please make sure you are running the latest version of Social Connect and the latest version of WordPress. + +If you have White Label CMS installed, the javascript it adds to your login page breaks all other plugins which run javascript on the login form. + +For a quick fix and for more information see this [forum topic](http://wordpress.org/support/topic/social-connect-does-not-work-at-all?replies=7#post-2029255). + +If you don't have White Label CMS installed, please double check your settings then post a question in the [Support Forums](http://wordpress.org/tags/social-connect?forum_id=10#postform). + +== Screenshots == + +1. **Login** - on the login and registration form, buttons for 3rd party services are provided. +2. **Comment** - buttons for 3rd party services are also provided on the comment form. + +== Changelog == + += 0.9 = +* Setting CURLOPT_SSL_VERIFYPEER to false + += 0.8 = +* Moving comments icons to top of comment form (using `comment_form_top` hook instead of `comment_form` hook) +* No longer relying on `file_get_contents()` function (using custom `sc_curl_get_contents()` function) +* Removing "Not You?" double-dialogue. +* Adding `social_connect_form` action to replace template tag with `do_action( 'social_connect_form' )`. + += 0.7 = +* Social Connect widget can now be customised +* l10n implemented +* Polish translation. + += 0.6 = +* Fixing 'email_exists' bug + += 0.5 = +* Removing Windows Live due to broken implementation +* Fixing IE7 Bug reported here: http://wordpress.org/support/topic/plugin-social-connect-social-connect-fails-on-ie7?replies=9 +* Returning to a single admin page as diagnostics is smaller without Windows Live + += 0.4 = +* Removing generic OpenID for security concerns: http://wordpress.org/support/topic/545420 +* Only calling deprecated registration.php file if WP < 3.1 http://wordpress.org/support/topic/540156 + += 0.3 = +* Social Connect moved to it's own top level menu in wp-admin. +* Enable/disable integration with each social provider. +* Simplified setup for Windows Live. +* Introduced diagnostics to check for required cryptographic extensions and server rewrite rules. + += 0.2 = +* Fix for directory name + += 0.1 = +* Initial beta release. + +== Upgrade Notice == + += 0.9 = +* Upgrade to fix Facebook connect SSL bug effecting some servers. + += 0.8 = +* Upgrade to fix bugs affecting Facebook connect on certain servers. + += 0.7 = +* Upgrade to be able to customise Social Connect widget & use in Polish. + += 0.6 = +* Important Upgrade: If you are running WordPress 3.0, you must upgrade. For versions 3.1 and above, this is an optional upgrade. + += 0.5 = +Important upgrade to fix a bug in versions of Internet Explorer prior to version 8. diff --git a/www/wp-content/plugins/social-connect/screenshot-1.png b/www/wp-content/plugins/social-connect/screenshot-1.png new file mode 100755 index 0000000000000000000000000000000000000000..78147533fed45ad0b6e4f22e9e8161d9a08ce936 GIT binary patch literal 26656 zcmdRVRcstlknPNvnVH!!GsWyNGdpHxikX?&PK+@#GdqTuDQ4!FV`hfu?Az5!`~CE! z9jT?7>6-3y>sHq}x4Ju0NkI|`9v>b603b!2R&kE|UuD{jX71fadgk$=N ziFqsn0HZ&wYM)ghq8g& ? zXE4`)gl7p46kr4cP`tXzhXx2^iynUG$pL^-mSF)5Can%iJOH@~*o8~Dn=7b*0>s2b zc!cPs!4_18{a0o$&>NJur{{as>=^x)!^^XNLgH}0gvfMao_=IE(;IU~?UdH8=c{#$ zlp;LJdfO?1#%{~jv6*S$i!()cPGVlSPuQ?
$Xg;S7qb7f>NgOQJ9%2jRQ!WD!TYo`-O`xPszoDgXC%H&3&Jl^*t6KU z25t$K`uyBQ=|E%!{}G?dTlS}D b#Gu$Jv=z&KO|009;L zMVKL%+?OW-I;95{_jO(t!hb8&aT`^i0~Y9jN*ERsAv_2sO}k3X{L`&0=NF40JoxGm zi@6m%JoqMXaK21CoayfZ4K#p!&+{g8w!LnyioSy#eXy7iLSKFI`$D0~+(O&(I7HnD zs|~D*;S#nfaGg2|2r?IU23a+tYa>;~FNoWa^Sc^?^eHkR-j-Ucgepgbsu{?Y`&d!` z*l%{+lQ22HP!ZkS-*$fi1cjyQq`qqbgkuaq^(X+Am 6)Z<`(OSIwNr4Bi)&+mDjT`;+vxXZ;c?^9rHV6G~_ z@FGo-f%B|I@aB#L8Wl)XFUkvGMujvUcGdvU31b`rO$?DM10fuNXTwi$;002w{$R`m zlmHCnYHB9#2O&jzEnmIQsw~3#3F3ZW^SjA@WZs`YrmU08&_(L^A3Ki0$AI zGHEHGO0Wy5$uN3-ur8@0EdV~;I1kfO=sOCQ*xr;?DRMigNsK#J KBX4rcqP?RvpH@K?B5~9xkZVt?GT*^r@?We zCHW}%W77xIjE6dhl806|@J}>hF@FZ7j5%1$aV_Kk)WqLnKMiE|ahN=@nxyfLYcgPu zMPUt;8@n6o)&5#CJrOy9vxR8Jc}D#ltvB$;k&s6^lWPM1AT;`y*-qRJ)3%pmK`ZYX zUpDk)xMt6fExpS>4~RaW-auUhLQy$G4ycE4y^u&joWD{Nq-ZHK$y`v0QTJg9z|i@$ z%0CW;5vhwY#v)Q9U;7XGCpkDcKpaOL%^V^eRvcy=u^jG}#a3O3xYFp9Vl(zC3}pdo zvPV<`6u#8oM#xPC>gjpIbcL%aHYvL)Yi8M|N2fBTpJvVqs&eh}h>Cm_C37)~XG@$* zWb^5ZI%Mtx?9;P_nMEC>&c$ H`|-vLE0DSUH#oLJk(#(htuyKQWNeF*(*9-5~4Cn+d@nKvi9=%!Q@f# z8s*vnHUj ieCQ36&MLi6?f;IZmTac}^C) z)O&b)zxUX8Kko{ClA?W}RiowCprp^BJyW$+eJQ0Z+bwZX`CG>Jtv>k*xF@(rLRU_w zmOMrmT`pRlU7lR7IF~kWJBM7pt~^vqP mycF3U3e*?s?83*4%!b&DNV^) zz^nRV2ee~8on2Ao!z5D7Qsq-^e`(impKoXP3i9gmI=I=t9k>m?Wj^ZWPGHZ)=OC!W zv&KE+JmD0@OUK{CLn2_uKWAg&_Ol{4L^o7%s5dUR&9GhRfN1D5mYj~GG3PfIG bU9yUCs5F^|$t)jZ)ouQ@e1=|;^ZQbMoAEhW&xZzVLv zRU^J(^^kN_ztE0wm9iVwC{?u-!xbE7uN25+<)?hnfOG(h_V-DR44({_(Z-e*DATJU z9JN`}dMUc-AhM$qZbV~6|BlLvn~ki9(1~}C>CWg$K+Se!RwifV{wg>^`PY_>Z<(fz zIaG*Bz|5=WZDY1fsodRqQ}CB>`t$yb-0VaN#;n-Pxy7&
YZo8-PbrW{`oTqIMZJ`^!z950{zC8dc7htKcf z!Q9jEQ7cqLT#U-y%zkeLZWE(`=2k(!db@12=E;xlaBg ET&d0Br~9YAL>WZC7tN{{ z-LBj vMg{xT@3liv8*iEeCDCvCzHl zEcvW(kUMDjtk=|0B}OO4c>n#Jb5pZxlfRN}?MnDoWHsVRYDlaqe7&H(fSVXk0N=y* z&co97V5#p?Z$~lb#E SNeTu}ii?m%WHlp7XTnSJM$Yt24XZ)!4lgcf@nL&FIeV zJCXCgPOO9Ew)nYtog8Gp{RiD=@xQX0<-d={YK#oH7p@j~7bg8xpWU82X73+kALQ4} zmr*WBh=dsZ1UKPVSE6q6y zbACPbl(SjM8?lL?(Kl1xQ{kgXQ{6ByI- ~u+-=hvw4}b^Yqy;u*2guB z)H60$)YrIMio3lg%$8oWr)pL=*dugoo_=xkKVv;v-kIO>ojFKwNXqH%whJ)NRYJ9! zTHMkkgUE9=3h$+$IH6E4;3?oLV=nMEu{Lhle%bkrPKgm2DJy-SM4&o)XI?yb9xYQ) zOk=itDwMUHe0u~SlceWntD*LPL9G+6U^%%M$^WxWB3T&Mp1e eZf&Jv+mg#)lVAyxKglSX>(v65b@sk%)$?f1oz>T# z-170pH9N7TU6nt?TV$SPVWR90)|Q1lw$AeM#O~|Qh7dmsBzV@c&OEbts+rv!7tqA7 z4vh}o3toCyU&wg`v0U0;{kh)9*<-%%y2@nBz|P6bdE|QDzkOKS`ay8Lh_iyTnmW pVZ5>v@B)iTA} za~tmX1W7CLiHh!AU0MZ6!&$XuZffECEc%rB^si%|Mc)$cDj{>n#oE=w@~>6W=~feQ z9u30IIMGBY)*AVrzf?{y7}%QIlC0dWaPwuZCGX?w;B1=O2#lgt>ahXWr kw-s8hBpz50BK8Kq{=No!3|iU0-I(+08xLxZ2zv z;ixjXatBDf(m(%rsxiut*KyKzXxZV5sj+ZzbM^g;_P41!an1c||5nH3H5$UkeJWVa z{W0A1+-kFh(9IW>2mPJJ`{uCVXb8z9YbRK7FlR#GnJv<5;zjhKXoY^PEZ}cO`oLno zbG1YL0W-szex|;*L9s8*i~fD^s?5qz;$)P8jD}Fna+SgJL|0-{+Z+2^>icv6P%0pc z6zPWiYbP`&L{l$|EmTerx6)Z@hb5y6f&|iRc+; hw1TF+3BXDzY=SESHU-4xBfZq<{s1CXPFfBDVvI0rwuCe}i!67F?dsAFagod@p0r zwy=*%zB-%1sB#8*C*>@|4{8gtNjjk_r5fCd!U{Phzd|QbP9=G1JH1XF3fWoFXk{DG z4s9AOO%Zoh2jT8v!}z?AKN-{VJE9oes>-v9pWA<5jT13GFm7l!YZaX~HkvnOH eM`^_9$MF&z6AxkElfDTD z+4p)Go2V$UQ9XVcP3%N2BP?@%UYUt2q%nUu-^}`(w3l+~PRd0?-@ o@i*P|O6% zIn*FZX+Vw&B)J=B{T-i}ow-5aOyx`uO}XtHJTelkE> O2vjT&EM?jO(MFcWKu#3v;1ZOj}$ z`JKFPMt9mT2TQoA^?w3tc8hHcEG7>ao4QJ#(;7y*Hh%tXJbmA6DmrxsX+Q-uGyr(A zp?emP0<@(8A@m9La4P4uWDr}q$cDk90D;fQq_boG-9p2{m?KxOzkrm^gpdwo+ET ~RlH8gQWMA*&_z&?}YV(dq}QX~j@B(+N_r(s|03i#?Ug71##re)IVu zTC<%nBfA%0Zpn%5DuQGs@5#t(2S*geR6tyLFXBIwJ5;+uJH*r5zdUCcUWr%3n*}v$ zyzVq$ZFP`&8}qyI)TX25E{DjE2R(BsQ(SLOuWHT5jpm&9Xd~k1(1z#i6YW#`!|8Pm z+#yOP(i2)Q?kEX08WRQ?(I;XmVY66juz&oQn4OpwnPIsT>8Et#pDmQPb{XnVx34nk zr_1Ir=FTX)*Cao6b2WL?)zr3q)SlCpFCU`bzUh`&R{Y6uun?N>s?n)7=(@=>x*d(T zdBCpbT1GBVNIlElXziNQv4ZeE?_WpiJmAd~n&E2a7<@OKY$zY$X5K5Au^8N^JaEQ7 zNR{6-c#wMM^}Jngf4_euN$j3L;Uk5xO|(|yJp|T};TPg>L7S1|y`$a$N6t766?tIn zLvr$zq$bXSMn&~RIz_)Fs!~Df1$M>nZeHOU$Wd*(^HoxD;dsMH_J8>k^%cXzh#zZH z(vT_y9XcYYA90&7mRBA|I!R63oQ$M!V8(n3*zV$m>5B}(*vBdX9E7G8C}!Pf!Df)< ztPng#)Zyyjc;=DhD w|%~1##;EU^_^4AM-5@FeNM;{-p12X^HA>S^5_|#1J@px;K%L{ z HV(nia+&5y& zNiu~H{2z0W4uho%oo)cOWL@{+abmAi7FvL2F>9Wx3pSOCuM&69r1+t8sNbfl4%K7W zsF7zw2Mnv~u$HJYsn1yKfes-;Vm%n-aFdZK{rdRo{j<=8-ljNL=yr5O2znHqoUf8$ zDiTD4;>8%_cMPT}9hGgiDJL-}7=#wQWx7vma%&Er&>oW)W~!nOM36U7SRvrhM{p~c zcYt;~3H>MuTSb576Wd L8$C05h-($Q3P!O~9^B{nhEkyaK*Kc^e!95}yo@R{^F zXq!;mZ`fLy-p=vOq?j%qZiSsJGNtlx7p)(kb!LbET=!Lfkp@l%jf#zn;`Cuqa1|Jr zI 7nK_Y_`Z4La;m|SW2yb?>fg ``2r z9MHT^-sG%yo#;bV%o`weO;n!h9Oyf|Hy^K#-Uk!p6Zrl(`*AEJ<2U+7xOTOE=ik^( zt`ZK$2eS!}#xu7x3r3Sli?afRqMDnz%3GTK=151NuaFA4Z|?7-?2H&xoNK^`?`^Lr zjGg|dZ&QkHA8mFxN2xE)0008UzYPe;$ixKzNCDDd5j79ssV{=An%UF)=ka7C=(eaW zC@8RqIL5dQU2;aTc}8`ateJLOm6=^t%Imsbi?+?`xSi~nth6-a8`~n{HFi{K;WiXA zEqv4{(JmLFbI!Z-K1(?J0V0d8IpK|`keA1#clNz!_Ofa0x5W(h5nHW-!^ *NX z2e0X(0|OWmH4quxV-MiMx*%PfBWsqui|nbUQXsQPt-`$iK(WOJdB|h2ok()$7-2B{ zbrKnk1s_k@4epx-TMRDEY(7Ae*c}ZB4u}_yW*t{EVh5FALsFE4l!;rkf_ozM&0EqD zX^rEY8h4mJur*=;JATdksP!qgW9uNwEOijp*hU1HBrO-Q%iD=iP>f8+b^JRgB4k=Z zu}Stal+Fn{tlS;h1k)-j0l6VbEy0}}*|$JCmux+p{{UwTc?fIKeDYu+x5{W5SI-^` z?uoNd$Yk$GU`?0f%bGA`soh(~XN~_Del-}7uSbb4O^J?z^1}d;g#nNU@3}(dmVIhU zfmSP<&aY-t^7Q1zvwM2Vm@LDqkxrK;0*MOLBnSAizqr&E7emK*d3lMBvl~sCYTpbY zqY3Ydak{ ?!CRe2@5eEi37m^G)E-R6qVRZ^uTsh6g;d-p3-m~f(w9bjsFuz z4AtRQ_>)W6a*?bdjuuQY1Pit>_Ev68M?}D9Qa~WwA2<>CJa`~N taPLnkd>#t(;h&PmXAp8 zsEHbI5n{Pl3&5E8-2p}eGLEL0$dHQBOif_-@PEuiD-Fn&JXatDb-#6#xegD_5qTC9 zprg$xiE~B{iU=Se?}20>>b6D63+Wu2SVaXo2Wb4-*p3JQ!mxi}rRX6>V &w$;(dVFFB zyitxg|AvnNbX%J79GomRZcBv4RqjYHK3c^Z6#a;Os}5` QXA3wGk8mIqk!fgQhdk+SlwWDZ4t;d zd>{=*V4cT7yFWG2m<7ueR$ ;+A46D|>=^+Y9_)pwC1x3G3LDM+EnQ@qiS&aia7B412i fiOikHR0b=tg`xPE3saS1p*z|;;kZ(XE2bN{N$F U#q0al@ z2W1Db@#V)aPJ>yWqEi`lc*IlNOl-7Si+T(zXEjU<3rBZKCUtlaOY`*Ay%{+@hs1Nz z;hc?MoA5@uQ&gR_)jNG;dXu;}wAiQ{xhNjBsMMu6IE$JV?;NBBafE1$WNaPZ-eS*v z>kE!Uc(055Ew5+ecU8cqo7F{p_Nal+z`zb}au$_i$fnRo_eSMJv2YcwW2bvlwS=vQ z3nuc!JRMZBMZeD_#H;d5 D`57m)Di>0B%|(Dz9D7GK3zGW}{pqP1EXRA3RVj>0#x}k)$kcx7NXhuW z!O<0gL{C90pnCg+oDedp81YWd>N-Y~4#rEq*q)u<0E70#%X0j_%ZM=--IYOtQBfh4 z9pw4)2?@o|32qz{nsWs^KYvQkz~}gByKIeJSl~rp)~*fV7~xOZX~H2Y&&O%D=tcN1 zGk8D?hF@o_WP+aQq$R#$6}%}-sEa {KcX<4NcMBT={(Rz~h%Mk86$&`DCPxP36`+r8O0048tqQ@X--`$t!g$r?smg zpS5COUD*Dm7OCl>sw{lPV#&EyPFo)+md*S!NIAuU&5G%4GqHYCg$^l;-4&KFF7xt= zu%46GOjaXGoQKCxU5++}IQJd %f+3j z<_es^<=@$VZKz>sc&?t-e>cQNYxRc3#KxY zJd)FT3j41j?BsLJ;gASuXulZqW)3J@V=W`_ho7KhNgHTt9MB9l+;H+jO`HVkCS zLK>FYELPikr%8UWmn14JBcm(0vcS~QdP-R;pBS8rK@k9+iX=eMlZ51h2T}&biK5?< zg0gTwOocU%Lq75;Wmr-)7tEwm7_`Iwf9Cd}*dkhBoG2hNw;%y55Ftz>@nK?c6Sv2~ zx?p~QA_}EE5`pAn{V=myFQ;6=xdo`g n0R9I0_(Urd>8vkYnhcrMH0w*Ab8Wrd+35e`j*MWT%`=BcTdLV+Z1V%(a$HzQv zoiT>Ik%5?mKOCS)3*f*#>mSi{yvG)O|BoYpw?GNgkmOruAJf$8jgaRb5rFU!c}L*z z2iZBge*|-_GjvJ_+ynK`0bt4z2;2JkW0uY~L=Q>Gw?H2bx&XF}4@xBhQi9wa$Zk;3 z9DyGWOaMH2QqWo42bzu+)TeORR=|hDf5Q#1&bwNZO?4Vu@2vWFd@ER <4gha+zC-$kL{mje?sQY^zQYomG2mD z=PcW7CaTToB`DC~#jAz$%nX!3XstG|t(1_65@U~_D0*L2qbbRa$5&p}Rh~H89siRQ zJ@q^n+znn6^zuS|9ACCIX@Kr(#H-n@^bHY7H}M9y`-Szv$1S?B-aGTsEMYa{E05AM z^U`DbMbrfCFY@Phf75GyR9b0m&fTTUmesJ(`OS=am!u4a_ej=mPH(ek$?20+>I>`O z{C^PX`B|OgM3%AeCqjqI& S75E2?4hY7v%AtZx3i4J>~bQigShNA2v z{!zu}tPEi0*DK@cQv1B7)Oh__x^3@KXSX-@PX*-WPrZ?eGtNRZCAN>k-KO&tc}`-! zdZ$fug*Lx1%qNbC7IZWd?v#zo{l~u-Ve}!e-JR4b{r2?)Zb?&sFhL45pt_K`Vwx^@ z1s&Ncqz6R jZyl@ zQvnZ4Zfkhvzd~T?dIgJA6e7QaMk=pp1p_WYbgwr{?8r1c1*b(bH7S#W-vn52z483) z%oYPBcoz0T= S6Iu^1p4*(25Y|<>~DOZS^#rz;7!$gCg)4djDw!1ISFjML@3l9pTN^6pRVE z6*g%T?{fguHcpLh!@dJ^47_ xhG4TyQ zGSnh4=-qYTi&cp;J1<_Ihqqno?h+eXwyM7~wmMi k(TjNaHbe^LU`kPct zBbUkQuT0~tYBrmDdt6t3mRyVAKZ8QOwOvYSO}_Vkx3||ie`u7bB8nYS{g(JNP6oP1 z0x9I+UnC+P3JJ=jXJy}5@l_JW{Wp70e&0I@2agRY VMN)l=#K+D=BP3N2BcB=RHNyQoOE~8cjYH6Kw3Emdgqi zlfnHuXwfnAO-Pz%CL#^iY=JW}Eg$bAZG0mGgbSvpXzaOukU{8t8v#3znKV)c{{r}j ziW&|1&drrpt4Ht3L?(PJsntizO1X|cWP!5vCkIPpSv0iKy_EUTu-=rn!?`AHin?i& zny3MMWxDnKGH7oFV?6RL9#Cj#s7q-Sm>gD1ia3Q56?Ti+Rs^fl%!1S(M*=dX0ev)C zO%kb$6~+_J5uj(gzVfM_*!qdtAXe{7 Gn^8?CODU!{DThh zbdY={Ao>1rH8M2jJQ*kp4R}zE)-xk+0SWc7XAKw_r}M+%(e|GV=>CuajNXChA0omq zTG;B-ZCd3Rx&o3eG$+0& Aj$tw)D74gF% zRU|eH6?iZHK|j8$&;lR)6!zgTmMb9^5%By0XsgREIQxU2#6BF%lnTheJ-+|=X|q{m z5*3*GLEu|#rPHY7TV4O?$6+ M9VwjL@TaJiHC`c`%k!#W zXDB8@mZ!prn?wD0XIqf}%g9$*RY#9gn4tt%p4zQ5fyjV{$lSxe%WJMZh0R8q*SRv) zzu|YbPxmvV>9dI(ySCBMvaN@fsPyKxt4}T==xd|PDX84eI${EK-%-o1vt0S`Edgkj z9~T39;L&!rsptY_H9oo&)OR^F9@Dv6Ll2|!Jj>^!5FS}CZ-VvX^5*XB+CM#kD2xMe zB*eLcNEw+e7F}6R9-kT8nW*9gbMj4esI`u|x=u~SMn<61TU%2nH1=LRH?&2W1lXz1 zZtZZafTH%kJkGt%gfceEbx2<^G!B&i*z^44Gg_}(?Y4VW)XtOm*5bRdBD=f4!ul1X zS+6lh$EWG _iw`H*qhA4#nEmNLa>lGLa zlW! !xd8qQU=$g~U%M52-vg!Qm{4ZOJ#5PGE&MSEQ7-bdZ;;Io=M z`tn-Y91L?;{o TXUQ!!gYQy1g z0`J9qc!|{fC(&Ly4o@f;SiI+<$3CAeVU_{D`~ZOHcd||pRxBAk{@vWosAgQU0Q38v zT216v?)%~cf$FzM^P0slm?T-HaGCmm0K;tpRP;lLTQ#uc@J$Z70Vwu1vD2r?H~|$3 z*~2AM9Gm+ieM17ABXggpls|4|O(b`6FeSvMiy(b-_!?|Q_cH?dj9PdJ3QB7`hf&rm zRBKeLg}_jbgxhSP642@QbaN0)j(H2EBw{{2t28V8DY&cKDD@2km%R pV;hFS z>+{RW$XM6=ReyC|w4d!Re8TK<+>>v|4Dw$)jz7rcjx}UkYh{6xJ&_pFdpY}6f;y(@ zi8kdE#5|5;s9XYZwkx&a_y-kC_Ny-J_A64j5jshBC)!awBDh>H%AyK-6?X(6E5lM1 zFay F%r~OG(l@7i0(B$m?fU0UJ!P#Wmlot|CGh$BoG>mHGv_&?GS8k=0R^9~ybm6e$tw zaTB!V@A2Qj9FNdy4uJ!rxF%W$oa2sS&Ww-gk0VHO)1Pz*vm_u-NJ*zG@$FO6f1C3l z|4(B7A!JlsPFJyrQCBh(&S|q)S~{Tvq=&MTf=1%cqD=Z^DrYAPr$Zzap*2Lr1-gw8 zHD@<*Y-NHc2f1Se_V$YMsfm-LK{8OH$fCnSUf?uu5&mQJ$&f_nPR$3%m77y+8`MU- z7I?y*vfuQ;6w7aK%?mc)SSvqR4FbeO9%R=sQJB;2TLOPZ-bnxWC^gi7n w#}@v(={(1N<;ieswpikt*Q#0Hc$m2r-&I8s?oi^8l?~Vt+amK>GFLZ9UVO( zackvZVR78 z073{Y WB6->jc;xq$?CJ20e4S<^!HioT`V6QZ(IKo(lMUwV zr9|`V`#Wa_FKS7erNp?)RmB?=EyI;ILwLZ*2fCu^KR_I(D3R0X*`Otb;?oH_`bzld zld>A_^-mft1bkMO9``>pb#mQK=5U+yuCAQ4=#Exfm@#`J01IJDk~+!Zk)>dAI0S?a zuUooOq+H@dOF05A+u;sB->F;?PEO9Ywl==3Jtl{pOO4&0sGOY5fIx`J93d2I1FyeD z8fp^C#GsE36Mwfc%;k3kNOOqWN?{nvM6f9rf>fv1bw;|a>*hMsQMKA(uB7#l>$nDO zsEsx$ZK=Azda##Nq_kr7Ptsepxxah2eAb>#uOq7D7w8pDx8)?84R|g7UDhQfkun61x;bYK <)QQujT5LkLP97XCn#C7 dTC}Ih*XBf6G+v<5knMfNshZ VCB?;mh2;CczbV0fLy$^OPnV1@7Gq48 z8#L&)lp!19IOF>0u0#TeWm%5eaKP7sA}{xFcldnuoB3@N%SqRoFYz0kpqdM2Hg?vu z6Uc-4ik5Ha_s5NVk!n}FswO7Tt2cwTuP;A=Cl_iNF|}(({+0Gzcuz3u-TeObJz{CC zHTgdWS*!yVhY!P^Gb7(Wd$%#v=7$kn7;4&(=ceogi~v$j2)3p8x@_1`mBtdoaf1aj zRW03Hb`M%?CRBqRpUN;g*j&hHcVYN*%jO-!;c{ivHMyO3hre7bwVq~(CQu>avTT)= zWUn+>OuqR(m!buIJd1~kxnfml&fh0?hw8|Orj#mX69&P8n#P;Ax!qRquu*>-pdA;G zD2&Ez4fl9{R{%P%W~mQ}cGr~I@A+kv8TI=-=wttKVR*m+Cf7;11H f6T|@CvjLpF ze{MG#UrrwM;h8 rFtFkW=|H{$eO^#t$UVJolN_)xqsjLPrOOe5L1$C# zwN8&$$YEH4kXJDR`}(Cw#qvl(W5WIHN{Xu&uKbAKDZlaz=gZae@;Y_+(NG_{Pe)qp z_phmV`5r-9GvxnzKINxG9mAFe6y7W6EPrTqP`XczEN!|C5~P-BX|dRzjcv&^vW1Mp z{s^m51l1Dj5%9?cOKeR?oF=kUDGJOGG$O;^|E52Pi?y=x$?5^!fPTepkGbNX)r0gZ z9O8eWqlpX17p1;EK@tXGE$pnySm6n_0cve+f2ct1^+HQDSw$D`KJqd08}{+AV8bFf zTh_ZBPUW4Pj5RV&jq5W2n&ck?_CDI)9(8 PI%?|o~*Ojio;OXx#W1;kq>Nw7A zig}l-+1fm{V?51@RSzzg*7Fq5AK6)J2JSiSw8BgCn*x)vsU3#Kq9E+!lpi|fDOs~Q z;hg?$zYEQ2;Q6m-0VE)WAu(+P9$&<|$nHo|1>37~yB6M1gEeF)OKnEg ;Qqk!l5HCD*lM({NO2+W(ePJsVy+?E1YZ6ln$Ic|&_I z X$2&=Knpp-2$># 4>gVTgSVgFt5T?7t1T6w_QA1T*YGx2i_*?X50>0X)IzIFT(nnPzH7_HH^le zNw*a+dC~cN)`5r?@Iv75^Uv`y0Wq=QR1y!LQK}-gQZHt&ov4Qg95EzdL?qZ)U%MWX zEtv7|=JA4=DPg!?EA~R=BY-VoD?;~7eA5dN=@csN7sT`pnFLK|^ePwWmJ7M%sWI6B zVSP0hq9yO%%YbO`@*6&|&KFe}f9*#>)C%Vh_p^>x+i8zCGNmzT>WD&WY=qefwE?iw zaS$B)c3jnpeaihM>WGVLQQzPlWKc(fPO_$ *keEK6yBxj8-47638uFd^&1d)zAYC7MZHs9*uCtx`gv-o1G5t?wbVxY$x zv4PgPdvoBXPKdt?^T#(raqM!urnYlhH8c_%PK RlpR{84RWk0{}=2?!YelyAQ`Mn@3uU
5erKxu6bPkI zLHA|~0~+HhDlGJQy )v-f#A) z2HVQ7vFC?{BfUc-N8t&WBgVkz7HSmnecgscy#32zK8~BHB`4cE6VS8-u>qd#v{0lC z-~7~%NIYH|ggAtH){G4-iHBwI6&^eN-u5itQQa_B(wQ_q9H33DXn`m%heV6*Na`6C zx`x(Jgk8Ef7gi_GeQ$2M@x B7Q~mz>Le>7Vl&*8`&^bE1^!uU&F%u1_ zcf7_N`bGxdZCEq?4SKW7P1w0Z-(gN2p*;J`4G*F!o7-AzmfpYu3K-BmH?zRWWZlR^ z9-uEkPme$sM4Xl>^!Bjh_?bkM2>SY@4ESOS2s>6SQCM%ZQvJ%x>6wRd!I=e=s7?8T z@}(NutHc2ec64OnU(wZ40#MN?zHnKq?Fj6IllVQP3V7$ffCn9FC8m^e5|k+nSC)lA*hK^?1H{v(0*+t z$L0tTPiVLA0(a(H^q}Ssc!3u+1Wh^aV*zB_(KgROe2UulKrJJCtd5ZP9V%G8Vge!0 zD^oW&E|;r>E!OOVY;R R*t|qqz!3`*Q6U50^W0pT5kBnG8+u4N!?+*ofQIp-SlRb=se_epM2c&n&Hoei};a zky}M|{1p*E9@NY`R5q~CcW!6+<@ej3;b-!ti^8lQ>JkmS1{L#l)VncOZxCHmuGiiU z64@iW8 @*h&TrBbvyz0+fMu&9JYEB=TJNefq)mH z@6F&XKWgzc%-#9%>b)5s%B7Ic1FVCC!;-p(XPMd@Bd$bJ$}c;De= X|G)XJa! z19r1m*RYzU{M0iG0NLQ%TSpbdko-G&o!m4xg#rR?b$qU;v|_$oCT2z3!?ZeA>Fm!m zNx3(@0Qb+Fi^X{Vhf}9IErlxTt8YZ)wStm8ID(JYv3?Zou5cIdh<6oCHP2S-yj23& z0a2(XoCDCfXe=^Ig~B-XkpMp&SfbD0`$7o!L2`_ICVPQl9b6YZB>j|?N4IC|1dyb) zWRoxT35t+vn|4{VaQw970Y`n3F+rX{H6g#7B{7uPBBWnGbE_5PH&uDuZVt!%b!Ae; z{GKq_bIDH@=2+a3@F(N2`|NDcKE?~E(n;^+-K1uEj1&Cn@H!hqsH-8zt14yjz{l8v za;k^g?2c6LpniM299mG7uJ?8-)`8%i3zXQsO>Pr=f?@Kwx?KA82fpohu-pdx@=(S8 z``!*w*+JulEM%9s(%7fM?Qj0s8hMpBKOag;xj987REM%Ow2FrP_17kM|HgDagw%(f zr4l0tP~Kc~P}EkiGaCV!3dbH%5Lm8a6pBN(t?7dg_Vxw_kb=eH6| 4<}lv`MglmVj+4a~k*=l*@IfUB5tYA?VbgSoau4-^=X z+R*u6yUZ<^GEZ+RyCX{wO7@OZA=p@$fro9E-TG+?ApFv_5SfB4i?-V z#Jur?00*O3 PdeNLjAvt4MpWsJnH@Xuq_E 1%|*u%eflFqKQeJX$X(AHpqr!E&}M|52!+Vcn&MuI*yD30S SLgi;3?(DIG zSYR%j@;2|be`Zb (A3ii9Yxx6Cu%3TyE#ALdh&^&uC!#TYPw_i8 z->@Dv*>%V6lDb9dP-XGof9c2vdG(rzUnnlnt1NT~y|6>x2qtMd)Nq;Q?4Z9!uv!r8 zQuw%x3#U<#JTV@~=zlt}l($>oTp$T7xTrDkKs}&s7~=$oA`KK|`tSI2JD%kbXY;!w zq5=!+;)h Ec3=W~f_Gq+3AfRxv9cB*&oP6#7W1_rnLz=o56Q{N3&C9O zNNK(1Y? iF{wkFCOM&5yo6#pmB^7-K%>V P#l5;DNvwDp-`mA14W9vyKC`MyttO)P=dR=ySqDl;r;pjJ2P2lX74@c zBw1^&>rT3CbUHxc#5}DApiB1hn+V`q2yOA1as|CC+-+R$sdQpf5K~c6fo5w;{{okJ z{(ODf@p)QU+51j&{3V)#CiDE_dm)d@u)1+ibO3%z!{gRVOUI|-Vcvf3305GS9ZM6o zC|<0cgg@ElpbXWGn`OhlO?7K+5+ekO(~9-z5KqQR>g+9=&DKMpcfjBa*&hY#tPRiU z&99k^)Jbmwko~)-Q0oI$IZJYomG$3jYN0kgN-56HhSd=f5Zrmsv)`?&c-(D0R{G&P z8+J_iomQ$==(nsgqg*QXtjWTh6vO{ynd5{T4_tg0W%QIz5?>6a()ZemF|ht{xB|h@ zH@n>;Imo6f6<1E@3u6Mz{t~jBKF)kbtwt&ov7A 9(n)ccg#|`>r65SshSKsnOCiHZNHQyI) zKvYfm7e3SX4zmw8=+8r%Ek{7D?`)KHpZZ>=z5xMoSbQni LSY(&IMrTQFY*C}$!|y{#flaNMS1 z>EW)JS<1iJOoif3`!RMSRf|Kv0i6fw{)(E60{ui%e$nlI!Y10@VyuZN0A 8O!X!umrv*;5wWb41I;8)mQ5mElB4~_cJuxL3HL6?N?BSY647iAeHR{na zWs !P#7IwL+>16W5hcfR>a@X<1nz4~K8Ny+U~q?}NVEQH_0WgV~T3)8jv zhHH4Ps?GRx;fd0(D^LMt5|X{WJ?-~B<~u>Tg-T3IjM2IddWrN#6;W>E4HAk@BRnh) z!H|@tndFxCP2EA5HiEw8DYQM3nDJwl8!-LBk3dmmkLKx#1cmD3J!_sl%cJFT_7Tmn z5$53Y1@2%uvG*OoX01>ojA0Wdz}fC#Gk66I&f3sPPj%`UXbRC-lwmlp5|A_0c$Znk zLt26zyr9#PS?q4SXjq@z&CTb${nF%Jt@P&V8q_bE=B2KE5v+vb`oXumuxxMQEthrA z%3W~Mho?fp)^^21dLnm)Kxb-c3w?-#hFR$h`N6@Z=91JCWbO&22c(2}eY}Ku0MKi4 z4mt^fZ6GOiP5);Yj_AHBhni(Jp7;KdpPbjd^Qu|&R+jV1*KWdbG)K=uN`gH* 2U8UVx6f`1m%KFq021|2QPVEnw?bx}Xp13aF3kQo zHu3o!JiE-oqr_N1K@u`);7uer7)=-?pfj~(k&6R~Q_ia#g03#U1BBA;*4>r#9LW)P zCuXIOA<;|k)`0~@M8)9<;GLM&?y@C)eihe-ARsEae#40}Iq;2<>`C;DMF7K+Q(d-^ zWy#`?;NvQO3+tabqO_yjn1^VLuL6h#9Geh!y2!o=mFS^`QzP7hImFN`^;hn*=qK(k zIQNMH2S}pZ@M_@PCpr95dC7BElx~z84q-TAMHeFD?M}X4?r%%)z`0L2fSP4&3uO NwMSUu=KvM zbveY~HYy#J`%Ydo`0Dgd-P2LU;AdS|!#E8CKr1Jzb`jubpZK4*T6Y;aRkpu@1hBmc zhDgld>oo|~E@FNt*E$&xnV!)7W4#=TfP6z_!y$oPfbt3`*5d)b%_wwx#mQD7Ft~aI zJv`C_n*l2@>6win=&JkR*t(uHg3;mcUps7^;=wMz8a5!O*rJYNB(!*oH4*sOO{9n^ zcx-cSN%v@gW}%Gv#vKT~E1I`|U3n*J7%b5|x2!1)_GsN>h=pJf9Kbo-bOpJU_%(;M z+=$P%!$JH>LxX{lajD)e;H8$wbw>MSxn*bQ=g!H=Nk4(C?hP|wPDWF}68p5=Qk%3g z# nvp%50a(jFG`7FlgFqA-&DpbM&ZE!I@Nl)Kwdf{%^TKb*aXxxk}Fn)hTT>SEz zmqRgmbm}Ej%ST##Oi?)aKn%mI6}q9;DH)w+@@y4hg<1BrSJig0A2w_ZD6UB($;ilz z?sU98TjfV**k&kPD4?c3om$G3i}5FYILeBQ9N_8hPe&@iK8t}mK(y9*a7SY=@amoA zurqZn*B?@dFaE (rlY5v$H$l;ce2EmWKu zI(Sf!{}Q|2*ajKt*jBU-EUPS5L(1&9KHC1;oXcKv8jGqZEhU=PYWa=NcVrkfzs;YZ z0OfS-Z5BeP8=8|i9xN1L8 +`L{4p?KlqjvM- zqcsy?-ueaa?Mk|2lO-FZ>OPk$oEvi`z5i)4W =AH3S^-O8cV!zvuFn| 0S!k(k$PuXroMnCOmWg{HPEF>Zf15~Lr&@qG 2KDXcGuu3=EaCfwC>}r0(GC?VFDdku z`j?+U$l)9&982E+ddCml#YE#_8hN}?7>RT$LGt64y}h@pRSIT=?*qIczj0NTYlU40 z$f0#RlT<|qop^{TAtx5?W~YX#Fd94rOqiULAkA`M==m}Jo0~+eBle*|K5fvn>Ctj} zLIy5<^=+W(j~uTs4xb6gjhxDEY9oD366=>j(TAh*Qk`|0rpu|hB}S-LM$O$so+o=; za5twePhWB&Zuv{8^XcyXq~2T&gOQX}^UhpU(;u|6%!bP?)F$13k1U#Ihf4|Z?${X2 zY+o+r^EkPQPoC|)gnu*AeVua{`zNLM+~y==84^PBJ8$K^b`4M3P1h(rnO66(uYL|K zd#=>CEuswGXg-X7M^S(+a_#Ar VH z@qeY?Uy@ERBfAL q#l2%&Xy~X=Nd>RuIQ#d5} zNh$Pxyvnj4k0AK2q|h&)%8ZTJZo>kYC18<_isBbMIm@fdggK9?Wtnw6l}^D5;!5$j z#LV}`&njy)415n2 `9vvrR(gd+R^42L3wuIkL=&a7T|;PI}c6Do&tFcY|c+w!xi!*`-KG(a`} zjyHz4m!24rlL)0EX`okpJdez_&%sQNcgJ(w6w(NC@Tk=%O8yiZ9xp5f2n&Y}>GGrB zyIq0yq7Pa b)obei4%W84r7!|Q(!6z^9Fp^xF7Cxw0fq8Bc zx^eL${x}_O1Qyk@257d|!I@S+jbydA&Sqv0iZI}J+G0(L!&QxhiL3fHR04=S5IF6C z&`ovGUK~>5QmVXICE&7}XNw1 4^QA#wBlZ31ENMQb6DoK#Je8 z%4K*vD~Vx5DWtYPgM_gb`{h3&^*GZz cM2Bv?b|{N9g@vewVED_IT*|C zUF`mIm=?BWq&DpNyap!kjR?)ZRLZ#bdvkZnO#QiBm_#6#)3vOBMCEM-8&|xy)E4GR zxjg7Sg*O=ZRRtScJB@-6pM`L|D?zDa*H@?3Dn((o@oNh@y1_hBre5$5hXRzTsVUY( zjBdan2*IDG8&HWEboyj;`-x{q1KUZ*?eb9Q W ;p}=k25oa+u=Ln5NCC32D+kb!J9h3Ku)c1 z+U0`zcUAN0eI=-Q1I`c~i1t!XT5*|9rO8Bh#_AlT*tX-GQL`~c6-LlgGba!CQ1u%f z(NSIkP_X??0Y8m3Y`%&5Jd2` f>X#t+5DwRnr*$e3Uq7p%k<;9Dr_Cb E^a zasFsmp8n6#4gn8^f$go{OP}1^i6Yj1?vhW+K@Etu9zXgd7}hqnKiph|lS>WA7d{7_ zD4F~qKlSCsbM@&TO )N6IdfLOn)>>-{5&Sl>#pNLK}My1+p$=wxH@ZmcR4us zy+K9)+c;Dl53_HAUxtIaSS@i?B0%k*TptaAj@(HJZjYcJb>ZjF?Yt;P=(mF+tEB*D z@y}>tFLTvqYk0;r^Uq!qt7xu^=Do4t!E;G zA~U&dlK^_1s|2y+WXIF7!;u#i3GNq=^X9A#3hS{ zj_wzeU)Kvr4~Gj{f3f|}=kKdBUn~kMc&DfSevme1FEa908rh{4DuwDb*dJY#Og;rh zD@bwL#1&}G(@^86>SQ=sMd=GL0`3V5-Qrp{`xo-A4~^%%LSSp@?a9u1T+^S(4~myA zHiPu_0u@%UCs3m!u)YO^!2kO&m*a62_#uu+_@y>QAV6n=_qG{DhGAHXs_KZX;`L3> zm1UT#-zaQ+vgMn-?|o~l5Oj4dFUo2Cr|$#LLwzqmq$G1 t>TWl;~jZr0@Ec* zwkl^FJpQVih%OysMAT{{)EV0+8B{C5WReeSQgr5!;KJ-5V1&3@pS{h)b`hJG1h+CZ z^Hca+Kk2|x4#BpVw&Dp@3Pv*+xhd$94N@K9SV`Pm>}qeaS1>1pv*CE=7vz2pG;bPh z7LZgZ@piwwHX!BKQZ{hO9p1yN5^8^Bp&M;@)ylpc1uer71$bKmW2wwhgJwCrnqm#} zm@P8EbbmOXu5KvvJ5*xl)mL+; TQJ9!{AXCFCMRJ9{f7!hV0g2)C Q+ AK+Dn76sDsf0dP}M)2earK*nn*cdyv1sD4z6eZsER=)E`tOUL 8qs zL8kWCbH{9tHLLxL54SGijVD|nXDSR5rMj*R0)CM&GaQKiBD|7A!4E}n+I7t@;og^c zmoTAw4K_r~$H142(9T7m8&w9 Q*GF9!{+v=C1uV=+H u7Wi=}R0;)u z)-bxAgO}LX9uy3vG3BA`_@6d;B!?gs^GT|U;Vn0zgqgNnA)7{a-H@PR2pXxP63Soc z&5k4%#FnH}n^_4VH3V#&?{G7d9@fckvJ0$2Cksa2)jN