server/php/basic/resources/library/utilsFunctions.php
author ymh <ymh.work@gmail.com>
Thu, 12 Jan 2017 14:09:02 +0100
changeset 652 153f5d09a11a
parent 442 adb907bba956
permissions -rw-r--r--
Define version 00.13
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * Generates version 4 UUIDs
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * from https://github.com/ramsey/uuid/blob/2.8/src/Uuid.php
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * and http://stackoverflow.com/a/2040279
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * @return string
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
function genUuid4() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    if (function_exists('openssl_random_pseudo_bytes')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
        $bytes = openssl_random_pseudo_bytes(16);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
        $bytes = '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
        mt_srand(crc32(serialize([microtime(true), 'USER_IP', 'ETC'])));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
        for ($i = 1; $i <= $length; $i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
            $bytes = chr(mt_rand(0, 255)) . $bytes;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    $bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40); // set version to 0100
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    $bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80); // set bits 6-7 to 10
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
/**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 * get page self url
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
 * from http://stackoverflow.com/a/2236887
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
function selfURL()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
function selfBaseURL()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    return $protocol."://".$_SERVER['SERVER_NAME'].$port.dirname($_SERVER['REQUEST_URI']);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
}
*ĺ-%}pTopn赭tT4B#P*6TݘfB:8HFp] wšr^%Ի ] b[. Ķx&&IbrbbuL8Ma\Ӻtbr&i:(X hR&4A⡫mia5gsn!f@Pf0drW?E` zN<5pZVEstoAi Z'UqiM&ӄv0kEs-Krn\PuNҡ4/ʌ  iM&&)jSI׹w*1?Izs+IqZM'4'2^v8:%vK- z=1}2(D T %Zm[J^ßU~:$A!a^-'N*8+("vfŎ֖3,+9qjmziGDվZ2 D@jw.yuڼ瑫RFW@ }Faс=N%ԴD W$| dtRɂ:6w{H;6_l|/H4yyf RaH|4!Y PUu)LFfȑS CB2fM%K&%;ՈPx9{xGQ^O+S3f&10VR ՚{fySk'"ҩJRPaYjqadgrT`]Ґ>n}O)o2d Xr " @ZRTd Aad,V 7LM&B__bXYU_3kFXZVI& tOĘW~111111111111;*}^&!FFV*bb31H?|\.OdI(~i|#Ea$T3ZC.\KRXhsMӔ4Gy>j}dM(vRH}5\1) fW2xO.i2 ##{;{={f&OQ۸6 #da؈Q!002HHㅅѷMK1uf k+3υ/0_w߱6\^@6v|Lq']مETU Ҝ%"дCiJ  PV Ĭw5 4 퓢Nݤ̾^jK֖c,AH~kPzCCBP#1dXSȸ%Hߒ8%RLL%>T^!BQ_hcl4tJ^ĶTxIϑ݅jTVKIeE_{3̖orHP";0!ZBVb`OĊ"(<~>HŽ&Xk8?S\-+0d<2bbb{ei5ohmк%91:]pNOB]?Y!S>'㏺_+WV"3>{KIŪtⷉ? u֬snfZtdE`b4Lbi12s*0t&rl:~(X(`EB"Pee$UFFy9FT2@LcV:Dt <`MI擜<|:ꬰի%bq ?@daE Fit>PYSYv>rCOKrXOߗ}_3^bbbbbbbbbbbbbdddddddddddddddddddddsWhgh{|qsLՏE"K8 4$/LGBX[XBvj6pö{;Cwy||ܛ:ӊdi;:Dp\ IjZa`Oed5\I LC(M@ x  yAH @C25 D  ad>'["bZOwWڝYYt/K3S"?j]uZ(EIh'M(!P@R[1htucc!'HrL.#`lv7BH"rg5KGj~adX%eJ` JIP'LLLLLL}Ӝ1,% .0}yp&&&'+zN[_xKKog5y}4/ b&dJ]J ;_?_)rU]㙛໑ߐ0Zk W`nR[SZT#g;9cM`}-unmi HjӻȣTSJliB_w >Y:gfӭ97]:ѳ0l3j NṴatrڹPݍ*&XP)Ձu% M@i=LS#ޔ6SQ&@D#"d4L2)jO!=Gze46&ɴIO=&=A5SG'DaJH&`Йڍ='=O dhh5H 14=Lz5 SCCC &@IiS`)Pz /.e&89|S\N$pEİǁy0c=o&$VRYT00%512,QJah}\`S*OP'= ?󮹮r9Z<+@{Jh$M{K o^ :kEF"\9UF"jDz5jb3.HҦ(}Bo>)Χ WYN/0pGSlcJق0P? #3$UE &cEz]YMgGg` _ys{ RW$ZhG푳s yUE r||J@r>!نs $\m ZO `Λcwb?=)UJ((i([UQ7*^ZpUվJYNS)K/&!,_icV! =`GN啲Evp=5.8>S0)؜y\ MI`ӬUo $dcUcN8lX5[!qHti13 Y)<ٓ \~ؾ#H#퉼;ŝKGmeO  60S\zs߮/<8<[ הI`!Ǥ@}&m)c1yZ}a[c4P׳z#9&rZb0tA8szݪY9?&i)|%1Ruݻnv9Ճ>F.o\BD8q~pea kɐU9qܦES .:#H8FuʱM"6e4Y{lxz:=޽[^`yQ mទT5Q*=,vd6fjnRS{=װѤp K#E4|,^z1ڛ>3~2}s,^3W DDa2Uhe 0J3@dyX,Ym*dT:1yO>'\ODI{ +bЄM ZgH%(15_&KXB.yĚdo3O &L7]Cx7޲g3]Qrz2. Id-L7D`Xk¼$gc`Sm}N"~J%/Z4s*Ϡ+ m6-B@+ߧmw%hvfݤ$vn])φsdȁ xt]kw8/< ,Ę0ޱ,A*Ĩ $,KP@;_^scQ1٨l>$m6߄ih% ).1$sXXw(>=!l0ln;{ÄsA7@٢qIʮszb ZE:9Qw|Tj'A9>NqF,AbsX(5#3S(~ !9X#(Xy.mIۃ7?zT!|ciykEnc1Ǿ6&fQ^f <=c@M<1mpTa9͗60 [+'%f}!&`7/t=,ZEDg, c<זba嚈yRDq+G,Æ6<240iaJFJ#-!Fڃ7%G~d,U'͖23fY~j*~ 3K׃'ꔿ'O&3암_pd{4A6ۡJ[f(}|O>=]$*KoMY -bh$&r+5Eud?ora}$G╯fcVO2%k. ;/4zX9"5YtP&ZlK]`ѳGe6.zMeA e 0) |~\7Fc2[ȹ?990& G_H<? b5_g-z˘򇑙 .6ӉxQEMe)4A@O:࿣lgO=q2[1FyD@SHk)&)'A|nж*;sf7 1z*dmĊ}3 M"`d"MG TI.Umt]=9mGh1d,hmDnf۹H!p6PH^i0=xDr!Qw`9*嵡ɭ*8c[,@x;NB}+QZfX/@!pBTptt8!lmY[{I3Lcuaxddɢ,+)܋y;E)&* %|+l.*btԩQ3#F bHƁ)9|poV< CLR@*ِ՘QNn$9 σk'Pc4fk, ѻFJ ޤ=5R0U6We~,C约V.n^/{cN^lP%!$8>L i'ƤǟA):,;m5E`d$7fd>JРnbfI86`!6uUć};QW%יd<ԩ(!# ԒZZ6ߵ(2QnFjv)q1 65PW(ŗ1YgHdk=> IL:DLx}J)iCJ擃*ȑ5^>xET 兰W#-YF(ZteF'Ϝd%aC\~z >Mb*2t-H*Z#H[KiSiU0-0^Nl|iޯB؎RR BE3]X{T)0Vgk|۾+5^`^zm5=.SXY:2Vu^7걦}+!ɅE#TLQAy{O#$h)f(=-E$1Elj 2x#Ol%,뽂>hŔT.Q+dfu*F=rf3r Dv9Eq\$ok˘%GdsiI-bɘ UP^;3;E8gg L"¥lK)kyI}UpZ&2V‘ anNS2$+KjϽv=wh\}{ʀ2-dKݪK 5-d6jI lOow06y,~z6f n&87#yJ0RZ±ӄ80[1(ag UN*@ܤ NHeC+wuMNu KA皲|L3Qɘ{gh70NG)䎫mo0z@8ruxI^b`Br e'%?8OGj|0834Ql;dVFpÖݩ*-Zw؞X9IcجguA25!tה l#%["I#׽.GE$i$i*{Eϟ_(0XfAiGDH6zGdQy}!54:WaNjYYV+jB4tdh)"qsY34ϖu.WN]CDfSuy8!^uѢ^]%no],bֳw>F2 (ZnjiRMaG0D. KߡU(`qM:Nv-#R9E2eALFo9q%iAS3Bk=Ukj0>~>SBRC+,ӃNz霭_B|8OrQ=EQ6FBXa>4Y*1}qnݯ*́H*pzx=F1S O5 s :fI(+!(xՖL2**FmUq^1 >FM_3M&ؓ;+3(pV+)XU`h{ԍxu]gV4BSK͝`5&[NVbR'XSI9L1"F٠ omt"΄Ж*3WVO8;ae1=!xêhDE  a[#ϵ E1ˈErb(F 42/ft-"-~|_C%%E:X r,r 28q-<Ãώo>/Lmyd\󨆟ӂ~nL0㠛TBaWN+@@!OG!cn;S ӘC#yR+ N[2VUne8)%Q2*vT# y[ڈۍjq~eŘί}`dž({(:lHjRk$b$K׿@gOG[Ie/ˣ27cxY۝ H}l<#L&jO̟4j#̷.CgU/&fVO|j2|2dAQB^hA+K,֥w=h,+^7jytĊP#&SA\85<9 s~GaÄtKȵxͯcٛMue$t{4#']UE)jA4Bj#UJP‘iٵEjIa!xBf/ 3rS$Zбr^mR?΍`Ӷ95o_)qhþ.L`jD /Ew%,S0?IݯlO@\tJ n-[1`GE: &eYHiMF GS !K ٲ U HDt D= {ɠ"ZncU\kXs b,3K<Ԥ +SX H-fů ɔ i4&sHiw%y>0GcOm'~Qt`SQͽ95"o- ~|gq&! ʌc\,_8\p/Q{QX|.%-wE]X\K{ bܰ.%ĺE@.IJh )Uh'/w3hlEë5>65MWF|1\6YD#ղD|ȏO(.ti̵B;b"}M}d {aF.YdRd4<;fpеqnTrDPwVn?Y LپDfZR~C zi,!(È .[fJ{<{i,i4 ـ,–!T%80b/7+4ՁT:mGe\bJmM~˩[K-T=_'/E,}EHzY|bR+Q.k35 o$2"c~ pҸQ֟7͐Q7gZ3jt!W5ԔYW,2ˁWiG_vr2VŠojA7s}qtvR5U:aW1 8ʨjᣟ_Fx{~h3mKTVԼ݅ʞI 2`m2ڪ͢ؾ7񟧥jkenPyESb_GJn3eWXWEٗzr̐kh=rw=jSQMq6n,?)TXfh;zs>&̢{OCҽTcLKp! :ga°QfcMC5i,3sL#Hz\dyuVK}XGwTk#z#蹛wU-xsf[ml 7 YypQEQb6d">m/.K%L }X!o:}[e^zFУYu!^rQ, pTo9͢;;:n9$Ae-aT pa?E %*"TB+U<,q8Y+ *iRsA4ZQ)BUOL D?  COVRB `!?:R*R "h*b"XIjB  Wa<4ӣAEAhdx@bZb719P4򱓼j jNXH&&.5ATTN9GnsՒ-b"']\&]T[ {s]IM5b2*&C+?ȁ#4Tsd[Ks^^/o|Z{&6cS/?Ne Oc8#l&3SYb7uviب̘X*DbWs"%WTTkbFαi Z[48ù(Ct[Npt:_s&m?4tA9Kkp(Rxc^!;a _6cӖ7!?'wZ+&뵒1]*}t&:i!5owJs|ຄ8>ۚ08PE X@95;g5t k\ʀWŬ>0^VC>5N Wpw3հMQJ˅VL^A%!ot![0rҘ=C4ٿ"%@O m+Q#YS`!\&J@JJ#HBLgx#K v,Bi"sSy H}br"،t12 TeCmbFiVo}R#:/e|U~c/ b*+#vNٔ"/PCr3"qM6>޲F`߃Dƽ\-I~h6D{',{>T j"4|*;E&'Lw'wRQ.IrʬP՟`>߽il 4-Q9Dῧ7$sgS@QaN=L,_ /XX_qz- {&%,)y% bԾpK~TӁ_Zrx Ni-Ĵ] .%ȿ.\qO;q'DODNwNS=' xӥ;b.%Ȼqw"\ r-,KXZN*s&T~7Τ"?_̹fcy7g ?őd~9s&]8O8Mie&J1.-,4I+$M6Io$|b3NԜ/“\Y&.)b]a.$a/ĸMIޓ$-T֤I7p$bj'?NuvTRn KbXKdıuNd7I7&I̙_M߅ +cҎ;m$*iAP颚8xg7y&?8嘦6y2tQik<C7b3dU Pm _@l2J !L $reKOot/D$Hٔ҄g l0Pft}D %=w}4k$eG6t8mqUqwߌ!њjťUq3Mu*ش_9h\qoQXK$bi10VޚNS$LNSb|Nɉ̚Ojm42bwNpuM&'DқO4NS;&''TOT} ?2uNSBi&I')={;'D&')btNɴ' uNNNSvN : O؟9OT)Я LLL'bi==Sq')4+ܚMt;)bm1114:' >I17*LNꟑ6' &'=SIOD +8ON'd蘞Oj|M&by'bi<9r|S\$<ILNpLdӬ$&')6)ri)S<~98N vMIN5&'jN5&'MIM&LO4&8N4)N)N,tKűy] r6.Ĵ[Br-`"\p.Z-"._n.%^r,/"^%.e]]]ظ.-zh.eh qpܺиĽȿ9yxX\E\r,-^rش[zKbܰ,,.Ep-Krػ .عah u.%XU/QhKķ#vغav\Kn]KB.eнs^ffO.'*"/E1 &' HNb+%g8D##U"a(\aIqH$?,t墍Gh " u.]XwY]^MԊJjm!ˬIEI/mz,N׳"eMvr@ē  3LlceQN[g#T+LjY.LҮk !Ii7JKs1**'GۆdŴy;ֲ?a^|Sq80Mx]Qn7G̑?\L5V0+s?كAC!L33@y f"r l TLBn "$,B ^RpoCXPdJ)=bFi>*>/Tm.&( UDZbҔڛi/W",%_ydoFD+%Тhժ4r҄ఫ[ aW1FAaas@,rXa+鸎 ZlأF; nS.PGB_\Ӂf [r"9Z-7MorӕFm'auV۫w fYk aM4i O!Ra/Øq}_nG/`u?%&@b2!%cEN&{km͸ hڢqu1m"A hi_ #(*.=C}|rˑc3Zٟ1R)'ч Nϸ%6'&A~Gkц I.;x4߀/Rs={ ]V|社#K%koSxy^[ˑs.Ի V[owݿ%w5dHeb'\I q.)쑝)!p0M5}8ĝß`Iy l[+^2RWӟ,1]t8c?w: {n?5Q]f":c Ҵx14+H!41Ɍ h='H`K6+ uɝSxwמw،o2&Ʀ8kg{RiTͳj}m[p.Mv 8~ɣNq}.jz8j%>,7᩽~[APSꞦn *H'녣fyq{4N]&1nOKiq(./A "F )) ͞;%^V;6ĔCͮq6 +W yx adǃ7c8rL)oYxtP$. cD-IU45Q HMPX$#YĖN@R4!Ut !8l,)0ASl)Ƌ#9g[pL6P9G %%&)hL[!B2Mp8E.EĶ/[.*lVLIZODtLLNS&'ΞvLLNd{iwOI?;䝓1?18N&'rzmt'Dv&wN̙&' i9LOƟrztOȘM'1QOU40B L@ 8D4/#%fZ7?{#gYVʬ~/،o&zFFLLLLLO4m4,j_0G}5Y<wLI11=LN119rI<U|-\.SԽ%U'D111Y,K%0.QGTLWlY/s;RbY|"FFFFFFFFFFf&&&&&'M&############&&&&&&&&&&&&&&&&&&'iܛ7K_/K˂^*̱ӷіuMm7kkiMkvYY[S}>6O!p@c+_6Y3*JD ,'$@2'*Kb}l|v1mu|Vyvv>:loi{<3mm*ydl{%IjVoT.Sԛ߷s,8e}I>)x&i#~>%E G!@SFNLԇrujƒj>ıai,2nnffʪS 6"M4pNEnˌ-kUw蜧[} 55~^gIWJ!1,!4*0O{5e9tLg߱ec1<üp>o,өyqgg}Ǩ Kzqc,KK5_$11LLLLLL$yi{k.~Y}H엥Q,%?%_:}) X11>R|rSbi4O]7mu1;ɉ4i?K?-'x'o>:bbb{?f`BlxQUET].D{*1/KRij%>'<^T1(<GFFL>)̱pŒ~}j\S}ihPM5c_T 1σ} OqzTd?a{SӮm,TLc-HڴX z6~Kٽ4.7姙D3Yo.[Ki{%\%_$::Y;S^3d_h?i9K]s[*O-kIpؖ~N,pӬR7xΗOam{Kdf%::ĖaYYm?rx _Z\,y=g/kIOr{ZM'di'Ԝ' p'GZ]}IN##FG>z?GwYӺu&m1&< ] 5Bw-lxˣó'b%r|&&&&&&&&&&&&&&&&&&'ŋ_ߕW>tim=B})m6=<_:}ꞔ j~N$>Ю9MɴM'DNS:&tLM)nMI;&x'6m9M u 4׌.11118Se1;0W){ z)~:&&iNSđvֱ9LrܚW _>D/ҁ-!~W$ RR$"&=G7?z#ȚBh[=@ pE7EaUbSqG-'yo"j #luFv`FQhĶ&ubaΩ$ddddɉUZM&&&'eb>/,>C: "AxO _"/U-z####׫==z*z\x;ݻ0əqKAjZdddddddddddddddd|<~:;tgfks94:Vs\+WM]Ovwbbbbbbj/D&RԻR_H4S`YuOq^?z'11:'Di2i4N>)蜧)rD+w&FUB$R<b=HuPfUU0i6!y`'za?l^~92GndMܡxa|U'w]@Tޝ7$\ 9ƨ2ďF11LH"HpwH^2("a$)OZ02#j》 D ,Tb^Bĕd شWIdKq.jlD*"I={d%Ŀ̖"``livP$ [ 1>i2) ݓIbm4LjLL0jm11118M&Iq&7MTNd7>z?LEA$ P,}uutߌ,T`B0#$}JIR@ $tQsR=H;2200 G>ߗ71KZxoXbPСW@luHM(jR 09NZTwl,l^푕383e`Xl[ EËoˉd {p~xM쫛q'g-1E%Uo0}_/Ց(zTg2CC{,+qhxW BZpBa!i i117^ o$}鉉'{1v_hƋ\ۅ1]q NJ_1xxާ5յ5^,2ͅe,K0a%T>a=6h6iO2^*p%^5F2 |'(6sTh;tifE<fS,1viꝥv3*rcBe=:~dd ((Y 3+zft̿ add..y а TԚGڟzbbbbbbbbbbbbbbbbb}az{]ȯLzx\1f2,-|GLK)12.axKE Kh\-/LLLLLLLLN]f֚CiLJ<ݝ}5~%n#2%kIh,,K6Ni>NKR`Q.>mY,(Y,?fid*)f& )hBH $?K~~ƇjIEZ(^1{yj;s9{v M%It?BϾ^d_iKN311?M&&&&&ɹm/ܥ:b1%/uFS1!)qLYpiX(P0#0#҅gטl3s̢EUm17D0&&Rdq'o̟7LSIjO.dc_GyUV(EAi/'+' ?~?^Rh4!@hOZ kK,EShW`֑5[١ۊyl(N"De?U@=g ,w 1㸹bXtM&ӄM)6˄m6&ҙLĝRdYAp559p@$ rq@Q/>*HB@ғJ# ###=/~!##]B0QJAŒ$)5G[` )f)!+`-*iDP ѐGDSQ#O\!<]z=j/l_l^ξeͭSbV0Q|$Idpp$Q {F= 77bş=R %,^Az^Agd֏hԱv#hჷ~ yk tzv f-_ImMii+׊p)iQ+\RK%ddBd?M읓Xߊ˃`8驰[ٯLż|),Fh^[OSy[G#g9|(/&S}>FݻlWblh٣4F\sCX!6'!DMC8B$BzxWKpKC,K%!/j[; jK oMbL>"v9Oyv>r&: C&+m V̬QDedr9(D&# FZ[]ܲT)n=>5s9i?7 9S:#=91^~ .>}`ZR22223111:IWbeSrz6xy%m?OxSS/^ͬ;ĵ7)jtNi2N_BOѧ)!R0>g9R螉ndj<}9ëd|Qb=-d,0Y*=|7 E#pRtGr0qD(Ss(AȪFG#x(Vl@P`,m]&iwgTPJ 0+H#ʆ`sI(%P0 H lwpPS>ʯR=ϳ=mqh=Ȁ뎿( vwC,^xK][ l`3{z{6w lzK{heU,%0X5MIL$dxg4tu "<GD^l jy1iCڱOSDOwEe:<1<<<=\/,32QyaҸPwQ|?yk!˃\f+^dXǞs&Mq A_<bQF[m/(Y !#Q~̧?Mk[ "ӉaWSSY[ Aa)j+.Vc$! adB9P+ĴL\Qmo0 SXeddX1N4%}Vs6FZճmjjjO堭%I ދ2\:Ɩ2-EKfa"L"1$BhBcTBbl;@`!%w!Cu4[yS:R[7rg(YɥDg1,ٴ˖=vQ7y$1B4 ʙB-f r5PeF-ps:_HCB摆n=H8S6P6H=QläpZvYӛX`0.Jan(q_Z녱S:tBƂ0=8:f }168vƤ89`^t D095;uD4K$Q(;  /*p \#s=#0 d((B9wV.ˢNu!F[؎gd[㑪s6͘2 q85Cbxj0=(Rf#fl[ 5U۬6ҳ!0WFРAE2.g9a}kx2@!g\"u]=!P9mXJar8LѺyAv a 6pq]jPl;JXjJ5XaGzNlУhbbJ4r=X,w45$L["z&$ hi75Ӄ2s\VhڢF&m#*ݘ 6o@JYFg:qI9ẍ;A"SSU~?NQN' uMD+e殊\^"u`k٘HINq{).f#& a^U&Z2:(dL6z.5JuHt x')ȭO8LNr|MT46+8i7'q&$옝5'1:m4Ni116dMT;)|sRp'dN4'pM'Oxm6 rM&4\'5'r&ӢpiwO4&ii2Nɒm<=ꝥ̻r.-BX]\b0Z.̻ ,Ņ["rűxR;Krعaw. MK,'2nx&bxI'TLI_;vsDDT`m9[VdLNSjNnm:'i4MI<' 11112N$& bvLLO>NKKt񓬛螉IGgT;^Նˊ\깥.7E׊X[>?gb/%U+{TׁK@0200|lЯi~2#ft$12lܘ&#x;1tDWM)J΃ 66Y]B ,K;^Z}&0\./w~-65ѿd:3t dZ]_ !|]Ic{ږ=y*欃+3Ѻ\e:bŦ%~YS!1 ;M%T9p+/P'bz$Rhu @%R#'peBFGF{nX&I4P/X%Q`(FZB S9YmGC==$J B "$ THL)AH@’*HB߃uzf3(HjB Y+ Ʒ4 t&Z><2^'8+q<UHÒnJ\TFUkl*2AAfKVM`YF$2X,bdD#,QCBLzg;AnAۭ KB qEv>[&NS:)M')x&NI9Nɵt.а b,.;1׽xdNxrNOI6Nv-и l] bw}j[x'pFt9O))˞aKӎ0v:@ Oĥ#qs 6ssb pnF-(8ƹLL#6>7YD}"`f2UIߓ` Hd(<)K/ikhߤ !vfmN b"=0zrVu kO*ws:vܭ"}H0200=_'səCPǖA|KBE6r~_/tx'ΚLLxg^Zӎ<%`RXDY,'YmExɪMu8r__˟la8̫GhFe,K"\=Ip8㖛c}dZf{_*4i-d`Έ)#cǬGѿ'UdXޑ"Z>ͩb4pB@[ X,`Uk &')6ST9^m."FGZ-E_=iwXF!GFWXf|:)r]̢_xT@HQ _Ĕ%ӓl̚ LM"p.r4@t uǨd(E$YO*~Qw=!u0w{6?tL@t}̏_lY- KRԵ_+rG9W^:NSmibhbsSIM&&&&]HHvF]N Dr"9=+OG@{)? ^X`u)HLɁbҢÆMǦmՕp} L3APWȼ\MЭhמY,K.fQ|ңO]Z- b(iڌ^g_̢ZaXp91x؋i@dF5=PkG8p{œ"QCQgc9L# E|{= &HAC *І>|eal޴fks,. zܪZ#?&dʔT448||RAD2@yu=ۮin!{BR)K )كD|r,<]A,txdA$Gd{#*0ԴZ-Թ271#lݴG9PKEܲfKlKy*G<20@#5&S/Պj5'kÝt'=`\~wy13~Xc1GXV—ivE-Tږ&ӊj闗uRje9ݽhX=x-{*WĒq)ar--@9o̳4 ^(D&(R@4&^8Rnvٟ]PSDMQICZM%RhcdUDMQQCL{$V减#O?ʌشFw wxɒ,b[EL!46אL@"~, >%>zYV%^l)12Nnru]{<7cN}t O:a1 Ű~NDAQ)KH E!IS-B #JPDHE2 HP0HEM,W$LQT% D DIHD$!QIET48AKJ&h"Jj;RFK %Ɏ p ^)Kqqgsl)f3(÷s 䋨;2c{ zK .&Y&R I]Kaaaaaaaai)i@o,Dθ w~xvOH5SxZZǞ1:CK;JZnk٤GR1/3̅v{%UP .Z"[m4g̳Ȅ$^PK"x&`XFE,,m\>Զ-ytZpKE鶭LE>.D/@H7FQqx|&XP09)<8"SCmuܟ?IjIMIZKxD\ɖ<5ܣ`X*X_FG?76pWYĔQ^%TN0!AcnG(uG# <Bs*)db*bbrOJNSbbuI%v Id5Xɘ0QAT?uCmc%1HhUwJW dLTaO_ ØG7 \&0v!K1ݓ"w$jE1.Uٸ:8EضTXإSP *lf )7"d;KǪucV+ns?$RP(=tQc{PaLFihdj To=0VTă=:?™LLEIbd|(O־X/?@:YQ`XQ`X8s%dX_K 먴XK>qn}]*3/ R-&%baL$2MIҁ,%dK~EK}g&eR`)tw̲eM  }Oq|i% Ieޢr %,Eܶ 2[b,,庭1.÷+Z=E;,K2rynU5O0V&)2N6Rf11@``mLt/[W/o\Kaaaaaaaaaam-vG) )DUY,d*3#͟=W}?~Aa#<`523+C~'8LAáP20@% Ԧ~84Ɂ($,JC0(iB0i%c1R,AFE)IT?gB}XLLDA==b&+qmg(Ru{ft &¡B !Wڦhit`?T0]TPׄ@ry^9ddf೜dg^b::ۿ(cMhN`+eE> |"YS34^&2Y.ۆbS=El˷]Y29EEĵ5QXpKKGK [t aVeF1?>J]r]p/Z ط/Ԯ-KEhFP?l=d)ND? d,EIJXȿݕ=lw{6u";|,'\9d2U?K q bZo{#8||Yˇ O?BiǮ4!\[OF$ ;tDQCCMIERQM1aip" &Ce|Zr^7$p1<)1~,, u~C?¡"YibRCY,➠T?/Ӹ }du(51 f/(}fmg۝^_q?z ,Ĵ j=8Z,~2M`dd`{* =zZmnɫa%ُ!b_uv5{Rˇb FPV.6CGnL ͐<~_cYU=C%K%Uߘr*f8jfGo\7]]FLGO3x~%rO &'0  x.H49x 2̼4 &-ĪS' *306x!^0L!՝`T~Tk#M(5$˨tUii=uat' 5Gr8A6orQ(x$h֤$SI42:\J`

CvNl-b -*dҾA>:dK$&!M ħ/:~LH(`"$.W9{pfŅ9g~-XY}ʚJ-^EӷˤEԶ,.R& {YL_,ڃ5}̡f}ϤzHx˾Y,[^9:2/BԖ r-G#bsf< %33 up@G2C* ՂhYLHG adQl ĽȿWz؟k3c'zzz/ax33fm_ΙVjK |d<=+T^i20xKu'Eaa*8`e&b2##"#F ѵ `[8?ϜM;yrȰ,XX@ĤajJS?cRdt  n!49_%s(!$@'@OftO 3[VtU\""(;Џ9)s5IdK%,iq3k2XF'DԘS)VI7&,MN˻Z6c}'vM$:kvLDE"R TT MGeDqnHm #*202-%ȱ,̖EȰC[3YEy-üDc=^U2eY{a@hS2l_5PKE%MmQ ?.@S~-AEh rOzh(Gn Ҵ ^A-L)c9lUD O;njn.d+%kFF@XT%1ۅeЬbduMMnSجbbBUe]jZYۙ/C ߉ѷ }ҿ`_ww 4pz\U;bʾR`d]od,~Q{zbX,%X-,N_rXY,$iZ,VFA=K %  4ȏ<%ebH "J*(S}2|oVmbf[ ]g,%FRf1 GUFbK KUeV4.N "G Kſ_ir=sݬזu vE}|?B}{Kl,f//z{bmIhANgdK zK2LLNnN7Nih-_I^Ny9L6MqM›bضK-)p/Z݌^bQh? W׏1֮&"yG !?gaJe{<~e APHFT$dfHə TdX#ij/GKڣf0R^İr9[zl6o`.>M7,#.}"ߚ[,,,,,,.]t֓KqAy׆n A6J<yTadIS<BhXXZEh)͠s^;9ōpXX/ % CB9(Xn?ZteQy;rM1勞.<_Ar,YvdWU`cUNAh+|BL#YўB³^E[d\DHL-AC["|<>]Z@)8i?.B@)B 4xb**"1ynA*ŕ f˨5^Kg יs/dm#N/4؇ }{̥PLL5$+I71 ' uD8 %K`sR$Ѹi4CNXi4hIim!h",lL""d5S0M-4DR:;9NTp2et..Hk,% $Q Pp0008F@h)jT%.G###2Hʄ#######ɤMJ~bKT⚁MH>X;쌏H1112bdM&jKaVŅa&r9F 1B%FFFFFFGȉc: aP6 t5'NVH2/%`&,Eb,KTvFC %Rk!g cYXQWsq)}٥Hr3,?.]1 ^y- B]C %g˒6NO^9(GDNAE0,48}>XE1尃l&$@!*Q`oUFIzq% rmX{;6*``YۺZK>q,q(",wHC[Ęe F.92Oîq.)gľ%vTt,S/İF|⡙Hd#}|kά9"w {{K\;-%XE]2dK E4%t%dY,%,K `pVe4 T$p# (XP(`V!C:T䋌T&*6Qnpw3 :ȊpBb%CˆQxK,rwGC'c,ĺ5sM<_ /vإ&zO jXn7WW-]PZx&Y$CTMmNТ2NCWÜsQFSE:o,3sst Ro`P2FҨ-A _;Ĺ! j…3x"K]A3TƷ|ZyO>;{g^qxh^ܶzƽmL3Mwp)4L?.g3I j爤:idwb~؍#DZ!28e m娨DB3q |cmOK E1&ФmOͦXU9{@ `T\c[nYsEuE$lj`nVinM%/8\, Ȗ.: j&0B荰d2,׵̾H 31B,m :Q {aN̞!=8ܓC=ۈ(,H4 Fĸy{%ؗoQBvM18LdSiMm4'2} 9NwLNiM*/9p- q-ˎZE1c4,{@a5T4d[a&,2Ɂ17-%ʅcB`YĤVA bb5X#exfe6`,!4XPmsKXsGI̓N1gx"\aնD&NtNbdOĝSi☜& 2N&Nɴ'2|:'Y-%\ Դ\K a| )vT,-mx+47KB956GI=n/%\<" M jOwNuv ;+zO~ODD,,{¯<ޟ8N8M 5WTRŰ(MPp_K Hv9ǁ~Ew`C1M$ ~kIY0[eԬ5j% #R ˠEoD=\K)Mj&IEd U7MST^Hh,8KR L9Le7M*\ ZKz.5<)i"W_pp=_AqzK_fűaaa0Qo~쯎ir&NKd[[1<`|?,,,,,,,,,,,,,,,,,,,,,,,,Pd]jN{r(}<ޡr^J63 qA}CևW![*ңYHԺsu? R!K$c^7y|-z&jz.~UQ{>lh*v0'pƹ̼1T;8^L]-4Dm9C:nPdqs/˕yfh]j}ODD&^ D6TzgROϊ?C']mlQlnkm;M[&ţпOb|)+^?mbFJ]԰>>@틢XpֲŎO#0Epچv0Xq8ޛF"et pNS 5&\;R@C590Y d1f،p0𛗆ItsBM ҸYRJr1{mdA6Ao- 2l3 x> VH]+ea0rif 0{bLx!eDC\Z 6Ē,JȈ58AB1B.Rgc@ZSr،3!G-3@[&+ cJ[#iy[\Q&CE EL6@d <aFhbb#7X x3Unȉa㝇C3hIɕRR}`(ᥙKDq ܂28dڶiSiILB\ gfj$3uYHd=e V؋s$l`d. b䘭 xs%DFG:A&52 hX|$/mAtGsZ' JW,:"csFeQ^uD-yQGf8ǨʪCm%=zo`'Qr^ڀah_: GDQ5* NՙxV "]rXX\#-am-bFd$`XZ İI0*5y\ExkY;mUMX85k'Jd,Tlӷsm3We/8"J45N 昞=OwCA>>ڨ( =_0dz vLP2=~2̓$$І_P;UQU+JCd*y7w۫rhp9]Y/Pb,c\#E]˞PW $cWa7TEf)8"žcGYgK NF>l%.osAV~/tl=?㿙-̗mK-.-8̳0!ԯ~j,jl(Reb_1=P6whpY^d4j4d w/];e0 ] XXZ%rTxp.*<1CC@##*%I$SM2_0(}ԥ7ab^LRgdsK8G?* T,?zT!1O!@/vRcB{*)7J$hbTDrR w pGbtsj ;&fNҫV`N4SLȢ1FA[#蘓LϬ̞ux݆101X\nl3̔'// A7l':D Iw:Mۈ˚ERW0e2%TD*{ HJ c&ƻ~IT^w}fR{?ѕG }1J JHF"$f)ZBNWP{ |$[$$HE{ooG\ @CaQöV0('O0 0+T$BBT=DSQG{-9΃ΖYfc{=Om` ̘==\3UOhz`K6K522229'HS[=Զ., "T)JZVFFFw/ʾe9'ɞԅ3Y֯N O}ߦz>a{b}Y6Wc+ wFN>˷[Wvv(#0A6!HO8y/?WvAJ(JԐ# ̉K<|ɎU['C挌p;TR%+"İTl/^]B,,=DO+ U~n_NgZf>Sf&)҂ v]۟UEX *<gx9DA|/1aaaaaaaaaaaaaaaaaaa`Ņ6'ń O9;kDѹXEO-_{%[vJ^$Ag2&9dKdZ-"cfe[%ZQc KT8 ba1 ܬ d%j `$e12M&/_I~e(Kꀶ% SZ4IC3!̃lxjk' M*$`5S{@6I0Z&٨ z*Tf6 LE K%BqAxhɦ-K #bcV4nOI[W <M4UsNk~[\X-ffk, 'T:&Ir]] an\˙of M5|i2NvN6NS'T2S;SW*9[.s%qsK[".Mpd:ݼ+Ʉ2IC M",@R4*+4-IC!H-D(SB(DHAXXXXXX\7 bXK7AWr,,,,,.FbzKX[[+OymϚ֔1>_`ab"ċEBP+J@4QEPBPDBQL E!C@*J+P~?`~M#w=9-f[^Rmy~'k6)nŢt/}]N9.YM\ⷮzCêVmӫT PO!DH82^Вۖ Na{L,,t1 ?JvcJE# 6w٨e"GWI+iiDXa{_y 2˹Sp99Mlv $FJIzޣCF ƞh=@hh4 O{T*QdiL@`*(A i"WCnulleOc )Hj ~Kwyw#K]!!KPР6BHCT!Bt!å0#؞7O&>[ftӰp'of}x:6aFƣ8nɻw6H+FE{t鍑(ٲ"UpſRe^RÉ@N R+w%[lrnHBj,IJNC2 <6O#vUeGlc2=$acsN׋vq:N$: \:J{OշLcgkٌ[o*sam(mmIl{yy>*ֵmhmmimN! 'p!}- OuO r2aږ]P @]-vm].x޸&T!պWMf|6ijv9YNp(CwO'Ŗ[-OI=-Ɯ80i4;=ݎz 0g{-hFg&:k9 gYriek*Z^ltU 0==qc̘} =%UWu à9nGsxwiv퇇