ELF>0a@!@8 @@@@888*!*! .!.A.Axx !AATTTDDPtd000LFLFQtdRtd.!.A.Aqq/lib64/ld-linux-x86-64.so.2GNUGNU9"m2>[ø$K HB0   A$  XpԶ"*!!D+0C@FQH23` @A?ACDEHIKMORTVY[\]_abfhjlorstvwz{}   !#%&(+-/03467<@FHKLMNSWY[]`abcehimpqsuz{}    !"#$',/1489:>?@BDEGIJLMOQUWZ[\]`abefhmnpstvz{}~ !$&'(*/0469:;=?@ACEFGKOQTUVX\^bdegjkmnrtvx{|}   "#$'(*.169:>?ADEGJLOQSTWXZ^_`cdeilnprtuvz{|    #%&),/358:=>ACEGKLOSWY]_bdfgklmnqsuvĒn xW 'VA6)$S1E "Adb~zkY &O)QEvc@GYMWrk|S՟K ϵt~Hr< QBK~΢w^׵c;+G(y ' .\dBƘ+ nszAEĽiǿp~*h#(s)f~.ݵ^5PQy=kP[f,m!Nn( ͓n(Jg=BEwD Aw;}7n(%)Lɲ;/aPړ 1+ :u26qx_ɂB6thl,5м5InaM8SEOQ8"hv*,e : T֡De x(jֶdн4VvEN-aOV%aŋiZ جW4`Y/J*[ 鉧>TM-W6$yH1峍fdq_ϨeP k --ѽQ 4@gxu]\4x?umwr>P]EM7HDl_U"+b"ļ>J Jo$NU|e\ۥkC2" A1LuSSXn+S[Y)9GP#(8'|I€1+ o8U-oS|F |lݧ$7Ks6%fH%KřP:_FN5/E8BzMۜaAfUa;㾢ǮͪjGbI塨F%:z5R5i# .HJc/\8q{HE }qL)oa&?zab(S bGEWim<F.!hu.S毊~舜~/E?Խ#{[5({Lyk@.-t2E=jCќ5y2Mr]9\u0FWj.u @@ &?g8}kh]f{j&}{,]>IImE݃=d{A AYEWgPuN\ʅ!+p']XX>|1SihqS 1%.VJm[Pн"pP?kJ1.H V—+F0R ;clGiM g$X9hD7"[g6O5$Y#2 |@ĉzlޔqXM re V,mϒ@N[.~a T°eMj6dlX. YRBƦTcKM:' ?|6Q֯ySG~4yP@ե F S#ͱ*qrcWC afS@'^+^AfzïẑwSyƒ½AHHv`Lܫ^4 +Dr hq: UIΒ==/rQsq7Gm~ϗM ]5H#DfoFkj0{Ku1DjѢYAkI[rZ~aR:%j:)Ù+m4Z B-υqc%B* Ox!OM$'Tu;pOEfI%FM_n nsC!!-|v|9 5r W (o}3DBݼΒ|/=zi5x`lfT &GK~9"e_uM$+w$`5foq4R1ܠD0R PlZ(Li?edj&{d +IT; wdH_edNQ6WJ s73 po3OWEv<#y!QE AgwMsj%:s@VU/DKͪ#ii2bc-$ASXMlv"#kjhZywqmUa&bkb]/8C__`nH3$3O[b_YU*u ';&ې84ۼNq<6gfGo">MknVZeC9n@K ql (zfUob-Axxj \ysվx/)‘NR=Ev(A"-rVM zX2U `&!3'NA!6S؛ UEe ||Qj:ϲ.|e%kB$h*E+>Fhˑ\%2jcWHeHb*ꉟOHqQA)?bdzV#/02|R$`4Ka3u6 *JvI B5Keip#-`{}dkT̢[r"8r& :e=wt1;N') :R43ьv#oqL[~_@fɜs\< 9r ȫ25F/p"[0Ƨ PXy4·Y ! 3m_ĸLNgAԎs|#*msC8op+ fP'a ,T zQ(6kE8BWyw{o܉^8Biy#vB}wI) iP5\gM-=uzwnȤ~HLG,h>c̑ёƃ"2"BBqi͹ӊ*INgr,d`,7v 嘉h<2act0^qD6)%W#Rk~aiznjFTv{}Q+nI)1pCU⁉# OD5ƭ=zDwtf;BRAu%ߨ~bnүo zOPn)m&+6Q׵j7[;JeΫOޟÇ S]_ u0cQ߰b|#fuRŎ:apwQF%ž`YoU(\Eǝ[ΣQWix.`d"i9t-бV"]N8c1S6hWI:ɀ]~\ gȊu٨|vwPN嶕y}k1ۿC-X$ٳ$ !lEn&cƹ|o|1)2G:` 9u-hԚ@RUT{_ͺ-^gb8R b1F%Cd- ueek`);zz_ȋA,B8rJ XBL.=jaydQҺ0a`Z0ćyZEе#Ni(C}ZLn_ fIG.}"kt A|52@7)©e"'ank$vz̛s49 vR/_E|9Q㽦[ZͯzE/!7.؊ pcE+}HU{Rt0B6![ԀΤҤK/P*5EUb޶Lf;3]t0i% ƞ1y}-ۘ' v֌Fq3il [u$E o:M^ȩ|: 8jS7r.S$IؔhE )X=`93Dؔ~@r?D'>kzgw_srrT9#/+`qSa켆YGa[$ʕ(mu M1&d/po ΠHb/ό]QL2/ c#v*E2_E$#{mQ,ʠv"> 1$bڢ8DWl9O`}lL3yXI%C]$!h_2 72hALz_<`fWO>@ ~7>wz RGN,e=c 4u=@)!=i2Xn{v_|ZR*4`4qyT!-6 ^Թxj1݆N1-Ŭ L(%@mjBGskJ&*C`fg[jMهw ҂k;m~߮'DS->sjC%]Sq*YӜ*qNI}fIAc+ډv]u_!92-:_oh*q/@=K .lk{%?^o7ċ֪Ek;U]!Ү-U^-;z$!Oā 2i)Kd )޾Fg(WJt JpN oۅe&DmPoLGR- 3[x!!O ➞5`$ot8ӁQhFLYt&D\dhA5j{% NIIj,D8~aTقG/ToxY4~ s8|ȼ=%mWB3+ɒdVk101B+ cM,&?Ivr jBJV=\Kh[pRvV;`@D0%X2CyX 0؋ο oO]E2z5 ?G~N S9h[+iTVHLN $;+1XFI[i4n^*Tv.l@VEWWb^A=1|cv26)U;Z'u2# bcwoHR/iA9Q!j 3U}o2KNE ZOb+&sAtdi!8m \rYfQP[NQq-xmʏJ^o' , $J%4UA:Yqxk#72N3/3-U"eBay~P6 hOj "SKtN^Fh'@S@ 7 "Rp- =L@B-fmc*nRvO\@,fd9@$fK@~@L( X| bg"q z@}Mu Ȃp[ p] .`ZX`,ІCS@EMp .  @ IP ~M30\W 5v F1@.A( .M=]@XkZAe ,`[>9{1 2uk OB4ESFq@ ! (p]*`@/Y`- R< hI&t0rxC %F9w iG  [(ar91 p!bAdbk3aprb|% qV!G  !gK T wq}V\qpbf c} @ kPke[0P #Q 6 @[pxRJ z;P QT`U  N\ ~+0 i!- ^d7Pz) [ jo 2UC|DxE W/]"(8`[*Y-- IP < 6, c<`.3t`7 )@O2FpEco 2f{K jyPm `M 0S:@ j=7-   'M Fs&FQ]K#0a +M "Df\0*ئA7 9 D  ^KPt)RoA"W`bFп 'eV@FAP 3 %b*_#`C`) .  QWF (p &0}P^Pz KA) A@V 3 LbbIzs4@ 6`9vGS!v c2`s`- T@ d0 GTp w %d UPpvlGCBP`~IF! kg09|Hˆ@`%4g`v nCp* f vzAX4E; P ͅ `` T+@ e1PP9CIi  / )Z Ѝ +]B\ ( {lI,8}   dc)Я0 :ߍP Pl8  LU*xe. 0I@@{ && a0i [ D{I -X%| p"G$km JAP` F-wT 'I)0߇ -7N so4` ` ahCp\ $ #%` 9; b_ 3igTy0/2lAp`Yj4~ $`( {Cg= NP  KA P -Py|I:u H h~ZeЎel>/gr  + wC0 D B)k!p9A +_ A%=QA PRw l4 *URY`~d Тaވ # K0Px+ >g-`F"JY@A$V .7ФAPB@y$ Y0N8d@p Pv,0f,UWo@ Zu} pd!dSL -6#PZ0TМez 2߂ЕG(@ /* .`TG :7 ?@@8 7  ;qp " &yB q~@b)]`F =VJg U+`a : uF6p 9tYiA 7NZG{&iP|@~и&[@ $^@ (G\}6`ypZ @f!Н5@?bd ;@jAx1 p a: ?Ap ' j; 2TRp U U!, n@ x'P*@ A` <:_ SP& l A&s",0 &BCeNp:I17w0 u1\pQs|;du  /tn @Z0FH`r 3Uc` 0u1y?\u`b&F0lP %V[ u ] 7`U.P>1P7 r >= A  z p 2; Zv M&jȤAB }UfhйWp>7t'e=`UP ~XЃZgP `)y;|Bt ~3 Tw`A(s729яV<K No`oMPNn}# 06A P.7 z@ +.#Ɗpd>@HAm]`;<*PTQ[ 7%AF@^ )$PasUZp : @ Ru`C`1 9YZ2 p\ Am.V 5'*; `NP8 )ljӎ`P mt6t, B@F@p?8 nFF(5 A :\>\] e,m@O e@d`v1 K|=hPNatWnp@ #@ QfMYA[Mx A_#/wVt3b  5) }^@WkЉ X 1@9 4!#F1 ]9W;0,io:na$`AyP8gv@OK@spMY cЧQf _ ;+pq"` J ; hGPA0a+R` p]`\l$0J@n r ;@ Z `' N8`| U  BKk@FA03 #Dx`/Ή &@ Qp {[ } </>p ~D Uz k6 cMZ%7}07<p5RPVVб KPNl6g " 7 W`hV 1"  "L E`gGx`!O _ ^ (\R 2 )3P I EyJ %~`E " OX8d0Gpopf% fXp:UPT@9  R\ 5"^/jlpWkB+ XspL,5u00HB- NA`b9(HR "n@i'iQb42{U. D I ;"4 ۆ G' [3/+cT%UGH`$ Q> j\sWhjH[ 9D# %xL=e#7 )/Y _ bHftEI q@Ahb/@Ha@*p/ Jl0  hpA }pW TT8^LA`q` 4S@  <8hJ0Q O.zb`  .p E Dy=x r| "w9` J{F$u@yv; 0 ePrX 9) w4/Pn J& xAjRHcd6vP :GB@PP(Y R .E _O d`Wxpzr-&w& @B` U;^ CsA@])4b@[dshpvx0C #* 5 Dve ƈ\ -PA pL # r| XA+07E wCu >680`6 2s`" M =Y7H epx MA8p 1^ N\P tFg 0?npf q^D IZ  s[6Sc` K*F:@ <| #a dЗ I@ *Jt>i#8# KTF T0:;of` #/R}{F `[ 1` / np7Q  'Q`i ahAj@ 5wm=p Xbp! j"/nB]T}pQ c PS?xg0+E L <УnxEYxQp }Z &@ \J2!@n0 b&Z/76P\(U^3[L@h eS`= ~-'  8oI^r@B:?@ LKm0x6hF /܊`AO U0Y-Nk4O <T (P s_@6}R+ D{ DɍPp Kbr u`tH -!x(PTEZ`Ewq3@%7"sFVe /&h _+pO ӌ /(x,c?0 ?s>kv0rv`=2 ݅ W`u_ h,P c@)AP ]U@&@< ]` r}Y > BX'6/Ty-l`ǐ0=3i@:z 1C^&: c^5!hn@6 8= m kuR{C CXU- #LfZ_ Q~Z Q &t 3tpX W~iďAW@: sP _-!JpXcz(p2r. ~Au Y'@ 5ЄA3 e6rIG@AP@YN4\ bjc [h &:Cupp p7 c`z~thc`07qVH~e=g0W@ g`l[ OwcP: 'p@0 g}9 :iQN 1]@G`| <>6 'gR4p5^0D]`@"ws&+F G ?=r@ x A`=&=j@Ad5@OA` 9#h 93PP ;l sn5ۑ`: hNA`  /hr5F`  =M  Ac[ | @^OWt8;pe7o0 x<P1qt qmAw a[` P)-s ֓`LP .~\Plnu@ @yl` =1Hp ]` Y~ hoolzp Y_6 p 0FhK8   T3qKk }`[Tp tN jpJ ys` F_1gn~l` 58 # /0f67~@% &RJLT` gV0j9` l L ]"J P  > /y&Bp0 `\v t~8lM  @>[0 -Jp70n@; e0`*@LA(7KWR m> 5V Td 9F p s  3 !p/5 0V\>o Y@XՁ ){i@! &j 4PV`-B; 3G0A]0rg@ EA0 P tp0_ Q_ C tP $%d0M7 8` THp sS >~@ r&P /9)c!+ff$ t 3` Q$v@?6Bp%.@N/:@`p@ /? .v-pSh0 lj#qG9p ^?0^>OP 7 W (G@A,Fr/sU&$B_,;%ZP ~nO r'*guV C#zbxAeL vSp x<"^,[|`q@ r}z  f d K@st?P ]sfQ ' 8\ ^ `pq 6`M  1ZXANL Hm20qLnW=gmkR / v(sND |g0}"F `D[HWy .Hp S\x0U.wCt XO!z69v` Fo R8M1Ep^ mUP ~T a`4 E @* O' )  sU"MA`0 T8 L &@P|p#$` sP3o-0"D<  P !ؤA @)H@:=!M )wWAaQwCЀc,W K* 9 v&7p^# v$ `IP(0 IHApx# # <aE` #"| Y)[ [p> h?P ]s01.pBJ9 Gp> G "$@ N%p>O@wzd*  RJ5 hqH@yp ?Cpp04 +@D AAxi@sV( 8'R`+En߃9 !+ . DHtL Y, _-~%PTB o': ^ mp k0lQP@ KR0S 8 X"И$nhEJ1ڀ Kzph@@vFMpz (Z8aH LA 9$* )'0 1q, `.`p/`Ug=m \6 "p 5kQz _R pA# PD@6jp&  yP, [@! L`Euz2Xz?PyE|0< . h`Yp+tp7W{`!Jt2p*9 3x@TbPF xjew c ]ip` 0tlibm.so.6_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTableacostanfmodlog10powsqrtfrexplog2atan2asinloglibdl.so.2dlclosedlsymdlopendlerrorlibc.so.6__stpcpy_chk__xpg_basenamefflushstrcpyflockfile__printf_chkfnmatchreaddir_IO_putcsetlocalefopenstrncmpstrrchr__longjmp_chk__isoc99_sscanfgetpwuid__fdelt_chkclosedirftellstrncpy__stack_chk_fail__lxstatputcharlistenselectabortstdinmemchrstrpbrkpopengetpidstrspninet_ptonstrftimelocaltime_rstrtodstrtokstrtolisattyfeofsymlinktruncatefgetsstrlenungetcmemsetlocaleconvstrstr__errno_locationfseekmemcmpgetsockoptclearerr_setjmp__fprintf_chk__sigsetjmpstdoutfputcfseeko64fputsstrtok_rmemcpy__vsnprintf_chkstrtoulsetsockoptumaskstrcasecmpftello64getpeername__strncpy_chk__uflowopendir__xstat64__ctype_b_locrecvfromstderrioctlsystem__snprintf_chk__memset_chkreadlinkfreopenstrncasecmp__fxstat__sysv_signal__realpath_chkfilenopclosefwritegettimeofdayrenamesigactionmkstemp64geteuid__memcpy_chksrandom__fread_chklocaltimedifftimestrchrfunlockfilegetsocknamesendto__poll_chkmktimefdopenqsorttmpfile64__ctype_toupper_loc__strcpy_chk__ctype_tolower_loc__cxa_finalizesyscallsetvbuf__xpg_strerror_rfcntl__sprintf_chk__xstatmemmoveunamefopen64_IO_getc__strcat_chkstrcmp__libc_start_mainferrorstpcpystrcoll__cxa_atexitCurl_connectget_crc_tableos_statmbedtls_sha512_process__libc_csu_finiluaopen_iombedtls_cipher_set_padding_modembedtls_sha512_updatembedtls_ecdsa_read_signatureCurl_pipeline_set_server_blacklistmbedtls_asn1_free_named_datambedtls_test_cli_key_ec_pemmbedtls_ssl_session_freeCurl_readmbedtls_ecp_tls_write_pointmbedtls_aes_crypt_ctrlua_checkstackmbedtls_ssl_set_verifydo_locatecurlx_uitosimbedtls_rsa_self_testCurl_conncache_remove_connmbedtls_chachapoly_startsCurl_pipeline_set_site_blacklistCurl_auth_digest_get_pairmbedtls_oid_get_ec_grpmbedtls_ssl_get_verify_resultmbedtls_cipher_updatembedtls_pk_get_bitlenmbedtls_ssl_set_hostnamembedtls_x509_serial_getsmbedtls_aes_self_testmbedtls_x509_get_algmbedtls_md_hmac_startslua_gettopmbedtls_ssl_ciphersuite_uses_ecmbedtls_pk_verify_extcurl_easy_escapembedtls_oid_get_oid_by_ec_grpCurl_ssl_getsessionidCurl_set_dns_serversCurl_handler_httpmbedtls_test_srv_pwd_ecmbedtls_x509_get_sigcurl_freezip_stat_initmbedtls_x509_crt_freembedtls_md5_startsmbedtls_ssl_get_max_frag_len_zip_write8Curl_ip2addrCurl_mbedtls_session_free_zip_error_getmbedtls_pem_freembedtls_sha512_finishCurl_ipv6works_zip_cdir_writembedtls_oid_get_pkcs12_pbe_alglua_absindexmbedtls_ecdsa_sign_det_extos_rmdirmbedtls_ssl_send_alert_messageluaL_whereCurl_failflua_settoplua_getlocalmbedtls_blowfish_crypt_cbcmbedtls_ssl_setupcurl_mvsprintfmbedtls_test_cli_crt_rsa_pemmbedtls_test_cli_pwd_ec_pem_lenCurl_llist_allocmbedtls_x509_crt_profile_nextmbedtls_test_srv_crtCurl_if2ipCurl_ssl_addsessionidcurlx_uztoulmbedtls_asn1_write_tagmbedtls_hmac_drbg_write_seed_fileCurl_retry_requestmbedtls_test_ca_crt_lenzip_get_archive_flagmbedtls_rsa_pkcs1_verify_zip_get_compression_implementationmbedtls_ssl_conf_renegotiationmbedtls_des_crypt_ecblua_getstackmbedtls_entropy_initCurl_inet_ntopmbedtls_x509_key_size_helpermbedtls_mpi_copymbedtls_ecdh_make_publicCurl_urldecodembedtls_test_srv_crt_rsa_sha1_pem_lenmbedtls_mpi_is_prime_exthttp_postmbedtls_ssl_ciphersuite_from_idmbedtls_entropy_freecurl_multi_fdsetmbedtls_ecp_muladd_restartablembedtls_test_cli_crt_rsa_lenluaL_tracebackmbedtls_ecdsa_write_signaturecurl_global_cleanupmbedtls_md5_free_zip_err_typembedtls_ssl_list_ciphersuitesmbedtls_test_cli_key_rsa_derCurl_unencode_deflate_writembedtls_ssl_set_datagram_packingzip_set_archive_comment_zip_string_newCurl_auth_create_digest_md5_messagembedtls_hardclock_pollcurl_easy_getinfombedtls_ssl_conf_renegotiation_periodmbedtls_mpi_fill_randomCurl_hash_clean_with_criterium_zip_string_crc32Curl_splaymbedtls_ssl_conf_snilua_tobooleanCurl_multi_pipelining_server_blmbedtls_camellia_crypt_cbcmbedtls_timing_alarmed_zip_filerange_crcos_chmodmbedtls_hmac_drbg_set_entropy_lenmbedtls_mdmbedtls_x509_crt_verifymbedtls_ssl_check_sig_hashCurl_auth_is_digest_supportedmbedtls_test_srv_pwd_ec_pemmbedtls_test_srv_pwd_rsambedtls_aesni_crypt_ecbmbedtls_test_ca_key_rsaos_listWindowsRegistrymbedtls_sha1_initluaL_pushresultsize_zip_source_file_or_pzip_source_filep_zip_write2_zip_write4mbedtls_mpi_cmp_mpimbedtls_sha1_starts_retmbedtls_ssl_get_ciphersuite_idmbedtls_test_cli_pwd_ecCurl_protocol_connectingmbedtls_ccm_self_testmbedtls_x509_crl_parseinflateluaL_callmetambedtls_test_srv_crt_rsa_sha256_dermbedtls_test_ca_key_ec_pemCurl_ssl_cleanupmbedtls_ripemd160_initCurl_auth_decode_digest_http_messagembedtls_ecp_self_testmbedtls_sha256_infoos_islinkCurl_formpostheadermbedtls_test_cas_pemCurl_ssl_close_allmbedtls_test_ca_key_lenmbedtls_ecdsa_can_doinflateGetDictionarymbedtls_test_srv_crt_ec_lenpremake_getEmbeddedResourcescripts_pathCurl_splayinsertmbedtls_test_srv_key_ec_pem_lenmbedtls_test_ca_pwd_ec_der_lenmbedtls_ecp_gen_privkeymbedtls_x509_crt_infolua_touserdatambedtls_pkcs5_pbes2mbedtls_asn1_write_mpiluaL_setfuncsCurl_pin_peer_pubkeyCurl_strerrormbedtls_test_ca_crt_rsa_sha256Curl_auth_create_digest_http_messagembedtls_test_srv_crt_lenCurl_strcasecompareCurl_expire_latestmbedtls_x509_crl_parse_fileluaL_argerrorcurl_maprintfmbedtls_x509_crt_profile_defaultmbedtls_ctr_drbg_write_seed_filembedtls_oid_get_oid_by_sig_alg_zip_u2d_timembedtls_ecp_gen_keypair_basembedtls_md5_finishmbedtls_cipher_initsha1_writembedtls_test_ca_key_ec_lendo_pathsearchmbedtls_cipher_cryptmbedtls_test_ca_crt_rsa_lenCurl_setoptCurl_protocol_getsockCurl_open_zip_dirent_readluaL_tolstringmbedtls_test_srv_key_ec_lencurl_easy_performmbedtls_ssl_psk_derive_premastermbedtls_sha256mbedtls_ctr_drbg_set_entropy_lenlua_pushcclosurembedtls_ssl_conf_dtls_badmac_limitCurl_share_lockmbedtls_cipher_info_from_stringmbedtls_rsa_exportcurlProgressCallbackdeflate_copyrightmbedtls_mpi_add_mpimbedtls_ccm_freembedtls_test_cli_crt_rsa_pem_lenmbedtls_md_get_sizembedtls_pem_write_buffermbedtls_ssl_conf_own_certmbedtls_test_ca_key_ec_pem_lencurl_version_info_tr_tallymbedtls_test_ca_key_rsa_pem_lenos_realpathCurl_multi_closedmbedtls_md5_updatembedtls_chachapoly_auth_decryptmbedtls_sha512_freeCurl_add_bufferfCurl_closembedtls_ssl_conf_cert_profilembedtls_test_cli_pwd_rsa_lenmbedtls_ssl_prepare_handshake_recordmbedtls_test_ca_pwd_ec_lenCurl_pipeline_site_blacklistedcurl_easy_unescapebuiltin_scriptscrc32_combine64Curl_set_dns_local_ip6mbedtls_oid_get_x509_ext_typeluaL_loadbufferxmbedtls_ssl_set_bioCurl_loadhostpairsmbedtls_ssl_conf_dtls_cookiesCurl_hash_cleanCurl_output_digestCurl_getformdatambedtls_ecdsa_write_signature_restartablembedtls_ssl_optimize_checksummbedtls_aes_crypt_ofblua_closembedtls_mpi_swapCurl_free_request_statembedtls_ssl_context_loadmbedtls_aes_setkey_decmbedtls_mpi_write_filembedtls_mpi_sub_intCurl_socket_checkcanUseColorsmbedtls_ccm_star_auth_decryptCurl_set_dns_local_ip4lua_nextmbedtls_oid_get_oid_by_pk_algmbedtls_pk_signCurl_writembedtls_ssl_set_hs_own_certmbedtls_sha512_update_retmbedtls_hmac_drbg_reseedinflateResetKeeplua_tointegerxmbedtls_gcm_initmbedtls_ctr_drbg_freembedtls_rsa_publiccurl_slist_appendmbedtls_asn1_get_bool_tr_initlua_tolstring_edataCurl_fetch_addrmbedtls_pk_verifymbedtls_mpi_read_binary_ledo_mkdirmbedtls_ssl_conf_encrypt_then_macmbedtls_test_srv_pwd_rsa_lenmbedtls_oid_get_pk_algmbedtls_ccm_setkeymbedtls_ssl_buffering_freeCurl_slist_duplicatembedtls_internal_aes_decryptmbedtls_sha1debug_promptmbedtls_ecdh_read_publicmbedtls_oid_get_certificate_policiesmbedtls_ssl_handshake_stepmbedtls_test_ca_crt_ec_der_lenmbedtls_test_cli_crt_ec_pem_len_zip_string_getlua_getinfombedtls_hmac_drbg_random_with_addlua_identCurl_raw_touppermbedtls_rsa_rsaes_oaep_decryptCurl_recvpipe_headCurl_dedotdotifymbedtls_dhm_parse_dhmmbedtls_pkcs12_pbe_sha1_rc4_128Curl_multi_max_total_connectionsmbedtls_ssl_write_recordCurl_unix2addrCurl_pipeline_penalizedcurl_formfreembedtls_mpi_add_intmbedtls_md5_initos_locateinflate_copyrightCurl_chunked_strerror_zip_string_lengthos_mkdirpath_normalizembedtls_pk_check_pairmbedtls_des3_initCurl_sendpipe_headmbedtls_ecp_keypair_initdo_normalizembedtls_sha256_retCurl_pipeline_leave_readluaL_checkoptionCurl_ssl_shutdownCurl_cfreembedtls_mpi_sub_absmbedtls_gcm_auth_decryptmbedtls_mpi_sizembedtls_des_key_check_weakluaL_refCurl_digest_cleanupmbedtls_x509_get_timembedtls_test_srv_pwd_ec_lenmbedtls_rsa_alt_infombedtls_x509_crt_parse_der_with_ext_cbmbedtls_poly1305_initmbedtls_x509_crt_verify_restartablembedtls_chachapoly_finishinflateUnderminembedtls_md5_self_testlua_createtableCurl_proxyCONNECTmbedtls_ssl_check_cert_usagembedtls_ssl_write_versionmbedtls_ctr_drbg_updatecurlx_sztosimbedtls_timing_set_delaylua_versionmbedtls_test_ca_pwd_rsa_pemlua_pushvfstringmbedtls_ecp_group_loadmbedtls_low_level_strerrzip_error_get_sys_typeCurl_base64url_encodeCurl_FormInitlua_rawsetzip_source_crcmbedtls_test_srv_pwdCurl_mbedtls_initluaL_checknumbercurl_multi_info_readlua_gethookmbedtls_sha1_clonelua_xmoveCurl_unencode_gzip_writembedtls_aes_crypt_cfb8Curl_global_host_cache_initmbedtls_ssl_dtls_replay_resetdeflatePrimembedtls_poly1305_freembedtls_dhm_parse_dhmfile_zip_error_set_from_sourcembedtls_ssl_conf_endpointCurl_cmallocCurl_http_readwrite_headersmbedtls_test_ca_key_rsa_derluaL_optlstringCurl_llist_count_zip_changedmbedtls_test_srv_crt_rsa_sha256_pemmbedtls_chachapoly_initmbedtls_aes_initmbedtls_test_srv_key_lenmbedtls_arc4_setupmbedtls_test_cli_key_rsa_lenmbedtls_sha256_finishmbedtls_mpi_cmp_absCurl_hash_initCurl_hash_addluaL_optnumbermbedtls_ssl_get_input_max_frag_lenmbedtls_ecp_curve_info_from_grp_idluaL_pushresultCurl_infofCurl_ssl_versionmbedtls_entropy_add_sourcembedtls_ssl_sig_from_pk_algmbedtls_mpi_mod_mpiCurl_mbedtls_data_pendingmbedtls_net_recv_timeoutmbedtls_pk_verify_restartablembedtls_ssl_get_max_out_record_payloadmbedtls_sha512_initlua_rawgetimbedtls_net_initpath_getabsolutembedtls_test_srv_key_rsa_lenpath_join_internalCurl_memdupmbedtls_test_srv_crt_rsa_sha256_lenmbedtls_test_cli_crt_rsambedtls_mpi_write_binarymbedtls_x509_get_alg_nullmbedtls_net_sendmbedtls_ssl_conf_authmodembedtls_sha512_finish_retCurl_ssl_closeluaL_fileresultmbedtls_dhm_initcurlx_uztosimbedtls_net_recvmbedtls_entropy_update_manualCurl_mk_dnscachembedtls_ctr_drbg_self_testCurl_safereallocmbedtls_ripemd160_updatembedtls_ecp_curve_info_from_namezErrorCurl_socketmbedtls_ssl_conf_arc4_supportmbedtls_blowfish_crypt_ctrmbedtls_test_ca_pwd_lenCurl_HMAC_MD5Curl_mbedtls_connect_nonblockingmbedtls_test_ca_crt_rsambedtls_x509_crt_parsembedtls_ripemd160_self_testcurl_multi_remove_handlembedtls_ssl_conf_export_keys_ext_cb_tr_flush_blockmbedtls_ssl_config_defaultsmbedtls_mpi_lt_mpi_ctmbedtls_rsa_export_rawdo_absolutetypembedtls_x509_crl_parse_dermbedtls_ssl_read_versiondeflateResetmbedtls_ssl_session_reset_int_zip_get_encryption_implementationCurl_compareheadermbedtls_oid_get_extended_key_usageCurl_parsenetrcmbedtls_test_cli_crt_lenluaL_registermbedtls_ssl_conf_min_versionlua_setlocalbuffer_printfmbedtls_ripemd160_startsmbedtls_ccm_star_encrypt_and_tagmbedtls_ecdsa_infombedtls_pk_encryptluaL_openlibsmbedtls_x509_crt_verify_infombedtls_des_key_check_key_paritymbedtls_ecp_point_read_stringmbedtls_md_hmac_updateCurl_connecthostcurl_formgetmbedtls_ssl_set_client_transport_idmbedtls_ripemd160_starts_retcurlx_uztosoos_compileCurl_multi_content_length_penalty_sizelua_mainmbedtls_ecdh_can_doCurl_checkheadersmbedtls_x509_crt_check_key_usagembedtls_arc4_self_testluaopen_debugCurl_pretransferCurl_ssl_delsessionid_zip_error_clearmbedtls_sha256_update_retmbedtls_md5_processadler32_combinezip_stat_indexlua_setfieldmbedtls_chachapoly_update_aadlua_gcmbedtls_timing_hardclockmbedtls_x509_crt_is_revokedmbedtls_test_cli_key_ecmbedtls_ecp_set_zerombedtls_ssl_get_alpn_protocolmbedtls_rsa_set_paddingmbedtls_oid_get_sig_alg_descmbedtls_test_ca_crt_ec_pemcriteria_compilembedtls_ssl_resend_hello_requestmbedtls_asn1_write_enum_tr_stored_blockmbedtls_ecdh_freestring_hashCurl_wildcard_dtor_zip_dirent_initmbedtls_sha256_starts_retlua_pushintegermbedtls_poly1305_self_testmbedtls_ecdsa_freembedtls_ssl_conf_cert_req_ca_listmbedtls_chachapoly_updatembedtls_ssl_conf_dh_param_ctxCurl_hostcache_prunembedtls_rsa_deduce_crtmbedtls_internal_sha1_processmbedtls_cipher_definitionsCurl_strntouppermbedtls_test_ca_crt_ec_dermbedtls_mpi_init_zip_string_freeinflateMarkmbedtls_test_ca_crt_rsa_sha1mbedtls_debug_print_crtzip_source_layeredCurl_multi_handleCurl_llist_removeadler32_combine64mbedtls_ssl_conf_dh_paramCurl_readrewind_zip_cdir_growmbedtls_net_usleepmbedtls_blowfish_initluaopen_mathmbedtls_ssl_ciphersuite_from_stringCurl_conncache_find_first_connectionmbedtls_net_bindmbedtls_des3_crypt_ecbmbedtls_test_srv_pwd_rsa_der_lenmbedtls_ssl_conf_session_ticketsmbedtls_test_srv_pwd_rsa_pemCurl_httpmbedtls_ecdh_setup_zip_openmbedtls_des3_set2key_encCurl_send_plainCurl_SOCKS4os_writefile_ifnotequalmbedtls_sha512_startslua_isnumbermbedtls_mpi_shrinkCurl_version_initmbedtls_test_srv_crt_rsa_sha1mbedtls_ctr_drbg_update_seed_fileCurl_getconnectinfombedtls_ecp_is_zerombedtls_dhm_self_testmbedtls_x509_get_serialmbedtls_rsa_infombedtls_ecp_read_keymbedtls_cipher_listmbedtls_pk_write_pubkey_pemmbedtls_entropy_gatherCurl_auth_build_spnmbedtls_chacha20_freelua_pushthreadCurl_connected_proxy_zip_dirent_sizeluaL_getsubtablembedtls_test_srv_key_ec_der_zip_ef_parsembedtls_mpi_write_binary_lembedtls_des_setkey_zip_dirent_newCurl_share_unlockmbedtls_test_cas_pem_lenmbedtls_test_ca_pwd_rsa_lenmbedtls_ssl_update_out_pointersCurl_client_chop_write_zip_dirent_torrent_normalizembedtls_ecdh_compute_sharedluaopen_stringmbedtls_camellia_self_testCurl_crealloc_zip_dirent_writeCurl_setup_transfermbedtls_asn1_free_named_data_listdo_getcwdmbedtls_md5_starts_retmbedtls_sha512_retmbedtls_pkcs12_derivationmbedtls_asn1_write_bitstringmbedtls_ecdh_calc_secretmbedtls_test_ca_pwd_rsa_der_lenCurl_cookie_clearsessmbedtls_ecdsa_from_keypairmbedtls_test_cli_key_ec_pem_lenmbedtls_x509_time_is_futurembedtls_mpi_div_intcurl_formaddluaL_checklstringCurl_pgrsUpdatembedtls_rsa_validate_crtCurl_initinfombedtls_ctr_drbg_randomCurl_closesocketmbedtls_ssl_conf_handshake_timeoutcurlx_sitouzmbedtls_ssl_close_notifycurl_escapecriteria_deleteCurl_ssl_false_startCurl_multi_connchangedmbedtls_ssl_set_hs_ca_chain_zip_ef_delete_by_idCurl_conncache_initdeflateInit2_mbedtls_x509_crt_parse_pathmbedtls_rsa_rsassa_pss_signCurl_ssl_initpath_absolutetypembedtls_ssl_conf_ciphersuitesmbedtls_pk_parse_public_keybuffered_newCurl_tcpnodelaymbedtls_sha256_cloneCurl_MD5_updatembedtls_ssl_flush_outputCurl_httpchunk_initmbedtls_net_connectmbedtls_ripemd160_update_retmbedtls_cipher_update_admbedtls_ctr_drbg_reseedCurl_pgrsLimitWaitTimembedtls_asn1_get_bitstringmbedtls_ripemd160Curl_hash_strmbedtls_internal_md5_processpremake_locate_executablembedtls_sha1_retmbedtls_des3_set3key_decdo_path_has_deferred_joinmbedtls_blowfish_crypt_cfb64mbedtls_md_init_ctx_zip_ef_newcurlx_uitoucmbedtls_sha1_update_retmbedtls_ssl_handshake_wrapup_free_hs_transformCurl_ssl_set_engine_defaultmbedtls_des3_set3key_enclua_setallocfCurl_pgrsSetUploadSizembedtls_x509_get_extmbedtls_ecp_muladdmbedtls_x509_time_is_pastlua_pushvaluedeflateParamslua_pushfstringCurl_ipvalidmbedtls_ctr_drbg_set_nonce_lenluaL_prepbuffsizembedtls_version_get_stringbuffered_closembedtls_des3_crypt_cbczip_source_closelua_tonumberxCurl_pipeline_checkget_readmbedtls_cipher_freembedtls_test_ca_crt_eclua_gettablembedtls_aes_crypt_cfb128mbedtls_ssl_reset_checksumlua_setimbedtls_ccm_encrypt_and_tagmbedtls_aes_crypt_xtscurl_strnequalcurl_multi_initmbedtls_test_cli_crt_ec_lenmbedtls_pk_parse_public_keyfilembedtls_pk_info_from_typembedtls_test_cli_pwd_ec_pemmbedtls_test_srv_key_rsa_pemmbedtls_test_cli_pwdmbedtls_x509_crl_freelua_setglobalzip_source_functionmbedtls_camellia_setkey_decpath_getrelativembedtls_asn1_write_octet_stringmbedtls_cipher_write_tagmbedtls_ssl_session_save__data_startCurl_posttransfermbedtls_ssl_flight_transmitmbedtls_ssl_set_sessioncurl_multi_add_handlembedtls_ccm_initmbedtls_md5_retmbedtls_md_get_typembedtls_test_srv_crt_ec_pem_lendeflateSetHeaderpath_joinmbedtls_ecdh_make_paramsmbedtls_ssl_reset_in_out_pointersmbedtls_ssl_get_versionos_matchnamedeflateInit_mbedtls_camellia_crypt_ecbluaL_newstateCurl_followcriteria_matchesmbedtls_poly1305_startsmbedtls_ssl_conf_renegotiation_enforcedzcfree_zip_dirent_clonepath_isabsoluteCurl_ssl_backendCurl_expirembedtls_rsa_rsassa_pss_verifymbedtls_chacha20_self_testmbedtls_test_srv_crt_rsa_sha1_pemCurl_mbedtls_versionmbedtls_chachapoly_self_testmbedtls_md_finishCurl_init_userdefinedcurl_multi_performCurl_multi_chunk_length_penalty_sizembedtls_test_ca_crt_rsa_sha256_pem_lenlua_loadCurl_cookie_freelistmbedtls_ssl_dtls_replay_check_zip_error_copylua_newuserdata_length_codeCurl_ssl_initsessionscurlCleanupos_hostmbedtls_asn1_write_boolmbedtls_cipher_setkeymbedtls_rsa_get_lenmbedtls_sha256_freeluaL_checkintegerlua_setmetatablembedtls_ecp_group_initmbedtls_pk_decryptzip_source_bufferCurl_pgrsStartNowcurl_share_setoptmbedtls_test_ca_key_rsa_pemCurl_doing_getsockmbedtls_ecp_copymbedtls_x509_crt_parse_filecurl_share_cleanuporiginal_luaL_loadfilexmbedtls_test_cli_pwd_rsa_pemCurl_multi_max_host_connectionsmbedtls_cipher_auth_decrypt_extlua_rawsetimbedtls_test_cli_crt_rsa_der_lenmbedtls_sha256_initmbedtls_ssl_initmbedtls_des_setkey_encpath_translateCurl_ssl_sessionid_lockmbedtls_debug_print_bufzip_file_get_external_attributesmbedtls_md5_infocurl_strequalmbedtls_ripemd160_freedo_isfilembedtls_ecp_group_copymbedtls_ripemd160_infozip_fopen_index_encryptedmbedtls_test_ca_crt_rsa_sha1_pem_lenmbedtls_ssl_ciphersuite_uses_psklua_setuservalueCurl_add_buffer_freembedtls_platform_entropy_polldo_getabsolutembedtls_high_level_strerrCurl_disconnectmbedtls_sha256_finish_retluaopen_coroutinembedtls_rsa_export_crtdo_isabsolutembedtls_ssl_parse_certificatembedtls_asn1_write_printable_stringmbedtls_ecp_tls_read_group_idmbedtls_rsa_check_pub_privmbedtls_mpi_safe_cond_swapmbedtls_mpi_div_mpimbedtls_x509_self_testmbedtls_md_updatembedtls_ecp_keypair_freeCurl_cookie_add_zip_err_strmbedtls_asn1_get_enumCurl_pgrsTimezip_archive_set_tempdirmbedtls_dhm_make_publicCurl_fileinfo_allocmbedtls_md_freeCurl_fileinfo_dtormbedtls_ssl_get_session_pointercurl_easy_resetcurlx_ultosimbedtls_entropy_funcmbedtls_mpi_shift_rmbedtls_asn1_get_alg_nullCurl_pgrsSetDownloadCounteros_matchnextCurl_add_buffer_sendmbedtls_ecdsa_signmbedtls_mpi_shift_llua_dumpCurl_verboseconnectmbedtls_mpi_set_bitlua_newstatembedtls_test_srv_key_rsa_der_zip_ef_mergecurlWriteCallbackmbedtls_ssl_conf_transportcurl_global_init_memmbedtls_pk_setup_rsa_altmbedtls_ssl_handshake_freembedtls_des_crypt_cbcdo_hashCurl_hostcache_cleanstring_endswithmbedtls_test_casos_matchisfile_IO_stdin_usedCurl_printable_addressmbedtls_cipher_setupmbedtls_oid_get_sig_algmbedtls_aesni_gcm_multmbedtls_cipher_info_from_valuesinflateSyncPointzip_closeCurl_if_is_interface_namecurlx_sltosizip_source_windowsha1_padmbedtls_mpi_cmp_intmbedtls_ssl_conf_ciphersuites_for_versioninflateEndmbedtls_blowfish_crypt_ecbinflate_fastlua_getupvaluembedtls_pk_parse_keyfilelua_getglobalmbedtls_ecdsa_write_signature_detzip_source_readmbedtls_hmac_drbg_update_retmbedtls_ecp_check_pub_privmbedtls_internal_aes_encryptCurl_base64_encodembedtls_md_get_name_zip_file_get_offsetmbedtls_ssl_set_calc_verify_mdCurl_getaddrinfombedtls_ssl_handshake_wrapupmbedtls_internal_sha512_processmbedtls_ecp_get_typembedtls_mpi_self_testmbedtls_pk_sign_restartablembedtls_aes_crypt_ecbmbedtls_mpi_gen_primesha1_addUncountedmbedtls_version_get_string_fullcurl_easy_duphandlezip_discardmbedtls_x509_get_sig_algCurl_ipv6_scopembedtls_test_cli_key_len_zip_ef_writembedtls_ripemd160_processmbedtls_test_cli_crt_ecmbedtls_cipher_finishcurl_multi_setoptlua_pushnumberCurl_protocol_connectmbedtls_ssl_set_hs_pskmbedtls_ecp_point_read_binarymbedtls_x509_get_rsassa_pss_paramsmbedtls_ecp_point_freelua_len_zip_cdir_freembedtls_strerrorcurlx_nonblocklua_settablecurlx_tvdiff_secsmbedtls_aes_xts_setkey_decmbedtls_internal_sha256_processmbedtls_ctr_drbg_initmbedtls_des_setkey_decos_uuidmbedtls_test_srv_key_ec_pemzip_source_pkwareinflateSetDictionarymbedtls_test_cli_key_ec_der_lenCurl_pgrsSetUploadCounterzip_source_freembedtls_asn1_write_tagged_stringCurl_dupsetadler32mbedtls_cipher_check_tagmbedtls_rsa_freembedtls_test_cli_key_rsa_der_lenCurl_ssl_connectmbedtls_asn1_get_bitstring_nullCurl_hash_deletembedtls_ssl_conf_cbc_record_splittingmbedtls_pk_write_pubkeyCurl_ssl_getsocklua_pushbooleandeflateBoundlua_topointermbedtls_ctr_drbg_seedCurl_add_buffermbedtls_timing_self_testmbedtls_test_cli_key_ec_dermbedtls_ssl_write_change_cipher_specCurl_MD5_init_zip_ef_remove_internalzip_get_num_entriesmbedtls_ripemd160_finishmbedtls_sha1_freecurlx_uztouiCurl_mbedtls_close_allmbedtls_rsa_completeos_getversionluaL_optintegerluaL_checkstackCurl_pipeline_server_blacklistedCurl_cache_addrmbedtls_ssl_write_handshake_msgos_getpassCurl_proxy_connectcurl_multi_waitmbedtls_md_hmac_resetmbedtls_test_ca_key_ec_der_lenmbedtls_ecp_check_pubkeydo_translateCurl_timeleftmbedtls_pk_debugmbedtls_mpi_lset__libc_csu_initluaL_testudatambedtls_dhm_calc_secretmbedtls_test_srv_crt_rsa_sha256_pem_lenmbedtls_aes_setkey_encmbedtls_asn1_get_tagmbedtls_pk_setupCurl_splaygetbestmbedtls_des3_set2key_decCurl_mbedtls_cleanup_zip_read8lua_atpanicmbedtls_ecdh_get_paramsCurl_copy_header_valuembedtls_poly1305_updatembedtls_ecdsa_verifymbedtls_test_ca_key_rsa_lenmbedtls_x509_get_namembedtls_entropy_update_seed_filembedtls_des3_freeCurl_hash_start_iteratembedtls_ssl_write_finishedpath_resolve_deferred_joinluaL_buffinitsizezip_extractmbedtls_ripemd160_clonembedtls_gcm_crypt_and_tagmbedtls_entropy_write_seed_filembedtls_internal_ripemd160_processinflateGetHeaderluaL_checktypelua_stringtonumbermbedtls_debug_printf_ecdhmbedtls_ssl_read_zip_guess_encodingcurl_global_initlua_pushlightuserdata_zip_get_direntmbedtls_ssl_session_copysha1_rol32mbedtls_ssl_transform_freeCurl_auth_user_contains_domainlua_getallocfmbedtls_sha384_infocurlx_ultoucmbedtls_test_ca_keymbedtls_ssl_conf_truncated_hmacluaL_checkudataCurl_conncontrolmbedtls_ecp_point_initmbedtls_oid_get_attr_short_namelua_isyieldablembedtls_ecp_tls_read_pointCurl_http_input_authmbedtls_test_srv_pwd_ec_der_lenmbedtls_pem_initmbedtls_oid_get_cipher_algmbedtls_ssl_update_handshake_statusmbedtls_cipher_set_ivmbedtls_ssl_conf_psk_cbCurl_cookie_getlistmbedtls_pem_read_buffermbedtls_chachapoly_freecurl_easy_sendmbedtls_md5_zip_error_initmbedtls_test_ca_key_ecmbedtls_set_alarm_endCurl_pgrsResetTimesSizesCurl_multi_pipelining_site_blmbedtls_test_ca_crt_ec_pem_lenos_comparefilesinflatePrimeCurl_conncache_add_connmbedtls_test_cli_pwd_ec_lenmbedtls_cipher_auth_decryptCurl_multi_handlePipeBreak_zip_read4mbedtls_ecdsa_genkey_zip_unchange_datambedtls_test_cas_der_lencurl_easy_init_zip_read2lua_getuservaluembedtls_test_srv_crt_rsa_sha1_dermbedtls_ssl_conf_fallbackos_pathsearchmbedtls_blowfish_freelua_rawgetCurl_mbedtls_closeCurl_free_primary_ssl_configluaL_gsubCurl_recv_plainmbedtls_x509_crl_initCurl_monthcurl_multi_socket_zip_ef_sizembedtls_oid_get_numeric_stringmbedtls_net_pollmbedtls_pk_write_key_derCurl_MD5_finalmbedtls_rsa_copyCurl_unencode_cleanupmbedtls_mpi_exp_modlua_rotateCurl_add_buffer_initCurl_ssl_data_pendingCurl_conncache_find_bundlembedtls_pkcs12_pbembedtls_ctr_drbg_set_prediction_resistanceCurl_mbedtls_randommbedtls_test_srv_crt_ec_derstring_sha1mbedtls_sha512_clonembedtls_ssl_conf_pskmbedtls_sha512_infoCurl_pgrsSetDownloadSizecurlx_ultousmbedtls_mpi_get_bitmbedtls_aesni_inverse_key_zip_ef_get_by_idmbedtls_ssl_config_initsha1_resultCurl_str_key_comparembedtls_ssl_get_bytes_availlua_copylua_pushlstringmbedtls_aes_xts_freembedtls_gcm_freembedtls_test_cas_derdeflateEndmbedtls_cipher_auth_encrypt_extlua_iscfunctionmbedtls_asn1_get_intmbedtls_rsa_rsassa_pkcs1_v15_verifycurl_easy_strerrormbedtls_md_hmacmbedtls_ecdh_initluaL_addstringmbedtls_test_ca_crt_rsa_sha256_lenmbedtls_test_srv_keyCurl_hash_pickmbedtls_net_freeCurl_checkProxyheadersmbedtls_aes_xts_initcurl_msnprintfos_copyfilembedtls_cipher_info_from_typembedtls_ssl_get_sessionbuffer_putsmbedtls_test_ca_pwdpremake_find_embedded_scriptmbedtls_test_srv_crt_rsambedtls_cipher_auth_encrypt_zip_read_data_zip_source_newmbedtls_x509_crt_check_extended_key_usageCurl_llist_destroysha1_writebytecurl_getenvCurl_removeHandleFromPipelinembedtls_test_ca_key_ec_dermbedtls_ssl_start_renegotiationluaL_checkanymbedtls_mpi_read_stringmbedtls_ecp_grp_id_listlua_yieldkCurl_base64_decodembedtls_x509_crt_profile_frmbedtls_pk_can_dohttp_downloadCurl_updateconninfo_zip_mkstempCurl_pipeline_wantedlua_newthreadCurl_input_digestmbedtls_ecp_write_keymbedtls_ssl_hash_from_md_algmbedtls_x509_sig_alg_getszip_source_openmbedtls_mpi_write_stringmbedtls_pkcs5_pbkdf2_hmacmbedtls_debug_set_thresholdmbedtls_pk_initlua_rawequalcurl_msprintfmbedtls_ssl_parse_change_cipher_specmbedtls_md5_finish_retmbedtls_asn1_write_algorithm_identifierinflateCopymbedtls_rsa_pkcs1_encryptbuffered_writeln__bss_startos_isdirCurl_conncache_foreachmbedtls_ctr_drbg_set_reseed_intervalcurl_easy_pausembedtls_ssl_set_mtuos_is64bitmbedtls_rsa_rsassa_pkcs1_v15_signCurl_ssl_config_matcheslua_callkmbedtls_mpi_growmbedtls_chachapoly_encrypt_and_taglua_errormbedtls_ecp_mul_restartablembedtls_des_freeos_matchdonepremake_load_embedded_scriptterm_doSetTextColormbedtls_test_srv_pwd_rsa_pem_lenCurl_meets_timeconditionmbedtls_aesni_setkey_enc_zip_string_writembedtls_chacha20_updateCurl_conn_data_pendingmbedtls_oid_get_oid_by_mdmbedtls_hmac_drbg_self_testmbedtls_aes_decryptmbedtls_eckey_infombedtls_pkcs5_self_testmbedtls_mpi_mul_mpimbedtls_asn1_write_oidCurl_set_dns_interfacembedtls_asn1_write_intmbedtls_x509_crt_parse_derpremake_initmbedtls_base64_decodembedtls_ssl_conf_dtls_anti_replayinflateInit_zip_source_deflateCurl_wait_msCurl_http_setup_connmbedtls_ssl_config_freeluaL_addlstringzip_fcloseluaL_getmetafieldmbedtls_ssl_fetch_inputlua_rawlenCurl_ssl_free_certinfoCurl_cookie_initmbedtls_cipher_supportedmbedtls_aes_crypt_cbcmbedtls_ecp_group_freeCurl_cstrdupmbedtls_ecdsa_initCurl_flush_cookiesmbedtls_md_filedeflatePendingmbedtls_md5_update_retmbedtls_des_key_set_paritymbedtls_rsa_import_rawCurl_sendfmbedtls_x509_crt_parse_der_nocopylua_sethookmbedtls_ssl_write_certificatembedtls_ecdh_gen_publicluaopen_utf8mbedtls_oid_get_md_hmacmbedtls_test_srv_crt_rsa_sha1_der_lendeflateCopymbedtls_sha1_finishmbedtls_md_setupmbedtls_x509_parse_subject_alt_namembedtls_test_ca_crt_rsa_sha256_pemmbedtls_x509_dn_getsmbedtls_ecp_gen_keyinflate_tablembedtls_sha1_infombedtls_ecp_gen_keypairmbedtls_rsa_initlua_tothreadmbedtls_mpi_lsb_zip_nerr_strcurl_mprintfmbedtls_version_get_numberCurl_ssl_push_certinfombedtls_ssl_update_in_pointerscurl_share_strerrormbedtls_debug_print_ecpmbedtls_base64_self_testmbedtls_ssl_parse_finished_zip_cdir_newmbedtls_dhm_set_groupmbedtls_test_ca_crt_rsa_sha256_der_lenmbedtls_ssl_conf_rng_zip_read_local_efmbedtls_test_cli_key_rsa_pem_lenCurl_getinfoluaopen_oscurl_share_initmbedtls_oid_get_md_algmbedtls_sha1_updatembedtls_ssl_recv_flight_completedCurl_pipeline_checkget_writebuffered_tostringmbedtls_ssl_conf_max_versionmbedtls_md_info_from_typembedtls_ssl_get_output_max_frag_lenCurl_ssl_md5summbedtls_cipher_resetmbedtls_pk_freecrc32_combinembedtls_ecdsa_read_signature_restartableluaL_checkversion_mbedtls_ssl_set_timerCurl_setup_conncurl_multi_assignlua_typenameCurl_ssl_kill_sessionmbedtls_rsa_deduce_private_exponentmbedtls_mpi_safe_cond_assignregisterModulesCurl_getoff_all_pipelinesmbedtls_sha1_self_testmbedtls_hmac_drbg_set_reseed_intervalCurl_llist_insert_nextcurlx_sltousCurl_mbedtls_connectmbedtls_ecp_point_write_binaryluaL_errorcurl_mfprintfCurl_pollmbedtls_pk_get_typecurlx_uztoszlua_rawgetpcurl_mvfprintfmbedtls_poly1305_finishmbedtls_ssl_set_hs_authmodecurl_versionCurl_gmtimembedtls_x509_crt_verify_with_profilelua_isuserdatambedtls_test_cli_crtcurl_unescapembedtls_ecdsa_sign_detCurl_he2aimbedtls_blowfish_setkeymbedtls_net_closembedtls_test_ca_pwd_ec_pemCurl_single_getsockmbedtls_dhm_make_paramsmbedtls_mpi_gcdcurlx_tvdiffcurl_slist_free_allmbedtls_ssl_handshake_server_steplua_tocfunctionmbedtls_test_srv_crt_ec_pemcurlx_sltouimbedtls_test_ca_pwd_ecmbedtls_test_cli_pwd_rsacurlx_uitous_zip_source_zip_newmbedtls_ssl_renegotiateCurl_cookie_clearallmbedtls_dhm_read_paramsmbedtls_ssl_handshake_client_stepos_matchstartCurl_llist_moveCurl_http_output_authos_touchfileluaopen_packageCurl_ssl_check_cxnmbedtls_hmac_drbg_initmbedtls_dhm_read_publicCurl_freeaddrinfoCurl_connalive_zip_dirent_needs_zip64mbedtls_asn1_get_algCurl_add_custom_headersmbedtls_test_srv_pwd_lenCurl_hash_next_elementmbedtls_rsa_check_privkeymbedtls_debug_print_retmbedtls_sha512buffer_destroy_zip_dirent_finalizeCurl_splayremovebyaddrmbedtls_chacha20_cryptcurlRequestmbedtls_ssl_conf_session_tickets_cbmbedtls_test_srv_key_ec_der_lenlua_pushnilCurl_http_auth_actmbedtls_ssl_context_savembedtls_ssl_check_pendinginflateInit2_http_getmbedtls_asn1_traverse_sequence_ofmbedtls_ssl_flight_freembedtls_md_clonembedtls_ssl_conf_verifymbedtls_arc4_cryptpremake_executepath_wildcardsmbedtls_chacha20_setkeypremake_test_filembedtls_asn1_write_utf8_stringmbedtls_test_srv_crt_rsa_sha256zcallocluaL_loadstringmbedtls_rsa_rsaes_pkcs1_v15_encryptmbedtls_gcm_updatembedtls_entropy_self_testcurl_jmpenvzip_freadmbedtls_test_srv_pwd_ec_pem_lenmbedtls_test_srv_key_rsa_der_lenluaopen_tableCurl_fillreadbuffermbedtls_mpi_read_filecurl_multi_cleanupmbedtls_ssl_read_recordcurl_multi_timeoutmbedtls_arc4_freeCurl_global_host_cache_dtor_tr_alignCurl_wkdaymbedtls_hmac_drbg_updateCurl_auth_digest_cleanupmbedtls_test_cli_key_rsambedtls_hmac_drbg_seedmbedtls_mpi_sub_mpimbedtls_camellia_initmbedtls_asn1_store_named_datambedtls_test_ca_pwd_rsa_pem_lenCurl_getaddrinfo_exmbedtls_test_cli_key_rsa_pemterm_doGetTextColormbedtls_test_ca_crt_rsa_sha1_pemmbedtls_ssl_conf_extended_master_secretmbedtls_md_processmbedtls_test_cli_key_ec_lenmbedtls_ssl_sig_from_pkmbedtls_ssl_check_recordCurl_cookie_loadfilesmbedtls_camellia_freembedtls_ssl_session_loadlua_upvaluejoinmbedtls_test_ca_crt_rsa_sha1_dermbedtls_test_cli_crt_rsa_derCurl_ssl_randommbedtls_dhm_freembedtls_test_cli_pwd_lenmbedtls_chachapoly_setkeymbedtls_asn1_write_nullmbedtls_ssl_get_key_exchange_md_ssl_tlsmbedtls_md_startsprintLastErrormbedtls_debug_print_msgCurl_safe_strcasecompareCurl_wildcard_initmbedtls_rsa_pkcs1_decryptmbedtls_ssl_get_ciphersuiteCurl_pipeline_leave_writembedtls_ssl_get_key_exchange_md_tls1_2mbedtls_aes_encryptCurl_write_plainmbedtls_ssl_conf_ca_chaincurl_mvprintfmbedtls_asn1_write_named_bitstringCurl_multi_process_pending_handles_zip_poke8mbedtls_ripemd160_finish_retmbedtls_ssl_get_record_expansionCurl_ssl_cert_status_requestmbedtls_ssl_derive_keysmbedtls_ssl_writembedtls_ctr_drbg_random_with_addmbedtls_ssl_check_curvembedtls_ssl_dtls_replay_updatepath_join_singleCurl_http_connectCurl_cookie_listbuffered_writembedtls_test_srv_crt_rsa_lenmbedtls_ecp_check_privkeyCurl_ack_eintr_zip_dirent_free_zip_ef_clonembedtls_test_ca_key_rsa_der_lenmbedtls_ssl_tls_prfmbedtls_camellia_setkey_encluaL_addvalueCurl_move_handle_from_send_to_recv_pipembedtls_md_info_from_stringCurl_http_donembedtls_asn1_find_named_datambedtls_sha256_startsCurl_slist_append_nodupmbedtls_ssl_conf_sig_hashesos_getWindowsRegistrymbedtls_md_hmac_finishCurl_ssl_init_certinfombedtls_camellia_crypt_ctrmbedtls_ssl_get_ciphersuite_sig_algcurlx_tvnowmbedtls_ssl_transform_initmbedtls_mpi_inv_modmbedtls_sha224_infombedtls_ssl_encrypt_bufmbedtls_ctr_drbg_update_retmbedtls_ssl_send_fatal_handshake_failurelua_concatmbedtls_test_cli_crt_ec_der_lenmbedtls_test_srv_key_rsaluaL_setmetatablembedtls_rsa_deduce_primesmbedtls_timing_get_delayinflateResetmbedtls_test_ca_pwd_rsambedtls_rsa_rsaes_pkcs1_v15_decryptmbedtls_des_initCurl_SOCKS5mbedtls_test_srv_key_rsa_pem_lenCurl_blockread_allzlibVersionluaopen_baseCurl_formclean_zip_ef_freembedtls_ssl_get_peer_certmbedtls_test_cli_pwd_rsa_pem_lenCurl_freesetCurl_init_CONNECTmbedtls_rsa_importCurl_add_timeconditioncurl_multi_socket_allmbedtls_gcm_startsmbedtls_x509_crt_initmbedtls_chacha20_initcurl_mvsnprintfmbedtls_hmac_drbg_update_seed_filecurl_multi_socket_actioncurl_mvaprintfzip_fopen_indexmbedtls_ssl_session_resetz_errmsgCurl_recv_has_postponed_datambedtls_sha1_startsmbedtls_aes_xts_setkey_encmbedtls_pk_get_nameCurl_protocol_doingmbedtls_test_ca_pwd_ec_pem_lenmbedtls_ssl_handle_message_typembedtls_ssl_decrypt_bufcurl_easy_setoptmbedtls_md5_clonembedtls_rsa_privatembedtls_ecp_curve_info_from_tls_idcurl_getdatembedtls_asn1_write_raw_bufferCurl_handler_https_zip_memdupstring_startswithmbedtls_gcm_finishCurl_init_dombedtls_gcm_setkeylua_typepremake_pcallmbedtls_ssl_conf_legacy_renegotiationluaL_lendeflateResetKeep_zip_entry_initCurl_resolv_timeoutCurl_ssl_connect_nonblockingmbedtls_test_cli_crt_ec_derinflateReset2mbedtls_hmac_drbg_randommbedtls_asn1_get_lenmbedtls_sha1_finish_retCurl_client_writelua_statusmbedtls_ccm_auth_decryptmbedtls_hmac_drbg_freezip_source_statmbedtls_rsa_rsassa_pss_verify_extlua_upvalueidmbedtls_test_srv_crt_rsa_sha256_der_lenluaL_execresultCurl_resolv_unlockmbedtls_ecp_point_cmpmbedtls_platform_zeroizembedtls_asn1_write_ia5_stringmbedtls_sha256_processmbedtls_test_ca_crt_rsa_sha1_der_lenmbedtls_ssl_freeCurl_debugCurl_randCurl_conncache_destroy_dist_codecurl_multi_strerrorCurl_multi_add_performdo_chdirCurl_hash_destroyCurl_readwritembedtls_base64_encodeluaL_newmetatablembedtls_test_srv_crt_rsa_sha1_lenmbedtls_mpi_read_binarymbedtls_pk_write_pubkey_dermbedtls_aesni_has_supportterm_getTextColormbedtls_md_listmbedtls_net_acceptpath_deferred_joinCurl_md5itCurl_tvlongmbedtls_chacha20_startsmbedtls_test_ca_crt_rsa_sha256_dermbedtls_x509_crt_profile_suitebCurl_ssl_push_certinfo_len_zip_cp437_to_utf8_zip_get_namembedtls_hmac_drbg_seed_bufmbedtls_mpi_mul_intmbedtls_test_cas_lenmbedtls_ssl_sig_hash_set_addmbedtls_pk_parse_keyCurl_cookie_cleanuplua_resumecurl_easy_cleanupluaL_unreflua_arithmbedtls_x509_crl_infocurl_easy_recvmbedtls_pk_load_fileCurl_resolvCurl_strncasecomparelua_comparembedtls_rsa_check_pubkeymbedtls_ssl_handshakembedtls_mpi_freelua_pushstringmbedtls_asn1_get_sequence_ofluaL_buffinitmbedtls_ssl_set_timer_cbmbedtls_test_ca_crt_rsa_sha1_lenmbedtls_ssl_conf_alpn_protocolsmbedtls_rsa_validate_paramsCurl_persistconninfombedtls_test_srv_key_ecmbedtls_net_set_blockmbedtls_camellia_crypt_cfb128lua_getmetatablembedtls_mpi_add_absmbedtls_ssl_conf_dh_param_binterm_setTextColormbedtls_ssl_session_init_zip_string_equalmbedtls_mpi_bitlenmbedtls_ssl_conf_dhm_min_bitlenmbedtls_asn1_sequence_freembedtls_ssl_get_ciphersuite_nameCurl_is_connecteddeflateSetDictionarymbedtls_test_srv_crt_ecmbedtls_ssl_md_alg_from_hashmbedtls_sha256_updatezlibCompileFlagsCurl_speedcheckmbedtls_debug_print_mpiCurl_oldest_idle_connection_zip_poke4mbedtls_ssl_resendlua_gethookcountlua_setupvalue_zip_error_finimbedtls_test_ca_crt_ec_lenlua_getimbedtls_sha512_starts_retCurl_num_addresses_tr_flush_bitsCurl_ssl_sessionid_unlockCurl_ssl_engines_list_zip_error_setmbedtls_asn1_write_lenmbedtls_sha256_self_testmbedtls_des_self_testcurlx_sotouzCurl_speedinitinflateSyncmbedtls_sha1_processmbedtls_ssl_conf_export_keys_cbCurl_ccallocmbedtls_mpi_is_primembedtls_ssl_conf_max_frag_lenmbedtls_ssl_send_flight_completedCurl_add_handle_to_pipelineCurl_expire_clearmbedtls_ecp_tls_read_groupmbedtls_rsa_rsaes_oaep_encryptlua_getfieldmbedtls_ssl_sig_hash_set_findCurl_pgrsDonembedtls_ripemd160_retmbedtls_ssl_get_current_mtumbedtls_test_cli_keydeflateTunezip_source_popmbedtls_rsa_gen_keymbedtls_timing_get_timeros_getcwdmbedtls_ssl_check_timermbedtls_ssl_pk_alg_from_sigmbedtls_test_srv_crt_ec_der_lenlua_pcallklua_rawsetpmbedtls_ecp_mul_zip_entry_finalizembedtls_ssl_conf_dbgCurl_DIGEST_MD5Curl_ssl_set_enginembedtls_net_set_nonblockmbedtls_ssl_get_ciphersuite_sig_pk_algmbedtls_ecdh_read_paramsos_isfilembedtls_hmac_drbg_set_prediction_resistancelua_gethookmaskCurl_httpchunk_readmbedtls_ecp_tls_write_groupmbedtls_ssl_sig_hash_set_const_hashos_chdirmbedtls_gcm_self_testCurl_read_plainmbedtls_eckeydh_infombedtls_pk_write_key_pemmbedtls_ssl_conf_read_timeoutmbedtls_mpi_mod_intmbedtls_poly1305_macmbedtls_ecp_curve_listmbedtls_md_initmbedtls_platform_gmtime_rsha1_hashBlockzip_source_errorCurl_str2addrluaL_requireflua_isintegermbedtls_test_cli_crt_ec_pemmbedtls_sha512_self_testCurl_FormReadermbedtls_aes_freembedtls_asn1_get_mpimbedtls_arc4_initmbedtls_pk_parse_subpubkeyCurl_memrchrmbedtls_test_ca_crtmbedtls_ssl_conf_session_cachelua_isstringmbedtls_ssl_conf_curvesCurl_clone_primary_ssl_configmbedtls_rsa_pkcs1_signGLIBC_2.2.5GLIBC_2.11GLIBC_2.7GLIBC_2.14GLIBC_2.16GLIBC_2.15GLIBC_2.4GLIBC_2.3.4GLIBC_2.3        ui | ui |  ii  ii ui |ti ȕii ԕ.A0b.Aa .A(.A@.AӡH.AX.A`.Ap.Ax.A.A.A.A%.A@.A5.A .AE.A.AX.A /Aj/A/A /A0/A8/A H/AP/A`/Ah/Ax/AТ/A`/A/A/A/A/A /A/A"/A/A7/A0AN0A@ 0Ac(0A80Az@0AP0AX0Ah0Ap0A`t0A0Ap0Aǣ0Ai0Aޣ0A@h0A0AQ0A0A70A1A`,1A21A@ (1AD01A @1AVH1AX1An`1A`p1Ax1A@1A1A`1A1A1A1A1AΤ1Ay1A1Ak2A2Aj2A 2Aj02A%82AH2A;P2A`2ANh2Ax2A^2A2Ay2A ]2A2A`H2A2A G2A2AF2Ať2A@@3Aإ3A@; 3A(3A*83A@3AP3AX3Ah3A&p3A3A?3A 3AW3A3Aq3A3A3A`3A3Au3A4Ac4AƦ4A`\(4A04A>@4AH4A1X4A`4A`.p4A-x4A@(4AЪ4A`!4AC4A 4A.4A@4Aa4A 4Ai4A 5A}5A@5A 5A`k05A85ALH5AP5A;`5Aɧh5A`x5A٧5A5A5A` 5A5A5A*5A5AE5A@5A_5A`6At6A  6A(6A86A@6AP6AX6A`;h6Ap6A46AȨ6A6A6A6A6A@6A6A6A6A6A07A`7A67A@(7AI07A@7AbH7AX7AP`7A p7Apx7A7A7A}7A7A`\7A}7A`=7A7A97A7A58A8A,8Aܩ 8A(08A88A$H8AP8A `8Ah8A@x8A(8A8A=8A8AQ8A8Ao8A8A8A8A8A9A9A 9A(9A89A@9A 9AĎ9A79A9A89A89A9As9A9A 89A9Aa9A@9Ai9A:A8:A:A8:A :Ai(:A`0:A8:A@:A=H:A`:Ash:A0p:A 8x:A :Ad:A@ :Aa:A0:A:A:Ac:A :A8:A:Ai:Ap:A$8:A :Aĵ:A;Ai;AP ;A8(;A0"0;A88;A@;A8H;APP;A8X;A`;A8h;A#p;A8x;A;A8;A;A8;A;A8;A!;A8;A`$;A8;A";A`;AP;A8;A;A8;AA?>A?>A?>A@ >A@(>A@0>A@8>A@@>A"@H>A&@P>A+@X>A*@`>A/@h>A4@p>A8@x>A=@>AA@>AE@>AI@>AJ@>AN@>AR@>AY@>A]@>A`@>A?>Ac@>Ah@>At@>Ap@>Ay@>A@?A@?A@?A@?A@ ?A@(?A@0?A@@?A`H?AAP?A!AX?A'A`?A0Ah?ABA?A8A?AL?A?AN?A>A?ApL?AGA?AL?A?AK?AOA?APK?AVA?AK?A]A?AJ@AdA@A`J@ABA@AQ @AnA(@AL@@ANGH@A P@ASGX@AP`@AXGh@APp@A]Gx@A"@A7@A@AbG@A@A-@A@AQ@A@AiG@A@Ab@Ap"@AoG@A@AsG@AкAASAAAA{GAA  AAQ(AA0AAG8AA`@AAQHAA@`AAnShAA?pAA;RxAAAAAQAA<AAQAA;AAVAAA>AARAABAABRAAKAA7AAQAAAARBAQBASBA SBAS BAS(BAS0BA"S8BA(S@BA.SHBA5SPBAFAPaFA:FA]aFAJGAeaGAEGAwYGA: GAna(GA >0GAya8GA ?`GA8ShGABpGAbxGAbGAbGAGAGAbGAEGAbGAbGASGAaGAQGA^SGA?SGAGA`GAbGAHAbHAbHAHA HA(HA0HAb8HAb@HAbHHAbPHAbXHAb`HAhHAbpHAbxHAbHAbHAjHAlHA0lHAjHAjHAjHAjHAjHAPlHAjHAjHAkIAxlIAkIA kIA/k IAl(IAFk0IATk8IAek@IAwkHIAkPIAkXIAk`IAlhIAkpIAkxIAkIA!IAIAIAIA`)IA`)IA`)IA`)JA`)JA`) JA(JA0JA8JA@JAHJAǤPJAҤXJA`JAhJAJAXKAKKAk KAg(KAA 0KA\ 8KAD HKA`E PKAB `KAA hKAA KAKAA KA\ KAD KA`E KAA LA (LA 0LA @LA HLA PLA LALALALALALALALALALALALALALALALA MAMAMA% MA,(MA00MA48MA8@MA<HMA@PMAD`MAhMApMAxMAMAMAMAMAMAMAMAMAMAX6MA` MAP MA MA NA NA NA (NA`60NA 8NA@ @NA HNA0 `NAЙ hNA pNA xNA NAf6NA NA0 NAЙ NA NA NA NAl6NA NA OA@ OA@ OAЙ (OA 0OA 8OA HOAo6POA XOA `OA hOA@ pOA xOA OA OA OA OA OAxIOAIPAI8PAJhPA0JPA`JPAJPAJ(QAJXQAKQA8KQA`KQAKRAKHRAKxRALRA(LRAPLSAL8SALhSALSAMSA8MSA`M(TAMXTAMTAMTANTA(NUAPNHUANxUANUANUAOVA8O8VAXOhVAOVAOVAOVAO(WA PXWAFWAHPWAFWAhPXAPHXAPxXAPXAQXA8QYAhQ8YAQhYAQYAQYARYA R(ZAGXZA7GZATGZAmGZAG[AGH[A@Rx[AhR[AR[AR\AR8\ASh\AG\AG\AG\A0S(]AXSX]AS]AS]AS]AS^A TH^APTx^AT^AT^AT_A H8_AUh_A0U_AXU_AU_AU(`AUX`AU`A(V`AXV`AVaAVHaAVxaAWaA WaA@WbA`W8bA*HhbAGHbAdHbA}HbAH(cAHXcAWcAWcAWcAWdAHHdAHxdA XdAHXdApXeAX8eAXheAXeAIeAYeA I(fA0YXfAPYfAYfAYfAYgAZHgA=IxgA8ZgA`ZgAZhAZ8hAZhhA[hA8[hA`[hA[(iA[XiA[iA[iA \iAH\jAp\HjA\xjA\jA]jA0]kAZI8kAhkAxkA8kAhkAkAkAkAkA(kAPkAlAlA(lA8lAHlAHXlAhlAЗxlA(lAXlAlA`AlA AlAAlAAmA`AmA A(mAA8mAAHmA`AXmA AhmAAxmAAmA`AmA AmA~AmA@~AmA~AmA`}AmA }AmA|AnA@|AnA|A(nA{A8nAqAHnArAXnArAhnA`rAxnA rAnA {AnAzAnAzAnA`zAnA zAnAyAnAyAnA`yAoA yAoAxA(oAxA8oA`xAHoAwAXoAwAhoA@wAxoAvAoA`vAoA vAoAuAoAtAoAsAoA@uAoA`tAoAsApApApA@pAPpA4hpApApApApAЂpApAFqA qAXqAЃ`qAhqApqA`xqA@qAOqAqAqArArArArA`0rAXHrA sAprAerA sArAtrA sArAsA sA(sAP0sA@8sA0HsA `sAhsApsAxsAsAsAtAsAsAtAtAptA`@tAPHtA@PtAXtAptAtAtAtAtAtAtAptA` uA(uA0uA8uAPuAhuAuAuAȨuAuAuA uAvAvAvAvA0vAШHvAvApvAvAvAvAvAvA wA(wA0wAP8wA0PwAhwAxAwAwAxAwA%wAxA@xAHxAPxAXxApxA6xA`{AxAGxA`{AxAXyA`{A0yAiHyA`{ApyA}yA`{AyAyA`{AyAzA`{A0zAHzA`{ApzAǩzA`{AzAةzA`{AzA{A`{A0{AH{A`{Ah{Ap{Ax{A{A{Ap{A`{A0{A{AF{A|A|A (|A|AP|AGh|A|A|A|A|AP|A0|A}A}A0}A#H}A}Ap}A/}A}A}A}A}A}A~A;(~A~AP~AGh~A~A~A@~A0~A ~A~A0~ASAA0A_HAApAkAAAwAAAAA0AHAApAAAAȀAAAAA0AȪHAApAԪAAAȁAAAAA0AHAApAAAA AAAȂAAЈAAApAٷA(A8AHA XAhA!xA1A;AEAOAYȃA`AZA-AA A0A@A`A0pAxA?A\AAgA'AAAA A0A@AHAXAhApAAAAAAAA#A) A0A1@A;HAXAEhAOpAAYAcADAmAwAwІAAA A0A8AHAXA`AAAEAEȇAc؇A1A1AA A Ai(A0A@AoPAٷXAٷhAuxAOAOA{A;A;AȈAЈAAA!AAA A0A@AHAAAAo6AA&A5ЉADAJAR A0Ab8AwHAXA`ApAAAAAAAЊA#؊A;ALAVAnA A(A8AHAPA`ApAxAAAAAAȋA"؋A4A=AOAaAkAk`A^pAvxAAjAAAaЌA،AAAAAAA0 AB0AK8A^@AlPAuXA`ApAxAAAAȍA؍AAAAAA(A0A3@ADPANXAchA}xAAAЎA؎AAAAAAgA A(A0A?8A HAPAXAe@`A pA$xA;AHAJANAkAtAwAȏAЏA؏AAAAAAA A(A8A@AHAPA `AhApA$xA'A+A;AFAIAMA\ASȐAeؐAiAAoAAAAA(A0A8A@APAXA`AhAxA AA.A1A5ALA;A@AAAeYAAHAP A(A@AMHA:PAZXA;AgApeAiAeAkAfA?A@iAsȒAiAyA,A<A,A,A@6AA7@AHAPAXAp`AhA@pAxApAßAA̟AAҟA0AٟAAȓAГAؓAAAPAAA0AAAp A(A0A!8A0@A+HAPA7XAp`AAhA@pAKxA AVAA\A0AgAApApAvȔAДA{ؔAAAAA0AA  A(AP0A8A@AHA@PAXA0`A٠hA@pA xApAҠAAAAAAAAAAAqA Ai A(At@A6HA@PA6XA`7`A1hA@:pANxALA6AA8AWA&:A"A6A@%A6ȖAPkЖA7ؖAMAAKAA KAПAAAAE A(A0A8A@A@CHA`CPACXAC`AChA GpA0DxAEA@BABAJAJAHAPIAKAGAHȠAOРAPؠAQARATAUAVApWA0XAMAPL AM(A Y0A@Y8A`Y@AYHAYPAPZXA`[`A\hA0\pAP\xA\A0]A@^A_A`AaApbAcAxAdȡA eСAeءAfAhAiAkA0lA0mAnA0pA q Aq(As0APt8A0@A`HAtPA XAt`A`vhApvpA@wxAwAOAxAxAAPAAІAyA`zȢAP|ТA@}آA@AAAA A`AA0A A(A0A8A@AHA PAXA `A`hA pAxAбA`AAAЯA`AAPAAȣAУAأAAA AAAPA@AA Ap(A`0A8A@A`hA@A AAA AA @AKAAA`A@ A(A`0A@AGHAKPAKXAR`A-WhA@WpA^xAbAbAؤAAAASAYA`A`AhA{A{AФAȟA؟AAȤAApABAAjAAAAAAAAA A (A 0A 8A @A HAPAXA`AhApAxAAAAAAAAAAȚA КA!ؚA"A#A$A%A&A'A(A)A* A+(A,0A-8A.@A/HA0PA1XA2`A3hA4pA5xA6A7A8A9A:A;A<A=A>A?țA@ЛAA؛ABACADAEAFAGAHAIAJ AK(AL0AM8AN@AOHAPPAQXAR`AThAUpAVxAWAXAZA[A\A]A^A_A`AaȜAbМAc؜AdAeAfAgAiAjAkAlAm An(Ao0Ap8Aq@ArHAsPAtXAu`AvhAwpAxxAyAzA{A|A}A~AAAAȝAНA؝AAAAAAAAA A(A0A8A@AHAPAXA`AhApAxAAAAAAAAAAȞAОA؞AAAAAAAAA A(A0A8A@AHAPAXA`AhApAxAHHuV?HtH5zP?%|P?@%zP?h%rP?h%jP?h%bP?h%ZP?h%RP?h%JP?h%BP?hp%:P?h`%2P?h P%*P?h @%"P?h 0%P?h %P?h % P?h%P?h%O?h%O?h%O?h%O?h%O?h%O?h%O?h%O?hp%O?h`%O?hP%O?h@%O?h0%O?h %O?h%O?h%O?h%zO?h %rO?h!%jO?h"%bO?h#%ZO?h$%RO?h%%JO?h&%BO?h'p%:O?h(`%2O?h)P%*O?h*@%"O?h+0%O?h, %O?h-% O?h.%O?h/%N?h0%N?h1%N?h2%N?h3%N?h4%N?h5%N?h6%N?h7p%N?h8`%N?h9P%N?h:@%N?h;0%N?h< %N?h=%N?h>%N?h?%zN?h@%rN?hA%jN?hB%bN?hC%ZN?hD%RN?hE%JN?hF%BN?hGp%:N?hH`%2N?hIP%*N?hJ@%"N?hK0%N?hL %N?hM% N?hN%N?hO%M?hP%M?hQ%M?hR%M?hS%M?hT%M?hU%M?hV%M?hWp%M?hX`%M?hYP%M?hZ@%M?h[0%M?h\ %M?h]%M?h^%M?h_%zM?h`%rM?ha%jM?hb%bM?hc%ZM?hd%RM?he%JM?hf%BM?hgp%:M?hh`%2M?hiP%*M?hj@%"M?hk0%M?hl %M?hm% M?hn%M?ho%L?hp%L?hq%L?hr%L?hs%L?ht%L?hu%L?hv%L?hwp%L?hx`%L?hyP%L?hz@%L?h{0%L?h| %L?h}%L?h~%L?h%zL?h%rL?h%jL?h%bL?h%ZL?h%RL?h%JL?h%BL?hp%:L?h`%2L?hP%*L?h@%"L?h0%L?h %L?h% L?h%L?h%K?h%K?h%K?h%K?h%K?h%K?h%K?h%K?hp%K?h`%K?hP%K?h@%K?h0%K?h %K?h%K?h%K?h%zK?h%rK?h%jK?h%bK?h%ZK?h%RK?h%JK?h%BK?hp%:K?h`%2K?hP%*K?h@%"K?h0%K?h %K?h% K?h%K?h%J?h%J?h%J?h%J?h%J?f%J?f%K?f%*K?fSHH?HHH51H;>HHwHSHH?HH51HsHH 9@Vw;wȃ910 ' wwAw@t{tstfupVtZw@tdtB tTJt<t4t:0øøø@øøøø1øLH1ILLHHHt ID8.uHtHyH5xL1[cAxtYt@uPSHH`YtH8t 0t!H{`0u1 H8[1ËF(9G(uRHF H9G uHUSHHHHvH譄u1#Hu0H{0蘄tHu8H{8臄Z[]11\L Ƈ`LUSHH L8Iu ~nMAIAtZtUHH5HHt HH5Hg`L1 H51H<u ƃ`L1Z[]HH9tDUSHHRɠHHBbD tu1-!HHUHUHZ[]1AWAVAUATUSHdH%(H$1H97HL$LD$0IHHAIIHD$ HD$hHD$8H$HD$HHD$@HD$`HD$HHD$ H9$HT$8Ht$ 0HDŽ$HDŽ$HDŽ$D$`D$dKC utHl$hH+HT$@HH*C uSHHT$HHHDŽ$H$H$H%D tuHT$8HHB t DHHD$(HD$hH9H|$Ht$drtQH|$L$`t5ILHT$LH|$0HD$ЅA|$`H+AD$d ƒ Ag=p==FH$Idž0HHA (H;+MHHLB t4LHHC At AdžH;+IHHC H;+A=A~H$HHHDŽ$Ƅ$HDŽ$G 'H$HTH$Adž 1HH9  HA IHHM I HT$p0HHM@ HD$pHH9HD$xML$HD$ADxLL ukI}HE}IEHD$xIEHHH91LHHHߊJHHT$L$(> L$(tD=tMAMtIl$L s L/IIdžII} cHIEtI3AIEfkEXH$HHHDŽ$Ƅ$HDŽ$E t-%AiH$H$A0H$0HHo> At A%SH$HHH9HH$MHD$H;+HT$0HH > L$L#HT$HL= H$H Hu9U DEAI}t>I}HL$XHT$P2 HIE!HL$XHT$PIIMIUHAEI9Hv-HT$0LH== t D'H$HL;#IEE]AL$`uH|$u|$`A0ILD$(HT$LH|$0HD$Ѕ뽃|$`u(H+ANAFA>A6A.Au&E1!AYANACH$dH3<%(DtH[]A\A]A^A_fDAUATIUSAH |HHHXuH @LDHHNH[]A\A]fD1I^HHPTL*2H 1H=|F>?DH=!E?UHE?H9HtH >?Ht ]f.]@f.H=D?H5D?UH)HHHH?HHtH >?Ht ]f]@f.=D?u/H==?UHt H==?HD?]fDUH]ffDHHGHGSHHCHHCHC[f.AWAVIAUATIUSHHLwHI H9H9H@HHwDH[HHvH9wH MIuALeH]K<4LLLmH[]A\A]A^A_Lgf.HMLHHHL$iHL$HLHMl$H$8dH3%(uaH[]A\A]A^A_Mt$fIL$LHHHL$HL$H[M|$xHZSH2HHH@H@H[fAWAVAUATUSHH(HT$dH%(HD$1QHHLt$LxIHK >H9H9H@HHw@H[HHvH9wHMIuQMl$I$K|=HLXMt$1Ht$dH34%(uYH([]A\A]A^A_fMl$fIL$LHHHL$HL$HM|$@HbSAWAV1AUATUSHH(HL$dH%(HD$1PIH^MHRLxLd$HK LLLeLeHEIL$H9H9 H@HHw@H[HHvH9wHMIuiLmH] fCD%1HEHT$dH3%(H([]A\A]A^A_@Lu:LmfL`9LuLHLLLetDHMLHHHL$HL$HL}H"H3SuHxHH1[f.SHBHPHt)HpHJD< tP< t4H [DH5sHa[f.HtHHfDHtDHzHH< uf.@ATUSIċ@~(h1HHIT$H|HH9uI|$[1]A\Df.AWAVIAUATUSHHHtM1ҾHNHHAGI7HE1AHHD[]A\A]A^A_þHAHHD$0HD$IHT$DLDL1DLHHAWuNI7HE1AľLERHD$HD$H9D$0{E14fDL8LHL^I7LSE11ɺLlDL1LLbfDDLHHD$(tH$H$DLDL1DLHHAOu?I7H1þL`EH$H$H9D$(sKLLyHL>I7L3E11ɺLLDL9LLnfDDLHHD$ tӽL|$ILDL`DL1DL_HHHD$puOH0H1þL8IL9|$ sLL|$fDLLAHLHD$LH0E11ɺLDLLfL^fDDL]HHD$tӻL|$8HDL+DL`1DL*HIHD$xuRH0LE1dAľLEHH9\$sLL|$8fDLLALLHD$LH0E11ɺLDL[DLhLSVfDDLHItALDLHt$LLuIM9sfDLLLHAH|fDHHAHHI7HE11ɺHHvAt#1ҾH0HHE1ADH!@1DLLHE1MDLA1DLHH1Lmf1DLHH1Lf1DLcHHE1ޅLAULuLL8L+HAL@f.AWAVAUATIUSH8H5!HLHD$ ?rLuLLt$ HcHHAFpIFSHD$HD$AHHHT$(@HL$HT$LL4 LHcHAFHIFA>SL4$E1IHHHT$ @H$H@J LLCL1҉LDHLLX1҉LlDHCLmL.LtDCLFLLMDCLHsHt(H=+uH$CDLI IL9d$L4$DLAV~IFHxt HD$ At HD$ @HD$HD$HD$H9D$(tHD$ H@DH8[]A\A]A^A_@H5.LaH5JL1L\@f.AWAVH5*AUATUSHH8H1ҾHHIHD$H5HHHYIHHD$ A7MD$/D$/tt AGbH5HAHDHH|$HD$D$.D$.D$(HD$ L$9HML|$E1ILxL<$f.}t|$.HD HHHHHAD}UEtA9ָED$(D$(EuAH$PD9HHIcHH,HuHWH|$t D]EHjDl$ P1DHHIt+DME6HuHE1/AEHHV^DHuDHsHItALDHGHHAH\EuoIM9syfAD9t(HpHHMH OAD9u1҉HCH8[]A\A]A^A_HDl$ UAdHD$@HHALHHuHE11ɺHDHusDHXDE1Dl$ Ef.DUEHuH|$e1҅…T$(HD$1DHLHE1%DHA1D$(|$/EfHhHAHt$HHuHE11ɺHDH]uDH.1DH H|$H_1҅DH߉T$ T$ Df.Df.f. zu1ÐSعHHHcWL$$Hl$HL$Hf(H諧u1H[HSHIHHyLHH[ÐAWAVAAUATIUSH~HAEH(HFF(Hdž(dH%(H$1G+?u nH=,pg+?hpHHHL$HPremake/1HD$H5.0.0-beLHL$HD$D$ ta1=<'HH1p4H1p+H1p-H1pHU('H1pHL$"'H1HupH5LH5LLLLEE~EH'H1ovH1+NHoH}t>1Ҿ+H1oHI'H1oAHJXNH1oE(H$dH3 %(HXH([]A\A]A^A_DL5LL5H= LH=LH= LH=m L(H=wLJH=: LlH=&LH=LH= LLDL*1ҾLS9HLILYLLD$|?f.1ҾL8LIH(L"VH(t$LuH(''HWm f1H߾Q1?m1Ҿ@H1.mfDLLA7@1DL;8LIKH(LlUH(DLuH(''HlDDL nDLLe5عLJEJL(LLeعLLJE@L1LL7'HH1kDLc1L 7'HH1ksDL#1L6'HH1jk3DLLn7H,о H1*kDLL.7H,оH1jDLs]L6H,оQH1jsDL3;L6H,о@H1jj3DL1L5'HH1*jUSHHH(HtHSHǃ(HH[]lf.H1H=>$?H5 H@S1H11HH5g1[#Df.S1ҾHHtHHH&[ÐH&HMtHtH߾H߉/H5HH1fATUASHHdH%(H$1H51ҾH HHHDH5"?HHYH="?H"?H1HthHſH H!%tDHJHDщHH)uyEt <$=HHH$dH3 %(~H[]A\DH51ҾHHHHDfHBHL9 uHjHUH5~H1Di>@f.USH5bHHdH%(H$1E1ҾHvHHH5E!?HHDHH=/!?ZH3!?HF1HthH2H H!%tDHJHD@HH)tHBHL9 t7HHH$dH3 %(uH[]HAWAV1AUATUSHH(dH%(HD$1xH 1ҾHDH5HH1HHuH E1HHHH#Ll$L% L|$L5ZHLHHT$E1LHHHtIHߺH袼HL$dH3 %(H([]A\A]A^A_DLHXHT$HvHtH= uH4HlcLH9HߺgHjDHߺ>Hѻ @)fAVAUATL%gUL-?SHH?H1ҾHTH ?HHt&H=>?HH 1H=$?/H=?HL1H=? HHUqH1H ?H=mXH=?[L-?]A\A]A^fHxH51HHֺH5Hc?E1E11H'1AH艺HEHuH H)H5 HH,E1E111҉H$1ҾHH5 HH1=H ?HHt&H=g?Hq 1DH=M?XH=A?HL1H=(?3@f.AWAV1AUATUSHH(HHD$HH@H 8- PD$Ae\-E HQHEHt 8|$D$AAtFH %?H=f 3H ?H=UH=?Et!HDHJ عH0HmLt$E9AT$DH)E~MEnDDE1HLcHD$JtHKT5HIL9t$uH5AHwEnAAu Dlt'AE9IcLlHAEeuA}IeH5dHLH H¶H5Dx1H]DHH5fH?E1E1DHj1D$DHʶH]L$Q1ҾH2H {?HHt&H=?H&1H=? H=?HaH1E1H=?HԵH(D[]A\A]A^A_flt_vtitD$@L$xAL$IcHDH8-PeL$HAT$HcH4HDCH\8-SAHD5fDAeLlL>H NE1HLH@H趴H5A1HRDHH5[H?E1E1D11He1AֿDHƴHYEAE9 D9d$D$D9d$OHAL3LHH=褹HIH A}@fLHL$HL$E1HLHs?Q1ҾH|H ?HHt&H=f?Hp1CH=L?WH=@?H*_H1H=#?.H!H@xuHpIHE~0EeIfDHHHL9uDֺH&H蹯H葯H5D)1҉H+HH55Hy?ԺE1E1DH<1A譺H螯H1ED$H'@H=贴HIH  @HHHHEHt"8tH ?D$AE1E1AD$11HvHt1ҾHSH ?HHt&H==?HG1H=#?.H=?HZH1H=?HH˭H51HhH)H5rH?E1E111H}1AH߭HrEJ@AUATIUSHlFHH5H1HHcHLHyE1E11ɺHHAu)HEH []A\A]fD1ҾH衻H ?IHt&H=?H1hH=q?|H=e?HOXL1?H=H?SHFXI $H=%?Ht&H*1H=?H=?H SHW1лH=?H[]A\A]@AVAUATUH-SL%?HH?@H1ҾHpH ?IHt&H=Z?Hd17H=@?KH=4?HWL1H=?"HHmmH1H5 ? H= ?ݷ[L%?1]A\A]A^H蠪1AHH@DHH5IH ?E1E1D11HS1AĵDH贪HGEHH5HHmHpE1E111H@1ҾHɸH5HH1uH ?IHt&H= ?H1|H= ?萶H=y ?HcUL1SH=\ ?gf;f.AVAU1ATUSHHPdH%(H$H1HD$H5H'HHIHl$1AHHIMPL18QL'L1&QH/+NL1QLQHT$Aƾ L1SHLLEH5HVH}fHH*D$芽H$HdH3 %(HP[]A\A]A^fDE11ɺHHIM LA良DL$@BIHE(HL/PL1MLH蒽XZ5H5HyH蹼*误f.DAUATUSHHXdH%(H$H1HD$H\$,1AHHIM)PL1DOLOHT$Až L1%RHLEHL$@DAIHC(HLPL1 LHRXZH{fHH*D$脻H$HdH3 %(uhHX[]A\A]fDHt$0HT$(H膻H5nHDE11ɺHH{IMAf.DAUATE1US1ɺHHXH\$H$dH%(H$H1HH-HT$IľHIž/1LMMtHT$HL>NHAž L1iPHL>EHL$@D?IHC(HL3PL1QLH薺XZH{fHH*$ɹH$HdH3 %(uoHX[]A\A]Ht$0HT$(HιH5H/DA8DL<1yLL'L1gL=f.HFHtHHFH1f.u 1fATUASHzt 1[]A\fDH߃蝸H;HtžH-uкDH舫ulDHgtHAHԢH5DHHH9@H苢ATUSHc~HnHH[]A\H~IHu-HkHK HI$H[]A\1ff.H1ҾH=?HzH1ñH=?׮1HHHtHЯH藧1HAVAUATUHSHIdH%(H$1cLACDH5HH5H׹H蘤H5HI1Ҿ׹H/HH*HHICHHH襶H5H;$t HH<A$/ֹHEeE~fDHD9uE11ɺDHLH<DHãH5HtAuH訣H5 HYH!D)H$dH3 %(uVH[]A\A]A^HHHHH誵H5H;$HH;=f.AUATUSHHH苟H5HHAHSعHH腣t DHeH1[]A\A]HEl$莴@H.HtH&uٺDH聧DHYtH3HƞH5@H״HߺH1ҾHyH=NH€u+HpH肴Hߺ谞HCDH߾H߾&H[]A\A]fDHf@f.USHHHHdH%(H$1tH5HH0L$(8H56H1GH$dH3%(u+HĘ[]f.HU8H58H1 ĥ@ATUISHH`H$H$L$L$t@)$)$)$)$)$ )$0)$@)$PdH%(H$1H$Hl$ HHD$H$HD$D$ 0HD$ytH5NHHL$H[H55H1 HT$LHʲHHH$dH3 %(u)H`[]A\fDHU8H5H1諲d@AUATIUS1HHILdH%(H$1H5HLH!Ht$H=HT$tHHt{H5HMH1H$dH3 %(HĘ[]A\A]DuH5LHH5LHfLH5Hu HT$e1ҾHH7AWAVAAUATAUSIHHHT$L$ Hl$ dH%(H$1WD$EEHDLLuE9~9C/HLAΉL$L$EnE9|EAF+D$ A DNHD$HtH5EHH1菰 HBuH5HoH5HЯHE8t$ IHLt7EH5HA蘯AFHLƉD$ SuH7+D$H߉H$dH3%(Hĸ[]A\A]A^A_D9AH5EHLvH58L1H蒯T$H~H5"H1yH5HڮHHHT$0:HD$8H5L菜HL蛪L螉HdعLzH51L蹝HLULȰHt$L諺LI諘HIHPH0H|$AHIu EH3HSLM&In译rf.L'kHt$ L3LHD$1H|$ IHP1H0LD$AH5IIGL1Ht$ LӹLHD$їH|$ IHP1H0LD$AH5IIGL1BfAWAVAUATUSHHdH%(HD$81Hu-HD$8dH3%(+HH[]A\A]A^A_f.LgHHIHLH)H9MLsLH)H9HIMHC D$H9Ht$(L̸LI̖LHPH0HD$H|$(AHILL$u |$M)MaH{L+LcLHL轏Hk@L+L9aH5L1>KfLSHHH@عLLHt$(L޷LIޕLHPH0HD$H|$(AHILL$ur|$tkHt$0LLL$葷LHD$菕1HPH0H|$0LT$HD$ALD$H5hLII@1CLL$fDH3HSLM)MarDL[1L H5bL]HLiLlH2LعHH51L臙HL#fDHt$0LLL$vLHD$t1HPH0H|$0LT$HD$ALD$H5MLII@1(LL$ىfAWAVAUATIUSHHHHdH%(HD$81tHu'HD$8dH3%((HH[]A\A]A^A_@LkH{HLH)H9MLsLH)H9HIMHC D$H9Ht$(LZLIZLHPH0HD$H|$(AHILL$u |$ MMiH{LLkLHLKHkfLL9cH54L1MfLHHH@عLPL苪Ht$(LnLHD$lLD$HPLH0HD$H|$(AHILL$us|$tlHt$0LLL$HD$LHD$1IHPH0H|$0LT$AH5IIGL1LL$LD$@H3HSLMMiIfL~1L蔞H5LHlLLHLعТH51LH]L諢fDHt$0LLL$HD$LHD$1IHPH0H|$0LT$AH5IIGL1LL$LD$^@f.ATUSHHHoHWH7dH%(HD$1HbHC H9tXHHNHINHHP1H0H<$AԾHHHC}HQ}HD$dH3%(u H[]A\装ATUSHHHWHodH%(HD$1HH7HWH諒HC H9tXHH藱HI藏HHP1H0H<$AԾHHHC}H|HD$dH3%(u H[]A\ff.AVAUATUSHLk HHoHdH%(HD$1H)L9+I}H{|L$$MuBL;+taH[|H{HD$dH3%(u>H[]A\A]A^ÐLHLLH跇Lc럐L$$Mu׾ f.HF H~HFHF H@AWAVAUATUSHn HH8H~H.dH%(HD$(1H HFHF H@A@LGIHHH@عLVL葥Ht$LtLHtLIHPH0H|$HHH3HSHI.Mf~HCH+LcHHL$(dH3 %(H8[]A\A]A^A_DL;z1LH5BL=HLILL}HLع(H5q1LgHLfDHt$ L[LHD$YH|$ IHP1H0LD$AH59IIGL1ʁf.AUATUSHHG}Hx1҉HA1ҾHHHAxu0DHʼnDhIcHDH0HD[]A\A]fHcDHH1DH¾HAx뻐f.xLATUHSHcxHA1҉.HDH谠HHՍ[DH1]A\锠@@f.AVAUIATUISHH dH%(H$ 1wMhH5s6LH1耎H5$LHHHD$$L5.IAV9Hc$A>H|$JD $}u1ҾHIH5MHHHH|$A~MA(EoHߺpwHwH$ dH34%(DH []A\A]A^f$ԃ#rMHT$H5L5HHHD$$L52@IAV9Hc$A>H|$JD $Mu1҉HH5MHHHĥH|$A|A@H|$}E; tH|$uH|$ڂHc$JD $pHu{8躅1҉HI{HvHHMH5H1AHuHJuBDHc$JD $@H5H1H=>H|$Pf;{81IĉHŃMHHHE {8ք1IĉH藃MHHH#tSf. tH|$聁uH|$r"$X#t|ff.H(H4$H5aHT$HdH%(HD$1责HL$dH3 %(uH(Z|f.USHHHH(dH%(HD$1{H5E1HHHH$HD$KHL$dH3 %(uH([]{Df.USHHH菓u H[]@HHeH8D$ t0Hߺ~sH߾sD$ H[]fDH߾rD$ H[]ATUISHH}rH߉Ɖu H[]A\@LHňH蘏D$ tPH߾rH߾qrHuHE11ɺ蠟H[]A\fH߾3rD$ H[]A\fDUSHHdH%(HD$1HT$H~HŋD$uH5H1HqHL$dH3 %(HuH[]zAUATIUSHH9qH߉A謑u8H~uW]HtwH5HQH$tpHnqHqDHFtE11ɺH/HwHLH[]A\A]HpHt+H~H5HHHD芆Hu1҅HB}H5HH1ކ_fH5IHB@uH5}H&HubHsH߉~tHI!H5HLH1ZD{{H5H߸7fH5'H葅HdAt}HoH>oAuj1ҾH~HI|H5iHLH1赅HߺSoHnHnHrH߉jsAWAVIAUATUSIHmuHH5jL)I>t\AAA)A@1ۅ~f.DLq9uIvLI輅IVDL]I>uHL[]A\A]A^A_mf.ATUASHHNtDHmDHlm11HAmHpHDHґ1[]A\fAVAUIATH4USHعHAˇtHHImعHl11HAHppHDHNHHnH{tMH;mHlEu []A\A]A^H߾pHH[]A\A]A^鰎H߾l1LHHH蛂E11ɺH߾贙H߾oHH臐UfAWAVIAUATIUSIHH H|$ HdH%(H$ 1CtIHD$`Lt$xHD$pHD$h HD$H$HD$`HD$HD$PHD$HD$XHD$@ J\=LH{HHLII)LsHHtLt$hH|$pLH)H9HD$xMH$LH)H9HIMHL$D$(H9L$`Ht$H<$ŸH<$HD$8}LD$8HPLH0HD$0H|$PAHILL$0u |$(cMMqH|$pLD$`Lt$hLHLvH\$pDL9WH<$H51-@H|$LsLHHUvLt$pHrHHHT$pH\$xHt$`HHD$H H9D$`t\Ht$XH谞HI|HHP1H0H|$XAԾHHEHEjHiH|$ 1ҾxH$ dH3 %(HĘ []A\A]A^A_LD$`fDH|$HcHHHEuHT$pHHT$pH<$H<$H4HH@عnH<$hH<$1蘈H<$H5~H<$HkH<$kH<$HعЌH<$H51H<$HX詌H<$Ht$H<$H<$HD$8zLD$8HPLH0HD$0H|$PAHILL$0}|$(tvHt$@H<$LL$HHD$8螜H<$HD$0z1HPH0H|$XLT$0HD$(AL\$(H<$H5pIIC1NLL$HLD$8@HT$pHt$`LMMqwsIHt$@H<$LL$HHD$8H<$HD$0y1HPH0H|$XL\$0HD$(ALT$(H<$H5ҼIIB1LL$HLD$8&\off.SH=1HHtH5H*fH[DATUISHHD$'fIHtH5ܼH1*1fH9uMf.L$z1u/H[]A\fDHHH5[]A\1D$HHH5[]A\@f.AVAUIATUHSHe}$H5HA~~1ҾHtHt 8$DHߺfHeH5=1H}HH{E11ɺH豒1ҾHBtHtLHHAtSu(H&eHH{LAt/[D]A\A]A^HuHLLAuH5.HE1^|[D]A\A]A^fH59!1H?|HHzHgE11ɺHБ1ҾHasHpHKAt$HAdHCdDHdH&dE8H5ѺHH1z[D]A\A]A^HHDlHUS1ҾHHHHluH߾{H[]HxH5yHH1$zH[]AUAT1USHHdH%(HD$11ҾHIHHnLHqu4H7{HL$dH3 %(uMH[]A\A]Hxi8IrEEH5ιILH1LykAWAV1AUATUSHH( H|$dH%(H$ 181H߾H&H5xHHTqH5fIHBqMIfH1LoLm11LHo1LoLpm1H1LoH9HLt$L$uBQMHٺL(pH9_HLLQlumH)HMHFݺHLoH9tLhLhH\$HjvH5H+w%@LhLhH|$1$yH$ dH3 %(H( []A\A]A^A_fDHtHshH\$HuH5ܷHvLHhH\$HuH5˷H|vsfLhLhH|$qxHLgLgH\$HSuH5Hv UhDSHHHpHH![AUAT1USHHw1ҾHIeI1LHHMuiML%/>tH5ֲLnnIMH5[L1H讏LfHNH߾QwH[]A\A]Ð1ҾHmHIHHLD(tH5LLH1quHH[]A\A]fHHsH5LH1,uH[]A\A]f.fATU1SH-1ҾHIH5RHLHH1t1ҾHmHfuH߾9v[]A\H0sH5HH1|t[]A\fHsHf.USH@H@HHdH%(H$@1Qg1HtHHsH$@dH3 %(u H@[]efDHgHHfS1ҾHHkHH s[fDATUSHHHGILdH%(H$1et2HHC1H$dH34%(HĐ[]A\fL H!%tDHJHD@HL)HjH iHLHHChI$H5UC,kHHtX1 gH5.1kHt71 HgH5 1CjHt 1HgCcf.SHH@H|$HD$D$dH%(HD$81HD$ D$(\u HL$8dH3 %(H@[fD11HzH5UHqfH*D$[pH}H54HpfH*D$-pH}H5HpfH*D$oHr}H5HpHt$ HpHI}T$(H|$ D$ `D$ bf.fH5`H0pHfDH15rHf.S1ҾHHdH%(H$18tYHHƿAft-1HqH$dH3 %(u2HĠ[ft$Hq@Hqa@S1ҾHHdH%(H$1HHƿe1u t$H+qH$dH3 %(u HĠ[5aDHHdH%(H$19e1҅u T$H$dH3 %(uHĨ`@S1ҾHHdH%(H$1HHƿv`t21HXpH$dH3 %(u.HĠ[D$1H%=@p=`f.HmHf.USHHH/t,H5HmHHmHԊH[]AVAUATUHS WH5HAoHaMHq1ҾHeEIA%H=HAE91DHe8$Hux/tWHHuxLHH:tH5HlHHlH߉[]A\A]A^ÐHxW=HtDHY[1]A\A]A^DH51HmDHdYHE11ɺM[]A\A]A^H5`HkDHYH1[]A\A]A^AWAV1AUATUSIHs Hfb/HI^HIHI)I;bHLIHID$[HCD=w]H<H) bHuHID$[L]LLI$cmH[]A\A]A^A_aIID$.HfAE]HxaHHID$[[fSUgH8HHt^H{\ZH{SZHKZ1[SHgHpHHbj[Ðf.USHHfHHytcHPH5HH1j1H߾bHHžSHHH߉lH[]f.H1kH[]f.AUATUSIH9fH8HI`HIEH1H-I}_HIEt^HHH€tӹHH€tI}1H^\uLkfD1H[]A\A]ATUHSHH0 HdH%(H$( 1/_teHZHHcx?Hc4@\to@/tiPHcHH)HJ$@A8-%D1H}MEfDA H8ut/D؄uA/.CH=CE1HHf/HAPuE$t$E1@H5@HAFE9uHH!%tHcDHWHD@ItH@LHH)LDV%@|$:/L)Ƅ4?LLUH$dH3%(uXH[]A\A]A^A_DH5LU|$/f.$ GfAUATUSHH/E<wfH+E<v@/@\OL HADDE<@$1@%k@{Lk%LaGHtHI9tCI9HHfAT u @_u#H9vsHHKfAL u_t1]{(kH)HFI1Mt8@%tvL9s(HHSfAT u _t.uI9uH[]A\A]{:H{}FH¸HuLH)Ht(H tH5Η HJXH5HwJ:gf.AVAUATUS/HE<wH+E<v@/ @\ML(HADEE<@$AE1@%k@{Lc%LwEI9tKHtFI9HHfADU u @_u%@H9HHKfADM u_tE1hf{(cH)E1HEHIt@@%tvL9s/HHSfADU u _t.uI9ufDA[D]A\A]A^fD{:AH{}DHuH)Ht+H wH5 HHAX됺H5ff.AWAV1AUATUSIHS(HÍE<wfDH+E<v@/ @\KL0HADF&E<@$AE1@%k@{Lk%LCI9tJHtEI9HHfAV u @_u%DH9HHKfAN u_tE1i{(cH)E1H CHIt@@%L9s+HHSfAV u _t.uI9uADLWRH[]A\A]A^A_{:AH{}BHuH)Ht+H kH5ؓ HFAL뀺H5@AWAV1AUATUSIHS(HÍE<wfDH+E<v@/ @\IL0HADF&E<@$AE1@%k@{Lk%LAI9tJHtEI9HHfAV u @_u%DH9HHKfAN u_tE1i{(cH)E1H AHIt@@%L9s+HHSfAV u _t.uI9uALLMH[]A\A]A^A_{:AH{}Az@HuH)Ht+H eH5ґ HDIzH5HxD(Yf.AWAVAUATIUSHHHAH?Ld DHHHL€tH|/LptB|3/IFuIIu;.H#AHqE L=ߐ{./L?HPHH=̊IDHIH=FHtsLHFHuc$L>HuQImM9LHCIDHEt{/uHCIVIHL9Iv};.2f}/tE/HLHH4!I>!1A%EHA$hA%{A%HEw!Ms@H%wHrAA$Ou(t{uH9A"jA'`DHHHD߃A<wy:uDC:HDHA/A\H9HE1ۀ9fDHyLAM@/t@\t@.H9DsEtA/tA\tI9s[A. HH9vAHt/t\.E..@/HfHIHH9s 9aH9tHH\t /u:fDHH9t+H/t\tDAKw@HHDXDAKvA tEH9t7PJv u&HPH9H)JHq@v tH|$H,FH$@dH34%(;H(@[]A\A]A^A_DAA(tA{uvDIA(tA{tLHMPIt@D2Hu;0f.AWAVAUATIUSH(@HT$Lt$dH%(H$@1eH|$LHLt$II1LDAHhJ܀:wGHLH@t.H9[^/]C*HI@H9sH9v9H멐I@HH9rH5/L<LgYH|$H9rLL<H$@dH3<%(uHH(@[]A\A]A^A_D%SHjAHtkIHy>1DHH{HtHL 0uHcH2>HLmH Ht&HQHqLT:H[]A\A]@1H[]A\A]SH>H5H)Hv>H57tHH\v>H5~HHu>H5iHHs>H5HHs>H5YHHr>H5Z~HHNr>H5M~HHq>H5<~HyHq>H5|HcH5>H;MIHSعHKH5vH9H5~HtEH5}Hu9H5}HVEH5HW9H5}H8EH5H99H5}HEH5J{H9H5}HDH=}(HtCHH8H5}HDHH5}HDH 1[fDH=^}L(HuH|@f.ATU1SHM1I1H5|H߉:H50}HS8H;H߾)& tH߾賘H߾!H5|L1)0[]A\^@f.AUATAUSH5`HA1H/9Hw!D)HX!E1E1DDHLOHA!HM!HD[]A\A]Df.ATUHSH=-|IHHHdH%(H$1e(~AHHH7H$dH3 %(iH[]A\H5 1H/8LH6H=&H&HH6E1E11ɺHCNtwHR HH5xH[6LHP6LHSH1Ҿ.HHH#tH5LxH5LH5HS1ҾH.HHH-HkLH5H'fDAVAUIATUISӃH8>Ht H=y >HH >E1@HH{AHt_L'*uMcH7 >KdHHt:H52wL4LL4LR[]A\A]A^[]A\A]A^LL;1[]A\A]A^ H51L15LLE4E11ɺL^K@H=y#HHLLE1{fDAWAVAUATAUSI1HHH50HL$65I4$HjE11ɺHJH5xH?11H(=AAEIl$MlL%x.H={x LHI9tsHuH-3HHPHOELu LLu)Iv I1LHL=>L}I9uH5wH>H5wH85H`H5YH߉2H=o>tH5Hv2H5W>Hg2H=Zw!HItH5`HD2LH92H5FH*2H5vH4H5GwH 2H5yH1H)H߉9OH5Hj4HwH6HH5iH1H5H1E11ɺHHHHEHH&HYHR?HHt$ H1ҾH)1HHϴ1ҾH)I1.H5uH߉M3H5uH0H3H߾ H߾UH5NuL1(H[]A\A]A^A_@&Iv IFf.Ht$HH߾胐e@E1E111HGH5uHJ2H5C1H1HahH߉E1E11H8GHAH9EiH1Ҿ%H,[]A\A]A^A_@f.ATIH=d>USHtEHn>1fHH{Ht(L$uHcH*>HTm[H]A\@[1]A\ÐAUATIUSHH=>HIH>1DHH{HtpL#uHcH>HTmHHtLH5pLM.LLB.LKHSHsH[LLE1]A\A]ţDH[]A\A]f.@AUAT1US1HH1H1ҾHыHt4HIt,HLIH1I9sH[]A\A]@H1[]A\A]I)LJ|-"1H@x/H[]A\A]US1HH1ҾHHIHDEtHEuHS,H[]DtfHuf.foGPGTG@GXÐfAWGPAAVDwD1AUDo@ATDgHUoLESDED$A|fDD1D1nA߃AAD@P H@H v'EAB3 EyAB3 EyAB3 DAEEA؉@v4@'Dw@;wAD ED!E!D -$CpcDD1D!D1yZEf.D1D1-*>5+D\$DDEA_DG@DGH[DWLD_P]A\A]A^A_fGX@4GX<@GXtfAWGPAAVDw@1AUDoDATDgHUoLSDEED$ADD1D1nA߃ADEA@P H@H v'EAB3 EPAB3 EPAB3 DAEAE@v.@'t@;w>DED E!D!D -$Cp`fDD1D!D1yZHf.DD1D1-*>5+DD\$DEDA_DDgHG@[DOLD_P]GXA\A]A^A_fDGXGT@4GX<@GXtfDAWGPAAVDw@1AUDoDATDgHUoLSDEED$ADD1D1nA߃ADEA@P H@H v'EAB3 EPAB3 EPAB3 DAEAE@v6@'t@;wFDED E!D!D -$Cp`f.DD1D!D1yZ@f.DD1D1-*>5#DD\$DEDA_DDgHG@[DOLD_P]GXA\A]A^A_fDAWAVIAUATUH,SI9fGXIAVGTGX<@GXuϋGPD@_DDGH1DOLD$AE\$DD$DL$xfDD11nE܃ADAA€PAHʃLAv"^AAB33^3AEDEAEv%'v;w3DE A!D!D -$CpmDD1!D1yZXDD11-*>5CfDD\$Dd$DDD$DL$I9G@GXD_DDgHDGLDOP[]A\A]A^A_@f.SGXHGX<@GXu$CX<@CX|<8u1C;fC9CTC?CTS8 C>=<@CXSTCX<@CXtTKTCX<@CXt[H8CX1UDH CX[f.HCXDHCXgf1GXSGXHGXP@WXu,Jf.CXP@SX8u1C;fC9CTC?CTS8 C>=<@CXSTCX<@CXKTCX<@CXtLC@ȉC@CDȉCDCHȉCHCLȉCLCPȉCPHC@[fDHCX1DHCXf.HCXjf.HxCX)f.[1GXAUATUSHHHT$dH%(H$1>I1MfoHl$Ll$D$`)D$PD$dD$hMM9tKT$hIAD$D$d҈DD$hP@T$huHM9D$huf.HH@D$PH$H P1ȉD$PD$TȉD$TD$XȉD$XD$\ȉD$\D$`ȉD$`DIAFDVDVHHuӺ(HƄ$!H$dH3%(uH[]A\A]ATU1S1H+1I1ҾHMtBHHt:HHLHT1H@#[]A\f.[1]A\ffDk>fSHcHdH%(H$1k>x(u\H$dH3%(+HĠ[@H=Hgk>HHH5H Bk>HT$H~D$HD$HD$Ht$H5)D$~D$HD$D$HxHL$H )D$ ~D$HD$D$H`HT$H|)D$0~D$HD$D$HHHt$H5d)D$@~D$HD$D$H0HL$)D$P~D$HD$D$HHT$)D$`~D$HD$D$HHt$H l>)D$p~D$HD$D$)$w+H$dH3%(u~H|HĠH[H$dH3%(uSHĠH=[80H=Ht80i>mDfi>fHHc5Qi>`HfDSHHdH%(H$1HËi>x'uT1H$dH3 %( HĠ[ÐH=HAh>HHH5H h>HT$H~D$HD$HD$Ht$H5)D$~D$HD$D$HHT$H)D$ ~D$HD$D$HHL$H )D$0~D$HD$D$HHt$H5)D$@~D$HD$D$HwHT$)D$P~D$HD$D$HfHL$)D$`~D$HD$D$HUHt$H i>)D$p~D$HD$D$)$wHcHH|*BDH="D80LH=YK Ht80f>ff>f.fAWAVAUATUSHHhHT$HHt$(1dH%(H$X1D$H`HHD$1HHHD$ HD$LE1HD$0HD$GHD$8HD$PHD$H$PHD$@H\$1LH&HH$LD$0HL$81LH1LHLd$LD$(H ]I1L/L A$I!%tHl$ADIT$HLD@ƾ/II) LIL L/H)HHHH\ HI MHuLt$H¹HLƄPL H!%tL$PMDHJLljHD@ƹHH+T$L)HtI)LHBƄ4PUT$GD$Luxu$PH<$辄IL9l$ H|$51H$XdH34%(Hh[]A\A]A^A_f.uuH$PH<$HHt$HƄP QHT$H5Hٿ1mH\$H~H5wVHHHH$PL4$DHH¾HI9u;HLXHIuHh |$Gt;H|$$HT$H51E1t$NH|$@mWHT$H51vH5zHڿ`Cq US1HHu1HH߾uHH~fH*.H[]f6TfVH6UoDATUHcSHHGHW0t$ Ho H)HH9QH+G8@BE1)H9}HD[]A\@HT$ H5H,RuHcL$ HCHAHH9EsHEHD[]A\DH9tXHOHcHH)HO~BLNHMD HIAL) DHOHo@HFHL9uÐHWHHf.HH~t HGH'F'FwHO HWH+Hf.HG HHGHH)HfHcHOHHx=HG HH9s(HHAHHHHL1HH9uHW@HHWLGHG IHHcHH0HI9H5HFHcHHH)H9v%HHƐoHHoONGH9rHH9s'HfDoHHoNJFH9rH9v#DoHHoIHAH9rٹ}hعtpH8H;Lع)EH D9#׹)HHHL HH)H fHcHI0HGH@HG HHcHHH;Os)~0HcHHH;WrH6oDH ЁٹعH0H~t*LAعA)EQ E9׹)HHHLoع}A@tH6F zHB mٹ}XعLH rAxMAعA)EQ E9׹)HcHHI 1fHOHcHHDHcoHHWDHGo@@HOH@HGHW ~4HcH HH2HH9HFoH@HGٹ}Hعt`H HytLع)EH D9׹)HcHHI0@HcHH0Ho@HG@HOHQ@jHG ~0HcHH0H;wsHH9tFÃٹ}@عtHHztH ع)y 9˸׹)HcHHH랐HcHHwHwH@fDH=HcH@f.HG ~8HcHH0H;wHrH>Pf fٹ}HعtPHHztH ع)y 9׹)HcHHH1fDHGHcHHHwHF@uHG ~(HcHH0H;wHrHxٹ}Hعt`HHfztH ع)y 9׹)HcHHH1fDHGHcHHxHwHF@uHdH%(HD$1HG ~THHcHHH;Ws1zt HH{!HL$dH3 %(HfHٹ}HعtXHHvxtHع)y 9׹)HcHHH1rHWHcHH\DHwHV@JVfDHG ~0HcHH0H;wHrH@ٹ}HعtXHHztH ع)y 9׹)HcHHH1fDHGHcHHHwHF@uHG ~8HcHH0H;wHrH>PG fٹ}HعtPHHztH ع)y 9׹)HcHHH1fDHGHcHHHwHF@uHG HHcHHH;Os9~@HcHHH;WsHvH9tH9t H1R*f1DH OٹعHxtHع)x 9׹)HcHHHٹ}XعLH AxFMAعA)EQ E9,׹)HcHHI 1fHOHcHHDHcHHWHWH@HOH@FSHHOwoAHAHOHQHHIHk[DHG HcHH0H;wIsI~PHcHHH;Ws+HI9tH9t 1LٹعHxtHع)DH D9׹)HcHHHqfDٹ}pعLL*Ay.MAعA)EZ E9A׹A)IcHHM2HcHHWHcHHwIDL "L'L$HGHP@HwLF@SHHHs@HtHC[@SHHdH%(HD$1HG ~pHcHH0H;wHs5xu<HtHD$dH3%(H[DHxtHHft$볐ٹ}Pعt`HHztH ع)y 9m׹)HcHHH1RHGHcHH8DHwHF@&~@f.SHHdH%(HD$1HG ~pHcHH0H;wHs5xuHC[]@A\H}HI@tHCAoH@HC@[]A\fUSHHHG HW~KHHcHHHH9HCHE1{Et{HHHHE@H[]@ٹعHHNxtHع)y 9׹)HcHHH1{H;H I@HEHPdAo@@H[]ÐHcHH20HGHX@#ATUSHHO }HcHHH;GHsZHH?ZE1}EIHSHHL"AL$HB@ɉJHCHsHC[]@A\@H-9ٹعHH-xjHع)y 9T׹)HHHH,:@H}HI@7HCAoH@HC@[]A\fDHcHHGHDHGHh@f.ATIUSHHG HcHH0H;wHs?E1}EtFHSHHHBL"BHHC*HC[]@A\H-E1}EuH}LI@tHCAoH@HC@[]A\fٹ}Pعt`HH-xUHع)J 9?׹)HcHHH,2$HcHHwHDHGHh@USHHHG Ho~CHcHHH0HH9HCH8HuoHCE@H[]ٹ}HعtXHHztH ع)y 9׹)HcHHH1fDHcHHD5wHGH@cUSHHHO Ho~KHcHHH :H9HCH8H(oHCEHP@HSH[]ٹ}HعtPH HytH9ع)DG D9׹)HHHHfDHcHHnHGH@`USHH(HodH%(HD$1HG ~kHcH aHH0HH9HCH$H8HD$9oHCEHP@HSHL$dH3 %(H([]@ٹ}Pعt`HHytH9ع)DG D9x׹)HcHHH7]DHcHHD5GHGH@3@f.ATUASHH{HGEHH{-E(HCHx~H[]A\ِf[]A\DHHhfDHG HHcHHH;WsYBt`t9HWHH 1HtHGH@EHHGHHPHBuHHP(Dٹ}Pعt`HHNxcHع)DA D9K׹)HcHHH10HcHHwHDHGHP@ f.HG HW~DHcH HH0HH9HCHHHH HJH JHWfٹ}HعtPHHvytLع)EH D9׹)HcHHI0@HcHH2wHGH@jATUISHHHGHx@LHHRE1}EIt>HSHHL"AL$HB@ɉJHJHC) Hk H[]A\H}H\I@tHC@@t*HuF t HPB tHLD$HCLD$o@HAHCH[]A\@USHHHG HO~KHcHH0HHH9HCE1}EHQt{HHHdHSH HSH[]ÐٹعHH-xtHع)z 9׹)HcHHH,2{H}H|I@tRHSB@t*HuF t HB@ tHLD$HSLD$oBH AHSH[]fDHKHQHcHH,1HGHh@ATUSHHHO ~}HcHHH;GHsZHHoPE1}EIHSHHL"AL$HB@ɉJHJHCHk H[]A\@H-iٹعHH->xjHع)y 9T׹)HHHH,:@H}H贿I@7HC@@t*HuF t HPB tHLD$kHCLD$o@HAHCH[]A\HcHHGHDHGHh@f.ATUISHHHG HcHH0H;wHsCE1}EtJHSHHHBHJL"BHCuHk H[]A\H-E1}EuH}LԽI@tHC@@t*HuF t HPB tHLD$OHCLD$o@HAHCH[]A\@ٹ}Pعt`HH-^x!Hع)J 9 ׹)HcHHH,2HcHHwHDHGHh@f.USHHHG HW~sHcHH0HHH9HCHuH HHSoBHE@ HC@@tHuF t HPB u~H HCH[]ٹ}PعtxHH-NxtHع)y 9r׹)HcHHH,1WHcHH,2@H言HCH HCH[]DHGHh@USHHHG HO~[HcHH0HHH9HCHuHHHC@@tHuF t HPB urHHCH[]ٹ}HعtpHH-FxtH8ع)DG D9׹)HcHHH,7qHcHH,1`HHCHHCH[]DHGHh@3USHH(dH%(HD$1HG HcHH0H;wHspH$HuHHD$MHSoBB@tHuF tHB@ HHD$dH3%(HSH([]DH-!ٹ}PعtxHH-x\Hع)y 9F׹)HcHHH,1+HcHHwHDHP~HSGHGHh@@f.ATIUSHW HGHHcHLHHH9HCڋSHtIHhtxHHHhH3F uofDHLID$$fDuZHH@ID$HID$[]A\HHHh(H3F tE tHL{H3끐1IL$HcHѠ@ٹ}PعtpHHNzH ع)y 9׹)HcHHH1HcHH0HH@(ID$!HOHY@f.SHHW HG~PHcH HH2HH9HCH2HPHV PV @tF t HPB uoHHC[Dٹ}HعtpH HVytH9ع)DG D9׹)HcHHH7|HcHH0kHhzHCHHC[f.HHW@>UHcSHHHH)HHwHMt ft>H4@tH[]HC HSH9PsHPH[]HG L@ HH0/:f.ATUSHH HWdH%(HD$1t&H HcH HHH9HCH+C8HcHH)MHJH $t ft[H+K8H5HIH߉l$It!H|$dH3<%(H []A\@HS HKH9JsHJ@HH+S8Lc HHML$ MD$0IT$8HIT$(HAD$B ЉfAD$B9ID$(fAd$BH1Sfٹ}Pعt`H?HLع)EZ D9׹)HHHLHcHHfHCH@@f.AUATMUSHHH8dH%(HD$(1H HIHHLHD>JHLLH}IuHEL`A|$ u'HL$(dH3 %(uOH8[]A\A]f.HEHx@޳It$ oHB@tHFH9uHxHGxFtH@AHHH@H7VG Ðf.AUATUSH LgYH HHcH@AD$WH[]A\A]AD$WH[]A\A]DL1v7AD$WH1[]A\A]1H1[]A\A]@It$It$H[]A\H A]DIt$At$H[]A\%A]@El$WAD$WHƠL6HEl$W1A|$UA$A$H[]A\A]D((A$LA$H[]A\A]f.fDHcLH IT$HHF6HCHx1HEl$WS|fDHX~fDH7SHHG HW~PHcH vHH0HH9HCH0HH֮uHKHQHS[@H{HWHS[fٹ}HعtPHHytH9ع)DG D9׹)HcHHH7|HcHH2kHGH@^USHH2t>HCHx~HH[]E}DH[]ffHoH5se1>?HE@@EHCfDHcSHHW Hw~-HHHH9HHCH HC[fD=ٹ}I=عtbH HytH9ع)DG D9׹)HcHHHfDHHHHC[fHGHP@nHHGt H@HHGHHGHPH0@USHH@HSHHHCHBGHSHx~H{HHE([]Ðf.HG HcHH0H;wHsYH@?t`&u>~:A 92HcHcHHHHWoHBHWD1DHH@?uHq~;V֍BHcHHVXHHD HHBHt}HufDٹ}PعtpHHy3Lع)EH D9׹)HcHHI0HGHcHHDHB@HGH@f.HHG 0HcHH0H;wHH0@?&ub~^F 9VHOHcHHAoAHHHGH;bt)A@t#F tHQB tHD$gpHD$1HfHH0@?pHN~;QʍBHcHHQXHHt HBLHHtHWHJoBHOAA@@tHVI9xHD$qDLZMHHH\$HHH =H 1f.SHLO dH%(HD$1H$AABtfIHH8G t5HW H;2tiD@IHL HH;1tGI9HcuIA H)xIIHH)HHH9|`HYYH\$dH3%(uvH[1HGHHPXHHHtHBH?H$H $H5H1褿HIA(HH+G8HHHuHt;t7HG @BtH@(HG(H11f.Hff1xH9HILHSoHBHS{ H[]A\A]DHEHzHu O AH)H)A9McLHHH˨f.HCxFH@1DHx J{ vHS Hs8H Hz8H)HH:HJ8H[]A\A]HG HO8HHx8H)HH8HP8HU(H+W8DLe HIHIc@1fHCAUATAUSHH &HnxEBHEtHHEHzHu O AH)H)A9#McLHHHCfL`H;k HEHL)IcHH9EH:HILHSoBHHS{ tEH[]A\A]f.HU(H+W8DLe HuHHIculHS Hs8H Hz8H)HH:HJ8H[]A\A]fHG HO8HHx8H)HH8HP8HC1FAWAVIAUATIUSIHHdH%(HD$81 A<>ML$xMASE1uM3H-NLL|$D$ MM@L<)HcDH1MtAEB AD$7HuML|$fLL\$GHtL\$IEAoH@IEA} LLHMA~&IFLHhHÝHIEH@EHIEIFD$ D$(@~7Ld$ A@JcTLHLIFDI;P|DHL$8dH3 %(D$ HH[]A\A]A^A_ÐMAF AD$4A~&IFHP AT$6@ AD$5mMoAEBq YIEPBHHHp(HHzHW8H)HHcƋЃ?# H ɥHcH@Mt/AEBt(IUHHJHQHHtIE(H+A8HHHAD$(fDMA~&IFH5bHPhHHJP(@,HEAT$,HAD$0HIt$ HDID$I|$8H<L\$DL\$>HD$ @HID$HӢHID$@AD$4HfAT$5H5uHID$,It$ ID$.f.IE@HIE`IEIE1LXM]AIL$L\$oHID$L\$ @HPHID$ID$IE IM8HHp8H)HH0HP8HG HO8HHp8H)HH0HP8 H[ID$HlD$ fDIWHHID$H*R1H ID$=ø뼸뵸뮸맸렸뙃?B4@USHIHhdH%(HD$X1Hu??H\$fD$H5H1H\H\$XdH3%(u4Hh[]DH\$H4$Hr<L$ HrL$L$ 製SHHHu H3HwHG8oFoHFHHG"@USHHHT$@HL$HLD$PLL$Xt:)D$`)L$p)$)$)$)$)$)$dH%(HD$(1HCHk Hx~HHt$6eHt$H$HT$HD$D$0HD$HD$0HD$ 轴EBt:HUHHzHwHHtHU(H+W8HHcҋ HWhHHHDAUATIUSHHHHHIH5ƞILLH1HFHFHAUATIUSIHHHdH%(HD$1~u$LHL]HHHDf.ATUISHHHdH%(HD$1~u&HH$LH'H5@HH11HHLD@f.ATUISHLHHӼHHIŽuH5HHH5LHH1hATUSHHo DuUAtOEB@A{ HM(HK([]A\AtEBE1@HEHM(HHPHHz8HrHH)HHtHcЋt'HC(H9vHAtH)HHDDD9tHHM({ HK(aEt ǃHCfMB@HHM(HHHE(fEB[]A\A.fATUSHHXHtHlHk@s HHXucHtTLct{uhH5@H#I$@@AD$HC ILcL9`sL`H胶HGHPHWHSoBFAoD$A$HDf.AUATUSHHHH>HHPHHtfHGLcPHPHWD(At^MttLRHtrH3LCXHK HSEH3HHH[]A\A]^9fD3)ALcPAuMtbLHt:H3HSXHHHLH52HH5LHܜfHHdH%(H$1H<$Ht$HT$DŽ$fD$HGXH|$ HyXH|$(HD$ ҹuHt$H<$HD$t$HD$ H$HBXf$H$dH34%(uH辶@f.AWAVAUATLcUSMIHHLcH_8LHMILLD$萑E9HE8}6AMLD$D)LJTHHLf.HH9uJT DHU0HUHH)HUHU@Htf.H HH)H HRHuHU HtSH\$~T$HD$~L$flfl@HJ oHffH)HBBHEHJ HRHuH[]A\A]A^A_SH=@BbHWH+W8HT4@B9~ @BH[D@B@B~CHnH5H1USHHHW HGHtf.HJHRH9HBHuH+E8HH@BX~B=;B%CIt @B@BO9 H[]f[fHH[]fSHGHHW0H)H~ HHC[Ð@BlH+G8H@B-9~ =@B.HHHCHHC[f.=@B@B~ԾCHH5*H1f\ff.AVAUATUSHdH%(H$1LMt~HtrHo HGHO84$LeT$(IHW0I)Hl$xI)H)H@~aH@HHHEƃfMBAHC8ƃIILeLkfeBH$dH3%(u~HĐ[]A\A]A^Ð@BdLH@B~=@B@B!HHC`9~=@B߾CHH5חH1^@AUATIUSHHH^@ID$Hp(Hu(fI4$HE tEfftS9~&O1HHoHH9uHHH]H[]A\A]~&y1HHoHH9uHc1HHHuH[]A\A]HF?H HDoqH+W8L$ IպvHU8L$ LfD~dDA1IIfDoHI9uWLcL)HLHDHHTfDHH9u@1ff.AWAVIAUATUSHL dH%(H$1HtWAGB6tfAGBIG(HfA@fIW0LAW I^HcLHLH)HM~ HD$@Mf`L-H$M9AGBtfAGBIG(IfA@$IW0LAW IvLcAMAW@IIM)RIwHN(IN(fIIv tRffDD9E~,Ay1HHfDAoHH9uDHIHHM9IV H$dH3%(H[]A\A]A^A_@LpLM~ Iw1IFI9GIG~'P1HHAoHH9uLIINQfDMDAoDI~8MI)MAIN HD$@H)HYD$hH$H)I~0H)H@H@LT$0LD$(HqAƆLfIBT$ LL$D$HL$H4$AI~8HL$AƆLT$0LD$(HHT$ HYInfaBLL$D$IDDX1IIf.Ao89HI9uALA)HMH|9IJDfDHH9u@IFI9GIGfA@BHH@By9~ @BuLLT$8HL$0L\$(LD$ T$LL$D$IvLT$8HL$0L\$(LD$ T$LL$D$bE1E1D@B~(CL;H5NL1f.@B[Ld@HHdH%(H$1H|$Ht$DŽ$fD$HGXH|$ HzXH|$(HD$ uHt$H|$t$HD$ HL$HAXf$H$dH34%(uHfAWAVAUATAUSHHHHOEHS0?H)ʃo&n}HHCH+k8Hx~H S@BHCH+C8H@B=@BCHH5H1@HEH)HHIDALpE~ L9L~HSH+k8Hz~HDD$ D<$iR $DD$ @BAHSH+S8H@BT@B@BMHD$Hk8D$A~ AV {A9}FHsD)HHHFHLHH9uHHHHHCHMHC LhM;IIV8Lk IM LIMfEe@ImHKIU(fAMBH[]A\A]A^A_9~ =@BgHHk8HHIƋ@ LkL9sIELH)HHPH)H~IMAoHKEw@HELpH@_HCH+k8Hx@BHCH+C8H@B9~ =@BHfDHH9uHHHHS)DIEH1IU(@BtH@(@?%t}HߺIm(H1[]A\A]A^A_f.9Y@BFDHH $DH $I@BfD"fAEBo@HE1H@HAHH>@f.AWAVIAUATUSHHcdH%(H$1HGHHH)Ѐ HkH_ G HC8HG8CBHHC HtHS0IVHHHH)HLHD$@M~ Mf`L-H$M99AGBitfAGBIG(IfA@vIW0LAW IvLcAMAW@IIM)-IwHN(IN(fIIv fffDD9wDX1IIfAo89HL9uALA)HMH|9IJDfDHH9ufHIHHM9IVH$dH3%(H[]A\A]A^A_@cofDLLHM~ hIwIFI9G|IGs~'P1HHAoHH9uLIINfDMDAo DI~8MI)MAIN HD$@H)HYD$hH$H)I~0H)H@H@LT$0LD$(HqAƆLfIBT$ LL$D$HL$H4$AI~8HL$AƆLT$0LD$(HHT$ HYInfaBLL$D$IyDHp%LDEAy1HHAoHH9uA@BHH@B~I@BCLpH5L1E_1E1D9~ @BLLT$8HL$0L\$(LD$ T$LL$D$ IvLT$8HL$0L\$(LD$ T$LL$D$I@B胠L&fDAWAVAUATAUSHHHf=fHKEHS0?H)ʃl&{t~H HCH+k8Hx~HeH@BOHCH+C8H@B=@BCHH5H1MDHEH)HHIDALpE~ L9L~HSH+k8Hz~HD$D|$GL$D$@BHSH+S8H@BT@B@BLHD$KHk8D$A~ AV A9}FHsD)HHHFHLHH9uHHHHHCHMHC LhMSILk IM LIF8fEe@ImIMHKIE(fAUBHLfH[]A\A]A^A_D9~ =@BVHWHk8HHcIƋ@LkL9sIELH)HHPH)H~*IMAoHKEj@HELpH@_HCH+k8Hx@BHCH+C8H@B9~ =@BHHk8HC LhMHC1Lk fEe@ImfAMBH@IEt1HEHAH{HcЉHLH)HHq@Luf=f=VH7=@B@B/HDHI)IcHKHA9DOE=EHHAHLHH|9 fDoD0HCH@D0H9uIIJ4 D9@HFD)HHH|>fDHH9uHHHHSDH1IE(IE@BtH@(@?%tmHIm(fD9A@B.DHH $H $I@BfD"fAEBHE1HHHH5,1mf.AWAVAUATAUSHHHff=fHKEHS0?H)ʃt&t~HHCH+k8Hx~HB@BWHCH+C8H@B=@BCH6H5IH1DHEH)HHIDALpE~ L9L~HSH+k8Hz~HD$D|$AL$D$@BHSH+S8H@BT@B@BLHD$Hk8D$A~ AV A9}FHsD)HHHFHLHH9uHHHHHCHMHC LhM[ILk IM LIF8fEe@ImIMHKIE(fAUBHffH[]A\A]A^A_D9~ =@BNHHk8HH蓙IƋ@LkL9sIELH)HHPH)H~ZIMAoHKEb@HELpH@_HCH+k8Hx@BHCH+C8H@B9~ =@B{HHk8HC LhMHC1Lk fEe@ImfAMBH@IEt1HuHAH{HcЉHLH)HHx@Luf=f=NHg=@B@B/H?HI)IcHKHA9DOE=EHHAHLHH|9 fDoD0HCH@D0H9uIIJ4 A98HFD)HHH|>fDHH9uHHHHSDH1IE(IE@BtH@(@?%tmHIm( fD99@By&DHH $H $I@BfD"fAEBHE1HHHH5\z1f.AVAUIATUSH dH%(HD$1G T$ HG`H9G HEf=fAHcD$ I^H5yHH)I^LH@@CIFHL$dH3 %(H []A\A]A^<eHcD$ H_H5qyHH)H_H_HcH5yHH)H_of.fA1H5:LfAHT$ %D$Ld$f.IV Ht*BBHtfCBH[HuAF I^H5exLH@IV @CD$HI^HZffEfADHs8Iv8LD$H)D$$H5wLHE@@ECBHuI^ IvA1fAHHPH@H9HBHuI+v8LHA@Bn~q;B4EIt @B@BOA9~L&fDHC(LLI D$=fIFo@EfDIFHoC\INHH I@ɉK9+f.1ffHft"HGH9t5H5v1HG G LL+G8@BL@8t1HH5v1bHHH tHP0HcHHH)HWHH0AWAVIAUATUSHHHLLg DfD$AuIHD[]A\A]A^A_ÐI^8LHAAIFo@D$HKMINMf EfAt@ID$Md$H9HBMuI+N8LHA@BY~";BLCIt @B@BOA;"LH5tLH@@C.|fDIFHǐf.AWAVIAUATUSHLH_dH%(HD$x1HL$H$~D$$Ht$HT$H5&HD$0D$<hHG8HD$@)D$`fD$LH$HD$PD$\HD$HD$(Lw D$AHT$(Ht$1LM iHcT$f.@USHH(dH%(HD$1HFHtZHWHJHHL$wZL$HHQtfDHD$dH3%(H([]DO HHHL$vD$uHKHt$H;SCuHKHt$H;SHL$CmDD$sHNHt$H;SCWHKHuH;SC:fHKHt$H;SHL$Cڊf.AWAVAUATIUSHHxJdH%(HD$h1HhH9H\CAU(T$(AU,T$$AUAmT$Ll$HH|$XL%pHL=pE1H|$H|$`HH|$fMU0MAR?T$`vIcL@CD$`WHKHt$`H;SAU(CT$(@HKHt$(H;SAU,CT$$HKHt$$H;SCAU T$`Hl$`HKH;HSCAU T$`HKHH;SCAU T$`HKHH;SCAUT$LIHKHt$LH;SCIcUHuHtHKIu8H;SCAml$HJHKHt$HH;SC3@Aml$D~6DeIUXLt$`1IIDL*L$`HI9uAm l$@~2E1L$DIE@IuhHH<(H8I9uCSAml$<Am$l$8H|$,IMPHL|$0E1H|$H|$`HH|$H|$4H|$J1L"MA|$DI|$HWHHT$`T$,]Hu HtIMPJ1rt$0R T$4IL9uSZAml$,\H|$`E1HLd$#HH|$CL$#HHQtuHKIwH;SCDII9;CIUXN<2MATIHOHHL$`vD$#uHKLH;SCuHKHt$H;SHL$`CWI:HCf.IL9vfDAT$`uHKHt$H;SC@AD$XuHKHt$H;SCIHT$PfDLT$HKHt$H;SLT$CAR?OIcLfDHKLH;SIUXCL* L$`HHKLH;SL9CIUXD$<D$8p1HKHt$8H;SCf.IHT$PHKHt$PH;SCt@D$,+HKHt$H;SCHKHt$H;SHT$`CHKLH;SIMPCBT1 T$4IHKHt$H;SI9CIMPJ1L"M>D$`}HKHt$H;SCYDD$`IHKHt$H;SI9CHD$hdH3%(Hx[]A\A]A^A_DAT$ HAO HfHKLH;SHL$`C-HKHt$H;SHT$`CHKIt$f.D$,H1HKHt$,H;SCfHKHt$DH;SCAm l$@*HKHt$@H;SC@HKHt$<H;SCS6Am$l$813fHKHt$fDIPB *A@ DA{UuISxIR0MSxH[]A\@mIIR0MH[]A\DL߉D$ LAPD$ @O@1AUATUSHH_pK ȃC CP/L kILtvILvtMu Hc MHHS HC0HDH1H{ tK HHHD8HE H[]A\A]fDHCHGpS <HK(E1AHA9}0@tHqF tHS AHA9|D HHE fHC0HGpH{(HtG G S LKK E1 AA9s7DHHC@@tH0F tHES AA9rfLCHcHLL9wHI L9[APA@@t܅tIpF J@tI0F tHfHCHHGpHGxHCHH_xK HK8H_HCH9r9fHH9s'A@tH1F tH`HCHH9r}U}VHcS H HHHHE HsHCHHGpt F { @u&f}Ut/@@H9HDHtHHpH9uB@tH2F tH{ fDHCpHGpHC`Ht@ tHC`HshHt F FSE11ɅHI9}5HC0L@@tH0F tHSI9|fSE11Ʌ:fI9}-HCXJ4HtF tHSI9|@HcC ~HE11fI9}-HS@J4HtF tHzHcC I9|HcS$~IE11fI9}*HCPJ4HtF tH*HcS$I9|HcC HcsHcKHLHcsH AHcCHHHHHE fD1fD HHE fDI@@ A@ DS @HAPH /HcHHHS8H9sAHH9wH;[PH{@HHSPH@HfDMHHE1 fF HHD$HD$K LCs E1HcHLAI9rcI L9vOA@AP@ttIpF EuA@@tI0V E1ɄA먀}UtQEaHS HC0HI@@ qA@ dHHS aHExS HC0H]xMHZ(HAWAVAUATUSH8HodH%(HD$(1EU< H5UIHcH@HHt }VEU1@HT$(dH3%( H8[]A\A]A^A_DHcEHwHjH]HPEHC"H6H)H~H[H8HHHHHHIc1HH)Љ}IcHH)E111VIMHKAuHQHH5pKL1_XB`HOyUvF QT ЈF fHz LyIB@z <"wIcLHApHBpHQpHHApHBHQpf.HApHB0HQpfB @z Hq HDHA fDHB@z Hq HDHA fDHApHBHHQp{HrHtF u<HB@z Hq HD(HA B @HB ?x H@)HHT$HT$z DHGf HPxHV0HpxÐf.HOyUv@HHB tL HHIApA@ V"wIcL@HApI@pLApHHApI@LApf.HApI@0LApfA@ A@ HQ HDHA DA@ I@HQ HDHA fDHApI@HLAp{IpHtF u;A@ I@HQ HD(IP HA A@ @>B IШ*HA@ Df.HGHf HPXHHHDf.USHHH_H18ST@hP HSXHHCXH[]fHnu HFH9tfD1ɺ 8ff.F u HtB tDAWAVHAUATUSHHHLgHI$h^HteAD$U<wC AT$T ЈC Mt$`I9tOIT$XH9uHHH9uHHID$hHI\$hK H[]A\A]A^A_M.L=FfDHEPTփMTAE IMǃ@t AE H,M9uUM.IAE<"IcLAE P HcL1HF7M.Mrf.Ml$`IEHPLHAM.LHM.IEHP(AM AKtHtHnu HFH9thAM DI9Ӎ ILH6M.ILHAU H MIT$XYE1&1ɺ HLD$B6AM LD$z1Df.AWAVAUATUSHH8LdH%(HD$(1IMghHHfHHHuIGhHt0@HIOhH HHHIGhHuIHLLl$fIH]HHHHCXHHsXV ЃF CU<wCT ˆV FHt$LH@D$i[HtPuDsWDH5qƅCWE1HM1HoDT$HA foD$AHEHE H+M8fHB DT$HE f`BDDsWIH]@IwhAGTAGVE1[TAރAI ؈F HIHt)It#F HDuI$HI4$HEMoXIwXE1XTAރAI ؈F HIHt)It#F HDuIUHFIuHEMIE1XTAރAI ؈F HIHt1It+F HDuIUHIuHD$(dH3%(u0H8[]A\A]A^A_ÐIGhIHD@LWf.ATUSHoEUr If.LxEUs[]A\f.AWAVAUATUS1HH8LgdH%(HD$(1It$A$H~AHH ףp= ףHHHH 2H?HHH)HcHHH9A|$WufA|$U HH)H}A|$UIc$HLHHHH4HL}IHAuLE1Ld$-AI~AA9FH]HHHHSXHHCXH ʃP {UWwST шH HD$@LH@D$dWHkP\DDkWH5hƅCW1HME1HoDT$HA foD$AHEHE H+M8fHBHU DT$fbBDDkWHf.HA|$WH9H@LN @AHD$(dH3%(uzH8[]A\A]A^A_1@IT$(H(\(HIc$HHHHHHHHH9}HHID$ID$LH)H躴vTHMH>AuHQHH5>H1KAUATUSHHLgtAD$VAL$ULu$A@HCUAsH]CUAArfHCUAsH]CUt#A@HpCUAsH]CUtAHHCUAsIT$(H(\(HIc$AD$VHHHHHHHHH9}HHID$ID$H[L]A\A]H)H0AT$TIt$XAD$UуHthF ǃ@t/I L1҈F I}tLMl$`fDHHMl$XID$XCH]CUID$`LjE1HYATAUSHH=HDH3HH@f.AUAT1USHHH 1ɾHI.HIuH54H@HH贮1MLLOH HHEHMtH[]A\A]fDHLH[]A\A]1遬USH3HعHZHSHxHtHuHH[]Hv3H5v3H1ȢfDAWAV1AUATUSHHӳH1ɾHI HItH52H@HH萭H HEHEA4$@tBH=h3'HHt1A|$+Mt$tMt$H5bLILIGI9tH*3HMLLKHHEtH[]A\A]A^A_DHLH[]A\A]A^A_1DSH2HHgHxt5H8t/H1H߾FHPHH@HT$HD$H1[ATH1USHHxtqHI>D`A~H2HVIcHSH1qVHߺ>UH5HU[]A\H51H1蟠yf.SH1HHWHxt8H0H߾1ҾHXIHIH/oH5p-H@HHHH5$HELHEEHHEtjH-عH6^Hv-H߾عRT[]A\H,HLHxtEH8tHH5+HLH1nH5+H1Ϛf.AWAVIAUATAUSHH(T$ dH%(H$17LCucLHkAL>UD+D$ H$dH3 %(>H([]A\A]A^A_DuH'+HFEDt$ L<$D$HD$@HD$1Dl$E$.HADA)0;1DH*uPaOl.n]H$D$<HD$0>H|$0HD @AGH|$0HfHGH;GHPHHWDAD$8fA uӍPՃ/0HHcE1DQ1:@BD@HGEPH9GDT$<lL@LGLcD$8FAfAvLcD$BH|$0;HcD$tHDHcT$<oD@HGJH;GL$<FHPHWD$8f.Ht$9Ht$HcH|$0D$8HDQfA !I@HEL<$HL:IH߾3HHHcT$<D@HGJH;GL$<HPHWPՉD$8#HHcDQwHcT$[@f.HH,/51Hff.ATUHSH5fHH*Y<D$(tCtHHH5=[]A\1ffDD$H>H[]A\@H3IH#I9HMyHLH9fL)HH*XYD$H,L=H[]A\@HA譞HHHHHgHԋXHYH贋SDf.AUATIUSH^'~Z~pD`޹Lo1ED9uL*H[]A\A]H|Lý@f.AUATIUSH&~Z~pD`ډL0ED9uL)H[]A\A]Hv{Lwý@f.SHHH$<*~pHۚf.sf(ztsf.kztW$T$/T$$f(/ $^f(H6;H[$/@$1@$.ff.USHHHHž 1H9H@=H[]SHm,H:[@f.SH™}/He:[@f.SHH莙D$H߾ӚT$f(f(@2H:H[f.SH2 4H9[@f.SH.H9[@f.SH"(Ht萖HH9[Ðk)tH5!H9[ÐH5H9[f.SHH)HIff(f(f.%fTf.f. T$rf.f(H $8T$ $f.zft\f(Hk8H["fHO8H[@f.qH,f% fUH*fTXfVAfDH,f%fUH*f(fT\f(fVH,H $7 $T$@f.SHHHT$dH%(HD$1.T$u1H߾tH,7HL$dH3 %(uH[ÐHHE7*@f.SH't.1H߾.HHHHHHH6[H߾fTH6[ff.USHH&tH&uHH軕H߾D$訕L$-+HE6H[]f1ҾH-HH@Hw,HuHr2H蛄1H61H߾i-HHHH5SH%Hf(%f(fTf.w+f. {ryf.wcf(HW5[H,f%'fUH*fTXfVf. %sf[@H,H5[ff.SH$H f(%f(fTf.w+f. rf.wkf(Hw4[H,f%GfUH*f(f(fT\f(fVf. 9sD[@H,H+4[@SqHʷHߺ1+>H5=1H誯H3HHvBH3HH߾RBHH3HH߾,BHHj3HH߾B[f.DAWAVIAUATDUSDIHH<$9D9HcH$IcHADD$ HMLLhLEHI}HAUHDD$ u=Ht8IthH<$DD$ EI}HHLAUHDD$ t:L)ImEH[]A\A]A^A_ÐDADLPf.H<$kH5[DL1g@f.H5YH1g@f.AWAVIAUATAUSIIHHH_HLEH{Hu0Ht+Ht;LNH{HLLHtL)HkH[]A\A]A^A_@LkAVAUIATUSHH0 ILdH%(H$( 1H׹H 6tH5eH13~AfDHDeLHHH9tULHZ1E11ɺHsHDH(tcDH("uHDDHL1H߾)H5HLH1g}mfH$( dH3%(uH0 []A\A]A^"US1HHKHH[HnعH4HH4HJ(tH[]f.HHHHH 0H;E11ɺHGHuSHH4uH߾1H߾HH߾=H[]DHH=@f.US1ҾHH H>HžعH3HHt3uH5HH/H[]fAWAVIAUATIUSHHMH8 ILdH%(H$( 1A>hL5 H<;t5;H!HIHHHH)L-1ҾH)'LLHHHIsHH5L#Ht:HH$( dH3 %(LH8 []A\A]A^A_fDH5 LHV.HHLf.HL<HHH-MtLfLE1UFLLLHߪIfAUATIUSH8HIعH5LHL1H)HHHtZA<$*t3LH&HH1H".1H[]A\A]DH߾.H1[]A\A]fDA<$*LE#HHHkH߾ع4HH{.H߾^LH߾>:H߾ѣHPH߾@>HfD3&HH+H[]A\A] &HH+fDATUSHOH~@HAHھH 3DH(H-#H0Hu[1]A\AVIAUH +fATIUH5S1HI+HHHH)fعH?/H"AHEt5LH*HL8H߾[]A\A]A^}DH H HHHLHH HߺH+fLHH_$AUATHulUS1ɾHHH1ɾHI1ҾHI蕇1HžH胇HMLHHHtH[]A\A]H(HDf.AVAU1ATUSH .HHHPH)HHH(1ҾH!H" ׹HII-1ҾH!HIL7kH LLHHIH HhHH=-HI HIHLHL)(H5HH1(LHHH1Ҿ HH1Ҿ ILH[]A\A]A^H5 H1tf.[]A\A]A^f[1]A\A]A^DHH5H1HtMnH5LH1((LHHZt.@H5LHH1'q@LHM'XATU1SHH@׹HIf+1ҾHHHLTiH HLHHHtW1HH說tVH1ҾHI1ҾuMHH[]A\H5H1s[]A\fDHHe&[]A\HkH5iH1r@f.AUAT1USHH׃H)׹HIP*1ҾHHHEL>hH HLHHHH HoLHD-HIHIHLHL)%H5HH1%HHH%tPtvH1Ҿ H1ҾIHMHHH5H[]A\A]1qMeH52LH1x%HHHuHH$H[]A\A]H[]A\A]HH5H1qAUAT1USHH'1ҾHIHfعHI,LH~(H HH HA<$*t1LHHtAHH1T%H[]A\A]@H߾%H[]A\A]HH#H"H H5Hw#H[]A\A]A<$*LEHHtnHOH߾ع+HH_%H߾BLH߾"1H߾赚HPH߾$5H fHH"H!H H5af.AVAU1ATU1SHL%L5[=A,1H+H51H#H\HO0H6H3عHN5^_H)1H+H53=1H 1ҾHj+DHLH#HDHH3M$MuHdH߾/H HH5H#H ,HH5gHH5H7!HH߾C/H^H߾عHH߾/HH߾عלHwH߾.H߾عq(H߾ H5=HߺЛH߾s []A\A]A^D HL McMAHHH"IfH@H@H@H)@HHHHDHH=HDH!@H @H1@1f.vW1w1fЃPww fDƒBwBG Ã~HD1vwHK:@AVAUIATUISHMH0dH%(HD$(1 BwnH€/0tSED$A|$A$T$ D$H HcHED$A|$A$T$ D$|HHcH@HEHD$A|$I $HL$ HT$LAEIE:@A|$DHt$H/\DCLLHLHD$(dH3%(ZH0[]A\A]A^fHt$ LS/tT$ @Ht$1H0t2f(T$qT$f(fYf.v XDAEAESDHt$ 1L/"HL$ Ht$H.fDHt$ L.T$ I $HUYgf(Rf^GfW3\'f(%^f(f(fTf.H,fH*f(f(%'fUfT\f(fVfDff(% ^/f(f(fTf.yH,fH*f(f(f(T$T$ff(Yf.1# GHF Hu GGff.AWAVAUATIUSH HHdH%(H$1DYHfDHD Hu-E1ɀ+A|0ʿt 1@1H 0I fDH HcHH Jt3@0H9vL9uD9~H5;HHt H[]A\A]A^A_K8NvvKSDLE;u}IcM}AT$H@HIA8WvA|$RAWL}I0IGXHWHpDRP(HD9~QMcL@ HKIHIH; dIDD)LHRITHHH;H7H9uAOAT$AʼnHDHA|$YH{8H5TXLkXHK0IEu(E;u,DQ IE MHIcHRHH@ Ly:DP@xAFL4AE(HAAWDh A9IcIOI>H@HH98t.AA9|AwHTAT$fANAVDHAWIu H{8IU,L wADT$ H$L{XIE HK0DT$ L$Iw IcH5HkHBHH zuz HCHEH{8H1CHH@f.AUAT1USII1HH/H]H}HuHcM HcSLHs8HH HcM HcSLHsHHC8HKHHcM,HcSLHCHE Hs0HHCHcM0HcS LHC0E,Hs@HHCHM8HcS$LHC@E0HsPHHC sHCPE8LHcSHsXC$M;HHLHCXE;CHEIEID$Hx~HL[]A\A]kH[]A\A]f.AWAVIAUATUSHhH0T$IW8dH%(HD$X1Ht$f=f AG- ~=LAoLt$ LLfI0LAG~ k- >f m/ <As9T$L%Hl$ Ll$@Dt$ AGLD$p\$ I0HT$lIW8I0ADDD$ f=f AG-2~='LEw  HLEI0DHAG~_-p>9/<qA8D$ EGLDD$e I0HgLLATDI0DD$ALHADDETD8T$ rIG8I0HDD$HT$t$ DT$fDT$Dt$ D9T$NDt$ fIG8fDHL$XdH3 %( Hh[]A\A]A^A_fDWfD=?W=&= =AAjf.#=$== ;=HD$H@@ 1=Eo=d==u\8D$ AfIG8I0HDD$HT$t$ DT$f\$ DT$NIG8Dt$ HI0DD$HT$fDA+#=i== =HD$0D$ D$(fLx AG~A EfD18f==,=A t@&_A*8+A 1=D^|A==ZA D="=#^=%rIw@zHD$0D$ D$(fD=A=`= A >f&#(*OE1+ mf%wA f=UAA A AAA kA SA ;A#A  AA^|AfD==A of.="=#=%IwwHL$HAAf.L{HL=Hx E11Ҿ-nvHD$0D$ D$(AGHD$0D$ D$(HD$0D$ D$(HD$0D$ D$(fIGHD$0D$ HD$(GHLLAO1HL-% AK=A0AA{`Ht$L_4=CHx E11Ҿ-uHL$HAA3HD$H@@A AA AA A AA AAA ~HD$H@@OHD$AGH@@,Ht$LHL$IGHAHALAOHt$1L+HiH5L*|$ ufIG8I0HDD$HT$t$ fAD$ >RfAWAVIAUATIUSHHHHo0dH%(HD$81$Dm<I1LHH{0L{]HA${=HLd$ HH1LHALHAID HPUrHD$8dH3%(Dm@f.AWAVAUATUSHHH8Lo0DwdH%(HD$(1G(=$LLc0HLLmE"Ld$IC:tw{o=%d[HL~H81LHH{0LO{]PH LHLC:uH{$HsHH4$H{0H4$lLHLL|$ D$D$DHHHD$(dH3%(H8[]A\A]A^A_D(ts.uHC0HHH$}HC{$SHsHHt$%H{0Ht$'lH<$LHL|$ D$D$w|fHLqDHH\f1HH{)D;s(H])HHMH{8H5*HEH1"HH'HshHL,H{0LPkHT$HLHD$ D$D$蛧fDHH{0Hou)H$HH5]HxAWAVIAUATUSHxFdH %(HL$h1Ht$T$D$ XG,?=OHl$ T1HLA,D$L--Ld$@LI0HoIW8I0f=fAG-d~E=LEw HLI0DH耫AG~ A-@2>As/<L=-=,==afD#-= ="E=#=%IwhHD$0D$ D$(fD1=M== tH&O*1ۃ+t!@== udEGLDD$ I0HLLATE.I0DD$ ALH腱AtDA|EHuAGIW8D$f,cH\$L$Mg0H9L$D$ Dl$D+l$PvEmD$L$I09W<})ʈW<HHD$0D$ T$(H茎^|7@=Z#= =zHD$0D$ D$(LAG~ nfDHLjI0HHލHD$hdH3%(Hx[]A\A]A^A_H\$@HD$HsLHD$@T$HIo0 IG8D$=T$HLHl$ I0H\$Wr /X E_ E9^0H3IcV0IO@rAv0HAG t @ =HS0Dh(foD$hD$lHT$8HT$0HD$0)D$PHS0HSXJH\$@D$`HD$L$dHK`@ D$"HHhB(D$BD$1{(fD$ HD$HD$H_HEL{0M'AD$ C)1M=$LsH߃HLA|$ W{,MHeC=uHSAD$ HC0P:P:tQH0HHLcHIXH~Pp Hc@4H L)DEHHQLHLQHHHH9ȉtuAw:LAt$ F{)DH߽HCwHH u=uHCSHL$0=Q,dD9+ HHHH{8H5HEH1HHHC0P:P:fDH5HHHIL{0AG:IWAO4M'AG:HRXDHHHBAW HID$PP@Iw@IW L AHD\$虇Lc\$AW IG@A9J<1D)H蚮DHHLHHD$}LHD$HHC01Ҿ,HhE0HHDH4$HFHF JHs8H{0HD$xdH3%(u!HĈ[]A\A]A^A_H5DHPˬ)H>(H1AVAUIATUSHH@Ho0Ld$ dH%(HD$81@1LH{HCH{0L={E:t$0H߈D$HEH@XP(@D$ HET$1fT$H$HHEK;ufHK;twH H>ACDKvE:Dl$4D$HEH@XP(@D$ 1T$fD$HEH$HHEAf.HCwLH u=uHH蕽C-v(DH-?HD$8dH3%(u.H@[]A\A]A^H(>LH=HAʪH=f.AWAVEAUATAUSHHXHo0dH%(HD$H1T$t$ E:HU}4M E:HRXDDH2McHUNFHRPIBLDDDMcHNFHFIH{BLLHET$ (H@D$E:McΈD$ HEH@XP(@D$HET$1fT$!HD$HD$HEHC0P:HHLcP4DP:HIXDAVH9HL)LLHqPH LL)LHGH|W@HHHH9LuDHA@Lc0AD$:D$@ID$H@XP(@D$<1T$8fD$AID$HD$0HD$0ID$HCwLH u=uH}L%Ht$H<E\$ 1E)HP?t$H蔐ڹ*HM?T$H<t$H`HD$HdH3%(uMHX[]A\A]A^A_ÐHX;D$/T$ 'H>듾Hcާ@f.AWAVIAUATUSHHEHHT$L$dH%(H$1(IHEHL @F$H|HMH$HHAEHF*L$IHID$HD$0LIEhHD$0EHT$H$HC(CCHHhH\$pH$LH H$D$h1foD$lLl$0HD$8HD$0H\$@)D$PH$H$PD$`HD$T$dH$AE ft$ D$"E}IUhP(@ET$D$HD$HD$HAE L$IEX11HȹfHL0AE t AF 'HAT$kH$wLH u=uHy$=!H$H{0fHmLH$dH34%(H[]A\A]A^A_DIuXH$IUL = AAMIEXA9}4IcD)HHHHHHLDHHH9uL$kHHHD$@LLHx8CT$k!H5谤AUATUS11HH(HodH%(HD$1HPHHC8ǃ(HH9uH0HC`HCpHCxHIHS01fHPHPHSǀHChHC`HC 1IHHE@HEHELLHH$D$H{H~LLHH$D$ETH, HDH茤1EW葚HHD$dH3%(u H([]A\A]Jf.AUATIUSI1HHLdH%(HD$81AHeHƀ,HhH1fHC@HC 1HC(HCCǃHkXHC`fHǃǃƃHCHHǃCHǃLLH8H HT$ H|$ D$ Hl$HL$ H HT$HL$(f1ɉ(H5IH1HǃHǃxHǃǃ HHǃHǃHǃHǃHǃ-Hǃ5Hǃ=HǃEHǃMHǃUHǃ]HǃeHǃmHǃuHǃ}HǃfƃHǃ_u3Ht$8dH34%(HHH[]A\A]f1@Hs@HLk #HEHC 1HHcP!IƾH MH $Hl$HHr1IŸIH9vDH5]H1cH$8 dH3%(HH []A\A]A^A_f.M~HLILLt$HL H$H DIMLHt9%I^uA~%HD$`H;D$XHPIHT$`ANI9HT$P rH<$H$ dH3 %(Hĸ []A\A]A^A_ÐH<$HD$`HH<$AD9l$HD$0vAvII@uDAw@MLMwHuLH)HvH|$H5&1貌AHHD$8DJHt AODJHAGMwI<.DBtH|$H51zMH|$ I)HƄ$ %IQLL$!LL$BƄ AB<7H=HcHIWLMH)IH<$ZHD$`"AGDBtLAGIwIODBHAGMwI'H|$HE}DqMI@H|$HT$HD& $ HHH;D$HtH|$H}DH|$(.#HLD$(H|$0IH1%H|$þDzHcHT$`H|$D3~N=H|$1D\H<$HT$`1Cf.H|$DLD$(H|$0AH1~HT$`HHHD$`Rf.H|$D3HL$(1H! tLD$(I€DHqHD@׿llH1L)IT2f:H|$0BƄ @ H~HT$`HHH|$DHT$( H!%tDHJHDщHD$(HH)IƄ ^DHT$( H!%tH\$(H|$DDHJHDщHH)Ƅ IH|$0H}HT$`H\H|$H5<1H|$HcbH<$c1H<$L|$DHL+}1҅DLvLyHH߸A}Lc.HLH~HLH0߁H.fDQH|$HT$HDIHD$`H;D$XH\$HHPHHT$`HT$P"H$v LHD$q< twHL$8HJDAGLxDBtLxH|$ 1>|Ht$H<$IL9t[A<"<\tHD$`H;D$X8HPHT$`HT$P\HD$`H;D$XHPHT$`AHT$P HD$`H;D$XHPHT$`HT$P"1HT$`'H|$H'xDHT$`1H|$褂IHLhI9HwHHLD17{LcHT$`1LH<$WHD$`QH<$?HD$`0HD$`H;D$XH<$HD$`H<$HD$`P}MIIIfUSHHHHHAHBA0 XH}H5'~18 fD1Q0 E fDfDQ0 vwfDQ0 CZH}H5Ru1f7@H1=  HH<AH0DxЃ vٍPNH}H5|¹10H1H QHATP0 v׃hfH1=  HH<AH0DxЃ vٍPH}H5"|¹1TH1=  HH<AH0DxЃ vٍPH}H5{¹1dH1=  HH<AH0DxЃ vٍPH}H5b{¹1^AWAV1AUATUSHH H$H|$ dH%(H$ 1pHHHD$`HL$xH\$p迅HHHD$`8HD$\L5vE1AHD$HD$`HD$HD$pHD$HD$hHD$(H$HD$0HT$Ht$H|$<ËD$\D$haT$|9}T$hЍPD!)!ЋT$\DhHcIԅ+_HPAAH$H$t6H$H;$r̾HgH$DHcD$\IăEoIcLf.L|$ HT$(DLHH@wHT$hH9tHnqDLHT$hHHH$H;$rHH$HPH$H$HD$hMdEHD$`8jHH$ dH3 %(H []A\A]A^A_@H$H;$HPH$H$HD$`8fHT$(H|$ DDD$\HD$8L|$hAT$xIcHHDD$DT$HT$HDD$DAPAHcD<~)HTApHDH)IHDzH9uHT$hHt$8HH$EHD$`Ld$h8/f.HT$(H|$ DHHcD$\HT$hH9HH-HD$hHPHT$hHcT$\H9VH$H;$HPH$H$봐H|$ DSD|$\IHAB HL9T$xIcHHLD$HHL$8T$DiT$DHL$8LD$HAWAHcD~"HTAwHDH)HHZH9uH$EHD$`8xfHct$\HH|$ DHHcD$\'T$xH$$HcHT36fDH|$ D+DD$\IA-B HHHL9LI9CDT$xIcLH?HHDD$8HD$HT$D)T$DDD$8JAPAHcD<~^HtAxHTH)fDIHDzH9uA~0|$Ht)APH{HAHN־H)HtH$@HD$`8t.HT$(Ht$H|$tD$hpfH|$pHuJD$hHH3H$HPH$H$HD$hHPHT$hHcT$\H9WfH|$pHtD$hPAD8ApHPHt0@IHDzH9uA|$HAPHxHAHN־rH$AD-AwHPHD0HHZH9uH$E AD8ApHPHD0fDIHDzH9ukB HL9H|$ HsDDD$\L|$hT$xZ$HTHD$0HtHHJH9uHct$\HD$`H$E8/H|$ HkD6HT$hHH$H|$ HjDDD$\H|$ HjDLD$8D|$\LD$8C1ZHT$0HL HHCH9u+ofAWAV1AUATUSHHE1HHdH%(HD$81H\$(H|$HD$Hl$ 8HmH<$H|$H|$@HpHt$JZHc H@IM~M~fD$AADT$,9}T$DxA&DD!)D!F<(McL)MI9AL$MwH]iHMTHD$86LH{H\$8dH3%(rHH[]A\A]A^A_D$xt*H$Ht$H|$ tD$fDH|$ H|pE1AD$McL)MI9HohH@H|$ HDpbD$DxDID$(HhH'fD$AE1Nf.D$AA+E1AfIofDID$(OcfDIMHbgHtH0 IT$,DP0 0H|$ H5n1HI9M<%@HfHM@D$AE1fD$AAP0 D$AANDD$AA@0 D$AAT$,9jfDP0 vDD$AE1@H|$ H5ae1uItHE1A %HHD$HCtHDlqЃ0 vAEvH|$ H5lD1ADl$DE1E1 A "HCTHt$FDlP0 vAEvH|$ H5`lD1ADl$DA&HE1A %HHD$HCtHDlqЃ0 vAEvH|$ H5kD1ADl$DAH1 "HHD$4 PH0TrЃ v֍BH|$ H5nk1H1 H $ HD$PTJ0 vكHcҸH) if.AWAV1AUATUSIHdH%(HD$x1@HT$8LHD$0)LHD$H\$8}H< LxL9|$8P HL$0HLd$@HD$H9+$@HAHD$0B.t[%8teA$<+6 <-XLHs$DHHHHLd IfMl$ID<%tl@8ILLHHIL;sEA><.t<[uLHfD<[HuDH{H5J1H$躪H$M\<*M9suID$M)E1MHD$!fD%tC@8tNIM9tE.C<>t[uHT$H $. $u $d $E1IfIIK4>LHHItfDH{L1H$ΩH$DHH{H5R1螩fIIL]M9H{H5R1THCfDAWAVչAUATUSHH(5YHHh0HH;C H$HCHD$@C8C<HkPS8L4$L-DRHC(H9QD}A%A(A)vSA.t!A[A%t^A8A$<+<-E<%bL9c({H1L;stA~LeLLMA>LL 1@HHpHL|3(IW.fM|$I"D<%@8IH|$LL3H^LS M9EA><.t<[uLHLT$=LT$fDH{0H5uK1.BfuLT$RLT$iH{0H5GA1HT$HT$L<*M91ID$M)E1LT$HD$A%trA8t-IL;l$t"A.C<.tA[uHT$HduIl$H|$K4.HH2IIuuoDH{0L1DH{0H5I1fIIL@<[t>LC8M9=C8H{0H5I1蛠nE1HC(DAWAVAUATUSHH"HT$XH|$0dH%(H$"1uHT$`HI`HIHD${AAƉD$HLLE11ɺHhHKICH;HLHL)PH|$(苾|$;^Hl$IH|$H9<$$DA$NLcHl$xL9 I9;A$A.t!A[A%t^A8*A$<+@ <-Hl$x@:{Ls@8IIFH9%AV@8uۃuI HH$H551HT$ %HT$ AIT$HqfDHLHL)H4f.H5q?%H1躕}DH;$sH];]t#H$HH9}%H]tπ;]uH8@H$H5y>1ZC<%>H9$$H1L;t$ptA~HkLHA>HLHHHHL InHT$Ht$ G@ID$IL|$pLLl$ ID<%t|@8ILLLHLl$xM9{A><.t<[uHH(fDH$H5a=1nDsGDH$H5C31HT$ HT$ <*I9ID$E1L)Ld$@MEHD$ IL$@A%A8t1HH9t(A.A<tA[uHT$ LRufDMLd$@II\$L|$pMfDIIK4&HLHtHfDAw>lfHD$`HD$HHD$`HT$Ht$ H|$(<=H$H5 <1蚒 DH|$(H$R@H$H5I;1ZDH|$0H;蚓QDIWIL@<[(HH5]101H+t$pHDLLl$ H+t$pHDH5/1H1HT$衑H$H$HT$Ll$ B$I9~M$ #DH501HL$HHT$@8HL$HH$HT$@Ht x)H$H5M:1H$ E1$H$v6@f.AWAVIAUATUSHHT$@t$,H|$dH%(H$x1象HT$HLHD$ 蚡LHD$H\$@HHHL$@HQH9RT$,HHD$ Hl$HLlHD$<^D$uHD$HHl$HHD$Hl$D$tHD$hHD$ Hl$`HD$PHD$@HD$XPT$pv@H\$Ld$PMHD$`H9D3A%A(A)t$tHLd$PFtBHcLd$PHzHH|<`t@HcHHL@HH~tuH|$hH5/1HcHjLHLLHH+D,XHD,`HIMD$pD$,4H\$ Lt$I)LIu{ALLH)mA\$tH|$hH-赛 Hl$x1L--(DA> 11EAHD9D T$tD`H|$h9}HUH HHu_ A뻋D$pI΃I9HỈD$pDH|$n@H$xdH3 %( HĈ[]A\A]A^A_A$HkHL$XH9tI9gE%I^tՀ;]uHHSHcHHL|,XHD,`UDHD,`Lt$X}DHSHH9EHL$XD:CuH{DA8IIGH9s!AW@8u߃uIt HIH|$hH5(1HT$0XHT$0fDHHH9rHDHT$,Ll$ Hl$HH|$n4Hl$HuDLt$L=)E1H\$K&LH3HHP.MdL9sH\$H=HD$@HH)H9HHH)HD$D HHD$5M~Ht$HL0LL)MH)bHDL0HIuGAHUHHL$0HL$0DH|$hH511Շ)H|$hH501轇C<%!L9t$`UH1L;|$PtALsHLuA?LH^H|$hH5&1HT$0HHT$0fDHHHHHl `Hf.HEHLd$PILl$0H#fD<%@8BIHLLuHVLl$XM9A?<.t<[uLHf<[_LH|$PLL萤ML+l$ H\$HIu,9Ht$HHL9ifsgCf<*HEIM9M)E1Ll$0MLuHl$8MELIL!A%D8t1HL9t(A.A|tA[uHLuMHl$8Ll$0IHLd$PLf.HHI4HLHtIfDAvvdH|$hH5.1H5m$D1f.H|$hH5-1݄IH)@EIICH+t$PHz7PMLl$0L1HT$yHuH|$hHT$_ILl$0MH|$hH5-1>E1MiHD$`)f.1If6fDSt HzHߺ1@H5<H1ZH1@H52H 7H߾/$H߾KH߾ H߾$HH߾DH߾ [SHH JdH%(HD$1?wH=-HcHD H1҃HHH\$dH3%(H [fD #HHHfDH:Ht$[ Ht$!HHH@H|$Ht$*Y-Ht$f.rF f.v8H,D$1,f H#B HHH'1 JHcHH'Df.AVAUATUSFHu&Hw,C HC HC[]A\A]A^fDIAp11LHHIEHC~3MHPHHL(DBBH BH9uLDs HC []A\A]A^H5+L1uiDAUATUSHHHBUIuHHPHiHuH} HyI@IcE_HIIu1HPuA} uC@tHI9EuDL+mDE ICL(A9vDHUHHDWEAHHHHHDHEuhA9uM D)9H}HHAthHHDAEuN9H[]A\A]@ACHoCH[]A\A]DF 1&DoAoCH[]A\A]DF D91~H5-*LgfDH8H )1H@(H@ @HHfPH@ HUSHHHH~ tN Hv1HcHS HsH1H{HHH[]1ɺ8cG HVH9rDO !HHHGHcPt(HHЃxuH;puHGHHD0fHO #F HHHGHcPtHHЃxDuH9puHIUSHHHHodH%(HD$81F<usO #V HcHHfDHcBt HHƒzDuH;ruHHHL$8dH3 %(HH[]fDƒ?Ht$ @<҉T$(wHe'HcHDK 1HHH\Hl$ HcClHHHs1HMtHRO X#\$ HcHHf.O _#^ HcHHzHt$H|$D$$Yc'f. f.H,D$1K NHcHH\ fH蘆K Z!HcHHfO _!HcHH1E!DUSHHHVdH%(HD$1?tJH6G HVH9VHCHHD0HL$dH3 %(yH[]fDO H6#F HHHGHcPt HHЃxDuH;ptHcPuDH11HH@u_HsH{ HGHfHcCtHHHs1HJtH6H H4$C HVH9K !HHHCHcPLD$HGH=iDL$ LD$DL$HAAEHcAtHHL)HAD$LH)HAL?H52 ]AWAVIAUATAUS1ۉHxDv dH%(HD$h1H~ H|$t N IGA9HD$H|$HT$@H5L|$@Dd$HbSA9}Ao IIwIBT5HoI)HD$PIIL*MHD$L III9HtFHN,&AUtAW HGH9K#HL9AoEII9HuDLHH|$IG؃HL$HcЉHHL%B HlLtH)IG HD$HD$PHD$ I L9tyAFtAV? I6AG HVH9IGHHD0L9uH|$LLAoFI L9u~Ht$H|$HcH1HD$hdH3%( Hx[]A\A]A^A_Ht$ 1L8IwH|$LpIIcE\HIIu1LBtLL9G2fLuL90AO I6#F HHIGHcPHHЃxDuH;pu@IwH|$DHHAw IG9v0MH)HHHTHHDfHH9uAo AO !HHIGHcPtHHЃxuH;xEHcPuH|$PHT$LH|$L\$8LL$0LD$(LT$ D$XIwL\$8LL$0LD$(LT$ fHt$PAG HVH9AO !HHIGDHcPtdHHЃxuH;pubAO !HHIGHcP4HHЃxuH;puH AW IwDH|$HHAw IGA9v/HHHLAV)HHHDHH9uH|$Ew T\Df.1H~ t N DAUATIUSIHHRdH%(HD$1?(t[IuE HVH9vHEHHD0H H9tuHL$dH3 %(H[]A\A]fDM Iu#F HHHEHcPt HHЃxDuH;ptHcPuDLHL:xD1HL4ugHuH} LOHf.HcCtHHHs1L>tHH H H@H4$E HVH9M !HHHEHcPt`HHЃxuH;puM !HHHE@HcPHHЃxuH;puS@H HGD@SHHJH dH%(HD$1F H9s!@HOLHHLQMEIDHL)Hv_N IIQH9wO DуD!HcHHOHcQtHHуyuL;ItHcQuLL1AL  LH9vHLFHHWDZEuHO DLFN!HcHHWf.HcJtHHʃzuL9BuLf.@AUATUSHHHH HO~II9LH)HwTHHAtAI9~@HھHH$#I9uLH#HD[]A\A]ÐHHH5 []A\A]1iDHE1[D]A\A]H˔IGAUATUSHHHA|&H EMc~3I]AD$LII) fDHHG,L9HuLHHNH*H[]A\A]AWAVAUATAUSHHU&tR@uk@AAAH5HDH"HDH[]A\A]A^A_vH5HH"t@AAAuH5dH߉T$ uDHJ"sT$ EA9EnAHDH[]A\A]A^A_AUATUSHH tHH赒IHH|I9HH}IEH9|tHھHd I9LcHLD HھH4*M9LuHLH*H[]A\A]@H=H,hsLHMIfDAWAVAUATUSHHH dH%(H$8 1tHhHL=tHL$HƜHIwHIzLLd$HHzLIH譇L9@HھHH3 u*HHHHLH1eLHiHT$LL}I9uLHH tCL+L賄H$8 dH3 %(uRHH []A\A]A^A_fHcHH5HLH1due @AUATUSHHtHHŏHHXt`uHrxHIH9}L9@LcHL\HھHL'M9LuHH4'H1[]A\A]HHH5[]A\A]1cDH=H,ejL뗐f.AWAVAUATE1USHHwHHwHIrwHIHAF,tH@DHtDH L9kHMHI)L)L9M9}L9}xAuRL}I)LHK&DHI%M9uDH5H[]A\A]A^A_Ð1DH uf.Md/I)HH`I.DHHM%L9ufDHHL9H~ HVcH~ Hf.YfDI$Hx[HHuH LHHk=I$Hx(#6AuLHH"=A$$jH LHH=f.AVAUIATUISFHAHoHWHH HHhtHCDHpHsH+k8oHHF0Ao$FAoF HCHC @B]HSHC8HJoBHHKBt[]A\A]A^fHHxB@HHx(2@AFt[HSHH HHstHCJH[]A\A]A^ W4fDIHxR1[]A\A]A^DIHx(f.DUSHHHHHt$dH%(HD$81hHt$HHt$HHH(Ht$v@Lm@H;MuIEHE@HHUhJ4 IM9uH{Ht$@cHLcd$@H;11MILH{HEHLDmHcHH{Ht$DncHHcL$DH;11IHEHEPDe$At$HHHHLHHH9uHE1L|$8HLt${1ҾHRE1HHyHJ\+L9HGHH>#fH5H1=A+1ATUSHHHdH%(HD$1M1ҾHHHH)H<$H1H9H3%2HNH HHHH€t1H9D#ADvw@Cƒuu1DD Hǃ@uS?E A@Hcu؍ AAA Aw)$HD9$sHHtC%uAH5H1;HL$dH3 %(uSH[]A\H<$1!DHHDIcH9fHA1hS+ HqHߺ1H5;H1iH5HߺH`H߾b[f.USHHH8dH%(HD$(1Gt,1t8HL$(dH3 %(H8[]DfH*@HHt$HxHHzt+HRH1H9u|$D$tER HfDfD$fH*D$AUATAUSIHH(dH%(HD$1HHRHH9uCHCt`u'HHHxHzuR HH9tf1HL$dH3 %(H([]A\A]f(%f(fTf.wjf.f(ztEtA~ X f(f.rf.sH,I$bHI$QH,f%?fUH*f(fT\f(fV^+f.AWAVIAUATIUSIIL1HHIHx(HG ID$1HHHPЃt8Et]tv1HLPIHÉЃuHMLLHL[]A\A]A^A_AfH;LPuFI߁+H5L1AFH[]A\A]A^A_ÐLVoAHHL ff.AWAVAUATMUSIH1HHT$H $MLuI~(H$G ID$HHIPЃt?EtfLLP<LIljЃuL$HL$H[HLL]A\A]A^A_E1d@Ht$I?裺Iŋ@tAH$@@tI7F t H@ H$oAEH[]A\A]A^A_DLH5oL1%DH)I9tQH$oAEAF @@tAF tH@ tHLL[]A\A]A^A_{L{ZHT$LLûIfDIHLL@f.AVAUATUHSIHHVЃtFuEHHLA3HD[]A\A]A^@EuHHu HL$D$f.H H@HH9uE1f.sf."H,E1H9AbfDHHEzHZLjxHhL`-HpL9L9HHI)HI)HHAtAHt$E1L$f.ADH H@Ht$HL$H9f. A|f. vHH,E1H9A^f.AIDD` 8fDDj E1"fDfE1H*f.AfE1H*f.AE1H9AHHL+f.AUATIUSHHHVЃt@uEHHLH[]A\A]fDEuǃHHucHL$D$f.H H@HH91f.{sf.isH,H9gID$ HڹHLfHB2IT$ frBH[]A\A]fDHHEzHZLjxHhL`-HL9L9HHI)HI)HHtHt$1L$f.HHLIfH H@Ht$HL$H9f. $(f. rTH,H9 @fDD` 0fDDj fD1M91@f1H*f.ff1H*f.f1H9rAUATUSHHH(VudH%(HD$11?t:Au Ѓt`E1HL$dH3 %(DH([]A\A]?wH !IHcHDE1HEH9AIu@L+HEE1I9A|fHRHH9bT$L=HLHxHzuR HH9tHHUH9HHx(Ht G Hz(HG ID$HHMD$HHAHLIT$Bu sAhDE1E9ARE1f.EADE-f.HuH;7A@HHUH9tHHxHt G HzHfDHHRHH9t$H݃ HEHHx*HUzuR HH9tafDf(%Pf(fTf.v3H,f%fUH*f(fT\f(fVf.f.f.L,u-fL+u DMf(%f(fTf.v3H,f%pfUH*f(fT\f(fVf.OIf.V; Pf.)H,ID$HFHOHUID$HH'HUAWAVAUATIUSAHhHodH%(HD$X1HD$0HD$O@MȃtlHUtRHuALAHHI]AHI]UЃvHUHLMUDDu!HEx uoEAHE돐HExLpAdAD$L}Hl$LHMI/fH@HH)H9>KHHII9tsAFHމHtLLIxu@ HEx $AHHuLfHcIDyHHHl$HHE)HHHt$HI(_HI)IHIH\$(I)JD=E1LHl$ MHD$fDIxtgHhH|$HpIHHHL9|$uHt$LLHl$ H\$(8IHl$LuAF@EDH H|$HpHAs(AwE%LIL;|$S뀐H@HzLIHHDHLHLH)A H)։HL;|$8fHD$XdH3%(EHh[]A\A]A^A_DLLHT$x7HT$IIH\$(Hl$ LHI)HII)JD=E1MMHD$@Ixt?HhJ|3HpIHIL9|$uIHl$ H\$(f.DH JT3HpAsH@h HD$H@HHՋp ~Iv HEIU I9s'LHHHHH1AoAHH9uHL)LIF HCL)LHCIFIE(fANB IF(Ls DH4$HHAAH$EIJ48H9IV(M^ *%HHHItDIV(M^ IF(AT$oAAoD$JA$IF(NfDAoD$ ID$`DIt$0HAD$PAoD$AD$@Ao$AD$0HC(!IV(IFM^ D:HCHBIF(EAEIMRfD(AIV(AHHIF(f.DAHAIcA)HAwHIL[.M^ HSHMLHzoAE~IUI9HHCHC3iM^ IFHCIF(fDA|$AD$ AL$f.n A$X f.„IF(ADHIF(A$AD$8AT$0DDAAuHkL)HEuIF(D8HPIV(AAGM,$k2A9E HcAL\$HA)IԐLLHߍhmAD$@tAE tI$@ ID9uL\$DH4$HHAAH$EIJ8H9DALHDHLM^ IF(bf.ADHL؋Ht1҃u(1҅fDA$AD$IF(f.DAHLA*EIL<$oEE1I7AD$}ELLHH*M^ IF(DDHAL\$A*II$D AD$EL\$HCHxIF(JfDQH4$HH,AA EE1IL<$A|$E LHLHM^ IF(HD$AAo$Jt H@@aHVH9THL\$]IF(L\$@HD$HD L(DH4$HH,AATEE1IL<$A}EVLHLHM^ IF(@DH4$HL,AA9EAEIL<$L|$<IEHD$Ht$FHH#D$AD$I$IF(D H4$HH,AA H$EIJ8E EB, ^AD$IF(A$ @D H4$HH,AA1 H$EIJ8E0 EB7 L\$膼AD$A$IF(L\$fAID$IKT<fDHH9u@DAD$AA$IF($HIF(IV(H4$HBIF(HoA$H$AIBo8IF(A$DH4$HL,AAEAEIL<$L|$IEHD$Ht$FHHHH$HD$HH@HMI$AD$IF("f.DH4$HL,AAAEAEIL<$L|$DIEHD$Ht$FHHHT$HH@HLSADHL݋EfHEH*f.ADHL݋ES%ALHDHHEHt$DAAHD L( EE1IL<$A}E LLLH1M^ IF(@DAHLA2EIL<$E1}EH}LL\$踖I@AoIF(L\$A$:fDiH4$HH,AAH$EIJ8EEB"A LD H4$HH,AAI H$EIJ8EH dEBM /$AkAIF(ICo;A$@Da H4$HL,AA EAEIL<$L|$ IEHD$Ht$FHH3D$AD$I$IF({DiH4$HL,AAEAEIL<$L|$IEHD$Ht$FHH D$AD$I$IF(HD$AJD HoIF(A$DD H4$HH,AAH$EIJ8EMBj!A DyH4$HH,AAH$EIJ8E EB>="AHD$LI+.AAOH@H@ )ŸH9Nt3VHcLH1HH)HfDoAHH9u9IF(9Hc)HHHHITIL HH9u@D H4$HH,AAY H$EIJ8EX DEB] AHXM^ tIF(#I<$AD$FE $EIF(EAIK;BfH*E  \AD$IF(A$fDHHI,EAIK;.A DHHI,oAIMDEAIK;8BfH*E<f(L\$T$fT$L\$f(fYf.X@HHI,fAIK;HD$AELL|$0L\$HRHH9uKD$8LPku*HELHxrHUzuR HH9tADHHM,fAIK;B@HHI4fEAIK;pA DHHI,AE1IMA|$E]I<$HL\$袎I@>AG@L\$t/I4$F t%I@ tHL\$LD$PL\$LD$AoIF(AHHI,AE1IMA}EI}LL\$I@FAIK;HD$AELLL|$0L\$HRHH9uKD$8LHu*HELHxbHUzuR HH9tADHHM,f8IF(@AIMDAIK;HD$AELL|$0L\$HRHH9uKD$8Lu*HELHxrHUzuR HH9tA DHHM,fAE1IMA}EI}HL\$#I@AG@L\$IuF tfHHI,,McIK4;_%HI,fDMcIK4;%HIDfDEAIK;BfH*E YAD$IF(A$fDHHI,7fEAIK; BfɃH*M$^6%f(f(fTf.vID$Ht$0L\$HxaIT$L\$zHRHH9 |$8D$0fD$fH*D$f.Z 1H|$HI HgI HI HI HR HG1HfI*D$SH5PH1H5%H1vR HfSHHHwH dH%(HD$1HSHt5H$Ht,HHHPHSHL$dH3 %(uH[@D@H~ HVHNHHF@AVAUATUSHdH%(HD$1HtoIHIHI1fDHsI9LIFHbHHkIH)I)Ht-HuHsH{ LSHHt2H$Ht)HHC1HL$dH3 %(uH[]A\A]A^ÐLffDHDŽHDf.USHH͈t&H\HHH[]DH Hf.SHH1Ҿ[ff.ATUISL5t0LHcHxKH9HNH~G)[]A\fD1ҾLђ8#uuLHc^HHH LfAWAVAUATUSHH8dH%(HD$(1腇uHHHHT$ H)HD$HCH"Lt$H5LrM<E'A-tA+D$uEgIEgD$IbL(CDetbHcE1H|$9A̍Q9~BIALD$HcMADEN4E'uHB Q91E1Ll$Ll$ M9H蓗H\$(dH3%(H8[]A\A]A^A_HHH{HtiHT$ H跐HsHHsH\$ HSH9VY@H5LINjD$LHޅIDHcfDH趉fDSH}H߾H߾H߾H߾9[fSH-H߾`H߾ÀH߾趝[Df.SH袄vH HH߾IHH[SHH߾Hߺ裈H߉Y[fAWAVAUATAUSHHdH%(HD$1H5G AHIzEXH ;H=wH `;H$L_HrA9|]DH貂H訂E11ɺH葬LDH#HIgH5H1/@H ;H=ӏH=;1HT$dH3%(uCH[]A\A]A^A_fDH$H菏H~At%f.SHH5K1HH߾褁H1ړ[SH}H ~H賰u HR[fUSHHHHHE111HH赁taH贄t8H߾>H߾q}HHH[]KH5IHH߾3}HEH1[]fUSHHHXHH莒HH辘H[]ff.USHHHH|H諀~tHH[]@HH߾H߾̯HH[]ޮ@f.ATH {;UHSHQHjHHߋ,1VH߉‰躬Atj tetHcHm[]A\H1Ҿ聬fH "*YfA*X[]A\fDDH轓[]A\USHHB{H߉H聓H~H{uL AHv+H11H߾4~H[]HzH[]@f.USHH~žHtu@HRHuHH߾[zH߾H[]fHH|$HD$LD$0HD$0HL$  1LHLD$H $蘙H $LD$2ff1f.EfDHD$0HCULD$0H|$1LL$T$(L$Mx@WAVAUATUASHAA?H-kHX8EDD)AAEA1E)AA?D A1HcDVL E)D-FAEÅ~AqAA?B|DMAA?A#fAAtoD9tj?D A3D)AAEA1E)AjEA?D փA1H[]A\A]A^MYxA"D fDHH5E讜HH55螜@f.AVAUATUASO(HH/LcG Hu8L $j.fA{A?D ЃHcHANIF0A9}1IcD)HHHHHTHLHH9uS,fLLdf. t t4fHHcNH@8H %? ‰fHHcvHA8H4% ‰GAD$<4v* CHL;tAD$kf.edI$H=|MAHH8IcEHH~D@A?B<yHP?#D(AAAGt5AuEE|$ DKSI$LP8fDBtHcDBI<7-uD)1)=? fEl$(AD$(L%AAx4I$DL@8 f0tHcrI<-uA)DD1)=A?AD AD$ ALADL$ D@AD$$AAD$ DLAD$$gE|$ DL$ AE|$$AT$(7I$L@8 D8tHczI4-uA)DED1)=EA?AD sE|$ @W:9!o<@n D$ AAD$ ALD@AD$$zAAD$ DLAD$$\DL$ E|$ AAE|$$3fDA8D$:Al$<C fEL$(sEE|$ sK9:E'AAE|$ I|$H5hB|I|$H5d1|AWAVAUATIUSHH F9Fyvg CHL;]AD$;*SE<M:9E<fDsHW CfC{9{U:9u u:9|m<M:9m<AUс9|u M:9fu:9vDU:9m<U:9qm<h%Cf.C@8E:Jm<C =D8E:m<C @H}H5RHf0CpAUATIUSHHH  tEt;t|H[]A\A]:AT$HHH[]A\A]}DE1~ HAAt$ AT$Gl-H D ;uCxU:9lm<cfD AbHOHcHfBMW:9Ao<8HHcS H@8H> gC{ C sH  Cs CHH;EdH%(HD$(1OH5xMHcHDAD$IA|$ AD$ At$ H:A$ AD$H C<q Ѓ9A ҈CsE E$tiU(HELH8 fBtHcDBI<-uD)Ɖ1)=? C[]A\qh HUW:91o<(su(C[]A\ÐChD 8E:m<C E:9Qm<sEm H"@3De(E(HAbxHULJ8 @B tHcDAI<7uE)DD1)ʁA?AD 77H}H5>VH}H5BVHEsW@f.ATUHSHB0H @HcHvfHDe(E(HAHULJ8 :tHcэyMA0uA)DD1)ʁA?AD A0KlHULJ8 fB tHcDAI<7uD)1)ʁ1?  fHHcv HH8H 11 NF{{ C s vH菷CHE HcKHH@8?E<r 9a=gJ HވMCfDH@AvthU;IELH8 BtHcDBI<-uD)Ɖ1)=K? oEAHEIF[]A\A]A^DHL[]A\A]A^ÐA9AHY輿} u IMHcUHA8Hƃ?HLK}AEDDA>UsAL@ D ޤA](AE(LŤ[IULJ8 :tHcэyMA0u)1)ʁI}H5y)@fDL ƃ:A](AE(L!tnIULJ8 :tHcэyMA0u)1)ʁ? A0AFA []A\A]A^f.fD#fDANρ';A}:9$Am<AM:9 Am<sAL@D A](AE(Lݢ&sIULJ8 :tHcэyMA0u)1)ʁI}H5'>f.s EHLUց9cu Au:9}OAU:9fUցAM:9Am<명A}:9@A>Avtv% EA AFUAE<AM:9AEt>uqH5r(H#H$dH3 %(HĘ[]@1HH{N~H52(H#fDHH u@H5(Hq#H5"HY#r@H'H,q,fAUATUSHH HH H D`HDF &Hv=DHH DHH2Hq DhHAD DHHy ExSH߾$DHߺ HD[]A\A]H bH5H1"H1AA$HߺO HD[]A\A]ÐHq&HoHH fDH5_&H!@DH H5W&H!^Df.USHH{HuHHžHHߺ0 H5Hߺ"H[]ATU׹SHHH HAG Hw;tcDHH DHH7~Hv pHADHH Ex-D[]A\DH8 uH56He DHCtH[]A\uAt lHHHH I@HHPHHkHGHPHWAf.LH5%L3I@HHPHH HGHPHW:AnI@HHPHHHGHPHWA ;LACXDIoHHEHUHHH9v3H?H9L$I8HuLHEHELeHUHH\$#HMI@HHPHH HGHPHW(HD$0L5A/I?HD$HD$1HD$(9 Y \PIoHHMHUHqH9L9L,HuI8LHMHELmHqHu\I@HHPHHHGHPHWD(AME/{H5GHcHI@HHPHH HGHPHW=A~I@HHPHHHGHPHWAKI@HHPHHa HGHPHW/AI@HHPHH`HGHPHWAI@HHPHH HGHPHWACH-HD I?xL9L4I4$I8L3IL$I$Mt$HqIt$I@HHPHH" HGHPHWCAHD MgHIL$IT$HqH9uI$IoHHMHUHqH9L9m L,HuI8LHMHELmHqHuxI@HHPHH HGHPHW8GA?HA_ |IoHEAHMHUHqH9 L9DD$ L HuI8LLL$HMLL$DD$HEHqLMHuDI@HHPHH HGHPHW8GA?HA AIGHHhI@HHPHHiHGHPHWIoHAHEHUHHHMH9 L9 LI8HuLLD$LD$HMHELEHQHUD,A/AeDAUDLA bIoHHEfDIGHI@HhHHPHH HGHPHW(A/PHcAtH v mI@HHPHHvHGHPHWPAHcAuA DIoHHMHUHqH9L9 L,HuI8LHMHELmHqHuuI@HHPHHHGHPHW{A IoHHMHUHqH9gL95 L,HuI8LJHMHELmHqHu{I@HHPHH{HGHPHW8GA?HA' DAHc\$$fL9DL$ LH3I8LLT$躿HKLT$DL$HHqLSHsD I@HHPHHHGHPHW8WA?HcAHAHHH< I_HEHKHSHqH9DH{@A DA DA }DA mDHcAE1ɉ\$$E1DIoHA\EHMHUHqH9L9DD$eLHuI8LLT$uHMLT$DD$HEHqLUHuD,I@HHPHHHGHPHWD(AE/AtAEHAQfDAً\$$AIoHMcEHEL)HEf.NMoHIMIUHqH9vrL9LIuI8LLD$落IMLD$IEHqMEIu@,I@HHPHHtPHGHPHW(A/ fIEf.HEVHE ;S+SAQSfDLAdR@RfDI_HHKHSHqH9wH?H9[H,H3I8HqHKHHkHqHst$#@4I@HHPHHNHGHPHWAIGHI_8HpHHVH0HKHSHIwPHHBHCH*E@BRH@HCHx~HH$Hk%H(HE<DD$QDD$AMH5!L%DI@HHPHHHGHPHWAbfHEHHEMHEQq@ Q@}\$$I@HHPHHlHGHPHWAIGHHMcHl$L)hHoA\$$LA)ŃMcND-Ll$(MLHD$Tf.L9 LHuH{8LLT$HMLT$HEHqLUIL9|$HuD,t&HkHE/HMHUHqH9wHEIߋ\$$@IGHI_8HPH0H)IHSHIwPHHBHCH*E@BP@HCHx~H裆H$Hk$H(}hE ESHh`HE>HEOfD OfDNU@NH14H޿-'H1H޿-H1H1H1H1H1޻H1Ի1HʻH1H1趻Ll$ HEMMDDD$@I 蓻DHEI(ωL$0EsLHH҉׉T$[EHADDT$DHD9HD.Ll$ I0HEDLL$ HI8DLL$DD$@HDL$0HމߺT$HމѺDT$HDHD趺HD諺HD蠺LL$HD萺@H脺HĉuHHH@bHUHHH @BHHH(@/HHH0@HHH8 Lt$8HADHĉLHH@ٹDH˹LHH @踹LHH(@襹LHH0@蒹LHH8胹H=<HٺH1`H1VH1LH1BAH6DH(LHH@DHLHH @LHH(@LHH0@θLHH8迸H޿貸H1訸H1螸H1蔸AAAh@AAA@AAL}8Ht$T1ɺ@L(^HD$D$Tx'HILP]D|$T̉AL$Ht$IL$AD$HAT$AD$LJ48LupHL)((LI譴MjHH1fH1\D$δH|$H"H謴H|$(H"HH|$H1Ҿ"HiiH|$(Ht";H|$H1Ҿ^"L%H(HSHh袺HtNHtPoCKd@oCHd@oC$@$oC4@4oCD@DoCT@T@[D1Ҿ1@@ fPHpH@H@(H@0H@8H@@H@H@PfHT@XH@`f.SOHttH{8v[SttH{@`$CttH{H[I[f[@f.Ht[SOHttH{8[St"ut H{HZH[.fDH{@#Ct؋@@f.H1HHG1HGfGHG(HGHG0HG8HG@HGHGPfWTGXHG`Df.H9W0wH9W(w1t 1H9W`DHhBHtpHHHPHH11fPH@H@(H@0H@8H@@H@H@PfHT@XH@`HATUISHHdH%(HD$1ffH|$I"H.D$t$t$D$ЃuT$L$H\$dH3%(H[]A\þƷx7H|$I膸Hu0fу]L'L ef.H ;SHHu;foH=q ; ;)` ;fo)a ;̶H} ;H{@1fSHCfKTC CCPCX H{HHC@WHCH[fAWAVAAUATAUSHHHXdH%(HD$H1AHL$H='HkH}81PZH}H1ABZAƒxpfMHD$(E1H$AHU(HE0uH9HD$0T$8HL$1HHL$2HHL$3HH L$4HH(L$5HH8D$7HH0HL$6D$9HHD$:HHD$;HH D$HrH)ֹ IL8D%=ED$H޿-H1E1-H=H߷H}81XH}H1AXAuEAA DE1fEHD$(H$AHM(HE0H}`uH9uH9wH9v?HT$0AL9HQH9H9H9?DD$kEEAH蹮DH议D}HD蘮DH芮D}HAzDHlHEH<$HD$(ʫHHDyHD DyHAAPfDx  ы$$HAHDHD} HAܭDHέDH@輭DH训L}(I9AH萭DH肭DH@pDHbL}0I9XAHDDH6DH@$DHH}8 THADHH}@D!AL AHAƬDH踬EH}8HtHUMtHھL H}@Ht HD EuH}HHtHTL7HoH\$HdH3%(D$HX[]A\A]A^A_D} HADH.@H޿H޿ޫH޿ѫH޿īH޿諫H޿螫H޿葫H޿脫HE0D$H9w"H9U(wAxH9U`nDE4FfH}H'RHADH D}PHADHD}THAܪDHΪD}XHA辪DH谪DH@螪DH萪L}`I9vAHrDHdDH@RDHDE1-D$bH90MH޿H޿H޿H޿ԩ HʈL$0HT$1HHT$2HHT$3HH T$4HH(T$5HH8H0L$7T$6HT$0H9HrXHHHNHHNHHNHH NHH(NHH0NHH8NH9 H@>HHNHHNHHNHH NHH(NHH8H0@~NH9MkDEAA DWE1@fEHD$(H$E`EMLmHH4$1ɺ@LSNHD$D$(xRHLHD$yMLD$Dl$(̉Ht$AHIHA@APLHA@ LD$HucLL)LLD$HLD$ILȤMQM}6fDHD$(fME1H$fL}81ɺ@HDD$LeMHD$D$(xdHIDD$LDD$LD|$(̉AMHt$IMAEHAUAEL.J48LupHL)_LIMDD$FD$a+H|$:D$6H|$1ҾD$H|$1ҾL&D$E1fEHD$(H$ff.HGHHHDH9wPv+HHw`uHFHt-HHHu1ҾHq1DHHtvu HHÐ1ҾHHD$<HD$DHB HHfHBJHJJHfDHAQHHQHHHHHAHHAqHHqHHqHHHH H@f.AWAVAUATUSHHuIHHMAHI觨HHMtVM'HHLI袧M'Et#HH9vH@8u HH9uHH[]A\A]A^A_DLHھHH9vH Lt$L1@1@1ҾLq11ҾL^rfAWAVIAUATIUSHDHdH%(H$1ALL$Ht$MAIAEAAHt L9): MI<$H|$HH׽Hۋ7HE90 HHG1Iv1Iv1HD$HIfANIFIF(IF0IF8IF@IFHAFPfAvTAFXIF`uWGHGHD$HfAV PLl$PfLDL$HHfAVHL$HPHHHfAVHL$HPHHHH AVHL$HPHpHHD$HD$hAE(f D$pPD$dȃfL$\D$`f D$Xf>?T$PD$TUIFHD$HDL$PHHHHAV HL$HPHHH< I~(P H H H< I~0H P DxPAAHPHT$HFPpH<2Ppf|$&AVPPpfAVTPpppAVXPpppHD$HIF`ljD$ADIF8D$,DD$IF@IFHDHD$(t H9EZfD\$0t|HD$HLD$Ht$MHEHD\$0HL$1DHHD$8FLD$8HD$0L軜HD$0HIF8yAFfEtmH|$HLD$Ht$MAHD1HI6NHL$t$,HHHIF@NL3AFt$&ftnH|$HLD$Ht$MHD1HIHL$t$1HELHD$ЛHD$HIFHAFI~@E11ɺupALM~8 HHtf|$Pv 8*I~@M~8E11ɺucALM~HV HHtf|$Pv 8mI9F0M~HI9F(I9F`uI~`I~@kMIF@t HD$HI$1Ht DL$(L)MH$dH3%(H[]A\A]A^A_11AFPfAFTAFXIF`D$fT$&DI~@LL$1ALR Hf9T$P9I9V0HPHEºI9V(I9V`*A~PPHHAFPDLL$1AL Hm1I9N01I9N(@I9N`A~P"fDL$LD$L.DL$LL9DL$HL|$HLfDHL$t$,H HIF@LHDH|$1ҾIHDPHHpHHHHHHHHPHHpHHpHHH HIV(!fPHHpHHHHHHHHPHHpHHpHHH HIV0f@JLHT$JJȉD$?9D$HT$TD$PHz1ɺpfAHHD$+L @HD$I@JLHT$JJȉD$`?9D$HT$D$PHz1ɺp@HHD$nL?HD$IYPHHpHHHHHHHHPHHpHHpHHH HIV`xfIFHfDIF8mH|$fMfDH|$1Ҿ,DH|$1ҾLFH|$UFfDHHPH@8HHPH(HHPHHHPH@8HHPH@8HHPHHHHHPHHHHHPHHHHHPHHH HHPHHH(HHPHHH8H0HHPH@8Df.US@HH蜗HH[]鋗f.USH@HlHaH@MHH[]=f.USHH@HHHHH@HHHH @ݖHHH(@ʖHHH8H0@賖HHH[]颖fUSHHHH|$H|$pPNp NfH fMHfH[]DHUSHHH?HtAH{Ht#H{0*H{8;H{@;H{`Ht1H{Pt%1fDHHHHH9kPH{`wޒShtHCp1H袅L"虇fUSHHH Hti#H;Ht3Wht,LGpI;tAI@HHHHH9Xt3H9uH{kH蚄H[]ÐrLf.IHwhfUSH1LH-Ht"HHt@ E1HtRXH[]øf.DATHUSHw`HHH1HL``Lًu5H{H$1xHcLH=w.[]A\f+H<[1]A\DH[1]A\AWAVIAUAT1USIH1HH( 1LD$dH%(H$ 1 G1HHLD$MHl$A cfH;HM)FMH~II LMINϺ H蕋HIu8H|$GD$H$ dH3%(D$u2H( []A\A]A^A_H|$D$HO0AUATE1USE1HHQHH_$HZYHI!(HHShKlHCpr9r%q HIHHtShDklHCprH}shH,H]1ELe HH[]A\A]1@H{L1LH{1ҾL1H{1ҾHPKEFEMfL9d$ wA~PKFIFH9D$HL|$IFH$LLA fA9IL|$LL HIH5H=)HH=LH+l$ Hl$@H9L$lH9AtHt$AT$pYHI}DID$D$pID$ H|$`IFH$FIT$ It$HH9H9L$Xt EHHD$@H9H)HT$ HD$`HH$ID$H$I|$Hq1IMD@ILL$E1HL$LHJ< yx7HI;oWH$ M7IIMHIuL&aHHD$HlaHD$HtH|$ vBH|$ L|$8vH|$0MH|$'HHH<$tgH<$薀HHEID$hI(HAoGEIEPH}8H]HE`t fE(E,LvfDHMH|$1ҾtL GMu֋T$lH$uH|$8uHT$LHLd$8HD$0H|$0HT$LHaH;D$0H~GH|$8药Hl$0Ld$8HFvuH|$LHHL$I~1HID$(tIT$ ;fHzIt$ 1H|HukHqzI;D$ X1H|$IFH$2H=H3L+d$ H@7Ld$@L94HL$@H9HT$PHH9HH)HD$ H$8PKH|$HH$|$ltHD L9L|$H$ LLII9L|$LkLI`IH`H=TIDH=Ct$lH9AtBHt$LHT$p蘮HIHT$pLH+l$ LhHP HD$@H.f.IG(H=HHHBƄ$H$RsHt$H$Ib|HøH9tH$Ht 8zIWIw H$H}E1VH;$E(HE(=H|$1ҾfHD$HXDH|$1ҾfHHD$HtL }H|$8OLd$8HD$09fHT$Ht$8HHD$0#@1HHsyzHwH|$xHٺ8\|H76HZr&HD$xH$H|$H|$1ҾH$H$LDŽ$$uHq$HL$HS$EH|$H$H$DŽ$$up$HL$Hi$[H|$1ҾA${pH|$|pH|$fH|$H$H$DŽ$$u+p$HL$H$!rAVAUATUSHHdH%(H$1y7Ht1H$dH3 %(HH[]A\A]A^HItHT$ AHutAu1Ht 1f.AtJHt 1Lt$L HH LxHHEDeGAt*H5 LwHuFH!tH5½ LwHtHDHLkHLt$H#pL{HH`HT$Ht$ LD$ 5|$ u bnT$HD$ ~H1fHcXHT$ Ht$LD$|$u mT$ HD$ofDATUSG,HfHt HftaLc1LHH1HH{@H{8HC@Hu3Hk@CH1[]A\DH{@1H{8HC@HtH$u H{8uHuH\CH1[]A\H{1ҾH1Ҿ{qH 1ҾLPfWUSHHHLOHHu11ACH[]f11HAHAH+EtHELMH}Hu*11AECH[]ÐfDHA11HAH}Lf.AUATUSHHXdH%(HD$H1Aw#HH5EIJcHH(k1HT$HdH3%(HGHX[]A\A]@HE1HDE1111.HEEuuHtHLI HHUEbHL H$ tp}9|$0tgHEH,fEHE1HBUID$ AD$4I $AT$0HE}L-EHEH9D$HEHHSlHATUHStT HApHt_D`HH@H@H@HH[]A\DH1Ҿ[1]A\fH}1Ҿf.@AAVAUEATUHH SIHJcHfHHv HH[]A\A]A^Hh[1]A\A]A^DHn H HH HHǃX Hǃ` Hǃh pH 蛇V1[]A\A]A^>HtL-2H0 艮8 H PIcTL@H 11Hz fB4lHBH_HB 1HHÐ8 CH9w1HDH)HuDC 8  uދKu^Ls LL Hx6uNCD8 C HHSHLQ8 CL HHDf.AvAWAVEAUATIUHSH HHJcH@HHH[]A\A]A^A_fDH fH1[]A\A]A^A_HHdžX Hdž` Hdžh dž H Hdž dž8 E1Hdž0 jpDF P wA[]fC H4DEH;FL H0 8 AfDu1Lu[HLHŽz`8 tCtD Eu@H9/31HfDH vH1[]A\A]A^A_fB4HHH@H NHNHHH1HJ $C D E{upL{ LL%HxHufH( CHCfHHÐH@H1HSHLY8 fD L CkHH)XD C8 H3AUATIUSHHHAt  9jHHAH@Hu"HHLHtwH[]A\A]@1ҾL1HXC f.I|$1Ҿ?H1[]A\A]fI|$1Ҿ1HHD${bHD$rUSHHHHH?dH %(HL$1HuyHHxPHxPHt$EHtD$HD$dH3%(uH[]HHpAPHyfDH$fDPtrt)1HDH${H$kH qdfDHUSHHWHLKH{Hu#11AHH[]9af11HAHAH+Ht΋Eu~HELMH}HuM11AH`HH[]`HLKH{HlDfDHA11HAH}fHXuHt+ATUISHHHt L HhHX[]A\@1f.USHou{HH?Hu(111H{SHxvCH[]fDx^E111HsH;SHyH;HD$HD$Ht0CGf.CyUSHHteH/HHtJWHGHwtA11HCHsHA11H0_HH[]fDHH[]Ð1f.fSGHtuHxptHtiH;LKLSHt9HAHLAHx[Ht*CH[f.[LA@CH[CH[HtrUSHHHH?HuH{@SH?H[]xCHHsA@H;SH1HyHtCGCf.@AWAVAUATUSHH$H$dH%(H$1HHHIhH9VPI[AMLu#HHHF`HxDPEHL$0DLLHL$ HKLH A HD$NHHD$D$E1HLLH LD$PMLHHt$(H|$MHIu LD$HL+D$HT$X1L$f$L$HHD$x\I E1H$HD$xIW1HPeHI_AXtJD$tf|$duH!H9l$PH|$(tMEH|$9fH$dH3%(LH[]A\A]A^A_@H|$tALHH;D$Hw|$ffAHD$Dl$DL$E|$dE1fkHL$(HIHL$(P1ҾHE1:f.HK1ҾHE1DH<$HL$ HHD$HL$ADl$Of.H{1ҾE1=HIWE1t$(H1HHIZYHD$H2T$f1L$LHHItmMT$d1LHAHIL+111H: IfLH0Ht ILXE1Hu Hl$HH+l$HLLHHtIE11ҾHE1y1ҾHE1b1ҾHE1K[MMfDAWAVIAUATAUSH1IHϵHDLLHuHIAuKLHIF`HxHt7HGHHHLc1L{H[]A\A]A^A_@HE C0HE0HCHEHC(HE(HC EfC4Eu1fC6fD@ffC6I~1Ҿsf.@HHHGHGHGHG HG(HG0fS1H11HtSH3~f.Ht;Ht6W1f;Vt HH6H?a\H@1H9Ht#SHH?/WH{&WH[WDfDHt{ATSIHH@uIG ~u&u1HCHMt/SA$H[A\ÃwMtCA$HH[A\HHtt DfD1HL$T$PC HL$T$asH;HSHHCWf1HtGAWAVAUATUSHfÍIt41ҾLE1JHL[]A\A]A^A_A \HIHxx\HIHLH~[E(fA^AF IFAFzDLfI>UI~ULU6fE1^AKDE11ҾLQ@LE1THHtwH?_f.@SHHHt HCH{Ht ttC[u財HCHG DWEL1ɸADBA_DBAAAEuf taЃ<Ѓ<AE E9svQLDFHH9t)MHA|MwH@>H9uAT$MtAH[]A\A]A^A_f.ANDf.DAVAUIATUSHdH%(H$1RAUL11 fDHXSEHku}X5:O@z@5k:I9rT@HI9tG;/uHL_WAuD$%=@tPe/DAa1LvYAy9P8u,DeEt"AzHtHAzuBHD#CaEuE1H$dH3<%(DHĠ[]A\A]A^@ZHAADPEED#]Z:R:aBzaDˆ?:f@u}X:HHEE11\Aff.AUATIUSHHtF HIHEHtNL(HhHHhHL[]A\A]H4H@H1ҾH1[]A\A]I|$1ҾǬDSHdH%(H$1HHbL$ H$MIB@HHHI9uE1IK E1HtLftL3HHuO IIuE1@K E1HtLftL3HHuO IIuE1@K E1HtLftL3HHuO IIuuHHtUE1K E1HtLftL3HHuO IIuǃu_HH^HH1H$dH34%(uXH[HxHL1f.tH39HHuQHtHL1tH39HHu>H_H?t3@t;H _f@t*HDFA1EB3<uމfSDBH k_AIII@1DAB A3E3^3B3AÉA B3@3F33ADЉAB B3@3^ 33AÉA B3@3F33ADЉAB B3@3^33AA B3@3FH 33ADЉAB B3@3^33AىA B3<33L9[H ]1ADAċHcLD8:u%D8l:uA<$@8:uA|$@8zt(!4sA9rD9[AG]A\A]A^A_I|$HDBD8GDzD8DBD8GDzD8DBD8GDzD8DBD8GHHD:D8?AH9|$AErHT$H))9+;|$HD$}?HcElEHHHHHHH뙉@AWAVAUATUSHH(GDIHD$HAVHD$DAHH<H|$Lf.ED艃0=IHDBE9sD{X)lj)9AL;EgE E9싃w1EHHKPAwI7LH:HIG8@,tM/MoE勃?fDLkPD{|)EDWDCpATAD1D!SpYDGAD#SLGDD1LChD!AщSpOHLK`EfGQfA8D0Au=H(HCXH9s]HH90H)H=HFHCPHt HH(H([]A\A]A^A_@L|$H{PJ4?Ls9stHChD)L)HHpD)HщH4HfDHA9wdD)H9fuHD$HC`H|$H48HA9wD)H9fuEfE1H9fDuE@E1H9fDuf.HH9H)H)H{PHH9HFH15H(H([]A\A]A^A_fDI`DH!IG`}I`DHIG`]HxHHDHH) 1HVDA1f|3DED)f.AWAVAUATUSHH(t$DfAfD+HfEAH ffAHEBf E1ҋDDL[P;k|AE)D;Dw AAǃЉA4BspA1!ʼnkpEA]HKPBsp#{LHKh1#C|CpHAHK`0f4yftCD)-9HLOyHHHSPE1E1fEf;DpAEDPH1H)Hx HsPH1HJH+Lm8HLNEe(D9e DFe ENHx 1H([]A\A]A^A_fCDIHD$HH$AGAHЉl$HHD$DTEE1䋓EDAA2HhCDDkXD$E)A)9H+DeERE9w1ILsPHuEELLr4HE8@,)LmLmDIDL[PDk|)։A<F{pA1D!CpQ@~AD#KLA<;1H{hD!ACpJHDp EH\$fDE\$ E HD$@@fy, AHH HD$t ȺBH|$Gq)HO)ЋW(rw($W(HOrw(tUG(IT$`HOHpw(@4G(HOpw(G(AT$`HOpw(4G(HOpw(111FID$`HD$@%@Mt$8L#{An(AD$ 9G5Ht$AD$~HfDDOErHd:HG0xfDHD$HH0Hy H\$Q C89D3HAHKS(9HK0C8Q C89S(H;{uDyDEt A9 Mt$8L'zEn(E9l$ EFl$ Eu#{(HK0H;{C8I sI|$Iv EL M|$M~ M|$(E)l$ E)n(uIFIF DqDH\$E DC(9HD$@DƃIHD$HH0D\$$H\$Ld$(E |$$ǃ H1H)Hx HCPHH\$HzH+L}8HLxEo(D9m DFm E Ht$HDh EFH|$O,yG(IT$`pHG2Hw(G(HOpw(G(AT$`HOpw(4G(HOpw(Mt$8LNxAF(A9D$ AFD$ Ht$F,~؉F,HD$D@(1EH8[]A\A]A^A_ÅEHD$2t$$&I|$Iv ALAD$ Ml$Mn Ml$()AD$ A)n(IVIV |$$H\$Hǃ! |$$\$$P Mt$8LCwAF(AT$ 9G…;  @@8@IDHy((H\$3C8HI(Ax{8HKDC(DC(HK0DH;SuDiDEt D9+Mt$8LvEn(E9l$ EFl$ EuS(HK0H;SI yI|$Iv ELlM|$M~ M|$(E)l$ E)n(uIFIF HK0H\$C(yDt"9s)HsI|$`HK0ID$`C(Ht$F8F[Hy8H\$2C8HI8D@DC8HKS(9S(HK0H;{uDYDEt9Mt$8LcuEn(E9l$ EFl$ Eu{(HK0H;{H|@I|$Iv ELLM|$M~ M|$(E)l$ E)n(uIFIF HC0H\$S(@D9s)HsI|$`ID$`HC0S(@DHt$FgօtcHL$FH;A\H\$IT$`N1HCK(0C(IT$`HKpHs(11Ps(ID$`CqmHD$@qZH\$Ld$(D{HSPE1HǃfDNHHʃfPD@D9EuKDQH4 IHL$HHt$H4Ht$OESEDAA-HD`ESDDkXE)A)9L;EgEE9w1ILCPI7EAWLL IIG8@,1M/MoEDDLkPD{|)։A|F{pAD1D!CpPf~AD#SLA|=1H{hD!ACpJ==Ea)ǃHsPH9@:z#@:zHLS@:z^@:zx@:ze@:zR@:z?@:zH@8:AL9AEt @:ztHD)9‰‹HBfHiHGPHG@f.rfDH9CHHE0VH>fHHAUATUSHLf8MoH0oFGoF G oF0G0oF@G@oFPGPoF`G`HPU@HHHE8I$H{HLHHI$(H)H)΁0H(HH+sDH}PU@sDH}PHCPU@stH}PHC`U@H}PHChU@H{PIHCHH{`H{hHCDIt$PSDH{`It$`HStH{hIt$hHSH{It$vID$ HSHI+D$HC H@HHILMHHH H HH` H Hx 1H[]A\A]fDH8f.ffHHG8HPH@ HG(HGHG0tHW`HPH@@ @H@(H@H@PHHPhHP`H1øf.HHG8HPH@4@<H@ HG(HGHG0tHW`HPH@@ @H@(H@H@PHHPhHP`H1Ðf.HfAUATUSHHLg8MEAAA0L؍CvIt$@HA;\$0H}PUHHE8ID$@El$A\$0HPH@4@<H@ HE(HEHE0ugHPH@@ @H@(H@H@PHHPhHP`H1H[]A\A]ÐHU`E1fDEl$A\$0L1fD뵸Ðf.H:1pUSHHHHG@HG0HLHPH{H-HXHC8H@@0LMv҉Ph0H@4@<H@ HC(HCHC0uhHPH@@ @H@(H@H@PHHPhHP`H1H[]fDHS`H{PHSHHC8H[]f1H bHSHHaHGPHG@1fDf.i_ff.HG>1>p5SHHH;HO@HG0HH{HHPHHPfo|-HC8HH@@HT$@@0H@ HC(~D$HCflHC0HC`@@ @H@(H@H@PHH@`1H[H y`HGPHO@1H{HHi`HSHf.뫸fHtcH8HtZx>QDOPFA wCDGPHDɃ!1HcHWHfHGHGP1fDfAWAVAUATUSHXdH%(HD$H1Ht$EHo8IH5HGHH$$L'GMD$ E u E |$EU D\$ L}H]PwDT$EEӉt$8H=7"HcHfDEE EEڃEEIEq EA$ASMt$HKIǃ/QAD$ASMt$HKIǃ(AD$ASMt$HKIǃAD$Mt$A HINjT$}HED)҉IM(HM t6H4$DT$8D\$H)΅HD\$DT$8}HEIE`Lu3HLLHHH LHHHH9WH MDT$AIE0EHADEA4$IT$AHIDMLHE 'E IIԉكIEA$AvIT$HKIǃAD$AvIT$HKIǃAD$AvIT$HKIǃqAD$IT$A HILAHH5H9HEIEAIE0EfDH$EETH$AEAAH$t$LE] MeEuIEL}H]PdIEE] MeEuL}H]PH$E 2Dž!H=c|$EH}`H=H}hH H}pKIIf.E6@u\ EET$EXD)9)9E8 DE HEEAIE0EeDEAHt$HdH34%(DHX[]A\A]A^A_f.U\ETEMtLMhD|$׉D!IP0DP9AsWE @EIAD$AHIljD!IP0DP9AwD|$@ID)@@HEEAIE0E-D.EA$AVI|$HKIǃ7AD$AVI|$HKIǃmAD$AVI|$HIǃ[AD$I|$AHILLIHH1ہH LIHELE1HHEIE`E } 8111D\$]XD\$HEIE`E |$8(fDEEE1f.DE|DAD$AE9MpDHu`҉D!HHx9sQEfDE IAD$AHIljD!HXx9wȉΉىfHffp9v3E EW IAT$AHI9r܉ˉI)1DI DD9*DAD9fEuDE HU(HtHB(ETE HU(HtHB8E HU(Ht BHBD111D\$RD\$HEIE`E fEEEEEDEEEA$AsID$HKI׃AT$AsID$HKI׃eAT$AsID$HKI׃<AT$ID$A HI׋U L9H=IAI}0ED}4H$EU MeE]IEL}H]Pu.D;T$E|$uI]8Dd$HC@E)Hu$K0I}PAU@HHC@S4uK0HC8S4A9 {EA$AVMD$HKIǃ( AD$MD$AHIADD} H+EMEAIE0EEII@ EvA$AVIt$HKIǃ  AD$It$AHILLDHH IM|Exw zHEIEAIE0E@uDT$8D\$ApHM(Ht LHEM1E1EU\;DžEE1fEIE1E1.M$fH!EEAIE0EH$EEuEU MeAIEL}H]P|MXAN111D\$LD$ E1~Ht$DAHEHfDD$D~LD$ HE1ED\$MJH}Ht$DD|$DILD$ D\$D|$Ef~LD$ HED\$LHPT$HHLEpMHHE`Ep D\$9HEڃEMAIE0E-EIE1E1E1u|HLEtHL$ MEtD\$HEhHHt$(D\$HEEAIE0EEIEAIHtKHG8HtBHWHHt9SHp@HHPHtHSHHC8H{PHHC81[ff.HtcUSHH_8HtZHՋS8HtHu1HtS8UH[]fDsFPHVHFPHHVHDPHшT$HAv3D@L$HHAvL$HHv H L$HAHNHFPALD$11A+ED)ЃAID9s5Et0EA8uȃAID9rf.D_EL1A u*@E7)уA9v+t'E A8ũA9wIHO)GLHOFHW(HF4F<HF HG(HGHG0HPFF FHF(HHFhHF`HHFHHFP1HOHW( H\$dH3%(H[fDA1ZD1fD~PHG`9@AXfD1A13at@Ht+HW8Ht"1: t fRP1Df.HHAUATUSHLf8MHF@HzH~HoHHH~PHITMD$@Mt$AL$0H{PS@HIoI}LLEHH)H)΁oCEoC E oC0E0oC@E@oCPEPoC`E`I$IEI$IIPHI$PIT$`H9r&I$H9wH)HIU`IT$hH)HIUhI$H)HMItAL$0It$@LHIME@1Lm8H[]A\A]H{PLSHfθfHtHW8Htǂff.HtKHW8HtBHc Ht t f+rTHÐRTHfHAWAVAUATUSfHdH%(H$1HL$LD$)D$P)D$`t"JHLDNDHfDLPI9uDD$nfEf|$lf|$j f|$h* f|$f6 f|$dB f|$bt f|$` f|$^@ f|$\ f|$Z f|$X f|$V f|$T f|$R H\$HHP@H@@HD$1H$dH3%( HĨ[]A\A]A^A_f|$RAff|$T f|$VAff|$XZAf|$ZAf|$\Af|$^Af|$`A  f|$bA f|$dA f|$fA f|$hA f|$jA f|$lӃDDT$RD)ED\$TD)El$V)AqDd$XD)D]Dt$ZD)EIDt$\D)fDt$2Dt$^D)fDt$Dt$`D)fDt$ Dt$bD)fDt$$Dt$dD)fDt$HDt$fɸD)fDt$(Dt$hD)fDt$0Dt$jD)fDt$8D4 L$lA)fL$DrD9gtAEHD$1fDT$vEfL$rfDT$xAfDl$tfDT$zEfDT$|fDT$fDT$~fDT$fD$fDT$ fD$fDT$$fD$fDT$HfD$fDT$(fD$fDT$0fD$fDT$8fD$fDT$fD$3DR1If VftDDLpEXfCAfD\LpHL9uD9AG9BÉD$D$t=TLL$0LL$8D$D$ND$OHD$Dt$1D|$ D$$E1E1Ht$(ML D$Ld$@D$HDAE1AGE);D$H|pHD$0DpHD$84pAD)ADDf.D)ȍIDDZfruKtfutP!AtLPVffTLPu;\$ DH\$(AWSt$9T$H!;T$$EADL$ DDM$E)DD9ˉttP)A~At=D9ttP)AvA|5D9=||P).AvA|5D9||P) AvA|5D9||P)AvA|5D9||P)AvA|5D9||P)AvA|5D9||P)AvA|5D9k||P)\Av A|5D9H||P)9Av A|5D9%||P)Av A|5D9||P)A~ At=D9sWttP)~LAv < AL5D9LLP)υAvtI1@DXfPD$H\$@HH\$HHD$\$1f|$RAuf|$Rf|$TAӃf|$RAӃA v l bX N Df|$RA"DAAAAwHJD$D$OD$NHD$0HlHD$8if|$RA,f|$RAvAVAUATUSDFAۃAɁ2HcLNL\ A1MDD9w9؋$D FIcH,  AAE EA)fD A9$D  DD EA)f A9ى$tz  D)f 9O(HoDaDg(D G(!HOD`Dg(@,Dы$)f D$DD9DŻ1IAM9BA19D $EDA9IcH  AAD EA)f A9O(LgDiDo(A O(D!H_DiDo(D$ DD$D)AL,f Љ$  AAD EA)f A9O(LgDiDo(A O(D!H_DiDo(D$ DD$D)ALf $RHO ӋW(f jo(W(!HOjo(Dы$)у$f 9fI1DM9˻A9[]A\A]A^   AAE EA)fD A9ك $HGAAO(E fD Y_(D$G(!HOho(Dы$) $f O1UDO(LoDqDw(Ed O(D!LgDqDw(E, DD$D)ALAf $  AAE EA)fD A92ك $} HGAAO(E fD Y_(D$G(!HOho(Dы$) $f 8 É$f щ$rO(LgDqDw(A G(D!HODpDw(D$DD$D)AALDfD $0щ$fЉ$bO(LoDqDw(Ed O(D!LgDqDw(E, DD$D)ALAf  $ DAE 쉏$fD O(LoDqDw(Ed O(D!LgDqDw(E, DD$D)ALAf  $DAE 쉏$fD y DAW$AVAUEATUAS>E1L%H-NAEHEEE)AA A9DfD 8O(LWDiDo(A G(D!HODhDo(DD$D)ACL EDfD $D9LELAGHG EEMcGEN,EuEmEAD AE)f A9O(DyD(LAG(!DxD(LA D$D)ACL7DfD $FlEtL5G+ EEAD AE)f A97O(LWDqDw(A G(D!HODpDw(DD$DD)CL*f $AAL5EG,N EqE EAD AE)f A9jO(LWDyD(A G(D!HODxD(DD$D)ACL2DfD $L5AG EL5G+AE)EEAA A9DfD O(LWDiDo(A G(D!HODhDo(DD$D)AD9CL DfD E‰$vAAA)AE A9fD |y[$]A\A]A^A_fDDɉ$fD$fD$fEL5AAG,;D鉏$ fO(LGDIDO(EO(D!LGDQDW(E D$[]D)AD$A\f A]A^A_AWAVAUATUSHxHFL6Ht$8dH%(H\$h1H0@H=HD$ P11AH(LcB ƄAHH9tfA<u1fA\HH9uDD$4AHcHH)Hf L DD$4GM11DRDAA fEƄHDHH)AAIcIcHMDD$4DH\$8Lcs$$B Ic9ÉT$LcC,f. D Hc9^Hc9L Mc MG}"Mc CfD9ʐfD9ruIcB8/wI,$\$ GHcHJHcLcHcL$HHH\$HLHH4NH$HH7H\$ HH\$(@A_\$0 \$H\$ B{ \$ yLcC, D Hc9|fHc9L Mc MG~*Mc CfD9ffD9ruIcB8/w\$HcL$DHl$ Lc Ht$(H$OB I4DF EfDfE.DFEZAIE8AC˃ \$fAXDkf^ 6A,. D Hc9|^Hc9LMc MG ~"Mc CfD9rUDfD9ruH$Ic8 wD\$IHD$H$Dl$ @AEAEDAE5DB'B:GEFSB'B:GEFSB'B:GEFD$0LJ1fA<H HD$8XLH@\$HXL h@ H\$H\$ fALMHc<Lt$Dt$D)LE1HL|DIc HHM0ARAT9}AA9fAR|`Lc1fBO 9H\$)HcɋLcAL4AoLHcHL $~$H$$fIM9_Lt$EAmAXADxLcD)Ap4$pt$pt$pt$J gM f DAf3 4$Ef t$D $f t$DL$f t$DL$f DHDf DPDf~ DHDf| DPDfu{z DHDfzx DPDfuQv DHDfPt DPDfu'r DHDf&p pfDHcMcfw fBO f A9tpb fD$Bf fD$Df fD$Ff fD$Hf fD$Jf fD$Lf fD$Nf fD$Pf fD$Rf fD$Tf fD$Vf fD$Xf fD$Zf fD$\f fD$^HcD$4MMDLWt,HcLD@qftD@1fD 4ufHI9uHD$hdH3%(Hx[]A\A]A^A_Afl$=DF_ EtMVHc@Hc 9|RMEbA9tMM)E"LIHfABHAuIۉ/EfH뚾LL$4NfD1L HcI4HcDJADA HfDƄH~L$4<DT$H\$D)L E1HL\DIc I4HVAT9}AA9fV|*LcfBg 9 )HcLcIHIM9u0DL$1D$4wD9|XD9t HcfA fA$ uH1AI9AAuA$ Ic$h I$ AfDTEAEAAI$ M A1Gf.9t.D9}?LcfC tW9AAA1HL9tO>D9|tD9t HcfA fA$ uH1AL9AAuI$x LHT$fA$ HT$'fA$ :fA$ 8fA$  fA$ fA$ fA$ fA$ fA$ fA$ fA$ fA$ fA$ fA$ fA$ fA$ ACI$I$H I$H HHHH9HFL9r |$BA$A$$E$ H9AE AA A$$fE$  E$h A$P IL$A AD$(fE$ DPET$(D AD$(E$!IL$DPET$(D A$$)HfA$ A$$ A,AML$AAL$(D fA$ DQET$(A< AL$(E$!I|$DQET$(D A$$)OfA$  A$$I|$ AD$(fA$ DHEL$( AD$(A$!IL$DHEL$(@<A$$)OfA$ A$$1AL lAL$(M\$HDyE|$(A AD$(E$!IL$DxE|$(DDE$$D)AKA9fA$ A$$~=A49A AAD ؃ fA$ pHA9A$$HLDHHHu ^fA$ Y ;fA$ =AAA1DAAA16fA$ fA$ HI$D@HHH97tf8t1ɉOX)HBL9r|$HH E$ A$$I$I$ AUIt$҉AL$(D fA$ yA|$(AD$(A$!IL$xA|$(@4A$$) A$$fA$ HH59LI$<f1Hf{H9uI$0 f1HfuH9uI$ I$ 1HfHH9uEIDŽ$fA$IDŽ$ADŽ$ADŽ$uH[]A\A]A^A_A$$~A$ AD$(IT$pAt$( 1ADŽ$$fA$ H[]A\A]A^A_DLLAED A$$fA$ IL$A AT$(fE$ zA|$(D AT$(A$!IL$DJEL$(@<A$$)JAfA$ A$$eAD$(A$ IT$pAt$( A$! A$$fA$ *Ap A$$fA$ zD A$$fA$ YHI$fA$I$f.HH9f8txDFCD@H۾Ծ; ƾ 뿾 븾 뱾몾룾뜾땾뎾 DLfA4HLHȃAtcHL҃fw+H$0f ;ÐDfHaf.H}9)HHÐf.&fDH}HAWAVHAUATUSIDT$HD$3Hr(-MʉD$IHD$fDAErIEjEbAjAZEZEJLEBAzIAREzMLMLLLHHIHK4EJIHt$L\$IArLEJHL$L\$IAJMMLMHLHHHHIHLHT$L;T$.H/ H|$MILH)HHHHiI)H/ HHH)HHHHiH)ǁ|$D$H|$D$HIL|$H|$/FILH|$FILH|$FILH|$FILH|$FILH|$FILH|$FILH|$FIL H|$tsF IL H|$t_F IL H|$tKF IL H|$t7F IL H|$t#F ILH|$tFILH|$IIH/ H|$LGHD$HHH)HHHHiH)HHL []A\A]A^A_IIILGHD$[]LHH=A\HGHL A]A^A_ÅD$HHLHD$AEqIEiEaAiAYEYEQLEAAyIAqAQMLEyMLLLHHIHMLMLLLHHH 2AQHHL$HD$HAIHT$HD$HAQHHIHLHD$L;L$1D$|$DVAIL|$H|$=AQILH|$$AQILH|$ AQILH|$AQILH|$AQILH|$AQILH|$AQILH|$AQILH|$tyAQ IL H|$tdAQ IL H|$tOAQ IL H|$t:AQ IL H|$t%AQ IL H|$tAAILH|$LH/ H|$HLH)HHHHiI)HD$HHH)HHHHiH)H|$HD$[]HA\L A]A^A_ÉT$1D$-&Df.HIиLH◆pHLIH?HLHH)HiI)MLDHH)HLH/ HLH)HH¸HHiI)LJHtHAH=vHHHHGHHHGHH HIиLH◆pHLIH?HLHH)HiI)MLDHH)HLH/ HLH)HH¸HHiI)LJHtHAH=vHHHHGHHHGHH AWAVIAUATUSH@HL8LhGAOtEgIIAL]HL$AIMOL$uIIL]HL$AIMOL$D)DIɍO|$0NT y1ɉ|$H|$(LH|$E1foAA HD9L$w|$DL$A)IHL$;|$0HL$tAyH|9HD IH9E uL$ Hl L$HH)H|$FHZIF0APH.LT$L])LL\$O OT L9LUD$L$M9ADsjIMD_AAJD\$ D9EHL$HAHL$HL$IMzL\$AIKHL$HMHL$LE[D]D_IIHIAHL$HMHL$LE[D]D_IHIAHL$HMHL$LE[D]D_IHIAHL$HMHL$LE[D]D_IHIAHL$HMHL$LE[D]D_IHIAHL$HMHL$LE[D]D_^IHIAHL$HMHL$LE[D]D_/IHI A HL$HM HL$LE[ D] D_IHI A HL$HM HL$LE[ D] D_IHI A HL$HM HL$LE[ D] D_IHI A HL$HM HL$LE[ D] D_twIHI A HL$HM HL$LE[ D] D_tLIHIAHL$HMHL$LE[D]D_u!IHIHL$HMHL$AKD_MD)DDW|$(AAzLT |$I< H|$1E1DfoAA HD;L$rDT$LL$DADD)IHL$D;T$(HL$<H|9HDIH9EuHL$|$ LL9HHDHI9DuL\$LT$D)JLMJL9JLAI9AAD\$D9\$D\$EE AHODOsEJ|$IJMDT$HL$HODOEK|$IKDT$HL$HODOEK|$IKDT$HL$HODOEK|$IKDT$HL$HODOdEK|$IKDT$HL$HODO>EK|$IKDT$HL$HODOEK|$IKD$HL$HODOEK|$ IKDT$HL$HO DO EK |$ IK DT$HL$HO DO EK |$ IK ET$HL$HO DO EK |$ IK ET$HL$HO DO t_EK |$ IK ET$HL$HO DO t=EK |$IK ET$HL$HODOuEKIKET$HL$HODODL$L\$D$ ML\$L\$OLN\ E11L\$L\$HD$fBoHD$BI;l$rHl$D+T$ЋD$ IHl$;l$EL\$DT$t"AOT IE HM9D uDT$̋L$JlHH)H|$HL$|$ LL9HHDHL9DuHL$L\$|$0LL9HHDHL9DuvIHL$HL$AHl$|$Hl$ AHL$H|$IAIHL$LT$DT$}DT$Hl$1MJD\ D\HI9uEHIEHL\$DR9BI91Hȵ9@SHH9Hz9H˺9H9H9H9H9Hx9H9u'!t C9H̼9W1[¸u[fDfDHt;Ht6HAMAu$Mt9t%t91ff.@SH59HH9L۹9H ܹ9L Ź9#9t t( t l9H91[@[Ð9t ӻ9t H9uH9HfDHdH%(HD$1~9unH9i9H9H9H9H9H9H9Hظ9H9H¸9tAH 9H Hu H$HT$dH3%(uH1_Df.HHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H+t.H$H$D$0HD$HD$ HD$IHL$dH3 %(uH%_DAWAVAUATUSH(dH%(HD$1HH`HcH_hHHH1uHH{ABHD$Ld$H]`E1HD$D$1IM1ҹHIekuyT$E1Ht$H5uYD$uLHNsHtD`DHHUHL$dH3 %(DH([]A\A]A^A_A+DE@LHHLZH [EoADA EM-H5IA&LHqAtBA2eHHtHEhRA+DADE]Ht 6?fD@f.HXdH%(HD$1HD$`HT$0$HD$HD$ HD$1HL$dH3 %(uHX\f.USH NH9HHHHxHH@HD״9HH '9HH  Hǃ HH&=0 Hǃ Hǃ 0 ( ( HHt*HHHp)HHHHtHHHtpHHt߳9HHtKƃHHt9HHt&ƃHǃNHH Hǃt9H Hǃ \9HHǃ D9HHǃ,9HHǃ;H19HH[]ff.USH1HHpL9HHǃpLHǃxLʘH:H H(HHǃ HǃHHH)HH>H HǃHǃ H) HHH0 HǃJH[]ATUHS H uOLKMtCHKKLHLJKHLD$ 9D$ uf.00t 1Hr1H[]A\AUATUSH(dH%(HD$1HHtIIHt$IH~tiH|$LD$HELLuHT$HUH5R HL$dH3 %(u/H([]A\A]@+ڐH541HXAUATUSH(dH%(HD$1HHD$HtXIHt$IH|H|$LD$LHELHT$HtrHutyHUH5j$HL$dH3 %(uVH([]A\A]@+fH5D1H7fQW@SHHLJP HLJX HLJ` HLJh HLJp HLJ8 HLJx HLJ MLJ(MHLJ0MƇ8MHLJ@MHLJHMHLJPMHLJXMHLJ`MHhMܮ9HpMHǃhMĮ9HǃpMƃxMHƃMHǃMHǃMHǃMǃM1[ff.USHhdH%(HD$(1HHT$@HL$HLD$PLL$X0H$D$HD$HD$0HD$ %=0Q== HD$ D$HXH .HCHcHfHNHoH|$HH|$NHLJNyHpx1t!HihHHN1@H\$(dH3%(iHh[]D=@t]=PuHD$ D$HXHt,Ptl0HD$ D$HHHt0wHHcHHD$ D$HXHt@wHHcH118HM1H;',H1fH1HMH1HǰM1H9HH1HxM1H9HpMH1HPLH1HH1HhMH1qHHHHDH1RH@MH1AHc MH10HxH1H0MH1HH1HHMH1MH1H(H1(M $  H1HMH1HLH1zHLH1iHLH1X8MH1G1tyHH1/H`MH1Hc$KH1 HPMH1HXMH1Hc$MH1HMH11H1H1H1H11gQHD$ D$HHH0HګHcH` 12x 1p 1 0 ͛ tfH* 0 @ tfH* f1H*H f1H*@ f1H* f1H* lh 1YX 1FP 138 1 HV1HtHGH)H;H=9HUf.Hot SHH?/H[%9f.:9HS9tDHH CH FCLH=1uH99H@ک9u@H=9H@9HÐ1HtfH(Huf@f.GIt- u Hw Hѿ LH1DHw HѿLHSH0dH%(HD$(1HteHPHt[HptH|$Q~H{PD$Ht$H)D$@H{pt HHD$(dH3%(uH0[MAVAUAATUHSH L'dH%(HD$1I|$pMtHL+L+H=H1D1EHHtr:t+t')UH @:tHH JuHLI}PLpHL|>HHIuFHU9HCI|$pt LHt$dH34%(Hu~H []A\A]A^H|$fPHSIHH$tHt$H)H9H56L11BI}PLHS=H¤9mDH9Z Lf.AVAU1ATIUH=]SIH։E1CHHńt2:t-SHf.:tHH JuH_KIƿ9HHtdH{HCL+POH{t9I|$PIVHHE;HItEH@Hǣ9[L]A\A]A^HCfDE1H9[L]A\A]A^H9H~9@AWAVIAUATIUSHHHHdH%(HD$81Ht$T$H{pItHmM'T$Ht$H=1SBHH7D0A:t5Et0cRH fDA:tH0AHQD1EuHII|$PHHHHD$;HII$u`HE1|9HT$H51HηIFH{p>MuH\$8dH3%(DtHH[]A\A]A^A_@H|$(vMIVI$HHD$ tH|$(H)H9oH5@L1NI|$PHT$H\:Hˡ9H{pt H<LD T$Ht$HL$ L HHH{ptHL$HT$HHH{pIt HE1MHAL(HfDH9*f.D$ uAE1|Au*Hf.SHHHdH%(H$x1MD$3H|$Ht$T$$HL$(D$4HD$ LD$8HD$8HHD$8H=H=9[OH|$H51D$4D$3D$4fDH$xdH3%(YHĀ[fDHD$8HD$8HTHL$(T$$Ht$H|$ DHT$8H|$H51x끐H$1HIEfo$HH$p1ҿ)D$@D$3fo$H$H)D$PH$fo$)D$`fo$)D$pfo$ )$fo$0)$fo$@)$fo$P)$fo$`$h)$~DHS㥛 HL$8HH?HHHH)OGHL$(T$$Ht$H|$D$4ËD$4&1GD$3Ht$@1ҿDD$4HHT$HH8H0HS㥛 H|$4HHH)tHv2D$4x*FH|$H5s1萴sFDfUSHHHtrHpHt8yHmt)HCpHt;HH߾[]fDHnuH} $H9HCpHuH[]HnuH>#HH[]%9fH I8H8L2Ht[USHHHHptHq6H{ptHH߾[]H[]fH86AWAVAUATUSHH8HdH%(H$(1HHD$L$ Ld$ H$?H $H51MLGHH5՟H1 H[HtRH;Ht?-uH $H5H1LGCHH5Q1H述H[HufDHDž1fDt$L &HI T$H=1LK:HI:t0҈T$t(ZJLT$:tH0HQuLAH}pHtHHL$HL$H}PHQL3LHD$s9HD$H=L!H}pt HL$H5jMLH1薯T$H=1L[9HID8A:t2Et-kIL fDA:tHHB JD:EuL@H}pItHH}PIWL2H}pt H Lz9DH}pt HL| H$(dH3%(u]H8[]A\A]A^A_fL$LLH~HtH@HhHH5FH1LA,!AAAAA HzMcMH|$@jvIfHzHcHH|$@jIIQHJIIHXIQHJIIMAIPIQbA/wADIQAEHcHP+MAIPIQIQHJIIWIQHJII뿐f.HHL$XLD$`LL$ht=)D$p)$)$)$)$)$)$)$dH%(HD$81H$HL$ HD$(Ht$HD$@H5H<$HD$ D$$0HD$0HD$LtHT$HtH;T$H $t"Ht$8dH34%(uHA*DAWAVIAUATIUSHHHLd$@H$@dH%(H$1La EH 1HD$MHL$t1<%u]}%L%A׃tEHu@H$dH3 %(Hĸ[]A\A]A^A_D}LA׃tHEy<%upD1HH01 HTPEDNut<$CHD$HD$HH$DH4HH@HD$IЉ΁HD$HHD$HHPHHXHIXHD$H@wK@H=݉HcH@@ HD$HHX0 fImIEJŀHzHD$HHPdfHHD$HLXMI؃fDf HDŽ$@%HDŽ$H)$Pu@ HHXŀHD$HLPL$@Ƅ$A-Il$tE+HtE HtE#HHEAxBHEEHHNH1LD$(LL$ LD$(LL$ HHI)HD$HMXxb Df.D @^Hf.sHPI9HLLOH1L(HHHD$HXHD$HUHD tHMElHHʩ% EEH$`LFHh.$`@ufDH}@LA׃u @HD$HLXMjHHl$ HL‰HH)IHIHHT$(t'L"A׃HD$HDFHD$(HHh) HHL A׃uJf.HD$H$HHLX%D$ n LD$ ALA׃HD$LD$ HDCIhH5DH#L A׃ufDHD$HHXHHHЅID$ D$(HD¾E1HD$H$`HH$HD$0MLDLLT$D1IHAHAT$uL)I)H)EH*ML$I)AHHELLOՃHrHHBHHOH9H H_ HIt$A$0HE:HIt$AD$0HE!HIt$AD$0HEHIt$AD$0HEHIt$AD$0HEHIt$AD$0HEHIt$AD$0HEHIt$AD$0HEH It$AD$0HEtvH It$AD$0HEtaH It$AD$0HEtLH It$AD$0HEt7H It$AD$0HEt"HIt$AD$0HEu HELAD$0LNHt$8I)~D$8I)LL$8LML$D$8foH1fo ؃HIA)QffH9rLHH)H)L9fI~tIDIAD$0ITH)H|$(I@T$ LE%GIPwHIhfDHHEHL A׃u/HcHBHHDD$HD$HD$HcHHXHb% GEXL$@Il$IHD$HHPHLXIhHM`IIL A׃u:IhAL-A׃|$(tIL0A׃CLD$ HD$HEXA׃HD$HD%=HT$0IHDHEI9Hl$ LIf.HL9p}LA׃uLHaHL$ HHA*A<$@t9II,L9tIA|$@tLA׃uHD$HD7L"A׃LL%(f.IA<$@+LA׃ukAAA%D$ DL$(%D$ HD$ E1ɾHD$xA׃4Dl$ DHl$ HD$HDDHLe6fDIIL A׃uMҽIeHHLD$(HD$ L%HkEfLLD$0L$(LD$0HD$ HNjL$(9HUHH]@HHHL0A׃uuMIhILD$ L+A׃LD$ L}HT$ HHBbHl$(LD$ >HD$HDf.HD$HDHLeIIL A׃uHD$(HHhHHL A׃uD$(gA$0IIHD$ʃHDI@HD$(L%|(BfIeHID$(E1ɾ D$ HD$HD7HD$HD"H|$(IhHD$ L%.|sHD$ Hl$(HDD$(E1ɾ PIMML HtVL A׃uiH|E1ɾHD$LH|$ leLMIt@LD$ L A׃[I'IHLLH(Ht$H5`H<$HHD$dH%(HD$1tHT$HtH;T$H $t!Ht$dH34%(uH(fA5DAWAVHAUATIUSHLHL$H$dH%(H$1LA$L zE1L=zfozM1MfozMfo ztX<%t/HA$IHHPHA$<%tԄuDA|$%uHHI%HA$멽H$dH3<%(H[]A\A]A^A_L\$0I)L$ )T$)$$ 1H0L\$0fo$foT$foL$ ITPA$DNut<$ MLH$HH4H@IIԉ΁LIHHLIJJILHwFIcLfD@5 , LHHV (@M#IA$8ŀHtLHHqHIHLMI܃f HDŽ$%HDŽ$)$u@ HHŀ LHLY H$L$Ƅ$-HD$@t A$+It A$ It A$#IHA$AxuHEELHNHw1L\$xLT$ )L$`LD$L $)T$P)\$0HILT$ L\$xLD$L $foL$`I)foT$Pfo\$0LHM%,Df. D^Hf.sHPI9LLL\$PL $LOHv1L)L$0)T$ )\$XHIL $L\$PfoL$0LfoT$ Hfo\$LIT$H tIL$A$lIHʩ% EA$L$HL$@FLL\$0)L$ )T$)$h$L\$0fo$foT$foL$ HL@HHHHufLHLM HuPLL\$`L$ )L$PLL$L$)T$@)\$0YHL\$`L$ LL$L$foL$PfoT$@fo\$0LHH)LLWHHItH"LHHHLfe HL@ H HHHQHuBl%I)HLt9At1HIPK|HJtHHH9HuLH"H"H~fDH$LHHHt$+H6 HLHMHH@LHHHH5sHZsD$D$0AHD$IHL$4IDHHt$ t3ID1HIATHVuHD$ H)I)H)ǀ<$7HhI)HHOHGHT$@HVH$IHT$PAHHOиHT$ IRHHBH9T$ 4M^HFI0HD$ HGH$HFIF0HD$ HGH$zHFIF0HD$ HGH$[HFIF0HD$ HGH$<HFIF0HD$ HGH$HFIF0HD$ HGH$HFIF0HD$ HGH$HFIF0HD$ HGH$HFI F0HD$ HGH$HFI F0HD$ HGH$HFI F0HD$ HGH$tgHFI F0HD$ HGH$tLHFI F0HD$ HGH$t1HFIF0HD$ HGH$uHT$PHGF0H$HT$ H|$@L)L)LV1HHHT$@HT$ HBHT$PHT$@~D$PHD$PH$D$PfoHIA)JfH9frHLT$ HH$H)$fH~I)H9H$LHF0HVH<L)H|$0ID$|$LE%tIMI|$HHf HHHHHuD$l=L)~H-H|$0t0H0HHHH LH )@XHLH%=}IDH9w3HMEfD HHHL9HuHH)lLHpHHOcHH HHHHHul =IT$H HHHHuD DHcHBHIDI+LHcHHHH$L$HD$@IuLHHHLU3% GA$I|$Ht9IHLfD HHHHHuBl%HH ~m( HHuHHuLHtHHO~H HHHHHul I|$}HID$6IH2f.HHHN~)HH HHHHHul LHHHV@4$AADT$}@t$0T$D$$AL-6l@xHHHLILH14IDHIDH|$ HA$fHLWHL@0HHHHHuBlHDD$0A/0HIHVLLIt$Ht|L&kA(f(LIHHL+H`uWHyMHD$0$A D$IHALj DD$0$A @IL$H H;HHWHuIL$l L)LaI$AL-jjHL@Ht$ OLiLtHL HSWLFH1ILALiQf.HIHt$HHT$PHL$XLD$`LL$ht=)D$p)$)$)$)$)$)$)$dH%(HD$81H$HL$ H5HLHD$(HD$@H$HD$HD$D$D$ D$$0HD$0HD$tT$t*Ht=H<$_91Ht$8dH34%(uH<$^91Ht$(dH34%(u=H8DHuH= ^9@1@HD$H$H$HH|$HT$@HL$HLD$PLL$Xt:)D$`)L$p)$)$)$)$)$)$dH%(HD$(1H$HT$H|$HD$HD$0D$D$0HD$ rvHH9HHHT$0HL$(?KHL$(HT$0HXAHH@HH@H~w@HD$`LHHD$K@HHHT$0HL$(JHL$(HT$0H`AHH@HHMIcLLd$IL4BHt$8LǺLD$l$Xl$\&HILD$Ht$AD$8ЋTTDHHHHHt$TfT$@H`2ATUSHH8H=^IH5]HH(HPHH91L;` H9po@HHhH`p[]A\ff.HpHǃpHǃxHHhH`H[]A\fDHp HxHL襒HHuHHPF17f1DHHPHxH9H  [1]A\Hx0AWAVAAUATAUSHO9HHL`PH LHLLH HDLDH脂upH=dVHHC t[H=OVHHC(tF!HHt5HX`H Hǃ8Hǃ HH[]A\A]A^A_fLLHHH{ Hǃ1vWH{(1kWH1N9@f.AUATUSHN9HHL`PH LHLɱLH HLOu{aH.ujH=UHHC tUH=nTHHC(t@˔HHt/HX`H Hǃ8Hǃ HH[]A\A]LhL`HȀH\H{ Hǃ1&VH{(1VH1M9HH[]A\A]f1Ht HcHf.HGAWAVAUATUSHHdH%(HD$81HHt$HT$LD$t H? t(HT$8dH3%(>HH[]A\A]A^A_DHoAHLl$ E1䀽aL1ۍKDAAtVIc|wIPA|AAAB ?D)HHHt$H ƃtA9DLHHuHmHoHD$D01 LHA]DIc|wIc|AAAB ?D)HHHT$H Ema)fAWAVAUATUSHHdH%(HD$81HLD$t H? It'H|$8dH3<%(HH[]A\A]A^A_@HIA׉tSٌH=WHH5WI$I}L;hI$@1H;X 4HcH9OIT$1Ll$ HuDHH@aLuHLHT$GHT$hL$ tttt$$ttt$(pXt$,HH%H6F,;DD fDHI9HIMl$MaHD$ E1HD$MmMAaLuHt$LLD$LD$$Dt$ AIA2fDZT$ tDAAI4T$ fDVtƁjT$$DAI4T$$f~CƁ+T$(DAI4fVT$(ƁT$,DAAI4T$,fDVtDt$0AIA0fDHMmDT$0IAMfxyE[1IAfJA@tfDRDσtfzHAA9A4DIЉ21frAt@uAA@ɋt$$@ɋt$(@ɋt$, @D|$$AIA:fDJT$$$D|$(IA:fJT$(5DD|$,AIA:fDZT$,D#E1Eu(LF9H|$1HD/LljDLD$&YALD$EtIAf.ATуtfAIA9uvfDEt~E11fEt[DHE9HIufDOfDHxHp LH蝇HHtEf.E1E1DtMl$E1MIbEBT$ WL$ @f.ƇHt H? tAUATLUSHHH-HHHEH@81H.#L|HHuHLkPHtLoPLҧHHLRwH{ 1LH{(1LHkHuYMHDž HE`t@L}XLeuHuPH_MHEPEXHDž HE`uL`HP19HX1:HC9H1[]A\A]@f.HteH? u\ATUISHH LHt4H{ 1H7H.KH{ LHoA$H[]A\fD[1]A\f1f.AUATUSHdH%(HD$1HHh`Ht^4$tTLIHLHt5LM0MtHM8L@I<$AHt$L\$ HD$dH3%(u H[]A\A]ff.HXdH%(HD$1HHT$0HL$8LD$@LL$Ht H? tHT$dH3%([HX@HD$`'$HD$HD$ HD$wOS''c HD$H@H01s$Nv:9u:uh.Nu:HD$H@HG@1)fD'&!N't8fDtyw`uHD$H@H1DHD$HXHx8fDHD$HPHx5HD$H@H(1uHD$H@H 1^HD$H@H81GHD$H@H`10HD$H@Hh1HD$H@HG81HD$H@HG01HD$H@HGH1HD$H@HH1HD$H@H@1@Ht H? tHuH1@AUATUSHHH+H=KIH5KHIrL;`H.|L;h }&HxHp LL3Ht&HE1fDHE1H[]A\A]HE1ff.AWAVAUATUSH(Lg`M9IIzHHLHS㥛 HLH?HH)HHiI)MiLH?B~'H$~$H,$$fJ)$Hl$fH~MLILuILMLiILILHH HMHL>9HI]HhHLZG1Ht?I]Hu4HCHHt HHI$IL$H8HpH~LHLDH(L[]A\A]A^A_%=9IHLHD$i=9HItGAoLH|$FHHD$Ht$H|$L7Du L=9MLI$I$LrtH5FL1DR@ILILLI$IuHM@LpI$H([]A\A]A^A_DHD$LMu$MfDL $IALL$H1IIIINL $H8Hp=~H~ Ht H? tHNuH~`uUSHH=FHHBH/UHHL }XӓHtHEPEXH{HHEH HCH(HEHk1HH]`bfHCCHpHXHXHpHpd1H[]fDH}Pt EX^HCPEXHEPJf.EHEHkHkOH}P봸뉐f.Ht H? tH"NuH~`uATUISHH=HAHNUHHL }X2Ht HEPEXfH{HHEH HCH(HEHk1HH]`fHCCHpHXHXHpHp1Hz!}tELe1[]A\fDH}Pt EX>HCPEXHEP*f.EHEHkHk/H}P봸닐f.AWAVHLAUATIUSHH(HD$[zHHHHS㥛 HHH?HHH)HiHH)HiHH?B~ HH@BILu ILt-ILIL2zH~H([]A\A]A^A_fDM~`MtyIIIII?BILuILILILILLLyHMHL79HHeL LhL@E1Ht IHurHLL>-H(H[]A\A]A^A_%K79L$$~$L,$$fC)$fI~Ll$#@HCIHtHHHUHMH8HpxH~pIHLH\$69HHtCAoLH@HH$H4$H|$H=u H69ILIIHAltH5F@L1KHD$MLHMLILM@LHp jIH([]A\A]A^A_@HHuWHCH$HCHHHUHMH8HpwH~f.HG`HHLuHLUSHLHHHHHLHAkt+H5v?H1JH{tHs1H=H{uHDžLHDžLH[]fDfDSHdH%(HD$1t$tBHt$HLjHӺHt$HX1HL$dH3 %(uH[@1HtH(1HtH01HtH@1HtHHHPHXAUATUSHHG(HHI MLH+Lc}uHE؍I}(1H;uH?BH~ HH@BHLu HLtHLHLHuH{1HLMqH[]A\A]f.Ht H? tH*NuHN`1HtAVAUATUHSH~HDnHH97AAHLu HLt`HHHLLHLhtDIt$1Lq:I|$uH{HǃLHǃL{XuHCPCXHtEds1H{AHL_HHLHt1:HǃHLHǃ CHHHCHtHHCH} HC`H7Ht*HH;XufDHH9XHvHuHSHHHHHHPmH[1]A\A]A^E1ApmH'H{Ht"C wAӊH{HHK`H'f.fD18R@HH}HUPHE3H5:H1FAWAVAUATUSHXdH%(HD$H1HHt$ HT$(D$7D$8D$9NIϸaLHL$;L%a<H1HL$HL$9HL$IGH#ƃAWJ BIcLHL$HdH3 %(HX[]A\A]A^A_DIxLH59L1LDAWAGL?AWAƇaLIG1B ƃ>HIGH AW%3AWfL8BHt$ LgHyAGMoxII I H|$ Ht$(InpH5o9HMHL1tEE1A . IAWHAƇaLIH# &I&IGLHXAIGLH`A E AGAo0H{ IW AG M(Hw41At'AGDAƇaLIG1fDC AaL&fDAƇaLIGE1E1IHt 4DAW1<1AuL+0HL$7HT$6IwLY TAWVD10IHt$8r|$8AW( I@ A 3AGA$DAMo1L贅A IAHAaL1IwLD$AAA AAG IHt$7ZLA2IAWfD?f.LXAc Lv.AWIAHAo1=DIG`IGH"ILuIL HHILMHL`tWfIu1LR2I}uAWILJLE1ILJLE1Q(f.IGHH`ALT HI1҉DItIGA8AG'ALAAGAf.IHt$7Dl$7EE1AcAGVfDIHt$7ID@E AW` C AAGfIHD$@D$;HrIHIHL$LHT$nAg t 8 L$9A IHt$@ҋ H|$@ D$9LIGLH`A~IGH`AHHt H81aHIEH|$@A (9IILJHD$@I11MPH|$@E1E1'9DIHT$51@xDl$5AWEIO`HC CC @ A5AGAHI@GHHxHڀH H521HLM<LH|$7AW6AGAIOffDIW.7AW*E1*@IwLAnHIGH@A t AG DE1IwLAqAAtAGfIOD$<H@H@ HtDHt$k 9HH[%Z 9fH%O 9AUATE1USHHHH`HH}`IH`AHHLK(HHMH ALBxM9A u(E1HH g~L9H VHTAHMHHSPH5`Q1HH!XZHD[]A\A]f.LK(IIATUHSHHHXAHsHL#LH;XAt H[]A\fHL9tH:ƅQA1D$ D$ H[]A\fDLXAIHt!H;8u"f.H98tH@HufDSH`AHLHHJHXAHHtƃQAH81[}D[fDHG`HtgAUATIUSHIHHt9HHt1fH+I$H}AtMA;$t"H[HuH1[]A\A]@1DI$H5L1? H[]A\A]Df.AWAVIAUATUSHHL>IH=dHII<$HuMf.Hx 1-fCIuH+HLWII<$HtE 9HHtm 9HHtQ:H蔱HuPfC@E1Mt 1L^M.1H[]A\A]A^A_f.H 9L1-H[]A\A]A^A_ffH;o 9HH뮐f.AVAUATUSHW`HAHA uE1[D]A\A]A^IHIHtHHuH[HtH+H,LHH@tH5~LL16[D]A\A]A^f.HAVAUIATUSL6tmHH=CnHIt~H;Hu&O@It$HLtdHH;Ht+J9HHuL1[]A\A]A^fE1Mt 1LMe1[]A\A]A^L1H9[]A\A]A^Df.H`A1HtHHtH9:fHXA1HtHHtH9:f@u.QAu%HXAHtHHtH;:u ƆQAD@u.PAu%H`AHtHHtH;:u ƆPADƇQAƇPAHI|jYHHIII?H HL)Hc~xHW)QΠEHHHH L)H~H 1zf.HiHHH?I1IHI I) ?HiHHHHHH?L2II)LLHH)1L H. H--:--:--GH@f.HSHH?~~H?HpH96HH9H H9`H'HH9"HH2H10#fDHHH H1 H[fDHYHH1H[fHI H?HHHHI1HIH!蠀fDIHq<HAHHLH1IHIZH[DHHHH13H[fDHH(H1fHH}HH1@f.AWAVAUATUSHHdH%(H$1HǃD REH IH HLHEf. L f8 I*-^f(H,L 1H;H@ fI*^H,HH D迫*HD)RD)M9HcMLL,H¡HHM HhL` D@AD `1A~DD)RD)LcHLI$HHLHTiDHHHDI J+ $H=7AffH*H*^^H,H 0 upLMH H H HHL Aх0 u'( uH H59>1虤fǃ 1H$dH34%(Hĸ[]A\A]A^A_fH9θHMH -HiHHH HHtbfHHfffH* H* H* H* ҅DH5*H1uZHLHtH H5 1$_$H H51$@0 $0 H,HH HH HHHH'HHAdHIHH HHIƀ@QH@ E1E1HI9LL1M~LH)L$LH$LHHD$H$HHHD$k0 JH H L @LtH HIH'"HdHHHLHHIH Ht$rLd$@LT$8HH It$(H$H@ It$HD$0H It$ HD$(H LHD$It$HHD$ H 4$H5 AWt$ Ht$0L\$PM1ASHT$PRt$8AVLT$xLL$`L0H H@ [@E1E1E11gH HHMkdLHHIAH HHHH'I~oHȾdHHHH HHIH@ E11HE1E11E1E1H~7Hk dHHIE1MH~Hk dHHI~E1WE1nf.0 HLJP HLJX HLJh HLJp HLJ HLJ 0 @f.USHHP> w4H5< Hc HHH H H>x H[] >H H H[]fDH H H[]H H H[]HH H H'>P H[]HH H H=X H[]HH H H=` H[]HH H H=h H[]HH H Hg=p H[]SLJ H<Hǃ H H Hǃ Hǃ Hǃ 0 [HSIH)HH|$L\$uMt2H9|5HiILLHILH}<H9~H)H[1[@H[Df.AVAUATUHSHH;HH H~eH IHH+ IH HtSH9=HiH4$L~$H<$$LHH)$H$HL$I;I9~H[]A\A]A^@HuL L H H[]A\A]A^fAVAUATUHSHH;HH H~eH IHH+ IH HtSH9=HiH4$L~$H<$$LHH)$H$HL$I:I9~H[]A\A]A^@HuL L H H[]A\A]A^fH0 x@H 0 @10 H f.H0 x H 0 @10 H f.AWAVAUATUSHHdH%(H$1D 9H IH HLH:f.. L f8 I*^f(H,L 1H9H@ fI*^H,HH D迫*HD)RD)M9HcMLL,H¡HHM HhL` D@AD +1A~DD)RD)LcHLID$HHLHT8HHHDI J+ D$H=7AffH*H*^Q^H,H 0 ̓LMH H H HHL AхH$dH34%(H[]A\A]A^A_H9θHMH 0 ̓i1HiHHH HHtbfHHfffH* H* H* H* ҅DH5H17 u^HLHt!H H51D$ޗD$H H51D$轗0 D$0 L,HH HH HHHH'HHAdHIHH HHIǀ@rH@ E1E1HI9LL1M~LL)H$HHD$ H$LL$HHD$(LL0 @ H H L @LtH HIH'qHȾdHHHLHHIH H$Ld$PLT$@HL$HHH It$(HD$8lH@ It$HD$VH It$ HD$@H LHD$,HL$HIt$HD$0HHT$8H H5JHM1Rt$(AVt$@t$(t$8t$HAWL$LL$pL蜕H H@茞t@t|H@ 1E1HH HHHH'I~aHȾdHHHH HHIH HfH~CMkdLHHIE1E1E11aH~BHk dHHIE1ZE1E1H~Hk dHHI`E1wE1PE1E11vf.AVAUUSH3IIʼn?蛖t8u?u:2LHHL 3)…~011t@@H[]A]A^H1[]A]A^$AWAVAAUATUSAHHdH%(HD$81T$A!H&E1E1It 1M~9D@ALD$t$ 1LD$t$ IIA>Dd$ D$$D$ D$AHcD$L$ D| D$|$˃tHcY| D$Hl$ HcMx91ҹHHNtڋ5D8ut˻H|$8dH3<%(%HH[]A\A]A^A_Ð|${AfDHH͗u ct݋8ut@u1AtD$&1ۨYÉڃEAtHcD$ڃD&YEډڃEڃ|$'HcD$ ڃD&fEډڃ8EHHLD$`裓LD$t 8LD$/LHHL0LD$D)ƅH@1fD$D$ D$ D$ɉtxsk/IIʼnEt=_8!9/LHHLx/)…l11Ӛt薒覔fDAWAVAUATUSHHt>At7E1E1҃?HJHGVHDHx*H9u z.IIʼnD t=o8I.LHHL.)…11At1҅ALHL $LT$趙A*腑L $LT$t 8L $LT$-L $LT$HHLL-L $LT$)…4fDE1HD[]A\A]A^A_1҅~ ]-IIExN>1LHAukƐt5*8utAfLH諘Au#~t8utEx5AMHCHtxttftfHH9uAf.1f.ATUSHHH$@H$HL$PL$Xt@)$`)$p)$)$)$)$)$)$dH%(H$(1Ht u-H$(dH3%(H[]A\f.H$ Ld$ HL$HD$HD$H$0LLD$ 0HD$IwUH!%tDHUHD@HHL)HtL(HL1H.H H=H HLԘZf.ATUSHHHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$HH@H HD$HD$ $D$0HD$uH0Ht K}tUL LEH=?HwA H H(L HHtcL(HL1HHD$dH3%(uxH[]A\H H&1vcƃ K]f.H H=3H HLx袎fAWAVAAUATUSHHH$L$L$t@)$ )$0)$@)$P)$`)$p)$)$dH%(H$1H$Ht$(HHD$0H$LmD$(D$,0HD$8HHD$IHL|$$葍HHD$@HD$fAufL9TL)M1D9DD$$MHLHHHLTHIyD$$HQE1AtfALMH|$LyH H}1L$xaLL$L$AI!%tDIQLDHT$III)HL$1M(LLЅL$IHLL$M(LLL$L91$H|$8$H$dH3 %(uwHĨ[]A\A]A^A_Ð7fI H=LT$L $CL $I H|$L<$+觋SHE1LHdH<%(H|$19DD$LD$HALILBT1HHx"H\$dH3%(u7H[f.T$tQuH17@AUATHcUSHIMHH@@tGHC` LDHL@ >Hƃ@A$Ht4HH[]A\A]@L裊HA$HuMD(A AuAsuA$Q1H[H]A\A]DH#H;H5H1HD$KA$7^@AUAT1USHIMHH9DH@HHtuȍJ1w pH@B8DAvDHtHuH1H!Du:I@DBDPJDHACAAB8u>HHtuȍJ1w pH@B8DAvDuJHDIDXDADPADCAABD8ubHHHt7uHҸt0Q1w pP@B8HҸu@fAvD1fHt2H fDH9t"HD@HABHG~uu:I@DBDPJDHACAAB8u>HHtuȍJ1w pH@B8DAvDuJHDIDXDADPADCAABD8ubHHHt7uHҸt0Q1w pP@B8HҸu@fAvD1f\WH4HcHDH1HHHHHHQHHIHHHH6HHHiHHHHVH.HHHHHYHYHjH?HHQHHHQHHHyHH)HH:HHYH!HHHQHHHgH>HHHHHHHhHHHyH HHyHHHfHHaH)HHHHQHHHhH=HHYHHHH=HH5HcH@H)HHHHHHHHHHTHwHHcHfH=HrHwH~HHyAVAUAATUHSHAVdD(HƅADIIet AtdƅB HfHtHH)H~ HfHtHH)H~E9,$tE,$H[]A\A]A^fDHDH1O:f.H(1HdH%(HD$1rfHL$dH3 %(H$HT$uH(eDf.H)H)HS㥛 HH?HHiHH)HfH)H9H*^[tH)fH*XDHf.fAWAVIAUATIUSHcH(HdH%(HD$1HtH H HHLHL=IT=HcH9H-~uHHDL|$ HDI 1L8HHcLAIH)HgHcIcHHHIngE9uƃC=/=- HH蛡1@@t;%2AA0IfAQEt;%2AF0IfAF=A+ILpM1XfA+I 0^QH5H1pǃ010#HHH5ǃ0HHE1D0c@ EHHhfE1.EM|$fH5A1B/.I(LA|$.M|$AD$!@HM|t'DATUSHHtH@@xHH@u{, IH51HH觱HEH8HI$t]HH@ƅ@@xt4HHx0t&[H]A\bfH@@xt1[]A\ÐfUSHHH]H|$ t HcƋ@A@t McF@D@HSxLHu"HƃiuS@D@tAt4`Lt$H@@xt Hxxt>ǃ@H[]fDHH%utԐǃ@aHH0HH8H[][f.@@f.AWAVIAUATIUSIH8HHT$L$oK\%:AH9HH<$t;LAH9IHH)IE1HCM)HD$HD$MH|$I|$ՙ8HøHt;MHD$HHx8HI H8H8[]A\A]A^A_fDH<$M;L@H9IMM1HD$M)L)HCHD$H|$t M=MH<$t E11H|$uj1H8[]A\A]A^A_MH7nH|$tHtE1HD$1HD$fH<$E1H|$HD$LL$ Hx8HILL$ uLd8HLLHLL$(LT$ /CLl$B#I}#8LL$(I]LT$ Mt8LL$LT$ M1MDH\$IwLHBIAH$LT$H;8LT$1L@H<$H|$E1HML1_DM7yf.1E1HD$HD$@1E1HD$HD$@1:fE1E1DE1H<$MHE1L $f1HD$HD$v@E1H=L$sE1HD$HD$|HHH9!L9vMtIMM)LH)HJHL$t8MtL9HL)HCHD$!HD$IM)HH)HHD$Df.AWAVIAUATH5IUSIHHAH8dH%(HD$(1HD$HD$DHH=HHu1H=HHAAgH51HL<H|$(dH3<%(H8[]A\A]A^A_@HAtDAt E1AǾ@H_LtAFxHt JHfDH5i1LH fA}:IHxHH5LAE]H5H1f.$H|$88H|$@8H|$H8$@}/LmL,HPLH+3fD_u1AWAVAUATUSHH(H|$H=^.H&H\$:IH 'HUH)HD$E1ML-DM9wfDIM9tzBt=L&HuM9tbJ|=M9MfIM9Bt5Lu&Ht.uIMM)L9D$s"M~M9mH(1[]A\A]A^A_@J|=HD$HL$LD$J8L)HLH^tLD$L9D$t{.uH([]A\A]A^A_@MhtJ|=E1.MuIIJHC%HD$fATUHSHfHHdH%(H$1H|$IHHH$)$)$HtL"Ƅ$HHtH$"Ƅ$HhE1E11LHuHpH$E1E11HH$dH3%(u H[]A\d$@HXAH`AHRHPHAUATUSHHHH@@zHSPH5~H+H1H+H@uHXAH`AHRHPHsXHtHHCXHH@H@`Ht HHSPH5ɢ1H耑H H1H7H}`y.uEHH1[]A\A]1D@1ɉf.LXAMt5ImHt,H}LeƇaL$.1HL7MLuL`AMjImH]fH}LeƇaL-1HLMLu-fAWAVAUATIUSIHHHdH%(HD$81HHD$(HD$0f "MIH MHD$(AHD$:HH$0"H$HH,H9,H#H)IHI)D!8HD$0H$HL$I~AJz8HIHL$tMH<$HHL$LD$H}z8HILD$HL$WALy8Ht$8dH34%(DHH[]A\A]A^A_f.Mt#MtxHD$(H$11HD$<E1MtI<$~y8HT$0I$E1HtI}^y8I]H11D!fDMuKMtHD$(Ht HE1@;:H=Fx8HHHD$(EADLLH#B0Lt$H$I>x8L$Mf.HD$E1Mt8LLHHL$#B0Lt$HD$I>px8LD$HL$MHqHLL#L4$A/I>Bx8M>f1E1fDHD$0E1H$zf.ATUHSH@IH;Hw8HCH9uA$tI$w8AƄ$A$IDŽ$tI$w8AƄ$[IDŽ$]A\f.AUATUSHHIH HH HHHHDž@HDž@H)HȍH@HDHHtFMdH|v8HDMtLv8Hu»H[]A\A]I1HtItcIHHHtHDf.HATUHS@H}`HtHBH}hHt,1HHLHt1~HDžHLLDžNHu8tHLHu8HpLHHDžpLHDžxLu8HHDžu8HHDž-HJxu8HKHDžJ`u8HHDžK赙H@u8HDžtHu8ƅHDžHt8tHHt8ƅH HDžH HDž t8HHDž :H2jHhMt8HDžhMHpMut8H}pHDžpMt,H虣HUpHBB迣8H@L@H;H t8HCL9u怽Hs8tHHs8ƅHDžtHHs8ƅHDžH[1]A\D1HL٠R@H9u8SHHLJHGxHLJHLJHG Hu8HLJHLJ LJLJ HG(Ht8ƇƇƇLJHHm8HLJx<HLJhHGLJpHH]m8HGHHGPHHHhHHG`ƇƇ(Ƈ)o HHƇ`HLJo0HLJHLJo@oPo`opo o0o@oPHq8H=Hǃ_q8HHHRq8HǃH=@*q8Ht}Hƃ1Hǃ Hǃ(ƃHHǃX<HǃP<ƃ`ƃƃpƃqHǃxƃ[f.AUAT NUSHHsp8HIĿ@ǀNrp8I$ AYp8HI$ I$@I$I$ "p8I$ p8@H;Hp8HCH9uA$Ho8tI$Ho8AƄ$A$IDŽ$tI$Ho8AƄ$IDŽ$LHD[]A\A]I$ IDŽ$ AL辿A$0 EIDŽ$ IDŽ$JADŽ$LIDŽ$MIDŽ$PIDŽ$L#HD[]A\A]AXATUSH'JH I@Jr`jJ[P JU9A[H\R /@HB H1H@'5KVi'}K5'F/('/`,'s0/')4'w /O/HB H(Hpm8HǃpH Hkm8H Hp1@&J)&dxKY%4N& /@HB H81Jf.(8IN<=N=Zu:(u0 />HB H1H']6N'5'/7 'RE /JHB H(Hk8HǃHV Hk8H4 H1fDQFVFL"C)u) /3HB H1H0,2=Q<"0N *.h /07HB H0 H$1퉃0 %D')&'K)'6'6 /p)HB H0HH[]A\n2r"'2 pC/. /EHB H1HT@78'" ' ' /P8HB H(Hvi8HǃHHIi8HH1f.\';c'3 g':} /[;HB H(Hh8HǃH`Hh8H>H1 oN0(d s,N7XN /2HB HHH%ƃ( 1DA02 E / FHB H1H`ED4-4I:M.\<~. /.HB H1H8@((M+3 (?; /k;HB H(HHg8HǃHHHf8HvHH1[x'vq'] v'W; /:HB H1HH[]A\DN'b& Q'.4V'U /8HB H1Hf&8 6 /6HB H81|QG= K6N /6HB Hi1H`@!'(,&'U? /3HB H1HD&K :'E /&HB H81^fD''Q'"' /+HB H0HH[]A\Dt*&W /#HB H1HN$ N&7N /6HB H1HP_$$ > />HB H1H']%'K2 /)2HB H(Hh>c8HǃhHHc8HHh1fe%#j')k /(HB HHHHKKtHHH1@HHsHh1fD/+D 2+/ /.HB H1퉃@l (< /5HB H1HON+ N)N, /*HB H1H@ /*HB H(H(Ya8Hǃ(HH,a8HH(1 /E5HB H81u /4HB H1HNb /88HB HH=HHǃH |`8HH ufD1f')'6' /t$HB H(H`8HǃHtH_8HnH1P'?'4'V /,HB H(H_8HǃH H[_8HH1@'& /`HB H(H_8HǃHH^8HzH1\@yp /.HB H1퉃D'+'* /,HB H1HHu7u /6HB H1H(c3 /#HB H(HX]8HǃXHeH]8HCHX1%  /HB H1H@'~ /"HB H1HX' /HB HH1H]8Hǃǃ0m)' /T$HB H(H@\8Hǃ@HGH\8H%H@1 /D6HB H1H`m' //HB H1HQu //HB HHeHI1g' /A-HB H(H[8HǃHAH[8HH1]' /v9HB H(HPW[8HǃPHH*[8HHP1 /HB H1HH w H,1S@ /*HB H8h1' /3.HB H1H /+HB H1HXD /HB H1H(F /C(HB H(HY8HǃHcHY8HAH1#7' /1HB H1Hq /,HB H1HN= /4HB H1H /H)HB H81V /,HB H81"B /+0HB HHHuƃ81NC@05) /$HB H81- /HB H81d~Nx /-HB H1H1}''I /_HB H(H{W8HǃHHNW8HH1((( /yHB H1Ht' /)HB H1H@Ae /HB H1툃H耣)# /HB H81N /HB HHHƃ( 1 /?HB H1HX= /S-HB H81'cN //HB H8 1"' / HB H(H`LU8Hǃ`HHU8HH`1' /\HB H1H ]i /HB H81,'P /HB H1HHN /HB H1H0-' /HB H1HP*' /~'HB H(HS8HǃHfHS8HDH1&TM /D-HB HHH81' /-HB H(H=S8HǃHHS8HH1ZH[]A\v' /,HB H1HM8 _ /HB Hi1HX!+ /HB H1퉃  'HCR8t,HT$HH,R8HT$Hǃƃ /Hr H.HHǃH HQ8H H1H0o'T /q#HB H1H(f'! /S/HB H(HPSQ8HǃPHH&Q8HHP1 / HB H881c+N /HB HHH ǃ1ED /HB H81' /%HB H(HBP8HǃHHP8HH1t' / HB H{pH(tcH{XuHCPCXHCpHH9HPH HJH9HX' PH߃PHHkp H~HCpPPtHP CXHSPHxPtHHCpHPPHHPXHtH@`HJHH1{~fJ / HB H815Y /,HB H1H`b'& /HB H(HhXN8HǃhH H&N8Ht Hh1H1HxHHDq /HB H1HL>'b /%HB H1H I'/ / HB H1HHN /(HB H1H@ /@HB H81qO' /JHB H(HL8HǃHwHL8HH1H'% /kHB L MH1LL8HǃLǃ0w /'HB H1퉃tN /HB H1HA0h /$HB H81u4 /HB H(H9},HH;uTK8HǃHǃH1' /xHB H0HH[]A\ /HB H1툃:^ /HB H1Hx+ /!"HB H1Hp /sHB H81v /HB H81i /4HB H1퉃7([ /"HB H(H8I8Hǃ8HH`I8HH81' /HB H(H'I8HǃHHH8HH1k /NHB H817HH8t,HT$HHH8HT$Hǃƃ /LHr H.HHǃHH4H8HmH1HƇ/HJH)HG8HǃH}HG8H[H1=HT$sHT$1 /HB H8J1Ƈ/%HJH)HYG8HǃHH,G8HH1(HH/w3HJHH9H[]A\HH/vHJHAHBʐHT$rt-HT$ /HB H81. /HB HHtǃ0ƃ1ǃ016tf.HH=@HpY1퉃0 RHǃh1@ƃ812(H@8ǃ1H HHtnHHnE8HHǃH]E8HuHHtbHHtLH"HHI1H E8LHǃD8HItL1LHHHH5oH1+[Hǃ@1HǃJHǃ1111 111 /wWHB H0HH*tHtH1gHFuHǃFHBHHHJHBHHHJWHBHHHJvHBHHHJ /w`HB H(HxkC8HǃxHH>C8HHx1HBHHHJHBHHHJHBHHHJoHBHHHJg /w-HB H1HKHBHHHJHBHHHJЋ /w`HB H(HB8HǃHHeB8HH1HBHHHJHBHHHJ띋 /w-HB H1H HBHHHJEHBHHHJHBHHHJ^HBHHHJ: /w@HB H8!1/ /w*HB H1H( HBHHHJHBHHHJHBHHHJf /HB H81 /HB H(HA8HǃHH@8H{H1]HBHHHJ /w`HB H(H0@8Hǃ0H6H@8HH01HBHHHJHBHHHJHBHHHJHBHHHJHrHNHJ-HrHNHJHBHHHJA /HB H(H?8HǃHhH?8HFH1( /HB H81 /wfHB H1H /wbHB H81lfHJHAHB#HBHHHJ'HBHHHJHBHHHJbHBHHHJ뛋 /wgHB H1ǃ0ƃH2 /wAHB HHH -Hv@81H HBHHHJHBHHHJHBHHHJHBHHHJJ /w?HB H1Hx /w*HB H1H(tHBHHHJHBHHHJӋ /w.HB H8(14HBHHHJHBHHHJHBHHHJ[ /waHB H1H /wLHB H1H /w7HB H1퉃HBHHHJHBHHHJHBHHHJƋ /HB H1HXK /weHB H(H<8HǃHt4H<8HtH1HH11HBHHHJHBHHHJd /w.HB H81HBHHHJlHBHHHJϋ /w`HB H(H;8HǃHgH;8HEH1'HBHHHJHBHHHJ띋 /w-HB H1HHBHHHJHBHHHJЋ /wsHB HHtNHHKKtHHH1CHHsHp1^Hǃp1LHBHHHJ늋 /wBHB Hi1HpHBHHHJHBHHHJHBHHHJHBHHHJHBHHHJ+ /w-HB H1H(HBHHHJ(HBHHHJЋ /w-HB H1H`HBHHHJHBHHHJЋ /w.HB H81HBHHHJHBHHHJϋ /w@HB H1H /w+HB H81HBHHHJHBHHHJҋ /wQHB H(H9},HH;u88HǃHǃH1CHBHHHJHBHHHJHBHHHJHBHHHJHBHHHJHBHHHJC /w.HB H81HBHHHJ5HBHHHJϋ /w-HB H1H8zHBHHHJ_HBHHHJЋ /w.HB H817HBHHHJtHBHHHJϋ /w-HB H1HHBHHHJHBHHHJЋ /wVHB HHt Ht+Hǃ1ǃ1ǃ1yHBHHHJHBHHHJy /wPHB H8ǃ0ƃ1& /w*HB H1HHBHHHJHBHHHJӋ /w-HB H1HPHBHHHJHBHHHJЋ /wrHB H(H 68HǃHH58HmH1O /w*HB H1H,HBHHHJHBHHHJHBHHHJHBHHHJ /wrHB H(H@T58Hǃ@HH'58HH@1 /w*HB H1HLuHBHHHJHBHHHJӋ /wsHB H(H48HǃHCH48H!H1 /w+HB H81HBHHHJHBHHHJҋ /w`HB H(H)48HǃHH38HH1mHBHHHJ HBHHHJ띋 /w/HB H0HH[]A\YHBHHHJHBHHHJ΋ /w.HB H81HBHHHJ!HBHHHJHBHHHJHBHHHJ /w.HB H81HBHHHJHBHHHJHBHHHJA /HB H(H28HǃH7H28HH1 /w>HB H1HHBHHHJHBHHHJwHBHHHJ뿋 /w`HB H(H  28Hǃ HH18HlH 1NHBHHHJHBHHHJHBHHHJHBHHHJ /w?HB H1툃 H耣 !HBHHHJHBHHHJHBHHHJHBHHHJ /w`HB H(Hx08HǃxHH08H_Hx1AHBHHHJ2HBHHHJHBHHHJHBHHHJ /wJHB HHHtǃ1H+8ǃ1HHBHHHJHBHHHJHBHHHJRHBHHHJ /w.HB H81JHBHHHJHBHHHJHBHHHJHBHHHJZ /w?HB H1H /w*HB H1HHBHHHJHBHHHJHBHHHJ0HBHHHJlHBHHHJ /w?HB H81PHBHHHJuHBHHHJHBHHHJHBHHHJ!HBHHHJ /w`HB H(Hd.8HǃHH7.8HH1HBHHHJHBHHHJ띋 /wAHB H81e /w+HB H81AHBHHHJHBHHHJHBHHHJdHBHHHJHBHHHJ"HBHHHJ$ /w`HB H(HXG-8HǃXHH-8HHX1HBHHHJ HBHHHJ띋 /w-HB H1HHIHBHHHJOHBHHHJHBHHHJKHBHHHJHBHHHJrHBHHHJ|HBHHHJ HBHHHJHBHHHJSHBHHHJQHBHHHJ]HBHHHJHBHHHJHBHHHJHBHHHJAHBHHHJHBHHHJ /HB H(H+8HǃHH`+8HH1 /wxHB H(H=+8HtC}HQHHDHǃH*8HH1mH1HǃRHBHHHJHBHHHJiHBHHHJ /w`HB H(HH*8HǃHH H[*8HHH1HBHHHJyHBHHHJ띋 / HB H(HH5H`u{H5PH`H5PH`H5߾H`"HH)8HHH)8HXH1HXHXH1HX1H1譪HjH8XH=O HDb HHM E1E1H.H1XH1(8H1wHBHHHJHBHHHJHBHHHJHBHHHJ /w@HB H8 1 /w*HB H1HwHBHHHJHBHHHJHBHHHJIHBHHHJ /w`HB H(H'8HǃH#Hr'8HH1HBHHHJ0HBHHHJ띋 /w-HB H1HHBHHHJnHBHHHJHBHHHJHBHHHJK11H?HHE1E1H1H) /w`HB H(H&8HǃHH]&8HH1οHBHHHJHBHHHJHBHHHJHBHHHJD /w`HB H(H`%8Hǃ`HwH%8HUH`17HBHHHJHBHHHJ띋 /w.HB H8 1HBHHHJHBHHHJϋ /wEHB H1퉃鳾 /w1HB H81Q鉾HBHHHJHBHHHJHBHHHJHBHHHJ3 /w:HB HHH1HBHHHJTHBHHHJHBHHHJPHBHHHJV /wXHB H8ǃ0ƃ1ƃ韽 /w+HB H81{HBHHHJHBHHHJҋ /w@HB H1H0< /w+HB H8H1HBHHHJHBHHHJҋ /wrHB H(Hpb#8HǃpHH5#8HHp1馼 /w*HB H1Hh郼HBHHHJHBHHHJӋ /HB H(H"8HǃHMH"8H+H1 /wAHB H0H>HH[]A\EHBHHHJtHBHHHJ뼋 /w.HB H81铻HBHHHJHBHHHJHBHHHJHBHHHJ?HBHHHJHBHHHJڹ /w.HB H81 HJHAHBHBHHHJf.HAUATUSHH/H@AHwXHHtH̓HCXHMzH@H@`Ht AHHSPH5G1HO6H HW1HDH}`HuTH謝H1[]A\A]HXAH`AHRHPHH1[]A\A]1DLXAMt5ImHt,H}LeƇaL1HL'MLuL`AM[ImHNfH}LeƇaL1HL'MLuf1Ht1HHt)H;9u*f.H99tHIHu1fDHH1HO'HDAUATE1USHHHPAE1䀽QAH`AHt"H7HtH9u UDH;tKHvHuHXAHt(H7Hu@HvHtH;u1&Eu^H[]A\A]1&EtHf.HHD\@D:f.HH[]A\A]^@f.AWAVAUATUSH8H L|$dH%(HD$(1_LHIIL|$LE1HtzH@HH@HHuOH[Ht?L3A~HuI I(LL_H9~H[MHHuH|$膹HuHL$(dH3 %(LuH8[]A\A]A^A_f.@S@tiLHX HƇ@tH(AH0IىLdƃ@[@u/L@t~w1DLuTu#H(I؉L]ƃ@[fDH;H5G1w3ƃ@[fDLHtT@LOPHOxLxtHH5vGH1T1@@u@t&HDfDHPHDf.H@H@@HtfD1DHtH@H@HHt f1f.HtH@H@0Ht fD1f.HtH@H@8Ht fD1f.ATUS@t(@t/H@Hx0tyE1D[]A\fD@uH1H Au΃`tC@t @uYH@H@(HtXHHЅu-ƃ@@@uqf.AbCJE뮐f.SHH8HǃH8Hǃ[f.ATUISH/HHH@@|H`A$ƃ@t=HAj8H`H=@@1HǃA蒸HHAHDžHDžhLZ@H H(H?H2@ƃ@HA$hSH;t-@LKPHKxLxttHH5D1-:ZH H(1[]A\D[A$1]A\@fHsXƃ@Hgt@u@tHufHPg@HW@USHoxHHHtƆ@ƃLƃ`L0ZYHE@H HHUHƃoHH HǃHH ƃHIH1H1H1[]ǃ0jfǃ0RAWAVIAUATUSHHXH`H4$HT$HL$HDŽ$dH%(H$H1HDŽ$HDŽ$Ƅ$I`HD$MHD$ M CJ8HHn fvH7HH@H@HEPHxoWH0IH8AL}Dž H`t&8t!ƅ@wƅ@1Dƅ@1ƅ@@IHt8tƅ@ƅ@AII`@A@I@A@@AJ"@AH @AI!@Ab@A`@Aa@IH@St*HhAu @8HHhA5 H=ziH=zHXAVHH`AHXA H IHt<8HHC AICAfCIHE8I HE@H$H(/HIpL8HILJpLHBILJxLHH8HIIpL$ IxLH8HIHHH=KW8H=KH$B8H=KH$-8H$IH$H$ MЈD$(~H$L$H$L$HLILHD$0踂$ H@@|@tHE?HxL.HtIHtl8HIH@D MMtL78HIB MMtL8HI7 H=F9膧HHD$8 IH% L8L8H|$88IHƅ@ƅ@@f@H@@|t@tƅ@H$HH5=HD$8H1yHu$] H$ MH:II`HA0KM䉅 A$@7HDŽ$DŽ$L$@t=AAuAɃDL$H7 1LJALH5HH IxLDLaEHH7HDƀ@uIHH@HATWH=n7P1H6>H HIiAt I8MAƇfyH@@pIt/H$8In8HIH$It/H$R8I58HIH$It/H$8I8HIH$Aƅ@H@L$L$H$H8B| rHHL8HHHA}tLY8HIHIH Iʼn\$@MeA<$:p@HXFHH >CH55H=cQHDHD1?HH/HHHLIEH߉D$0 8D$0tMA<$:ƅ@1 8Mmƅ@Mt=\$@ L$E1LW 8H$I 8H$; 8L2 8L) 8u]H$H8HXAHxuH`AHxHD$H$HdH3 %(HX[]A\A]A^A_Yt#L4$I>Ht1HIH$YHfDE1E1HD$8tHt$Yt]I Hh?IHD$HtMt I;D$H|$ I tHD$ H;G0HI?LAEHLIHIL!I;ALtIL 8ILHI 8ILMLMALAƇLI1LIAI(IADA@IMCM 8HHH$Ƅ$ACLHt$8H$HEH?JHGI}XfDL$E1E1EDIpL 8ILJpLILJxLL$E1HXA1E1E1H`A1HhAHDžXAHDž`A 8HC 8H 8L$HDžL$E1E1pƅ@ƅ@ƅ@ƅ@1H@IH=0H01ɨHID A:t#޸LHHB JD"A:uAt I1 8MAƇeDHLL$E1E1MtSMt$H$ L衳H= L;$OA$H4@DH=/HD$8jfH514L1E1E1dL$I MuvMuqH@L$MH0t(@H=IAVuܺxyA_proAFfAVL6HI E1H|$88IHMtL8Ii8HIHC[ACME1A<$L88Mw`LHLCqAL8E H8HH@Bxu@uH 7H@Hƅ@ƅ@H~ƅ@]H-H x:L`rI`HA0K@T$LHt$@I訵HT$LHHt$@AF/L$H5-L1fH5,L1L$`IA<$:I|$t\:L;HIH$ LHDŽ$NL;$HcH9I~H?,8HI 8[W :HA讬HLt(HDŽ$xA1 HZ H8HHLIE18L$PH@@|^ LHLnAL8EpDL$E1E1A|$n A$Hƅ@ƅ@tRH(fHhH0HDžhH(8HpHDžpH0"ƅ@)L8;H1ƅ@8Ae H5+Dƅ@DL1\$@H}HH'@ @tH}HPHH@tH}HHڴ@5 @t9uƅ@HH@t@tƅ@LeI$8I$IDŽ$8I$DID$xIDŽ$H) 1HIDŽ$DžH@HPHtH҅5H@Hxy H@pHxHHx I@HhHpAHXH`@IIPIII IXI(IIXIhIIPIpII@IxIHIIhIIpI0IxIIIPI@I8IHIIXII`IXIH@I`IHHD$PIIIhIIIIpIIIIxHX@IHHD$hD${dAII ILLHP@HHHBH=}AtAJ@@LH@AI H2HIvIW`H[H8HL$0L&H&LD@PHH5+1LLEt!A<$A<$WA<$ID$HHHD$XHD$0D$@HD$`\$LHD$peA}HI@@zuA@1ɉIUPH5)LM}1!LDH|$XHD$XL(H@I`AHD$XIXALaL`nEtA@t A@uA@uCH0HHlHH>RHH`A@I@!_HCICHZH?.2AC8CH@I@B|3A|tyx;BxA@A@f9@@A@8@A@8@@Eu A}HHCHHHI#CH#CH9EICH5$(H@C|D$|u6IHIHܦ@D$|~@qM_AUHD$0HXI9OH54$LL1x@IHLHT$0=0L$fƅ@ƅ@L$H$H7E1=I7H50#L1L$E1E1+I`HA0KE1E1HHt$8v{QHH5+'L12H5"HHƅ@HL1S7H5{"L1-PHX҈T$L?T$LH0IHD$0DFu:.IAuMH5: L1LL$0LL$0LϾ:H;AQ@H=!HHH=!7HqH=?!L0H=3!VHI H=%!>I LpH$ L}H$Ht:u%H=wAL$E1H5%L1L1LO7ƅ@1@7HDE1L$E1肠EA@A@[ IUPH58&L1F-HH/ƅ@H}HHZ;%t H=ILtH5v!L1 AFMNHL$0H9IA<~<_ ʍHӀufGu LL0LrHI7IgHHHHA@I@H赩HL7IUPH5S%1L ICHL$H;HI HL$ H;H0H5N%L1 H@@}Atƅ@Atƅ@|$(H51LE1E1Y: HsH$L$HRALH=1ޕILAƇL$t!H5G%LL1m H$G71HDŽ$r1fA@A@MtMA@IcIt$H$IxLUH$HIT$H5L1 H$A@M8tMIt$AxH$LTtcH$tLHuIT$H5L14 H$MHD$L$E1E1(HD$H$IcMhA>uL7TH@@|uMt}A<$N`LHL^LD$8n7D$8,fCyHHI#CH#CH9Nq`LHL1^LD$87D$8LLH|$0tL;d$pLd$pLl$` H52!L1\$L A@A@LI@蓥tIXAI`AH@HBHH8AEHP7HC7H|$P H|$h HEIE@A@tbI7IDžI7HIDžIHIHDžHDž@H7A@IhI(IDžhu7IpIDž(]7IDžpI0E7HhIDž0IhH(I(HpIpH0I0H7HDžhHDž(HDžpHDž0IIIDž7oLIDž@AoA@@AoAoA@AA*HAƅ@7HHDž7HhHDž7H(HDžh7HpHDž(7H0HDžp7HCHDž07HXA1HDžCH`A1HhAHDžXAHDž`AC7HCHDžhA+7HDžCH7IH$L(tQMA@HDH *%IUPH5.LHE18H5L1" IHMPI HrL0'I L`@LhHYLHtuHL81I I0HT$0IT$E1IHD$(L"M,$A}HtGMd$MuMM>1LMH5L1IHt$0I I(H|$(LD$@0LD$@L9~MII8H8A@8@`0H@@|H|$hIX@AL!HLA>MA9]IyA\$LRI@H;H0$u-I@xxH@;BxA@@@tA9IH?$A9H@@|H|$PI@A|D$@oIH#ZOLl$`\$LME|$@AH5iL1'H@@}D${D$(L${D$@DD$@IHHT$H5L1_HD$0HD$0L3HIXAI`AHQHPEtIHAI`gH5LE1-u AuH5L1E1LH5<L1I`6H5LE1H|$PI@A|@USH=47tI=*7u2H=7P'H7HA7T7H>7H[]fo H=7EV7)7f7H7HtH7 H)HHHHH1Gfq7:f.=Z7tH`7USH=b7EVHfE7@7foVH17)7HtH7 H)H8HHHH1e7HH7[]ff.=7tH7H=A7HP H,7H7i7H7Hk7HfDHH9t1DFf9GuUSHHHHvHM u 1H[]HuH{3 tHu H{ " tHu8H{8 f.USHHHG F GFHHHHu7HHEH{HU7HHEttH{8H97HHE8tXH{0H7HHE0t@f.AWAVAUATUSH8`L/BH@HHD$D$AHMepMt A$4IJHD$IHHT$(Ht$ HE1E1DMJMI|$tmI4$HtV@It$txHtCHt3@AD$4tht 9uD$A9D$0fIIIxI9pH8[]A\A]A^A_@Huˀ@AD$4uufDHcɀ@HX@HHHD$xD$DID$hHD$H@It$H8MHD$IT$8H9:AT$@f9P*HD$It$HHxHD$It$PHxHD$It$XHx HD$It$pHx8HT$HHD$HHID$(HT$ ID$HHT$(HtID$ H11SHHH*H{PHCHC(7H{HHCP7H{pHCH7H{hHCp7H{`HCh7H{XHC`~7H;HCXm7HH{\7HC[f.HHHt/HJ1H;wHGxu@HHxH9pt HH9uf.AWAVIAUATUSH8L/`Ht$HT$H7IJLs(I@ID$ HT$HHA@t8Ik7HIu&Hj7H8[]A\A]A^A_fDE1A@AtEMMpMt AMJIHIJHLhxtPIxI}t7IM(L9}ILHH9uHLL$(DT$$DT$$LL$(IHD$DT$$I}IEHD$IE IIE(~7I}t7D$ DT$$ImMeEU4AxAE0I@Iu8H|$HIEx1HIE7L 7H8[]A\A]A^A_fDHcɀ@$HX@D$ HHHt$HH$H8[]A\A]A^A_f.A<@IhcIJLjxf.ATUISHJHHGpHt I$1H@HHH)HH{H0H{PHCHHC(7H{HHCP7H{pHCH7H{hHCp7H{`HCh7H{XHC`7H;HCXo7HH{^7I$HCI$JH9%H47IDŽ$J[L]A\@HH9̐1ttt @f@fkf.HcHHihHƀxǀ|HHXHHh1Df.f.f.1f.ATE1USHJu2HHxH7Ht&HHJHǃJD[]A\DAD[]A\f+f.f.HHf.MtgATUHSHN~01E1fH<A HNHHD;M|I7HDžNDžM[]A\@f.AUATAUSHHMu7Ic7HDMHNH[1]A\A]DHN~01E1fHt FfDUSH8HXdH%(HD$(1t-H~xH`H~H9HOHtxH H 1H~*Ht\H H H>HvH)HHt_HL$(dH3 %(uXH8[]H`HHNH|$@HD$HT$Ht$H|$t`HmfHoxMHxMoMHHH H(fP,HoMHMoMHHH H(fP,H@HH RxMHHMHMHHMAWAVAUATUSH(dH%(H$1@HL/u @HLoEAxMoEAMHU IMU(AMU,fAMHAo$MHMAoD$MIT$ HP AT$(P(AT$,fP,H@HH RxMHHMHMHHMH$dH3%(H([]A\A]A^A_L|$ Ld$D$ LLjt+Fi(H߉H5HL1fL$1LD$ LLHrujD$Hff BftpƃHǃh(H߉9H5zHL1cfDh(H߉H5 HL11IL$H.H1>HǃoL$CxfoEHU HU(U,f!f fƃHǃg(H߉?H5HL1i@It$.H ,HD$fH"It$.H+HucINHh.L1=HǃL+Iv.L +H$L+fHpIv.LO+HuhUSAHHH+HL$D$dH%(HD$1@gx,H5H1kHD$dH3%(u0H[]@+f0HH5RHH1-&hfDATUSH H dH%(HD$1HttHHhIHtUH6HHH$D$|$tGMtI$@HL$dH3 %(u5H []A\H}`HuɐHDž ng@f.HdH%(HD$1xuA@tHt$dHHT$dH3%(uHfDf.USHHt,H8Ht9Du1Qt(ƇQH7|PhH1[]H|H{@HC8H[]@AWAVAAUATUSHH(H/DD~dH%(H$1H$AD$PD$TtDv VD$X*$\L$PHv I|$hHHHL1AAt$P u$x$`ff fƄ$?cD HDH5HD1HH{8t!D9DQƃQHDzDf1H$dH3 %( H([]A\A]A^A_fDŽ$\L$It$. L'H$H51LH|$P $TSHH+ 1HDЃ\D$#$PuII|$D$HD$PHD$HLHD$DMfEDb@H@H@|$#u .H$1D(DH1yH{@DS8g@HHD~@H@H@~D$#fH@Hтj@hHHfL$IL$H.1L-7L$It$.L%HD$#?fD@H@@|$P @fDDDDjjA[fLt$HA DD$HL`HpALDD$Hu`tHxALDD$HB`H5+DH1fsHL$HADL3D$H_(H5L1f.1H|$PMHT$0H|$D$$HHALDT$(L\$8`H=DT$(HT$0H$ fL\$8H5:HH)$L H$t$IADILHD$(L\$0DT$莾qL\$0UDT$bHL$(H|$H5 EL1DT$0L\$L\$1HLDALA^L\$DT$0tAL\$8]H߉ΉL$L\$8L$H5H|$I1LDT$0A AgD$fDHl$(l$$7DH|$H5A1A"DffD$RT$Ht$D%exH$1HT$DHl$(D$DHHDeTH|$H5|A1ƃ@A AD$,D$fD$PDffD$R $\It$De\$P D @A AsDH}H5HHL1D$KDHf.H{8t!D9D QƃQDH߽*(sD@_c[L|$(H߉A$KH53HL1-H{8tD9DuyQtpƃQHDrD^DDZ0HiH5 HL1H5ADH1DHLrH{@DS8DH߽*0rH{@DS8 DD$ffT$PfD$RH5 L:IAL@A u Hǃ@HL$H1LHLD$(L\$DT$0)HD$HLD$(L\$HL@0H$H8L\$8HHL$(H HD$HDT$0H57L\$8LD$(H|$HDDT$LDH1Ht$HH|$DT$QYL|$(H߉A$KH5HL1-H5DH1%sD$#H$t$ALDIHD$(L\$0DT$1tDT$L\$0}jH|$H5VL1-OJH|$(%Z1HtHHHD$Ht$( HL$HP ^~P DfL$PHL$ffD$RHt0 1H]D$D$hHǃ@D$HD$Ht$(HP][tYH|$H5L1-jeDAWHcAVAUATH USHHDHǁHL,IuhHDvH^(HHHLcHD$I J|f.D9sH[(HuAfDH}8t!D;DQƅQDHT$anDyZT$JHwhHt/E1~H^(AF45H[(HEAqH[]A\A]A^A_HT$HHtI]hDHT$mH}@DU8T$먐AUATIUSHHL'HI$XHI$`H~H9HOHI$ I$ HXH)HI} @IEH;HCpHǃHHCh%qHshH~(tHH@HHHShHr(HHshtHHuHt I$`M1H[]A\A]@I$`HHNH5L1H[]A\A]AWAVAUATIUSHHdH%(H$1HcƉt$@HD$t51H$dH3 %(Hĸ[]A\A]A^A_DIHXIHT$HH`H~H9HOHt$H LH LD$ H)HHl$@,HD$pLD$ HE1Hl$PLd$XHD$(HD$lE11LD$HMHD$0HD$hHD$8CHE0D1ɃD$ XtA@]CHLD$0HL$8D$hD$lWD|$hEAjH5H1 ED$KRK|hD8HtyHt$(.ZDL?IxHT$(H5IH1KDht$DLHx(HD$@HED$PI@sfAujBI}ptkA@MDLIxH5ILH1I}pkE1f.ICD$ELADžLzIEhHm1ɃxL`(M PILH|$HA9l$Md$(MuA#I}8t#E;DAQAƅQLDhDT1fCHLD$0HL$8D$hD$lwUgD|$hDL|$I@I@H|$HL0I@H9MoE1H`HHN;IcH|$Ld$XITHM|A@IDhIE`HcD$ ǂHITHDt$LD0nHD$EAƄ@A$u H豭A@LL*-DOD8D|$hofDA@uvA@M.@I}8t#A;DJAQ<AƅQLHT$fRHT$ǂH @MH@HcT$ AHEʼnH51H߾MAnH5H1b%DHT$LL(tjAMepTfDM&@CND8PADLeI}@DAU8Md$(MIEhxLHT$eI}@AU8HT$I}pI@I@LH|$HYH=t$LOI@I@LH|$HH=nt$LXDATUISHHHDDVdH%(H$1HHLHDADDCtV FS=w?C L[Hv sHthAt]LfALNC L[Hv rHHKH|I| H{LHH)H)HIHt}IH1A$tV1t; t%H$dH3%(uSHĠ[]A\fDS(AȋLALfDfDD5VA$Mf.t(1t8@t@@H@@}u @fDATUHcSI_t[]A\LNuA@1ɉƒOډ[]A\Ð%7fDH%7tDOAuAHNLG uoAt)HuIHt~A8uHIAtHucIHtVA8uHAt H~@HH)1H2H~* LWL9WHH)IfDfAWAVIAUAT@USHHAHHDH$7HIVLǃ@HXlAu.Et)HJHgpHahL(7HI>H}H51HA=ǃHD[]A\A]A^A_D=@t qtBAE1f.H5A1袺~D@L)LDD$ ADD$ tLO7H?ǃIHA"ǃ,H$DHWfL7HߎHE1̎ǃDLE17AWAVIAUATIUSHHHuuHH1HdžHdž@pHH)pHHzHHHyH H5d&hNALJMl$@AAM7HHIALJ@HiAu.Et)H萍HadpHeOHn7II}Ht~H51hHA=:ALJHD[]A\A]A^A_DA=@t AqtpAA?E1H51II}HH5-1A=踷d@H)LDL$ ADL$ dHc7HSALJHA2ALJfD$MA"fH51A= Hߟ7HϋaHE1輋ALJ}@HE17hAUATIUSHHLHdH%(HD$1hHHH#HHH)HIE1H ~YH?۞7HI}HH5@1ѵL詊ǃA=fHT$dH3%(DH[]A\A]fDLbǃH A7HH1HH IǃE1jf.HL1HdžHdž@HH)pHHHHH  H=HƹH_`p /LaǃHHLHeADHHЉE1ۅwHL,Ad@LǃACHI}HtpH5A1ҳA=H5Q1貳DH?HHtS~H51bA=THtEH3H$HǃHH)‰ЉHכ7H $ǃH)HH)H)ȉHCSHLu[HPtǃL[SHH8Z7H{(P7H{F7H{ <7H{27H{(7H{P7H{H7H[% 7fATUSHH.H{Ht](BH}IHtBL9tI9[]A\fHusH{(HtRAH}(IHt!AL9uDH}E1HufHu3H{Ht"HuHt[]A\DH}(E1Huf1@w@f.USH7HHt2HTA;"HtTHt'HMH "tW;/u/uHH[]À;/tHڙ7HH=G[]%7HsHHHG;/uHtHD+fAWAVIAUATIUSHH|$(1T$4LD$LL$ T$3dH%(H$1D`HD$7HH@7HHe;L@IAt!< t < uDIAt< t< tH$LmD$2HD$HD$hHD$8HD$pHD$@LIHHT$H5A1LHƄ$D'L?HT$2H!ကtDHrHD։@HH+T$HtHHt=AtHP@ t"@ t fADHr< t< uHHADu1ALuHEt< t< tH{u =<HHt$H=,B H{h7HO7HHCZ HHHC E MthA<$taAD$Il$uuDHE`< t< t;H>HIVH>HIBLLcPM1A<$" 1IL|AHL$HHH)HH9HNHS0|$2H{(uHD$HH{HM7H{AGuA t H{01CYuAI?IH&HE1fDMILt2HG0L'I9~HtH9M&IofMI/LuHu6HtvtC@8E@t# Ln:Ht LY:HtHl$hH5LE1L5H /L 7t"LAH= }7HItJL 7LLL$ ,I9HD$(LL$ wLLH*LL$ LAfDM$$MLt$MJ,H,7HIt|HtH@HHHHuH LL*II$tID,LH HrHH9H1uID,LH7(fDH8HHtH(HHu1HL$XdH3 %(HHh[]A\A]A^A_LT$(LM9t C<>/AD`7HHtI|$8Ht7HHE8[I|$(Ht7HHE(>I|$Htƃ7HHE!I|$ Ht7HHE I|$Ht7HHEI|$Hto7HHEI|$PHtR7HHEPI|$HHt57HHEHID$0HD$HE0AD$@E@AD$XEXAD$YEYAD$ZH]HEZL(*H<$H*H9IHD$ H$I)LJ40船tHT$ H9H$B|0.A|$@BM|$(cH])fHATUISHHtlH+H{8K7H{(A7H{77H{ -7H{#7H{7H{P7H{H7HH7HuI$ID$[]A\fD@f.Ht{USHHfH+H{87H{(7H{7H{ 7H{7H{y7H{Po7H{He7HHY7HuH[]D@f.HAVAUATUSL'MIML~DI9LDL9I.H{87H{(7H{׀7H{ ̀7H{À7H{7H{P7H{H7HH7ImHtH{0H+yHIHuMe[]A\A]A^ÐIk@f.HATIUSH.7I$HtiDH+H{87H{( 7H{7H{ 7H{7H{7H{P7H{H7HH7Hu[L]A\%7@f.AWAVAUATUSHHHHxHE1HH-L5L-UMH{ZH5PWH=ARASHD1gH HIHL̮HtgIHHtpHK(HtHCLKMHQvH{LS0HHDŀ{XMEMLDʀ{@i9.HMHDYL~7LE1HL[]A\A]A^A_f.AWAVAUATAUSHHHhHHtqL%Cl@HHHunHHmHHuHIHǃHQHHHt H}EtLHCpLHtL9`Pt6Mt1I|$u}7I<$Ht@H/HHuLO}7HH߾[]A\A]A^A_鼬@tHHt胮HǃHFYHULHQHmHHh1H$(H}IHtEE1DMILt0HG0L7HtI9~H;}ZM7Hm MLuH<$H5vH~7H=xHH$,HmH}D$L%GL=`ML}ZH5MPWH=cARASID1'H HIH<$H5H1L{7HmHthHM(HtHELML(HsH}LU0HIDĀ}XMDMLDʀ}@Y9.H/LIDE|$LuH<$H51|$tyHhH5H1OBf.H<$H5^u%HH$tH=H~*HmD$H|H<$S!H<$E!yAWAVAUATUSHHGL0MSHOfAE11fD$ fD$< uAot$@MfpfHEMN4(IM EA0D$IEH$y7HIH}y7HID$H4$yy7HID$ HIDMtMg(MT$AD$AL$AT$ At$ HMfpf#fDH{ &y7H{y7Hk(Hy7HHu1HH[]A\A]A^A_I|$x7Lx7fHt;USHHfH{ x7H{x7Hk(Hx7HHuH[]@f.AWAVHAUATUSH(HHL$dH %(HL$1HL$I'D$OH\$HE1E1fCL AH{CH90w7HI5foHDpH@(Hw7HIG HKH1H0H|1H|0HpHH)H)r1ǃL99L>rH{ Ht>w7HIGMMDMt}M}(MH[(HH|$HMED$D$HD$L D$HT$dH3%(H([]A\A]A^A_AMI v7Lv7H|$Ht2&&+@I|$ }v7I|$rv7I\$(Ldv7IMuD$E1J%/D$E10DHt1AVAUIATUISAͿ@Hu7HLHu7HIt t#Hu7Hu71H[]A\A]A^fAoHS C CHC0DHHS0L#kHCHCHC8LHD$Uu7HLu7HD$H[]A\A]A^fAHS C 1iATUASHHH@HT$dH%(HD$81 @t7HHHt7HHD$DHH+HCHC8C HHCHC0HCHC HC0HHD$ct7HZt7HD$HL$8dH3 %(uQH@[]A\@H\$ H HK~'DHH޿ fHs711WAVAAUIATIUS0s7HHt`ns7HHHC LfEHPHlw9HEHKJKuHH}LTH[]A\A]A^H?s7H14s7HAE[]A\A]A^H}LH H[]A\A]A^DH1r7H[]A\A]A^ÐHDH9w@:0u D8t HH9v1f.@AWAVAUATIUSHHxr7HvHLcr7HHt8uH]r7HH[]A\A]A^A_?HHtLAL 9L*L'L5#L=!IHLHtYLHuRJHuHtH)ILHPLLHHq76JHfDLHtٹLHuB/HEDLHLHH5۱HtH5!dHu@/tIHLH֤JuAEIJHfI9Hrv(A}/IMutf.H9/taH9uIAEJHfDI9B/Hrv$A}/IMu4fDH9/t%H9uIAEJHDI1IDAWAVAUATUSH8dH%(HD$(1y.E1HL$(dH3 %(LH8[]A\A]A^A_DHHXHo7HItIIHD$%E1Ll$HD$I@IvGuHDpHt }DxuAL%IIHICD4t[E<%tLfDHcH^f@@|$&H|$LT$%D$'HHHHfDMA@I@f.AWAVAUATUSHIHHXHln7HIHIDH-fH\$E1H$fDE>AWӀQwCHcDHfDG|%IIL94$uCD%HL[]A\A]A^A_DHD$HH9vHLHHD$7HItGK|%HǤAϾ1IDHcHZHm7HI&@E1qE1cH1@AWAVAUATIUSDHZHHdH%(HD$81HH $LD$u HBHXHm7HIIIHD$(E1HD$HD$5HD$NIvNEA|$HDxHtEL$BDHuA$<%t<w@uCLfD@t$5H|$Ht$DL$6ID$7LkHeLl7HL$8dH3 %(uGHH[]A\A]A^A_K>HD$HtL8H$L01뿐fE1&fDUS1H(dH%(HD$1HD$yHH\$dH3%(u_H([]ÐHLD$HL$E1HcuHt/H|$HvH|$>k7@蛗EH\$@%k7f.Hk7HHt(HxHHH@x1HH)HHHfHt#SHH~hj7HChH[%j7fDH7Ht8t HH%Xj71HfUSHHHH~Bj7H;HCHt UHHCHH[]%j7fHHMAWAVAUATUSHHHWHOLGHG(HcHu i7HHEDcL561IfDHL9LMt@Mt\@IIoLH0AԅtHLLlHk(HIuыC HL$HHL$9|H[]A\A]A^A_IoLHLlHk(HIufDHIиH9sHHHHHOH1H9u1IHff.H9t 1HHHHHÐH>FHFf.HGH7HtHPHHWtHODF A9~TH6HcL HHHuBAA)AHHIHIH@HTHHHuL9u1DHWHOf.f.f.f.f.SH c7HtHH1[f@fH@@|u1˅f.SH1HH|tH߉D$ 9D$ H[Df.LATUS1IHCHtfH{xIHAHsH9XH@ HCpHkHtcHShHCI$HSHSXHLHS`HLCxHCpH[]A\fH HkH)kH[]A\HCH[]A\ATUSH/HHt70t,t'@HL`0t%LH?ƃ@u2MuG[1]A\@t҃tRt5t`ƃ@HܺMHExtH[]A\飥HLHtL9HPHI9 jHLHuHHtI9AAWAVAAUATAUSHHHL HMHAH(HAtyMMtI?l`7Lc`7IDž0t}tXEDu:Eu3@u*u!HIE(H+H~xf.1H[]A\A]A^A_IE0IE(EHDtIE0IE(LH1I}HHdoIEHRH51Hv4yUSHH1H1Hau#`t&CtH@B|u EH[]D@uD1HHCytӾH߉D$ 莸D$ ATUHSHHIHHHu2f.H[HtH;LH艖tH[]A\D[1]A\ÐATUHSHH@IHt u6HDH;LH*u&H[Hu[1]A\fDHH[]A\ATUSHu Ht<:ut8kLc@W LHH+@tDh u H8HHt`H9v H HH9t EDB uH)H}Lek]7HHtLHHEHD([H]A\D HHHuHSHHw1LVf.ATUSH(PcvKtu1[]A\@IHt)=^@t=+Jf.@#=@t =+HG\7HǃH\7HH0t @ H](#==?=4A$(H5U1LrHKH#K 0]HǃK@HǃKƃKHKH#KuMl HǃK@HǃKƃKgHǃKHǃK@oCfDHǃKHǃKID==KfD=+MK@@30!HZ7HHtƃK@H(HǃKHǃKqDHǃKHǃKD@@HǃKHǃK HǃKHǃKtHǃK HǃKHǃK HǃK>HǃKHǃKHǃKHǃKfAWAVIAUATIUSHH(H/dH%(HD$1@I@HKHtHKuHKHKHtHKuHKƅKA$Jtc@uZI$JHtMA$uBH֎u2AƄ$K1KD@\ƅKƅK1'I$KH+HtwHAƄ$K1Ht$dH34%(H([]A\A]A^A_8@/HKHHƅKDL1LHJH uHL]HDH5ٓHHLE1plA$KA$K1;D@uAƄ$KfLM5L5MmMtI}LvtI}uL+HD$IHtHL@HD$I HHD1M L^HL$LD$HLL膈TH|$2HAU7HT$H5H=1H|$HAU7HAAƄ$KH .ifD@uƅK"ILLHHH HhL~H H5LHLE1jA$KA$K@ LMu .MMt"I?H5f賌tI?.H+HD$HHHhLp@HD$H HHD1ZL LHL$LD$HLHÆH|$tsHA.T7HT$H5ȌH=Ȍ1\H|$HAT7HAt!AƄ$KH sL0 fDAWAVIAUATDUSH@L'H|$JM$PMI$KAH=LʌEt|H55L1hf,t IAu,u A_It#HDDB tIAuH1[]A\A]A^A_fۧtIMH|$LHMDEtH5L1hAƄ$Kcf.H= L܋=IMHMH}(HEDM$XMI$Kf.%R7HSH R7Ht H?HQ7H[@f.AWAVMcAUATUSHHH8H>F@dH%(HD$(1H@HT$HL$LL}Le@|uh`Lt\LD$ DLH9mAH}\Q7HSQ7Ht$(dH34%(DH8[]A\A]A^A_DLtI@@LIFH HHL$HHL$L ]fLH+T$HD$ H;IH9HGI)рHt$HMMM0I9H}HH5HI)HLIMXHLIM`IMIMhIMIMpHLHLI}MeIAEx@HHT$ILLL$cyLL$L\$Mu4HD$ Df.I9tKA7AExiH;KLIؾLL$yHD$ LL$DHxH%@f.AUATUSHHHHHGH?H9s)SO7HHCO7H[]A\A]HItpHsH (HVH9~HHHT-H HHIHH9LCHusLN7HHu+HN7zHIxHxDHCH;LkHLHHkH1[]A\A]fDIL١H@USHHHHT$@HL$HLD$PLL$Xt:)D$`)L$p)$)$)$)$)$)$dH%(HD$(1H$Ht$HD$HD$0D$D$0HD$ NHHu6H}M7HM7HL$(dH3 %(u7H[]@HHHHH߉D$ UM7D$ fAUATIUSHHHHeHHHItSL+@t HH+@tDh u HxHtSH)LHH9IsH1[]A\A]HHI9wLLH腄tH[]A\A]Ð HHuHH뎐AWAVAUATIUSHHL/dH%(HD$81@HT$R@ImHD$ D$HD$ H$HD$HD$H $HHfH+:HpHDxLpE@HIE>EADP uI$0AtH=H݄uyH+A00A$@I$HAtH=l H蚄u6H+A$HH|$H51u,f.H[HH$H$9D$1HL$8dH3 %(FHH[]A\A]A^A_;H;HthLx@tHDh tIA/@uA;qAG:HC@H=oH謃DH+@H=9 H脃H+@H=9H\H+AtID$HD$ I@AHD$ xID$HD$(gDf.AUATUS1HHdH%(HD$81 u*HT$8dH3%(/HH[]A\A]fL HH(IHdL$D$LHct$lAɹDH 6HH $PD$ PD$PHU6RDD$,H؅L 1?x H t)td1H5ɁLL1H5ƁLL1DH5|H1?_f.H5LL1`AWAVAAUATUSHxH/dH%(HD$h1HLxLD0HD$_D$gH$CHJHHD$yHJdG7HGG7HHJwHJHD$H@(H@0H@Hp@xHL$~H|$z LL5ƀMu@DMMt2I? L~tI?tHAF7HǃAHt$1LHAK3K$@H(AYF7HHǃ(AHHLMt>L5fDMMtI?L}tI?HH=1+HH(AAfHL$hdH3 %(DpHx[]A\A]A^A_f.LJ@uHArH eH~HEHD$ODHǃ(AH`HHHL$ LtRML5k MM I?L|tIHHL HD$ ML5~fDMMcI?Lk|tI?EHAhD7HǃAHLMjL=g~fMvMI>L|tI>HLM*L5+}fMM I?L{tI?HH ~H5|`H{HD$(H0AC7HHǃ0ALM~L5n|f.MM^I?L#{tM7M>JLHI:LB7H5{L Hǃ0A@D$@D$o HLLL9 HLHT$0HI HT$0HLHD$0LII|H+|$0Ld$8HD$@6B7HIRLLL)HH|$HHHL$HLt$8HI< LHL$HHT$@LHD$0H)HH)I4LHt HA7LƅH=|LztU8t*H5{LH Pt x @D$t@D$DHAL4M L5{fMMI?LxtI?1HL$HA AEHLHJHAH 1HAЅ  HLE1ELHLH LIHI I9 HLH9y L)A@H@lI럐HHJvH@D@xtXAuO@H tH5fu H wHH$H=z1H0AHtAPt@H wHtH$H=yHHEH=fHE1H0A@HHA?7HH=y1HǃA=HHAH@@xt{trHLuh@ \L    H8 H Ht H H xƅHD$(HwvƅHD$(HLM L5yMMI? LutM7HHA=7HǃHAMEH=w=7HHHAHLH4]HD$mAAHvHD$B<[% :LHtH8A=7L8AHDžLLtgD AtRHLML5~wfDMMcI?LttI?ED\L H=HD$0t@H8 t.Hu ~#HtH HHL$0~ H#HD$0 <7HIGHT$H5vH1A.|$HHMD$H5vL1oAE@t @ML=sHH=stH(AHsHHDHLsHt8tLAHsMLDHL$HHAHnsH`IHI HHDHHDHt:tLAMLDLL,stL AHsMLDHALAHsL0AHHDMLDMLDHT$_Ht$0AWWASLVQH5xATARPH$1$HPAHAh:7HKHǃAH w(HHsHA3:7HǃAEWH@@|utH8A-HHiH@H8AHxLHHxHHD4$E1IIHH$iMMEIL4HKHBsH5}t1L}AHHLCMtEuH5=t1LFLCHKHBqfHr!@HHD$HMHD$0L5q MMI? LptIHLD$0HHt$AHLMZHD$H *rHH H`HD$ HLDD$fDH=q1L_HH0A:2f.1ML!LHLcAHLMt3L5r MMtI?LotI?H A77HLH="r1H AA_HWHD$NH A;77HcHLHLHLHtPH H=8u1HQEH AHeHHA67HǃHAM&H=q1H AHLHH+LHHLH5^tH1AMH|$ tiH5iq1LA|HsnE1HL$ H5\1LAAtuH5DqLAE/LHA1LHlAHD$HHH@8=AAAdH5pL AH=oL1@HLML%(pu-fDMMtI?LltI?TL=RrOHnHmHEHD$(4HLH=r1HrH AHFnHD$LT8kHwH HxL8u}1HLHHA|/tdH|$`D$_/H[1aL?IwHPL]LHH|$_H<$ALH<$LEH|$ tnEAHqm[H5qH1AJH5"qH1AzJH5mH1A^JyE7@PLLIuH5mnHH.H5kHHH5kHHHkH5kHa`LHHt`Lt IHL$LHHAHLaAxHLHL9H5mmLE1HHME1LHL!AHD$HxgH0E1H1PHD$ HHL@(Y^HD$Hp0Hƅ@LLItMLHHH5slLLH8HHME11HL AMmHD$E1H0E1E1䀽H57l1LLU*HD$H0Ht @H5k1LHHME11HLnAH5{kH1EOGjH6H7*DEHD$HP0L9SH5oLH1YEƅDž@"HD$L`8LHLHL$HAPHLLHLAxLHHAHt$PLHD$PHHT$PHLH5bjLLl$HIu6HHME11HL AtQH5jH1EELFHAjHD$ L@(H1HE1XZHE1HL$HA0LA(PH5lHE"H5iHrHHD$H5iLHP1H5viH1A"+EFHH1LHHL`H5iL\VE1MuTH5hL+I!LH5f1AH5UlH1EDH5 i1DLuHLLMl$uH5]hLqXHLLMVH5kh11L_H5;hHHXH53hLLS>(H5gL t @u`HL>MHHIE3@HL$HALaHAH5gH1E-CHH5:gLyIw*ƅ`L7H5{j1LqFLHH{+H`HD$ HHME11HLAuHD$Hxt*H0E1HPH5gH1EYBt1Aff.AWAVIAUATIUSHHXLdH%(HD$H1HD$@HL$HD$ HD$AƇIA1HoH5^WL1+I\IH=ROtA(=IH=gRZOA(t =]-,cH@@z}AUf.H3oH5VL1*IH=QLNiALJHIoLDL8AMxLMIILHH {{L~DI2H5PL1A4*ALJDAƇALJLf%fILJLATf%I=@bHI@HHALC7EDH=PLMAƇALJE1H=:LMMALJHIIH=7P MII脵HH8uhu7IL;H=OLLd蟺 HºHI4A AI7HI~HAsGHG0G fAWAVIAUATIUSHHH8L'HdH%(HD$(1A$ tA$zID$xL-THD$HD$ HD$Mt0C wIcDLA> C IIMu1}fDAHcB< e< ]B9HBBHc7HHBHcBA> Ht$(dH34%(H8[]A\A]A^A_fDA< < 5fL9{(LHN{(>H;IÀ!$A$uA$ L]MM)HC(L)HHC(C A> H{( C ǃBDAHcCʃ߃AvkQЀ vc9Ht$H{DCHHC(H9C  A< < C VHcЃILICDA$H>H5_31&=fDCHC0C D< uIIC IttHBJB HcBHBHB HcBHBA$ CǃBC A> @C @HBJBA @HH1n5fDC @Ht$LM$HL\$nL\$t@LLHL\$0L\$Ӑ蛳8"ǃB+7jfDHt$LM$HL\$SkL\$kHcBHBH06I:HC0w{HdOHcHfHHUOHNHQOH'HJOHATUSHHH={ELxKH8K@HLD>FtBHk[t!IH@H]tDX u[LH]A\kfD[=]A\@f.AWAVAAUATUSHHH/dH%(HD$81@HT$>LAHhLpHKHALxKHD$HL$ 7H;DHI$HL$HDMLDI}HD$ xH 7IMHD$0MLHMHPHD$0PHL$(L\$ nL\$ L 7XZuGHCHT$(H5DEH=MHD1蛪H|$(I$D 7I<$tuHD$@HT$8dH3%(HH[]A\A]A^A_HKLAHLL8KHAHD$@@1딻fHϾ?HL$>HHL$H)H=LHH1ɩIܱff.SHH8KsHxK[sAWAVHcAUATUSHD$XHHT$0dH4%(Ht$x1HD$(CL$DDD$CD$dHt$(HL$hL'ID$_HD$HL$@Ƈ@\$ l$DLt$0H5MLLI$ 7IDŽ$RHHH=K1L裨HHH5KHL`H$, 7$A`HL-HT$0LEI9A@t:H|HH AH=DD$DH/H=)KHHEHT$0HE1HHH5ALE1HH5tCLH@H EHH50BLHEHT$H $蹩HHT$H $MALW@MMDMyQH5PKRMLHH1蝹LD$7^_$$H7$tHH5YKAL11H蚵H\$xdH3%(D HĈ[]A\A]A^A_ÐHھLuH5BH uDD$XI$HM1LH_o1 HD$(ǀC1L?HY|$CI$(I$ LD$$H$AHD$HHD$dD$BH\$HD$PHD$pHD$8}mI$ H@H9,1L]?HI1LD$t$ HL-Q'u>H|$h?AHD$I$ HWHHHD$L A$$M I$|$BHHD$(CH\$(H5H11LǃC I$CH$D$$; H$9HH=?@;L A*|$ IINHEH<$?!f.LA@I$H'A$( HD$(ǀCIA7H5\IILJALAƄ$K1AƄ$AƇ@DE1EH$DA$Hc\$$$1A$Lt$HLL@ƃ/&I$@MI$A< < 9HD$H=@H=tA$(==Ht$H=?<A$(8cnH|$ 1HHD$H<$?I$ D$$H\$@t$XL\HL$8HLHD$p qEH$>fDA$(I$ N1HD$(AǀCH|$=>HHHLtHD$7D$AYAFHT$MHپL8+H=JDHHI@H7H蔯AfQH5DRLHH1'ZYI$`:IA.DH5)E1L_L A8z@A$KH|$T1ɀ|$_H5C1LWHD$AƄ$x Hpu HHt$HHL$LL$_-fH|$H'H5;8dD$BVH5BL1A8i@H5C@H5B1LE1HD$(1ǀCkfDI$pI$KH5CLAƇ@;LfDH5aCL1A816LIDŽ$YH\$(L@?ǃ@HD$(ǀCA@A$(H5CL1@H5AH|$H^9H598贱A$(8c2H5AL12L\$_HT$H5BL1 $ $H\$(L@?A$(ǃ@I$H5{AAƇ@L1H|$HH5!9ְHL$HHT$PH5AH|$#A$(A$$MH5@L141QH5BL1A8H5"BL1A8ATUSHHdH%(H$1`t<@t @uZ1H$dH3 %(4HĠ[]A\DLcB'@uJ'@=ƃ@@HT$1H3HHLHH1[V@tjH@E1HBHL0D$ HAg6HǃAD$ t+Hf.B#@@HvDf`1f? tfDOW ȉf ftftft 1f. W 1 W W W W W W W W W W W Wu1@AUATUS1HXdH%(H$H1HtHqHIv01H$HdH3 %(HX[]A\A]1Ҿ觪AtfLD$IT$(HHD$0L)D$)D$ .ILDfD$ 1_yD裣XfD|$ D$$HT$@Ht$ D$ BdDj谡AVAUATUSH@dH%(HD$81HtuHHMEIHHv(1Ht$8dH34%(H@[]A\A]A^D1Ҿ臩AtfLD$HU(HHD$0L)D$)D$ ILDfD$ 1@yD脢1_D|$ D$$Ht$ IcLD$ +cDS+蔠@SH !6HtH@HXHH@[Df.ATIUHSH6H1Ht0HCL!Hu2H HAHAHKHHC[]A\fHt+HUHiHQHUHtHJHM@HKfHHAHQHJH HtkHtdUSHH;7HFtuHNHAHFHtTHHHHH6HUHHCHHC6HmH[]øf.HOf.HHtH@fDHG{f.HATUISHGHHtrHkHu fH;+HEtgHUHBHEHHPHuLSHEHEHHE6HCHHHCuH[]A\%6DHHtH@fDfDHCfDHSyHGÐf.1Ht\LGMtSH97t{LNHFLHLNMt>IAILGHBHu1H2HFHFHrHHBHGfHyHNH~HyHt+HwHqǐHFHHt$H@f.Hrf.HGaHcISHihHLLH|xH[@=7QE‰H[AUATIUSHcHihH1HILHM賝IHHpH~H[]A\A]H1tQ8EA$Hf.AWAVAUATUSHHL?dH%(H$1`t$ @L0@H(@MD$`D$0IHD$ HHD$HcHD$(H@HcD$LihHD$8J3HHT$賛J3HHD$NHT$H5RE1H|$13 J3 HHD$MtH|$LDnHtH|$HJN30 LҤMtLLnN38Lj`mIHIL^Ld$`L`IH591ML :f.HL$`ǺD$HHL$@蓾D$HL$@H57L؉1 LkJ3HHHD$0sRHD$ HtHHnNHL$(HT$H5<J3H1LN3H)LHL  111H)2H5;=H#`H@HH <HcHD1DHihL!`@Lp@D$0Hh@MXI0HD$ HHHD$HX@HxD$`HD$(H5$61L2#H$dH3 %(H[]A\A]A^A_@1DHihL!rIhH4IxmLd$`ǺD$@LhD$@H56MHL؉1|$0MG@H\$`ǺD$HD$H55ILL؉19:LD$`ǺD$@LLD$H˻D$@LD$HH5;5LL؉1|$0\f.H5?:1L#D @L0@D$01DHihL!1DH(@MHihL!IHD$ HHD$1DHihL!HcD$`HD$(H5N91L#D1DHihL!HX@H\$`ǺD$HPD$HT$ H54IL؉1oR8D1DHihL!Ih?H5I51L#DHNH,H54L1H>HT$H5rHZHD$8H nE1HLH@THHt1HjAtVHHD$X/L$Ht$X1H|u&Ht$XLkH57L1bHHT$0Ht$H`KIpHt$LksHiD$8hDŽ1{HHH5U3L1fD1HH1ҾH52L1a@HvH5o2L1U5HNH,H52L1fDH531L#xD1DHihL!IhLLH}DH531L?#H߉D$9D$H52L؉1#QAWAVAUATUSHHL'dH%(H$1`9M$0HcH 7D$LihHHXH N;HhLr==LH5e2HL1LA`  @AAMAA3t.H52L1T$ T$ DBDŽ;1҉H$dH3%(H[]A\A]A^A_1DHihL!M$8fBDŽ;1LHIdA$tX@6HIǺSH3L@HH53LL12L6MI~%I~hz6HIǺHIvIVLAlH51L$Ih&Lvd&LHc)LHcLLD$ L6T$ KD1DHihL!`@Mu3HihH52L1DŽ+1fH50L1ZDH\$ǺD$ H(D$ H5=/HL؉1L#fH5y/L1/f.H5/L1_(f.H5/L1H5;01LL1L6ZfDH5/L1<Lw6ՍD@f.USHcHihHHH8PH0 裗H 薗HIFHHHAL7D@Hi\$hAAHv1LAHPw)DDADAED1o DH6uHAv:v0HD$HiD$h1DŽDHL$(dH3 %(H8[]A\A]A^A_1LqHx,DHu1fH5^-L1o}D苇H5B,L1H#VfDHD$1AHt$H HihDŽ|HDHXH (HhHD$LeA$tHD$ 6HHúH8HiD$hHHtH5+L1v#HDHt$ 1DHu Ht$ H1DHH!HD$5T$H6H5,L1T$AAWAV1AUATUSH(dH%(HD$1HcHihH$H|D@HAL7Hi$hAHg1L1HVw*DDADAEHD^DH%u?PvHi$h1DŽf.HL$dH3 %(H([]A\A]A^A_1LiHx$DHuH5^*L1o苄H5B)L1H#^H $HihDŽ|HDH HXH >HhLeA$tHD$6HHúHVHi$hHHtH5(L1#HcHt$1DHu Ht$H1DHH@HD$ TT$ H6H5$)L1T$ 5`f.@f.HcHHihH7uHHAWAVIAUATUS_GD_ H|$HT$\$_D$@E"|$DًD$ArEJAjEz,Axj׉1D!1Ѝ>VD1D!11AR ƍp $!D1AR Bν1!1A| 1EJ!1A1*ƇG1EJ!1A F0 1EJ !1F1!1Aؘi 1EJ$!1A1D1!1Az( D[1!1DE\1Ez!A1DEB0 E"kA11!1DEJ4A1qA!EJ8A1AA A CyA1D!1Ar<DD!ID1!1Ab%EzDA A1E!G7@@Ez,A1AʼnAAD1!1DEQZ^&D EzD1!D1DEǶ1D!1DG/]/A EzA1A!A1EDSDAAD1!1DDD D1!D1DEEz$1D!1DG/!A Ez A1A!A1EE7ÉAAD1!1DE D Ez D1!D1DEZEEz41D!1DG/A EzA1A!A1EEAEzAD1!G/B91DD ogD D1!D1DEL*1D!1DA A1EA1EEz AAEqE1EEA CD5Er,A1A"amEA1A 8AAAE1ADA C >EzF5`K1G/D꾤AA1EEzAAAKD1D D1AA1ύpEEr4AAD1G.~(D D1AA1EE'AAD1DEj ADG=01AA1EEzAAAD1Ez$D G79D1AA1EEAAD1G4D")DF.| AD1Ѝ*CAA1EEzAAAeVD1EzȉD D D1D EY[e1C)#A AA A1AA9AЉAEz D 1 D D1DE D 1DF}A ADEJ ׍,1DE]EJ  1DE O~o щEJ4 1D 1Ar ʍ>CANA A1DEJ A ~S1lj  I@1AJD$썌5: 1AJ T$荴1* 1Arэ>ӆ 1 AHl$@HD$|$X\$xDX XL[]A\A]A^A_f.fo!GܺGvT2fDATU@SHHLc?HrDHLH)H8H)1Gt P<;CP{CQ;CR{CS{CT{CU{CVtL@H߈CW{XE{ LE{ @E{ 4E{ (E{ E{E{E{E{E {E {E {E {E {E{H{EHHǃ1HH)H[]A\ÐHqHHDHH) d1ƒ9H<rK1s9t @LHL8DHHDHQHH)ȃr1ɉσ9H4:rDDD1fT@Da1ftSf.AUATLoUSHHIHO9‰ڃʃ?WtV@H)H|H9\t]LmIH)H@LH?rOI$IEITITIEHI)B4+M)r1҉уI< 9H<rH[]A\A]ÃtA$@AEtAD4fAD5fDHH[]A\A]|fDHLHH?#IEHIHHLHLHGHH)I)׃1ɉ΃M 09L 0r@A$AEAD4AD5&ЋLLLfLff.AUATIUSHHHfordH%(H$1)$D$ܺD$vT2xH^$Ač 9ʉ $dL$Hȃ?D$tVҸ@HH)H|I9;tAUHu@HII)I?H}LLz$@?HJDHtH)H%8H)1t $<<$|$D$P|$D$Q|$D$R|$D$S|$D$T|$D$U|$D$VHu@HD$W|$|$ s|$ Cf|$ CY|$ CL|$ C?|$C2|$C%|$C|$C |$C |$C |$C |$C |$C |$CCH$dH3%(HĨ[]A\A]Dt$N@HNHHDHH)΍0<1ƒ9H<r#LLx1sY t (Le@HLL8LLHHA?ICfHHDHVHH)r1ɉ΃9H<2rfIUMHILHLHWHH)I)ǃ1ɉ΃M 09L 2rDD1fD@DAUALL:1fTALfLsDUSHHl6HHt}[6HHCtH+HUHH[]H1%6f.HHHHP1HSHHHHsPH{6H61[AWAVAUATIUSHHXdH%(H$H1HH|$H8D$/D$H_H5aH,vHD$ H|$ HD$@Hl$8D$(D$.D$E1AHD$HT$ H|$ uHH|$H5xHtHIumfDA|$T$6L6HHFD$H51HtHIZH;Ht?tIEHt 8ArH|$LEAADEH=LALH=i|$.t9D$(u|$/trI}6L6HIEthD$.$@H=ELyD$H=L] D$D$.fDD$.D$(AH|$ pH$HdH3 %(D3HX[]A\A]A^A_LD$D$(tH=^HIH=R H H_H1%hLH6HH5HsHHD$ 6H|$ LA>D$/D$H=L;DL$(D$DEL$(pHc|$<;0<'A'1|$D|$AQMcLcd$D)AʉAAA)ADA-HH A#HHcHHHJcHJD H@IHHH)HHHH)H{L$nHcHHH)HH9HMAffH\$PH51LH)D$P)D$`puiE1|$$|$|$L=@H!I I9LHtAkG1HxLHD:~^LHHD%Qtu!HT$H9tBHt5H)HIfHL$dH3 %(u(H([]A\A]A^A_@֐HL$LHf@f.AWAVHcAUATIUSIA1HM(LdH%(H$x1A A@LD$H@t.|$HnH1H;H5ELHD1H1H51DLL(|$ADfD\$pd$rDt$smMD$xLeH=I@HPH|$xHD$pLA HD$Mch|$HD$HT$LD$ LHLD$AL9|$ H|$u;|$u4L,eLD$LxLHLCkL9|$ `HD$(L|$HD$AHD$fH;1qH HHL$LLQtHD$(I92HI)IHD$@HL$(DLHAtzHD$(HtSL0MtKHL$0@LHHL$A~HL$H5 LH1Ht$(L]H5 LL1AH$xdH3%(DHĈ[]A\A]A^A_@H5 L1oAIF H55 LPT$tPT$uPT$v@HʈD$w1xHt$(LMD$xfHD$pHL$xHD$IAI!%tHD$DIQLD@II)A McXDHD$pA A HD$LD$tbHJ 8HD$HHD$f.H5 L1A9@Ld$I|$p_D$q<[ <\Z<]L$uT$tH5 j]$LfPD$1D$Y^>DH5L1A@H59 L1wfHHD$McLHL$J<04eHL$IL$uT$tH5V j[$LfPD$1D$AYAZH5HH{ 6L6HHC[8H5#L=CC8-H|$u2H;=H$HdH34%(HX[]A\A]A^A_À{=uH5\H:t&H{ d6LK6HHC SH5*HL6HI&HT$H5HGHHu(cfDDl$HT$H5v1hGHHt=H5xHHT$ HT$ uH5`HtD$AEňD$L6|$H{(}6H=`6HHC(hH5DHH{0=6L$6HHC01H5LtECmkD|$]H{(6H=ќ6HHC(9H5pLt C=@f.UHAWAVAUATISMHH8HELEA8HHHDžHHEHDžHdH%(HE1EuAA8I~IVHH=H1;;HHGLL@HLMg LHL6LLAMHL1IImM9uA~HHH=n1:I~(IHtH5 MLLLLLp6Mg LAMHHC1IHHI9uMN(IMHAN8MFHAWH=19ZYHIHHQLLi6Mg Mf. HL1IHM9uHu+D<"tHHt<\uHHu6HH@HHHt@H<\tHt#H<"HJu\HHJBuIF(IVHHMNLAWPH=AF8IHP18I~(H5H ItAF8H$6MtIV Ht%H=#L1M8HL6HtTIIV0Ht%H=L18HL˘6Ht&IHLL;?HH1H]dH3%(He[A\A]A^A_]ÐHLLuŋLeHDDHL!P1LL H!%tLDHJHD@HHLL)K^_.HIFINIH=H16HLIHLVLu6LfDA $HL1II-M9uHH=;L1k6ILM6HH=L186WLIH=MH16I(>SHH?6H{H6H{HC6H{ HCv6H{(HC d6HC(H{0R6HC0C8CC[f.@AWAVAUATUSHdH%(H$1HSMIAIHM+ 6HHdAHvwMLxDhAH5LHLN<6D$%=@"HD$0I$WHEH}46HHCHLH @HCM(HkDktI,$IHtxHI1H$dH3 %(HĨ[]A\A]A^A_I8fD+fL;HIH6I1fvfDML{HkCDCH/6+=;AUATIUSIHHL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$HH׻HD$HD$ $D$0HD$ 4HHt*M a6HHu9HC6HL$dH3 %(H[]A\A]HHA:HCIEHkCHtZHI]1fDI<$xQ ֒6HHqHH9HkHCCI$IEHuI]1I@+29AVAUIATU1SIHHH\H9HHr9H|76Hu"H!6H[]A\A]A^HHDŽu7"tHt$H\H~u\HH~VuIHHLL1LD$ 6H6D$ H[]A\A]A^fDb6HHEHHL6Mt9HHu L5HpLHIIFI^@In(AF IFhM>pHD$IFXHD$IFpHD$ IF0HD$(IFPHD$0IFHHD$8IFHD$@I6HHELx1MtHD$@HuLHL$@k4HL$@HAHD$8ˀIMLaHihLAPHA(HD$0HA0HD$(HA8HD$ HA@HD$HAXHD$HA`AIEHHAHIF0IMHHQMvxMQHD$PII>9M;L|$XH6A~tI>Ht6IAFA~ tI~HT6IFAF A~8tI~0H36IF0AF8A~`SI~XIFXAF`MvxH6MmH}ELuT$`/HD$pT$`HHEkfDE_T$`/MHD$pT$`HHwA*DE@ fELuT$`/HD$pT$`H8H.6HHEOHM@E fDH}PELuT$`/}HD$pT$`HHEPfDHM@0H}HELuT$`/HD$pT$`HHHEHHE9@ELuT$`/HD$pT$`H8H}XO16HHEXgE`ELuT$`/HD$pT$`H8H}E@HΉ6HHD$6HHT$HPHUxH@@HPxHExH@ KfDELuT$`/gHD$pT$`HH}p_HEp fDELuT$`/HD$pT$`H8H}0OE@H6HHD$t'̈6HHT$/H͈6HM@@H}hELuT$`/CHD$pT$`HHHEhHE1@E1%H[xHrfDSfDCfDELuT$`/"HD$pT$`HH|HtՇ6HHE HM@E fHt6HHE0E8dHP0HUxH@@HPxHExH@8@.HD$hHPHT$hHD$hHPHT$h~HD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hHD$hHPHT$hrHD$hHPHT$hfHD$HHHHD$HIF0HMvxML|$XHV61L@H؃0H0 OMfXH 6HHD$HD$PHHEMHT$~1Ll$ DHHL -HS.6HHHL,L,H9rH)LI<,itAH.6Ll$ IJD8HD$H|$HD$HIF0tSAF8I^@GDIHt8IvHu Ho,HpHcHItAFI^@DL|$XsfLl$ vfDHD$HWfDMfMvxM4XHD$hHPHT$hHD$hHPHT$hATUISHHu GH{Ha6Ht$H{H+HK6vHHuI$[]A\Hu fUSHHH{HH+HCPuH{6HCPXH6u:H{H{8҃6H{Xȃ6H6Ht HDH[]ÐH{8AWAVAUATE1USHHdH%(H$x1HH|$Ht$LD$ HD$XHD$`HD$hIֺHHHD$0 T$lt$hH=1M"HIHD$(thHHH\$XHjMHDH11HAt=L6H$xdH3%(DHĈ[]A\A]A^A_AHD$XHl$`HD$HD$HHD$pHD$@fDH|$`tH1HH,AHL$(H1HHAH1HHAeINIVIHABHO1HHA#IFHHtqH|$6Ht$0H|$t/T$lt$hH=51 HHHD$hHf1HH1AIFHMH?HL$H[1HHAuvIuXI}HH|Au\IM8HtH~1HHAu8M}@MuFfDMMt7IHY1HHtAH|$HH\$HVkH1HHLAuIFPIUH5HL=6M7H|$HtIUH51HD$AH[@IFPQIvXHI~fDutH@tGH.INhIV`IHfAMmHMIFH8HINhIVIDIN0IV(fDH5bsH)HIH96t,H%IUI1ɾcDd$2|6/|6i}-!XpH5 |6!Hu{6D!fD+fHtHu6HuHtLHH=V1 HHH=-o1@HHHH=!1f1f.1HtI?tDUSH5HH#HHH9 tHtHDH9H[]ff.@USHHHH{6H4HH!Hz6H1[]@f.AWAVAUATUSHdH%(H$1HH|$@ H$4Lt$`HHIH|$0Lt$ HL,1Lf$HHHHH$$Ƅ$0 foH$LƄ)$HHD$Hfo)$,HCHD$XHD$PH$HD$(H$HD$8H\$P1E1E1E1E1D$D$1$E1E1E1111E1Hl$0@$D$$$$D$D$D$$$$D$D$D$D$T$$T$$HHHL L HHL L HHL L HHH L H|$ HHH HH L$HL H L$HH  $H$HH HT$HT$(fo$fEHHFHH))$E HHD$XH\$8fo$$)HH0HD$X1Ll$ HL*Ld$@H Il$0HHھLVEfo$IA)D$I9uH|$ $)H|$0ʟH|$80軟H|$H 謟H|$(蝟$}H$H\$(H$H\$8H|$ $Y)H|$0ZH|$80KH|$H <H|$(-H|$@0$H$dH3%(uHĘ[]A\A]A^A_fD@AWAVAUATLg(USIfHHXHl$)D$dH%(HD$H1)D$ Lu0I)D$0CuWCuQC uKC uEC u?C u9C u3Cu-Cu'Cu!CuCuCuCu CuLHھLyCuYIM9ufoD$HLfAE)D$foD$ fAE)D$ foD$0fAE )D$0(u foD$00HD$ 軝HL$HdH3 %(D$ uHX[]A\A]A^A_AWAVAUATUSHHHWdH%(H$1HIHH)L9L)H)H9HI10HIHHIPAHMM}tIPLHAHMMtHuQLHHtUH谜H$dH34%(ubHĘ[]A\A]A^A_fJ<;HLI@HL}uAED두D@AVAUATUISHHWdH%(H$1HH)L9HH10HIHHHPHMLmtMuMLHHoAtPH苛H$dH3 %(Du]HĐ[]A\A]A^DJ<+LLM@HH]AuEDAA#HHLJPHHH1HH)XHBB 'Ht+SHH($H߾X豚C 'C[Ð@f.wff.HwÐf.HHuHww1ffw ff.USHXdH%(HD$H1HuHL$HdH3 %(uJHX[]fDH\$HHt0H߉D$ әD$ DHHfDUSHHHdH%(HD$81HwNHtHHNt*0HmHD$8dH3%(u3HH[]fDHHeH㺀Hu5Df.AWfAVAUIATUHo(SHIHIMH8dH%(HD$(1)$)D$"HCLHLPHu[LcsHC0ExbHHB#uLLLHHL$(dH3 %(u2H8[]A\A]A^A_fDLcsEyH/w LpIE1FfDAWAVAUATUSHhdH%(HD$X1HgIPHD$ fHIIH$G 9G)D$ )D$0)D$@ GLHHMHk(Ll$AfCuWCuQC uKC uEC u?C u9C u3Cu-Cu'Cu!CuCuCuCu CuLHھHp<uPILIFƃ tAUA,II)PH4$HH<$0D$ 躖L譖D$ H|$XdH3<%(Hh[]A\A]A^A_fDIUMIILILIOLHH)I)ƒ_1M99L9rDM}H<$LHLl$?H4$H+HfCAUAALALALfALDDf.AWAVAUATUSHhdH%(HD$X1H(G 9GHfII)D$ )D$0)D$@=G2MHk(L|$Af.CuWCuQC uKC uEC u?C u9C u3Cu-Cu'Cu!CuCuCuCu CuLHھH9ILIFŃtAAII)MHl$ HH]0HD$ $LD$ H|$XdH3<%(Hh[]A\A]A^A_11Hf.IMIILILINLHH)I)ƒC1M 89L 9r(Hl$ AfDAAALALfCALfAL.@f.AWAVAUATUSHHH5YHhdH%(H$X1HHD$C 9Cf)D$ )D$0)D$@]CRHD$PHk(Lt$AH$IĀCuWCuQC uKC uEC u?C u9C u3Cu-Cu'Cu!CuCuCuCu CuLHھHg7AIIFǃtAA$II)GHl$ HHA0H覑L虑H<$苑H|$ H$XdH34%(DEHh[]A\A]A^A_D11HAHD$PEH$Hf.ILI$ILILIL$LHH)H)ƒ1AN9NrfDC0H跐L誐H<$HL$H=H<$DEf.Hl$ fDAA$ALALnALfALSA- f.AVAUIATUH5WSILH dH%(H$1HLd$HHL#H|$HٺH HuLHuOL}H H$dH3 %(H []A\A]A^@뷐HuHH$ HLHt H߾0L|HL0H߉֎LɎLH5TLrHItbE11ɺHLetH߾肎LDLHH=EI fAWAV+AUATAUSHdH%(H$1HEHHD$D$ 'rHe6HD$ D$fH{(L-G)$)$bHH$PHD$L$HHuqLct$HD$0E:H$H{(Ht]EH$dH3%(%H[]A\A]A^A_@Lct$EyH/LpIH5LHIuf11HD$)E)E)E \D$ufD$u_D$ uXD$ uQD$ uJD$ uCD$ uE1 f.fUSHHH*HH]H1[]f.AWAVAUATUSHH8DdH%(H$(1HD$PL$Ht$@HT$HD$<HD$HD$^HD$0HD$`HD$f.AhHELE11AHD$I(;A~ HD$PI~HL$LEDALL$PMtI@ADLd$(D$_EDT$^uH|$1LL$ 9LL$ u-Ht$0H|$ELL$ FLLL$ H|$@D$VD$A@L;H$(dH3 %(DMH8[]A\A]A^A_HT$1LL\$ XuHL$@A@DT$ HL$(fDHt$(H|$LKH|$@D$ 裆D$ EHD$PIFI(;nELeDE~RA@HL 11HI HHH;PDBxuHH(H9uAtH?wRl$<ALALAŅxAmfLmLLL$L)$)$)$)$MA*L6Lr61LX7A@LL JA1L@LVA~ LL$HIHH(H9uHT$HH|$@LyDf.SLJHHLJHLJHH)1HH{5HcH HHHHǂHǂ ǂPtBHcH @HHHHǂHǂǂ[fDSHH5Hǃ 訃[Ë5LcȃO N IIIE1ff.AWAVIAUATIUSHHhdH%(HD$X1H@Ll$ЈD$A$Mt$D$u1L4u Ht$A$LGt2@LłHL$XdH3 %(uXHh[]A\A]A^A_@HLLbGfDLl$1HLL3Tu@M@CffDAWAVAUATUSHdH%(H$1HD$0IL11L$H$HGHD$HD$>HD$(HD$@HD$I(A;$A~ HD$0I~H $LDAALL$0MtI@ADLl$ D$?A$D\$>uH|$1LL$N3LL$u.Ht$(H|$A$LL$ELL$H|$@$$H$dH3 %(H[]A\A]A^A_fHT$1LL\$zRuHL$@A@D\$HL$ &L$AL{DqHt$ H|$L.EH|$@D$KD$=HD$0IFYtLD H@w5Df.ATUSHHH5EHPdH%(HD$H1vHtyIHߺ@LHt5L@HHL$HdH3 %(u=HP[]A\DH@LH@ED1HHHxHI$1H[]A\A]+8&u[H5>H=kBI$HIt8HHHھpH9LucI$H1[]A\A]fK@ATUHSIHHHv I$H[1]A\f.D1)ǁL l> }b4 Sg el fH? y fHI& g H1 z# ( % &H 'H'4 H@=? B $? AH: AHD!B Hcfv >{ Tx/ *yH` zH$zB HKf.5 F: <;HTF <Hf;< H@QC `I aHaHbl H@q s ,tH7uH~ku H@ f  !H"H&" HE@.k n/Hh0H0F HfD} ~HnHȹUHϹfDE~KHKHhLHfDjskHѻ$kHxl>HfDn\.oH9fdpHXMpHofD34H!4H05H?fDH1HH6HwfDNDvOH^PH0EQHGfDhH*iH2iHÁRHc^H _XHiÁCHDHDHÁ>HX>Hڨ??HÁHH:HÁ$H$Hʾ%XHÁwH"wHұxHÁrHXrH2?sHAÁ9H9Hb:HÁ|Hk|H}XHÁcHdHJdHÁ)H#t\)H6tG.HH9HѠHiH1Á`H}MHtNHLt݁MHoDHtHtHE7D2Hӟx2He1H}DmH 8nH%mH Á3HڟÁoHÁhHÁOmHÁeYHJÁEHޣÁ=1HÁ@H&Áv H:ÁyH>Á8HÁRH~Á#HºÁcHFÁ&HÁC}HÁ{iHÁ~UHÁ(AH2Áj-HδÁtHÁqHÁ/HÁH֦ÁEH*Á!HÁ;HHHڶHbH:H HH"H*HBHRHBHHHªHHHHҷHÐ1HNHHVHΫHHHHf.1)ǁ6^ H H/tHݽt Hu^DQCJ<A?HIt =Ht>Ht1fD(O0,Hk<)HU*HRufDdpHjHfHrhHKf."%H7#Hٹ$HfHLHrIH\JH9fVw[H"{WHY YHqZfAHCHH ftHN:rH{sH3HQ1H8;2HHnHxHIEHH)FHQGH Ð HnHHItHqÐSHּQHDTHA4UHÐHH1 H|!HBÐ8H޽HQ9H:HÐ`HVbH~fDlH6inHfDuH^A_H.Hf/HFgfD H H&?fDNHPHFfD@HƽBHfDHyH:fD4HQ5HvfD&H)'HƹwfDH_fDHHHHɸHHYHIHQHAHHIHqHHyHHu fAVAUATIUS1LHv1)AAuqAAtRL HIu5>H[HLH;i]A\A]A^H1fDH)HC[]A\A]A^f.AL A1 A=GA5  A: A9d E A9PA:H }Al ~qAv9 Aq={AsD Ar  Ar As>H rfAb =AQ A`} `AR  A^3 A_H +HmgHL1Aw7f.A#AA | NAA Au1H ךbfI<HH1Od,H"XLeEHHL1)D[EHL]A\A]A^L'HA(mA% A$  A$ A%PH &AB]A?1 JA>  A>m A?H !AgAeK AcdAdKAdH ^A{aAxe AwAwAx0H VaA.a A)A)A.H @AE  AC ADADH @A}; ,A|~_A|A}CH t@Aj Ah/AiAiH Y$A3bA4 m A4T A5H AAA A[H ANAO APAQH ő@AnAo#Ap5ApH A&A'vA'H AtbAuIAuQH GA;fA<MA<H IA!>A"A"H ըAAtUAA<ABH AaAaAbmH AyoPAz7Az4H eAkAkAlH !,AfR3AfAgH HAK%AKALH GA/fGA0.A0PH A~AAH EHAm?An&AmH zAAAH AMuAN\AM~H ԌA2t:A2t%A1SH H xH alH %`A(H TGH p;A{H כ"H AoH zH .H rH VA8H H AjH H |H H ԧwAR-H +^H GRH FH :AhH F!H H  H BACH H -H H }AvvH H H H Ac9H 'jH K^H RH ÖFAtH -H >!H H  A;H H H H AAqH H ԔH XH lA~EH ˚vH jH ^H ߤRA&H F9H j-AH ɋH H H -H H H )H eH H 5A@^H H АH ܅wH ЈkH T_H SH <GH ;AyH "H H  H sA#H H &H RH ƋA=wH tH ɋH =H H MxH lAO"H SH lGH ;H t/H ѳ#H A!H #H 7H {H AEH >H H H ښAjSH AH xH ylH `A/H NGH ;H L/H @#A`H  H sH H sAeH ڜH H H H :H 6A3GH ŃxH lH =`H YT@fAUATAUSHH HhIdH%(HD$X1f1ALH߃AEHL$)D$ T$(HT$ D$,)D$0)D$@H\$HtcAA/fSHs2t5}vH[(DHt!S s{EyH[(DHuH\$H߉D$ D$ HL$XdH3 %(uHh[]A\A]ø]f.AWAVAUATIUSH HhIdH%(HD$X11҃fƒEM)D$ T$(D$,)D$0)D$@HL$HT$ LLT"L|$MLd$AAAW AwAALD$uAWIw;hu; L|$LD$ GD$ H\$XdH3%(usHh[]A\A]A^A_@DM(MHfD;D@D$ ;aD@;Q뭸}f.AWAVAUATIUSHIԾH8?H $LD$HL$LD$D$D$dH%(H$(1AƋD$P;Hl$L|$ H$'Ƅ$'IM|$u;MtZf|$ HD$H<$HoD$(A$*fDT$;LD$AH$(dH3%(D=H8[]A\A]A^A_Hl$L|$ HLAEM;D Hž1DetA AADAvfH<$HD$$A$UHD$AEH$A}HIrtA$xHL$AuT$;LEbAfASH?1;[1f.SH?1;[1f.AVAUATUSH0D/dH%(H$(1EdH\$ AAֹHH@tIcADHH T H$1HHAEDMbLd$iHD$D~D$)iAEuHD$D$LD)D$1MHHDtMc1LDLHHl ڃHĠEH$(dH34%(uLH0[]A\A]A^IcADHH Ġ뭻릻fH(H4ׂC1dH%(HD$1HIHHHH$HHH?H1HH)Hi@BH)1H|$1HD$dH3%(uH(@xjATUSHx[]A\;;(Iľ1XA,$t t̓ t&ht![D]A\fDøAWAVAUATUSHD/dH%(H$1EXLt$ HAHI1LHIc DLD$HH T DMbA}LiHD$D~D$)iEHD$D$LD11)D$^yD8H$dH34%(Hĸ[]A\A]A^A_;xrLH?y趽;(Iľ1ӾA,$t t t=ht8wDmfD]fDMC_Df.xjATUSH\x[]A\ ;(Iľ1(A,$t t̓ t&ht![D]A\fDøtSHn[fD@f.t)SH);2[f.f.@HHGHt+SHHHtHPPH߾[Cf.@f.H5tv"H85t H̿5uH5t1ÐHt+H?u%USHHHVHHHEtH]1H[]øøH?uQAVIAUIATIUHSL55HIFt$Hݾ5IL(L`HhHX1[]A\A]A^øHtHHt H@1DHHt|SHH HtH@ Ht_H{H [LL$LD$HT$t$fHt#H=LL$LD$HHT$t$룸H [øfDHHt|SHH HtH@ Ht_H{H [LL$LD$HT$t$Ht#H<LL$LD$HHT$t$룸H [øfDAWAVAUATUSHHD$PL$Ll$XHD$HHCAIHALP9AtSMHHHH@ HH{LD$MH$HH[D]A\A]A^A_fEH9MHH{HtPHHI9rXH{t$AF111AEPAPt$'H u(HHtu$H{P$HHI9ŸGH[]A\A]A^A_@D8HtH[;Hff1ff.ATUSH HHl$@Ld$HHtvHHt&H@(HtsH{Ld$HHl$@H []A\DLL$LD$HT$t$Ht)H:LL$LD$HHT$t$fDH []A\øf.ATUSH HHl$@Ld$HHtvHHt&H@(HtsH{Ld$HHl$@H []A\DLL$LD$HT$t$Ht)H:LL$LD$HHT$t$fDH []A\øf.HHtH@0Ht H฀øf.HHtH@8Ht H฀øf.HHt8HHt0HH@Ht-8tH9uHvH:tDø@HtHHt H`@1DHHtH@XHtHH1HøøfHHߡt HHtHBfD1Ht HHtf. @f.HFHFHGH(H~(HFHkHF ff.1@HH9HH~HF1@11HHH?PHHf.AWAVAUATUSHH9L|$PHl$Xw^HL $MHL$IAH?SL $H=Iw4Lt$XLl$PEHCH;HDL$HL[]A\A]A^A_H[]A\A]A^A_ff.AWAVMAUATIUSHHIMHH?SH9u(HCH;H[MML]LA\A]A^A_H[]A\A]A^A_fSH跏H[@f.HPMHtH11HD$IHD$Hf.Pf.HIHH@f.AWAVIAUATIUSHLIHHt$PL$Ld$XHt$[IL$H9Iw/L|$PHt$H[MMLH1]A\A]A^A_a@H[]A\A]A^A_ff.AWAVIAUATIUSHHMHHt$PLL$Ld$XH4$HH9u>LL$L|$PMH4$LHLL$XHM[]A\A]A^A_jH[]A\A]A^A_@AWAVAUATIUSHLl$PLt$Xu H9wWMHLL$t$H0HLL$DD$LLH߹IL|$XALd$PH[]A\A]A^A_tDH[]A\A]A^A_ff.AWAVIAUATIUSHMHLD$GILD$u I9wDM9wOAPAW111EAHZYu M9BH[]A\A]A^A_ffSHWiH[@f.HX]HtHHD$fHD$HÐkf.HXHtHHD$;RHD$HÐSH7RH[鎯@f.Gf.AWAVAUATMUSHIHH\$ HT$LL$dH%(H$x1H߉t$L$L$QHH-QLL$HT$uAWAVMt$,LHWGXZH{QH$xdH3 %(uHĈ[]A\A]A^A_?Df.HHHLM+N=t HAWAVMAUATIUSHIMHhHHdH%(H$X1PHHGPt1HPH$XdH3%(u9Hh[]A\A]A^A_fMLLLH|M=uVfDS H25H[驭f AWAVAUATIUSHH8H>dH%(H$(1VLHHQDHH9fo IH;)$)D$SH=HLt$ 1E11A AVAUH;S^_t*H$(dH3%(u[H8[]A\A]A^A_LCH9Ir(AVAU11E11A L ZYuL9vf뗻 f.AUAT0USIHHHILdH%(HD$1mu'H$HH9LHHFt*-;HL$dH3 %(H[]A\A]fDHH3E1jjE1jj1jHT$0L;H0H$HLHHuHE1E1t$31jj1j1L:H0uBA9DH8aD$&L afDHt$LA$t$t9LQDL$ L|$HLLH$ u HD$8*Ht3L`fDHD$|`D$T$fx=uŀxuIMHLLHD$HHL$HL$HBL;|$H$'0HHLXL$ L|$HLLlH$ Ht$I} DNHLLH$ HD$&H$ I}8Ht$DHLLH$ HD$`u H$ HD$L;|$DHHL1M}PH$ HT$LL==HD$<I}AHPH;$ HL$HLHqCHD$I}h0Hc>I>MHLH$ HD$LL@H$hnL]\L]JIL]3AWAV0AUATIUSHXHl$ H\$(Ht$(HHHdH%(HD$H1t)-=HL$HdH3 %(zHX[]A\A]A^A_ÐLl$ Ll$(HT$HLu|$uHLH#uM$HT$ Ht$(LBHD$ HD$(L9HD$(HLHD$L9l$(HLHI$D$uJIL$PE1E1LHLmu)LL.LD$J]D$D$L4]D$I$HT$ HD$(HL*L$0t 0L|$0LHLD$IWLD$HD$(HD$@HD$8I9HD$(LLTALl$ Ll$(HHL/HT$(HL$ H4 I9I$LHx}t4Ll$(=f.-=aHLŃLl$(Q}USHHbu1HJDH[]Df.AUATIUSHHHXLd$0dH%(HD$H1L/J4+Ll$(HT$ 0H\$(L@t,-=HL$HdH3 %(jHX[]A\A]H\$ H\$(HT$LHVuD$#LHLxtA?thH HFHHLrAHL$8dH3 %(DHH[]A\A]A^A_f.HH5H~LT$ E1E1LHARLT$=YA^LT$ts=HpG{IVH\$LHLl$HAQL)AH)HI<$Hc$H$dH3 %(Hĸ[]A\A]A^A_L}I1LOE1111ML!tULMxHLLHc؅x0LLTHHH؅_HcWfLLLyL4E1E111LLHc`!aLLLXxHLHGf1AWAVAUATUSHdH%(H$1H#HHHHT$ 7HA xH}Ld$PLl$01AHD$0MLHdAu7H|$ H9HT$0HH)H9H)LH|$ D|$0EMcHD$ HH)HaHPLt$ IHHT$ L@LAHLrD$6HALT$(1LLD.HL$(HT$0IHLMIcHHIHcl$LLHH4Ax%0HLMcLD<(H$dH3 %(DH[]A\A]A^A_@D$HELT$(LLLT$8.LT$DD$u)HL$0HT$(HLLT$DD$lLT$DD$HcA`LeLl$0LE1111MLkAHD$tsLELt$ Ld$HLLA0HLoMcMLcMEEMcLt$ LHLAyL&A}DHE1E111LLHD$A.LHLAxLLcLL$zf.AWAVAUATUSHdH%(H$1HHHHHT$ `HAILmLt$PHl$01AHD$0MHILaLcEu7H|$ H9&HT$0HH)H9H)LH|$ 2Lc|$0EHD$ HH)HHPLd$ HHT$ @IGLHH$AMHLeMcL<$HHLMLHH$A HLiD$A}Ht$(H+uHL$0HT$(HLSHHLHHD$VHLD$ILLHHHHD$}AuHL$LHLDAHt$L$EcHL[CIcL<$HcL$LcIcHHLIHcT$LHT$LHHH,HALc0HLL#ALcIDLmHl$0E1H11HLAHEx]Ld$ 1HLAxDLcHLMLAx)0HLxEMcMLcMEfDH$dH3 %(D&H[]A\A]A^A_@ALd$ HHLAyH@A11HLLcA HHLUAxLc11HLMyAHHL AwLcE11M1E1HLAHHLA8LcE11M1E1HLAVHHLALcE11M11ILmAHHLdALc11M1E1IL/AHHL&A}LcE11M1E1HLAHHLA>LcHMfAE軅f.AWAVIAUATUSHH8 H$Ht$HD$8dH%(H$( 1H&HD$@HAxKH}Ll$pLd$P1AHD$PMLHN[Au7H|$@H9iHT$PHH)H9UH)LH|$@eDt$PEMcHD$@HH)H HPLl$@HHT$@@IALHHD$7AHLD$HALT$H1LLD'%tsHHcH5oHD$@H)H=oH&MPLD$7AXZH$( dH3 %(DUH8 []A\A]A^A_HL$HHT$PIHLHAHELd$PLIHD$E1111LMKAHD$tkLEVLl$@HT$HLA60HLrMcLL$HLȅALc.fLl$@LHLAy^LfD$(HELT$HLLLT$ 8a$LT$ DD$(Hc?H|$HE1E111LHD$:ALHL1A`LLcLL$f McHcl$LL$HHLLHHA0HLR:McLDHL$PHT$HHLLT$(DD$ 9LT$(DD$ f.A老AWAVAUATUSHHXH$Ht$HT$dH%(H$H1H/HD$HHD$P]HLLmH$Ld$`1AHD$`ILHD$ILWLcEu9H|$PH9HT$`HH)H9uHt$H)H|$P+Lc|$`EHD$PHH)HAHPLt$PHHT$P@IGLHHD$ AHLMcL|$ HHLMLHHD$ AwHL_D$0A}Ht$XL!uHL$`HT$XHLIYHHLHHD$(LAdHLD$4IHt$LHHHHD$8sLcEuHL$8HT$HL4LcHt$8H|$EHLIHcL$0IcHT$ McHHLHHT$(HcL$4LHLL,LwA40HLLMcHML@LmLd$`L 11LLAHD$ L ELt$P1HLyALcLd$HLLA0HLmMcHMLAx[H HH5iH= jHIcHD$PH)H/PLL$ LD$1AXZH$HdH3 %(DQHX[]A\A]A^A_@ALt$PLHL-AyLn@AH11LLHD$:ALHLAx11LLLcLD$AlLHLAyLcE1LD$1E11LLrA+LHLiA8LcE1LD$1E11LL1ALHL(ALcE1LD$111ML ALHLALc1LD$1E11ML AjLHLAwLcE1LD$1E11LLp A)LHLgA6LLcLD$H5YgH=rgDAAE{HtHH151DfD{f.AWAVAUATMUSHHH(dH%(HD$1HD$HD$u{AI9L)H IHHHfAHE1v{HLHH{}Ht$dH34%(DH([]A\A]A^A_AHI$HT$Ht$DALHL$PAHH 1HH9HHH)H LIMfAULHzJ<80EfHT$HOG0GADWGBGHt$H|HL$HAHf1AHADasAAEuzITIL9HLfDADHUH HHHQDHLHLHITH)H)DIL9HLUAQuDLfLcDUQDLLHUxDHt3USH,HHfD#HCH9uH1[]fD1DAUATAUSHoHHLgHI9H{1H1H=EHkX1H^1H Hkp1H6~q1H tcH{(1~TH1~BH1~0H1~H1[]A\A]fH{(1H[]A\A]ÐAWAVIAUATUSHfLHI8dH%(HD$x1HT$HL$Ll$0)D$0D$,)D$@)D$P)D$`_H7DHD$,Ll$0HD$I9IHMF. HT$Ht$HHt$HLHMIGHAoLHfD$0HAt?HAoFfD$@AFt(HAoF fD$PAF tAoF0fD$`AF0LHI9I)t0@00HrL9t1@0pHrI9t2@0pHrI9t3@0pHrI9t4@0pHrI9t5@0pHrI9t6@0pHrI9t7@0pHrI9v~t8@0pHr I9vlt9@0p Hr I9vZt:@0p Hr I9vHt;@0p Hr I9v6t<@0p Hr I9v$t=H@0p I9vT00Pf.MD$/L)1@LD$,HL$xdH3 %(D$u"HĈ[]A\A]A^A_fDL1}tAWAVMAUATIUSHIHMHHt HBunHtH}XH-uYMtH}pLuDMtH}@Lu/MtH}(Lu1MtH} HE @H[]A\A]A^A_fHAVMAUATMUHSHt3LoL t[-@]A\A]A^fL HCHtH{XLH uMtHT$0H{pLf uH|$8tHT$@Ht$8H{@G uH|$HtHT$PHt$HH{(( i[1]A\A]A^DAWAVLwAUAT1USHHkXLLcpHHLk@L{(HD$D$#11LD$1LD$ LD$D$!1HD$"1HHD$(D$H1HHD$0D$H1HHD$8jT$DT$ D$$DD$L$E@@ uc |$#EL$"L$!MHLLLQAtJHH-@[]A\A]A^A_fD|$!,E1Ҁ|$"EAT$L$…u*D$$t"HHHD[]A\A]A^A_fLL$8LD$0LHL$(LHDT$[DT$tFE u E1Ҁ|$"uHH[]A\A]A^A_DQLHLDT$DT$LDT$DT$HCELLLHDT$SDT$Eo|$"AYf.AWAVIAUATLoUS1HLHH8MHD$pH$LD$Ld$xHD$H$HD$ H$HD$H$HD$(MMHMtKH$LL HtHT$H{XHb ukMtHT$H{pLH uQMtHT$ H{@L. u71H|$t-HT$(Ht$H8H{([]A\A]A^A_ H8[]A\A]A^A_@H{X15H{p1" H{@1H{(1MfDAWAVIAULoATUS1HLHHIMLL$MMHuMt9LL/upHtHsXHu[MtHspLuFMtHs@Lu11H|$t'H|$HHs([]A\A]A^A_fDH[]A\A]A^A_@H{X1=H{p1*H{@1H{(1M(@f.AUATIUSHH1HHIoH{X1\H{p1IH{@16tzH{(1'tkHt&HHtH-@[]A\A]MtHLuMtHL|uH1[]A\A]H[]A\A]HIHL1HH)PHAHALÐf.HLHGÐf.ATUHoSLgHHI9H{wv1H ~h1HtZH(1H~HH0Hv:1Ht,HHvHH1҅y []A\fD[]A\@AWAVAUATUSHH:RLcHkH2I99H{+1HA1HLcX1L1LLkp1L1LLs(1LL1LH1HH$~oH1HHT$y~UHH@E1jHLMLHPZYu.LL$L$LHLLNuH[]A\A]A^A_ÐH[]A\A]A^A_ff.AWAVAUATUSHdH%(H$1Ht$HT$1AE$Ll$PL|$pHE1LALEH$HHD$ H}(IcH|$(~LeXPHL$HGƒHD$8H]pHD$HLD$HL$DHt$LtFLD$HL$DHt$HH\$0sHLL9 L H;D$8vD$PLLFHH.HLLXHt$(LLpYL; HLLEYuiH|$ 1LL8uSHE@HT$ Ht$(HHD$@0gu4H|$@2H;D$HLL7OLD$,L$H|$ HD$HMpLeXLuLLHL$0HM@HL$@HHL$HD$LT$L\$ H0HH|$@H|$0LH|$(LyHmHaL\$ LTLT$LGH|$=D$-AH$dH3 %(Hĸ[]A\A]A^A_HLHHLuHLL6LLLHT$@HHEHMMLL\$LT$HL$HPLT$L\$.HL\$8LT$DLD$HL@H|$ 6D$LT$L\$8BdfAWAVAUATUSHHH('HLkLcLI9fH{X1L F1L4LkX1L 1L Lsp1L 1L|L{(1L H1HHD$ H1HHT$j HH1H|$L ~xHH@E1jHLMLLJZYuQLL$LD$HHL$LLHu0H}Lu H}(LuH([]A\A]A^A_ÐH([]A\A]A^A_ff.AWAVIAUATLgUSHIH8HoLdH%(HD$(1IH9H{1LX1LLk(1L0~|Hl$HHSLHAt9HAHL$(dH3 %(H8[]A\A]A^A_LHx!H9|ffHCLLLHHHD$?BAkHT$LHHD$D$R-BH}af.AWAVIAUATIUSHHHt$ HT$8dH%(H$1LD$@H$L$H*H$HH$H$HHD$LM H$PL$L$HHD$0H$pHHD$(LH$0HHD$LH$HHD$|HULHAH<$yH|$oLgH|$0]H|$(SHKLCH|$9H|$/L'EH$dH3 %(DH[]A\A]A^A_fL$L$LH$0HHD$LH$HHD$HULHAuxHEHHHD$H|H<$AeH|$[LSHKLCH|$9H|$/L'ACH<$H|$LHLAHH|$ HD$XHHD$`&H$HHL$(H@HHHHHD$0 AuH|$(lH$PHD$0H$pHD$(DH<$?H|$5L-H|$ H$PHD$0H$pHD$(fHEHHHD$HlH<$AH|$LWfDADHH0Lt$hL$Ll$HLt$8Ld$ L|$pH\$xID$P H$HHELLLHpR HEH|$(LLHpRHT$(LHH\$0{ LHH:LHH\t l$P`Lt$hL|$pAH\$xL$&@HEXLHHLHHD$P<APHEpH|$LHHHHD$8<AHT$LHAHHLy AHT$PLH9AHT$8HLC AHt$LHAeH|$ H0HH AHT$HHHD9AHL$HH|$HU(LH;AH<$8H|$.L&ALt$hL|$pH\$xL$H|$0HT$HH8AnH0HHHHL$P: AHL$PDHT$HHHz8AH|$(E(HT$0HH A HT$HHH98AHEXH<$HHD$PtAHEpH|$HHD$hNAHL$8HT$ L\OAH$PEHD$0H4$LHD AH$pEHD$(9H|$0HT$XHAHL$8HT$ LNAHt$H|$(LAH|$(HT$`H=AHL$PHT$0LHLf9AHD$hHT$(LH|$HHHD$859AhDH$HT$(Lt$hL|$pH\$xL$H$A3H$HT$HHd6AH$HL$HHU(LH8AXH|$LH<$A8H|$.L&H$PHD$0H$pHD$(HL$HH|$HU(LH*8AH|$LRt?H<$AH|$LUHUHt$@HANHUHt$@HH<$ArH|$hL`f.AWAVIAUATIUSHhH$H$L$,LD$LL$H$HD$0dH%(HD$X1MALGHIHM}_H$H%HD$ HDL9wlH9rg1LHjWHuEHH<$Ht$AօtO-DH\$XdH3%(Hh[]A\A]A^A_HGfHD$HT$LHt$LLLD$8uLH+$LD$8H|H+|$ IH$AHD$@HHD$DZH|$1LȴtH|$$跱$%IGLdLD$HT$HH)LHHD$?uL|$HL$LH|$HMLD$RD$D$,t>H$IHLLi@H$Ht$0IxJXDHHLcTAWAVAUATUSH(L|$`DIHGDMP I97L)LL$LD$IIH|$LpAHMIoAGIdfHLAԀ}tۅHL9uH|$AH|$H(L[L]A\A]A^A_@MIOAGtHLTHLH|$tHT$Ht$HyVH|$H(M[LLL]A\A]A^A_fH-DH([]A\A]A^A_I2HT$Ht$I~yV*@AWAVMAUATIUSHIMHhdH%(HD$X1HL$ H$HLHHHD$ IEHD$-HT$H L$%HD$0JD0H9I91H3SD$HsLHt$(HD$HՅtY-Df.Ht$XdH34%(zHh[]A\A]A^A_HSL$"ZYfDLD$(LD$1H|$ 1LLD$8訳uHT$HL$LD$8L)H|H+|$0IMALt$@L苭Ht$ 1L茰tLD$ |D$ 8HD$HL$MHT$(HL| H)HLHD$uHL$Ht$MH|$(LLD$D$D$ tDIHLHL0IxLLT,@fDHHLrrXPAWAVIAUATIUSHH$Ht$LD$LL$ L$HD$(H$HD$0dH%(H$1MfID$H=ALiHH}HD$DL9D$<]H$tqHt$LLILLl$pAEtiHQ@LDH$dH3 %(D3H[]A\A]A^A_LHL"ALl$pEuLt$PL81HL;ADL$M|$H}MLH|$NT L)LHHD$LL$@LLT$HAu.LL$@LT$HMHT$Ht$LLALL$@tLLLl$p诪f.HYADLxLLL$cHT$ Ht$LHALL$HL$$LMt!1At@24H I9uLɋD$AWAVAUATIUSEHHdH%(H$1HHT$L$L$0H$8t7AH$dH3%(DN H[]A\A]A^A_DHHGEHD$}L誙HIHƾHT$H6Ht$(H9HHt$ H9Z1H>H$HT$ H|$HD$0HAՅCD.ELHD$xHDŽ$M9 M)I HMIfuLH?>HLLLHy@DD$ELsL?HIhL?HIHT$MHLHMAL:L:<DD0H7HODafDHBH)HD$ HCHHD$@WHT$ HL$H+L$(HD$PHH)HH|HL$XHGHD$H-OHHXH$HHD$8#H|$81L$AaH|$8Yf.DDD$CHIDD$BHT$xH$D%L=HL$xPIHH HI9LH)H LGHMfELHLD$HL$xHAHϹfGHGDgsAEt AAWtDALfLDIJD=I9HLHD@ADHHHBAf.IH LHWDHILHLHH)H)DHzf.Ht$0HOH HHGHT$ HDHDHH)H)HHH@HD$0GHD$0HL$ Ht$HDfDvfDH|$8.AHD$HHD$ H|$8HHD$H蒚A^H|$8DLwACHT$ Ht$0H|$8XA$Ld$HLt$8LL蘚AHD$PHt$XMHL$(LHHH|H)AH|$@L$HH|$0@)HL$( EHD$HBH|$8蘔|$HT$IHLHAfDLLHAMHSH^HHރHFHHBHzH9fHA>@2}HA4EA2FA H)EA2FA H'AF2EA HAF2EA HAF2EA HAF2EA HAF2EA H AF2EA H AF 2E A H AF 2E A H AF 2E A H AF 2E A H AF 2E A HEA2FA @IfI)M6LD5L11Hf.Ao3HfA0HH9fwfoLHfsfHfofsffofsffofsf)L$`|$`D I9tA 2LH H9w@tCAAWDALLEHL$0GHt$ D1HL$HD1LH9A11lLA2E11{ q4 b X ND :fAWAVEAUATEUSHHH$dH<%(H$1HD$H$eHkH}HbL$HHLRLeB$EtD躏H9HٴD$虏HIH赴H{D$/D$HD$HLP$ALD$MMLփLT$ MELELL$L9H\$0H谏1LH賒LL$LT$ H߉D$蕏D$H$dH3%(HĨ[]A\A]A^A_Hu/HkHMHwL$HHMp됐Dt$/ILLT$LL$LLHLI,1H費ILT$B LL$D) $HEAI9rIAI9ttMaIM)僼$tHc$L9HHt$HHZHt$DHBLLH,sLd$PHLt[LLH4E;@=y1fHLt$jADPt$(H(Ðf.AWAVAUATUSH8H_uDHEYHt$H|$H޿EDʼnL$HT$A3HIH޿3HIHT$pIHDӵAYD$Ht$xH|$LAE/H&LHsHكHAHHBH9HAuA27HA\AEA2GA HbAEA2GA H_AEA2GA HSAEA2GA HGAEA2GA HEAEA2GA H9AEA2GA H-AEA2GA H !AE A2G A H AE A2G A H  AE A2G A H AE A2G A H AE A2G A HAGA2EA IfI)MT I<L11Hfo HfA HH9fwfoLHfsfHfofsffofsffofsf)D$ t$ D I9t@ALA2 H H9w@DEHL4L+LH!L+H8D[]A\A]A^A_LHLm+HL$xHT$MHt$H|$lAMf.A돸1151E1}si_ U K A 7 -#AWAVIAUATAUSDHH8HtLtH8[]A\A]A^A_ÐLt$xjADP$H fLgHT$DL$Le/HIǺtLT$G/HHD$IT$DL$HT$pLDkTELT$Ht$xLH3…,M#LIt$HكHAHHBH9HH|$A7@27HASAGH2GA HHAG2GA HFAG2GA H;AG2GA H0AG2GA H4AG2GA H)AG2GA HAG2GA H AG 2G A H AG 2G A H AG 2G A H AG 2G A H AG 2G A HGA2GA fMfI)H<M L11Ho HfA HH9fwfoLHfsfHfofsffofsffofsf)D$ t$ D I9t@H|$A 2 H I9w@ELLT$ήLF'H\$LH趮H.'T$DLLT$葮L 'T$HL$xLMLH RH11C1E1Ht$|rh ^ T J @ 6,ff.AWAVIAUATIUSH_HIo(Mg@HXFMoXHFHGHIWpIIMHT$IHL$IHt$8HT$IHL$ IHT$(I0HL$0HT$@LljD$HKH|$@AH|$87L/H|$%LHH H|$0H|$(H|$ H|$H|$۲D$HHX[]A\A]A^A_Iv(HLD$HߴLD$HKIv@LƴLD$H2IvXL譴LD$HIvpIp蓴LD$HIIsLD$HIISLD$HII3LD$HIILD$HIILD$H_IIӳLD$H?IL跳LD$H#I0I0藳LD$HAHALAHALbfHSHHH0 HH{@H{pH{XH{(۰H{ҰHưH躰H记H袰H[镰D@f.AVAUAATUSHpLd$H\$0dH%(H$h1L)1*HHHmLuBHkLHCHSHD$8H7LLدH̯H0H贯H{@諯H{p袯H{X虯H{(萯H{臯H{HoHcHWHKH$hdH3%(%Hp[]A\A]A^f-@3fDH{XL,t -@ HLH{pLt -@HL\H{@L趰t -@HL!wH{(L{t -@ZH肰HEuH[tH-"H5X1(H-IH=Y H跷uHH$HoH511I)$H$L$AHAURZYQjH5ϩ1ҹMHL$AVLD$ZYHT$HLT$L$HLO*AUH5^AVE11AHAZA[AUAVE1A111H1KAX@AYH脶H5F1L$'HYHH5Ϩo611HM)$H$H$AU ^_:H51&jH5s1HIL$AVLD$B^_HT$LL"H=L$H519&LL(tH=sW$UH5קAVE1A1ҹHMAXAY\H51%UAVE1111AHAZA[!H=6 @ f.AWAVAUATUSHdH%(H$1H HDŽ$HD$`H%)+/5HD$hH;=CGIOSYHD$pHaegkmqHD$xHH$HH$f$3MM'HyIIxI1HHHqHH^LIHL6HD$@Ld$ HH$xLpLHLtFH<$D$qLiD$H$dH3 %( HĨ[]A\A]A^A_@LLXuL蜵fAuD뜐L%oHCHD$HHHD`fL$HD$HL$HD$H,$4HDHHL6LtHD$L$HD$f5vLH<$MHLHX@H<$HWH<$HHH<$HHsfA9H<$VtrH$HH8H4$HLG!LQHL=LH1LH<$1AWAVAUATUSHHdH%(HD$81H1HIH1IIHnLY1LGHLl$ H菦L臦H޺Ht9H艦L聦HL$8dH3 %(HH[]A\A]A^A_@LLxuLHL uLHHu1LHHoHLLZ]fAWAVIAUATIUSIMHXH\$Hl$0H$dH%(HD$H1HLL$kHcMMLHtU=t=-BH߉$;H3HL$HdH3 %($3HX[]A\A]A^A_DH$LHuHHHu1HYMtkMuv@LHCH$LH,HHHK1HukDH|$thMtMtHt$LHHHVLHH1H~t 1@AWAVIAUATMUSIIHhH$H\$ Hl$@L$HL$HHD$dH%(HD$X1nHfMAMAEt EMAEt E%E DD$H|$H<$ML|$L蓽~H<$聽yfH߉$Hآ$HL$XdH3 %(Hh[]A\A]A^A_fMLLH H߉$膢H~$=t-BDHL$L2LDD$DT$9 QDT$DD$HL$L2LD\$DD$ DD$D\$E DD$?f.LSLH@H<$tH|$DH<$tH|$u?1f.LL}H<$Li|$tLŻML谻8H$Ht$H~HH/fLHNHHH81H?H$Ht$H HHLHHHH01HκV1Tf.AWAVIAUATIUSHMMH8H\$HT$dH%(HD$(1HџHtdLH t8H߉D$̟HL$(dH3 %(D$u~H8[]A\A]A^A_fHt$HH`u@Mt+LHuHt$HL/u1MuLLLbDHHGTHH1HH)\HHt \願@f.ooFGoF G oF0G0oF@G@HFPHGPFXGXfDfoX1GܺGvT2Gf.fo(GܺGvT2GDf.AWAVIAUATUSH^ ~(DNDdH%(H$1ˋNV \$~0FDfEDVDNAD~$Dn,n4|$A΋~8vnt$D1ED1E1A1E6nEAAEAA1E1ADEA1EnT$A1ދT$ EE3T$AEDl$A1A1DAA1݉T$ EnT$3$E1AEEAEAA1A1ADAE1nT$E1AADAl$3l$D13l$ʼnDD1nT$ D1D݋$AD1A1D13\$ A1D3D$ ÉDAD1EnT$D1ADAADD|$D3|$E1D3|$ADEE1EnT$$A1EAAEEEA1G=nA1EEAEDl$D3l$1D1A1D3l$ADAT$3L$A13L$$EnE1T$A3D$EEAED1A3T$ D1B-nD1ADD1DD1+nD1AӉ3D$DD1E1A11D3T$A1$AnAAA1DA؋\$ DT$GnA1E1EEAA1G0nA1Dt$AEAA1AEEAEA1AEEED\$$E1D3 $AA1EEEB!nE1AADd$ EDDL$ E!DDt$D13t$D13t$D13|$lj|$:ܼDAD !D AD ։D!D!Dd$ B ܼDd$։E1E1D3t$ AC0ܼAA!‰ D!D ADA 1A!13T$Aщ!DL$G ܼD DD$AщE1D3$$AD3d$ AF!ܼDDd$ʉ DAʉ!A!A A҉D13T$DD1D!ADA Bܼ! DDED13L$3L$E!ܼL$$L$D\$4DAD E!D DD$։D13T$ 3T$ӉD AD!E!E1A D1ܼD1ىAAAAlj\$(G9ܼDDAA1A DDEAD3,$A!E!E AAD$ AD!E1D13D$$DD$ADAD Gܼ! DDAAD3l$(DDD!AB/ܼDl$,Dl$<$DAD1D A1D!A1 DEE DDD!ȉl$D! A/ܼAADEDd$ADAD13|$D1AE:ܼ DA!E!A DDl$ A A!D13t$4!3t$,A t$A9ܼ|$DL$ ADAD13L$$3L$EA ܼD‰ $DEA!!AD DDl$D13T$(D1ADD Dd$D!D!D1 B%ܼAAADAA1D3d$D AB ܼȉD!D! DD1D134$!A DL$D! C ܼEDt$l$,E1D13l$AAA!E(ܼl$ l$4DAA A1A!A!E EDl$A E1!E1A ABܼDDT$ AADDt$$1D1AD1D13|$Ǎ:bʉ|$D։l$(13T$D13T$ ‰׉D19bʉ|$D1AʉDE13 $E1DE1A1D1A1AbʉL$ljNjD$13D$DD$$AbAAAEDD$,D1ÉD13L$A1A1E1AbDL$ \$(\$TADE1D3L$$ADAD13D$A3D$A1E1AAE1B bDL$\DAD1ӍbDAD$XA͋L$ADA1D3D$ D3D$(DAD1DD$`D3<$A3L$Bbʋ|$t$E1AAӉD1E11΋ $E1ADA>bD11D1E3L$AEDA2bA1E1AAAAD1EAA bE1EA1|$dt$hADA1D3d$ A֋T$3T$3T$$EՉL$lE1A1DbDT$pEA݋\$(D1A1E1EEEbE1AA\$tEEDd$D3d$ EEA1E1A1E1ABbD\$xADAl$ 3l$AA1DA1D1AD1GbDL$|DEADEDT$ D3T$AE1D1EE1EbE1A$EAAEDD$D3D$D1EA1E1ADEGb1ADl$$D$DEA|$D1D111A1DA11AD1AD$D$DD$CbD3D$(D\$PDDABbD$L\$HD11ˉD1AbD1AD1D$$1$H|$Pʉ$L$<Љ$D$8t$@DT$DDt$0AK ACAsESXEsH$dH3%(uHĸ1[]A\A]A^A_ff.AWAVAUATIUSHӺ@HHAA?D)A׉sGEtI9vQIA?H?wH@H@L9t{HLPAtHD[]A\A]A^A_IuIsdtEALAuLL)E1if.E1HtK|5HHXzHEIIJD=KD>IFHI)DM)r1ɉσM 89L 8rqEABD=CD>\BD=fCD>KfKf.Ht{AVAUATUISHӺ@HAA?D)A։sGEtL9sJH?wH@H@H?~HLt[]A\A]A^fD1DIt$I$tEAEt BD5fCD5LxuL)LE1H?wDHu 1[]A\A]A^ÃKL,s|tUt҉DfD1DHEIIEJD5KD5IEHI)DM)f1ɉσM 89L 8rKHEHHTHTHQHH)э H)̓=1ɉ΃H|59H<2r1!EAEBD5CD5U‹DD1@f.Hu fAVAUATUISHӺ@HAA?D)A։rEEtL9sKH?wH@H@H?HLt[]A\A]A^fDGf.It$I2t"EAEtBD5fCD5fLhuL)LE1H?sHxKL,WUIDfD8HEIIEJD5KD5IEHI)DM)^1ɉσM 89L 8rCHEHHTHTHQHH)э H)̓1ɉ΃H|59H<2rEAEBD5CD5U‹DDkf.ATULgSHH?HDL8'81)ʃeHHDHHHH)ƒr1ǃ9H49r@CLH߉sZS[ ȉcVCWKTCXЈKUCYoS US USuSUSUSUS uS USUSU Su SU SU SU SuSUSUSUSuSU[]A\ú@)t1ɉ΃90rLHufCID$0AD$AD$ u#1fLDDATULgSHH?HDL8'81)ʃeHHDHHHH)ƒr1ǃ9H49r@CLH߉sZS[ ȉcVCWKTCXЈKUCYC EC ECeCECECEC eC ECECE Ce CE CE CE CeCECECECeCE[]A\ú@)t1ɉ΃90rLHufCID$0AD$AD$ u#1fLDDAUATIUS HHxdH%(HD$h1HfoHHHD$D$NHMD$81)Ѓt$D$HuHt$ZT$[ ȉd$VD$WL$TD$XЈL$UD$YAD$ˆcC‹D$ SˆcCS‹D$Sˆc C S‹D$S ˆcCS ‹D$S ˆcCSS\HzH\$hdH3%(DHx[]A\A]ÐHHLAu$?PD8HL@)t1҉փ91rLmHLvAkfD$HELE,EIFHI)DM)r1ɉσM 89L 8rqEABD=CD>\BD=fCD>Kf;f.Ht{AVAUATUISHӺ@HAA?D)A։sGEtL9sJH?wH@H@H?~HLt[]A\A]A^fD1DIt$(I$tEAEt BD5fCD5LhuL)LE1H?wDHu 1[]A\A]A^ÃKL,(s|tUt҉DfD1DHEIIEJD5KD5IEHI)DM)f1ɉσM 89L 8rKHEHHTHTHQHH)э H)̓=1ɉ΃H|59H<2r1!EAEBD5CD5U‹DD1@f.Hu fAVAUATUISHӺ@HAA?D)A։rEEtL9sKH?wH@H@H?HLt[]A\A]A^fDGf.It$(I2t"EAEtBD5fCD5fLXuL)LE1H?sHxKL,(WUIDfD8HEIIEJD5KD5IEHI)DM)^1ɉσM 89L 8rCHEHHTHTHQHH)э H)̓1ɉ΃H|59H<2rEAEBD5CD5U‹DDkf.ATULg(SHH?HD(L881)ʃHHDHHHH)ƒr1ǃ9H49r@CLH߉sfSg ȉcbCcK`CdЈKaCe_S US USuSUSUSUS uS USUSU Su SU SU SU SuSUSUSUSuSUSUSUSuSUS#US"US uS UShuS'US&US$uS$U[]A\@)t1ɉ΃90rLHUufC(ID$0AD$AD$ u#sg1fL[DEf.ATULg(SHH?HD(L881)ʃHHDHHHH)ƒr1ǃ9H49r@CLH߉sfSg ȉcbCcK`CdЈKaCeC EC ECeCECECEC eC ECECE Ce CE CE CE CeCECECECeCECECECeCEC#EC"EC eC EChuC'EC&EC$eC$E[]A\@)t1ɉ΃90rLHufC(ID$0AD$AD$ u#sg1fL[DEf.AVAUATUHSI HHLl$dH%(H$1LHfoSHۉT$xD$foOD$(IM)D$881)Ѓ tDT$D$Iu(Lt$vT$w ȉd$rD$sL$pD$tЈL$qD$uT$шuUMыT$MшuUMыT$ Mшu U MыT$$M шuUM ыT$(M шuUMыT$,MшuUMыT$0MMMuUT$x!T$4шuUMMlLD$ WXH$dH34%(D$ rHĐ[]A\A]A^@foHۉT$xD$foD$(H?\$IA?f.H@I@L9tcLLtWHHDHQHH)ȃ1ɉσ9H4:rfDHtI}(HLD$?HD8HIL (8f@)t1҉փ91rI](LHefD$8IEXAE8AEHED01ft"DATUISHӉʹ HĀdH%(HD$x1HHH:foD$foD$HT$hHHLuQ$?PD(8HL(vu@)t1҉փ91rLe(HL` lHUHD$xdH3%(BH[]A\fDHM)D$(81)Ѓtf$D$Hu(Ht$fT$g ȉd$bD$cL$`D$dЈL$aD$e4D$ˆcC‹D$ SˆcCS‹D$Sˆc C S‹D$S ˆcCS ‹D$S ˆcCS‹D$SˆcCS‹D$ SSScCD$hsD$$ˆcCSST@foD$foD$HHDHQHH)ȃu1ɉσ9H4:r^fDfD$(HEXE8EH:f.D1ft AWAVAUATUSH|$dH%(H$17HH\$IŹ 1E1HHDຫ|$DR)1AD$IHD$D$fo1fo 9D$xD$L$(H.HcHHH$HH+T$H1LHHHHct$IIT$1ɾlH߉L$&RLL$H$dH3%(Hĸ[]A\A]A^A_D$foIfoQD$xT$\$(}HaaaaaaaaLHD$ D$?=D$wD$MA!L?LHuI@I@L9uHl$ uDMH5)¿1HHH)HtH~H.@D$H= L$,L$|۹H=L$L$pf.H=D$L$ L$L$@HT ()ȃsMtAM Hs(Hf4Mt-H)IIMLH IL-HL*HJHH)H)׃r1҉փL79L1r@HC(s7@uqPA@S(?AT.fT(-fDHILLHLHdAEAD-D*AS(AT.T(AD-fD* f.HHLJHH1HH)HÐHt N@f.ooFGoF G oF0G0oF@G@oFPGPoF`G`oFpGpoooooHHÅHHGt}H؞]ˉHGH|6*)bHGHp0ZYHG H9Y/HG(H1 g&3gHG0HXhJHG8Hd . HG@HOHGHGH1@Hɼg jHGH;ʄgHGH+rn+hHG8HkAكHG@Hy!~[HGH1HHGt}H؞]ˉHGH|6*)bHGHp0ZYHG H9Y/HG(H1 g&3gHG0HXhJHG8Hd . HG@HOHGHGHfDHɼg jHGH;ʄgHGH+rn+hHG8HkAكHG@Hy!~[HGHfAWAVAUATUSHH8oGH$H$PdH%(H$(1)$H\$xH$oG )BoG0)B oG@)B0foofDofDoDoFfDfqfDofEfAqo~ fAgfDoof0fEgfDofDo^@fqfDfqonPfgfofEgfDoffqfDov`fqfgoVpfofAgfDoffqfEfAqfDfqfgfofAgfDofEfAqfEgfDoffqfDfqfEgfDofgfofDgfDfqffofqfgfoffqfAgffDofqfgfEfAqfofgfofAfAfAqfEgfDofDgfofDfqffqfgfDgfoffqfgfAofqfDofoffDgffqfDoffAofgfofAofqfDgfhff`fofDofAofafDof`fDh)$fDofofAofEofafDifDi)$fofhD)$f`fDofifDafDafDo)t$foD)$f`fhfifDofifDafi)$fofifafDafi)$fDa)T$ fAofDhf`D)$fofAofDofifDa)$fofifa)T$0fofhf`)$fofofofifa)$fofifa)T$@fAofDhf`)$fofAofDofifDa)$ fofifa)T$PfAofDhf`)$0fAofofDofofifDafi)L$`ffafo$fj)$@fs0fofAofDo|$`fjfDjfs8ffAfDo|$fDjfAofDo|$ fs(ffDjfAofDo|$0fs ffDjfAofDo|$@fsffDjfAofDo|$PfsffDjfAofEofDjfsffAofDbfDjfAs0fbfAs0fAs8fEfs8fAfEofDjfDbfEfAfEofDjfDbfDo$fAs(fEfAs(fAfEofDjfDbfDofjfAs fEfAs fAfEofDjfs0fDbfDbfAsfEfDo$ fAsfAfDofjfDbfsfDfAsfAfEofDjfDbfAofDo$fsfDfAsfAofDofAfDbfs0fj)$`fAofs8ffs8ffofjfbD)$pfffofjfbfDo$fs(ffs(ffAofAofbfEofjfDjfs ffAofs ffbfAofAofjfsffAofsfDo$@fbfsffsffAofDjffbfAofsffsfo$f)$fo)$fbfo$fs0fDofo$fDbfo$fAofDo$fs8ffAofDo$fbfDo$0ffo)$fbfs(ffofbfs ffAofbfsffAofbfsffAofbfsffofot$fj)$fbfofofjfs0fs(fo$fs8ffAofbfjffofjfs(ffofjfs ffAofjfsffAofjfsffAofjfsffo$fb)$fofs0fs8ffo|$`fbffo|$ fbffofs ffoT$0fbfsffoT$@fbfsffoT$Pfbfsf)$ffoHfofofsfs=ffofsfsoxfs-ffoffsfoffsoHfԈpffofs8ffofsfs?ffff)@H9`Lt$xH$H,H$L$H$H$LL$L$MVH$IIHHDHHHHH1HHH1I:I?HHL1H!H1HLILH!M,1LHHH1LHH1LH H!H LHIBIGHLIHHL1L!L1HLHH1LHM!H1HHHHHHH1HHH1HL H!L IHIzIHHHLMI1I!I1LIII1HHI1HIHHHLH1HHH1HI!H L!L IHLLMBMGH1I!H!L1LL HHHHH1HHH1I IHHII1HIHI1HH H!L LMHIJ IO IHH1L!IH1LMIM1MIM1IIHI!N .HHHH1HHH1HH H!L MB(MG(HLHLILIM1M!I1LMII1LHI1IHJ HHHI!H1HHH1HH H!L IHIB0IG0LIII!HLL1H!L1HHHL1IIL1HHLHHHH1HHH1HH H!L Mj8HMo8I@HLI@HHHMMI1M!M1MMII1LHI1HHMIH1HI!HLH1HH H!L HM9M\yL$HL~ $IH<$H $H$~$H4$$o{H$~$L$$H $)$f)$)$Ko{ ~$L $f$o{0L,$~$$L4$f$$o{@C [0)$f)$PS@H|$x<1H$(dH3%(uH8[]A\A]A^A_蹷fAWAVAUATIUSHӺHHHAAD)HAHsHGEtI9vMIAHwHÀHL9t{HLPAtHD[]A\A]A^A_IEPDHsatu@1HLAuLL)E1g@E1HtK|5PHHHzHuHyHH1Jt=Jt9H)HH)H뎋UBT=BT9zBT=fBT9if.[f.Ht{AVAUATUISHHHAAD)HAHsHGEtL9sFHwHÀHH~HLt[]A\A]A^fD1DIT$PDHуtu@1t BD5fBD1HLuL)LE1HwfHu 1[]A\A]A^ÃKL,PsdtUt҉DfD1DHuHyHH1Jt5Jt1H)HH)HeDHEHyHHHHTHTH) H)1HQEBD5BD1U‹DD1'Hu fAVAUATUISHHHAAD)HAHrBEtL9sHHwDHÀHHvjHLt[]A\A]A^fHGfIT$PDHуsxHLuL)LE1HwfHtKL,PsoUuDfDdHuHyHH1Jt5Jt1H)HH)HeDHEHyHHHHTHTH) H)H@u@1BD5fBD1EBD5BD1U‹DDATULgPSHHHDPLpwp)ʃHxHHDHH) 1HHHCLHHHHH=H HH8HH0HH(HH HHHHHHH8HHЈH0HH(HH HHHHHHwFSUSUHSH(USUHSHUHSHUHSHUHSUSUSU HSH(U SU HSHU HSHU HSHUHSUS'US&UHS H(US$UHS HUHS HUHS HUHS US/US.UHS(H(US,UHS(HUHS(HUHS(HUHS(US7U S6U!HS0H(U"S4U#HS0HU$HS0HU%HS0HU&HS0U'S?U(S>U)HS8H(U*SHSHU?[]A\@1)ʃ~HHDHHHH)ƒr1ǃ9H49rDLHuI|$L1HCPID$hHH)pH4u[tt1fLfDu#1ftDDDMf.ATULgPSHHHDPLpwp)ʃHxHHDHH) 1HHHCLHHHHH=H HH8HH0HH(HH HHHHHHH8HHЈH0HH(HH HHHHHHFCECEHCH(ECEHCHEHCHEHCHEHCECECE HCH(E CE HCHE HCHE HCHEHCEC'EC&EHC H(EC$EHC HEHC HEHC HEHC EC/EC.EHC(H(EC,EHC(HEHC(HEHC(HEHC(EC7E C6E!HC0H(E"C4E#HC0HE$HC0HE%HC0HE&HC0E'C?E(C>E)HC8H(E*CHCHE?[]A\f1)ʃ~HHDHHHH)ƒr1ǃ9H49rDLHuI|$L1HCPID$hHH)pH6u[tt1fLfDu#1ftDDDMf.AUATIUSHӉʹHdH%(H$1HHHfo*)D$fo-)D$ fo0)D$0fo3)D$@H$FHHLA$pDPpHLP1)t LmPHLmA1LHH$HD$HuPHHHHH=$H H$H8$HH0$HH($HH $HH$HH$HHH8H$HЈ$H0$HH($HH $HH$HH$HH$\AHD$HˆCH8HH0SHH(SHH SHHSHHSHHD$HSHˆCH8SHH0S HH(S HH S HHS HHS HHD$ HSHˆCH8SHH0SHH(SHH SHHSHHSHHD$(HSHH8SHH0SHH(SHH SHHSHˆCHSHHD$0HSHˆC'H8S HH0S!HH(S"HH S#HHS$HHS%HHD$8HS&HˆC/H8S(HH0S)HH(S*HH S+HHS,HHS-H‹$HS.HD$@HˆC7H8S0HH0S1HH(S2HH S3HHS4HHS5HHD$HHS6HˆC?H8S8HH0S9HH(S:HH S;HHSH)H$dH3<%(DTH[]A\A]HMQD$Pp) 1ftfo)D$fo)D$ fo)D$0fo)D$@)HqHHDHH)ʃi19H<rRfDHyHHDHH)1HCD&D11fT1@ATUISHӉʹHdH%(H$1HHHfo)D$fo)D$ fo")D$0fo%)D$@H$@HHL$pDPpHLP1)t LePHLb1LHH$HD$HuPHHHHH=$H H$H8$HH0$HH($HH $HH$HH$HHH8H$HЈ$H0$HH($HH $HH$HH$HH$THD$HˆCH8HH0SHH(SHH SHHSHHSHHD$HSHˆCH8SHH0S HH(S HH S HHS HHS HHD$ HSHˆCH8SHH0SHH(SHH SHHSHHSHHD$(HSHH8SHH0SHH(SHH SHHSHˆCHSHHD$0HSHˆC'H8S HH0S!HH(S"HH S#HHS$HHS%HHD$8HS&HˆC/H8S(HH0S)HH(S*HH S+HHS,HHS-H‹$HS.HD$@HˆC7H8S0HH0S1HH(S2HH S3HHS4HHS5HHD$HHS6HˆC?H8S8HH0S9HH(S:HH S;HHSfDH#H$dH3%(_H[]A\HMQD$Pp) 1ftffo)D$fo)D$ fo)D$0fo)D$@'HqHHDHH)ʃd19H<rMfDHyHHDHH)1H;DD11fT10AWAVAAUATUSHHdH%(H$81ʟHiH\$IĹ11HH身ARA)1ED$)fH)D$fo)D$ fo)D$0fo)D$@fo)D$PD$A$HnMcJHHKQD$`p)HyHHDHH)1HHT$HD$HsPHHHHH=$H H$H8$HH0$HH($HH $HH$HH$HHH8H$HЈ$H0$HH($HH $HH$HH$HH$ A@HD$ Hˆ$H8$HH0$HH($HH $HH$HH$HHD$(H$Hˆ$H8$HH0$HH($HH $HH$HH$HHD$0H$Hˆ$H8$HH0$HH($HH $HH$HH$HHD$8H$HH8$HH0$ HH($ HH $ HH$ Hˆ$H$ HHD$@H$Hˆ$H8$HH0$HH($HH $HH$HH$HHD$HH$Hˆ$H8$HH0$HH($HH $HH$HH$H‹$H$HD$PHˆ$'H8$ HH0$!HH($"HH $#HH$$HH$%HHD$XH$&Hˆ$/H8$(HH0$)HH($*HH $+HH$,HH$-HH$.+T$HHH$HHHc贙A EHHHE[E1HDD$LlDD$H$8dH3%(D HH[]A\A]A^A_fo fo(fo0fo%8)L$ )T$0)\$@)d$P%AMH5)¿1Gf7[P1ftBMkqH5eHLjAucD$PD`pHHLP1)LkPHLAfDEH=DD$DD$v@EAH=݆DD$ȓDD$gfDH=YD$訓DD$fDHqHHDHHH)ƒ:19H<r#1LHfD1fT1 DD$?DD$DHaaaaaaaa}LHD$ 1HH=HD$wHD$MAuEDLHUAIŀIIwMl$ HD$ufHL3P)AsLtA$HsPHAO4,L)IffDI$HyLHHKT,JT)H)H)HAEH{PLr DH1At At fHA AqDD1'A$CD,BD)CD,fBD)̒f.fZ4ucH=o4H5ȣLL@tXH4 9t4H0uHtL9r4H 4@*t΃$vƉHUSHHt=HH{4fH0tH{HڔuHH[]@1HH[]ff.H#4u 9tH0u1@f.t8H49tHȋP0HH0uHDfDH@8HATU1HSt/IH4@H0+tH{Lu[]A\Df.O1 w'HŽuu 1f.Wrv uf1f.O1 wHÐGHGpSHHH9HL13 HCpHHHHHHHHHH|HHuOHHH@HHHHXHPHH`t0~HBH+BH`1[fDHHH@HH H HXHPDLH1/ 1[DAWAVIAUATIUSHHHLA|HHH HHH HHH I9E $AyDK@ A|$@{ El$Dk A|,D}A9AyD9 &HHHHC A4HA LPMHHH ʹHS(HAXDKs(L?AUHƫAW1HHS(LC H LcI4HHsH}1|td fL9DSDfD9tfHHSLLAT1HXYD9$H[]A\A]A^A_DIT$H}HHSKH(H H KH KHH KHH KHH HH9wVH)H?HHHULHc1H')DHH[]A\A]A^A_fAA)DAE)EAAEDDLH1H@fDLqH1HnpHLHzjE18<AYAZ:LHH1oH LmHDLRHHE^_He@f.HtNUSHLޟHHA1HiHHH[]@fDHHtSHHЃt 1[fD1LyH/H1V[ff.AWAVAUATIUSHHHHLD$L'HL$dH%(H$1UH HBLcM5HCHS H9$HK(H)H9HILQH^MlLAHAZA[HLK(DXI@9HC L{LI)AL9}u0D\$@HLuHHt$@ DL$LLHD$@CD$HC fD$ILHD$KHS(LLHL$pLHHL$ LHL$ H{(HULH0LK(HHYuLLM2ZYHELK(D\$IALK(rI)AD$HMIA1HII)L9!IN1DL9v^fDLK(MAHI9sHC(0MLLK(zH|$HUH9S HE(HL$(H|$HD$ HHD$ЅHL$(fHUHt$ LHL$H) LK(HL$QLuH*1L^HULC(HMLHD$@PHt$0_AXHC(H;D$8LB0HUH)S HI)HC(L$kMWM)L9UL_f.Hq1L:cAF}x;D$1fDLK(I@8LH 1LH$dH34%(iHĸ[]A\A]A^A_MGC E1DHLHj1LXHUHu(H]LC(MLHD$@PcA\A^HD$8H9C(L!L`H&1L1D؃t AL9} L&eHELt$pHu( LL$HD$pLD$xL}HHD$LL$L(0D$tCH0D$uCG0D$vCL0D$wHLC0D$xC0D$yC0D$zC0D${HH@t$SHD$HCD$PC fD$QDL$TMAW1L;|$LHIٹJLHH$LT$PLH¡LLMLT$ H$ LK(LH1OLRHC(HUHsA[u PLH+CHMA H)VATLs(LT$@L萷H04LAD$]HL-D$@HE MHLߘHߠbLI)LK(PAYAZL;|$H{ Lm'HID$oC fRC MfLILe<AD$LHE(HD$ fAD$LLHLH՟h@1tLAXAYL%HLLL|$@LuHHD$@CD$HC fD$IHC(HˆD$L1HT$KHKHL^H4j MLL LHS(L$LLLLSL{H{(HULL蘄HEHC(XZH|$ HxLL˟YvLZ諀f.AWAVLAUATUSHHHHHhIdH%(H$X1HLcMHCHK H9LC(H)L9HH@Ĩƒt HUH9UIHIMl$HK LC(HE L9v_HML•PnHdL1-A[[H$XdH34%(Hh[]A\A]A^A_@L$I)Hu8LC( L$LHDŽ$DŽ$-A$L$H՜0$AD$L0$AD$0$AD$0$AD$0$AD$0$AD$0$AD$L$0$HHMH$C$C f$LH$D$Lדj XLuuHMLXu LK(LOHԛLMHE H$HUHMA H$QLH+KHsH)LVHC(LAUPH0UH$H9C(LǒHHH1LMIDHLAL$$=DD0L]FKLI9HEmHTI9_DUxAVE11LIHI0Lm8~2LLLDT$L$L$LC(L[ DT$M)MLC(D$HHH$LLMLPZYD$HK(H;$0X AHAA| t HEHHH)H?HIH!ALOIȸHM)HHFH)H9( OL)IIHI?IH1HH?HL!II9uM1MIM I?IM!LL$HL!H)EIHK(H<$LH1DL载1fDHHUHu8H$HLMP蹧ZY HK(H;$ 0H$E1HH+MH$CIHK($$C f$HH$z H}`I@HEH}`HD$(HEpHD$ D$H$HHD$hHu`H|$1h@H|$$S$LA$HLʽ$MfHM[jLÚfDL1fDA$L܎/@LYL=H*1LD$L$L}`޻HHC(HH+ELMLH$S$HC($S f$HH$j H蒽L LHS(L$ LLkLLL^uLK(LHJLM-_LӎuH#MLH}Ƅ$AYAZHLC(D$t9LK4LAMH$I1 H9$u$ L]HE`H$ HHD$0MAH|$0ILL|$MCILLL$8]D$LL$8M9HD$`HpHLd$@HLd$0L$Ht$HH|$PHH$HLl$8Lt$XHl$pIH\$xLL$hLHIf.H|$LH|$LHD$8H1HHH H?HHHHHH|$Ht$11fn\$T$fnT$f`f`fafafpfp@fBo 8HHfBoD(fffB)D8I9wHD$PH9nI<D!A!D ɈHHH9GI<DDA!DA!D ɈHHH9I<DDA!DA!D ɈHHH9I<DDA!DA!D ɈHHH9I<DDA!DA!D ɈHHH9I<DDA!DA!D ɈHHH9kI<DDA!DA!D ɈHHH9?I<DDA!DA!D ɈHHH9I<DDA!DA!D ɈHH H9I<DDA!DA!D ɈHH H9I<DDA!DA!D ɈHH H9I<DDA!DA!D ɈHH H9vgI<DDA!DA!D ɈHH H9v?I<DHDA!DA!D H9ÈvI @"" ЈH;l$sHD$@LH4(iHH9l$Ld$@LL$hLt$XHl$pH\$xH|$0LL$$ATUISH?HhHHPAdH%(HD$H1HHL ATiIH߱HZY|uQLHLH1H脯HL$HdH3 %(DHP[]A\A]A^Lt$LHHLAuSHsxHtLHvL{HAAH߉D$ PD$ A*L,H A}HLHAt AAkff.ATLUHS1HjH{0HxL%yHu5HxHcH9]H)HHHxLXL+HHLpPL&1LH߭HxHHH{HH)S0LoŹALHY^\[]A\DL(LH1r[]A\H;H8H|Hp HP HxH@HPHXHHHH`t0~HQH+QH`LHH11ڬ[]A\HLARHH1衬XZ[]A\HHHHPH@HXILTHH1IDf.AWAVIAUATIUSHHXdH%(HD$H1HcH9sI|HIxHI`HLIpALJhlLzHdž1 LMp脫ItIGXx I7IHAOAW|mPHI@IHIPLHIPDhIHIXI`MEHI+8H)HD$ I@H|$0H)AOHT$(IpHT$8HAWHD$I|T$L$AhHH0LL@8T$HT$H|$0D$Ll$8LMpAhIPHIPHT$8PIHMXII)M|AhHLŊp LIHAUPRPRDH1ɩHMHH߄ATL~s L輫IMxMHIY|^MHLIL$I@IL$ I HMXM`IPt0~LbL+bM`AAAuAgAYAKHt!A7HuA$LH1 L肨L}AD$HL覩D$Lu,H\$HdH3%(5HX[]A\A]A^A_AD$L|LMxqHPHLEMEHCI9D)NHI9IH@L|AD$C HL٨D$LL|H L1NfAD$L†IL$I@IL$IHMXM`IPރE΃҈HPzLNyHځ1I L螦@AD$L={ I8MpL?{H|^LM`MHD$1-Mu8Mp@߃Eσ҈L$T$YLH+D$I`LLHD$fMpLÅH1fL訥M`HLApHiL薧IME+T$H8L8D@LPXZVAAZA[IAMELH8{LXI)L+L$1MpM`HLuApH~LզLyHL1蓤_AXcLԄH1sLiLVyHA L蓥HLIRHK1L[]|Ta@Ht3USHHfH;Hk^HH^HuH[]DfDATUISHopHHt*fH;HkT^HHI^HuIl$pHhHDžHDžƅHt#HpH)]HDžhIl$pI\$p 8+PI$t9H}LuLE1ɹH1订I$11A$A$ID$ptƀ[]A\fDI$:uƀ[]A\H`H)HXHX]fHǃ`P9H0H)H(FH(\fHǃ0 I\$p8fHHH)H@H@j\fHǃH8I\$pPDHH)HH\fHDžI\$p "DUSL7H(|H(HHD\HGpD1ӠHHCptCLsH{1HHA蚠HHCptƀH[]H:uƀH[]@f.AWAVL uAUATHR{USAH HXLpdH%(HD$H1HtHCXx H3HHKS|CPHH@HHHPLHHPDhHHHXH`MEHH+8H)HD$ H@H|$0H)ʋKHT$(HpHT$8HSHD$H|>T$L$hHH0HL@8T$HT$?H|$0D$Ll$8LLphHPHHPHT$8PHHHXH)J,(H|tGHLxHPHLEMEHCI9xD)HH9dHHhHL~p H߈HHAUPRPRDH/y1HLHLsUHys HHHHHxH_|HHHAXփ}HxH@Hx H HHXH`HPt0~HAH+AH`HtHu L}Hw1 H轜1fDLqAD$ C HwHٝD$ H|$HdH3<%(HX[]A\A]A^A_f@tEt~ALqHfw1 H*1fDHxH@HxHHHXH`HPu1HкLxH=@HŸ@HCI9HRAD$ LKp fDރE΃҈HPLmHzv1I H>@HpLpHCv1^HL`L8LHu5Lp߃Eσ҈L$T$H`LHL)LI[LpLzHu1fHtL`HLzpH}uiHcHMED)H8@L8LPX)KAA[]HAMEL_zHu{HߋXI)1M)Lp蹙L`HLGzpHt~H訛LnHtH1fAYAZpLyHwt1sH;L(nHUtA HeH耹HPHKEMED)HHXH+HHtUHsXv HH~v HyH{H~HʅHHcH9IH)M)I9LGEDxDMcLyHUs H1@I9fAD$ LJy KYLljHr1H輗뵃 uH 4뤸TAWAVL5yAUATHrUS1Hk H`HCp/LME1A|$D0H HxH=@IŸ@LCL9rBA|$tEtHuHOhH[]A\A]A^A_@HHT$3HHHT$HKEmME)xHHXH+HHt;HsXDN EHHw HHcHcH9&H)I)I9HIFՅ҉9A|$HcIT$H`I4$VID$HpAT$hHSpHHHI$H9r#ID$HHHH H1AH@7HCp@I$:+H H9rAH9~LvH:p1o HHCpHHHHH HHCpƀm@ku:w HxH{HRHJffLfHoH1No@HKpI4$LIL$H~ H MI)HL)Ճ H u HH H9HGMu@H9t;LT$HLuPHnHA 1輓_AXI4$LT$H`HLrj H߉VfPH`LHPH`LHPH`HHDPH`@ H`P H`HVn@h L`j <H`HLHx SHSpHE HpAD$HhID$HY^LtHm1 H讒H趿ZHǂHǂLgHmA H袓xDHa{HCptzƀHtBDH5mL^dH߹H1EDHDLtHl H1跑ƀнDUSLfHlHX H1hHLfHzlH1\ <H[]AWAVLfAUATHBlUS1HIHH{8HH+MEH)L9HL|HHt'L9I)MLHǃHL%fHkAU1HaHLf]A\L9H'HHtHЃ{HCpDHH+MELeHE1H)1HHjȏHC@HH{HHDHLcLeHjE9HҐEAEx,LLeHujH1E1;HD[]A\A]A^A_LaHCjVH1LdH!j%H1LBHi1AHÎHt6HiLaHE1ɹH1蔎H11{H|A({ HAaLpH`iA[HsfDHLcH.iAU1mHHAYAZI9|L5|cHXLAHLHhAU1MH蔍LcHhEHEY^v%IcL9tHL9HHH HЃsHHC@MHI)H{HH&LS8A)H{@LkHgH1A譌mHSpD`D9\9tJAL|bAfDHg1HFHSpH D` 9rA9DGDLFmH7g1HL`aHgX 1HًHALLaHfAĹ\ 1H謋EL!aHfENHЌ@LmHfIH1SHHHHOLf.HHDXHS8LcMfADHHeLmAWE1H赊AXZmL ]HeVH1膊HLL`AUHeH1WLG`HqeHA聋A_AXL|lIL\H'eH1AALh\L_HdHH1誉AdDf.AUATHdUSL_H[ HH`HpD 1RhEAńu EHSpHH |LpI@HL_Hc1 H賈1H[]A\A]fDH| HSpHtSLpI@&hu EZL^H^c1H"L`HH8cpLp^H HHHXZLpLGHHEH`LHHhLeHEEHCpHHuHHBHuHjL]Hzb H1>dfHUH`HHHH`HHHH`PH|@H+pHH`HwH JHpEH`HSp1pHSpH`PHCpH`fp@H`PfP PP fE]HCpHpHH`H|-Ld[H*aAH߹ D$ 9D$ H[]A\A]f.Hd@@H`1@H`fH@H`PfP PP H|DLpI@,HLahHr`h@1 H1AYAZrLWj H8`1HFLx[H`A H1τLi[H_HA H[]A\A]L[H_HMvH>?LVu DHALgh?Hi_H1 -_AXoLV~ Df.USHHHL|<HHH I9HLOgAq q HHH^H P; P1考HAYAZ|tHJBrz  B B B B  z 9k)9aH H9NHCpH!DJfA{ED9A9=HD9:HLfH]P` 1HLWH]X 1H]HLWHo]Ź\ 1H1Y^cLWHA]AH߹d TH[]H H9rs1H[]D:uSH9 w=sf9zu =s@8ztmLNfH\z H1苁@L>fH\ H1Scfzf9z uB8B u@LdH:\3 1HH\LEeV1m H߽ˀXZf.LwWH[E H1莀HLAdH[VH߹S 1X_AXjUSHHHoptHtH HH|tGH[pHt>u?H HHCfHDž`PH[]f.HH)HHj:fHǃfHLJHLJfH1}tlHQqH(H H qH qHH qIHHH H HH9rH)H?wHHø@H}HBJH(H H JH JHH JRHHH HH H9s*HƺH)H?Hv6HHH)H?wHH fDHHHHHÐf.SH t'H 1|HSpLIHHLUcTHPRDHX1}HX^[@LIHDAH1|tƋCHSp 1Ht{uH 1[u@{HH9S\LbHWH1|[ÐQ2dLtbHWH1kY|1[DHt+LaHeWH1A)|[fLAaH:WH1={[H{pLiaOHVH1{[LR+L`HVH12{[DILLaHVH1\Y{[LORHlVH1c0{[fAVAUATUSH@dH%(HD$81HH?HLRHVzHLaHUj(1AHzH`HǃpL^OǃhHU HH`@(1LpPzH]A\tHCXx H3HHKS|PHH@HHHPLHHPDhHHHXH`MEHH+8H)HD$H@H|$ H)ʋKHT$HpHT$(HSH$H|DT$ L$ hHH0HL@8T$Ho=H|$ YD$Ll$(LLphHPHHPHT$(PHHHXH)N$(H|tGHHxSHPHLEMEHCH9p)HcI9\HHhHLRYp H߈HHAUPRPRDHS1VxHLHHlSATL`Ms HIzHHHLxH|LHH^_HpH@Hp H HHXH`HPt0~HAH+AH`򀃇HtHu L8XHQR H1w)fDLLH"RAC H5xL1LHQA鹷HxH|$8dH3<%(pH@[]A\A]A^HLKHQH1 dvLMH~QH1Bv{DHpH@HpHHXH`HP1H=VރE΃҈HPLnHHPI H1u@LdJHPA HvHpLVJHP1^HL`L8LBuHu5Lp߃Eσ҈L$ T$ H`LHL)LI5LpLTHP1fHtL`HLTpHOiHvHMED)H8L8@LPXy%AAZA[HAMELTHWO{HߋXI)1M)LptL`HLTpHO~HuLHHNH1sAXAYoLSHNsH1sLwHHNA Htuf.W0AVAUATUSH@dH%(HD$81HH?HLJHNArH@LYPHME1HrH`HǃpLhGǃhHM HD H`@h1LpZrH]A\tHCXx H3HHKS|"PHH@HHHPLHHPDhHHHXH`MEHH+8H)HD$H@H|$ H)ʋKHT$HpHT$(HSH$H|NT$ L$ hHH0HL@8T$Hy?H|$ cD$Ll$(LLphHPHHPHT$(PHHHXH)N$(H|tGHHx]HPHLEMEHCH9z)HcI9fHHhHL\Qp H߈HHAUPRPRDHK1`pHLHHvKATLjEs HSrHHHLxH|LHH^_HpH@Hp H HHXH`HPt0~HAH+AH`򀃇HtHu LBPH[J H1o+LDH*JAC H=pL9DHJA鹷HpH|$8dH3<%(xH@[]A\A]A^HLCHIH1 lnLEHIH1Jn{DHpH@HpHHXH`HP1H;TރE΃҈HPLn@HHI H1m@LdBHHA HnHpLVBHH1^HL`L8LBmHu5Lp߃Eσ҈L$ T$ H`LHL)LI-LpLLHH1fHlL`HLLpHGiHnHMED)H8L8@LPXyAAZA[HAMELLHWG{HߋXI)1M)LplL`HLLpHG~HmL@HFH1kAXAYoLKHFsH1kLw@HFA Hlmf.|O(AWAVLBAUATHBFUSHHdH%(H$1t$j, f.H HHH`HH9HǃHǃ H|HH9Hkp:H Lh MtHH9 HHl$PHHHHFH | ==T$XHHwHG HHHHHHD$xHf>u|t{FfLAHDE1ɹnHjHD$hLRwHHVDH1iJf.L AAD$IHDH9jD$= ALBHCEHiHHHtCH|ZH{pF{<LIHDAH|LAHCH1E1gH$dH3 %(DHĘ[]A\A]A^A_fLIHHL-MH߹TPRDHB1YgH_AX<<lBPHdA_XHL*=H?$L$BLL$pHefA]A^H|$x {(( H3|/DHWHHH34|1ɃIHH9wÄHHfD{HH9CxLI,=LspMxL<Hb>1H&c'HHDHHCpfAEA9EA)APLMRPH=H1bL#<H=LH1bAYAZ@L=9L5*IL-=ADH@t8H9DLM4IEHPE1HbXZAAu<6HD`P@AA A McI I@LHH<1LHaHLLHATH<NHcHHLǃL L<"L8Hf<bH1*aA[]fH_LhFH1<AH1`LO:H <H1`AƆL::H;LH1`LZ8H;1HLpxi`9LGHt;H18`L8HR;1H`H|<HHH L9H ;H1_ǃ, zfDH3H|H@<LQ8H:H1b_ALEHj:H1._HL6HA:ǃHǃbHHǃ1Hǃƅ^DDL FH9[H1^LD6bH9fH{p+vH8HǃHt$hDHHBHHBHL$XHH HD$pHD$`HHHD$xHHHHT$xPH{xHHCPx :LL6H81HLHL]M H@L66H8H1G]Al@HHU8LfHAU1HDL ]HDmA[IM|$^HA+H H9& H Nf9Hd HDmAI@IH=&LHJ "1AHHL$H)H;T$ ED|$ d PEhLGlHQ7L0A,H߉D$Y]HD$|y=C jptC9‰C# HǃHǃLEd|IH}HAqH(H H qH qHH qIHHH H HH9HǾH)H?HwHHHHHH@[HHBHHB HLDH5H1ZAH5L:B1H߹nZHMEHH+H)I9LL1HkpLHǃHHhHHpH)HDžhLCH5H1YHt$h@L>H4=H1AYLIHH4EHZǃ(>L+qHe4H1A(YNHkpT$XH>5Hh'HLL$hH)I9ZDL0H31HAXHL0H3t$pLL$pHZLd$xLpLxHHh_AXtHt$`LH*LH H|HGsHwHT$XHFL=OH3H1AW?AD$L/HH:99HDmHHLFHMJDj IL\$0HD$BA J ȹ/D$ LcB MA B HH2A 1McAULT$0 WHD$LT$0LJ| HHp L\$8ZYIACLT$  ACHDmL LA0H1?AH-HLD1V=H/AH)H?[HH GH Hx H,1Le>1HUHLM LM HH8LLLLH< A9 Ay Ay Ay Ay Ay AI;HPH9 AT H,H1NQHo,Lx?1MH)QLl$LGHTmHIHHLH10I1fHHBfp@HBHfH HH JMB L;H+AH1A}PL)H+AHQ 4B8HxHH HPf9x vB8AiHDmAI@>IH=Ld${PL;hH*1EHOHCpLQ<H*H߹lHD$(HD$D$8A1OHCp_AXHt4HhHt(HpH)HD$0% HD$0HǀhHL$AL<H+uH9D$MH5*L&<1E鹀HNHCpIcHRHHL$H+H9D$GIIuIHLK<H)HAPhD$@PDL$@1jNL'H)H LH1DNjDJL 4HT)\H1AN}L'H')LH1MA L$H(cHAM%T$LLd$H)ЃI95II)ՋT$I<4ALDH҃ tcJEAD ȅtSJEAD ȅtCJEAD ȅt3JEAD ȅt#DJEÃDAAD D EEˆDKDADAI))HDL t{EEA)DAD ҃tbEEA)DAD ҃tIEEA)DAD ҃t0EEA)DAD ҃tA)DAD ‰уɀEшLI<4H LHHt)A<$ID$I HxH9uAbA IK@I9 I'IsIaIEHTmIQ ЈAHǃHǃL*4LHH=&dHH)HHD$8HT$07HT$0HHD$8KTmfHH@L>H%H1JARLc2hH%H1[JAYAZM"LAD)AD Iu1LH)%L31hHIH|`,L]2H$ H1I5T$XAL!H$EH߹ JL!H$EnHJzAL!H\$E1ɹ HoJL7H9$1 HHH@zLy!H$A H߉D$JD$L H#nHAID$= fAL L Hk#AnH{IAPAUATL!USH4#H1HGH`HǃpH#ǃhL[ HCH`HpD 1GhHEAńu EHSpHH |LpI@HLH8"H߹ 1FL H"H1F1H[]A\A]H|0HSpHt]LpI@hu E7LH!1HJFL`HH`!pLH9H :HHXZLpLHHE$H`LHhLeHEEHCpHHuHHBHuHjLH  H1fECHUH`HHHH`HHHH`PH|@H+pHH`HwH HpEH`HSp1pHSpH`PHCpH`fp@H`PfP PP fEBHCpHpHH`H|LHZA HmEL3H7AH߹JEH[]A\A]DHT@@H`1@H`fH@H`PfP PP H|]DLpI@HLy&Hh@ H1DCAYAZLj HPH1CLH)A H1BLHA HDL8HHMBH\Lu JHAL%h?HH߹ 1KB_AX!L~ f.USL H81HHAH!DL1H1HAHHCxHChHCPH|fHǃHǃHHPHHP H HHCLHYHH1AH[]DHHH|uHHPHHPHHH@LHAH߹AH[]@L/HH1n@ H,ǃ,1AD$ L =HAD$ LLH1HC5Ã{@AWAVLAUATIUSH-H1IH4HHH|<MAI{H^HD}A tIv {HVUHHiI9vH|IHxH諅 DLHHH1 4H[]A\A]A^A_{ D}RA@HHH*hLHHL$HHL$H+LD$HnDD$EL%$H15Hj3HgL HrAH4$H`LLLpǃhHLBHAH#4fDLR H AH3HHH xu!LH6.ƃIT$IuH ƃLHB AHU3LH AH-3HH LlPM1H1XZb{HH?SL^ H H1HF1Hx{t2L: HL 1"H11H[H;,L H 1H0HH Lj1AH0H`ǃhHǃpHH`@/ZYu9LH H1G0fHH[飁L|HJ AH߉D$ Y1D$ L!H AH߉D$ .1D$ DøHt[SHH8H1H H H{H.IH{`%IH߾X[q@f.USHH_pHt]HHhHt"HpH)HǃhH]p 8u]Pu H[]DH`H)HXqHXfHǃ`Pf.HHH)H@pH@:fHǃH8H]p^H0H)H(~pH(fHǃ0 H]p HH)H6pHfHǃH]pf.t @9@q؃Dƒ׈A@9DtA)¸Q)кD‰fDf.f.AWAVMAUATIUSHH$H\$@Ht$HT$ LD$HHD$(dH%(H$1kFEHsHIjLLl$IJ8HD$0HHH$HIH(Ht$LHHD$8KI|-Ht$LLl$`L1LHHAtjHEH4$LfnL@YnLH$dH3 %(DHĸ[]A\A]A^A_DALl$`HT$ Ht$HOHT$0Ht$8HXLH!YHD$(H)H$HD$KDt$L$I1tAEM9JD5IHZH$LH;XLHXHZHLHXLHXM9HsL1HHtHD$J40fIEH~HHILHLHLH)JD5H)M9HTDt$UAEATTfATfT fDA<Ht$AQMIHHHHHt$AQMIHHHHAWAVIAUATMUSMHH\$PH|$Ht$H $HdH%(H$1(CLIIDHHD$HHH@LLHHD$ 3H4$J|%L"(BHHHEAHD$pEH$t^HBHt$H9kH<$+kHH$dH3 %(DHĘ[]A\A]A^A_HD$Ht$O4,HLeLt$@HHHHD$8LHt$ LHULHUH$VH$L$Hl$(L|$0LHD$HIFE1MIfDHIWLLHUH4$HzUHWLHTLHWUM9D$pED$qED$rED$sED$tED$uED$vET$wHUtjT$xH Ut\T$yH U tNT$zH U t@T${H U t2T$|H U t$T$}HU tT$~HUuD$EHM9Hl$(L|$0H@?HXHHwCAHT$8Ht$HH)Ht$JLd$@Ht$ HLSHHTH$uHL$IHE1Ld$H$Dt$MMHHHI)MMIfDHUHT$HH(SH4$HSHUHHSHHiSIFH;$gAoD$fD$pADC0T5I<D\pE0\=HzH9AM>|qC0|HzH9&M>|rC0|HzH9 M>|sC0|HzH9M>|tC0|HzH9M>|uC0|HzH9M>|vC0|HzH9M>|wC0|HzH9M>|xC0|Hz H9smM>|yC0|Hz H9sVM>|zC0|Hz H9s?M>|{C0|Hz H9s(M>||H C0|H9sM TpC0T H;$IDt$'DHL$HH D$pHED$qHED$rHED$sHED$tHED$uHED$vHEH @HD$pH$AvHD$pAH$bMIvIAoDM9LfD$pADJ42|pHA0|5I9Lr1_Df.AWAVIAUATUSHHLghdH%(H$1MIHHL5HLELHLa 1Hx"HCpHH8HLMLj H m HL$S$LHHHCpH$ I|$8MA LL0L?HMw HH$ # L dHvL1{ H!XZH$dH3%(HĨ[]A\A]A^A_Lg`fAUATIUSHIHHHdH%(HD$x1LH1H !HEpHH8LHoHLrHj MHIE "HwLW1H H$XZHD$xdH3%(uHĈ[]A\A]Df.AWAVIAUATUSHH(LghdH%(H$1MIHH/L5HLEjLH 1HHCpHHHLMLj@H} HL$!LHH*H HCpH$ I|$8MA0LL0LHM HH$ Z!0L}aHL1 H XZH$dH3%(H([]A\A]A^A_Lg`2fAUATIUSHIHHHdH%(H$1L~HN+1HzHEpHHLH )HLH j0M2HIE0K HL13H HXZH$dH3%(uH[]A\A]9fAWAVIAUATAUSHHLohdH%(H$1MLHHLd$ Hl$p1HjL[HHCpLH\HCpHHHML$L9jH H)LML'H HH$XZEHHLHDL$HT$LhIvHHCpHI}8j MHT$A$L0LH*M' HH$ mLZH$L^LH. 1HY^H$dH3%(H[]A\A]A^A_Lo`A2fAVAULATUISHwIHHdH%(H$1IHl$`LYHHCpLHZHCpHH LLgIuHcHL Hj$MHI$#HL 1HLyYHqXZH$dH3%(uH[]A\A]A^AWAVAUATUSHHXOxH$H$t$ HT$L$0DD$(HD$DL$E1ۉ[]A\A]A^DHUpHHHH8L;HQH1HEHH|111ɸH`NH`QH`@zHpHH`Džh ExuuLHH1CfDHE1HHHH8HmxLHAHHPxHHf.LHR4H1~E=DAWAVAUATUSHH(HGpuH|@LH1 HHCpHH w2Hਫ਼t#H|tWtuNHCh@pLyH H1CE1H(D[]A\A]A^A_DH[At,LH6A HH|tN<HHH<HHH H; u(uH: uH5f90LkhI}hHtZI}h豺IEhhHIHH? WHH |<MII<MII<MII <HHH<HHH H9BB  Ȁ<7HLD$H9}I9%MVI9HB<6BD6BL6 ȃAwO4:I9jL$H|{ LHF1 HLT$mHC`LT$HHhLHLT$HD$HL;yHyLHL$HL$LT$HLT$yHD$Hxh˸HD$HLT$H@hfLLL袗=A=+HEnLqHPEM HLL;fD5K@8pSLH1x H-HCh@p@HCau$D$H =P:*0LHMT HHCpH{ HHD$LQHJ1 HvLC LK(HHSpHHwHD$H{hHHjAQAPLLOpLPH A Ih0H3tyHHt+t%Ip 9uX9tLHuHChLHp H߁Hp1EH3u A|L{hLH5%AOpH5LLpH1 H EPT$u A@HCh1@pu*u+HyHChDHpEL)HJ[ H1vEtqEH5L%4Dt}D$u~LCH. H1A%DHChLH HLhh1AAtAt EE1L HUW H1HD$H 7HਂL轾H5LAOp@LHA H5H1HHL$yLHs1 HHL@hLHp$LJH<H1Ag2H%L  L1L誽AOpH5LzL iLHH1 H舄A2 qL!HUAh H1AuPH3"LH% H121HA-R,E҃02HGp~~t H HÐHHÐH HÐSHGpHH5HCpH|HCp1H8jH{p[HǨ@USLHH/ H1(HHHH|H`HpHCp{L`HIpHɃH{HH HIxHML8L;HHH)H)փr1AуN9NrHpǃhAHCp CLH1\ H&H|HCpHHHH1ǃffYLH{H1r H[]fH|< C)HǃH|HHShHSXuVHju^H|t H\uxLHH1 H[]DHRHPjtLHAH߹ H[]fDLHZAH߹ D$ D$ H[ʼn]fHUSLHH H(dH%(HD$1*HHt$ H|HCpHȇ^H:iH3|<HHH<HHH H9 5H D$  DD$ |$ D1 L$ HL DD$ |$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL DD$|$ D1 L$ HL  DD$|$ D1 L$ HL HD  DD$|$ D1 L$ L$T$ 1 ЈD$ D$ ^HD$ Hǃ HD$HCp uO|Cu]LH H1Ht$dH34%(H([]|Ѓ<CtHLLHBA HL HH1A2H|Mf.LH H1 H|fLh s*f.SHHHLJPHH1HH)XHHrHfH{H H{`[ HHLJHH1HH)HÐHHLJHH1HH)HÐ| @|6| @|fD} @}@pf0fD\`| @|fHwhHWpHw0HW8Hw HW(HwHHW0HO8LG@Df.fXfHH1H$ @HwPHW@HOHHHAUATUSHH_hHoH|_IH{hHHtӴH{h*HChH{xH/oEoECoE C oE0C0oE@C@oEPCPoE`C`oEpCpoHHH}ht=hHHChHHEhH{hHPHphuTH}xt,LL詬HHCxtpHuxLHQID$pǀ 1H[]A\A]DH{hD$ HChD$ H[]A\A]@f.fH7HwHwHwÃt fwHcH4HATUISHHīHtMHL HhH@Hu"fHHQHuHA1[]A\fH1[]A\øݐf.HHÐATUISH_pH3HtLH@HL HhHu!HHQHuHA1[]A\fH1[]A\øݐf.HGpHHf.HGpDHw HW(AWAVIAUATIUSHILHH0Ht.H8{,H0Hǃ0Hǃ8H@HtȤHǃ@HǃHID$HMLHIH0L8LLH腪MtpHHHudH@w[H螩HH@HHHLH17H[]A\A]A^A_fDfLL`+H0ԣH@Hǃ0Hǃ8Ht譣Hǃ@HǃH{fofDfHAUATUSHHopHH IHpHIHt-Hx*ID$pHpIl$pHDžxH޿WHHpt;HxHLH1H[]A\A]ffոHwxH@ATUHSIHHHHHWuLHWtHD$ 0H0D$ H[]A\Ðf.AUATMUHSHIHHH'?uLLH?tHD$ /H/D$ H[]A\A]@f.ATLUSHHHLHH1uHu Hx1tLD$ 8/H0/D$ H[]A\tfHHAUATUSHHHHH_H=ILMuDIt$5HHLHHצB 1H[]A\A]DLLH (H聠HHtHĢHH'HMHǃH1[]A\A]Dvlff.HwXHW`AUATIUSHHH>HtHI1Hw!II}Ht*%HHH=vH[]A\A]fDI$PH1[]A\A]Ðf.H@xyf@z{f6~ @~fD~ @~f} @}f} @}f| @|@@w:@ƃv|f% 1f|ÐH<@vҸf.} @}} @}@| @|@} @}@dfHHhD~ @~HHHf.HHÐHHÐHG`Ht@pHWhHtBpf.HtHG`Htxf.1f.HW|t)HtJHHHEHt!~*HtHtH fHuH|uvHWX@Htv9HWhHtv H yH9HGfDHaH=?v@|@fwH&fH|fwgHHHWXHt"wjH54H9HGHWhHt@v"H9HGf@@@H  H9HGD@@ff.H|fwgH@HHWXHt"wjH54H9HGHWhHt@v"H9HGf@@@H  H9HGD@@ff.H|u GP1v1HWpHt!ftftf9HHF@ff.ATUSH|fH HHGXHt&H54H9HGHGhHt@H9HGH@@HC|u Gv?HWpHt7DfEt)ft-fA9AHFIMuD[]A\ÐDMtH诠xHL9sCI)L9IG@@H  ?@@LH1HoDHtHG`Ht H@hD1DAUATUSHHmHdHo`HWH|GH~hHHt覤H{hHChH{xH_oEoECoE C oE0C0oE@C@oEPCPoE`C`oEpCpoHHH}ht@hŜHHChHHEhH{hHPHp;vAuDE1H}xt,LLvHHCxtMHuxLHHD[]A\A]H{hHChHD[]A\A]ÐAAHt HG`fD1f.HAVIAUIATIUSHJHChH&LhImhI9rH[]A\f.HHǃME12@DH|HǃHǃH[]A\:f.USLxH01HHXHuRH|t{ t~HHHC u2L#HH1H[]LrHAH߹H[]@HSptǂkǂ[USHHHH|Ht1HxG H[] ~LH1HugH|t { zHHHCLL8H`AHLH=A!HH[]L5H 19H`HǃpHǃh@Lu HH1H[]ÐLHAH߹ H[]@9L+HSA)HffDHSptǂofǂWUS1HHGyHHC HǃHǃǃHǃǃǃHǃ菉1ǃHǃHǃfHIHǃ Hǃ(ǃhHǃpHǃxtƃH81MEHǃHCxHǃHCPHCXwH1HǃMEYHHtH蜂HǃHk`HtFH}hHtH}hqHEhH}x`H H{`JHC`HHǃ+HǃHǃHH[]ATULESHGpHڿH D 1{ uHC Hk`HshHtNH}hHt:H}h葁HEhH}x老HH{`jHshHHs`HChHPHHtH~tEuHxP҅H|tHCpHLH1 H$HfHt;SHHhHt艌H{hHChH{xH߾[A@f.AWAVAUATUSHH(H $AHpL5xzHH`IIV?LxM@H|A{{HHyHy }}@ILSLk`IUhHtHRIIcuBc AcIII6IA%Ml$ ID$I9f.ID$VI9ID$ZI9rCHECECeCEID$jI9HEEHH(EEHHEHHEHHEHEEEHH(EEHHEHHEHHEHEID$kI9r0HEID$sI9IuM9rHEEHHnHIM9(UHHt0HM,tt DfDH$HLHHMBL ATH8H1[]A\A]A^A_HȈ %H%HH%IuxHt%HʿLL$HL$HHL$LL$HAAAшpPHID$I9zLL]DmHELMHELHIEHK`HLU HˆE H8UHH0UHH(UHH UHHUHHU HHI_U vdALUde AE A EHAEoAEoA(E oA8E0oAHE@oAXEPAsE`ArEaApebApEcHAhcHtLHIicI9rZLEJIHABLHABHAhHt3HpLLL\$HL$LL$蹀LL$L\$IHL$MHHHUL9HMJAHHABHABHqxHt-HLL\$HL$FHL$IL\$LMQAAAAAAAHEL9wIABHE L9wIABH L9LA%DH3InIDHHHE @HH@oEo(Eo8EoHE1LH1HH([]A\A]A^A_fDH$L H([]A\A]A^A_DHHEH|H|H} HH)H)HfLoLy~WLܴs?L'LLHLWL҉DDIuA%#MI @f.AWAVL4AUATIUSHI|$`I$|xzy{}@HHLRHIHL4HZYxHH93hHHZCLk Il$hLID$hL)Il$`Il$PIl$XH9#IHHC LHHEHCH)HWCLfECE CHEoCEoC(E(oC8E8oCHEHoCXEXChHEhHExEpHClH)HYClSmLHo SH) tXHH9H$(h{HHEh?HH}hH$H|TH$LAH)ޅWHSH S LLcH)څLHȉHCI9CHCI9lCHCI9UCHCI9VI$IDŽ$I$ID$xI$LL)H?-I$|ID$`x2xLgHI$LDID$`HpHP8ATUjAUDH APD赞H0AHCGLH)HAE@LAD$HCKH)HIEDH[I9HI$IELHI$XAETLA$0IEUH)H7IEULI$IE]H)HAE]AE^ fA$IE_I9IE`1H$AE_D$tiI$HPH}LmMp\$HLmMWLWuH9uH<$HHwuM$I$HAD$ID$LH$wI|$pfA$tLI|$p|rID$pI9f.ALuH<L1hI$8Ht#MEI$8rIDŽ$8I$Ht#MEqI$qIDŽ$I$HtMEAI$qI$HtI$qI|$ptuLI$I\$hHt5H{hHt~H{hWqHChH{xFqHI|$p/qI$"qI|$hqI\$`Ht?H{hHt}H{hpHChH{xpH߾YI|$`pI$Ht HsHH/I$pI$pLHwL1裵LHD[]A\A]A^A_@I9LuHHExLHH?vLLH)H}h|H}hoHEhIl$`HH}hHtz|H}hoHEhH}xoH3TfDI$9\$Il$`HAfAoDAIl$`AHYAIl$`AH:HUSL0HH1HH8Ht!MEYH8nHǃ8HHt!ME,HnHǃHHtMEHsnHHt҃HVnH{ptpHH諃HkhHt5H}hHtzH}hnHEhH}x nH}H{pmHmH{hmHk`Ht>H}hHthzH}hmHEhH}xmHリ!H{`mHHtHoHHHmmHamLtHCH߾1oHH߾[]@fDHHLJxHH1HH)HÐAUATUSHՃH8dH%(H$(1| Ѕ|~}H=~H`|@HH=hH\1ǃdǃj<H}fhfnǃxuƃ{HCHCHCHHEHH3HK ǃtH1zfD|~~Hq3ǃxHCHCHCHHHH33HH3H1H$(dH3 %(tH8[]A\A]fohLHt$ L$ )D$ LLfoL)D$0foO)D$@foR)D$PfoU)D$`foX)D$pfo[)$fo[)$fo[)$fo[)$fo[)$fo[)$fo[)$fo[)$fo[)$fo[)$D$)t%LD$ LD$ Ht$LL$ uHH9"LHHHD$ԅu 0LHH轅tif-%foD$1HT$PAEAEAEfoD$ IUHAEfoD$0AE(foD$@AE8LHH=uHD$H$D$(HD$8HHT$0H9vLLHHHD$FHD$H$D$@HD$PHHT$HH9HD$'H|$H 4ff.AWAVIAUATIUSIHE1H $LD$LL$dH%(H$1fDI`MHIAO8ufMHD$`HDŽ$HDŽ$)D$P)D$p)$ MH\$8I4H\$@HT$80Lt$@HHT$ǃL7Mt IDž`M9tL$b0$H$dH3<%(Hĸ[]A\A]A^A_fDh5HHI`kMHHHMM`HD$@LD$8$J,HL)IOMwAHT$IG00HHقAubLt$8Lt$@HLI+G0LIG(HD$HHH$衂tKL$$@LA@HL$HHL$@IW8HHHL$ 蒄HL$ -H;L$@LVHοLD$ H $4HHHD$@IG"H $LHH4H $LD$ AHL)HHHD$@AG8IW@LHFMOXLT$PLHLLLT$(LL$ LL$ LT$(AG8hITIPMXAG8LLdD$ $HD$@HT$0LHID$ Ht$8Ht$@IH"D$ HD$@I+0H$LHIGx蒀>-$ HD$@HT$0LHI^fHD$8HtHD$@IHHHD$@LHHI+I`IIhHD$@I+`IXAG8*A8L;t$@HL$pH$HH>IW`H;$IhH$J1D$p9D$PHT$XH;T$xHtH$H|$` 1tI8HHH;l$@LLfD-"b2L\D$ !:LAD$ -!RIxLH :u/AG8ILH9L$$HD$HHD$@I HHH$uH4$I8HuuH$H;D$@Lz>L$e$-!w3-LKL9LD$HL$LLH^9+f.AWAVAUATUSHHHXHT$Ht$ dH%(HD$H1t'HL$HdH3 %(HX[]A\A]A^A_fHLl$Lt$ MMC|.H5pL 4HILd$0L|$(D$D$LHH5pHpAWE1E1LLY^|==T$Ll$\$Lt$ u3E'fLLE1E1HLl$Lt$ LL`H|$ (HD$(Ht$0HT$8I)IHE1E1H/LD$ D$ uD$I>@=tAEÃD$LD$ HT$(D$ I)IօEÃD$Ll$Lt$ ,"ALEy*fAWAVAUATUSHdH%(H$1HEHI9HIIE1fI`MHIAG8ufHD$PHD$pHDŽ$)D$@)D$`)$Hl$0HT$(Kt50HLl$0Lt$(H$DzLMt IDŽ$`L9tL$&$H$dH3 %(eHĨ[]A\A]A^A_fh,HHI`;HMHHfHD$PHD$pHDŽ$MI`)D$@H)D$`)$E1-@HD$0Lt$(0MoAHIIG0LLL)IWH$yAugLl$(Ll$0HLI+G0LIG(HD$8HHD$xtOL$=$L(Ae@HL$8HL$0IW8HHHL$zHL$H;L$0tL@AG8IW@LHaMOXL\$@LHLLL\$LL$eLL$L\$+AG8\ITIPMXAG8LLD$HD$0H$0LHIwD$Ht$(Ht$0IHD$HD$0I+0HT$LHIGx=w/-$HD$0H$0LHI w[HD$(HtHD$0IHHAHD$0LHHI+I`IIh蚉HD$0I+`IXAG8A8L;l$0HL$`H$LH豾0IW`H;$IhH$'D$`9D$@HT$HH;T$hHtHt$pH|$P'tI8LHL;t$0L7~D-"L D$TnLD$-!IxLH0u/AG8ILH0L$$HD$8HD$0I HHHD$EuHt$I8H-uHD$H;D$0L1xL$$-!#LIIL/E11LLH0%@f.AWAVAUATUSHdH%(H$1HH<$yHImII1fI`LHIAE8ufHD$PHD$pHDŽ$)D$@)D$`)$K4'HT$(0Ld$(Ld$0L|$0HT$LdsLHt HDž`L9,$tL$$H$dH34%(HĨ[]A\A]A^A_fh!%HHI`sHعMHHfHD$PHD$pHDŽ$LI`)D$@H)D$`)$%E1-@Lt$(H\$0LL)I]H$HHD$0IEHLH'%HHHT$L)HAEHH޹0IE0LHD$0rAucLt$(Lt$0L|$8LLLI+E0LIE(qtPLD$%D$LAV-@HL$8HL$0IU8LHHL$sHL$H;L$0tL@AE8IU@LLٸ`MMXL\$@LLLLL\$LL$MLL$L\$*AE8?ITIPMXAE8LLD$HD$0HT$0LLIzpD$Ht$(Ht$0IL赼D$HD$0I+0LLLIEx&p<-$HD$0HT$0LLIoAjHD$(HtHD$0ILH&HD$0LLHI+I`IIhHD$0I+`IXAE8#A}8L;t$0HL$`H$HL薷7IU`H;$I}hH$ D$`9D$@HT$HH;T$hHtHt$pH|$P mI8HLwH;\$0yLCf-"QLD$6LD$-!IxLL)u/AE8ILLw)LD$kD$L|$8L|$0I LL&uI8LLuL;|$0L@L.LAILE11LLL(3f.AWAVAUATUSHdH%(H$1H $LD$LL$HIHHIE1@M`MMMAO8ufHD$`HDŽ$HDŽ$)D$P)D$p)$I4.HT$80Hl$8Hl$@Lt$@HT$HIlLMt IDž`L9tL$$H$dH3<%(Hĸ[]A\A]A^A_hHHI`LMHHfHD$`HDŽ$HDŽ$MI`)D$PH)D$p)$uE1%fHD$@LD$8$N$LL)IOMwAHT$IG00LH kAubLt$8Lt$@HLI+G0LIG(HD$HHH$jtKL$)$@LAxP@HL$HHL$@IW8HHHL$ lHL$ -H;L$@LHοLD$ H $JHIHD$@IG"H $LHHH $LD$ AHL)LIHD$@AG8IW@LHvMOXLT$PLHLLLT$(LL$ LL$ LT$(AG8KITIPMXAG8LL蔼D$ $HD$@HT$0LHIiD$ Ht$8Ht$@IHRD$ HD$@I+0H$LHIGxh>-$ HD$@HT$0LHIhxHD$8HtHD$@IHHŴHD$@LHHI+I`IIh{HD$@I+`IXAG8*A8!L;t$@HL$pH$LH5>IW`H;$IhH$zD$p9D$PHT$XH;T$xHtH$H|$`=|I8LHL;d$@/LfD-"bLD$ LqD$ -!RIxLH:"u/AG8ILH"L$$HHD$HHD$@I HHH$輴uH4$I8H襴uH$H;D$@LLL$$-!eQIvLaLD$HL$LLH!#fAWAVAUATUSHdH%(H$1HHHHHI|H5:YHHIA\L$Lt$`D$E1E1LD$^HH5XHXAVE1E1HLIY^D$=V=UT$EAEEIE1M$`MMMAD$8ufHD$PHD$pHDŽ$)D$@)D$`)$J4;Ll$(0LL|$(L|$0H\$0LdLAMt Idž`L9tLD$D$H$dH3<%(DHĨ[]A\A]A^A_DhHHI$`LMHHfHD$PMI$`HD$p)D$@HDŽ$H)D$`)$E1A#HD$(HL$0HH$H)IL$HHL$%HHD$0ID$HL$HHHHL$IA$LHH+4$I0H$HHLLID$0HD$0bH\$(H\$0LHI+D$0HID$(HD$8HHD$Ob'DEuIT$@HLAzLD$D$E%fLhDHD$`H$H$I)HHE1E1HD\$L$$D\$tU=AfLD\$$HT$`$D\$I)HEAEAAIkD$fDHL$8HL$0IT$8LHHL$acDHL$H;L$0LZALD$EAEAAlAD$8kML$XLT$@HLLLLT$LL$بALL$LT$LAD$8I$TI$PM$XAD$8LLzD$9HD$00LHLI$_D$5Ht$(Ht$0I$L8D$HD$0I+$0HT$HLID$x_`-$A=HD$0L0HLI$o_AHD$(Ht#HD$0I$LH被AHD$0HLHI+$I$`I$I$hqAHD$0I+$`I$XAD$8.A|$89H;\$0H4$HL$`H$LAFIT$`H;$I|$hH$CD$`9D$@HT$HH;T$hHtHt$pH|$P H4$I$8LݰAH$H;D$0*L{AA L]D\$AAL5D$DI$xHLAu4AD$8I$HLALD$D$?HD$8HD$0I$ LHHD${AuHt$I$8L_AuHD$H;D$0YL`ALME L4AIeLAE11LHLBAf.AWAVAUATIUSHH<$HdH%(H$1 H;H$L5[L|$ I1LHHHP1MMH=ZYLH޿ED$8%=uHT$Ht$HZmu4HT$Ht$H<$Ht$H|$D$ 谏H|$&D$ ULŅHH=L H$dH3 %(u1H[]A\A]A^A_Ðf빽= f.AWAVAUATUSHHdH%(H$1HHt$;A8HLNIIIκHPH\$1H(A_ZHH9H)HL}N1MHHHHH9H)HIV@HHѰHH9~H)HL0N1MHHHMHH9BH)HIHHj"HH9H)HLM1MHHHHH9H)HIHHHH9H)HA4LPMHHHPA0PA,PA(PA$PA P1H0KHH9@H)HALLOMHHHPAHPADPA@PA<PA8P1H0HH9H)HLL1MHHHHH9ATMXH)EPHIVXHHHD$xaHcH9vYMhL$L"OHLRt^H$dH3 %(H[]A\A]A^A_DfHANHAHv۸@H)Hl$LPNLKPAT1MHHHA[A\xHH9vH)HAtxEHSH SMHHHELcKHEHP1eAYAZ)HH9EH)HEHA y~&LK1MHHHHH9MH)HL5)L$L-ibf.H$HHPM1MHHtZY:HH9/Md$H)HMt/L5$LL]tHIH$H1HH<HD$H)LIA1HHHHH9H)H~fDLI1MHHHUHH9JH)HHD$0ML$Lt$ HD$HD$8HD$HD$@HD$(U=%LIM1HHHHH9H)HMd$M fA)A)GA)G A)G0A)G@A$%={Mt$HT$H|$Lt$8Mt$LSuUH|$0HD$8KH+H98HI9HT$H|$LHD$8S-%=MLHDI1 IGIGHL/HHDŽ$MHHHAo$AGID$IG1xHH9mL$H)HL9? H$HLLL)ofoD$@LGIH$M$HHHfoD$PH$1$foD$`$foD$p$HH9H)HH$uH$H+H9L`I1MHHHTHH9IH)HLLI1MHHHPHH9 H)HIW HH8HH9H)HLI1MHHHHH9L$H)HL9{H$HLLL)@LF1MHHH}EHH9:E0H)HL ÐEA@A A.AdAAAAf.LE1MHHHHH9E H)HL AĀA@A 9AlAAAAMA}A'DLD1MHHHHH9L iLl$H)HML$Md@H$HL}HPH1MH^_nHH9cMd$H)HML-T}LLtHBH$HT$H|$0LyNHT$H|$LZNHD$8HT$0D$XHD$hHHT$`I9vTHT$H|$LHD$8NHD$8HT$0D$pH$HHT$xI9HD$8:H|$(HbfDLxC1HHH`HH9%H)HL $|LEC1HHH HH9H)HL {L C1HHHHH9H)HL {LB1HHHHH9eH)HL d{_LB1HHH`HH9%H)HL ${)LrB1HHH HH9H)HL zL=B1HHHHH9H)HL{A1HHHHpHHL mzLA1HHHlHH91H)HL 0zLA1HHH/HH9H)HL yLA1HHHHH9H)HL yWL_A1HHHHH9zH)HL yy$L2A1HHHxHH9=H)HL A3<A3<AB3TAAEɉ|$ A3VA3C3AAAB3\EAT$$A3^EA߉@A43tAD1C3\$(AN 1DA34A3 HB]3@AD 0ΉL$,E3N40A140A1@40A1AD0DL$E3F40FAA140A1 @A3N40A140DD$A3vD1D(AD1AAEFAD1DDˉt$<8DEMAAUDD1A]D1AU1AEEA]AD$AU AuA] AE H|$Au AEEM EEA] AU#`1H|$8dH3<%(u2HH[]A\A]A^A_fL%W3H-K3L{S3LtO3df. f.AWAVAUATIUSHHHWdH%(HD$81FDFL$3 Lrv D$L$3BDD$D$D3Bt$DD$3r t$`L%E3H-93T$HLA3HL=3Ll$IMIfDAAD3\A3AA3DA3A3T\$ A3QA3@A4@A3AAH H˃u uOE't LLLu.+t1LLLWtAƋL$ t H=Sy LJH$hdH34%(DHx[]A\A]A^A_LLLutLLLf;H H@H=AAbt$ jH$H$E1HD$ EL$ AAnDɉT$t'HH H5HE1fHD$ McT$Ht$IL))A)$nH gI΃|$H=8AAID$  E1ED$ EAAAit4HEH :EH5bHE1DL$DL$HMMcH|$LΉ foHPHLL$H)$LHt$LL$u x EHILLd$E1Lfo)$ fo@)$0fo@ )$@fo@0ID$@IH)$PH)fK4HSIA1H9KBMuԿ LLLDfH I8@ ~f'u@D 1MMHٺLWtnfD fo$MMHٺfo$ L)$)$ tfI$IT$H3H3SH uC|$ H=sH\$0HLHkL|$ fDADHILd$ foE1I,ID$@foHl$LIfo%Hfo-)$ )$0)$@)$P$@K4HIA2EH9݈Et'Muۿ LLLSLHl$Ld$ I$IT$H3EH3UH ID$IT$H3EH3UH ID$ IT$(H3E H3U(H ID$0IT$8H3E0H3U8H D$ t H=AAD$ t D$D$AƃAŋD$ EnAt*H+ H H5a DHE1McHH|$Lfo*HD H)$DLHt${u AMHoILfo)$ fo@)$0fo@ )$@fo@0H)$PHD$ M1Ml$@!DI,HA0FM9t.Hu߿ HHLGtHt$ I$IT$H3H3VH ID$IT$H3FH3VH ID$ IT$(H3F H3V(H ID$0IT$8H3F0H3V8H T$ t H=D$D$D\$ Et H$E1L|$ HD$8DT$ DEAEt(H H EH5a HE1HcH HHt$HH|$ HfoH f)$fo)$lD$H H\mL @Hc,H= HN<HEH@LLHZM<,H$E1H\$0MLHD$(M(fDIB4IA0GAL9Muٿ'HT$8Ht$(H|$ +$u$u$u$u$u$s$e$W$I$;$-$$$$$HHھL=DL$ EAADD$ L|$ Et sH$`1$L|$(MHH|$ H H$HHD$|$ ÃAąt'HpHmH5HE1RHcH HHHHfo)$fo@HHHD$E)$HpHD$ H AtEL|$(LH- Ld$fo5k MH- IfoE I()$0HD$ )$ fo=D fo5L )$@)$PLLLLLL|H=~諸HLLHAHt$H|$ AHHfoA)fo@HA)FHHD$0H$HD$ H PHHAEIF LLt$8L$L|$ ISfDELLLuxAEfo$HHHf$)CL9fo$f)$tLLDLAAHL$8HT$(H|$ H=U}.I$IT$I3I3VH D$ H=}H=|׶h HHھsAEL|$(Lt$8Ht$0EIINH3H3NH IFINH3FH3NH ukD$ t H=m|QD$D$4t$ EL|$(t UH\$ Hfs9fffsffofofofsfsfsfffofofofs?fs>fs9fffsfffD$/D$.GD$-GD$,GD$+GD$*GD$)GD$(GD$'GD$&G D$%G D$$G D$#G D$"G D$!GD$ GHD$8dH3%(uHHHHcHoL@GL9sUHH)HJHHHHHtLHof8HHH9uHAHHI)HAo@HHH€tf.o-fpffsffsffsfHf:f:f:f:f:f: f:@f:Ȁ{f:pf:6e1oHoN_fpffsffsffsfHf:fpҪffsffsffsfHf:f:f:f:uf:jf: _f:@T1f.oH~NfHGfpUffsffsffsfHfpffsffHf:f:f:f:f:f: wf:@lf:рa1AVAUIATUASH_HIH{t9 rHHCt&LpLhD HE1[]A\A]A^Hڸff.HII)MxL@LH L)H91tPv.tyudIHL@ɉH Lu;It}HL@H LDI~bHL@fH Lvf.I~2HD@HIL D@L L@H L5fLHL)HEA9uEI@HH)HHA@x1IHHA@HH)H91f<tIv'<tk<uHA@IHȉHH믐<uHtvA@IHHHDH~ZA@IHfHHmH~2A@AHHHH AHH IHHH4fDf.HHH)H9uYHAII)HMAxFHAHDAH)L9Iu1ɀ8H H1@f<tyv'<tC<uIDAHAHAEf<uItfHADAH{DI~JDAAIHI AI HAHII~DAHAHfAE&f.LHL)H~A8usI@HH)HH]A@x\I@HAHH)H9<Ht0@yf0@uXHHHu1ffD<vk<<uHAHI@HɉyHwuX@xLD1ɐ0H L9 Hu1<IHtrI@AHHH@H~JAHI@HffH~*AHA@HHH A@H I@Hf.LHL)H~A8 usI@HH)HH]A@x\I@HAHH)H9<Ht0@yf0@uXHHHu1ffD<vk<<uHAHI@HɉyHwuX@xLD1ɐ0H L9 Hu1<IHtrI@AHHH@H~JAHI@HffH~*AHA@HHH A@H I@Hf.LHL)HA8I@USIHH)HHHA@x7IpH7AhI)I9HHCH+H[]f.<tYv'<<ukHAhIpH7͉<uLHIpAhH7@fH~ZAhIpH7fWfefDH~*AhA@IpHHH A@H7H %fDHHH)HV9HAII)HM2AxrLALAHHL)H9 HHHAJw)HHHHJHH9HE@f<tQv/<ts<uIALAȉHLk<uItvALAHLGI~ZALAfHL$I~2ADAHIL DAL LAHLfAWAVIAUATUSHHLd$PI)M80bLPIM)LMDPAAELPLDXHL)L9]MӸL9L9 IBHED!8HEHH)HHHPHUDHH)L9DD!D8u3Mt.DL$ALL$H|$XAԅDL$HUL$LH9HBHEDDD!D8PHH)Hf |t?HLPAHPHU31H[]A\A]A^A_fDHPD@HIL D@I HPHUDu#HHPD@HUH[]A\A]A^A_@AAvpAAuI~DXLPLAEH~ZPfDHPHU=H[]A\A]A^A_@A^ItLPDXLH[]A\A]A^A_@HUH1[]A\A]A^A_I~DXLPLfAEDI~DXDPIIM DPM LPLHHH)H.9uiHAII)HMAxVLALAHL)H9HHHA8I1Lf<tIv'<tc<uIALAȉHLf<uItvALAHLkI~ZALAfHLHI~:ADAHIL DAL LAHLff.Ht;USHHfHkH߾ /'H觟HHuH[]@f.fAWAVAUIATUSHBHHH)H80IHPHIH)HHhPA΄HPHpHH)H9?HָH9H9HBI$8HH)HfDLxM<$HL)H9I}t' T$ HIET$ IM}I]I$AUH9HCI$D:3NHAH)Hspvzt=HBXLxM<$ˉAH[]A\A]A^A_fHXHLxHHH HM<$H ucHLxXM<$ u HpHPHΉ-H[]A\A]A^A_@H~ZXLxM<$fUf.H[]A\A]A^A_@uHtHPpHDH[]A\A]A^A_@I$H1[]A\A]A^A_H~pPHHH PH HPHV@H~pHPHf51S@HII)Mn80L@IM)LMOD@EL@LDHL)L9)H AMO A8SI@IHA@IpH7A@HBMI)I9HHrHIL9HtHL։HQHuHISISHL9HEHAAv8AAI~>DHL@LAEAuzItL@DHLf.<5<<u3I~A@IpȉHBH7Df.f.I~DHD@IIM D@M L@L,IVDHL@LfAE@Hk!1@IA@ApHHH ApH IpHBH7f<8IA@IpHBH7fIA@IpfHBH7f.H(fdH%(HD$1HHHD$)$H)H80HHIHHH)HHHHI xH)H9HHL99HAHIoAHqI1ALH)H9HBEHrII9IHLILω$HT$eu7IHT$HT$I9Iu$tH|$ЃHT$dH3%(H(Ðv2HxHHI ωHtqHHxI HWfD<<<uKH~%AHqȉHBI1LH)H9@fD fDfDH~xHHI fH~xHHHH HH HHI @HvAqHHH qH HqHBI19@<`H6AHqHBI1fHAHqfHBI1虘fHt+SHHH{(H߾@[W@f.USHHHtBHHC0H{HE藕H{(莕H߾@HyH]HuH[]fHATUSHt.IH @H[0HtH9kuH{HL*uH[]A\f.@HwWHHH)HƸH~4HAHQHHHHHPHHPH@øf.HvH9wHHH)HƸH~HAHQHHHHHHHHHHHHHHHHHHHPHHPH@HHH)HƸHQHAHQHHHHHHHHHHHHPHHPH@f.Hw*HHH)HHHHPHw7HHH)HdHHHPHHPH@fDHvoHHHH)HƸHHAHQHHHHHHHHHHHHPHHPH@@HHH)HƸH~4HAHQHHHHHPHHPH@øH9wHHH)HƸH~HAHQHHHHHHHHHHHHHHHHHHHPHHPH@øf.HHH)H~HHHPff.HH9r8SHH)H9r$HHHH)HHH—[fD[Ðf.AUATIUSHHIH,HuL9HHL)H9H)HLHu$1ubA}u HE8HwVHEHL)HHPHUXHUHHL)HHJHMBH[]A\A]Hw7HEHL)H~gHPHUXHEHPHU@DHLHbxHtHL)H~HPHHU@$hfDHHH)H~2HPH@HHH)H~HPH@f.HH9ATIHL)USH9H)HHHHHEHÕۉxMLcMHEHL)HHPHUXHUIHL)H~wHJDHMB[]A\8HEHL)H~HHPHUD@HEHPHU@DLLHxH}두f.AUATIUSHHHHMH?.HL)HHGHGHHL)HHPAH@H;I9HL)H9H)HH;hLcHHL)HpHPH@hHIHL)HJHHL…H @xRHcIIwjHHL)HHPHDhHMEHL)HHJDH B0H[]A\A]fM IwwHHL)HHPHDhHHPH@yXHHL)H~iHPHD@HHPH@fDLLHFHLLH&HcffDHHH)H~RHHHPHHH)H~3HPH@HHH)H~HPH@ff.II1fDHHLNIP~LIHL)Hڸ@I8yHL)H~HPLNI@IwHIHL)H~HPIDHIIHL)H~HJDIBIw7IHL)HjHPIDHIHPI@@LLL"xHf.II1fDHHLNIP~LIHL)Hڸ@I8yHL)H~HPLNI@IwHIHL)H~HPIDHIIHL)H~HJDIB Iw7IHL)HjHPIDHIHPI@@LLLxHf.HH9AUIATHUSL)HI9L)HLHAHHELۉxMLcTHEHL)HHPHUXHUIHL)H~~HJDHMDbH[]A\A]@8HEHL)H~HHPHUD@HEHPHU@DLLH xHv느f.HH9ATIHL)USH9H)HHHHHEHӎۉxMLcMHEHL)HHPHUXHUIHL)H~oHJDHMB []A\8HEHL)H~@HPHUD@HEHPHU@DLLHxHfff.HH9ATIHL)USH9H)HHHHHEHÍۉxMLcMHEHL)HHPHUXHUIHL)H~oHJDHMB[]A\8HEHL)H~@HPHUD@HEHPHU@DLLHxHfff.HH9ATIHL)USH9H)HHHHHEH賌ۉxMLcMHEHL)HHPHUXHUIHL)H~oHJDHMB[]A\8HEHL)H~@HPHUD@HEHPHU@DLLHxHfff.AVE1HAUATIUHSHHtRHIHHHH)HTuHBuBHtHCIHII)HHEI95LkHL)L9"HL@uaLEDpHEHL)HHPHUDhHUHHL)HHJHMB[]A\A]A^DHS@"|LE@xH)H}H}越HEIHPHUDp[IwCHEHL)H~SHPHUDhHEHPHU@@DE1LLHBH.fDHAAVAUATUIHSH)IHHH9Mt$HH)L9MHIIHxuaH;@hHHL)HHPHDpHIHL)HrHHH @A[]A\A]A^f.IT$C"t H;L)@pH;LH;>HIHPH@h\Iw=HHL)HHPHDpHHPH@?IvoIHHL)HHPHDpHHPHLIHPHHPHDpHHPH@fDHHL)H~9HPHDpIHHPHDpHHPH@|@fDI9wlHHL)H~HPHDpHHPHLHPHHPHLIHPHHPHDpHHPH@ HH9ATIHL)USH9H)HHHHHEHSۉxMLcMHEHL)HHPHUXHUIHL)H~wHJDHMB[]A\8HEHL)H~HHPHUD@HEHPHU@DLLHzxH}두f.AWAVIAUATIUSHMHL/H<$MtjLDH[0HtWL;{uH{LHuML9c MtH{(LLHH[]A\A]A^A_D@!HHL{LHHCLHH詅MLc uVH$Lk0HuLÄHHtaH{(RHk(Lc JDH{(7HC(/LHD$xHHC(HL$uHH~1 ISHIHdMM1AIM1HHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHM9AIIM1HHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHHHHHLHHHHM"M1HHHHLHHHHIM1HHHHLHHHHIM1HHHHLHHHHIM1HHHHLHHHHItvM1HHHHLHHHHItNM1HHHHLHHHHIt&M1HHHHLHHHH@1HHHHu[D1AWAVIAUATIUSIH1H8Hl$xHD$pLD$LL$H}H}HMImH9+HHFHHL$(HD$HIE1Hl$ H$I$I7H|$J,HLIHHI]H\$HD$LIH0HH\$ HH$L9ImIDuHhHD$(I<$HH(HL +HD$11ILH1H9@H)HI4H9HH)HHHI9uII4$H)H<$I)HD$(HcHD8H9HF@H9@II?H1HtH;LHLLH>HH $ME1~,$H$~$$I)flHflHHl$(MLfoIfo1fs fs DfAoIfoo\fofffs fffofs ffofffs fffs ffA)HM9rLHHI9t5L HHMHLLI9IvHHHHHH8[]A\A]A^A_1fDHu두HHHGInff.AVAUHATUIS1HIHHwHHH9L4THHtHH}ybH'EHEHE-H|gH H}Ht1HD$H}bHD$MHEHEHEtM)LLJ<0h1H[]A\A]A^ÐH#gHH]HE1HLEeH}MHEtLLLL)HgHEJT0H9w@HH2HHHHHpHJH9vbfHHG|fD@@f.HGLI9LGHЉHIHHH!fDIIO IEuuHI9uHt3I1LGIIOIDHI9uI9r1ÐMt MLGfJ<HL)1c1HDHtILGff.ATUSHHHCH,H9vSLCHЉHIHHufH@HƉHI40H@ueHH9u1HH|t+LCHƉHHHI40H@wH9u1[]A\fDH)L$1bLHf[]A\fDAWAVAUATIUSHHA?IHHoHtsHHHHHtfLMSHuL@1HHHH@t LtH)HHHHH9uH H9+IL I|$I)JIqHJL9AH9AIHIIHHMIIM9waHtHTHJTI)H1HMHHIHH1ffoHHI9wLHH)I9t)HH)HDHDHH9sHH)HDHDHH1aMtCI;\$sTD$ H\$(dH3%(H0[]A\DHs11HE1H9AH)HMLL9HL)HHH9rHjHSH9v8HHHu8HfDHHHuH8HSHH9wH9t3HHHHHl$HHhUff.USHHHÅyiHFHtHVH|t fH|uHuHWHtHOH|t KH|u@HuHHtH[]@Hu]H[]f.II tH9wr1HtHVLTL9Tw@rHtLDL9DvfHHHbuۉ]y@USHHHÅyiHFHtHVH|t fH|uHuHWHtHOH|t KH|u@HuHHtH[]@Hu]H[]f.II tH9wr1HtHVLTL9Tw@rHtLDL9DvfHHHbuۉ]y@USHHHÅ~iHFHtHVH|t fH|uHuHWHtHOH|t KH|u@HuHHtH[]@Hu]H[]f.II tH9wr1HtHVLTL9Tw@rHtLDL9DvfHHHbuۉ]H[]fUSHH8dH%(HD$(1HHL$ HD$H?H1HL$H)ƒ$HT$ ÅysHF1H@HtHNH|t H|u`HuHE1Ht EHHst+H\$(dH3%(uzH8[]ÐHxu܉]HH tH9wHtHFH;rvHHHHJuۉ]H9v֐H9HAH RQfUSHH8dH%(HD$(1HHL$ HD$H?H1HL$H)ƒ$HT$ ÅHF1H@Ht#HNH|t@H|u@HuHE1HtEtzHH/u]H\$(dH3%(uzH8[]ÐHH tH9wHtHFH;rvHHHH"uۉ]HtfH9vfH9HAH ZYPfAWAVIAUATIUSIHhdH%(HD$X1H9D$ HD$(HD$0D$@HD$HHD$PM9ImHt,IEH|tyfH|dHuI^1H~IFH|t H|uHuH +H']M|$L9+Mf.JM|$1LIPIT$HHA$t6L< fDIT$IFIuLHJ 8IpHuAE1AA$H|$PHtHD$HH4H|$P&LH|$0D$@HD$HHD$PHtHD$(H4pH|$0KHT$XdH3%(VHh[]A\A]A^A_ÐI^HfDHHL$PHIML$HL$MtEILHLHL$LL$HD$zQLL$LLI|$@KHL$LD$IIL$MD$M`qPHII|$Ht1tI|$JID$M|$fLl$ HLZeLt$@LLCEM|$H.MDAWAVAUATUSHxdH%(HD$h1FAHHID$ HD$(HD$0{LAIHH?I9jN,1A<III'dL{M9MLkJ1LGMH{1MH_HHA .AЉDA< AJAKH|$0Ht$D$HD$(H4H|$0ID$H\$hdH3%(Hx[]A\A]A^A_HSHkHkH1HqLHCMHHD$@Hl$`E1HD$HD$ HD$M C>rЉ@ wJHcɍp@wJHcɃa<wJHcIcHL$H9HT$H|$HD$@HD$HHl$PHD$`ZHL$3HH?HH1H)ƒHT$`L$ HD$HD$@Hl$P)HD$(E1HAHt>H|$0HHrH|HrfHVH|HHuLH1Ht @HT$Ht$H߉L$L$ IM91vLHIH{Ht1zH{FHCLk*HɸHT$HHHD$Ht$@Ht$Hl$PihT@LH /I9&HHT$0H<2H9|4` w @HH|H9|sHT$Ht$H߉L$>L$ى fAHAwAHH HHH-=1hAHfHT$Ht$H߉L$C5DJHHH{Ht1H{DEHCHkSfDL{JHHLCMt:ILHLLD$HD$ KLD$LLZH{DHL$LkHKM@I9,ff.I9L@H #jA>-6KFfDATUSH dH%(H$ 1FdH1H6HAH HIHFHH!ʁ t€DHHHD@HH)H= HHMc@H9HvBxDGЉA wwHcDAAwwHcaHw9WHcL9rDHH$ dH3%(H []A\I9wfHP  t#H XHDJfH1HpLHH뿸uka/EDf.AWAVAUATUSHHxHQdH%(H$h1Ht.IHIIIH|H?uHH H|u8HuH$hdH3%(KHx[]A\A]A^A_fA$tHCL$PDŽ$HDŽ$HDŽ$DŽ$HDŽ$HHDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$L$ t&HsH|tH|Hu1H?tfH|HuH$HH|$/H$Ht"H$H4-H$@H$DŽ$HDŽ$HDŽ$Ht"H$H4H$N@H$DŽ$HDŽ$HDŽ$Ht"H$H4H$?H$DŽ$HDŽ$HDŽ$Ht"H$H47H$?LDŽ$HDŽ$HDŽ$HDH?rfDHH fH9]rOHRHSHtH9t>v.HtH9t"rHuH Mt1IWHIoH1HvBIGHAMtHL1vH$LHHD$HCDŽ$DŽ$HhH'H$H9HAH$H1HAH$HH$DŽ$HYH$HHH$HD$H<tH<uHuH 1HHHH@tHtHHD$ ?H?aH$H|$HD$8HHD$(H+D$HD$@HHHD$0fHT$@HHHt$H|$fTH$H|$HT$HHHtĉf1BHHIHt15IHH$Ht1HD$xH$s8HD$xH$HDŽ$N1uHHI;t?1L$L$LL$xqL$L$HLL$xHHEIL|$`l$\H\$hLd$pMt"H$LA$AMHt$ H|$Ht$L$H$HH$0LHDŽ$HDŽ$0HDŽ$8H$@dA1VHD$h1a?H)HT$ HHt$8H$LHT$@H(H$@Ht$DŽ$0HDŽ$8H$HHD$(H|$HHLdLL_HD$LHH4Ht$8H|$HDŽ$HDŽ$0HDŽ$8H$@Ht$@xHl$(HHt$L LL H|$LHH$Hm뢐f.AWAVAUATUSHdH%(H$1FHT$LD$0IHO1AHteHHWHuH2A@DHtH4HtHL@@1HHHH@t HtLH)AHHL91?D$@HD$HHD$PH\$uHH[I-ALGMJ4E1HY sDHʃLSHSHWH2H0AAIZHcABARHWH2H(AALSHcBSHWT2AAIZHcABARHWH2HAALSHcBSHWH2HAAIZHcABARHWH2HAALSHcBSHWH2IZHcAAARHIHWH2HH8IAAEnHeHH0IAHH(IAHH AɁAI7HHIAHHIAHHAɁIt E1ɅIDAHDHD$@HHHD$D$L|$PMtHD$HLH4HH|$P1H$dH3<%(D$HĘ[]A\A]A^A_ÐHH+\$HD$0D$HfIIOID\$@ALMH$IcE1NT#H\$8LHD$(IHD$`Hl$MMHD$ AFHt$HHH|$PE1LDHLH HH H 1IH H 1IHuEIPHD$(HL$ 1HHLL$L$D$`HD$hHD$pLL$wI DAA7A$HD$HHHT$PHu?Ht2H|tD\$@Et II9ID$IH\$8ILLH8N3HD$0AIL+D$LfHD$PHL$ 1HHHL$D$`HD$hHD$HD$(HD$pT$B0fDHtLH)IDHD$(HL$ 1HHL$D$`HD$hHD$pcu0D$@AL|$PD$H|$0D$HD$L|$PD$H1AWAVAUATUSH dH%(H$ 1B@Hl$1II̹6IHLD$HH깲 LXAML\0IHH!%tDHSHDHH)MD D tpLLL8L9uxHLHH8H9u\H$ dH3%(Du^H []A\A]A^A_@E1L-HH5 HL15DAA/H8dH%(HD$(1HD$ HT$ H$HD$HD$HL$(dH3 %(uH8;/f.AWAVAUATUSHHxHQdH%(H$h1Ht.IHIIIH|H?uHH H|u8HuH$hdH3%(KHx[]A\A]A^A_fA$tHCL$PDŽ$HDŽ$HDŽ$DŽ$HDŽ$HHDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$L$ t&HsH|tH|Hu1H?tfH|HuH$HH|$/H$Ht"H$H4=H$*H$DŽ$HDŽ$HDŽ$Ht"H$H4H$^*H$DŽ$HDŽ$HDŽ$Ht"H$H4虱H$ *H$DŽ$HDŽ$HDŽ$Ht"H$H4GH$)LDŽ$HDŽ$HDŽ$ HDH?rfDHH fH9]rOHRHSHtH9t>v.HtH9t"rHuH Mt1IWHIoH1H,IGHAMtHLĸ1vH$LHHD$蘸HCDŽ$DŽ$HhH'H$H9HAH$H1H+H$HH$DŽ$HYH$HHH$HD$H<tH<uHuH 1HHHH@tHtHHD$ ?H?aH$H|$HD$8HHD$(H+D$HD$@HHHD$0fHT$@HHHt$H|$vTH$H|$HT$HHHtĉfA,HHIHt1EI&IGIo@HHT$+HHtL$MtQHT$LHLD$ HD$L LLL$(g,LL$(LD$ LL貭H$%&HL$H$H$HY+HHGH$Ht1YH$%HDŽ$H$q*HIL$MtCHLHHLL$ HD$+LL$ HLլH$H%LD$HDŽ$L$#HD$ ?Ht$ H|$)Ht$ H|$H$HHD$Td'Ht$0H|$HD$H\$hl$\L|$`Ld$pH4HkHkHt$0Ht$8H4H|$PHD$HH$HHHD$8H$0HD$@Ht$H9t$(:L$H$H|$0L$MdMH8HD$PI4$H,H9M<(IH|$(IDH$PIH$XI$L$H$`IL$H$Ht$0HL2HH2LHt$8HPH$HT$@H(H$@LDŽ$0HDŽ$8H$HFLLL$I,(H$HtQH$H1&H|$H$HDŽ$)1H$Ht$0'(HH$Ht1HD$xH$"HD$xH$HDŽ$N1uHHI;t?1L$L$LL$xjL$L$HLL$xHHEIL|$`l$\H\$hLd$pMt"H$LޱA$AMHt$ H|$Ht$L$薱H$HH$0LHDŽ$HDŽ$0HDŽ$8H$@ dA1VHD$h1a?H)HT$ HHt$8H$LHT$@H(H$@Ht$DŽ$0HDŽ$8H$HHD$(H|$HHLdLLoHD$LHHDHt$8H|$HDŽ$HDŽ$0HDŽ$8H$@Ht$@xHl$(HHt$LLL H|$LHH$Hm뢐f.H8dH%(HD$(1HHD$H?H1HL$ H)D$ $HD$ HHD$HT$(dH3%(uH8!f.HBHt)HJH|tfDH|tHuATUHSHHHH1tHKHt9HsHTHuEHH|u8HuHHHHHy[1]A\@D#EyދEAąy]HtfDH|uHuHEHtHUH|t KH|u@HuHHH\t[]A\HHH2uD#fDHH tH9rw/HtHDH9Drv@HDH9DwrHuHHHuAD#D Df.HIHtxHtZLNMtyLV1KLH HH H 1IH H 1IIuԋy I)HIEH1fDHFHH1H1fD1ȸøAWAVAUATUSH8HidH%(H$(1Ht$Ht,MLAIIII|uNH I|u@Hu$H$(dH3%($bH8[]A\A]A^A_A~I8@tIRHIJH|HfDH|HuHHu@H6L MtHH^@1HHHH@t LtH)HH HHuDHM MtHLF@1HHHH@t ItLH)H HD?HIDŽ$HDŽ$HDŽ$DŽ$HHDŽ$HDŽ$HDŽ$HDŽ$HDŽ$I)HIIHI)HIIHI)L1IH)IL$ HLHL$ HHIBuf.HH4HtHHz@1HHHH@t HtHH)HkHHOHHHHHHHD$HHHMIIHHD$(HHHHD$A@AoHD$AD$(HD$HH'"IWE1H9L9HH'TL$L9uHD$D$8MI~AoIF)$H$LL$LLT$0L$LL$LT$0I|$LLL\$ $L\$LT$0LL$ H$MCIKH$LT$HH$H$L\$@IHL$LD$ LL$0H$H$HD$XI|$(U$菝HD$LHD$AXAYL\$@LT$HqI9v[H[I,H}HHEHHH4H}EHEHEL9rH$HHt"H$@H4ӞH$HFH$DŽ$8HDŽ$@HDŽ$HHt"H$H4聞H$H$DŽ$HDŽ$HDŽ$Ht"H$H4/H$MDŽ$HDŽ$HDŽ$t I~H$HH$H4ɝH$<HL\$@LT$8LL$0H$pHHH$LL$0LT$8L\$@4MGMtbL LHL\$HLT$@LLL$8LD$0H$LL$8LD$0LL%IL$@L\$HLT$@H $L9IoIOTHL\$0L$LL$8HHL$HL$L\$0Mt_LL$8LHL\$HLT$@LD$0H$ILLL$8)LL$8LD$0LLtH$HL\$HLT$@H $H$@H$H@L @IA@%fH0@^HD$! A@D$(HD$fDHD$A D$(HD$fDHD$ AD$(HD$H$Ht$L\$@LT$0H$DŽ$Hl$L\$@LT$0$HEHEHL9HL\$0L$LL$8HHtL$L$L\$0Mt_LL$8LHL\$HLT$@LD$0H$ILLL$8CLL$8LD$0LL莚H$L\$HLT$@H $H$H$H$HH$H1HL$LT$@H$BL$H$HHIsL\$0DŽ$H?$L\$0LHH$qML\$0LT$@tHEfoEIFA^D$<L\$0L$THH+H$L$L\$0Ht1KH$L\$0L$HDŽ$H$Ht$I|$L\$@LT$0~$LT$0L\$@H$IL\$PLT$HHDŽ$H$HD$hH$H$H|$@DŽ$H$HDŽ$HD$pU$LL$@LD$0HL$p^_H|$LT$HL\$P|IjH$1H\$xHD$HD$PHD$HHL$LHD$PH#HHD$PHEHHHHƃH u HHD$L$(HD$)HH t$HH9D$uHT$XIGH$HD$`1HHHT$H$t$WHH|$PLL$@LD$0HL$Ht$pH[Y^H9\$wHD$HH$t$$H|$PLL$@H@LD$0HL$IHPHpH$XZHD$HD$HHt_HHD$P??1HD$XIwHPWH|$PLL$@LD$0HL$H蝔H$AXAYkIGIL$HH\$xHD$`HD$XHH|$HD$tsH\$(LT$PHLMt$WH|$PLL$@LD$0HL$Ht$pHHd$XHD$XAZA[LHH9\$H$uH\$(LT$PMIHD$hL\$LT$HDŽ$DŽ$HDŽ$H$HD$pHpHPHD$XHPWLL$@LD$0HL$H|$PwY^|$8LT$L\$IzIBD$8LLLAc$t$$HU(H|$PLL$@Hu LD$0HL$HH$AXAYH9\$H[LT$`IICHHT$HHpJHT$HL\$PLT$`t $:It$HL$LT$xuHD$HT$HLT$xL$HHD$`HBHD$HHBHD$P1L$L$HD$xU$H|$XLL$@LD$0HL$Ht$`H H$ZYHH;D$`L$L$uHD$I9HkID$(H\$HLT$`LHD$PLbHuHu_HD$XH}It$ HHP$LL$@LD$0HL$HT$`iHD$(HD$(AZA[L9sHCHHpՙtH\$HILT$`H\$HDAUATIUSIHXH\$D$HD$dH%(HD$H1HHD$ D$0HD$8HD$@/H|$ Ht$D$ HD$H4臒H|$ D$ H|$@D$HD$HD$ Ht$D$ HD$8H4?H|$@ D$ H\$HdH3%(HX[]A\A]fHl$0LH耚QLL$M{LT$ 1E1K4Hy@HHH95)HsLl$8Mt@LT$@1E1K@f.AWAVAUATUSHH(D/dH%(H$1H$Ht$HT$EHL$D$PHD$XHD$`D$pHD$xHDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$HDŽ$DŽ$HDŽ$H$ HGHt$HWH|tH|HuLd$PH$HLƯ@H|$`HtHD$XH4 H|$`H$D$PHD$XHD$`HtHD$xH4ɋH$<H$D$pHD$xHDŽ$Ht"H$H4}H$H$DŽ$HDŽ$HDŽ$Ht"H$H4+H$H$DŽ$HDŽ$HDŽ$Ht"H$H4يH$LH$dH3%(H([]A\A]A^A_ÐHLd$PH$HLΔLLD$XDl$PMLT$`11I Hr@III9;D)HsHD$pLHHD$ 蛒H|$ L脦H|$H$L|$8Ll$L|$L$HD$0HD$@H$l$LHD$( HCLLLH4>L$H|$XM@LH$HuJf.H6H HtHLN@1HHHH@t HtLH)1HtaHHD$`HufDHHH$P@Ht$@=Ld$`LLL L$LL]H$LHHD$(;H$LHHD$ H$HHD$eH$HHD$薂|L$ L|bH$@HHD$>H$HD$0H$`HD$8H$LVH$H$uwH|$H|$tH:{HH2H6"GH|$HT$(HeKH|$LHKS,H$ulH|$ `H$0GH$P6L'H|$tH\$ LHCNHLL蝤H|$LH胤iHT$H|$HgMHD$0Ht$8LHDŽ$DŽ$`HDŽ$hH$p ~HD$0Ht$8LHDŽ$DŽ$`HDŽ$hH$p}yRLLLɢtHT$(LL订H|$LH蔣uLL x\LLLhtMH|$ LHM3HT$LL3HT$H|$LHOSH@LGdH%(HD$81HGD$ LD$0HHD$(t&MTHMt=DI|HuH\$8dH3%(H@[HMv^Mt hI|u`HuAtH\$ HL$HT$t$ H|Hct$ HT$HL$t[DxIiDHw1IU@HI|\HuMf#Df.SH0LGdH%(HD$(1HGD$LD$ HHD$t&MTHMt=DI|HuHL$(dH3 %(H0[HMvPMt XI|uPHuAtH\$HT$H4$H{H4$HT$tVDIwHw1Ie@HI|lHuMvHH((D@AWAVAUATUSHdH%(H$1HFLD$H=1H@?HIHHID$PHD$XHD$`PHHD$(wHQHD$(.L$IvT$Id3ID$Ld$@HD$ HHHD$H)HD$8HD$pHD$0fDH9I~HtH%xI~HAIFIFHI~Ht1HD$HwI~FHD$HIFIF1HIvLH|$HAAׅINHD$ HLM9(H;l$HHHHT$ZIvD$pH$HHt$xH|HH[HH|tH H|4HuHHfDH|,HuuH|$0xIvH9MHHT$@IFDHHD$(H}HD$(HHD$(HQHD$(HHD$(jHHD$( THHD$(>HH H(HD$(#HHv~HHHH1fH|$`Ht$D$HD$XH4`uH|$`D$H$dH3%(HĨ[]A\A]A^A_Hsf.HHI^IFLHHAH|$AׅNINHD$ LI9MLHfH0H:HHHHHxHrH9vf.Ht$8LIN HHD$(H]HD$(HHD$( HH HHD$(uDHL$Ht$(LH|$0YJHHMFM1I@J|H HH H HIHHRHH)H H HIHHRHH)IuAPHpHH\$PLH{H赏L$Hl$pvHLLHDŽ$ D$pHD$xL$+cHHHHDŽ$D$pHD$xL$(IFtLwtuHD$`gH]tNHDŽ$H$HT$pLLD$pHD$xH$jHt$H)HtHDŽ$HL$Ht$(LLATHL$Ht$(LH$7'fAWAVAUATUSHdH%(H$1D$ HD$(HD$0D$@HD$HHD$PD$`HD$hHD$pDŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$DŽ$HDŽ$HDŽ$qH*L8AHD$(HD$0H1HHA<WЉDO AWHcAH HHHu$D$ HD$(HD$0 H$LLLHHD$&H|$H5=oH$H5>HoD$Ht$L)H|$HjE1LLLLH|$H5>3o}Ht$LLLLFPH|$H5>n5Ht$Lԉ~L%?Ic4$L{Ll$Ict$L{LLLIct$HD$(H|$0HH?HH1H)уH$H H|HfDH591=Ht$LH=v(l$+H59Ht$LuH|$H谈uH=\@E1LLLLLʼnH|$H5<omH5b91rHt$LE5H=LLLc)H|$H5<mJH591 Ht$LއH=jH5 91HH9w`H9r2L$ ~tdyt[HtHH9tw rsHمu7D$I D$uO1L$ HHuɅT$H5S81*H=H|$0?fDH)tA11@HDH9rff.HtUHtPD7II)H9IL Ht 1ҐD1I9AHA H9u%øH)Hv%fHH9rff.II)Iv&HfDHL9rDD7HtLHtGL7IHI)H9L Ht1I9$H H9u%øfH9sH)HH1fDHt HtH21øf.HtaHt\E11HHAt?H<7 1DLM L $7A1HuEu 1fDø@Ht?Ht:E11HHt&D|7 1HI HLu1øfD2b2u? 2Hc2tH 2fDHHPua2H`c2Df.H2Ht%;=2tH29:t HHBHuf.HATUStDH2Ht0IH-q2HH]HtH{LuH[]A\1Df.H12Ht,H 2HHAHtL@(A98u9pu9PufDHHGPHH1HH)XHHt+SHHPHt HH@(PXH߾X[dfD@f.HtsUSHHH1HHGHGHHHH)XHHF(PPHHCPt41}H+uHHSHHSH[]fDøf.HHt%@tWO uH@(HP`@@9PtDDHEAAvӅuH@(HP`Hf.HHHATUSH@HIt8Ht"Hu=1[]A\fDPH9r8HHuH}P1Lt̸HM8s%uxt A$U8u|H]Hf.I$HE8ITHTHU@HH)э I)̃rÃ1ɉ΃I<49H<2rCfDA$U8ADD넉ADfDrff.H?t HG01øfHHt{ytB19It fATIU1S HHHw8HP t)[]A\@G LW8HOHHPIIL҉q H{PLH[]A\ AWAVAUATMUSHLM#Ah IEHIAHHIIԃtiA8IL9I@(Hs H{PHK0AWMLC8LP^_toH[]A\A]A^A_@H9I@(ImLw HPLH@H[]A\A]A^A_ I@(H{PLLLP8uMeH[]A\A]A^A_ÐIUHPH[LHL]A\A]A^A_@S HC0t-u>HH)L9v3H| LLMLc01fHH)H{I9vH!M1LHHHus u7H{t0HI)H{ HK4&HL$HL$HK0Ms HHK8MH{PMLH@(PMe{fDH0uH1HH#SfDIUHPH[LHL]A\A]A^A_l @I@(HK8HS0H{PMMLP bfD1fIH| LI)LLT$HHK8s H{PMLC HH@(PLT$ImIHC0MM)~I9e-f.SfDI@(HHK8HS0H{PMAWLC LP(ZYH{0u(I@(HK8s H{PMMLP0HfHHWHHDAAvp tkAUATUSHDCAvCtX Iw HHHW0tZH H9HHH1[]A\A]D1DH0%H[]A\A]HOHtgHwHHupLk HcLHs P H@(HK8H{PMMPuK HuK1HHCtr HHL[]A\A]H%lb@Lo f1HtJ HMCø3f.HHt(xu"wH2HcHfDfHHGHHG1HHGHG1f.H9HGH^HG1HHGHHG1HHGHHG1HHt8 u2yt19ItHuHPHP f.USHHdH%(HD$81HH>O 3xHH8It1HL$8dH3 %(HH[]ÐHuHPHt$ 'uofD$ fofsffofsffofsffofsf)$$woH~HPHt$ LHAHuhofD$ fofsffofsffofsffofsf)D$D$o@AD$ 2HtS2T$! HtS2T$" HtS2T$# HtS2T$$ HtS2T$% HS2T$& HkS2T$' HWS2T$( H CS 2T$) H /S 2T$* H S 2T$+ H S 2T$, H S 2T$- HT$.2S AWAVAUATMUSH(LdH%(HD$1Ll$`MCHHA@HIIMA8HHAh HC0IEHAH5A8IM9QI@(Hs H{PHK0AVMLC8LP^_#Mef.A@H9rlA8HHJH{P1LL$XuIHLL$t4HK8s5@tAS89HkHMIHC8ITHTHS@HH)эD I)ʃr1ɉ΃I<29H<2rI9I@(MeLs H{PLPu#MeHT$K4&Hu HT$IUHt$dH34%(H([]A\A]A^A_DS HC0 HH)H{I9HMMw1LHHHus u?H{t8HI)H{ HK4'LL$H $ H $HK0MLL$$s HHK8MH{PLH@(P$MeMeH{0j1LHHTH{PMeLLLDHH)I9H| LLHLc0MelH{PMeLLLB랃I@(HK8HS0H{PMMLP CfD.fDAS8ADDjfIH| LI)LL$HHK8s H{PMLC HH@(PL$ImM .HC0MM) uDI@(HHK8HS0H{PMAVLC LP(ZYtLADfD t4I@(H{PLLLP8.$H{0I@(HK8s H{PMMLP0 ff.AUATUSHL\$(Ll$0Ld$8Hl$@H\$HDPAtTA8I@H9HM$HPHHl$0Ll$(L[]A\A]xM$HPLL$0LD$(IHl$HH\$@ILl$8HL[]A\A]M$HPLL$(H\$@MHl$8IH[]A\A]HL[]A\A]@HHIHt$DPAtWA8I@H9H|$0HD$ HPLH0t$AQLL$8 ZYt:HÐHD$ HPH0t$AQt$@Mt$@IHLH uƸDHD$ HPH0t$0t$0t$(AQMIHLH tHpfD`fDAUATUSHHD$0H\$PL\$8Hl$HL$L;d$@IHH7M,DfAtLAt~>IvL9HHPHEHAUASSZYH]H[]A\A]fHHPHEAUSASAQIAPHMHH0HPHEHSAUASAQMILH ffyfDefDATUSHD$ L\$@L9L)H;D$0HMIM HktS;IsL9IH\$8HPHHt$(ARZYt:[]A\DH\$8HPHHt$(ARASAQMILyH uƸfH\$8HPHHASAQt$8MARILH t[]A\[]A\fDdf.@SHH[@f.S0HHtH0H[Ðf.u(Hu HfDff.SHH[^@f.SHHtHH[Ðf.u(Hu HfDff.Ht HDSHH[@f.SHHtH@H[Ðf.+f.f.&f.HH"D+f.f.SHH[@f.S@HHtH@H[Ðf.f.kf.+ f.HHDSHH[n@f.HXHtHHD$HD$HÐHHSHH[@f.H=HtHHD$HD$HÐHHSHH[@f.SHHtH蠪H[Ðf.髸f.˪f.f.鋿f.{f.Kf.SHWH[@f.SH HHtHH[Ðf.+f.Kf.+f.f.˚f.SHsH[>@f.SHHtHrH[Ðf.uHr1Hf.}f.H@ HtHHD$+HD$HÐf.[f.tuDf1fSHH[.@f.S pHHtH@H[Ðf.f. f.Kf.kf.[f.f.[f.HtSHrH[iff.@AWAVMAUATUSHHdH%(H$81IAH|$L$,t$(HT$ IIHHH|$t*HHHtEHHHHHuHHD$1ɸ? Dt Hs 0Hl$0HMQL H1jHD$(L$2fAVAUAATUISHHL$Xt@)$`)$p)$)$)$)$)$)$dH%(H$(1HtHHtHx t9-Y>2}+H$(dH3%(H[]A\A]A^@H$Lt$ LL$HD$H$0LD$(D$ 0HD$=wHcЃHD D HMDLHx(P Wf.AVAUATUSHdH%(H$1Ht)HHHtHx t95]=2| Au,@H$dH3%(ubH[]A\A]A^DDIIAͺPAQML{L1ĸHLMDHx(P XZFfDAWAVAUATUSHXdH%(H$H1Ht$H$L$ tHHHtHx t95<2}1H$HdH3%(<HX[]A\A]A^A_H\$@HM̋$MLHP1HEL$IHT$t$Hx(P fD$@)D$0XZH$^HD$ E1Hl$E1ALHD$IvLMH<+H)AMtVHl$L H1I=HD$t$I؋L$ H$HHx(P fEH߾)E1LHEH1LH<+H)G AD1΁1A1D11D1AAA1A3333BD1L11111⪪11AƋHAD3w1‰E?A?ALC3 AAA?B3LAA?A?B3 A3 D?A3 DAA??A3 C3 Dw1A1DEA?3O?TC3T1DAA??3ʃ?C3A3?A3??A3A3H9|$H|$1⪪11Ή111։133331ȍ1111ȉ1с11ȈwWgGGЈOG1[]A\A]A^A_Df.3AWAVIAUIATMUHSLtyHt_@HLLM<$IJE0E0CE0CE0CE0CE0CE0CE0CHIL}u[1]A\A]A^A_HtA$HH2ELIHCAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECsHCIHEy[1]A\A]A^A_ø@f.AWAVIAUATL-USHL%H- L H|$>L vHT$L ω111׉1111ׁ333311Ɖ1с11HH 1᪪11ADDA8IA3HD1Aσ?A?ADC3AAA?B3DAA?A?C3A3?3??A3H= 31A@A3H1ЉA?A?DC3DAAD1AA?A?C3A3σ?A3DAσ?A3D??A3H= 3L9AHL$ALDD>H3ND1ljA΃?A?ATC3AAA?B3TAA?A?C3A3?3??A3H=| 31ЋV3N1‰A?A?TC3TD1AA?A?C3AA3A?A3DAȃ?A3Dǃ??A3H= 3L9AL|$AIǀD>H3ND1ljA΃?A?ADC3AAA?B3DAA?A?C3A3?3??A3H=l 31‹F3N1ЉA?A?DC3DD1AA?A?C3AA3A?A3DAȃ?A3Dǃ??A3H= 3I9Aȉ1ց檪11ʉ1Ɓ11։133331ȍ1Ht$111ȉ1с11ȈvVfFFЈNF1[]A\A]A^A_3AWAVIAUIATMUHSLtyHt_@HLLM<$I*E0E0CE0CE0CE0CE0CE0CE0CHIL}u[1]A\A]A^A_HtA$HH2ELIHCAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECAD$2ECSHCIHEy[1]A\A]A^A_ø@f.AWAVAUATE1USHL|$@L$|$8dH%(H$1LL$H0LH\$8DD$t8L; H8 MH5 LEk813 H AHH$H DHcHH$@H^ LHcH#dLLLuD$HcEpH HH9$pDL$8E"AADD$8ED$<D$LLLg(HT$(M$LLLiHD$D$tTADLLLBgM$LLL8LLLgHt$ LH8LHHfI$HT$(M$LHH%iLHH?8LHHfmH HL$Ht$HHH%HAEA3M$LM$LAbHAHGA#躇f.Ht{SHHHHHHH{hH{PH{8H{ H{~H߾[ @f.AWAVAUATIUSHHhHl$ HT$dH%(HD$X1H0Ht$HuhLLd$Ld$HT$0LaDHj:E}HL$XdH3 %(DHh[]A\A]A^A_A|4uHH H5 HD$E1E1LHPG0AEXZA/H9HzHOHCH7H+HH{hH{P H{8H{ H{H Ll$Ll$LsLLLAt%A3Ht$(Ld$ Ht$|@HS LLAuL9l$tHHD$@HH$JH$LL[H<$AOEt/E$KHt$L{HH8:L9l$tHA8輄ff.AVIAUHATH5fUSFH1HźHˉH裇HIMl$11H襉LHHHHL艌I9HuQ|H5n HB#HHLMDLHLHN[]A\A]A^+LH߽H#ӐfH`HfUSHdH%(H$1HHHH5 H1@HdHXHLH@H4H{h+H{P"H{8H{ H{HH$dH3 %(ufH[]H5 gH5 HStH= 輀'H= 褀:f.f.AVAUIATIUSLLHHMou HHKPHjMMLHcZY[]A\A]A^ÐAVAUIATUHSIIH`H\$LD$L $dH%(HD$X1H"5HLLjLL$HLD$HbZYt)H6HT$XdH3%(u6H`[]A\A]A^fHVuHLD@SH4H H4HXs4H H[4HO4HP ǃ[Hu HfDHtkSHH5H5HP H5H H5HX5H[Z f.@f.AWAVAUATUSH8DdH%(HD$(1HLIHILLLLL$L$HlL$LL$t&H|$(dH3<%(H8[]A\A]A^A_HHHKPLHHD$jH`ZYuHt$LHH3]uHD$H4$HL$ MDHLDI)+ZmHT$ HT$I[P~ATUHSIHHH+H|$dH%(HD$1"\tHL$dH3 %(uEH[]A\Dt$Lu HH+ I$XHLWDT~@USHHH6tT9t_u{HH5t H[]DHHH[]_ T$ OT$ tHHHX[]5fAWAVAUATUSHHDLHt$IILLLL $LHsjL $tH[]A\A]A^A_@HLHKPjLILHL\$Q^ZYuL$HL$HMMDH[]A\A]A^A_LXfUSHHHHH4$HXHdH%(HD$1UuH$H)H9ӺEHL$dH3 %(uH[]l|ff.AWAVAUATUSHhdH%(HD$X1H9HHLL$L$Hl$IIIH/HHXHjLL$HLD$H ]ZYt:H$/1$Ht$XdH34%(Hh[]A\A]A^A_fHQLHLH$0$uLI9r_H1HߨHHI$.I$LLtYD{JfDHh0*zAWAVAUATUSHHL$Hl$0Ld$PdH%(H$1LHt$HT$HL$ L$Lt$pLL$L$.HLLL O FH8H<$yfL$/H^LVLNLF$H$dH3%(H[]A\A]A^A_f.HH<$HHD$(xzH|$acHt$(H|$JLHHL$HHt$HHH9HFHHL$HL$HHH9vH)HHHt$(HxHT$(HH*%HT$(Ht$LxLHLz(HT$(LLVyH4$LLK(bHT$(LLVJHHKPLjLL$0MLHZZY LM HT$(LLAVH4$LxAWAVAUATUSHH$PHT$PHL$8LD$@LL$HH$H$XHD$H$`HD$H$hHD$dH%(H$1 f ]HHLIHϾ LH|$8LL$Ld$`L*L?H$HHD$(*H$HHD$0HCPD$X HD$ HL$H$LHcHLLjLL$(HLD$ HL$0WZYLLLTut1L:unuL$+LH|$(H|$0$H$dH3 %(H[]A\A]A^A_@HHL$HHt$@H|$(HHH9HGHHxbHH4H9`H|$(LixH|$(LH!HT$HL$HHt$0bHl$PHT$8LH%HD$(HHHh HD$(HT$0HH$HT$0LL$LLLRqLLHtYHT$(HHe$?LHHR'1HD$\ET$\ l$XfHl$(H)HLHtDAWAVAUATIUSHH$8Ht$ HT$(H $LD$LL$HD$H$@HD$0dH%(H$1H$0HX@HHHl$@Ld$`IL$`HL讽H<$HLtCL$H$H$dH3 %(H[]A\A]A^A_@IHt$HHPHD$HH9HHGHHL$8 uHL$8IH4H9vH)H-ZIHHHT$8^HT$8xHH'I4HHHLLHLHD$HtMt$0PLAT51LL$0LD$(HL$ HT$HHt$@H fDfDH$HHD$+HH\$LLH%H5I HAD$0tHaD$0MH\$H<LSPATPLL$0LD$(HL$ HT$HHt$@vH߉D$ H $Yqf t t1f.HHD$LT$ARPARPH(fHjjD$(PH(ff.AWAVAUATUSHHL$Hl$0Ld$PdH%(H$1LHt$HT$HL$ L$Lt$pLL$L$ $HLLLz O FH8H<$yfL$v%HNLFL>L6$H$dH3%(H[]A\A]A^A_f.HH<$HHD$(hzH|$QcHt$(H|$:LHHL$HHt$HHH9HFHHL$ HL$HHH9vH)HHHt$(HxHT$(HHHT$(Ht$LnLHLjHT$(LLLyH4$LL;bHT$(LLLJHHKPLjLL$0MLHPZY LC HT$(LL1LH4$LmAWAVAUATUSHHXH$Ll$PLd$pHT$HL$LLD$0LL$8HD$(H$HD$@dH%(H$H1LHHHH$HHD$ wH$L$H_H$HHD$jH$HLw AtPH|$趿H>L6L.H$HdH3 %(DHX[]A\A]A^A_fHHt$HHPHD$HH9HGHT$H3AxLD$HHJ4H9vH)H AILHLxLHHeAH$HI4z AL<$Ht$ LH|$MLCHD$(Ht$@PHt$5_1LLL$8LD$0LHH AH|$VHEILLHH$hAoLLHOxkIcHLH,HHA;0LHx5IcHH$HH|$0E1HHnHD$8H(DAADH$0HH$LL<$Ht$ LLH5 LL<$ AtH<$-hH4$HHLLPt$PLL$8LD$0IH H<$A/jDf.AWAVAUATUSHHXH$Ll$PLd$pHT$HL$LLD$0LL$8HD$(H$HD$@dH%(H$H1LHHHH$5HHD$ wH$L$HH$HHD$蚳H$HLAtPH|$HnLfL^H$HdH3 %(DHX[]A\A]A^A_fHHt$HHPHD$HH9HGHT$HcAxLD$HHJ4H9vH)H AILHL7 xLHHAH$HI4AL<$Ht$ LH|$MLsHD$(Ht$@PHt$51LLL$8LD$0LHH AH|$膺HEILLHH$AoLLHxkIcHLH,HH$A;0LHx5IcHH$HH|$0E1HHjHD$8H(DAADH$0HH$,LL<$Ht$ LL%H5I LL<$=AtH<$]hHA4$HHLLPt$PLL$8LD$0yH H<$A_fDf.AWAVAUATUSHDHHLl$@Ld$`Ht$dH%(H$81LHT$HL$(LD$0 LHHHH$~HHD$ H$L$HH$HHD$H$HLAtQH|$/HLLH$8dH3 %(DXHH[]A\A]A^A_HHt$HHPHD$HH9HGHT$8AwLD$8HJ4H9vH)HLAHLHLxLHHAH$HI4AL<$Ht$ LH|$ML軲H$ HH$藮LL<$Ht$ LL萲H5 LL<$訮AtH<$ȶH4$HLLHPt$PLL$8LD$0H H<$A聶H|$wHE?ILLHH$ALLHpxlIcHLH,HHA0LHx6IcHH$HH|$(E1HHfHD$0H(fDAA~bAWAVIAUATUSJHhHl$ Ld$@H4$dH%(HD$X1HHT$HL$Ll$LHT$0HL)u'HT$HT$AH9uHHL袸t>DHLHt$XdH34%(Du[Hh[]A\A]A^A_DLHLRuHT$H4$IMILAuH;\$DEa@AWAVIAUATUSJHhHl$ Ld$@H4$dH%(HD$X1HHT$HL$Ll$LHT$0HL u'HT$HT$AH9uHHL肷t>DHoLgHt$XdH34%(Du[Hh[]A\A]A^A_DLHL2uHT$H4$IMILAuH9\$DE`@ATUISHH}t []A\DHHMHH[]A\QUSHHHt#HtH߉D$ D$ H[]HHuHHukf.Ht fDf.@kf.HATUHSHHHH H9HHAt.D[]A\fD1HtHQ1IuA[IIuHxeA@IIHx0ZHD$Hl$ HHHD$H|$0Hl$PH|$HHD$pHH$HD$ LHHp0HD$A'H|$HH<$AoXDf.AWAVIAUATIUSImA IH8dH%(HD$(1HH\$Ht$HHHH$*H4$LLHMt!HKHHyAHm~H|$HHIuMLt$LLu9I0HHj1LLuLLu HD1@H߉$}HL$(dH3 %($uH8[]A\A]A^A_øWDf.AVAUIATUHSH^01HPHdH%(HD$H1u$HL$HdH3 %("HP[]A\A]A^Ld$Lt$0LLIUHLVtLD$ LD$ 땐LLLuLLuLHHH&1uLHZuHLH1HHyLH)fLHHH1{HLH5HH1{UAWAVIAUATIUSIImHhdH%(HD$X1HH\$ Ld$@Ht$HHHHD$ZLRD$ Ht$LLHJt fDHkHHy܃l$H~HD$HHh0HHaLHHHLH}10utLLueH|$LHU1HuIH|$Lu8HLLLH$1GuHt$LLHH,@H߉D$ f)$t*Hfo 4 f)$uf. )$HHH9HFtHH L\$PHH< HHpL9s&H| HHHL9sH HHLLD$`HD$PIIDHBHD$HD$D$@HHD$(_@H\$HLt$X9fH|$8HLH̓HLD$^D$HD$8HD$0HHD$H|$ LHD$ IuHxHD$ Iu0Hx0oH|$HD$1H0HHD$(HD$HxIFH\$8Lt$@H\$ H$IfLHH?LH/yH\$8Lt$@HL$Ht$ HL LLH$HHl$8HD$`Ld$HH$HT$PH$H$Ld$ H$HHT$XH$0L$L$HT$@H|$`PHt$`H$4H|$DLDD$H|$(It$0D{HL$L$~H|$PtH|$XjH|$@`H$PHHD$hKH$pHHD$p6H$HHD$x!LLHT$(Ht$Ht@l$ H\$XLt$HLl$`1L1҅L|$ #T$PLL膿LD$ jD$ uHL$0HT$LHt${iHt$LH|$8D$蘀I;D$sH$H貲iH|$8^gH$H脲OH$Lzlp-1HL$(HT$LHt$XHT$XHt$@LHPHL$@HT$PLHt$hQlMD$0Ht$pLLLL$L$I}Lu(I}0H[]A\A]A^A_ǻH[]A\A]A^A_@HL葻uI}1I}0uH9ucHLL荾uI}谰} tZI}0<yH}`nH}xH[]A\A]A^A_H[]A\A]A^A_@H41L讻tDf.MgAWAVIAUATHUSMLHIHT$=I~`IǺtWHI~xID$HD$tYI}01T$:T$~HAD$HEA$HE1H[]A\A]A^A_fDL9L}It$LLsuI~`t I~xrEDD$uHKD?H9HErZIt$LAD$L$sID$I}LJt8|$t9JE6/fDIGH9HErI}1ȹIt$LAD$Lff.HvzHHPH8ukHPHPHPHP ft8HY1f.f;PtpHu︀f?fDf.HvzHHPH8ukHPHHHHHH ft8H Y1f.f;HtPHu︀f1fDf.DHX1Au fDA9tH8u񸀰HHvHJ@B1øfAWAVAUATIUSH~0HHHdH%(HD$81.6I|$`I|$x1HH]1HMt$HLLHILl$ LLHHLt:LLHL$8dH3 %(HH[]A\A]A^A_DLLuHHLHf1uLLuHB1I|$0IT$ LL^t YLLL>LLyHLLLLIT$8LLH1t&fLLLLL=yLL.ÅEDH޷I$HHH9{DlfDLL<.@1LLLL D$ x@AWAVAUATUSHH`L|$PHxMMIHHt$HtH:HH#LHu1L|$PHt$HMMLHH[]A\A]A^A_@H[]A\A]A^A_@1H~uJHmu9HHH;u$H=mH;XfAWAVAUATUSHxH$Ht$L$LL$HD$dH%(HD$h1H`HxHH\$ IILsHL{0SLKLCL&HLHHHt$ E1E1LL^_uJH<$ H<$HlDHt$H|$DH߉$轧H{货H{0諧$HL$hdH3 %(Hx[]A\A]A^A_DLH襩uIuL蕩uIu0L腩u1L-HuLL LHMMIuL99Iu0L%Ht$H|$HD$HpHD$HxHD$Ht$Hx0H0Ө(HE1E1t$ HL$ HHT$Ht${ZYHt$HHHHt$H |@HD$L`HD$LHpVVHD$Ht$Hx0H0771LutHuLLdD&fAWAVAUATUSHxdH%(HD$h1H`Ht$LD$LL$HxHH\$ IILsHL{0?L7L/L¿*HL諿HHHjE1E1LL^_uPH|$qH|$HXPHt$H|$fH߉D$褤H{蛤H{0蒤D$HL$hdH3 %(Hx[]A\A]A^A_LH荦uIuL}uIu0Lmu1L课'HuLLLH5MIuL!9Iu0L Ht$H|$ HD$HpHD$HxҥHD$Ht$Hx0H0賥&HE1E1jHL$(HHT$Ht$ ]ZYHt$HHHHt$HvfDHD$L`HD$LHp6NHD$Ht$Hx0H0/1LUzHuLL^faH`AWAVMAUATMUSIHIHHHxtqHܼHHźLHRuHLHjMMLHZYH[]A\A]A^A_fD1H.uJHu9H衮HH;u$H={HffAWAVAAUATHUSIHMH8MH(1HT$I1H 1H1tExH8[]A\A]A^A_HE1E1jHt$LLH^_uH1HD$H1HD$H1HD$ I$HD$(vfHE1E1jHt$LHLqZYHT$H9C1eHt$H95)1SHL$ H9 1AHHCITHH1H1H͖1uMI|$`ttI|$xt|HoHt$(HZLLEH5 1L$;L$ffQfD1H趪uRH襪uAH)HI;$u+H=mHrXf.fDfDEH=% L$L$ff.H`tDUSHHHHxt9H$xxHHye1H[]@fD1H让uBH蝩u1H!HH;uH=uHot떐AWAVAAUATUSH8dH%(HD$(1H`HIHIIHHD$HHxH$HD$D$$HHD$HD$$HD$I$HD$H4$LLHAuWHt$I+$H蒳Au;*HT$Ht$HAuH謷x|$$uHL$(dH3 %(D)H8[]A\A]A^A_f.H踩Hu#H4$LLH1AtH舩I$HH9H)HHŲAj11HAS1ҾHԧA9I$tPI|$`I|$xlfDADH{Av1ҾH\tAf.AWAVIAUATIUSHLLHHHMMtH[]A\A]A^A_H{`tH{xteHHHѳLH^uHLHjMMLHZYxfD1HFuJH5u9H蹧HH;u$H=uHv@f.AWAVIAUATIUSLLHHHMXtH[]A\A]A^A_DH{`tH{xtmHHH該L{PHL2uHLHjMMLHZYvf.1HuJHu9H艦HH;u$H=uHפn @f.AVAUATUISHHH*t[]A\A]A^LLHHLuH{`tH{xtqL脳HLmLsPHLuHHLjLMIHZYYf.1L֣uGLţu6LIHH;u!H={L蓣fAWAVIAUATAUSHHIHL)u1Ll$PHD$0HHD$@HD$8D$Ll$ )D$PHo)D$`)D$poEHD$)D$PHE(HD$`DHDHH;CrHl$Ld$0HLHutaH$dH3 %(HĘ[]A\A]A^A_HuH0LID$IHD$mDHHHŠuLCMxIJLsf0LLD$Iv)D$P)D$`)D$pL|$8LD$IL|$vDIHH;CrLHHxHHH"DAdATUSHH0dH%(HD$(1 +kHT HcHHiHl$HHUnH{ HS   HD$ LnH蔘D$ HqCHCC8HC@HH^ ǃHǃCPHCH~^ HCXChHCpHCHH] HH.^ HC`H^ HCxH;1H{ǃHǃH@zHH-zǃH1HL$(dH3 %(+ H0[]A\DHCHCC8HC@HHu\ ǃHǃCPHCH.\ HCXChHCpHCHH[ HH[ HC`H[ fDHCHCC8HC@HH[ ǃHǃCPHCHZ HCXChHCpHCHHY HH>Z HC`HY NfDHCHCC8HC@HH[ ǃHǃCPHCH[ HCXChHCpHCHH [ HH>[ HC`H[ fDH1CHC C8HC@ HHuX ǃHǃ CPHCHW HCX ChHCp HCHHV HH^W HC`HV fDHT CHCC HC(HCH8T C8HC@ǃHC0HS HǃCPHCXHCHHoS ChHCpHHS HC`HgS bfHR CHCC HC(HCHR C8HC@ǃHC0H,R HǃCPHCXHCHHGQ ChHCpHHQ HC`H_Q f.HP CHCC HC(HCH`P C8HC@ǃHC0HO HǃCPHCXHCHHO ChHCpHHzO HC`H/O f.HiH{ HN H=UH߉D$ 蹒D$ HyCHCC HC(HHS C8HC@ǃHCHS HǃCPHCXHC0H|S ChHCpHCHH S HH E1HHHD$DT$14LDt$HEDd$HoI N,JcDaHH}x sLHLA@Ņty@H=R D$@HD$HD$=@+L$1҅ H$XdH3%(j Hh[]A\A]A^A_HG HT$LHHHD$XXLu @T3HLH H C H5E LJc(HPE N H%E Jc(LL$ HLH G J HF LD$(Jc(HL$0HHH%C JHT$8HD$H~A HH $Ht$LHHHD$@vH$H$o$HHHH )$HILH80$H0$H00$H0$H(0$HH 0$HH0$HH0$HHHH80$HH00$HH(0$HH 0$HH0$HH0$HH0$H0$yo$f$)$HT$Ht$H<$|HD$HL$H$IHD: HHH$L3cH3I eL}LBDL$ER4LLHt$HIx L#LLXpT$Ht$XLRLBLL$ LD$(1HL$0HT$8L$H $HT$LHt$H$H$o$HHHH )$HILH80$H0$H00$H0$H(0$HH 0$HH0$HH0$HHHH80$HH00$HH(0$HH 0$HH0$HH0$HH0$H0$o$f$)$HT$Ht$@H<$,HELeH3L3cI L,LO@DD$EA4LLHt$HIx LLLu#T$Ht$XL}DMD$u[LT$L?T$T$L H56 DqQ@D$MtH= T$ȸT$fMxH=~ 褸LL4HT$L  H5<6 D1|H=~ dLL4HT$L H56 D1赿LLL$ LD$(HL$0HT$8LHD$H H $HT$@Iľ LI HT$@HL$PLLH bHLwOJ H< Ht$H<$HHHD$vHELeH3L3cI LL=|$u4LLHt$H@ F$(Hx HD$ L9HD$ LHiH? IcT$HLH40VLFH=?? HX= J4H I? Jc/H== Jc(H 1HHHH=D= L 7H5; LL1HD$H <H $HT$Iľ LI GHD$HL$PLLHP &HL{H: J H<$HH}? Jc4(H29 HH薹HEHUH3H3SH LL;t$t H=Y{ =IHD$@In @ T$BT$fH $HT$@HL<BH $HT$HLwH=z 褴LL4HT$L  H5\2 D1Y f.USHHHH71H4HHnH71H1[]@f.HHGxHHH1HH)HBl'f.AWAVIAUATIUSHHxH?dH%(HD$h1H4$HT$6MDD$MALl$ L|$^LH=%LLHLHH$u}HH%unL$QD8T$s]H'uQHkLHH_$u;LHK$u'AeHT$H4$H,$L@@L$@9HL$hdH3 %($u Hx[]A\A]A^A_fDAAWAVAAUATIUSIHHHW`dH%(H$1HtHRHILH=I10LLHH{xSpEHk`t#HI4,H{xHSpHC`HHMtMuZHLHAt5HL*8H$dH3 %(DuLHĘ[]A\A]A^A_fCXI<,LLL~@AAӲAVAUATUISHHW`dH%(H$1IJ"H=HH10HIHHH{xSpMLk`tMu\LHHAt7LH$7H$dH3 %(DuVHĐ[]A\A]A^fDCXJ|-LLMuAAñ;f.AVAUIATUISHHt[]A\A]A^DLsHD2LHFuH*2Hs8uUtCt fADLLH[]A\A]A^DH{ HCIDHI)B 2HCADff.f.AWAVIAUATUSIHILHMtH[]A\A]A^A_LH1HKDHLHHL$=HL$uAHsTAEu}H{`LspLkxuIwKHC`HLHH߹[]A\A]A^A_fDH{ HCJD9HH)DH뜐IHHH ACufBD9eCBD9PDwhff.Hw`Ðf.wlff.AWAVAUATIUSHILHH?HL$L$/HHDI|$pA|$htAD$lA9D$XH$Ht$LH$HMt$(ftAAEIH)tsI9HLIF uxLLL&ufLLuWrII}LLHIEH)ITH)ITIH)HuH$Ht$LuAD$XH[]A\A]A^A_DHt$HH$H HLBH[]A\A]A^A_AAEATATATfATwmfE11fDHt#SH H߾%2Cl'[@fDATUSHHH5HdH%(H$1蠳HIE11HߺLH|t6HL1H$dH3%(u;H[]A\HLH=E\ff.AVAUIATUH5SILH dH%(H$1ɲH`Hl$HHHSH|$HٺI9HuTMu_AH0HH$dH3 %(DH []A\A]A^f.AHةuH輪LHLAH.0EuH5BLڱHHtrH$E11ɺLHAtHVH/0@HٺH;H=DEf.A蠪AVAUATUSH`HdH%(H$X1IH1HD$l'usLHHM,1 u#L*HsDHLAH$XdH3%(D1H`[]A\A]A^ÐH52 误LHH+1 tH= A@L`*HsDHL]ufH{hLL5X蓰H|$`Hf3 Lt$pHD$xuIHD$`11HL$E11ɺPHD$hLt,E11ɺPLHkuH5p2 PLuHHz-HD$l'H]-D$l' 1HHLHD$l'HB*1}L(HsDHLH{hL,H|$`H_1 Lt$pHD$xuIvIHHH HD$`11H#HT$`HL$10LLHH|$xT$p|Lt$`LHLuLLD$X",E11ɺPLH1E11ɺPLHH50 PLTAH!H+HD$l'H+D$l'H=k q@_IHHH )H=j 訤H5FH7HGHGPUH , SHHHHcH艤HHCHu fHHC1H[]þ\AHHCHof)oAofAf.LHHI9tT0T0HI9wLA I$HLP AfAl6\66fT I$MH~HHHDHH)HI\:\\fD+DLHLrAPI$H@A.H II|$LHcHf.1fDT0T0HI9uf.f衷ADAW AJ|A (fDfD1)ffD6666D 6666I$f\\\\D\\\\DAD1}si _ U K A7RAHt[HHtSHtL@wAH " HHcHDv髐f.AVAUATUSHPdH%(HD$H1HtGHIHtfDD|$A?HAOIQA8BD<(HL @D)t1҉փ91rH]HHfD$(HEHE(E8D1fDjff.AWAV AUATIUSIHxHl$foI dH%(HD$h1HHHD$FHMAD$(81D)HtNDT$D$HuHT$`t$a ȉT$cD$dd$eL$bT$fD$gu|D$܉AEA]AED$AỦAEAMAED$ AU܉AEA] AE D$$AU AE AM AUAEXHHD$hdH3%(eHx[]A\A]A^A_IHt$A?H?w9AA?AOIH}HLHL$ZlHL$H@I@L9tcLHthHHDHQHH)ȃe1ɉσ9H4:rNfDD|$A?HAOIYA8BD<(HL @D)t1҉փ91rH]HHfD$(HEHE(E8D1fDgff.AWAVAUATL%Q USHdH%(H$1H\$|$|$H fo F HH4L,1HL$M%H{D$(8)1T$D$HsH߉T$`t$a ȉT$cD$dd$eL$bT$fD$gAiD$XH߈D$pd$qD$sD$T$rD$td$uD$wD$ T$vD$xd$yD${D$$T$zˆD$|d$}T$~D$ HT$xHD$pI3T$I3$H PL$t H=h* LdHIHsT$.E1H$dH3%(DHĘ[]A\A]A^A_D$?MxH8D(H|;X@)t1ɉȃ9rHSHHHT$#AHT$XHD$LH=E kc;fDHH% I?H Dl$L4wfDI@I@I?.LHAtfAH59 1kj+fDHHDHWHH)`1ɉσ9H4:rIfD81ft*fCHB0BB D?xHALKErOEOTOTEEABA1A҃OD9Or$fD &aAuGEAASCTfCTDNASCTCT)cfHt{AUATIUSIH0HHoH=y H(H;Ht4H9kuIt$HAeuHS IUH[]A\A]f.H[]A\A]øf.HtsAUATIUSIHأ0HHoH= H(H;Ht,H9kuIt$Hdu݋S AUH[]A\A]H[]A\A]øfHt{AUATIUSIHX0HHoH= H H;Ht4H9kuIt$H1duHSIUH[]A\A]f.H[]A\A]øf.Ht{AUATIUSIH0HHoH=w H H;Ht4H9kuIt$HcuHSIUH[]A\A]f.H[]A\A]øf.Ht{AUATIUSIH0HHoH= H(H;Ht4H9kuIt$HcuHSIUH[]A\A]f.H[]A\A]øf.HtyAVIAUIATIUSH#0HoH= fDH(H;Ht4H9kuIt$Hbu݋S AS$AU[]A\A]A^[]A\A]A^øff.H0L} H(LMt9x$u9p uH@LH1DfHtsAUATIUSIH0HHoH=. H(H;Ht,H9kuIt$Hau݋S AUH[]A\A]H[]A\A]øft;HD0 f9y tHL@(HH(MuDH@0LH1 L fHtsAUATIUSIH0HHoH=h H(H;Ht,H9kuIt$H`u݋S AUH[]A\A]H[]A\A]øft;H0 f9y tHL@(HH(MuDH@0LH1L fHtsAUATIUSIH0HHoH= H(H;Ht,H9kuIt$H`u݋S AUH[]A\A]H[]A\A]øfHtsAUATIUSIH0HHoH=' H(H;Ht,H9kuIt$H_u݋S AUH[]A\A]H[]A\A]øft;H0 f9y tHL@(HH(MuDH@0LH1L fHtsAUATIUSIH(0HHoH=` H(H;Ht,H9kuIt$H^u݋S AUH[]A\A]H[]A\A]øfHtyAVIAUIATIUSH#0HoH= fDH(H;Ht4H9kuIt$HA^u݋S AS$AU[]A\A]A^[]A\A]A^øff.1HzuDAVAUIATUL SHBHIIHD F G fA CA)кP1XHL9ZYsLLIH)I}IUE1D AȃAy$HI9]vZAt[]A\A]A^L 1HHLXHH9sH)IHI;]s IUE1D[)]A\A]A^fAWAVMAUATIUSH8H$H\$ H|$dH%(H$(1HHt$HT$RHL$"HAtcHH$3LH>HH$(dH3 %(DQH8[]A\A]A^A_DLLHrAuHt$HYAkLHSAUfo$H)$A1LHALLHAHt$HALHAH$HH$H$ LHHŮALD$HL$1HT$HMNAaXAWAVAAUATMUSHH$H\$ H|$dH%(H$1HHT$HL$L$L$fHHtjH߉$L$L$H$fLLH$dH3 %(${H[]A\A]A^A_DH4$LHYuHt$HCiLH@Vfo$AMH)$(LHH4$LHHt$HLHI tIWL$LI}YHLqBLH sLD$HL$1HT$HMu@{LL$VDf.fHGAWAVAUATUSHXH$LD$LL$H$dH%(H$H1H- IHIIH]HHLHr]HIH9LEUL,AE< u AEI< u AEI< LI]UL uHH uHH H$HH)HLH)HE1$L9EMHl$(1I)1HMH_L\$(LL\$xWHIL\$HMHHL$6Ht$(M<$It$H$HdH3%(HX[]A\A]A^A_DHe: 4,ENCHProc-TypH3KH3H {RYPTf{EDAEI}< u AEI}< 5LOLL)HH: DES-EDHDEK-InfoI3qH3OH uAyE3-C"H: DES-CBHDEK-InfoI3qI3 H ufAyC,DH ~HDEK-InfoI9 WDH|$A%A!AAAHt$(HvA?0u AuLL9Pd@Ht$(LLP@6fDLD$HL$H$ HT$(LAEkLDODLL$LD$H$ HL$(LALL$LD$H$ HL$(LAAy: AEfAy S-HH: AES-12HDEK-InfoI3II3H uAy8-CBH: AES-19HDEK-InfoI3II3H uAy2-CBH: AES-25HDEK-InfoI3II3H Ay6-CBfAyC,AIALH)HfH$ 1)$ AD x@ 0HHH&HH>H uI6A< u AAI< IY$6fDHD$(L$H\$0LHD$QHyHAH$0EH$HH$yH<$L3HHoLL$LD$H$ HL$(L |Af@x@w/Hσ7HHH>H Dx@wWHDfDfAyBCAy,LGLL)H~H$ HDŽ$ 1fADHA wq0HIIu{HHBHuLO(LA%L)H !HDEK-InfoI9 Ay: AEfAy S-fDHAw&IɃ7IHtHBHTfDHAWHLfDHT$Ht$HAH$ HHHD$AH$0EH$HHAH$0HH$H$H<$HLAyHL$HT$MM1L芦AWffDLGLL)HH$ HDŽ$ 1fDADHA wA0HIIuKHHBHuLO#LA!L)H 1 DHAw&IɃ7IHtHBHufDDHA2WH|fAyC,Af&fAyC,ADHt$(LLLIJLf.SHH?HtHsH;IH{IH߾[ff.AWAVIAUAT1USHI1IH8HD$pLd$ LD$IHL $LHD$dH%(HD$(1 HtKLHiKLL$ LHITHHH;$M1LMLLH AHKLt$HHLNHJI,HD$ HtUHA@H@LHFЃ/tM4H)HLHHHD$ Hi uLJLHHBNLzJHHt$H$H}EHH+D$HH)1KHGH\$(dH3%(DH8[]A\A]A^A_LοLL$MHHLL$ADHIHMH|H| H}HHH)I)уE1EAO, A9N,r@Mы|| @|f| H\$AHIAWAVAUATIUSHdH%(H$1H@H|$Ht$I@)H$HMM跤HIMHl$@HHl$91LH@AWAVAUATIUSHHHH?H$(HL$ LD$(DL$HD$0dH%(H$1蟾LHHD$LAD$O葤D$ $ ALl$PCAAAAD$H$HD$HD$LHD$8AHD$HT$(Ht$ H~Ht$8HdLd$HLDLHd<HT$@LL?|$AfDHT$LH耬LHݬHU|$v}fo$AfD$P)$vTAfo$fD$`)$t7Afo$fD$p)$tfo$f$)$A9DHc2LPP9Hc2LPP9Hc2LPP9nHc2LPP9MHc2LPP9,Hc2LPP9 Hc2LPP9Hc2LPP9Hc2LPP 9Hc2LPP 9Hc2LPP 9~jHc2LPP 9~MHc2LPP 9~0Hc҃2LP9È~HTP0DAD9d$Y;$ G$ A)$ LD$0D$OuD$Nu D$MuD$L$ n@D$H|$@蝾@L萾D$H$dH3<%(H[]A\A]A^A_HL$Ht$0HH~HHJDJDH)HH΍ H)H9HD$H|$0!HD$H|$0BDfBDH$Ll$PHD$H0H|$Ht$0BDBD8DAWAVAAUATUSHH_H$t$LD$LL$H\$@H_HD$D$0dH%(H$1?0D$4D$8HD$HuWHl$@IIHT$PH$HHUu)H|$X uHD$`H*H H9tEA DDH$dH34%(D)H[]A\A]A^A_Dx uH$H$H$$0HHD$ uL$H$L#DEj|$8HHD$ ?Lt$pLHHL^.Ht$pmD1Dd$DEA A E A nA1ADA AA6>pm1Dt$D DA D D1F?nA   A>pmD1Dt$ Dd$(DEA AA A.nE1Dt$@AljA EG>pm1Dl$8ʼn؉ D DGnD1 Dd$DAA A DG >pmA1 EEA AAA AAnA1Dd$EA AAE EF>pmA1|$4Aщ A D AnD1DEA AE A>pmA1ADA AA4n1Dd$(DA D DG<>pmD1Dd$ A   A,nD1Dd$DEA AA A>pmE1AA A EGn1Dl$0݉ D DF>pmD1Ë|$ DAAD A A1G nDl$EE AA A A AA>pmA1Dl$0EA AA E EGnA1Dt$Aщ AD A>pmD1|$,DEA AE ʍnA1ADA AA6>pm1Dt$A DA D DG>nD1Dt$$ A->pmD1Dl$DEA A A AnE1Dt$ A A EG>pm1Dt$(݉D DGnD1Dl$DAA A DF>pmA1 |$EEA AAA AAܼA1EAE1AA!EGvmzA1 Aщ D1A D!AAܼD1Dt$@DEE1A!AvmzE1Dt$ ADA 1A A !A7ܼ1DD1D!DG>vmzD1Dt$A  D1!A.ܼD1Dt$0DEA1E!AvmzE1A Dl$NS Dt$8ADAD AA D1DDd$(Alj 1AD1AA,NSDDd$ D \$ D1A D1 1DD A ACNSE L$AE1A1A ADE1AAD$E A T$$ BNSAE1A1 ADA1AAEE CNSE1DAAA DT$4A1DA E1E AA‹D$E E1AA ADAB8NSA A1ADED1A AA荄/NSE D\$@E1A1A 1|$AEDA B/NSD A D1DDʼnDd$IFHI)DM)r1ɉσM 89L 8rqEABD=CD>\BD=fCD>Kff.Ht{AVAUATUISHӺ@HAA?D)A։sGEtL9sJH?wH@H@H?~HLt[]A\A]A^fD1DIt$I$tEAEt BD5fCD5L(uL)LE1H?wDHu 1[]A\A]A^ÃKL,s|tUt҉DfD1DHEIIEJD5KD5IEHI)DM)f1ɉσM 89L 8rKHEHHTHTHQHH)э H)̓=1ɉ΃H|59H<2r1!EAEBD5CD5U‹DD1@f.Hu fAVAUATUISHӺ@HAA?D)A։rEEtL9sKH?wH@H@H?HLt[]A\A]A^fDGf.It$I2t"EAEtBD5fCD5fLuL)LE1H?sHxKL,WUIDfD8HEIIEJD5KD5IEHI)DM)^1ɉσM 89L 8rCHEHHTHTHQHH)э H)̓1ɉ΃H|59H<2rEAEBD5CD5U‹DDkf.AWAVIAUATIUSHwdH%(HD$1 AA? ʍ T$t$ψ $l$L$A7@|$L$T$8D)@D)AA$sAt$EtL9szH- IA?H?wfH@H@L9HLtHt$dH34%(H[]A\A]A^A_DxD)bIt$H-< I@t AELwuLL)E1:DHtK|,HH HLCAT$AAT$ANAT$ AVAT$ AVAT$ AVAT$ ANAT$AVAT$AVAT$AVAT$AN AT$AV AT$AV AT$AV AT$AN AT$AVAT$AVAT$AVAT$A^AT$AVAT$AVrfH IIEJD=KD=IEHI)DM)1҉׃M 89L 8r AEBD=CD=xBD=fCD=gAWAVIAUATIUSHwdH%(HD$1 AA? ʍ T$t$ψ $l$L$A7@|$L$T$8D)@D)AA$sAt$EtL9szH- IA?H?wfH@H@L9HLtHD$dH3%(H[]A\A]A^A_DxD)bIt$H-< I@t AELwLL)E16HtK|,HH HLCAD$AAD$AFAD$ AFAD$ AFAD$ AFAD$ AFAD$AFAD$AFAD$AFAD$AF AD$AF AD$AF AD$AF AD$AF AD$AFAD$AFAD$AFAD$AFAD$AFAD$AFrfH IIEJD=KD=IEHI)DM)1҉׃M 89L 8r AEBD=CD=xBD=fCD=gAWAVIAUAT USIHLd$fo' dH%(HD$x1LHHD$D$(HLL/L$t$A@AA? E)AAAAAAE@7@HtK|<HHHt$pLyT$AANAVT$ANAVANAVT$ ANAVAN AV T$$AN AV AN AVT$(ANAVANAVAN\LD$ OHL$xdH3 %(D$ HĈ[]A\A]A^A_D1A@E11E11E11E1E1111A7@l$pD\$qDL$rD$sDT$t\$uDD$vT$w~xD)ȉD$st$L9rn@tiAKL<H- DAEt It$LCLL)E18D)}H- IA?H?wH@H@L9HLtHa HHDHTHTHQHH)AD H)σO1ɉ΃L79L2r4 DDDDDfD DAWAVIAUAT USIHxdH%(HD$h1Ifo LHHD$D$zHLL|4 $t$A@AA? E)AAAAAAE@-f.HtK|<HH+Ht$`LD$̉AANAFD$ AV̉AFANAFD$AV̉AFAN AF D$AV ̉AF AN AFD$AVAFANAVAF\LÎHD$hdH3%(Hx[]A\A]A^A_1A@E11E11E11E1E1111A7@l$`D\$aDL$bD$cDT$d\$eDD$fT$g~xD)ȉ$st$L9ro@tjAKL<H- DAEtk It$L LL)E18D)}H-) IA?H?wH@H@L9HLdtH HHDHTHTHQHH)AD H)σN1ɉ΃L79L2r3 DDDDDfD DAWfAVAUL-Ϧ ATUSHdH%(H$1)$H$H\$ |$DŽ$HD$t$H Hfo H4H1HL$(HD$8SHH HH4HT$ Dd$$A@BAA? ȍ E)ADt$ AAAED$@$|$ D$D$$D$7D$@$$8)AƉT$ s AD$D$$M9|$D$ AHtDAE_HsHHr M)D$ N$8MA?I?wI@I@M9LHtAľ\H谊D$H$dH3%(DHĸ[]A\A]A^A_AML%Χ A?I?wMMtDt$ LLJ|3Ht$HuD$ D$(\H߈$$$D$,$$$$D$0$$$$D$4$$$$D$8$$$$$EH$H$I3MI3EH uAE9$T$ D$A]H=?; eLD$A@D$ 11E1E111E1E1E11x+D$ :f.H5Y 1{ fDL$u0HIH AԋT$E1H= HT$ IH T$ H L HHDHTHTHVHH)A7I)1I<9H< rfDH=) DDfD{ 0H= DDDQ{f.AWAVIAUATIUSHHw.ImAHCpH@LsHL|yxHIt$.Hx8P0HCpHǀ0HChLPhMlIhLLT$DLT$HSpHA@H`M)MM)LLHp8p0HHZYIu%IH`HB)H`IBL*IH[]A\A]A^A_LE1DL~ AD$3 H H߾DD$H[]A\A]A^A_fDAD$L[ T LQ Hr 1" H6CU@L HB J HC'L H 1? HBfAWAVLر AUATH USIHHdH%(HD$81BLUAA zIAGdAG9~Lâ H\ *L1 BALJ,H\$8dH3%(0HH[]A\A]A^A_IM|I *H9A<$HIL{ jH MbLCIIwIL|IAWYAODzx^{yD9999EL$L H+ 1}LA@IGpML$HAoD$H L LAoAEl$"j BXI ZII |<HHIT Hr'H9YC\,&Ct,' HcHsH HT(H9KL,%Gt,#CT,$1HL$AA ք@4$%@%D $L H L1?/LL Hʟ AL@xLɟ H %L1^?D@A<$ IGpHIGpƀHǀII |HHH2HHH *f.<$IWpDHT$UjHT$HIGpHHGLGL~ H 1MLx>ID$#HLv H HD$(AUILe@D$IOpMGhD$ AZA[MEO EE9pD$A9@ M9hHt$ IxLHL$(LD$LD$HL$(uaAG L/Lɭ HÝ AL$>PLAD$DUDAG1ǁ LD$LD$IhAID$HODwLoG ,Ah EiIGpL ! H  LD H EL LE17I|ftAuf8EL1 @H) L16(LfDLQ H 1 L6EMEHD9:HHut2UHHEw@HPH9HuL >fDL HZ 1x L6I}EIGhǀfL) H 1 L5I~EIGpǀ$ bfLF H 1 L~5IIcLPMAEHJfH9nDmHI9\M0MtTHEHD$ IM0MtL>4L HX 1?L4IL H3 L|<HHH IH13I|<HHHI9HL< Hœ jIٹL5IHt$DH|$@H|T$@AZA[D$4yIx9gy9XIILcDsL)L9MHLh H AVML4IGpHMGpLLD$LD$HI_AYAAEtSAqELAG;L衎L Hf L1/2f.LB H: L11@l$AI|0< VA L ( g@Lʠ ODHLILHLANHfDHL PW1QRHx VqL=1H0FL A UT$I@L& @L H 1L10 L脽AD$#GHt$ DTTD$4u=D$0"L3 ZaLr tPLz YL .LX 7L  u|$DL  LI L < L[ H L1/nLp SDAT TL L pL Hx EL14/PL D$$L DAT fT|LՏ L %Le Hߎ EιL.L H  Lw.Lk  YAWAVL3 AUATHr US1HH(0.HHx0QDC Ex@r|L`yIN2AFHL H H߹PEN1-HHkp^_|HoMNHH L !AFHoAAj i/HshZYHnHEH1C 1H~x&HHR HH Hx8P01HChM~' MH@ AF& 1HShITHH9AT$r1IHLÒ LH HDLȾHH߈1I,HHHx8P0IHkpzS{SC M~'AF&1ML8 H 1I]HM@+HL Hы UM^H-H]A_|M9pM9gHCpIl$LMHHk L ~HPI-HCpI9A$HSpAZA[LH)H9H t'U TfTHSpfDHIfHcSM9L<LL)HxA?Il$ 1Lt$Ld$H$AMDUHIHyA;W |o{A;W(b|tAG,uP@tA*tELVMHH@t(HHtH0tH8fDIA<$`Dt$Ld$Lt$L $LF H H1{){ H~H $HAHEA$E|$H|L? HP 1AH)L7 H( E11H(L9LH)HLefEM9LL)HLIL$HL$HML H k1Hk(HHL$Hp IH4$L9LH)H9 1AD$E|$ fAD$IGI|$ Kl< LHAD$AGAD$IGHAD$AGAD$LHAD$ H{ aHyDL$EL HŇ 1>H'HHH 8 Hl$E1H&IGH=n |EwI4HuL؏ HI KH߽ 'LK H$ A$H7((DLݗ H AH (H([]A\A]A^A_@E $HL AwH 1Hz&LRSA I9AXAYr_LH)HvSA$IH$HeAD$EA<$}L AH< HW'@DHCp H~xM~'An&ML H 1wH%A$IHfDL H 1AHh%HH L j1AH:%L9XZ(LH)HLeEfEFfH$ HI|$ HHUHLHLHH)H)HHSpHDIL H 1H~$I9nLH)H^H$HfufDL Hb 1H&$L9LH)HVH$HfMfDH~xH L 1H#HHH:uHH=kDEuHI9LH)H9H\$E1H fDIXvBD=BD=B<;DvBD=IGDB|;uIWEA fDUH\$HUPUHH$HUID H$IlHHl$II9JLH)I9;HH8H\$E1HIxPBT=@IWDQDt>@9mII8M|HLD$LD$AIOI0rH>ILL>LL9I HH)H)HL H 1HF HHI9rfLH)H9w[AEH}fD}HEHEHH $HHDH$IlALi M~'AF&MD$H$LD H H1qL H 1HEI9r@LH)Hv4EHH $|fEIl HHH $IALÈ JUTTHSp!L H~ H1L H~ 1@HI9r3LH)Hv'H $EHIl H}H $AL TAL ,L& H7~ H1L7 H~ AH#L H} 1_HI9LH)HEHH $}Il HH $yL̇ Hu} 1~H9I9rCLH)Hv7H $EHIl HH $vALS ^ALÎ hL H| SH11111TI)IGHEAGEIGHEAGEHL<$E1~L<$ H,$L Hp| 1HLI.HtHAl$HA$Ld$IH`MǃhM)LpHC|tHzH@xH|tH"ALɍ H{ H1ALl rNE1aC>҉9ttnHChKl<L HK{ HL1L9M_wf.AWAVAUATUSHDOdH%(HD$x1A HpI L Hy @LjAI|tIGpEOA A H Î DHcHII L I L|<HHHH LLHH)LL$(RHy CZYƃƒ@Au@tHHT$ HH)Hg HAJHT$ D II)I9 HHT$ Ev @IGpHt$ HHVAIGpDDHyLHL Hx 1l LDLk`IGpHw Aw LL& C"IHD$I|<HD$ MIHD$AGI /6HE1CD$AALL$ HEI9AILL$ fH)I9L  Hw L1A2L蛣H\$xdH3%(D/HĈ[]A\A]A^A_IGp$ u*LbADL~AAGLM Hrv 1L6LAAOMA<$II |HHHHHH H9IEl$A,$fAAHH9IL Hu 1IٹL|IGpfEǀ$ AG IG`Ht9HxxHt0HWIG`HxxIG`H@xHǀIGhHHxxVWIGhHxxMohH޿IExIDžHIt$HHLe Ht IEx-1IALIGhL 0H@ AGELAxLhAhLAXIGpLe H6t LH1HD$ LC C L艨A ApI} TCALJ,AGL܆ p @Hs L1J}DIGpLņ HVs LH1K wH L! H s L1AG@L Hr 17LLiAxAI|HHH I9 5 I8% AGLR Uf.L AHIGpL> H&r cLH1CP H> IH@ HHAHH0H8HPHD$(H@;I`HBI`HT$(PII`HHH~H@MsIHHh n hIGpI`@MH8M@0Ht$(H)HHtPAIGpHp E1ɹLLsLAa Hl$(I`LALJhIpAG讆ALɄ L( HAp ALT7IGpL Hp !LH1HD$ LAK sH`AIGpIH~HHnH:sHzHl$0HT$(LHAG IGpH HH Hx0 HL$(AE1HE1I`I7L^8LN0IIGpHHHH8HxHDjASAQLL$@H A%HD$ I`LHB"I`HT$ HD$ ALJhIDIpI`AG蘄AL L H+n AL>!fLALFLXAL Hm L1 AGLXALӂ Hm L1N A{La H]m ALpSAEDI`IHt$(HSI_pLH8L@0HLAIGpHl E1ɹ LL&IIGpLI8LA0HHHxMAIGpHl A&LLfLiz 33L?| H9l A-LL /IGhHXhH Hh  IGpHpHJA#IGp{H"LHL"~ Hk 1l Lf L^AIGpHnk w ALLLv  *L4 H0k A;LC &L豟AA_ IAG1L ֳ LY~  L< H AHj LD1w AALJ,L~ -L~ Hfj ALy \LlfIGpI`H@HD$(HBI`HT$(PIHl$(L`8Lh0I`HXIGpHx_IwpMMHHH~7AMOpL~ Hi {LI@wMOpL} Hi |LIXOIIGpLJ8LB0HHHx$9AMOpL H/i LI xLw :L Hh A L Lo Hh AL L{ Hh A L L { Hzh LE  (L^{ HT$(1ɾLA+HHH9HHvHHHDcf.L{ Hg AwLI7I I|HHH H9[ DlLHxH94 AGHHH It IL D5t5 HHH9LQt &Hg L1A2L薓L Hf A LL< Hf ALH1HL"{ Hsf ALiHD$(Lz H=f HL12L迒AIWpI`Hz@AIGpHHHHxI`AAW1HCHD$(HD$(AAHUE1HHHL$([I1HH L H0e L1A&L|H HcH<H\$H9:H\tLE1BD#HHd Lr LPF #1IZYL9d$wI7I |HD$Ml#Lr Hmd L1A02LQLr Lr H%d AL8IWpHRHL*HT$(H@I`HHhTI`HL$(LILl$(M`LH8Lp0IGpILL$HxeYIwpLL$MLLH~81AfsIGpHt$ HHx+AIGpIHptL I9CLHLu Hc M LMOpLu Hb N LI(MOpLu Hb O LIpCHT$(HLbALvu H|b LLm HWb L1A/L؎;I1HHQHL`v Hb ALLJp Ha L1A LWݾLvu Ha AL1[ALl F@ArLl jLs H9a A LOLl l Ld$HD$HL> H`  LL)HD$SA[E]HD$Hl$0HLLHD$($HUHLs H` t$0I2 LtIGhAYAZL`hM"t$IhL\FLk H>` E LA(L輌L6t H` ALL%r H_ LA4Hl$0HT$(EILLHVWLl L Hr_ L16AHt$HFH9>RAHD$ ExWQD$DLPRHD$ DHLk H^ 1 LHD$ Lq H^ LD1HHD$ *;D$2Lj "HD$ Lj DHHc^ L1,Li Lk H5^ AL1A%Ls H^ L1PL艊ALwi 8 L+ }Lj L [L H] h LJLh Hd] L1(AL : L]j LLj DLOi DLi ~HLo H\ QI L1A\A]L H\ h LpLh H\ L1NL )Lj HR\ AL1ACLi H%\ uL1AHILjLD$0HHL$8D _AX;3LnLn H[ Aٹ\ LALlg  H[ L1QLf S L9g fAUATIUSHHHHpH9HufHH9rYHGpHHx(AurML$pH]Lm Hp LIpHD[]A\A]Lap Hup L1AxfDL{ HJp ALALp AWAVL\{ AUATHp USHL% HH-o dH%(H$1Lt$hLl$dHLMHH|M<HHHH PELo 1HHeA?AXAYOHLo HHD1fAE%AGHLuo HHPEO1HIOLL|Z^_|$dHC |H82x(PH߉@fyLy HH1VHǃHǃDS EkHfVL Hm AH߉D$GfHyC HD*fAfA@HEH|<HHIt jfD$vH|VIE HhLx HEm H1ND$H$dH34%(D$bH[]A\A]A^A_fL HHLyx AUHl *HIHCpLHHHZY|<HHH I9}DML%m Hvl <1Hz}Lw @EDML m H5l EHAD DMA 1'}EHf|bHI9I)HI%HLgw Hk jI鹞HHHsH{H|HCpDKSD  HA\A^z{A99wxyA9kKCHLeLFf j H k MH0HCpoEoEDe"AZI A[Mt$$M9HL}#Le ATHj MHHChfLL`@@(HChHPHxnH IT$#AXHD|AYD M<IGL9(HIH%j ATLe HM?H^_HHK HHLLLЅL{u Hi 1HHCpƀH I9UHHSpDHfA{ EDADxuxuxup HHf9pgLCj Hi wH1D$MLt Hh H1IWHDL HcHD$L4IFL9L$HD$HDHHnh Lyt $HD$0t$IHFd5INAZA[IT$HNHChǀ+A A $L]g HNd H1RH{p EAGHA9HIwAWHIGv@H9HHPw牗DLW^ Hc H1^fDA#AQL] H{c 1HK HHPI9 AWH9HHD$ct1IwMDHT$cH1 I9D$cuD$cD$fDLf Hb 1HH|$ dHHSHEHCpMcLa Hxb M|Hǀ$ 1oED[ L+f EHLLt$ IWHLA L&ALn ALn Ha E鹖H"mDL9c Ha 1HIcAIDHAGfHH9MoL9 Hl$Ld$0Ht@A}6>AH>H{pDDI=HH` L4c AT1E.HL9XZvI@A}6=A{EML_b H` 1HIL9wHl$Ld$0D$$@ELb 3EMLDb %DL!O H*` H1.fLcl H_ 1HHHxXLNl H_ 1WHAMcAOfHPI9fIWveAOfHqH9B Au/G fJfHqH9 : HHH)HHwHLvj H_ H1/HuD$La H^ 1HAIcAGfDIPH9]ULspIhLA HLD$8HH HL$0LFL膨HHL$0LD$8[HIhMwMHl$0H\$8LHMfA>A~ (XHt#HIIHHsHvMtHIItHwHl$0H\$8QL1a H] 1HEH}DkEHCpǀ( DL` H*] 1H.EeH}HChǀfLW H\ 1H߹ HHPHHhAAGIUfH9uIGOt/L9HD$0bAGIWLH)H9s$R@HI9<HPLH)H9w0HuBLg v@H!\ H1*2HrD$LNg L6g {9CAS AH ǃ@HHu[ NLjLg oHZYD$D$1HT$(HL$D|HH9<VuHǃL HZ AHED9h u@ 8A Lxf HZ 1HHCpƀLVg HdZ 15HhHy9C DT$Eu!H71H{p@ 7HT$(HL$1fD<u |HH9w拋 H|0< 8 { HcCL$A$ Ht$lL|$(Ll$1Ht$1fHI9A$A /8uA8T/u߉׉T$HIƋT$ HApL] H4Y 1H8CA9F AXAY_A;F(UH|t AF,@t A~*LtHCpHhHH8LtHHxx{LD$HCpLM t$MNHXX Le 1HUA$HChPHCpLHC|{qLe HW H1L@c HW HD$DLd HW 1HHI9@IA$vL^ HRW H1V(HnD$HIHHl$HLd$PHL|$XH\$8H2IHD$0L9uSII9tGL`I9uLHL蝠uH\$8HLd$PL|$XHl$HHFfDIImHuH\$8xHLmD$)La La % La oHHHHx`PXLb HU A{HFpHlD$D$cL\Z DLZ H{pƉD$2DL$LwZ H`U _HfLkhH|$@IUIuH$詟LH|$ HChfofoG@foG @ foG0@0foG@@@foGP@PfoG`@`foGp@pfoHH !LX HT 1HHCpǀ ǀ$ |$HLY HGT HL1L\$?L\$MHl$ HD$LLMLY HS HD$l$HEt$HhHL$H}Lr1LyY |$LM{APHD$LsY H\S HHHDHD$1THmH'Ll$MMHCpLkY HS HLCLX HR HHmHH|$Hl$ uL-Y rIL^ mLW HR H1L\$L\$KLV HVR 1aHZ{ ǃHnL] KLD_ .`Lb] HHt"H@tH0tH8.LV OHCpIpHh HHt;  HHHuLX HsQ H1|L\ 1&L^ H;Q H1Dg|$TL@ HP H1(HgD$HLR HQVRHP 1H FHtgD$QL[ FL[ 5L[ @L[ eL< *L[ PHy6Lj[ 8LY[ Lf] HO H1(HfD${L[ YpLXH{p,,LOV DȹH_O H1hBL,< :L H,O H10D$LiZ HN H1FHeD$L(Z >LZ cLZ (oLY W^E1LU  LY Y9HLNO HON Q1aHRA_XD$LY LwY G{ D$L3= L?Y PHdD$$L Y [sLQ fL< wyD$D$!L_Z HVM 9H1ZVHdD$L< HM HLGZ HL H1Df.AWAVIAUATIUSIHHopdH%(H$1HL$ft$`HHD$ HHHHXHH8HhAMHIIt2IT$I9;H A8$AL$AIH9K4LK I9H$IEHL$`LA0LHp8p0LD$04D$,XZIUIEpHL$.Lt$0|  ߧHD$ L$/0\$`D|$.LDd$aHD$IEL$Hx8P0uyD2d$D1H|$HL$`L=D Dd$A0D \$ IUpAHǂ01DA4<D!! A4IupHH9wH$dH3%(HĨ[]A\A]A^A_fHH11,HHtHZ1HHDHL J H4J L1=D$rLW H J BLD$ELI PHZpATUISHHHLAxMt~M $HL)HAAAIM $f ML)H9>MHLHHAЅJI$HI$1H[]A\@HHt&H@tH0tH8V@LV HH 1HH9HuOIH@D$L@DH|$HD1 H9ȈT$uT$>fHLQV HfH SHsH)_XZDL H HH 1H&@M $LG @H|tTATUHSHHI諌HHHt2HLH褒H1[]A\fDf.fHHHf.AWAVAUATUSHDOdH%(HD$x1AQ HpHC LT HF 5Hn"H|tHCpDKA H X DHcHfDHF LT 1 HH|tHKpJHx0$L`s{IL$藢AD$HLM HF  HPEL$11]IHLw1 AD$LHE HEL$ AD$LȾHHAD$1HIt$ Hx8P0_AXHCpML$HAoD$HnE Lr?  HAoAj wHCpZY C Hkhu H/D AVIf HIMHCpL Ew LZ> ]A^D H HC h HMuELE1E1HCh@AEHCh@AEHCh@ AEHChx|L/ HC Io 1HHChLdK H]C q HDH 1]IEH$HChLtDLqK HC 1 HEHChEHChKl>IDEt6LQK HB 1HEHChKl>I1sHCp$ t2LK HeB H1iE#Kl>IHChxH%HLK H B / H1 fEH(HPHHH}HHL$UQUHPHUQUQUHH褌HL$IL%. HA 1M HMtL4$LE}HAEMH`M)ǃhLpHALGO Ź HA H1f.Ht$xdH34%(HĈ[]A\A]A^A_HH3@뱐CD@Hx@H@HCpLO Hf@ 6HHD$ L1ZAL$ |H੢i LI HH@ H1 CfHCpLO H? HL`L1HCpCuH|AL$ wHtLI FfDL HL1HV]OHHH |L,<HHH H4Ht$(C9AL$ y@y41LH:H蘹CLKN ifHCpLJN Hf= =HL1cAL$ HHChHxh1H["C.H>H|<HHH<HHH <MII<HChMILhhI MFIh{ LLMLd$0AID$H$H H9YHF >BT>AA McI)H9HCpHL$HT$(LL$LHLLL$DHL$H$LI HELL fH蘃HHHCp$ LL Hh; 1HlH`ǃhLL$ LD$(H`LHshH@HP IAD$ H`H߉JH`JH`bH`BHD$(H`HHJH`B H HpHCpǀ$ ;LK %bL Hl: A!HZf.HAL9 H*: H1.CfHLs9 H9 H1@fDHCpLHǃpAL$Au8H`Hǃp@HpH`HHHpAL$1mH HHD$(HtXHCpHhHH-9SH9DHHEHuHuHEH LG H8 T H1HǃpDL C AfHXzaHHD$(H_H(QHHHCpHx^w LF H7 A HQLA f7H H)HCpHTHCpH7 AEHLH HCpLI8LA0HHHd<HCpH97 ARHLmLK H7 AHZL H6 AH2L0 H6 AH H`AHD$HD$fD@@@Hp{HD$Hh f HE1~HCpLMA|$8I@I$H9DHE1IvH)H9= H$IDA>fDAT$8I$I9A DLIVH)H9 DLMEfA\UI$LL臀HL5E Hm5 AVH|$u IJ,0M$`Y^M]AH$DEH+l$H`HǃhHt$Hp H`2Ht$H`D0n5LD Ź H`HT$ HHpHHL"D HHqHpHpH`HHHpHL$( LpHc4 L`t$(wHD$0HpAYAZH`ǃhH C4LC L! H3 AHMLB H3 H1ֽL}; H3 + H謽HCpǀ HChLpHC gL- HW3 AT H誾ELgD H/3 A H肾HD$(L: H2 1 HLA H2 1 HH`L@ H2 HHHD$(1讼HHL$(s{|ߎHL, He2 jLL$8H߹ 脾Ld$8H;ID$HD$8HA[]H|H8Ml$HLLl$(HHMEHt$(ЅHD$(HLZ@ H1 M鹼 HL)AD$PHD$8H`HǃhH)HpC2AYAZP H|tH#AL? )Ht$(LHwL;l$(LtA " HHCpLJ8LB0HHHx$]LKpL H0 0HIʿxMHtExHt8xu2L>9 H0 W H1胺EKl>IHCp( SL9 H00 1r H4EKl>HCpIHCpHHH Hx ]HCpHHHHRHHr1L/, H/ A HںXHpH`HX/ r E1ɾHHHD$(HpHCpLAL$H`EHpLHD$(II){{A%A|$ L{8 H. Ld$0E11 HE1ŸHLLHHD$($ HL+ Hw. t$0M H薺{A_X H{pHH HH Hx HpH`LJ8HR0LDHL$(HxAQDRLLL$0ǻA[A\L, H- A H&L H- AH߉$$L8 InL9  B<&H $d AH $ HHH $B4  ALd$0H $ L$$H<~ } L< 1L H, AZH*L/* H, AHHHpH`Lh8Lp0HCpHxw HspHL$(HMMH~zL4; H:, A' H荷7L: H, A HeHLA?G H$E1Ll$H@Ml$AJ,+t2H<$g u"Ml$DuBD#Ft#BD#IJ,+IA?uMH$Ll$Ht$LHHFIFDfHD$IFHD$HCp L|4 H%+ H1)E fEKl>IHHH0H% H1HHAH$L4 H* 1l H讴DE[LMLd$0E1$L$$L2 H^* 1 HbAMU fEMD[ E`fAEAE L+$MIjHt$(LH:L;l$(LE: dAt$H茪"L! H) ArHHHLHL8 H) 1X H莳HEHspH08L8 HH) A] H蛴EHt$(LHVHt$(LH7At$H蠩6L! H( AH#fDL8 H( AHHpH`L& LKpHh( 1 HHHD$(I@Hp[LKpLS% H1( 2 HI3LKpL3% H ( 3 HI( LKpLv& H' 4 HIXAL$xlH{pFAVLD1 H' A H1薱Ld$0HT$(HEMHLX mL*' H>' H1B-LM1ID$H$Lt$(LHL%LLH轵dL;l$(L7 oAt$H_L H& AH}L0 Hg& AH躱UL H?& H1CL: H& A HfHt$(LH!HCpHt$(LHH)lAHCpH% AHL'At$H:L Hj% AH轰XHp@LHt$(H)H`MH8M@0HHCpHLT4 H$ Ag HRL. H$ A H1AϮ4HHtFH~t?HpH`HLJ8HR0LDHL$(HmHHHDZL3 HR$ H1VL4 H&$ AHykL4 H# AHLL# AEHHL׍DAEAE HnHIHILnLIJL3 H^# A^H豮LL3 H6# AH艮$L3 H# AHaHSh1E1HBHHIHEvLT$tH#LT$IML ۚ tLLT$LT$IAVI<,AWLY H1LLT$@SZYcLT$HL9SI)UfSL I1HHRxHH9%[[ÐSH1HPdH%(HD$H1AYHt$H|$HD$MHHp xD@Dl;HtHT$HdH3%(u]HP[D;Kظu;st1;{ t1;{ uD;Cu1D;K뢸D;C~TfSH1HPdH%(HD$H1aXHt$H|$HD$mHHp xD@Dl;H|tHT$HdH3%(u]HP[D;K|ظu;s|t1;{ |t1;{ uD;Cu1D;K뢸D;C}SfATUSHdH%(H$1Ld$H$LU]HM]HM H5_/HG>t9LY]HQ]H$dH3 %(H[]A\@HM H5:/L=uH1E1j1LHLD$o\XZfH5J Ld$H$XL\H\HL H5/H|=tH= P$DHL H5/LJ=uH5 1!XH1E1j1LHLD$[Y^uH= pPRfDHHLJHH1HH)HÐHt @f.L_SHLH؃' G, G 1 G 6 G ; G @ G i G Ga G G # G ^ G c G h G m GD$fn|$Afo A)fpHDfo EAfffofafo% fiAffo-  fofaffifafo ffofafifofafifo D ffafo% fffg)fo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)PfoQ ffofafifofafifoM ffafofafifoffifafo%Q ffafo-a fffg)P fo ffofafifofafifo ffafofafifoffifafo% ffafo-) fffg)P0fo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)P@fo ffofafifofafifo ffafofafifoffifafaffg)PPfo fo% ffoffafo- fiffofafifom ffafofafifoffifafo%q ffafo- fffg)P`fo9 ffofafifofafifo5 ffafofafifoffifafo%9 ffafo-I fffg)Ppfo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)fo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)fo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)foP ffofafifofafifoL ffafofafifoffifafo%P ffaffg)fo! ffofafifofafifo fo-% ffafoffafifo5U ffoffafifo%  ffafo- fffg)fo ffofafifofafifo ffafofafifoffifafo% ffafo- fffg)fo ffofafifofafifo ffafofafifoffifafaffg)uwfofoz ffafifofafifoj ffofj fafofafiffofofafifaffofg)D$EAD)DE9 LcBDD@McȃFDD@McȃFDD@McȃFDD@McȃFDD@McȃFDD@McȃFDD@t}McȃFDD@tlMcȃ FDD@ t[Mcȃ FDD@ tJMcȃ FDD@ t9Mcȃ FDD@ t(Mcȃ FDD@ tMcȃFDtHcȈDLIE11?DAHD DHEDHLDDQH9DtD9wHAf[ùD$D$|D$jD$XD$FD$4D$ "D$ D$D$D$D$ D$ D$ D$HDDGtlATUHoSE1fAAIHAEMIE#D#ADDB2BIL9u[1DDG]A\fDDDG1@f.AWAV!AUATAUSL 1AH(L$fDo5 dH%(H$1LfDo- HfDo% IfDo fDo fDo  fDo fo= fo5 fo- fo% fo  fo fo  fo! E H IUM(DŽ$DŽ$1L(Ƅ$Ƅ$ Ƅ$ Ƅ$ 1Ƅ$ Ƅ$ IƄ$Ƅ$D)$Ƅ$Ƅ$D)$ D)$0D)$@D)$PD)$`D)$p)$)$)$)$)$)$)$)$Ƅ$Ƅ$Ƅ$Ƅ$Ƅ$Ƅ$;L:D9HADHLD9DzH9@9tvLѾD$$HL@HLDDDD1@$HL1HLDDDL@2<HL@$HLDDDLHLH@2 @$HLDDDLHLH@2 @$HLDDDLH @2 HLσ@$HLDDDLHLH(@2 @$HLDDDLI8H0@2 @$HLIHA9@>A D2 $HI $D$H$H94(cEH= L$)$)$)$)$)$)$)$)|$pD)D$`D)L$PD)T$@D)\$0D)d$ D)l$D)4$%?L$fo$fo$fo$fo$fo$fo$fo$fo|$pfDoD$`fDoL$PfDoT$@fDo\$0fDod$ fDol$fDo4$HIH5Et E1=LH$dH3%(D?H([]A\A]A^A_H5 D1L$)$)$)$)$)$)$)$)|$pD)D$`D)L$PD)T$@D)\$0D)d$ D)l$D)4$GEL$fo$fo$fo$fo$fo$fo$fo$fo|$pfDoD$`fDoL$PfDoT$@fDo\$0fDod$ fDol$fDo4$Eu AH=v A#=>fMI<LHATHU1SHH,RI9HH?H9OHH94H+HL H1@AHDIHHAA0McG$#DfAAfH5 1}>HT$H  AXH~uH[ HL H3SH3H tH=o 6WH@ H1 H3SH3CH uH5 H& H3S(H3C H uH* H H3S8H3C0H uH=h 1P67fDSF33GAȉAEtHBHD3O3HBH 1AA@B\HH3H3G H 1ˉމ@LHH3H3_H 1Ή@DHH3HH 1؉AA@B\HH3H3OH 1ˉމ@LHH3HH 3G3_1Ή@DHH3H3O H 1؉AA@B\HH3H3G$H 1ˉމ@LHH3HH 1Ή3_(@DHH3H3O,H 1AAEtHBHD3G03HBH 1AȉAEtHBHD3HBH 1AAEtH3O4BHD3HBH 1AȉAEtHBHD3HBH 3G83O<1DDHDHD3H3_@DH D1ȉtHH3H3ODH jJ1@2ΉbJB1@rJ[DHHLJ@HH1HH)HHÐHt H@f.B=  H AWAH AVIAULwHATUISHGHHPH@HHHPLH5z MPHH)H)H\ HH G HH5E HIHIHH)IP I@H)H HH  LH5 HIHIH H)I@ H)H HHIH H HH5 H)I@H)H1H5 IfA_ A9ډ/A AA 3AHHHtCWAA9wAA AA A{C A9w1L11fDA3lj@ALHAHA3HA3@AH A3H1щω@ATHAHA3HA3H AH 1Љlj@ATHAHA3HA3@AH 1щω@ATHAHA3HAH 1Љlj@ATHAHA3HA3HAH A3@1ʉ׉@ALHAHA3HAH 1ω@ADHAHA3PA3HA3H AH 1Љlj@ATHAHA3HA3@$AH 1щω@ATHAHA3HAH 1ЉljA3H(@ATHAHA3HA3@,AH 1щω@ATHAHA3HA3H0AH 1Љlj@ATHAHA3HAH 1׉ATHAHA3H@AH A3@41ЉATHAHA3HAH A3x8HA3H<1׉@ADHAHA3HA3P@AH 1ȉlj@ALHAHA3HA3@DAH F1ʉVI9sAp AX IHE(E`AhEXt$Ap$AEPEHAxHL$t$Ap(t$Ap,t$Ap0t$Ap4t$Ap8t$ApfoD$pIn8Hs Lt$f$HL)$CHs(LH4Lct$$H5 foD$`)$LH<t`$$1Ћ$$1$$11ʉ$$LH|t`$$1Ћ$$1$$11ʉ$$LH|t`$$  1Ћ$$ 1$$ 11ʉ$$LH|t`$$1Ћ$$1$$11ʉ$$J H LHH1Ht A|HHuALfoD$pH|)$th$$AAD1D$$DA1‹$$1A1҉$D$LH|tdD$$DЉA1Ћ$$1Nj$$D11$$LH|tdD$$DЉ  A1Ћ$$ 1Nj$$ D11$$LH|1HTt A|HHuLfo$H|)$ti$$A‰AD1׉$$AAD1҉$$AA1D1׉$$LH| ti$$A҉AD1׉$$AAD1Љ$$AA1D1׉$$LH| ti$$A‰ A D1׉$$A AD1҉$$A A1D1׉$$LH| tdD$$DЉA1Ћ$$1Nj$$D11$$1DHT(t A|HHuALfo$H| )$ti$$AAD1ω$$AAD1ʉ$$AA1D1ω$$LH| ti$$AAD1ω$$AAD1ʉ$$AA1D1ω$$LH|ti$$A A D1ω$$A AD1ʉ$$A A1D1ω$$LH|1HTD9L9rH<H!$$1Ћ$$1Ƌ$$11$$D$$DЉA1Ћ$$1Nj$$D11$$: f.ATUIS"H dH%(H$1HHHHux$E1A$ADFHMcH0LLLID$AoILHAD$f9HHzy HzuLHAoDBH߾XH$dH3%(u H []A\B fAWAVHwAUATUSHHXD DBdH%(HD$H1DRB AAD3OD3GAD3W 3GHt$DL$0DD$4DT$8D$<QHo,HL$8H\$(L= L5 T$$HL- H|lL%w HL$AH|$H|$0HMD$0DED\$ HHT$(H|$H ET$hHt$H|$8foH] )$pfBo )$HT$ H|$LDIIWI3I3VH tw\$ D$hH$hdH3<%(D$h+ Hx[]A\A]A^A_fDH fBo )$pfo)$fDI1H HI D\$Dt$0T$hEqAAFDT$Ek H$Ld$8E1L-v H-? Dt$(HD$0DDL$ADCDEɉT$8t1H M HM H5; DD$@HE1DD$@HcBH H|$H޹ fAoEHHHc)$p)$ET$8Ht$H|$L4[1IH IILD$ HL$0H|$1Mfo$pfAo foD)$)$p)$IIWI3$I3T$H HH0uDD$ED$(D$(|$ H$ H- L|$(L|$H D$ H$H$LE(D$8H$H$HD$H$HD$xD$ t$AƃAD$0t1H)L H&L H5 LD$HE1LD$McH= !LLD$pHfoH= )$H4HT1fH$H$IH$I(III I)GIII8)G I()G0IIGILJ HHHD$%H0EIÈ$!HH@$&AHD$@$#HHD$$@|$@$)HHD$+AH|$H@$*LIHE I E @$ $"D$'$(LD$PD$,DŽ$PA D$-DL$ID$HI0ELD$XAD$.IAD D\$@D DD E ‹D$PD I8DT$l LD$`D$/AL$A D$XD d$`fo% t$@T$Mh A)@Ht$LA A)@0Dd$HM`()$Lfn|$Hfnd$lfnL$fnD$@fbfo- fbfo5 fl)$)$)$)$mLLHD$HpYfo$LHD$Lf$Hp)$+LLHD$Hpfo$1LD$pfp9fo)$frfofrffo)$frfofrffofr)$ frfofrffr f)$@)$0f.HTtTHHufo$1fp9fo)$fofrfrffo)$frfofrffofr)$ frfofrffr f)$@)$0DItTHHu1@HtTAHHu݋L$0K4vLcl$8LD$0HHHD$Lt$(H5 @LHL`MLD$05O .H$Ll$@E1MHD$8M#IB$IA0FAM9MuHL$xLHT$8LD$0$LD$0u$u$u$u$u$x$j$\$N$@$2$$$$$$DH=x \~L4[1H> IILD$ HL$0H|$Mfo$fAofoL)$)$p)$iIIWI3$I3T$H QHH0uDD$EiH=ȼ XMLl$@H5 LD$0Ht$H|$(LLD$0T$D$ D$ Hf HD$8mLt$(H5 Ht$@LLMLD$0tO .H$Ll$@E1MHD$8M&@IB$IA0FAM9MuHL$xLHT$8LD$0$LD$0u$u$u$u$u$x$j$\$N$@$2$$$$$$DMLD$0Ll$@H5 #H= LD$D$ LD$D$ 1D$uDD$hH=9- _D$h x i ZAWAVAUATUSHH$H|$HT$ HL$0LD$L$HD$8H$dH%(H$1H$H$$HAIHHIMyH)MɉňD$F)Ht$ LjD$GH$HH ȹ H|$aD$`HD$`HD$(LDd$oHD$nLH@tbD$mLH@tQD$lLH @t@D$kLH(@t/D$jLH0@tD$iLH8@u D$hHHl$pLl$XH|$foD$`HMH)D$p0MgHD$(E1HD$bHt$HxLfDG HGID$`D|$aIFHHD$foD$pHH|$MfD$`H)D$pAHD$I)L\$Lt$Ld$H\$HLLd$(IMDML)fHALFLLLA)$ foD$pMH|$HfD$`H)D$ptH$dH3%(HĨ[]A\A]A^A_Ld$Lt$H\$HfDD$GHT$0L$Ht$ H$L|$$cD$FH|$01IT?t MƄ$Ll$D|$FIHl$ H\$(@HEH=<AofD$`AEIII)쀄$ut$ujAtd$uZAtT$uJAtD$u:At4$u*At$$A$u u$MfIIFLHH))foD$pHt$ LD$fD$`H|$H)D$pLD$Ht$HH|$IEI9IFI911A 2L4`ALH9wHJHHDHH)Ѓ-1҉׃9H49rHl$ Ll$*D$0HT$1HH)HssHL$(Ht$MH|$ foD$pHH$H|$8fD$`D$)D$p;L$HJHHDHH)Ѓt1҉׃9H49r]R1fLFD D 1ft f.HHGPHH1HH)XHAUATIUSHHAHtRx HuIHYHHtH[]A\A]HDL[H]A\A]ǐHtSHH߾X[$s@@f.[f.H|$ tCf.AWAVAUATUSHH$H<$Ht$0HT$ HL$(LD$HD$@H$L$HD$dH%(H$1H$3H$$H$HD$HHAHHIMLt$pH)MɉÈD$?)Ht$ LjD$H$HH ȹ I~D$pHt$0H@t$HD$~HHt^D$}HHtND$|HH t>D${HH(t.D$zHH0tD$yHH8uD$xHH$Hl$XH<$foD$pIHH)$AMILI~E1HHt$IAHD$rMFfDG GLD$pDl$qfo$IH<$HٺfD$pH)$gAM)L|$Ld$I@II)IfLIFLHA)LMHٺHfo$H<$fD$p)$tAH$dH3<%(DHĸ[]A\A]A^A_LLd$@D$Ll$(L$Ht$ H$L|$Lꈄ$D$?1KT/t Ll$0Ƅ$MH\$ L|$@LHl$Dd$?0HEH=kofD$pAfHLLA)fo$Ht$ LD$fD$pH<$H)$ IHI)퀄$$A$u|$A$tdu`$uVAtP$A$t8u4$u*At$$A$u u$MLD$IHt$LH<$IF IGH9HCI911 2L4pA H9wHJHHDHH)Ѓ1҉׃9H49rAEH\$ Hl$*D$(HT$1HH)Hbtt1fLHt$H<$IL Afo$H|$`H$Hމ$fD$p)$H$D$H$HH=HD$ffofL$`fofhf`fofofifafifaffffofsffofsffA~EHt$0H|$@kAfDHD$HHt$1H$@2D `A H9wHJHHDHH)Ѓ1҉׃9H49rxD1ftDF;f.H|$ t3f.AWAV AUATAUSHLt$ dH%(H$1LHHt x HuLoHLt@E'AH$dH3 %(DVH[]A\A]A^A_DH5 LuH$L$1Dl$Lt$T$sfH H5) HEHL$)ELO4'A)A)GHu L,H L H MHLL$HD$hAUAVL AWUH H|$(HLH 7H HK,HLHfHEL H L)MAUAVUAWLL$0HL$8H|$(&H H5# LHhAD$u]HHLt$Dl$LXLhEucE1SH5 1rrDH= f.H5y 1A7f Dl$EH=` f.fAWAVHAUATUSHoHt$(H|$ )D$0fA~ƋL$4DL$8dH%(HT$x1oGL$l$<)D$@f~Ƌ\$DDd$HoG D\$L)D$PDT$\f~DD$To@0DT$ Dl$X)D$`L$dT$hf~D|$lHD$ DT$@AAED1D1D1AA1D1E1 A AAED1D1D1A1D1É|$D݉t$AA1ADD|$ E1AEAD1E1DA D1D1A1AAD1 AD1AAED1A1EA D1ED14|$A1t$ t$AA1A 1ED1AD1 A1A1AD1Hl$DT$LT$ E2Dt$0MDT$EfEVENAvE^A~ EF$AF0AN4An A^En(Dd$HDd$ Ef,DT$4DL$8t$@@D\$L|$PH|$0DD$TD$`L$dl$<\$DDl$XDd$\AV8foD$0E~H?vIF@I?H$ID$I]@M}HND=IHHD$(IFPHD$ IHD$fDI9AI9@AAo@AoN@fAGAoAoVPfAAo@Ao^`fAGAo@ AofpfAG I@I@H;\$(IyH@H4$LHL$LD$HL$AF0Jt-LD$J)H;D$ AL;<$@A5H<$fDHHD2_HDXD^D2_DXD^D2_DXD^D2_DXD^D2_DXD^D2_DXD^D2_DXD^D2_DXH;|$u@J4+M\@I)MHT5IHIofAv$IoBfACAtoB fAC A LHHI9tAT@A2HI9wMH81[]A\A]A^A_fA?tH$LHL$HHL$IEAF0ND-J<)H;|$ L@L9H H9M9AD @IMAID$MEHۺMHsHDH9HAA2F@HBD-A2FAHBD)hBD-A2FBHBD)BD-A2FCHBD)sBD-A2FDHBD)dBD-A2FEHBD)_BD-A2FFHBD)<BD-A2FGHBD)>BD-A2FHH BD)BD- A2FIH BD) BD- A2FJH BD) BD- A2FKH BD) BD- A2FLH BD) BD- A2FMHBD) BD-A2FNBD)P11AT@A2HI9w#  IFPHD$ 1b1 AWAVMAUATIUS@HIHHl$L $T$ dH%(H$1Lm@H\@Lu\fo @A$T$ Lfn[HDŽ$@fncfnKD$D)D$fbAD$fnCD$Hfnk AD$fbfnsT$@fnSD$Lflfn fbfb)D$0fl)L$ [LLHL $HDŽ$@LcH[H$dH3 %(uHĨ[]A\A]A^A_AWAVL=E AUATE1USE1H-R HH|$|$H\$ dH%(H$81H$HD$xHϘ H ؞ @HJF4HD$ZHC@@HHD$ZAHD$@fo Dt$PHDŽ$@T$TAWHfoET$XAWfoM)T$ T$\)L$0)D$@ZH V HJ!Ht$HL$HDŽ$@AHTZEH HT$H|$I4T$H I IwIuHD$t D$H$8dH3 %(D$HH[]A\A]A^A_Ð|$AH5 D1mH= bt$u8D$uL$tH=ܖ D$QH5 D1D$' SHH+HǃHǃǃǃ[Df.HtKSHHHǃHǃǃǃ[f.@f.{f.AUATAUS1IHXdH%(HD$H1Ht0@HXHL$HdH3 %(HX[]A\A]ffHH@L)$)D$)D$ )D$0fuI$HuIDŽ$IDŽ$ADŽ$E$Y@uHHLj$@f.AUATIUSH(dH%(HD$1PHIHLtNHLL uHLLHgHL$dH3 %(H([]A\A]ÐHLLH/uHLHI LJX1Ht$ HfT$HD$ )D$D$ ZDFAUATUSH(dH%(HD$1HHLHHIH$T$HǃLL$HLHL$HHL$HH L$HH(L$HH8D$HH0HL$D$ HHD$ HHD$ HH D$ HH(D$ HH8H0T$D$ u HLHt$dH34%(H([]A\A]DHurHIЃ1IH$fT$ D$D$)LL4 xHHf1IH$D$)ft$ D$"AWAVIAUATIUSH1LHHxMH$L$HD$dH%(HD$h1LD$ t;@LljD$SD$HL$hdH3 %( Hx[]A\A]A^A_fLL¾@LLD$)D$ )D$0)D$@)D$PLD$uILLD$HHD${ LD$cILJILJ@ALJALJLRA,IH|$HH{  LLLLRHt$L}AWAVIAUATHUS1IILHxMH$H\$ HD$H$HD$dH%(HD$h1zt>@H߉D$RD$HL$hdH3 %(Hx[]A\A]A^A_fDfHHھ@L)D$ )D$0)D$@)D$PMuIHHHD$tIdžIdž@AdžAdžHQQA=IH|$HLHL$HT$LLHLAo$fffT$ fofhf`fofofofifafafiffffofsffofsff~H|$LtPiuDAWAVAUATAUSHdH%(H$1HHHJH5# HHDŽ$HDŽ$DŽ$DŽ$u9H5ʕ 1HL$ tR@LOE@H$dH3 %(H[]A\A]A^A_DfLL@H)$)$)$ )$0mLLLuQ@LHDŽ$HDŽ$DŽ$DŽ$N$H5 LH$ uH LrHDL$HLgH5F rLaIIWH3 H3 H ugH1LUEHDŽ$HDŽ$DŽ$DŽ$FH=^ B h+EH==  H5ّ 1HzHRHH5 HHDŽ$HDŽ$DŽ$DŽ$YXH5 ¿1zfYH5 1OE7H=F ;&AWAVHAUATHUSDO_ DGL$D DW,EDo0D7HH\$ADEˋG$H\$DEAH\$Dg(C,AH|$ADEEIHl$AL\$Dt$EHt$f.DBEDDBAA  A JA JEJ r r HKDJ MH HJ J  r r  DIHDDJI LAA J A JA DILI LLl$IɉI DL$F$G ILIMLL|$MIMMLD$LMMMLIMIMMILMMMMLD$MLMILLMIMMMLMHHILd$HHLEH HJ HΉH LHH ILEH ljAALILEH L LDH HHAH ILEH HH9T$H|$Dw DO$w(DG,O0[]A\A]A^A_Df.PIfDHt PI@f.SHfH4%G̋F%GЋF%GԋF %G؋FG܋FGFGFGGGLHPHAHT$hdH3%(uYHp[]A\A]A^DH}4LLLd$X菿DLLHHLAHvLff.AWAVAAUATL%Έ US1HHl$L|$`dH%(HD$x1HE4EHD$uHp PHL,@fo fH|$fA$D$@)L$0)D$fAoD$)D$ @HH6 LHHH)HD$XH8At1PHT@EH5 D1%LH5PAH@EuHH v IHIwHH3pH3H u\Et H=g KI HuQEt E1_HL$xdH3 %(DusHĈ[]A\A]A^A_f.Eu;AEH5 ڿ1MqH= A许zD@HIHu5I9MLu 1IHH1HHHHHfH9w{HH?AS@HHcMH)IIII IHHLHH IIHII9rDHH9sHI9uCHF1[11HHI1@H9r 11I9S1ҸfDH1[ÐAWAVIAUATL%.UH-.SAIL)HHHt 1LLDAHH9uH[]A\A]A^A_Ðf.f.@H /1ҿHHpremake.criteria__gc_OPTIONSinsecureheadersprogressuserpwdusernamepasswordtimeoutmssslverifyhostsslverifypeerproxyurlinterrupted!__tostring(error object is a %s value)>> return %s_PROMPT_PROMPT2return %s;=stdintoo many results to printerror calling 'print' (%s)%s: =LUA_INIT=LUA_INIT_5_3'%s' needs argument unrecognized option '%s' LUA_NOENV=(command line)require'arg' is not a tabletoo many arguments to scriptusage: %s [options] [script [args]] Available options are: -e stat execute string 'stat' -i enter interactive mode after executing 'script' -l name require library 'name' into global 'name' -v show version information -E ignore environment variables -- stop handling options - stop handling options and execute stdin Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Riocannot create state: not enough memoryp@wbUnable to open file.%s %s OK_SCRIPT_SCRIPT_DIR_LOADED_G.Sl%s:%d: bad argument #%d (%s)calling '%s' on bad self (%s)bad argument #%d to '%s' (%s)stack traceback: ...Slnt %s:%d: in function '%s'%s '%s'main chunkfunction <%s:%d> (...tail calls...)light userdata__name%s expected, got %ssignalexitinvalid option '%s'stack overflow (%s)value expectedbuffer too largeLUABOXcannot %s %s: %srbreopentruefalse%I%f%s: %ptoo many upvaluesmultiple Lua VMs detectedPANIC: unprotected error in call to Lua API (%s) not enough memory for buffer allocationnumber has no integer representationobject length is not an integer'__tostring' must return a stringcore and library have incompatible numeric typesversion mismatch: app. needs %f, Lua core provides %fcannot open %s: No such file or directoryunable to switch to directory '%s'unable to set mode %o on '%s', errno %d : %sfailed to open first filefailed to open second filefailed to read first file contentfailed to read second file content(error with no message)Unable to compile '%s': %sunable to write to '%s'cp "%s" "%s"unable to copy file to '%s'linux.-majorversionminorversionrevisiondescription$/%s/%sunable to create directory '%s'unable to fetch real path of '%s', errno %d : %sunable to remove directory '%s''%s' could not be accessed'%s' was not foundmtimeAn unknown error %d occured while accessing '%s'abunable to touch file '%s'unable to open file to '%s'/dev/urandom%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02Xunable to write file to '%s'Filename)Extension)**normalizegetDefaultSeparatorWildcards expansion too big.~debugbufferedtermhttp5.0.0-beta1_PREMAKE_VERSION_PREMAKE_COPYRIGHT_PREMAKE_URL_TARGET_OSHOMEUSERPROFILE_USER_HOME_DIR_WORKING_DIRerrorColorError: %s /proc/self/exePREMAKE_PATH_PREMAKE_COMMAND/scripts=--scripts=_ARGV/.premakegsub_premake_mainextractpostgetTextColorsetTextColornewwritelncloseendswithstartswithgetEmbeddedResourcechdirchmodcomparefilescopyfile_is64bitisdirgetcwdgetpassgetWindowsRegistrylistWindowsRegistrygetversionislinklocatematchdonematchisfilematchnamematchnextmatchstartmkdirpathsearchrealpathrmdirstatuuidwritefile_ifnotequaltouchfilegetabsolutegetrelativeisabsolutehasdeferredjoinresolvedeferredjointranslatewildcardsprompt_compile_deletematchesCopyright (C) 2002-2021 Jason Perkins and the Premake Projecthttps://github.com/premake/premake-core/wiki;/usr/local/share/premake;/usr/share/premakesrc/_premake_main.luasrc/base/_foundation.luasrc/base/string.luasrc/base/table.luasrc/base/path.luasrc/base/os.luasrc/base/io.luasrc/base/tools.luasrc/base/tree.luasrc/base/globals.luasrc/base/semver.luasrc/base/http.luasrc/base/json.luasrc/base/jsonwrapper.luasrc/base/languages.luasrc/base/term.luasrc/base/field.luasrc/base/criteria.luasrc/base/detoken.luasrc/base/configset.luasrc/base/context.luasrc/base/container.luasrc/base/option.luasrc/base/action.luasrc/base/api.luasrc/base/global.luasrc/base/workspace.luasrc/base/group.luasrc/base/project.luasrc/base/config.luasrc/base/fileconfig.luasrc/base/rule.luasrc/base/oven.luasrc/base/validation.luasrc/base/premake.luasrc/base/help.luasrc/tools/dotnet.luasrc/tools/gcc.luasrc/tools/msc.luasrc/tools/snc.luasrc/tools/clang.luasrc/tools/mingw.luasrc/actions/clean/_clean.luasrc/_premake_init.luaxcode/_preload.luaxcode/xcode.luaxcode/xcode4_workspace.luaxcode/xcode_common.luaxcode/xcode_project.luaraw/_preload.luaraw/raw.luaraw/raw_action.luagmake/_preload.luagmake/gmake.luagmake/gmake_cpp.luagmake/gmake_csharp.luagmake/gmake_makefile.luagmake/gmake_utility.luagmake/gmake_workspace.luagmake2/_preload.luagmake2/gmake2.luagmake2/gmake2_cpp.luagmake2/gmake2_csharp.luagmake2/gmake2_makefile.luagmake2/gmake2_utility.luagmake2/gmake2_workspace.luacodelite/_preload.luacodelite/codelite.luacodelite/codelite_project.luad/d.luad/actions/gmake.luad/actions/vcxproj.luad/actions/visuald.luad/tools/dmd.luad/tools/gdc.luad/tools/ldc.luaself-test/self-test.luaself-test/test_assertions.luaself-test/test_declare.luaself-test/test_helpers.luaself-test/test_runner.luavstudio/_preload.luavstudio/vstudio.luavstudio/vs2005.luavstudio/vs2008.luavstudio/vs200x_vcproj.luavstudio/vs2005_solution.luavstudio/vs2005_dotnetbase.luavstudio/vs2005_csproj.luavstudio/vs2005_fsproj.luavstudio/vs2010.luavstudio/vs2010_nuget.luavstudio/vs2010_vcxproj.luavstudio/vs2010_rules_xml.luavstudio/vs2012.luavstudio/vs2013.luavstudio/vs2013_vcxitems.luavstudio/vs2015.luavstudio/vs2017.luavstudio/vs2019.luavstudio/vs2022.luaandroid/_preload.luaandroid/android.luaandroid/vsandroid_vcxproj.luaandroid/vsandroid_sln2005.luaandroid/vsandroid_vstudio.luasrc/_manifest.luasrc/_modules.luacodelite/codelite_workspace.luavstudio/vs200x_vcproj_user.luavstudio/vs2005_csproj_user.luavstudio/vs2005_fsproj_user.luavstudio/vs2010_vcxproj_user.luavstudio/vs2010_vcxproj_filters.luavstudio/vs2010_rules_props.luavstudio/vs2010_rules_targets.luaandroid/vsandroid_androidproj.luareturn {"gmake", "vstudio", "xcode", "codelite", "gmake2", "d", "android"}return { "base/_foundation.lua", "base/string.lua", "base/table.lua", "base/path.lua", "base/os.lua", "base/io.lua", "base/tools.lua", "base/tree.lua", "base/globals.lua", "base/semver.lua", "base/http.lua", "base/json.lua", "base/jsonwrapper.lua", "base/languages.lua", "base/term.lua", "base/field.lua", "base/criteria.lua", "base/detoken.lua", "base/configset.lua", "base/context.lua", "base/container.lua", "base/option.lua", "base/action.lua", "base/api.lua", "base/global.lua", "base/workspace.lua", "base/group.lua", "base/project.lua", "base/config.lua", "base/fileconfig.lua", "base/rule.lua", "base/oven.lua", "base/validation.lua", "base/premake.lua", "base/help.lua", "tools/dotnet.lua", "tools/gcc.lua", "tools/msc.lua", "tools/snc.lua", "tools/clang.lua", "tools/mingw.lua", "actions/clean/_clean.lua", "_premake_init.lua", } local shorthelp = "Type 'premake5 --help' for help" local versionhelp = "premake5 (Premake Build Script Generator) %s" local startTime = os.clock() _PREMAKE_STARTTIME = startTime local modules = dofile("_modules.lua") local manifest = dofile("_manifest.lua") for i = 1, #manifest do dofile(manifest[i]) end local p = premake p.main = {} local m = p.main m._preloaded = {} function m.installModuleLoader() if not os.ishost('windows') then local premakeDir = path.getdirectory(_PREMAKE_COMMAND) package.cpath = package.cpath .. ';' .. premakeDir .. '/?.so' end table.insert(package.searchers, 2, m.moduleLoader) end function m.moduleLoader(name) local dir = path.getdirectory(name) local base = path.getname(name) if dir ~= "." then dir = dir .. "/" .. base else dir = base end local full = dir .. "/" .. base .. ".lua" local paths = { ".modules/" .. full, "modules/" .. full, full, name .. ".lua" } if string.startswith(_SCRIPT_DIR, '$/') then table.insert(paths, 1, '$/' .. full) end for _, p in ipairs(paths) do local file = os.locate(p) if file then local chunk, err = loadfile(file) if chunk then return chunk end if err then return "\n\tload error " .. err end end end for _, p in ipairs(paths) do local chunk, err = loadfile("$/" .. p) if chunk then return chunk end end end function m.prepareEnvironment() math.randomseed(os.time()) _PREMAKE_DIR = path.getdirectory(_PREMAKE_COMMAND) p.path = p.path .. ";" .. _PREMAKE_DIR .. ";" .. _MAIN_SCRIPT_DIR end function m.preloadModules() for i = 1, #modules do local name = modules[i] local preloader = name .. "/_preload.lua" preloader = os.locate("modules/" .. preloader) or os.locate(preloader) if preloader then local modulePath = path.getdirectory(preloader) m._preloaded[modulePath] = include(preloader) if not m._preloaded[modulePath] then p.warn("module '%s' should return function from _preload.lua", name) end else require(name) end end end function m.runSystemScript() dofileopt(_OPTIONS["systemscript"] or { "premake5-system.lua", "premake-system.lua" }) filter {} end function m.locateUserScript() local defaults = { "premake5.lua", "premake4.lua" } for i = 1, #defaults do if os.isfile(defaults[i]) then _MAIN_SCRIPT = defaults[i] break end end if not _MAIN_SCRIPT then _MAIN_SCRIPT = defaults[1] end if _OPTIONS.file then _MAIN_SCRIPT = _OPTIONS.file end _MAIN_SCRIPT = path.getabsolute(_MAIN_SCRIPT) _MAIN_SCRIPT_DIR = path.getdirectory(_MAIN_SCRIPT) end function m.prepareAction() p.action.set(_ACTION) local action = p.action.current() if action then p.action.initialize(action.trigger) end end function m.runUserScript() if os.isfile(_MAIN_SCRIPT) then dofile(_MAIN_SCRIPT) end end function m.checkInteractive() if _OPTIONS.interactive then debug.prompt() end end function m.processCommandLine() if (_OPTIONS["version"]) then printf(versionhelp, _PREMAKE_VERSION) os.exit(0) end if (_OPTIONS["help"]) then p.showhelp() os.exit(1) end ok, err = p.option.validate(_OPTIONS) if not ok then print("Error: " .. err) os.exit(1) end if not _OPTIONS.interactive then if not _ACTION then print(shorthelp) os.exit(1) end local action = p.action.current() if not action then print("Error: no such action '" .. _ACTION .. "'") os.exit(1) end if p.action.isConfigurable() and not os.isfile(_MAIN_SCRIPT) then print(string.format("No Premake script (%s) found!", path.getname(_MAIN_SCRIPT))) os.exit(1) end end end function m.tryHookDebugger() if (_OPTIONS["debugger"]) then print("Loading luasocket...") require('luasocket') print("Starting debugger...") local mobdebug = require('mobdebug') mobdebug.start() end end function m.preBake() if p.action.isConfigurable() then print("Building configurations...") end end function m.bake() if p.action.isConfigurable() then p.oven.bake() end end function m.postBake() local function shouldLoad(func) for wks in p.global.eachWorkspace() do for prj in p.workspace.eachproject(wks) do for cfg in p.project.eachconfig(prj) do if func(cfg) then return true end end end end end for modulePath, func in pairs(m._preloaded) do local moduleName = path.getbasename(modulePath) if not package.loaded[moduleName] and shouldLoad(func) then _SCRIPT_DIR = modulePath require(moduleName) end end end function m.validate() if p.action.isConfigurable() then p.container.validate(p.api.rootContainer()) end end function m.preAction() local action = p.action.current() printf("Running action '%s'...", action.trigger) end function m.callAction() local action = p.action.current() p.action.call(action.trigger) end function m.postAction() if p.action.isConfigurable() then local duration = math.floor((os.clock() - startTime) * 1000); printf("Done (%dms).", duration) end end m.elements = { m.tryHookDebugger, m.installModuleLoader, m.locateUserScript, m.prepareEnvironment, m.preloadModules, m.runSystemScript, m.prepareAction, m.runUserScript, m.checkInteractive, m.processCommandLine, m.preBake, m.bake, m.postBake, m.validate, m.preAction, m.callAction, m.postAction, } function _premake_main() p.callArray(m.elements) return 0 end local p = premake local android = p.modules.android local vsandroid = p.modules.vsandroid local vc2010 = p.vstudio.vc2010 local vstudio = p.vstudio local project = p.project premake.override(vstudio.vs2010, "generateProject", function(oldfn, prj) if prj.kind == p.PACKAGING then p.eol("\r\n") p.indent(" ") p.escaper(vstudio.vs2010.esc) if project.iscpp(prj) then p.generate(prj, ".androidproj", vc2010.generate) local user = p.capture(function() vc2010.generateUser(prj) end) if #user > 0 then p.generate(prj, ".androidproj.user", function() p.outln(user) end) end end else oldfn(prj) end end) premake.override(vstudio, "projectfile", function(oldfn, prj) if prj.kind == p.PACKAGING then return premake.filename(prj, ".androidproj") else return oldfn(prj) end end) premake.override(vstudio, "tool", function(oldfn, prj) if prj.kind == p.PACKAGING then return "39E2626F-3545-4960-A6E8-258AD8476CE5" else return oldfn(prj) end end) premake.override(vc2010.elements, "globals", function (oldfn, cfg) local elements = oldfn(cfg) if cfg.kind == premake.PACKAGING then local pos = table.indexof(elements, vc2010.ignoreWarnDuplicateFilename) table.remove(elements, pos) elements = table.join(elements, { android.projectVersion }) end return elements end) function android.projectVersion(cfg) _p(2, "%s", cfg.project.name) _p(2, "14.0") _p(2, "1.0") end premake.override(vc2010.elements, "configurationProperties", function(oldfn, cfg) local elements = oldfn(cfg) if cfg.kind == p.PACKAGING then elements = { android.androidAPILevel, vc2010.useDebugLibraries, } end return elements end) premake.override(vc2010.elements, "itemDefinitionGroup", function(oldfn, cfg) local elements = oldfn(cfg) if cfg.kind == p.PACKAGING then elements = { android.antPackage, } end return elements end) premake.override(vc2010, "importDefaultProps", function(oldfn, prj) if prj.kind == p.PACKAGING then p.w('') else oldfn(prj) end end) premake.override(vc2010, "importLanguageSettings", function(oldfn, prj) if prj.kind == p.PACKAGING then p.w('') else oldfn(prj) end end) premake.override(vc2010, "propertySheets", function(oldfn, cfg) if cfg.kind ~= p.PACKAGING then oldfn(cfg) end end) premake.override(vc2010.elements, "outputProperties", function(oldfn, cfg) if cfg.kind == p.PACKAGING then return { android.outDir, vc2010.intDir, vc2010.targetName, } else return oldfn(cfg) end end) function android.outDir(cfg) vc2010.element("OutDir", nil, "%s\\", cfg.buildtarget.directory) end premake.override(vc2010, "importLanguageTargets", function(oldfn, prj) if prj.kind == p.PACKAGING then p.w('') else oldfn(prj) end end) function android.link(cfg, file) local fname = path.translate(file.relpath, '/') local link, count = fname:gsub("%.%.%/", "") local external = (count > 0) or fname:find(':', 1, true) or (file.vpath and file.vpath ~= file.relpath) if external and file.vpath ~= file.relpath then link = file.vpath end if external then vc2010.element("Link", nil, path.translate(link)) end end vc2010.categories.AndroidManifest = { name = "AndroidManifest", priority = 99, emitFiles = function(prj, group) vc2010.emitFiles(prj, group, "AndroidManifest", {vc2010.generatedFile, android.link, android.manifestSubType}) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "AndroidManifest") end } function android.manifestSubType(cfg, file) vc2010.element("SubType", nil, "Designer") end vc2010.categories.AntBuildXml = { name = "AntBuildXml", priority = 99, emitFiles = function(prj, group) vc2010.emitFiles(prj, group, "AntBuildXml", {vc2010.generatedFile, android.link}) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "AntBuildXml") end } vc2010.categories.AntProjectPropertiesFile = { name = "AntProjectPropertiesFile", priority = 99, emitFiles = function(prj, group) vc2010.emitFiles(prj, group, "AntProjectPropertiesFile", {vc2010.generatedFile, android.link}) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "AntProjectPropertiesFile") end } vc2010.categories.JavaCompile = { name = "JavaCompile", priority = 99, emitFiles = function(prj, group) vc2010.emitFiles(prj, group, "JavaCompile", {vc2010.generatedFile, android.link}) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "JavaCompile") end } vc2010.categories.Content = { name = "Content", priority = 99, emitFiles = function(prj, group) vc2010.emitFiles(prj, group, "Content", {vc2010.generatedFile, android.link}) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "Content") end } premake.override(vc2010, "categorizeFile", function(base, prj, file) if prj.kind ~= p.PACKAGING then return base(prj, file) end local filename = path.getname(file.name):lower() local extension = path.getextension(filename) if filename == "androidmanifest.xml" then return vc2010.categories.AndroidManifest elseif filename == "build.xml" then return vc2010.categories.AntBuildXml elseif filename == "project.properties" then return vc2010.categories.AntProjectPropertiesFile elseif extension == ".java" then return vc2010.categories.JavaCompile else return vc2010.categories.Content end end) local p = premake local android = p.modules.android local vsandroid = p.modules.vsandroid local vstudio = p.vstudio premake.override(vstudio, "solutionPlatform", function (oldfn, cfg) local platform = oldfn(cfg) if cfg.system == premake.ANDROID and _ACTION >= "vs2015" then if cfg.platform == "x86" then platform = "x86" end end return platform end) premake.override(vstudio, "archFromConfig", function (oldfn, cfg, win32) if cfg.system == premake.ANDROID and _ACTION >= "vs2015" then return oldfn(cfg) end return oldfn(cfg, win32) end) local p = premake local android = p.modules.android local vsandroid = p.modules.vsandroid local sln2005 = p.vstudio.sln2005 premake.override(sln2005.elements, "projectConfigurationPlatforms", function(oldfn, cfg, context) local elements = oldfn(cfg, context) if cfg.system == premake.ANDROID and _ACTION >= "vs2015" then elements = table.join(elements, { android.deployProject }) end return elements end) function android.deployProject(cfg, context) if context.prjCfg.kind == p.PACKAGING and _ACTION >= "vs2015" then p.w('{%s}.%s.Deploy.0 = %s|%s', context.prj.uuid, context.descriptor, context.platform, context.architecture) end end local p = premake p.modules.vsandroid = { } local android = p.modules.android local vsandroid = p.modules.vsandroid local vc2010 = p.vstudio.vc2010 local vstudio = p.vstudio local project = p.project local config = p.config local function setBoolOption(optionName, flag, value) if flag ~= nil then vc2010.element(optionName, nil, value) end end if vstudio.vs2010_architectures ~= nil then if _ACTION >= "vs2015" then vstudio.vs2010_architectures.arm = "ARM" else vstudio.vs2010_architectures.android = "Android" end end premake.override(vc2010.elements, "globals", function (oldfn, prj) local elements = oldfn(prj) if prj.system == premake.ANDROID and prj.kind ~= premake.PACKAGING then local pos = table.indexof(elements, vc2010.ignoreWarnDuplicateFilename) table.remove(elements, pos) elements = table.join(elements, { android.androidApplicationType }) end return elements end) premake.override(vc2010.elements, "globalsCondition", function (oldfn, prj, cfg) local elements = oldfn(prj, cfg) if cfg.system == premake.ANDROID and cfg.system ~= prj.system and cfg.kind ~= premake.PACKAGING then elements = table.join(elements, { android.androidApplicationType }) end return elements end) function android.androidApplicationType(cfg) vc2010.element("Keyword", nil, "Android") vc2010.element("RootNamespace", nil, "%s", cfg.project.name) if _ACTION >= "vs2019" then vc2010.element("MinimumVisualStudioVersion", nil, "16.0") elseif _ACTION >= "vs2017" then vc2010.element("MinimumVisualStudioVersion", nil, "15.0") elseif _ACTION >= "vs2015" then vc2010.element("MinimumVisualStudioVersion", nil, "14.0") end vc2010.element("ApplicationType", nil, "Android") if _ACTION >= "vs2017" then vc2010.element("ApplicationTypeRevision", nil, "3.0") elseif _ACTION >= "vs2015" then vc2010.element("ApplicationTypeRevision", nil, "2.0") else vc2010.element("ApplicationTypeRevision", nil, "1.0") end end premake.override(vc2010.elements, "configurationProperties", function(oldfn, cfg) local elements = oldfn(cfg) if cfg.kind ~= p.UTILITY and cfg.kind ~= p.PACKAGING and cfg.system == premake.ANDROID then table.remove(elements, table.indexof(elements, vc2010.characterSet)) table.remove(elements, table.indexof(elements, vc2010.wholeProgramOptimization)) table.remove(elements, table.indexof(elements, vc2010.windowsSDKDesktopARMSupport)) elements = table.join(elements, { android.androidAPILevel, android.androidStlType, }) if _ACTION >= "vs2015" then elements = table.join(elements, { android.thumbMode, }) end end return elements end) function android.androidAPILevel(cfg) if cfg.androidapilevel ~= nil then vc2010.element("AndroidAPILevel", nil, "android-" .. cfg.androidapilevel) end end function android.androidStlType(cfg) if cfg.stl ~= nil then local stlType = { ["none"] = "system", ["gabi++"] = "gabi++", ["stlport"] = "stlport", ["gnu"] = "gnustl", ["libc++"] = "c++", } local postfix = iif(cfg.staticruntime == "On", "_static", "_shared") local runtimeLib = iif(cfg.stl == "none", "system", stlType[cfg.stl] .. postfix) if _ACTION >= "vs2015" then vc2010.element("UseOfStl", nil, runtimeLib) else vc2010.element("AndroidStlType", nil, runtimeLib) end end end function android.thumbMode(cfg) if cfg.thumbmode ~= nil then local thumbMode = { thumb = "Thumb", arm = "ARM", disabled = "Disabled", } vc2010.element("ThumbMode", nil, thumbMode[cfg.thumbmode]) end end premake.override(vc2010, "platformToolset", function(oldfn, cfg) if cfg.system ~= premake.ANDROID then return oldfn(cfg) end if _ACTION >= "vs2015" then local gcc_map = { ["4.6"] = "GCC_4_6", ["4.8"] = "GCC_4_8", ["4.9"] = "GCC_4_9", } local clang_map = { ["3.4"] = "Clang_3_4", ["3.5"] = "Clang_3_5", ["3.6"] = "Clang_3_6", ["3.8"] = "Clang_3_8", ["5.0"] = "Clang_5_0", } if cfg.toolchainversion ~= nil then local map = iif(cfg.toolset == "gcc", gcc_map, clang_map) local ts = map[cfg.toolchainversion] if ts == nil then p.error('Invalid toolchainversion for the selected toolset (%s).', cfg.toolset or "clang") end vc2010.element("PlatformToolset", nil, ts) end else local archMap = { arm = "armv5te", -- should arm5 be default? vs-android thinks so... arm5 = "armv5te", arm7 = "armv7-a", mips = "mips", x86 = "x86", } local arch = cfg.architecture or "arm" if (cfg.architecture ~= nil or cfg.toolchainversion ~= nil) and archMap[arch] ~= nil then local defaultToolsetMap = { arm = "arm-linux-androideabi-", armv5 = "arm-linux-androideabi-", armv7 = "arm-linux-androideabi-", aarch64 = "aarch64-linux-android-", mips = "mipsel-linux-android-", mips64 = "mips64el-linux-android-", x86 = "x86-", x86_64 = "x86_64-", } local toolset = defaultToolsetMap[arch] if cfg.toolset == "clang" then error("The clang toolset is not yet supported by vs-android", 2) toolset = toolset .. "clang" elseif cfg.toolset and cfg.toolset ~= "gcc" then error("Toolset not supported by the android NDK: " .. cfg.toolset, 2) end local version = cfg.toolchainversion or iif(cfg.toolset == "clang", "3.5", "4.9") vc2010.element("PlatformToolset", nil, toolset .. version) vc2010.element("AndroidArch", nil, archMap[arch]) end end end) premake.override(vc2010.elements, "clCompile", function(oldfn, cfg) local elements = oldfn(cfg) if cfg.system == premake.ANDROID then elements = table.join(elements, { android.debugInformation, android.strictAliasing, android.fpu, android.pic, android.shortEnums, android.cStandard, android.cppStandard, }) if _ACTION >= "vs2015" then table.remove(elements, table.indexof(elements, vc2010.debugInformationFormat)) table.remove(elements, table.indexof(elements, vc2010.languageStandard)) table.remove(elements, table.indexof(elements, vc2010.multiProcessorCompilation)) table.remove(elements, table.indexof(elements, vc2010.minimalRebuild)) table.replace(elements, vc2010.enableEnhancedInstructionSet, android.enableEnhancedInstructionSet) table.replace(elements, vc2010.precompiledHeaderFile, android.precompiledHeaderFile) end end return elements end) function android.precompiledHeaderFile(fileName, cfg) vc2010.element("PrecompiledHeaderFile", nil, "%s", path.getabsolute(path.rebase(fileName, cfg.basedir, cfg.location))) end function android.debugInformation(cfg) if cfg.flags.Symbols then _p(3,'true') end end function android.strictAliasing(cfg) if cfg.strictaliasing ~= nil then vc2010.element("StrictAliasing", nil, iif(cfg.strictaliasing == "Off", "false", "true")) end end function android.fpu(cfg) if cfg.fpu ~= nil then _p(3,'true', iif(cfg.fpu == "Software", "true", "false")) end end function android.pic(cfg) if cfg.pic ~= nil then vc2010.element("PositionIndependentCode", nil, iif(cfg.pic == "On", "true", "false")) end end function android.verboseCompiler(cfg) setBoolOption("Verbose", cfg.flags.VerboseCompiler, "true") end function android.undefineAllPreprocessorDefinitions(cfg) setBoolOption("UndefineAllPreprocessorDefinitions", cfg.flags.UndefineAllPreprocessorDefinitions, "true") end function android.showIncludes(cfg) setBoolOption("ShowIncludes", cfg.flags.ShowIncludes, "true") end function android.dataLevelLinking(cfg) setBoolOption("DataLevelLinking", cfg.flags.DataLevelLinking, "true") end function android.shortEnums(cfg) setBoolOption("UseShortEnums", cfg.flags.UseShortEnums, "true") end function android.cStandard(cfg) local c_langmap = { ["C98"] = "c98", ["C99"] = "c99", ["C11"] = "c11", ["gnu99"] = "gnu99", ["gnu11"] = "gnu11", } if c_langmap[cfg.cdialect] ~= nil then vc2010.element("CLanguageStandard", nil, c_langmap[cfg.cdialect]) end end function android.cppStandard(cfg) local cpp_langmap = { ["C++98"] = "c++98", ["C++11"] = "c++11", ["C++14"] = "c++1y", ["C++17"] = "c++1z", ["C++latest"] = "c++1z", ["gnu++98"] = "gnu++98", ["gnu++11"] = "gnu++11", ["gnu++14"] = "gnu++1y", ["gnu++17"] = "gnu++1z", } if cpp_langmap[cfg.cppdialect] ~= nil then vc2010.element("CppLanguageStandard", nil, cpp_langmap[cfg.cppdialect]) end end p.override(vc2010, "additionalCompileOptions", function(oldfn, cfg, condition) if cfg.system == p.ANDROID then local opts = cfg.buildoptions if cfg.disablewarnings and #cfg.disablewarnings > 0 then for _, warning in ipairs(cfg.disablewarnings) do table.insert(opts, '-Wno-' .. warning) end end if cfg.visibility ~= nil then table.insert(opts, p.tools.gcc.cxxflags.visibility[cfg.visibility]) end if #opts > 0 then opts = table.concat(opts, " ") vc2010.element("AdditionalOptions", condition, '%s %%(AdditionalOptions)', opts) end else oldfn(cfg, condition) end end) p.override(vc2010, "warningLevel", function(oldfn, cfg) if _ACTION >= "vs2015" and cfg.system == p.ANDROID and cfg.warnings and cfg.warnings ~= "Off" then vc2010.element("WarningLevel", nil, "EnableAllWarnings") elseif (_ACTION >= "vs2015" and cfg.system == p.ANDROID and cfg.warnings) or not (_ACTION >= "vs2015" and cfg.system == p.ANDROID) then oldfn(cfg) end end) premake.override(vc2010, "clCompilePreprocessorDefinitions", function(oldfn, cfg, condition) if cfg.system == p.ANDROID then vc2010.preprocessorDefinitions(cfg, cfg.defines, false, condition) else oldfn(cfg, condition) end end) premake.override(vc2010, "exceptionHandling", function(oldfn, cfg, condition) if cfg.system == p.ANDROID then local exceptions = { On = "Enabled", Off = "Disabled", UnwindTables = "UnwindTables", } if _ACTION >= "vs2015" then if exceptions[cfg.exceptionhandling] ~= nil then vc2010.element("ExceptionHandling", condition, exceptions[cfg.exceptionhandling]) end else if cfg.exceptionhandling == premake.ON then vc2010.element("GccExceptionHandling", condition, "true") end end else oldfn(cfg, condition) end end) function android.enableEnhancedInstructionSet(cfg) if cfg.vectorextensions == "NEON" then vc2010.element("EnableNeonCodegen", nil, "true") end end premake.override(vc2010, "runtimeTypeInfo", function(oldfn, cfg, condition) if cfg.system == premake.ANDROID then if cfg.rtti == premake.ON then vc2010.element("RuntimeTypeInfo", condition, "true") end else oldfn(cfg, condition) end end) premake.override(vc2010, "generateDebugInformation", function(oldfn, cfg) if cfg.system ~= premake.ANDROID then oldfn(cfg) end end) premake.override(vc2010.elements, "itemDefinitionGroup", function(oldfn, cfg) local elements = oldfn(cfg) if cfg.system == premake.ANDROID and _ACTION < "vs2015" then elements = table.join(elements, { android.antBuild, }) end return elements end) function android.antPackage(cfg) p.push('') if cfg.androidapplibname ~= nil then vc2010.element("AndroidAppLibName", nil, cfg.androidapplibname) else vc2010.element("AndroidAppLibName", nil, "$(RootNamespace)") end p.pop('') end function android.antBuild(cfg) if cfg.kind == premake.STATICLIB or cfg.kind == premake.SHAREDLIB then return end _p(2,'') _p(3,'%s', iif(premake.config.isDebugBuild(cfg), "Debug", "Release")) _p(2,'') end premake.override(vc2010, "additionalCompileOptions", function(oldfn, cfg, condition) if cfg.system == premake.ANDROID then vsandroid.additionalOptions(cfg, condition) end return oldfn(cfg, condition) end) premake.override(vc2010.elements, "user", function(oldfn, cfg) if cfg.system == p.ANDROID then return {} else return oldfn(cfg) end end) function vsandroid.additionalOptions(cfg) if _ACTION >= "vs2015" then else local function alreadyHas(t, key) for _, k in ipairs(t) do if string.find(k, key) then return true end end return false end if not cfg.architecture or string.startswith(cfg.architecture, "arm") then if cfg.fpu ~= "Software" and cfg.floatabi ~= "soft" then if cfg.architecture == "armv7" then if not alreadyHas(cfg.buildoptions, "-mfpu=") then if cfg.vectorextensions == "NEON" then table.insert(cfg.buildoptions, "-mfpu=neon") elseif cfg.fpu == "Hardware" or cfg.floatabi == "softfp" or cfg.floatabi == "hard" then table.insert(cfg.buildoptions, "-mfpu=vfpv3-d16") -- d16 is the lowest common denominator end end if not alreadyHas(cfg.buildoptions, "-mfloat-abi=") then if cfg.floatabi == "hard" then table.insert(cfg.buildoptions, "-mfloat-abi=hard") else table.insert(cfg.buildoptions, "-mfloat-abi=softfp") end end else if not alreadyHas(cfg.buildoptions, "-mfpu=") then if cfg.fpu == "Hardware" or cfg.floatabi == "softfp" or cfg.floatabi == "hard" then table.insert(cfg.buildoptions, "-mfpu=vfp") end end if not alreadyHas(cfg.buildoptions, "-mfloat-abi=") then if cfg.floatabi == "softfp" then table.insert(cfg.buildoptions, "-mfloat-abi=softfp") elseif cfg.floatabi == "hard" then table.insert(cfg.buildoptions, "-mfloat-abi=hard") end end end elseif cfg.floatabi == "soft" then table.insert(cfg.buildoptions, "-mfloat-abi=soft") end if cfg.endian == "Little" then table.insert(cfg.buildoptions, "-mlittle-endian") elseif cfg.endian == "Big" then table.insert(cfg.buildoptions, "-mbig-endian") end elseif cfg.architecture == "mips" then if cfg.vectorextensions == "MXU" then table.insert(cfg.buildoptions, "-mmxu") end elseif cfg.architecture == "x86" then end end end p.override(vc2010, "subSystem", function(oldfn, cfg) if cfg.system ~= p.ANDROID then return oldfn(cfg) end end) p.override(vc2010, "additionalDependencies", function(oldfn, cfg, explicit) if cfg.system == p.ANDROID then local links = {} if explicit then links = config.getlinks(cfg, "siblings", "fullpath") end local system = config.getlinks(cfg, "system", "name") for i = 1, #system do local link = system[i] table.insert(links, link) end if #links > 0 then links = path.translate(table.concat(links, ";")) vc2010.element("LibraryDependencies", nil, "%%(LibraryDependencies);%s", links) end else return oldfn(cfg, explicit) end end) function android.useMultiToolTask(cfg) if cfg.flags.MultiProcessorCompile then vc2010.element("UseMultiToolTask", nil, "true") end end premake.override(vc2010.elements, "outputProperties", function(oldfn, cfg) if cfg.system == p.ANDROID then return table.join(oldfn(cfg), { android.useMultiToolTask, }) else return oldfn(cfg) end end) p.override(vc2010, "outDir", function(oldfn, cfg) if cfg.system ~= p.ANDROID then return oldfn(cfg) end end) local p = premake if not p.modules.android then require ("vstudio") p.modules.android = {} if _ACTION < "vs2015" then configuration { "Android" } system "android" toolset "gcc" end include("vsandroid_vcxproj.lua") include("vsandroid_sln2005.lua") include("vsandroid_vstudio.lua") include("vsandroid_androidproj.lua") end return p.modules.android local p = premake local api = p.api api.addAllowed("system", p.ANDROID) api.addAllowed("architecture", { "armv5", "armv7", "aarch64", "mips", "mips64", "arm" }) api.addAllowed("vectorextensions", { "NEON", "MXU" }) api.addAllowed("exceptionhandling", {"UnwindTables"}) api.addAllowed("flags", { "Thumb" }) api.addAllowed("kind", p.PACKAGING) premake.action._list["vs2015"].valid_kinds = table.join(premake.action._list["vs2015"].valid_kinds, { p.PACKAGING }) premake.action._list["vs2017"].valid_kinds = table.join(premake.action._list["vs2017"].valid_kinds, { p.PACKAGING }) premake.action._list["vs2019"].valid_kinds = table.join(premake.action._list["vs2019"].valid_kinds, { p.PACKAGING }) local osoption = p.option.get("os") if osoption ~= nil then table.insert(osoption.allowed, { "android", "Android" }) end os.systemTags[p.ANDROID] = { "android", "mobile" } api.register { name = "floatabi", scope = "config", kind = "string", allowed = { "soft", "softfp", "hard", }, } api.register { name = "androidapilevel", scope = "config", kind = "integer", } api.register { name = "toolchainversion", scope = "config", kind = "string", allowed = { "4.6", -- NDK GCC versions "4.8", "4.9", "3.4", -- NDK clang versions "3.5", "3.6", "3.8", "5.0", }, } api.register { name = "stl", scope = "config", kind = "string", allowed = { "none", "gabi++", "stlport", "gnu", "libc++", }, } api.register { name = "thumbmode", scope = "config", kind = "string", allowed = { "thumb", "arm", "disabled", }, } api.register { name = "androidapplibname", scope = "config", kind = "string" } return function(cfg) return (cfg.system == p.ANDROID) end local p = premake local vstudio = p.vstudio newaction { trigger = "vs2022", shortname = "Visual Studio 2022", description = "Generate Visual Studio 2022 project files", targetos = "windows", toolset = "msc-v143", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility", "SharedItems" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc", "clang" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) p.vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) p.vstudio.vs2010.generateProject(prj) end, onRule = function(rule) p.vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) p.vstudio.cleanSolution(wks) end, onCleanProject = function(prj) p.vstudio.cleanProject(prj) end, onCleanTarget = function(prj) p.vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "Version 16", targetFramework = "4.7.2", toolsVersion = "15.0", userToolsVersion = "Current", filterToolsVersion = "4.0", } } local p = premake local vstudio = p.vstudio newaction { trigger = "vs2019", shortname = "Visual Studio 2019", description = "Generate Visual Studio 2019 project files", targetos = "windows", toolset = "msc-v142", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility", "SharedItems" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc", "clang" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) p.vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) p.vstudio.vs2010.generateProject(prj) end, onRule = function(rule) p.vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) p.vstudio.cleanSolution(wks) end, onCleanProject = function(prj) p.vstudio.cleanProject(prj) end, onCleanTarget = function(prj) p.vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "Version 16", targetFramework = "4.7.2", toolsVersion = "15.0", userToolsVersion = "Current", filterToolsVersion = "4.0", } } local p = premake local vstudio = p.vstudio newaction { trigger = "vs2017", shortname = "Visual Studio 2017", description = "Generate Visual Studio 2017 project files", targetos = "windows", toolset = "msc-v141", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility", "SharedItems" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) p.vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) p.vstudio.vs2010.generateProject(prj) end, onRule = function(rule) p.vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) p.vstudio.cleanSolution(wks) end, onCleanProject = function(prj) p.vstudio.cleanProject(prj) end, onCleanTarget = function(prj) p.vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "15", targetFramework = "4.5.2", toolsVersion = "15.0", filterToolsVersion = "4.0", } } local p = premake local vstudio = p.vstudio newaction { trigger = "vs2015", shortname = "Visual Studio 2015", description = "Generate Visual Studio 2015 project files", targetos = "windows", toolset = "msc-v140", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility", "SharedItems" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) vstudio.vs2010.generateProject(prj) end, onRule = function(rule) vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) vstudio.cleanSolution(wks) end, onCleanProject = function(prj) vstudio.cleanProject(prj) end, onCleanTarget = function(prj) vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "14", targetFramework = "4.5", toolsVersion = "14.0", filterToolsVersion = "4.0", } } local p = premake p.vstudio.vc2013 = {} local vstudio = p.vstudio local project = p.project local config = p.config local fileconfig = p.fileconfig local tree = p.tree local m = p.vstudio.vc2013 local vc2010 = p.vstudio.vc2010 m.elements = {} m.conditionalElements = {} m.elements.project = function(prj) return { vc2010.xmlDeclaration, m.project, m.globals, m.itemDefinitionGroup, m.itemGroup, vc2010.files, } end function m.generate(prj) p.utf8() p.callArray(m.elements.project, prj) p.out('') end function m.project(prj) p.push('') end m.elements.globals = function(prj) return { m.msbuildAllProjects, m.hasSharedItems, m.itemsProjectGuid, m.itemsProjectName, } end function m.globals(prj) vc2010.propertyGroup(nil, "Globals") p.callArray(m.elements.globals, prj) p.pop('') end function m.msbuildAllProjects(prj) vc2010.element("MSBuildAllProjects", nil, "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)") end function m.hasSharedItems(prj) vc2010.element("HasSharedItems", nil, "true") end function m.itemsProjectGuid(prj) vc2010.element("ItemsProjectGuid", nil, "{%s}", prj.uuid) end function m.itemsProjectName(prj) if prj.name ~= prj.filename then vc2010.element("ItemsProjectName", nil, "%s", prj.name) end end m.elements.itemDefinitionGroup = function(prj) return { m.clCompile, } end function m.itemDefinitionGroup(prj) p.push('') p.callArray(m.elements.itemDefinitionGroup, prj) p.pop('') end m.elements.clCompile = function(prj) return { m.additionalIncludeDirectories, } end function m.clCompile(prj) p.push('') p.callArray(m.elements.clCompile, prj) p.pop('') end function m.additionalIncludeDirectories(prj) vc2010.element("AdditionalIncludeDirectories", nil, '%s', '%(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)') end m.elements.itemGroup = function(prj) return { m.projectCapability, } end function m.itemGroup(prj) p.push('') p.callArray(m.elements.itemGroup, prj) p.pop('') end function m.projectCapability(prj) p.w('') end local p = premake local vstudio = p.vstudio newaction { trigger = "vs2013", shortname = "Visual Studio 2013", description = "Generate Visual Studio 2013 project files", targetos = "windows", toolset = "msc-v120", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility", "SharedItems" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) vstudio.vs2010.generateProject(prj) end, onRule = function(rule) vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) vstudio.cleanSolution(wks) end, onCleanProject = function(prj) vstudio.cleanProject(prj) end, onCleanTarget = function(prj) vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "2013", targetFramework = "4.5", toolsVersion = "12.0", filterToolsVersion = "4.0", } } local p = premake local vstudio = p.vstudio newaction { trigger = "vs2012", shortname = "Visual Studio 2012", description = "Generate Visual Studio 2012 project files", targetos = "windows", toolset = "msc-v110", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) vstudio.vs2010.generateProject(prj) end, onRule = function(rule) vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) vstudio.cleanSolution(wks) end, onCleanProject = function(prj) vstudio.cleanProject(prj) end, onCleanTarget = function(prj) vstudio.cleanTarget(prj) end, pathVars = vstudio.vs2010.pathVars, vstudio = { solutionVersion = "12", versionName = "2012", targetFramework = "4.5", toolsVersion = "4.0", } } local p = premake p.vstudio.vs2010.rules.xml = {} local m = p.vstudio.vs2010.rules.xml m.elements = {} m.elements.project = function(r) return { m.projectSchemaDefinitions, m.rule, m.ruleItem, m.fileExtension, m.contentType, } end function m.generate(r) p.xmlUtf8() p.callArray(m.elements.project, r) p.out('') end m.elements.rule = function(r) return { m.dataSource, m.categories, m.inputs, m.properties, m.commandLineTemplate, m.beforeTargets, m.afterTargets, m.outputs, m.executionDescription, m.additionalDependencies, m.additionalOptions, } end function m.rule(r) p.push('') p.callArray(m.elements.rule, r) p.pop('') end function m.categories(r) local categories = { [1] = { name="General" }, } local propCategory = {} local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] local cat = def.category if cat then if type(cat) == "string" and cat ~= "Command Line" and cat ~= "General" then if not propCategory[cat] then table.insert(categories, { name=cat }) propCategory[cat] = true end else def.category = nil end end end table.insert(categories, { name="Command Line", subtype="CommandLine" }) p.push('') for i = 1, #categories do m.category(categories[i]) end p.pop('') end function m.category(cat) local attribs = p.capture(function() p.push() p.w('Name="%s"', cat.name) if cat.subtype then p.w('Subtype="%s"', cat.subtype) end p.pop() end) p.push('') p.push('') p.w('%s', cat.name) p.pop('') p.pop('') end function m.properties(r) local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] if def.kind == "boolean" then m.boolProperty(def) elseif def.kind == "list" then m.stringListProperty(def) elseif type(def.values) == "table" then m.enumProperty(def) elseif def.kind and def.kind:startswith("list:") then m.stringListProperty(def) else m.stringProperty(def) end end end function m.baseProperty(def, suffix) local c = p.capture(function () p.w('Name="%s"', def.name) p.w('HelpContext="0"') p.w('DisplayName="%s"', def.display or def.name) if def.description then p.w('Description="%s"', def.description) end if def.category then p.w('Category="%s"', def.category) end end) if suffix then c = c .. suffix end p.outln(c) end function m.boolProperty(def) p.push('') p.pop() end function m.enumProperty(def) p.push('') local values = def.values local switches = def.switch or {} local keys = table.keys(def.values) table.sort(keys) for _, key in pairs(keys) do p.push('') p.pop() end p.pop('') end function m.stringProperty(def) p.push('') p.pop() end function m.stringListProperty(def) p.push('') p.pop() end function m.additionalDependencies(r) p.push('') p.pop() end function m.additionalOptions(r) p.push('') p.push('') p.w('Additional Options') p.pop('') p.push('') p.w('Additional Options') p.pop('') p.pop('') end function m.afterTargets(r) p.push('') p.push('') p.w('Execute After') p.pop('') p.push('') p.w('Specifies the targets for the build customization to run after.') p.pop('') p.push('') p.push('', r.name) p.pop() p.pop('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.beforeTargets(r) p.push('') p.push('') p.w('Execute Before') p.pop('') p.push('') p.w('Specifies the targets for the build customization to run before.') p.pop('') p.push('') p.push('', r.name) p.pop() p.pop('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.commandLineTemplate(r) p.push('') p.pop() end function m.contentType(r) p.push('', r.name) p.pop() end function m.dataSource(r) p.push('') p.push('', r.name) p.pop() p.pop('') end function m.executionDescription(r) p.push('') p.pop() end function m.fileExtension(r) for _, v in ipairs(r.fileextension) do p.push('', r.name) p.pop() end end function m.inputs(r) p.push('') p.push('') p.push('') p.pop() p.pop('') p.pop('') end function m.outputs(r) p.push('') p.pop() end function m.ruleItem(r) p.push('', r.display or r.name) p.pop() end function m.projectSchemaDefinitions(r) p.push('') end local p = premake p.vstudio.vs2010.rules.targets = {} local m = p.vstudio.vs2010.rules.targets m.elements = {} m.elements.project = function(r) return { p.vstudio.projectElement, m.availableItemGroup, m.computedProperties, m.computeInputsGroup, m.usingTask, m.ruleTarget, m.computeOutputTarget, } end function m.generate(r) p.xmlUtf8() p.callArray(m.elements.project, r) p.pop() p.out('') end m.elements.availableItemGroup = function(r) return { m.propertyPageSchema, m.availableItemName, } end function m.availableItemGroup(r) p.push('') p.callArray(m.elements.availableItemGroup, r) p.pop('') end function m.computedProperties(r) local pathVars = p.rule.createPathVars(r, "%%(%s)") local ctx = p.context.extent(r, { pathVars = pathVars, overridePathVars = true }) local buildoutputs = ctx.buildoutputs if buildoutputs and #buildoutputs > 0 then local outputs = table.concat(buildoutputs, ";") p.push('') p.push('<%s>', r.name) p.x('%s', path.translate(outputs)) p.pop('', r.name) p.pop('') end end m.elements.computeInputsGroup = function(r) return { m.computeCompileInputsTargets, m.computeLinkInputsTargets, m.computeLibInputsTargets, } end function m.computeInputsGroup(r) p.push('') p.callArray(m.elements.computeInputsGroup, r) p.pop('') end m.elements.ruleTargetAttributes = function(r) return { m.targetName, m.beforeTargets, m.afterTargets, m.targetCondition, m.targetOutputs, m.targetInputs, m.dependsOnTargets, } end m.elements.ruleTarget = function(r) return { m.selectedFiles, m.tlog, m.message, m.tlogWrite, m.tlogRead, m.rule, } end function m.ruleTarget(r) local attribs = p.capture(function() p.push() p.callArray(m.elements.ruleTargetAttributes, r) p.pop() end) p.push('') p.callArray(m.elements.ruleTarget, r) p.pop('') end m.elements.tlog = function(r) return { m.tlogSource, m.tlogInputs, m.tlogProperties, } end function m.tlog(r) p.push('') p.push('<%s_tlog', r.name) p.w('Include="%%(%s.Outputs)"', r.name) p.w('Condition="\'%%(%s.Outputs)\' != \'\' and \'%%(%s.ExcludedFromBuild)\' != \'true\'">', r.name, r.name) p.callArray(m.elements.tlog, r) p.pop('', r.name) p.pop('') end m.elements.ruleAttributes = function(r) return { m.ruleCondition, m.commandLineTemplate, m.properties, m.additionalOptions, m.inputs, m.standardOutputImportance, } end function m.rule(r) local attribs = p.capture(function() p.push() p.callArray(m.elements.ruleAttributes, r) p.pop() end) p.w('<%s', r.name) p.outln(attribs .. ' />') end m.elements.computeOutputItems = function(r) return { m.outputs, m.linkLib, } end m.elements.computeOutputTarget = function(r) return { m.makeDir, } end function m.computeOutputTarget(r) p.push('', r.name) p.push('') p.callArray(m.elements.computeOutputItems, r) p.pop('') p.callArray(m.elements.computeOutputTarget, r) p.pop('') end function m.additionalOptions(r) p.w('AdditionalOptions="%%(%s.AdditionalOptions)"', r.name) end function m.commandLineTemplate(r) p.w('CommandLineTemplate="%%(%s.CommandLineTemplate)"', r.name) end function m.afterTargets(r) p.w('AfterTargets="$(%sAfterTargets)"', r.name) end function m.availableItemName(r) p.push('', r.name) p.w('_%s', r.name) p.pop('') end function m.beforeTargets(r) p.w('BeforeTargets="$(%sBeforeTargets)"', r.name) end function m.computeLibInputsTargets(r) p.push('') p.w('$(ComputeLibInputsTargets);') p.w('Compute%sOutput;', r.name) p.pop('') end function m.computeLinkInputsTargets(r) p.push('') p.w('$(ComputeLinkInputsTargets);') p.w('Compute%sOutput;', r.name) p.pop('') end function m.computeCompileInputsTargets(r) p.push('') p.w('$(ComputeCompileInputsTargets);') p.w('Compute%sOutput;', r.name) p.pop('') end function m.dependsOnTargets(r) p.w('DependsOnTargets="$(%sDependsOn);Compute%sOutput"', r.name, r.name) end function m.inputs(r) p.w('Inputs="%%(%s.Identity)"', r.name) end function m.linkLib(r) local pathVars = p.rule.createPathVars(r, "%%(%s)") local ctx = p.context.extent(r, { pathVars = pathVars, overridePathVars=true }) local buildoutputs = ctx.buildoutputs local linkable, compileable for i = 1, #buildoutputs do if (path.islinkable(buildoutputs[i])) then linkable = true end if (path.iscppfile(buildoutputs[i])) then compileable = true end end if linkable then for i, el in pairs { 'Link', 'Lib', 'ImpLib' } do p.push('<%s', el) p.w('Include="%%(%sOutputs.Identity)"', r.name) p.w('Condition="\'%%(Extension)\'==\'.obj\' or \'%%(Extension)\'==\'.res\' or \'%%(Extension)\'==\'.rsc\' or \'%%(Extension)\'==\'.lib\'" />') p.pop() end end if compileable then p.push('') p.pop() end end function m.makeDir(r) p.w('', r.name) end function m.message(r) p.w('', r.name) end function m.outputs(r) p.w('<%sOutputs', r.name) p.w(' Condition="\'@(%s)\' != \'\' and \'%%(%s.ExcludedFromBuild)\' != \'true\'"', r.name, r.name) p.w(' Include="%%(%s.Outputs)" />', r.name) end function m.properties(r) local defs = r.propertydefinition for i = 1, #defs do local name = defs[i].name p.w('%s="%%(%s.%s)"', name, r.name, name) end end function m.propertyPageSchema(r) p.w('') end function m.ruleCondition(r) p.w('Condition="\'@(%s)\' != \'\' and \'%%(%s.ExcludedFromBuild)\' != \'true\'"', r.name, r.name) end function m.selectedFiles(r) p.push('') p.w('<%s Remove="@(%s)" Condition="\'%%(Identity)\' != \'@(SelectedFiles)\'" />', r.name, r.name) p.pop('') end function m.standardOutputImportance(r) p.w('StandardOutputImportance="High"') p.w('StandardErrorImportance="High"') end function m.targetCondition(r) p.w('Condition="\'@(%s)\' != \'\'"', r.name) end function m.targetInputs(r) local extra = {} local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] if def.dependency then table.insert(extra, string.format("%%(%s.%s);", r.name, def.name)) end end extra = table.concat(extra) p.w('Inputs="%%(%s.Identity);%%(%s.AdditionalDependencies);%s$(MSBuildProjectFile)"', r.name, r.name, extra) end function m.targetName(r) p.w('Name="_%s"', r.name) end function m.targetOutputs(r) p.w('Outputs="%%(%s.Outputs)"', r.name) end function m.tlogInputs(r) p.w("@(%s, ';')", r.name) end function m.tlogProperties(r) local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] if def.dependency then p.w('<%s>%%(%s.%s)', def.name, r.name, def.name, def.name) end end end function m.tlogRead(r) local extra = {} local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] if def.dependency then table.insert(extra, string.format("%%(%s_tlog.%s);", r.name, def.name)) end end extra = table.concat(extra) p.w('', r.name, extra, r.name) end function m.tlogWrite(r) p.w('', r.name, r.name) end function m.tlogSource(r) p.w("@(%s, '|')", r.name) end function m.usingTask(r) p.push('') p.w('$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml') p.pop('') end local p = premake p.vstudio.vs2010.rules = {} p.vstudio.vs2010.rules.props = {} local m = p.vstudio.vs2010.rules.props m.elements = {} m.elements.project = function(r) return { p.vstudio.projectElement, m.targetsGroup, m.dependsOnGroup, m.ruleGroup, } end function m.generate(r) p.xmlUtf8() p.callArray(m.elements.project, r) p.pop() p.out('') end m.elements.targetsGroup = function(r) return { m.beforeTargets, m.afterTargets, } end function m.targetsGroup(r) p.w('', r.name, r.name) p.callArray(m.elements.targetsGroup, r) p.pop('') end m.elements.dependsOnGroup = function(r) return { m.dependsOn, } end function m.dependsOnGroup(r) p.push('') p.callArray(m.elements.dependsOnGroup, r) p.pop('') end m.elements.ruleGroup = function(r) return { m.propertyDefaults, m.commandLineTemplates, m.executionDescription, m.additionalDependencies, } end function m.ruleGroup(r) p.push('') p.push('<%s>', r.name) p.callArray(m.elements.ruleGroup, r) p.pop('', r.name) p.pop('') end function m.propertyDefaults(r) local defs = r.propertydefinition for i = 1, #defs do local def = defs[i] local value = def.value if value then if def.kind == "path" then value = path.translate(value) end p.w('<%s>%s', def.name, value, def.name) end end end function m.additionalDependencies(r) local deps = table.concat(r.builddependencies, ";") p.x('%s', deps) end function m.afterTargets(r) p.w('<%sAfterTargets>CustomBuild', r.name, r.name) end function m.beforeTargets(r) p.w('<%sBeforeTargets>Midl', r.name, r.name) end function m.commandLineTemplates(r) local env = p.rule.createEnvironment(r, "[%s]") local ctx = p.context.extent(r, env) local buildcommands = ctx.buildcommands if buildcommands and #buildcommands > 0 then local cmds = os.translateCommands(buildcommands, p.WINDOWS) cmds = table.concat(cmds, p.eol()) p.x('%s', cmds) end end function m.dependsOn(r) p.w('<%sDependsOn', r.name) p.w(' Condition="\'$(ConfigurationType)\' != \'Makefile\'">_SelectedFiles;$(%sDependsOn)', r.name, r.name, r.name) end function m.executionDescription(r) local env = p.rule.createEnvironment(r, "%%(%s)") local ctx = p.context.extent(r, env) local buildmessage = ctx.buildmessage if buildmessage and #buildmessage > 0 then p.x('%s', buildmessage) end end local p = premake local project = p.project local tree = p.tree local m = p.vstudio.vc2010 function m.generateFilters(prj) m.xmlDeclaration() m.filtersProject() m.uniqueIdentifiers(prj) m.filterGroups(prj) p.out('') end function m.filtersProject() local action = p.action.current() p.push('', action.vstudio.filterToolsVersion or action.vstudio.toolsVersion) end function m.filterGroups(prj) local groups = m.categorizeSources(prj) for _, group in ipairs(groups) do group.category.emitFilter(prj, group) end end function m.uniqueIdentifiers(prj) local tr = project.getsourcetree(prj) local contents = p.capture(function() p.push() tree.traverse(tr, { onbranch = function(node, depth) p.push('', path.translate(node.path, '\\')) p.w('{%s}', os.uuid(node.path)) p.pop('') end }, false) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end function m.filterGroup(prj, group, tag) local files = group.files if files and #files > 0 then p.push('') for _, file in ipairs(files) do local rel = path.translate(file.relpath) if prj.kind == p.SHAREDITEMS then rel = "$(MSBuildThisFileDirectory)" .. rel end if file.parent.path then p.push('<%s Include=\"%s\">', tag, rel) p.w('%s', path.translate(file.parent.path, '\\')) p.pop('', tag) else p.w('<%s Include=\"%s\" />', tag, rel) end end p.pop('') end end local p = premake local m = p.vstudio.vc2010 m.elements.user = function(cfg) return { m.debugSettings, } end function m.generateUser(prj) local contents = {} local size = 0 for cfg in p.project.eachconfig(prj) do contents[cfg] = p.capture(function() p.push(2) p.callArray(m.elements.user, cfg) p.pop(2) end) size = size + #contents[cfg] end if size > 0 then m.xmlDeclaration() m.userProject() for cfg in p.project.eachconfig(prj) do p.push('', m.condition(cfg)) if #contents[cfg] > 0 then p.outln(contents[cfg]) end p.pop('') end p.pop('') end end function m.userProject() local action = p.action.current() p.push('', action.vstudio.userToolsVersion or action.vstudio.toolsVersion) end m.elements.debugSettings = function(cfg) return { m.localDebuggerCommand, m.localDebuggerWorkingDirectory, m.debuggerFlavor, m.localDebuggerCommandArguments, m.localDebuggerDebuggerType, m.localDebuggerEnvironment, m.localDebuggerMergeEnvironment, } end function m.debugSettings(cfg) p.callArray(m.elements.debugSettings, cfg) end function m.debuggerFlavor(cfg) local map = { VisualStudioLocal = "WindowsLocalDebugger", VisualStudioRemote = "WindowsRemoteDebugger", VisualStudioWebBrowser = "WebBrowserDebugger", VisualStudioWebService = "WebServiceDebugger" } local value = map[cfg.debugger] if value then p.w('%s', value) elseif cfg.debugdir or cfg.debugcommand then p.w('WindowsLocalDebugger') end end function m.localDebuggerCommand(cfg) if cfg.debugcommand then local dir = path.translate(cfg.debugcommand) p.w('%s', dir) end end function m.localDebuggerDebuggerType(cfg) if cfg.debuggertype then p.w('%s', cfg.debuggertype) end end function m.localDebuggerCommandArguments(cfg) if #cfg.debugargs > 0 then local args = os.translateCommandsAndPaths(cfg.debugargs, cfg.project.basedir, cfg.project.location) p.x('%s', table.concat(args, " ")) end end function m.localDebuggerWorkingDirectory(cfg) if cfg.debugdir then local dir = p.vstudio.path(cfg, cfg.debugdir) p.x('%s', dir) end end function m.localDebuggerEnvironment(cfg) if #cfg.debugenvs > 0 then local envs = table.concat(cfg.debugenvs, "\n") if cfg.flags.DebugEnvsInherit then envs = envs .. "\n$(LocalDebuggerEnvironment)" end p.w('%s', envs) if cfg.flags.DebugEnvsDontMerge then p.w(2,'false') end end end function m.localDebuggerMergeEnvironment(cfg) if #cfg.debugenvs > 0 and cfg.flags.DebugEnvsDontMerge then p.w(2,'false') end end local p = premake p.vstudio.vc2010 = {} local vstudio = p.vstudio local project = p.project local config = p.config local fileconfig = p.fileconfig local tree = p.tree local m = p.vstudio.vc2010 m.elements = {} m.conditionalElements = {} m.elements.project = function(prj) return { m.xmlDeclaration, m.project, m.projectConfigurations, m.globals, m.importDefaultProps, m.configurationPropertiesGroup, m.importLanguageSettings, m.importExtensionSettings, m.propertySheetGroup, m.userMacros, m.outputPropertiesGroup, m.itemDefinitionGroups, m.assemblyReferences, m.files, m.projectReferences, m.importLanguageTargets, m.importExtensionTargets, m.ensureNuGetPackageBuildImports, } end function m.generate(prj) p.utf8() p.callArray(m.elements.project, prj) p.out('') end function m.project(prj) local action = p.action.current() if _ACTION >= "vs2019" then p.push('') else p.push('', action.vstudio.toolsVersion) end end function m.projectConfigurations(prj) local platforms = {} for cfg in project.eachconfig(prj) do local arch = vstudio.archFromConfig(cfg, true) if not table.contains(platforms, arch) then table.insert(platforms, arch) end end local configs = {} p.push('') for cfg in project.eachconfig(prj) do for _, arch in ipairs(platforms) do local prjcfg = vstudio.projectConfig(cfg, arch) if not configs[prjcfg] then configs[prjcfg] = prjcfg p.push('', vstudio.projectConfig(cfg, arch)) p.x('%s', vstudio.projectPlatform(cfg)) p.w('%s', arch) p.pop('') end end end p.pop('') end function m.targetFramework(prj) local action = p.action.current() local tools = string.format(' ToolsVersion="%s"', action.vstudio.toolsVersion) local framework = prj.dotnetframework or action.vstudio.targetFramework or "4.0" p.w('v%s', framework) end m.elements.globals = function(prj) return { m.projectGuid, m.ignoreWarnDuplicateFilename, m.keyword, m.projectName, m.preferredToolArchitecture, m.latestTargetPlatformVersion, m.windowsTargetPlatformVersion, m.fastUpToDateCheck, m.toolsVersion, } end m.elements.globalsCondition = function(prj, cfg) return { m.windowsTargetPlatformVersion, m.xpDeprecationWarning, } end function m.globals(prj) m.propertyGroup(nil, "Globals") p.callArray(m.elements.globals, prj) p.pop('') for cfg in project.eachconfig(prj) do local captured = p.capture(function() p.push() p.callArray(m.elements.globalsCondition, prj, cfg) p.pop() end) if captured ~= '' then m.propertyGroup(cfg, "Globals") p.callArray(m.elements.globalsCondition, prj, cfg) p.pop('') end end end m.elements.configurationProperties = function(cfg) if cfg.kind == p.UTILITY then return { m.configurationType, m.platformToolset, m.toolsVersion, } else return { m.configurationType, m.useDebugLibraries, m.useOfMfc, m.useOfAtl, m.clrSupport, m.characterSet, m.platformToolset, m.toolsVersion, m.wholeProgramOptimization, m.nmakeOutDirs, m.windowsSDKDesktopARMSupport, } end end function m.configurationProperties(cfg) m.propertyGroup(cfg, "Configuration") p.callArray(m.elements.configurationProperties, cfg) p.pop('') end function m.configurationPropertiesGroup(prj) for cfg in project.eachconfig(prj) do m.configurationProperties(cfg) end end m.elements.outputProperties = function(cfg) if cfg.kind == p.UTILITY then return { m.outDir, m.intDir, m.extensionsToDeleteOnClean, m.executablePath, } else return { m.linkIncremental, m.ignoreImportLibrary, m.outDir, m.intDir, m.targetName, m.targetExt, m.includePath, m.libraryPath, m.generateManifest, m.extensionsToDeleteOnClean, m.executablePath, } end end function m.outputProperties(cfg) if not vstudio.isMakefile(cfg) then m.propertyGroup(cfg) p.callArray(m.elements.outputProperties, cfg) p.pop('') end end m.elements.nmakeProperties = function(cfg) return { m.executablePath, m.includePath, m.libraryPath, m.nmakeOutput, m.nmakeBuildCommands, m.nmakeRebuildCommands, m.nmakeCleanCommands, m.nmakePreprocessorDefinitions, m.nmakeIncludeDirs, m.additionalCompileOptions } end function m.nmakeProperties(cfg) if vstudio.isMakefile(cfg) then m.propertyGroup(cfg) p.callArray(m.elements.nmakeProperties, cfg) p.pop('') end end function m.outputPropertiesGroup(prj) for cfg in project.eachconfig(prj) do m.outputProperties(cfg) m.nmakeProperties(cfg) end end m.elements.itemDefinitionGroup = function(cfg) if cfg.kind == p.UTILITY then return { m.ruleVars, m.buildEvents, m.buildLog, } else return { m.clCompile, m.buildStep, m.fxCompile, m.resourceCompile, m.linker, m.manifest, m.buildEvents, m.ruleVars, m.buildLog, } end end function m.itemDefinitionGroup(cfg) if not vstudio.isMakefile(cfg) then p.push('', m.condition(cfg)) p.callArray(m.elements.itemDefinitionGroup, cfg) p.pop('') else if cfg == project.getfirstconfig(cfg.project) then p.w('') p.w('') end end end function m.itemDefinitionGroups(prj) for cfg in project.eachconfig(prj) do m.itemDefinitionGroup(cfg) end end m.elements.clCompile = function(cfg) local calls = { m.precompiledHeader, m.warningLevel, m.treatWarningAsError, m.disableSpecificWarnings, m.treatSpecificWarningsAsErrors, m.basicRuntimeChecks, m.clCompilePreprocessorDefinitions, m.clCompileUndefinePreprocessorDefinitions, m.clCompileAdditionalIncludeDirectories, m.clCompileAdditionalUsingDirectories, m.forceIncludes, m.debugInformationFormat, m.optimization, m.functionLevelLinking, m.intrinsicFunctions, m.justMyCodeDebugging, m.supportOpenMP, m.minimalRebuild, m.omitFramePointers, m.stringPooling, m.runtimeLibrary, m.omitDefaultLib, m.exceptionHandling, m.runtimeTypeInfo, m.bufferSecurityCheck, m.treatWChar_tAsBuiltInType, m.floatingPointModel, m.floatingPointExceptions, m.inlineFunctionExpansion, m.enableEnhancedInstructionSet, m.multiProcessorCompilation, m.additionalCompileOptions, m.compileAs, m.callingConvention, m.languageStandard, m.conformanceMode, m.structMemberAlignment, m.useFullPaths, m.removeUnreferencedCodeData } if cfg.kind == p.STATICLIB then table.insert(calls, m.programDatabaseFileName) end return calls end function m.clCompile(cfg) p.push('') p.callArray(m.elements.clCompile, cfg) p.pop('') end m.elements.buildStep = function(cfg) local calls = { m.buildCommands, m.buildMessage, m.buildOutputs, m.buildInputs } return calls end function m.buildStep(cfg) if #cfg.buildCommands > 0 or #cfg.buildOutputs > 0 or #cfg.buildInputs > 0 or cfg.buildMessage then p.push('') p.callArray(m.elements.buildStep, cfg) p.pop('') end end m.elements.fxCompile = function(cfg) return { m.fxCompilePreprocessorDefinition, m.fxCompileAdditionalIncludeDirs, m.fxCompileShaderType, m.fxCompileShaderModel, m.fxCompileShaderEntry, m.fxCompileShaderVariableName, m.fxCompileShaderHeaderOutput, m.fxCompileShaderObjectOutput, m.fxCompileShaderAssembler, m.fxCompileShaderAssemblerOutput, m.fxCompileShaderAdditionalOptions, } end function m.fxCompile(cfg) if p.config.hasFile(cfg, path.ishlslfile) then local contents = p.capture(function () p.push() p.callArray(m.elements.fxCompile, cfg) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end end m.elements.resourceCompile = function(cfg) return { m.resourcePreprocessorDefinitions, m.resourceAdditionalIncludeDirectories, m.culture, } end function m.resourceCompile(cfg) if p.config.hasFile(cfg, path.isresourcefile) then local contents = p.capture(function () p.push() p.callArray(m.elements.resourceCompile, cfg) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end end m.elements.linker = function(cfg, explicit) return { m.link, m.lib, m.linkLibraryDependencies, } end function m.linker(cfg) local explicit = vstudio.needsExplicitLink(cfg) p.callArray(m.elements.linker, cfg, explicit) end m.elements.link = function(cfg, explicit) if cfg.kind == p.STATICLIB then return { m.subSystem, m.fullProgramDatabaseFile, m.generateDebugInformation, m.optimizeReferences, } else return { m.subSystem, m.fullProgramDatabaseFile, m.generateDebugInformation, m.optimizeReferences, m.additionalDependencies, m.additionalLibraryDirectories, m.importLibrary, m.entryPointSymbol, m.generateMapFile, m.moduleDefinitionFile, m.treatLinkerWarningAsErrors, m.ignoreDefaultLibraries, m.largeAddressAware, m.targetMachine, m.additionalLinkOptions, m.programDatabaseFile, m.assemblyDebug, } end end function m.link(cfg, explicit) local contents = p.capture(function () p.push() p.callArray(m.elements.link, cfg, explicit) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end m.elements.lib = function(cfg, explicit) if cfg.kind == p.STATICLIB then return { m.additionalDependencies, m.additionalLibraryDirectories, m.treatLinkerWarningAsErrors, m.targetMachine, m.additionalLinkOptions, } else return {} end end function m.lib(cfg, explicit) local contents = p.capture(function () p.push() p.callArray(m.elements.lib, cfg, explicit) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end m.elements.manifest = function(cfg) return { m.enableDpiAwareness, m.additionalManifestFiles, } end function m.manifest(cfg) if cfg.kind ~= p.STATICLIB then local contents = p.capture(function () p.push() p.callArray(m.elements.manifest, cfg) p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end end function m.buildEvents(cfg) local write = function (event) local name = event .. "Event" local field = event:lower() local steps = cfg[field .. "commands"] local msg = cfg[field .. "message"] if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) p.push('<%s>', name) p.x('%s', table.implode(steps, "", "", "\r\n")) if msg then p.x('%s', msg) end p.pop('', name) end end write("PreBuild") write("PreLink") write("PostBuild") end function m.getRulePropertyString(rule, prop, value, kind) if kind == "list:path" then return table.concat(vstudio.path(cfg, value), ';') end if kind == "path" then return vstudio.path(cfg, value) end if type(value) == "table" then return table.concat(value, ";") end if prop.values then value = table.findKeyByValue(prop.values, value) end return tostring(value) end function m.ruleVars(cfg) for i = 1, #cfg.rules do local rule = p.global.getRule(cfg.rules[i]) local contents = p.capture(function () p.push() for prop in p.rule.eachProperty(rule) do local fld = p.rule.getPropertyField(rule, prop) local value = cfg[fld.name] if value ~= nil then value = m.getRulePropertyString(rule, prop, value, fld.kind) if value ~= nil and #value > 0 then m.element(prop.name, nil, '%s', value) end end end p.pop() end) if #contents > 0 then p.push('<%s>', rule.name) p.outln(contents) p.pop('', rule.name) end end end function m.assemblyReferences(prj) local cfg = project.getfirstconfig(prj) local refs = config.getlinks(cfg, "system", "fullpath", "managed") if #refs > 0 then p.push('') for i = 1, #refs do local value = refs[i] if value:find('/', 1, true) then p.push('', path.getbasename(value)) p.x('%s', path.translate(value)) p.pop('') else p.x('', path.getbasename(value)) end end p.pop('') end end function m.generatedFile(cfg, file) if file.generated then local path = path.translate(file.dependsOn.relpath) m.element("AutoGen", nil, 'true') m.element("DependentUpon", nil, path) end end function m.files(prj) local groups = m.categorizeSources(prj) for _, group in ipairs(groups) do group.category.emitFiles(prj, group) end end m.categories = {} m.categories.ClInclude = { name = "ClInclude", extensions = { ".h", ".hh", ".hpp", ".hxx", ".inl" }, priority = 1, emitFiles = function(prj, group) m.emitFiles(prj, group, "ClInclude", {m.generatedFile}) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "ClInclude") end } m.categories.ClCompile = { name = "ClCompile", extensions = { ".cc", ".cpp", ".cxx", ".c++", ".c", ".s", ".m", ".mm" }, priority = 2, emitFiles = function(prj, group) local fileCfgFunc = function(fcfg, condition) if fcfg then return { m.excludedFromBuild, m.objectFileName, m.clCompilePreprocessorDefinitions, m.clCompileUndefinePreprocessorDefinitions, m.optimization, m.forceIncludes, m.precompiledHeader, m.enableEnhancedInstructionSet, m.additionalCompileOptions, m.disableSpecificWarnings, m.treatSpecificWarningsAsErrors, m.basicRuntimeChecks, m.exceptionHandling, m.compileAsManaged, m.compileAs, m.runtimeTypeInfo, m.warningLevelFile, } else return { m.excludedFromBuild } end end m.emitFiles(prj, group, "ClCompile", {m.generatedFile}, fileCfgFunc) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "ClCompile") end } m.categories.FxCompile = { name = "FxCompile", extensions = { ".hlsl" }, priority = 4, emitFiles = function(prj, group) local fileCfgFunc = function(fcfg, condition) if fcfg then return { m.excludedFromBuild, m.fxCompilePreprocessorDefinition, m.fxCompileAdditionalIncludeDirs, m.fxCompileShaderType, m.fxCompileShaderModel, m.fxCompileShaderEntry, m.fxCompileShaderVariableName, m.fxCompileShaderHeaderOutput, m.fxCompileShaderObjectOutput, m.fxCompileShaderAssembler, m.fxCompileShaderAssemblerOutput, m.fxCompileShaderAdditionalOptions, } else return { m.excludedFromBuild } end end m.emitFiles(prj, group, "FxCompile", nil, fileCfgFunc) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "FxCompile") end } m.categories.None = { name = "None", priority = 5, emitFiles = function(prj, group) m.emitFiles(prj, group, "None", {m.generatedFile}) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "None") end } m.categories.ResourceCompile = { name = "ResourceCompile", extensions = ".rc", priority = 6, emitFiles = function(prj, group) local fileCfgFunc = { m.excludedFromBuild } m.emitFiles(prj, group, "ResourceCompile", nil, fileCfgFunc) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "ResourceCompile") end } m.categories.CustomBuild = { name = "CustomBuild", priority = 7, emitFiles = function(prj, group) local fileFunc = { m.fileType } local fileCfgFunc = { m.excludedFromBuild, m.buildCommands, m.buildOutputs, m.linkObjects, m.buildMessage, m.buildAdditionalInputs } m.emitFiles(prj, group, "CustomBuild", fileFunc, fileCfgFunc, function (cfg, fcfg) return fileconfig.hasCustomBuildRule(fcfg) end) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "CustomBuild") end } m.categories.Midl = { name = "Midl", extensions = ".idl", priority = 8, emitFiles = function(prj, group) local fileCfgFunc = { m.excludedFromBuild } m.emitFiles(prj, group, "Midl", nil, fileCfgFunc, function(cfg) return cfg.system == p.WINDOWS end) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "Midl") end } m.categories.Masm = { name = "Masm", extensions = ".asm", priority = 9, emitFiles = function(prj, group) local fileCfgFunc = function(fcfg, condition) if fcfg then return { m.MasmPreprocessorDefinitions, m.excludedFromBuild, m.exceptionHandlingSEH, } else return { m.excludedFromBuild } end end m.emitFiles(prj, group, "Masm", nil, fileCfgFunc) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "Masm") end, emitExtensionSettings = function(prj, group) p.w('') end, emitExtensionTargets = function(prj, group) p.w('') end } m.categories.Image = { name = "Image", extensions = { ".gif", ".jpg", ".jpe", ".png", ".bmp", ".dib", "*.tif", "*.wmf", "*.ras", "*.eps", "*.pcx", "*.pcd", "*.tga", "*.dds" }, priority = 10, emitFiles = function(prj, group) local fileCfgFunc = function(fcfg, condition) return { m.excludedFromBuild } end m.emitFiles(prj, group, "Image", nil, fileCfgFunc) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "Image") end } m.categories.Natvis = { name = "Natvis", extensions = { ".natvis" }, priority = 11, emitFiles = function(prj, group) m.emitFiles(prj, group, "Natvis", {m.generatedFile}) end, emitFilter = function(prj, group) m.filterGroup(prj, group, "Natvis") end } function m.categorizeSources(prj) if prj._vc2010_sources then return prj._vc2010_sources end local result = {} local groups = {} prj._vc2010_sources = result local tr = project.getsourcetree(prj) tree.traverse(tr, { onleaf = function(node) local cat = m.categorizeFile(prj, node) groups[cat.name] = groups[cat.name] or { category = cat, files = {} } table.insert(groups[cat.name].files, node) end }) for name, group in pairs(groups) do table.sort(group.files, function (a, b) return a.relpath < b.relpath end) table.insert(result, group) end table.sort(result, function (a, b) if (a.category.priority == b.category.priority) then return a.category.name < b.category.name end return a.category.priority < b.category.priority end) return result end function m.categorizeFile(prj, file) for cfg in project.eachconfig(prj) do local fcfg = fileconfig.getconfig(file, cfg) if fcfg then if fileconfig.hasCustomBuildRule(fcfg) then return m.categories.CustomBuild end if fcfg.buildaction then return m.categories[fcfg.buildaction] or m.categories.None end end end local rule = p.global.getRuleForFile(file.name, prj.rules) if rule then return { name = rule.name, priority = 100, rule = rule, emitFiles = function(prj, group) m.emitRuleFiles(prj, group) end, emitFilter = function(prj, group) m.filterGroup(prj, group, group.category.name) end } end for _, cat in pairs(m.categories) do if cat.extensions and path.hasextension(file.name, cat.extensions) then return cat end end return m.categories.None end function m.configPair(cfg) return vstudio.projectPlatform(cfg) .. "|" .. vstudio.archFromConfig(cfg, true) end function m.getTotalCfgCount(prj) if prj._totalCfgCount then return prj._totalCfgCount else local result = 0 for _ in p.project.eachconfig(prj) do result = result + 1 end prj._totalCfgCount = result return result end end function m.indexConditionalElements() local nameMap, nameList, settingList nameMap = {} nameList = {} -- to preserve ordering settingList = {} -- to preserve ordering for _, element in ipairs(m.conditionalElements) do local settingMap = nameMap[element.name] if not settingMap then settingMap = {} nameMap[element.name] = settingMap if not table.contains(nameList, element.name) then table.insert(nameList, element.name) end end local elementSet = settingMap[element.setting] if elementSet then table.insert(elementSet, element) else elementSet = {element} settingMap[element.setting] = elementSet if not table.contains(settingList, element.setting) then table.insert(settingList, element.setting) end end end return nameMap, nameList, settingList end function m.emitConditionalElements(prj) local keyCount = function(tbl) local count = 0 for _ in pairs(tbl) do count = count + 1 end return count end local nameMap, nameList, settingList nameMap, nameList, settingList = m.indexConditionalElements() local totalCfgCount = m.getTotalCfgCount(prj) for _, name in ipairs(nameList) do local settingMap = nameMap[name] local done = false if keyCount(settingMap)==1 then for _, setting in ipairs(settingList) do local elements = settingMap[setting] if elements~=nil and #elements==totalCfgCount then local element = elements[1] local format = string.format('<%s>%s', name, element.value, name) p.w(format, table.unpack(element.args)) done = true end end end if not done then for _, setting in ipairs(settingList) do local elements = settingMap[setting] if elements then for _, element in ipairs(elements) do local format = string.format('<%s %s>%s', name, m.conditionFromConfigText(element.condition), element.value, name) p.w(format, table.unpack(element.args)) end end end end end end function m.emitFiles(prj, group, tag, fileFunc, fileCfgFunc, checkFunc) local files = group.files if files and #files > 0 then p.push('') for _, file in ipairs(files) do local contents = p.capture(function () p.push() p.callArray(fileFunc, cfg, file) m.conditionalElements = {} for cfg in project.eachconfig(prj) do local fcfg = fileconfig.getconfig(file, cfg) if not checkFunc or checkFunc(cfg, fcfg) then p.callArray(fileCfgFunc, fcfg, m.configPair(cfg)) end end if #m.conditionalElements > 0 then m.emitConditionalElements(prj) end p.pop() end) local rel = path.translate(file.relpath) if prj.kind == p.SHAREDITEMS then rel = "$(MSBuildThisFileDirectory)" .. rel end if #contents > 0 then p.push('<%s Include="%s">', tag, rel) p.outln(contents) p.pop('', tag) else p.x('<%s Include="%s" />', tag, rel) end end p.pop('') end end function m.emitRuleFiles(prj, group) local files = group.files local rule = group.category.rule if files and #files > 0 then p.push('') for _, file in ipairs(files) do local contents = p.capture(function() p.push() for prop in p.rule.eachProperty(rule) do local fld = p.rule.getPropertyField(rule, prop) m.conditionalElements = {} for cfg in project.eachconfig(prj) do local fcfg = fileconfig.getconfig(file, cfg) if fcfg and fcfg[fld.name] then local value = m.getRulePropertyString(rule, prop, fcfg[fld.name]) if value and #value > 0 then m.element(prop.name, m.configPair(cfg), '%s', value) end end end if #m.conditionalElements > 0 then m.emitConditionalElements(prj) end end p.pop() end) if #contents > 0 then p.push('<%s Include=\"%s\">', rule.name, path.translate(file.relpath)) p.outln(contents) p.pop('', rule.name) else p.x('<%s Include=\"%s\" />', rule.name, path.translate(file.relpath)) end end p.pop('') end end function m.isClrMixed(prj) local isMixed = false if not prj.clr or prj.clr == p.OFF then if prj._isClrMixed ~= nil then isMixed = prj._isClrMixed else table.foreachi(prj._.files, function(file) for cfg in p.project.eachconfig(prj) do local fcfg = p.fileconfig.getconfig(file, cfg) if fcfg and fcfg.clr and fcfg.clr ~= p.OFF then isMixed = true end end end) prj._isClrMixed = isMixed -- cache the results end end return isMixed end m.elements.projectReferences = function(prj, ref) if prj.clr ~= p.OFF or (m.isClrMixed(prj) and ref and ref.kind ~=p.STATICLIB) then return { m.referenceProject, m.referencePrivate, m.referenceOutputAssembly, m.referenceCopyLocalSatelliteAssemblies, m.referenceLinkLibraryDependencies, m.referenceUseLibraryDependences, } else return { m.referenceProject, } end end function m.projectReferences(prj) local refs = project.getdependencies(prj, 'linkOnly') local contents = p.capture(function() p.push() for _, ref in ipairs(refs) do if ref.kind == p.SHAREDITEMS then local relpath = vstudio.path(prj, vstudio.projectfile(ref)) p.x('', relpath) end end p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end local contents = p.capture(function() p.push() for _, ref in ipairs(refs) do if ref.kind ~= p.SHAREDITEMS then local relpath = vstudio.path(prj, vstudio.projectfile(ref)) p.push('', relpath) p.callArray(m.elements.projectReferences, prj, ref) p.pop('') end end p.pop() end) if #contents > 0 then p.push('') p.outln(contents) p.pop('') end end function m.additionalDependencies(cfg, explicit) local links local toolset = config.toolset(cfg) if cfg.system ~= premake.WINDOWS and toolset then links = toolset.getlinks(cfg, not explicit) else links = vstudio.getLinks(cfg, explicit) end if #links > 0 then links = path.translate(table.concat(links, ";")) m.element("AdditionalDependencies", nil, "%s;%%(AdditionalDependencies)", links) end end function m.additionalIncludeDirectories(cfg, includedirs) if #includedirs > 0 then local dirs = vstudio.path(cfg, includedirs) if #dirs > 0 then m.element("AdditionalIncludeDirectories", nil, "%s;%%(AdditionalIncludeDirectories)", table.concat(dirs, ";")) end end end function m.additionalLibraryDirectories(cfg) if #cfg.libdirs > 0 then local dirs = table.concat(vstudio.path(cfg, cfg.libdirs), ";") m.element("AdditionalLibraryDirectories", nil, "%s;%%(AdditionalLibraryDirectories)", dirs) end end function m.additionalManifestFiles(cfg) local manifests = {} for _, fname in ipairs(cfg.files) do if path.getextension(fname) == ".manifest" then table.insert(manifests, project.getrelative(cfg.project, fname)) end end if #manifests > 0 then m.element("AdditionalManifestFiles", nil, "%s;%%(AdditionalManifestFiles)", table.concat(manifests, ";")) end end function m.additionalUsingDirectories(cfg) if #cfg.usingdirs > 0 then local dirs = vstudio.path(cfg, cfg.usingdirs) if #dirs > 0 then m.element("AdditionalUsingDirectories", nil, "%s;%%(AdditionalUsingDirectories)", table.concat(dirs, ";")) end end end function m.largeAddressAware(cfg) if (cfg.largeaddressaware == true) then m.element("LargeAddressAware", nil, 'true') end end function m.languageStandard(cfg) if _ACTION >= "vs2017" then if (cfg.cppdialect == "C++14") then m.element("LanguageStandard", nil, 'stdcpp14') elseif (cfg.cppdialect == "C++17") then m.element("LanguageStandard", nil, 'stdcpp17') elseif (cfg.cppdialect == "C++20") then m.element("LanguageStandard", nil, 'stdcpplatest') elseif (cfg.cppdialect == "C++latest") then m.element("LanguageStandard", nil, 'stdcpplatest') end end end function m.conformanceMode(cfg) if _ACTION >= "vs2017" then if cfg.conformancemode ~= nil then if cfg.conformancemode then m.element("ConformanceMode", nil, "true") else m.element("ConformanceMode", nil, "false") end end end end function m.structMemberAlignment(cfg) local map = { [1] = "1Byte", [2] = "2Bytes", [4] = "4Bytes", [8] = "8Bytes", [16] = "16Bytes" } local value = map[cfg.structmemberalign] if value then m.element("StructMemberAlignment", nil, value) end end function m.useFullPaths(cfg) if cfg.useFullPaths ~= nil then if cfg.useFullPaths then m.element("UseFullPaths", nil, "true") else m.element("UseFullPaths", nil, "false") end end end function m.removeUnreferencedCodeData(cfg) if cfg.removeUnreferencedCodeData ~= nil then if cfg.removeUnreferencedCodeData then m.element("RemoveUnreferencedCodeData", nil, "true") else m.element("RemoveUnreferencedCodeData", nil, "false") end end end function m.additionalCompileOptions(cfg, condition) local opts = cfg.buildoptions if _ACTION == "vs2015" or vstudio.isMakefile(cfg) then if (cfg.cppdialect == "C++14") then table.insert(opts, "/std:c++14") elseif (cfg.cppdialect == "C++17") then table.insert(opts, "/std:c++17") elseif (cfg.cppdialect == "C++20") then table.insert(opts, "/std:c++latest") elseif (cfg.cppdialect == "C++latest") then table.insert(opts, "/std:c++latest") end end if cfg.toolset and cfg.toolset:startswith("msc") then local value = iif(cfg.unsignedchar, "On", "Off") table.insert(opts, p.tools.msc.shared.unsignedchar[value]) elseif _ACTION >= "vs2019" and cfg.toolset and cfg.toolset == "clang" then local value = iif(cfg.unsignedchar, "On", "Off") table.insert(opts, p.tools.msc.shared.unsignedchar[value]) end if #opts > 0 then opts = table.concat(opts, " ") m.element("AdditionalOptions", condition, '%s %%(AdditionalOptions)', opts) end end function m.additionalLinkOptions(cfg) if #cfg.linkoptions > 0 then local opts = table.concat(cfg.linkoptions, " ") m.element("AdditionalOptions", nil, "%s %%(AdditionalOptions)", opts) end end function m.compileAsManaged(fcfg, condition) if fcfg.clr and fcfg ~= p.OFF then m.element("CompileAsManaged", condition, "true") end end function m.basicRuntimeChecks(cfg, condition) local prjcfg, filecfg = p.config.normalize(cfg) local runtime = config.getruntime(prjcfg) or iif(config.isDebugBuild(cfg), "Debug", "Release") if filecfg then if filecfg.flags.NoRuntimeChecks or (config.isOptimizedBuild(filecfg) and runtime:endswith("Debug")) then m.element("BasicRuntimeChecks", condition, "Default") end else if prjcfg.flags.NoRuntimeChecks or (config.isOptimizedBuild(prjcfg) and runtime:endswith("Debug")) then m.element("BasicRuntimeChecks", nil, "Default") end end end function m.buildInputs(cfg, condition) if cfg.buildinputs and #cfg.buildinputs > 0 then local inputs = project.getrelative(cfg.project, cfg.buildinputs) m.element("Inputs", condition, '%s', table.concat(inputs, ";")) end end function m.buildAdditionalInputs(fcfg, condition) if fcfg.buildinputs and #fcfg.buildinputs > 0 then local inputs = project.getrelative(fcfg.project, fcfg.buildinputs) m.element("AdditionalInputs", condition, '%s', table.concat(inputs, ";")) end end function m.buildCommands(fcfg, condition) if #fcfg.buildcommands > 0 then local commands = os.translateCommandsAndPaths(fcfg.buildcommands, fcfg.project.basedir, fcfg.project.location) m.element("Command", condition, '%s', table.concat(commands,'\r\n')) end end function m.buildLog(cfg) if cfg.buildlog and #cfg.buildlog > 0 then p.push('') m.element("Path", nil, "%s", vstudio.path(cfg, cfg.buildlog)) p.pop('') end end function m.buildMessage(fcfg, condition) if fcfg.buildmessage then m.element("Message", condition, '%s', fcfg.buildmessage) end end function m.buildOutputs(fcfg, condition) if #fcfg.buildoutputs > 0 then local outputs = project.getrelative(fcfg.project, fcfg.buildoutputs) m.element("Outputs", condition, '%s', table.concat(outputs, ";")) end end function m.linkObjects(fcfg, condition) if fcfg.linkbuildoutputs ~= nil then m.element("LinkObjects", condition, tostring(fcfg.linkbuildoutputs)) end end function m.characterSet(cfg) if not vstudio.isMakefile(cfg) then local charactersets = { ASCII = "NotSet", MBCS = "MultiByte", Unicode = "Unicode", Default = "Unicode" } m.element("CharacterSet", nil, charactersets[cfg.characterset]) end end function m.wholeProgramOptimization(cfg) if cfg.flags.LinkTimeOptimization then m.element("WholeProgramOptimization", nil, "true") end end function m.clCompileAdditionalIncludeDirectories(cfg) m.additionalIncludeDirectories(cfg, cfg.includedirs) end function m.clCompileAdditionalUsingDirectories(cfg) m.additionalUsingDirectories(cfg, cfg.usingdirs) end function m.clCompilePreprocessorDefinitions(cfg, condition) local defines = cfg.defines if cfg.exceptionhandling == p.OFF then defines = table.join(defines, "_HAS_EXCEPTIONS=0") end m.preprocessorDefinitions(cfg, defines, false, condition) end function m.clCompileUndefinePreprocessorDefinitions(cfg, condition) m.undefinePreprocessorDefinitions(cfg, cfg.undefines, false, condition) end function m.clrSupport(cfg) local value if cfg.clr == "On" or cfg.clr == "Unsafe" then value = "true" elseif cfg.clr ~= p.OFF then value = cfg.clr end if value then m.element("CLRSupport", nil, value) end end function m.compileAs(cfg, condition) if p.languages.isc(cfg.compileas) then m.element("CompileAs", condition, "CompileAsC") elseif p.languages.iscpp(cfg.compileas) then m.element("CompileAs", condition, "CompileAsCpp") elseif cfg.compileas == "Module" then m.element("CompileAs", condition, "CompileAsCppModule") elseif cfg.compileas == "ModulePartition" then m.element("CompileAs", condition, "CompileAsCppModuleInternalPartition") elseif cfg.compileas == "HeaderUnit" then m.element("CompileAs", condition, "CompileAsHeaderUnit") end end function m.configurationType(cfg) local types = { SharedLib = "DynamicLibrary", StaticLib = "StaticLibrary", ConsoleApp = "Application", WindowedApp = "Application", Makefile = "Makefile", None = "Makefile", Utility = "Utility", } m.element("ConfigurationType", nil, types[cfg.kind]) end function m.culture(cfg) local value = vstudio.cultureForLocale(cfg.locale) if value then m.element("Culture", nil, "0x%04x", tostring(value)) end end function m.debugInformationFormat(cfg) local value local tool, toolVersion = p.config.toolset(cfg) if (cfg.symbols == p.ON) or (cfg.symbols == "FastLink") or (cfg.symbols == "Full") then if cfg.debugformat == "c7" then value = "OldStyle" elseif (cfg.architecture == "x86_64" and _ACTION < "vs2015") or cfg.clr ~= p.OFF or config.isOptimizedBuild(cfg) or cfg.editandcontinue == p.OFF or (toolVersion and toolVersion:startswith("LLVM-vs")) then value = "ProgramDatabase" else value = "EditAndContinue" end m.element("DebugInformationFormat", nil, value) elseif cfg.symbols == p.OFF then if _ACTION < "vs2015" then value = "" else value = "None" end m.element("DebugInformationFormat", nil, value) end end function m.enableDpiAwareness(cfg) local awareness = { None = "false", High = "true", HighPerMonitor = "PerMonitorHighDPIAware", } local value = awareness[cfg.dpiawareness] if value then m.element("EnableDpiAwareness", nil, value) end end function m.enableEnhancedInstructionSet(cfg, condition) local v local x = cfg.vectorextensions if x == "AVX" and _ACTION > "vs2010" then v = "AdvancedVectorExtensions" elseif x == "AVX2" and _ACTION > "vs2012" then v = "AdvancedVectorExtensions2" elseif cfg.architecture ~= "x86_64" then if x == "SSE2" or x == "SSE3" or x == "SSSE3" or x == "SSE4.1" or x == "SSE4.2" then v = "StreamingSIMDExtensions2" elseif x == "SSE" then v = "StreamingSIMDExtensions" elseif x == "IA32" and _ACTION > "vs2010" then v = "NoExtensions" end end if v then m.element('EnableEnhancedInstructionSet', condition, v) end end function m.entryPointSymbol(cfg) if cfg.entrypoint then m.element("EntryPointSymbol", nil, cfg.entrypoint) end end function m.exceptionHandling(cfg, condition) if cfg.exceptionhandling == p.OFF then m.element("ExceptionHandling", condition, "false") elseif cfg.exceptionhandling == "SEH" then m.element("ExceptionHandling", condition, "Async") elseif cfg.exceptionhandling == "On" then m.element("ExceptionHandling", condition, "Sync") elseif cfg.exceptionhandling == "CThrow" then m.element("ExceptionHandling", condition, "SyncCThrow") end end function m.excludedFromBuild(filecfg, condition) if not filecfg or filecfg.flags.ExcludeFromBuild then m.element("ExcludedFromBuild", condition, "true") end end function m.exceptionHandlingSEH(filecfg, condition) if not filecfg or filecfg.exceptionhandling == "SEH" then m.element("UseSafeExceptionHandlers", condition, "true") end end function m.extensionsToDeleteOnClean(cfg) if #cfg.cleanextensions > 0 then local value = table.implode(cfg.cleanextensions, "*", ";", "") m.element("ExtensionsToDeleteOnClean", nil, value .. "$(ExtensionsToDeleteOnClean)") end end function m.fileType(cfg, file) m.element("FileType", nil, "Document") end function m.floatingPointModel(cfg) if cfg.floatingpoint and cfg.floatingpoint ~= "Default" then m.element("FloatingPointModel", nil, cfg.floatingpoint) end end function m.floatingPointExceptions(cfg) if cfg.floatingpointexceptions ~= nil then if cfg.floatingpointexceptions then m.element("FloatingPointExceptions", nil, "true") else m.element("FloatingPointExceptions", nil, "false") end end end function m.inlineFunctionExpansion(cfg) if cfg.inlining then local types = { Default = "Default", Disabled = "Disabled", Explicit = "OnlyExplicitInline", Auto = "AnySuitable", } m.element("InlineFunctionExpansion", nil, types[cfg.inlining]) end end function m.forceIncludes(cfg, condition) if #cfg.forceincludes > 0 then local includes = vstudio.path(cfg, cfg.forceincludes) if #includes > 0 then m.element("ForcedIncludeFiles", condition, table.concat(includes, ';')) end end if #cfg.forceusings > 0 then local usings = vstudio.path(cfg, cfg.forceusings) if #usings > 0 then m.element("ForcedUsingFiles", condition, table.concat(usings, ';')) end end end function m.fullProgramDatabaseFile(cfg) if _ACTION >= "vs2015" and cfg.symbols == "FastLink" then m.element("FullProgramDatabaseFile", nil, "true") end end function m.assemblyDebug(cfg) if cfg.assemblydebug then m.element("AssemblyDebug", nil, "true") end end function m.functionLevelLinking(cfg) if cfg.functionlevellinking ~= nil then if cfg.functionlevellinking then m.element("FunctionLevelLinking", nil, "true") else m.element("FunctionLevelLinking", nil, "false") end elseif config.isOptimizedBuild(cfg) then m.element("FunctionLevelLinking", nil, "true") end end function m.generateDebugInformation(cfg) local lookup = {} if _ACTION >= "vs2017" then lookup[p.ON] = "true" lookup[p.OFF] = "false" lookup["FastLink"] = "DebugFastLink" lookup["Full"] = "DebugFull" elseif _ACTION == "vs2015" then lookup[p.ON] = "true" lookup[p.OFF] = "false" lookup["FastLink"] = "DebugFastLink" lookup["Full"] = "true" else lookup[p.ON] = "true" lookup[p.OFF] = "false" lookup["FastLink"] = "true" lookup["Full"] = "true" end local value = lookup[cfg.symbols] if value then m.element("GenerateDebugInformation", nil, value) end end function m.generateManifest(cfg) if cfg.flags.NoManifest then m.element("GenerateManifest", nil, "false") end end function m.generateMapFile(cfg) if cfg.flags.Maps then m.element("GenerateMapFile", nil, "true") end end function m.ignoreDefaultLibraries(cfg) if #cfg.ignoredefaultlibraries > 0 then local ignored = cfg.ignoredefaultlibraries for i = 1, #ignored do if not p.tools.msc.getLibraryExtensions()[ignored[i]:match("[^.]+$")] then ignored[i] = path.appendextension(ignored[i], ".lib") end end m.element("IgnoreSpecificDefaultLibraries", condition, table.concat(ignored, ';')) end end function m.ignoreWarnDuplicateFilename(prj) if _ACTION > "vs2012" then m.element("IgnoreWarnCompileDuplicatedFilename", nil, "true") end end function m.ignoreImportLibrary(cfg) if cfg.kind == p.SHAREDLIB and cfg.flags.NoImportLib then m.element("IgnoreImportLibrary", nil, "true") end end function m.importLanguageTargets(prj) p.w('') end m.elements.importExtensionTargets = function(prj) return { m.importGroupTargets, m.importRuleTargets, m.importNuGetTargets, m.importBuildCustomizationsTargets } end function m.importExtensionTargets(prj) p.push('') p.callArray(m.elements.importExtensionTargets, prj) p.pop('') end function m.importGroupTargets(prj) local groups = m.categorizeSources(prj) for _, group in ipairs(groups) do if group.category.emitExtensionTargets then group.category.emitExtensionTargets(prj, group) end end end function m.importRuleTargets(prj) for i = 1, #prj.rules do local rule = p.global.getRule(prj.rules[i]) local loc = vstudio.path(prj, p.filename(rule, ".targets")) p.x('', loc) end end local function nuGetTargetsFile(prj, package) local packageAPIInfo = vstudio.nuget2010.packageAPIInfo(prj, package) return p.vstudio.path(prj, p.filename(prj.workspace, string.format("packages\\%s.%s\\build\\native\\%s.targets", vstudio.nuget2010.packageId(package), packageAPIInfo.verbatimVersion or packageAPIInfo.version, vstudio.nuget2010.packageId(package)))) end function m.importNuGetTargets(prj) if not vstudio.nuget2010.supportsPackageReferences(prj) then for i = 1, #prj.nuget do local targetsFile = nuGetTargetsFile(prj, prj.nuget[i]) p.x('', targetsFile, targetsFile) end end end function m.importBuildCustomizationsTargets(prj) for i, build in ipairs(prj.buildcustomizations) do p.w('', path.translate(build)) end end function m.ensureNuGetPackageBuildImports(prj) if #prj.nuget > 0 then p.push('') p.push('') p.x('This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.') p.pop('') for i = 1, #prj.nuget do local targetsFile = nuGetTargetsFile(prj, prj.nuget[i]) p.x('', targetsFile, targetsFile) end p.pop('') end end function m.importDefaultProps(prj) p.w('') end function m.importLanguageSettings(prj) p.w('') end m.elements.importExtensionSettings = function(prj) return { m.importGroupSettings, m.importRuleSettings, m.importBuildCustomizationsProps } end function m.importExtensionSettings(prj) p.push('') p.callArray(m.elements.importExtensionSettings, prj) p.pop('') end function m.importGroupSettings(prj) local groups = m.categorizeSources(prj) for _, group in ipairs(groups) do if group.category.emitExtensionSettings then group.category.emitExtensionSettings(prj, group) end end end function m.importRuleSettings(prj) for i = 1, #prj.rules do local rule = p.global.getRule(prj.rules[i]) local loc = vstudio.path(prj, p.filename(rule, ".props")) p.x('', loc) end end function m.importBuildCustomizationsProps(prj) for i, build in ipairs(prj.buildcustomizations) do p.w('', path.translate(build)) end end function m.importLibrary(cfg) if cfg.kind == p.SHAREDLIB then m.element("ImportLibrary", nil, "%s", path.translate(cfg.linktarget.relpath)) end end function m.includePath(cfg) local dirs = vstudio.path(cfg, cfg.sysincludedirs) if #dirs > 0 then m.element("IncludePath", nil, "%s;$(IncludePath)", table.concat(dirs, ";")) end end function m.intDir(cfg) local objdir = vstudio.path(cfg, cfg.objdir) m.element("IntDir", nil, "%s\\", objdir) end function m.intrinsicFunctions(cfg) if cfg.intrinsics ~= nil then if cfg.intrinsics then m.element("IntrinsicFunctions", nil, "true") else m.element("IntrinsicFunctions", nil, "false") end elseif config.isOptimizedBuild(cfg) then m.element("IntrinsicFunctions", nil, "true") end end function m.justMyCodeDebugging(cfg) if _ACTION >= "vs2017" then local jmc = cfg.justmycode if jmc == "On" then m.element("SupportJustMyCode", nil, "true") elseif jmc == "Off" then m.element("SupportJustMyCode", nil, "false") end end end function m.supportOpenMP(cfg) if cfg.openmp == "On" then m.element("OpenMPSupport", nil, "true") elseif cfg.openmp == "Off" then m.element("OpenMPSupport", nil, "false") end end function m.keyword(prj) local isWin, isManaged, isMakefile for cfg in project.eachconfig(prj) do if cfg.system == p.WINDOWS then isWin = true end if cfg.clr ~= p.OFF then isManaged = true end if vstudio.isMakefile(cfg) then isMakefile = true end end if isWin then if isMakefile then m.element("Keyword", nil, "MakeFileProj") else if isManaged or m.isClrMixed(prj) then m.targetFramework(prj) end if isManaged then m.element("Keyword", nil, "ManagedCProj") else m.element("Keyword", nil, "Win32Proj") end m.element("RootNamespace", nil, "%s", prj.name) end end end function m.libraryPath(cfg) local dirs = vstudio.path(cfg, cfg.syslibdirs) if #dirs > 0 then m.element("LibraryPath", nil, "%s;$(LibraryPath)", table.concat(dirs, ";")) end end function m.linkIncremental(cfg) if cfg.kind ~= p.STATICLIB then m.element("LinkIncremental", nil, "%s", tostring(config.canLinkIncremental(cfg))) end end function m.linkLibraryDependencies(cfg, explicit) if explicit then p.push('') m.element("LinkLibraryDependencies", nil, "false") p.pop('') end end function m.MasmPreprocessorDefinitions(cfg, condition) if cfg.defines then m.preprocessorDefinitions(cfg, cfg.defines, false, condition) end end function m.minimalRebuild(cfg) if config.isOptimizedBuild(cfg) or cfg.flags.NoMinimalRebuild or cfg.flags.MultiProcessorCompile or cfg.debugformat == p.C7 then m.element("MinimalRebuild", nil, "false") end end function m.moduleDefinitionFile(cfg) local df = config.findfile(cfg, ".def") if df then m.element("ModuleDefinitionFile", nil, "%s", df) end end function m.multiProcessorCompilation(cfg) if cfg.flags.MultiProcessorCompile then m.element("MultiProcessorCompilation", nil, "true") end end function m.nmakeBuildCommands(cfg) m.nmakeCommandLine(cfg, cfg.buildcommands, "Build") end function m.nmakeCleanCommands(cfg) m.nmakeCommandLine(cfg, cfg.cleancommands, "Clean") end function m.nmakeCommandLine(cfg, commands, phase) if #commands > 0 then commands = os.translateCommandsAndPaths(commands, cfg.project.basedir, cfg.project.location) commands = table.concat(p.esc(commands), p.eol()) p.w('%s', phase, commands, phase) end end function m.nmakeIncludeDirs(cfg) if cfg.kind ~= p.NONE and #cfg.includedirs > 0 then local dirs = vstudio.path(cfg, cfg.includedirs) if #dirs > 0 then m.element("NMakeIncludeSearchPath", nil, "%s", table.concat(dirs, ";")) end end end function m.nmakeOutDirs(cfg) if vstudio.isMakefile(cfg) then m.outDir(cfg) m.intDir(cfg) end end function m.windowsSDKDesktopARMSupport(cfg) if cfg.system == p.WINDOWS then if cfg.architecture == p.ARM then p.w('true') end if cfg.architecture == p.ARM64 then p.w('true') end end end function m.nmakeOutput(cfg) m.element("NMakeOutput", nil, "$(OutDir)%s", cfg.buildtarget.name) end function m.nmakePreprocessorDefinitions(cfg) if cfg.kind ~= p.NONE and #cfg.defines > 0 then local defines = table.concat(cfg.defines, ";") defines = defines .. ";$(NMakePreprocessorDefinitions)" m.element('NMakePreprocessorDefinitions', nil, defines) end end function m.nmakeRebuildCommands(cfg) m.nmakeCommandLine(cfg, cfg.rebuildcommands, "ReBuild") end function m.objectFileName(fcfg) if fcfg.objname ~= fcfg.basename then m.element("ObjectFileName", m.configPair(fcfg.config), "$(IntDir)\\%s.obj", fcfg.objname) end end function m.omitDefaultLib(cfg) if cfg.flags.OmitDefaultLibrary then m.element("OmitDefaultLibName", nil, "true") end end function m.omitFramePointers(cfg) local map = { Off = "false", On = "true" } local value = map[cfg.omitframepointer] if value then m.element("OmitFramePointers", nil, value) end end function m.optimizeReferences(cfg) if config.isOptimizedBuild(cfg) then m.element("EnableCOMDATFolding", nil, "true") m.element("OptimizeReferences", nil, "true") end end function m.optimization(cfg, condition) local map = { Off="Disabled", On="Full", Debug="Disabled", Full="Full", Size="MinSpace", Speed="MaxSpeed" } local value = map[cfg.optimize] if value or not condition then m.element('Optimization', condition, value or "Disabled") end end function m.outDir(cfg) local outdir = vstudio.path(cfg, cfg.buildtarget.directory) m.element("OutDir", nil, "%s\\", outdir) end function m.executablePath(cfg) local dirs = vstudio.path(cfg, cfg.bindirs) if #dirs > 0 then dirs = table.translate(dirs, function(dir) if path.isabsolute(dir) then return dir end return "$(ProjectDir)" .. dir end) m.element("ExecutablePath", nil, "%s;$(ExecutablePath)", table.concat(dirs, ";")) end end function m.toolsVersion(cfg) local version = cfg.toolsversion if _ACTION >= "vs2017" and version then m.element("VCToolsVersion", nil, version) end end function m.platformToolset(cfg) local tool, version = p.config.toolset(cfg) if not version and _ACTION >= "vs2019" and cfg.toolset == "clang" then version = "ClangCL" end if not version then local value = p.action.current().toolset tool, version = p.tools.canonical(value) end if version then if cfg.kind == p.NONE or cfg.kind == p.MAKEFILE then if p.config.hasFile(cfg, path.iscppfile) or _ACTION >= "vs2015" then m.element("PlatformToolset", nil, version) end else m.element("PlatformToolset", nil, version) end end end function m.precompiledHeaderFile(fileName, cfg) m.element("PrecompiledHeaderFile", nil, "%s", fileName) end function m.precompiledHeader(cfg, condition) local prjcfg, filecfg = p.config.normalize(cfg) if filecfg then if prjcfg.pchsource == filecfg.abspath and not prjcfg.flags.NoPCH then m.element('PrecompiledHeader', condition, 'Create') elseif filecfg.flags.NoPCH then m.element('PrecompiledHeader', condition, 'NotUsing') end else if not prjcfg.flags.NoPCH and prjcfg.pchheader then m.element("PrecompiledHeader", nil, "Use") m.precompiledHeaderFile(prjcfg.pchheader, prjcfg) else m.element("PrecompiledHeader", nil, "NotUsing") end end end function m.preprocessorDefinitions(cfg, defines, escapeQuotes, condition) if #defines > 0 then defines = table.concat(defines, ";") if escapeQuotes then defines = defines:gsub('"', '\\"') end defines = defines .. ";%%(PreprocessorDefinitions)" m.element('PreprocessorDefinitions', condition, defines) end end function m.undefinePreprocessorDefinitions(cfg, undefines, escapeQuotes, condition) if #undefines > 0 then undefines = table.concat(undefines, ";") if escapeQuotes then undefines = undefines:gsub('"', '\\"') end undefines = undefines .. ";%%(UndefinePreprocessorDefinitions)" m.element('UndefinePreprocessorDefinitions', condition, undefines) end end local function getSymbolsPathRelative(cfg) if cfg.symbolspath and cfg.symbols ~= p.OFF and cfg.debugformat ~= "c7" then return p.project.getrelative(cfg.project, cfg.symbolspath) else return nil end end function m.programDatabaseFile(cfg) local value = getSymbolsPathRelative(cfg) if value then m.element("ProgramDatabaseFile", nil, value) end end function m.programDatabaseFileName(cfg) local value = getSymbolsPathRelative(cfg) if value then m.element("ProgramDataBaseFileName", nil, value) end end function m.projectGuid(prj) m.element("ProjectGuid", nil, "{%s}", prj.uuid) end function m.projectName(prj) if prj.name ~= prj.filename then m.element("ProjectName", nil, "%s", prj.name) end end function m.propertyGroup(cfg, label) local cond if cfg then cond = string.format(' %s', m.condition(cfg)) end if label then label = string.format(' Label="%s"', label) end p.push('', cond or "", label or "") end function m.propertySheets(cfg) p.push('', m.condition(cfg)) p.w('') p.pop('') end function m.propertySheetGroup(prj) for cfg in project.eachconfig(prj) do m.propertySheets(cfg) end end function m.referenceCopyLocalSatelliteAssemblies(prj, ref) m.element("CopyLocalSatelliteAssemblies", nil, "false") end function m.referenceLinkLibraryDependencies(prj, ref) m.element("LinkLibraryDependencies", nil, "true") end function m.referenceOutputAssembly(prj, ref) m.element("ReferenceOutputAssembly", nil, "true") end function m.referencePrivate(prj, ref) m.element("Private", nil, "true") end function m.referenceProject(prj, ref) m.element("Project", nil, "{%s}", ref.uuid) end function m.referenceUseLibraryDependences(prj, ref) m.element("UseLibraryDependencyInputs", nil, "false") end function m.resourceAdditionalIncludeDirectories(cfg) m.additionalIncludeDirectories(cfg, table.join(cfg.includedirs, cfg.resincludedirs)) end function m.resourcePreprocessorDefinitions(cfg) local defines = table.join(cfg.defines, cfg.resdefines) if cfg.exceptionhandling == p.OFF then table.insert(defines, "_HAS_EXCEPTIONS=0") end m.preprocessorDefinitions(cfg, defines, true) end function m.runtimeLibrary(cfg) local runtimes = { StaticDebug = "MultiThreadedDebug", StaticRelease = "MultiThreaded", SharedDebug = "MultiThreadedDebugDLL", SharedRelease = "MultiThreadedDLL" } local runtime = config.getruntime(cfg) if runtime then m.element("RuntimeLibrary", nil, runtimes[runtime]) end end function m.callingConvention(cfg) if cfg.callingconvention then m.element("CallingConvention", nil, cfg.callingconvention) end end function m.runtimeTypeInfo(cfg, condition) if cfg.rtti == p.OFF and ((not cfg.clr) or cfg.clr == p.OFF) then m.element("RuntimeTypeInfo", condition, "false") elseif cfg.rtti == p.ON then m.element("RuntimeTypeInfo", condition, "true") end end function m.bufferSecurityCheck(cfg) local tool, toolVersion = p.config.toolset(cfg) if cfg.flags.NoBufferSecurityCheck or (toolVersion and toolVersion:startswith("LLVM-vs")) then m.element("BufferSecurityCheck", nil, "false") end end function m.stringPooling(cfg) if cfg.stringpooling ~= nil then if cfg.stringpooling then m.element("StringPooling", nil, "true") else m.element("StringPooling", nil, "false") end elseif config.isOptimizedBuild(cfg) then m.element("StringPooling", nil, "true") end end function m.subSystem(cfg) local subsystem = iif(cfg.kind == p.CONSOLEAPP, "Console", "Windows") m.element("SubSystem", nil, subsystem) end function m.targetExt(cfg) local ext = cfg.buildtarget.extension if ext ~= "" then m.element("TargetExt", nil, "%s", ext) else p.w('') p.w('') end end function m.targetMachine(cfg) local targetmachine = { x86 = "MachineX86", x86_64 = "MachineX64", } if cfg.kind == p.STATICLIB and config.hasFile(cfg, path.isresourcefile) then local value = targetmachine[cfg.architecture] if value ~= nil then m.element("TargetMachine", nil, '%s', value) end end end function m.targetName(cfg) m.element("TargetName", nil, "%s%s", cfg.buildtarget.prefix, cfg.buildtarget.basename) end function m.latestTargetPlatformVersion(prj) if _ACTION == "vs2017" then m.element("LatestTargetPlatformVersion", nil, "$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))") end end function m.windowsTargetPlatformVersion(prj, cfg) if _ACTION < "vs2015" then return end local target = cfg or prj local version = project.systemversion(target) if cfg then local prjVersion = project.systemversion(prj) if not prjVersion or version == prjVersion then return end end if version == "latest" then if _ACTION == "vs2015" then version = nil -- SDK v10 is not supported by VS2015 elseif _ACTION == "vs2017" then version = "$(LatestTargetPlatformVersion)" else version = "10.0" end end if version then m.element("WindowsTargetPlatformVersion", nil, version) end end function m.xpDeprecationWarning(prj, cfg) if cfg.toolset == "msc-v141_xp" then m.element("XPDeprecationWarning", nil, "false") end end function m.fastUpToDateCheck(prj) if prj.fastuptodate ~= nil then m.element("DisableFastUpToDateCheck", nil, iif(prj.fastuptodate, "false", "true")) end end function m.preferredToolArchitecture(prj) if _ACTION >= "vs2013" then if prj.preferredtoolarchitecture == p.X86_64 then m.element("PreferredToolArchitecture", nil, 'x64') elseif prj.preferredtoolarchitecture == p.X86 then m.element("PreferredToolArchitecture", nil, 'x86') end else if prj.preferredtoolarchitecture == p.X86_64 then m.element("UseNativeEnvironment", nil, 'true') end end end function m.treatLinkerWarningAsErrors(cfg) if cfg.flags.FatalLinkWarnings then local el = iif(cfg.kind == p.STATICLIB, "Lib", "Linker") m.element("Treat" .. el .. "WarningAsErrors", nil, "true") end end function m.treatWChar_tAsBuiltInType(cfg) local map = { On = "true", Off = "false" } local value = map[cfg.nativewchar] if value then m.element("TreatWChar_tAsBuiltInType", nil, value) end end function m.treatWarningAsError(cfg) if cfg.flags.FatalCompileWarnings and cfg.warnings ~= p.OFF then m.element("TreatWarningAsError", nil, "true") end end function m.disableSpecificWarnings(cfg, condition) if #cfg.disablewarnings > 0 then local warnings = table.concat(cfg.disablewarnings, ";") warnings = warnings .. ";%%(DisableSpecificWarnings)" m.element('DisableSpecificWarnings', condition, warnings) end end function m.treatSpecificWarningsAsErrors(cfg, condition) if #cfg.fatalwarnings > 0 then local fatal = table.concat(cfg.fatalwarnings, ";") fatal = fatal .. ";%%(TreatSpecificWarningsAsErrors)" m.element('TreatSpecificWarningsAsErrors', condition, fatal) end end function m.useDebugLibraries(cfg) local runtime = config.getruntime(cfg) or iif(config.isDebugBuild(cfg), "Debug", "Release") m.element("UseDebugLibraries", nil, tostring(runtime:endswith("Debug"))) end function m.useOfMfc(cfg) if cfg.flags.MFC then m.element("UseOfMfc", nil, iif(cfg.staticruntime == "On", "Static", "Dynamic")) end end function m.useOfAtl(cfg) if cfg.atl then m.element("UseOfATL", nil, cfg.atl) end end function m.userMacros(cfg) p.w('') end function m.warningLevel(cfg) local map = { Off = "TurnOffAllWarnings", High = "Level4", Extra = "Level4", Everything = "EnableAllWarnings" } m.element("WarningLevel", nil, map[cfg.warnings] or "Level3") end function m.warningLevelFile(cfg, condition) local map = { Off = "TurnOffAllWarnings", High = "Level4", Extra = "Level4", Everything = "EnableAllWarnings" } if cfg.warnings then m.element("WarningLevel", condition, map[cfg.warnings] or "Level3") end end function m.xmlDeclaration() p.xmlUtf8() end function m.fxCompilePreprocessorDefinition(cfg, condition) if cfg.shaderdefines and #cfg.shaderdefines > 0 then local shaderdefines = table.concat(cfg.shaderdefines, ";") shaderdefines = shaderdefines .. ";%%(PreprocessorDefinitions)" m.element('PreprocessorDefinitions', condition, shaderdefines) end end function m.fxCompileAdditionalIncludeDirs(cfg, condition) if cfg.shaderincludedirs and #cfg.shaderincludedirs > 0 then local dirs = vstudio.path(cfg, cfg.shaderincludedirs) m.element('AdditionalIncludeDirectories', condition, "%s;%%(AdditionalIncludeDirectories)", table.concat(dirs, ";")) end end function m.fxCompileShaderType(cfg, condition) if cfg.shadertype then m.element("ShaderType", condition, cfg.shadertype) end end function m.fxCompileShaderModel(cfg, condition) if cfg.shadermodel then m.element("ShaderModel", condition, cfg.shadermodel) end end function m.fxCompileShaderEntry(cfg, condition) if cfg.shaderentry then m.element("EntryPointName", condition, cfg.shaderentry) end end function m.fxCompileShaderVariableName(cfg, condition) if cfg.shadervariablename then m.element("VariableName", condition, cfg.shadervariablename) end end function m.fxCompileShaderHeaderOutput(cfg, condition) if cfg.shaderheaderfileoutput then m.element("HeaderFileOutput", condition, cfg.shaderheaderfileoutput) end end function m.fxCompileShaderObjectOutput(cfg, condition) if cfg.shaderobjectfileoutput then m.element("ObjectFileOutput", condition, cfg.shaderobjectfileoutput) end end function m.fxCompileShaderAssembler(cfg, condition) if cfg.shaderassembler then m.element("AssemblerOutput", condition, cfg.shaderassembler) end end function m.fxCompileShaderAssemblerOutput(cfg, condition) if cfg.shaderassembleroutput then m.element("AssemblerOutputFile", condition, cfg.shaderassembleroutput) end end function m.fxCompileShaderAdditionalOptions(cfg, condition) local opts = cfg.shaderoptions if #opts > 0 then opts = table.concat(opts, " ") m.element("AdditionalOptions", condition, '%s %%(AdditionalOptions)', opts) end end function m.conditionFromConfigText(cfgText) return string.format('Condition="\'$(Configuration)|$(Platform)\'==\'%s\'"', p.esc(cfgText)) end function m.condition(cfg) return m.conditionFromConfigText(vstudio.projectConfig(cfg)) end function m.element(name, condition, value, ...) local arg = {...} if select('#',...) == 0 then value = p.esc(value) else for i = 1, #arg do arg[i] = p.esc(arg[i]) end end if condition then local element = {} element.name = name element.condition = condition element.value = value element.args = arg if ... then if value == '%s' then element.setting = table.concat(arg) else element.setting = value .. table.concat(arg) end else element.setting = element.value end table.insert(m.conditionalElements, element) else local format = string.format('<%s>%s', name, value, name) p.w(format, table.unpack(arg)) end end local p = premake p.vstudio.nuget2010 = {} local vstudio = p.vstudio local nuget2010 = p.vstudio.nuget2010 local dn2005 = p.vstudio.dotnetbase local packageAPIInfos = {} local packageSourceInfos = {} function nuget2010.packageId(package) return package:sub(0, package:find(":") - 1) end function nuget2010.packageVersion(package) return package:sub(package:find(":") + 1, -1) end function nuget2010.packageFramework(prj) if p.project.isdotnet(prj) then local cfg = p.project.getfirstconfig(prj) local action = p.action.current() local framework = cfg.dotnetframework or action.vstudio.targetFramework return dn2005.formatNuGetFrameworkVersion(framework) else return "native" end end function nuget2010.supportsPackageReferences(prj) return _ACTION >= "vs2017" and p.project.isdotnet(prj) end function nuget2010.packageAPIInfo(prj, package) local id = nuget2010.packageId(package) local version = nuget2010.packageVersion(package) local function examinePackageFromCache() if not os.ishost("windows") then return end local cachePath = path.translate(path.join(os.getenv("userprofile"), ".nuget/packages", id)) if os.isdir(cachePath) then local packageAPIInfo = {} printf("Examining cached NuGet package '%s'...", id) io.flush() local versionPath = path.translate(path.join(cachePath, version)) local nuspecPath = path.translate(path.join(versionPath, id .. ".nuspec")) if not os.isfile(nuspecPath) then return end local nuspec = io.readfile(nuspecPath) if not nuspec then return end packageAPIInfo.verbatimVersion = nuspec:match("(.+)") packageAPIInfo.version = version if not packageAPIInfo.verbatimVersion then return end if p.project.isdotnet(prj) then packageAPIInfo.packageEntries = {} for _, file in ipairs(os.matchfiles(path.translate(path.join(versionPath, "**")))) do local extension = path.getextension(file) if extension ~= ".nupkg" and extension ~= ".sha512" then table.insert(packageAPIInfo.packageEntries, path.translate(path.getrelative(versionPath, file))) end end if #packageAPIInfo.packageEntries == 0 then return end if nuspec:match("(.+)") then p.warn("NuGet package '%s' may depend on .NET Framework assemblies - package dependencies are currently unimplemented", id) end end if nuspec:match("(.+)") then p.warn("NuGet package '%s' may depend on other packages - package dependencies are currently unimplemented", id) end packageAPIInfos[package] = packageAPIInfo end end if not packageAPIInfos[package] then examinePackageFromCache() end if not packageAPIInfos[package] then if not packageSourceInfos[prj.nugetsource] then local packageSourceInfo = {} printf("Examining NuGet package source '%s'...", prj.nugetsource) io.flush() local response, err, code = http.get(prj.nugetsource) if err ~= "OK" then p.error("NuGet API error (%d)\n%s", code, err) end response, err = json.decode(response) if not response then p.error("Failed to decode NuGet API response (%s)", err) end if not response.resources then p.error("Failed to understand NuGet API response (no resources in response)", id) end local packageDisplayMetadataUriTemplate, catalog for _, resource in ipairs(response.resources) do if not resource["@id"] then p.error("Failed to understand NuGet API response (no resource['@id'])") end if not resource["@type"] then p.error("Failed to understand NuGet API response (no resource['@type'])") end if resource["@type"]:find("PackageDisplayMetadataUriTemplate") == 1 then packageDisplayMetadataUriTemplate = resource end if resource["@type"]:find("Catalog") == 1 then catalog = resource end end if not packageDisplayMetadataUriTemplate then p.error("Failed to understand NuGet API response (no PackageDisplayMetadataUriTemplate resource)") end if not catalog then if prj.nugetsource == "https://api.nuget.org/v3/index.json" then p.error("Failed to understand NuGet API response (no Catalog resource)") else p.error("Package source is not a NuGet gallery - non-gallery sources are currently unsupported", prj.nugetsource, prj.name) end end packageSourceInfo.packageDisplayMetadataUriTemplate = packageDisplayMetadataUriTemplate packageSourceInfo.catalog = catalog packageSourceInfos[prj.nugetsource] = packageSourceInfo end local packageAPIInfo = {} printf("Examining NuGet package '%s'...", id) io.flush() local response, err, code = http.get(packageSourceInfos[prj.nugetsource].packageDisplayMetadataUriTemplate["@id"]:gsub("{id%-lower}", id:lower())) if err ~= "OK" then if code == 404 then p.error("NuGet package '%s' for project '%s' couldn't be found in the repository", id, prj.name) else p.error("NuGet API error (%d)\n%s", code, err) end end response, err = json.decode(response) if not response then p.error("Failed to decode NuGet API response (%s)", err) end if not response.items or #response.items == 0 then p.error("Failed to understand NuGet API response (no pages for package '%s')", id) end local items = {} for _, page in ipairs(response.items) do if not page.items or #page.items == 0 then p.error("Failed to understand NuGet API response (got a page with no items for package '%s')", id) end for _, item in ipairs(page.items) do table.insert(items, item) end end local versions = {} for _, item in ipairs(items) do if not item.catalogEntry then p.error("Failed to understand NuGet API response (subitem of package '%s' has no catalogEntry)", id) end if not item.catalogEntry.version then p.error("Failed to understand NuGet API response (subitem of package '%s' has no catalogEntry.version)", id) end if not item.catalogEntry["@id"] then p.error("Failed to understand NuGet API response (subitem of package '%s' has no catalogEntry['@id'])", id) end table.insert(versions, item.catalogEntry.version) end if not table.contains(versions, version) then local options = table.translate(versions, function(value) return "'" .. value .. "'" end) options = table.concat(options, ", ") p.error("'%s' is not a valid version for NuGet package '%s' (options are: %s)", version, id, options) end for _, item in ipairs(items) do if item.catalogEntry.version == version then local response, err, code = http.get(item.catalogEntry["@id"]) if err ~= "OK" then if code == 404 then p.error("NuGet package '%s' version '%s' couldn't be found in the repository even though the API reported that it exists", id, version) else p.error("NuGet API error (%d)\n%s", code, err) end end response, err = json.decode(response) if not response then p.error("Failed to decode NuGet API response (%s)", err) end if not response.verbatimVersion and not response.version then p.error("Failed to understand NuGet API response (package '%s' version '%s' has no verbatimVersion or version)", id, version) end packageAPIInfo.verbatimVersion = response.verbatimVersion packageAPIInfo.version = response.version if prj.language == "C#" and not response.packageEntries then p.error("NuGet package '%s' version '%s' has no file listing. This package might be too old to be using this API or it might be a C++ package instead of a .NET Framework package.", id, response.version) end if prj.language == "C#" then packageAPIInfo.packageEntries = {} for _, item in ipairs(response.packageEntries) do if not item.fullName then p.error("Failed to understand NuGet API response (package '%s' version '%s' packageEntry has no fullName)", id, version) end table.insert(packageAPIInfo.packageEntries, path.translate(item.fullName)) end if #packageAPIInfo.packageEntries == 0 then p.error("NuGet package '%s' file listing is empty", id) end if response.frameworkAssemblyGroup then p.warn("NuGet package '%s' may depend on .NET Framework assemblies - package dependencies are currently unimplemented", id) end end if response.dependencyGroups then p.warn("NuGet package '%s' may depend on other packages - package dependencies are currently unimplemented", id) end break end end packageAPIInfos[package] = packageAPIInfo end return packageAPIInfos[package] end function nuget2010.generatePackagesConfig(prj) if #prj.nuget > 0 then p.w('') p.push('') for _, package in ipairs(prj.nuget) do p.x('', nuget2010.packageId(package), nuget2010.packageVersion(package), nuget2010.packageFramework(prj)) end p.pop('') end end function nuget2010.generateNuGetConfig(prj) if #prj.nuget == 0 then return end if prj.nugetsource == "https://api.nuget.org/v3/index.json" then return end p.w('') p.push('') p.push('') p.x('') p.x('', prj.nugetsource, prj.nugetsource) p.pop('') p.pop('') end function nuget2010.uniqueProjectLocationsWithNuGet(wks) local locations = {} for prj in p.workspace.eachproject(wks) do if not nuget2010.supportsPackageReferences(prj) then local function fail() p.error("projects '%s' and '%s' cannot have the same location when using NuGet with different packages (packages.config conflict)", locations[prj.location].name, prj.name) end if locations[prj.location] and #locations[prj.location].nuget > 0 and #prj.nuget > 0 then if #locations[prj.location].nuget ~= #prj.nuget then fail() end for i, package in ipairs(locations[prj.location].nuget) do if prj.nuget[i] ~= package then fail() end end end locations[prj.location] = prj end end end p.override(p.validation.elements, "workspace", function (oldfn, wks) local t = oldfn(wks) table.insert(t, nuget2010.uniqueProjectLocationsWithNuGet) return t end) function nuget2010.NuGetHasHTTP(prj) if not http and #prj.nuget > 0 and not nuget2010.supportsPackageReferences(prj) then p.error("Premake was compiled with --no-curl, but Curl is required for NuGet support (project '%s' is referencing NuGet packages)", prj.name) end end function nuget2010.NuGetPackageStrings(prj) for _, package in ipairs(prj.nuget) do local components = package:explode(":") if #components ~= 2 or #components[1] == 0 or #components[2] == 0 then p.error("NuGet package '%s' in project '%s' is invalid - please give packages in the format 'id:version', e.g. 'NUnit:3.6.1'", package, prj.name) end end end p.override(p.validation.elements, "project", function (oldfn, prj) local t = oldfn(prj) table.insert(t, nuget2010.NuGetHasHTTP) table.insert(t, nuget2010.NuGetPackageStrings) return t end) local p = premake p.vstudio.vs2010 = {} local vs2010 = p.vstudio.vs2010 local vstudio = p.vstudio local project = p.project local tree = p.tree vs2010.pathVars = { ["cfg.objdir"] = { absolute = true, token = "$(IntDir)" }, ["prj.location"] = { absolute = true, token = "$(ProjectDir)" }, ["prj.name"] = { absolute = false, token = "$(ProjectName)" }, ["sln.location"] = { absolute = true, token = "$(SolutionDir)" }, ["sln.name"] = { absolute = false, token = "$(SolutionName)" }, ["wks.location"] = { absolute = true, token = "$(SolutionDir)" }, ["wks.name"] = { absolute = false, token = "$(SolutionName)" }, ["cfg.buildtarget.directory"] = { absolute = false, token = "$(TargetDir)" }, ["cfg.buildtarget.name"] = { absolute = false, token = "$(TargetFileName)" }, ["cfg.buildtarget.basename"] = { absolute = false, token = "$(TargetName)" }, ["file.basename"] = { absolute = false, token = "%(Filename)" }, ["file.abspath"] = { absolute = true, token = "%(FullPath)" }, ["file.relpath"] = { absolute = false, token = "%(Identity)" }, ["file.path"] = { absolute = false, token = "%(Identity)" }, ["file.directory"] = { absolute = true, token = "%(RootDir)%(Directory)" }, ["file.reldirectory"] = { absolute = false, token = "%(RelativeDir)" }, ["file.extension"] = { absolute = false, token = "%(Extension)" }, ["file.name"] = { absolute = false, token = "%(Filename)%(Extension)" }, } function vs2010.generateProject(prj) p.eol("\r\n") p.indent(" ") p.escaper(vs2010.esc) if p.project.iscsharp(prj) then p.generate(prj, ".csproj", vstudio.cs2005.generate) local user = p.capture(function() vstudio.cs2005.generateUser(prj) end) if #user > 0 then p.generate(prj, ".csproj.user", function() p.outln(user) end) end elseif p.project.isfsharp(prj) then p.generate(prj, ".fsproj", vstudio.fs2005.generate) local user = p.capture(function() vstudio.fs2005.generateUser(prj) end) if #user > 0 then p.generate(prj, ".fsproj.user", function() p.outln(user) end) end elseif p.project.isc(prj) or p.project.iscpp(prj) then if prj.kind == p.SHAREDITEMS then local projFileModified = p.generate(prj, ".vcxitems", vstudio.vc2013.generate) if tree.hasbranches(project.getsourcetree(prj)) then if p.generate(prj, ".vcxitems.filters", vstudio.vc2010.generateFilters) == true and projFileModified == false then p.touch(prj, ".vcxitems") end end else local projFileModified = p.generate(prj, ".vcxproj", vstudio.vc2010.generate) local user = p.capture(function() vstudio.vc2010.generateUser(prj) end) if #user > 0 then p.generate(prj, ".vcxproj.user", function() p.outln(user) end) end if tree.hasbranches(project.getsourcetree(prj)) then if p.generate(prj, ".vcxproj.filters", vstudio.vc2010.generateFilters) == true and projFileModified == false then p.touch(prj, ".vcxproj") end end end end if not vstudio.nuget2010.supportsPackageReferences(prj) then local packages = p.capture(function() vstudio.nuget2010.generatePackagesConfig(prj) end) if #packages > 0 then p.generate(prj, "packages.config", function() p.outln(packages) end) end local config = p.capture(function() vstudio.nuget2010.generateNuGetConfig(prj) end) if #config > 0 then p.generate(prj, "NuGet.Config", function() p.outln(config) end) end end end function vs2010.generateRule(rule) p.eol("\r\n") p.indent(" ") p.escaper(vs2010.esc) p.generate(rule, ".props", vs2010.rules.props.generate) p.generate(rule, ".targets", vs2010.rules.targets.generate) p.generate(rule, ".xml", vs2010.rules.xml.generate) end function vs2010.esc(value) value = value:gsub('&', "&") value = value:gsub('<', "<") value = value:gsub('>', ">") return value end newaction { trigger = "vs2010", shortname = "Visual Studio 2010", description = "Generate Visual Studio 2010 project files", targetos = "windows", toolset = "msc-v100", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None", "Utility" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = function(wks) vstudio.vs2005.generateSolution(wks) end, onProject = function(prj) vstudio.vs2010.generateProject(prj) end, onRule = function(rule) vstudio.vs2010.generateRule(rule) end, onCleanWorkspace = function(wks) vstudio.cleanSolution(wks) end, onCleanProject = function(prj) vstudio.cleanProject(prj) end, onCleanTarget = function(prj) vstudio.cleanTarget(prj) end, pathVars = vs2010.pathVars, vstudio = { csprojSchemaVersion = "2.0", productVersion = "8.0.30703", solutionVersion = "11", versionName = "2010", targetFramework = "4.0", toolsVersion = "4.0", } } local p = premake local m = p.vstudio.fs2005 local dn = p.vstudio.dotnetbase m.elements.userProjectPropertyGroup = function() return { m.referencePath, } end m.elements.userConfigPropertyGroup = function() return { m.localDebuggerCommandArguments, } end function m.generateUser(prj) local prjGroup = p.capture(function() p.push(2) p.callArray(m.elements.userProjectPropertyGroup, prj) p.pop(2) end) local contents = {} local size = 0 for cfg in p.project.eachconfig(prj) do contents[cfg] = p.capture(function() p.push(2) p.callArray(m.elements.userConfigPropertyGroup, cfg) p.pop(2) end) size = size + #contents[cfg] end if #prjGroup > 0 or size > 0 then p.vstudio.projectElement() if #prjGroup > 0 then p.push('') p.outln(prjGroup) p.pop('') end for cfg in p.project.eachconfig(prj) do if #contents[cfg] > 0 then p.push('', dn.condition(cfg)) p.outln(contents[cfg]) p.pop('') end end p.pop('') end end function m.referencePath(prj) local cfg = p.project.getfirstconfig(prj) local paths = p.vstudio.path(prj, cfg.libdirs) if #paths > 0 then p.w('%s', table.concat(paths, ";")) end end function m.localDebuggerCommandArguments(cfg) if #cfg.debugargs > 0 then p.x('%s', table.concat(cfg.debugargs, " ")) end end local p = premake p.vstudio.fs2005 = {} local vstudio = p.vstudio local fs2005 = p.vstudio.fs2005 local dotnetbase = p.vstudio.dotnetbase local project = p.project local config = p.config local fileconfig = p.fileconfig local dotnet = p.tools.dotnet fs2005.elements = {} fs2005.elements.project = function () return { dotnetbase.xmlDeclaration, dotnetbase.projectElement, dotnetbase.commonProperties, dotnetbase.projectProperties, dotnetbase.configurations, dotnetbase.applicationIcon, dotnetbase.references } end fs2005.elements.projectProperties = function () return { dotnetbase.configurationCondition, dotnetbase.platformCondition, dotnetbase.schemaVersion, dotnetbase.productVersion, dotnetbase.projectGuid, dotnetbase.outputType, dotnetbase.appDesignerFolder, dotnetbase.rootNamespace, dotnetbase.assemblyName, dotnetbase.targetFrameworkVersion, dotnetbase.targetFrameworkProfile, dotnetbase.projectTypeGuids } end fs2005.elements.configuration = function () return { dotnetbase.propertyGroup, dotnetbase.debugProps, dotnetbase.outputProps, dotnetbase.compilerProps, dotnetbase.NoWarn, fs2005.tailCalls } end function fs2005.generate(prj) dotnetbase.prepare(fs2005) dotnetbase.generate(prj) end function fs2005.tailCalls(cfg) local tc if cfg.tailcalls == nil then tc = config.isDebugBuild(cfg) else tc = cfg.tailcalls end _p(2, '%s', iif(tc, "true", "false")) end function fs2005.targets(prj) _p(1, '') _p(2, '') _p(3, '') _p(4, '$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\FSharp\\Microsoft.FSharp.Targets') _p(3, '') _p(2, '') _p(2, '') _p(2, '') _p(3, '$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\FSharp\\Microsoft.FSharp.Targets') _p(2, '') _p(2, '') _p(1, '') _p(1, '') end local p = premake local m = p.vstudio.cs2005 local dn = p.vstudio.dotnetbase m.elements.userProjectPropertyGroup = function() return { m.referencePath, } end m.elements.userConfigPropertyGroup = function() return { m.localDebuggerCommandArguments, } end function m.generateUser(prj) local prjGroup = p.capture(function() p.push(2) p.callArray(m.elements.userProjectPropertyGroup, prj) p.pop(2) end) local contents = {} local size = 0 for cfg in p.project.eachconfig(prj) do contents[cfg] = p.capture(function() p.push(2) p.callArray(m.elements.userConfigPropertyGroup, cfg) p.pop(2) end) size = size + #contents[cfg] end if #prjGroup > 0 or size > 0 then p.vstudio.projectElement() if #prjGroup > 0 then p.push('') p.outln(prjGroup) p.pop('') end for cfg in p.project.eachconfig(prj) do if #contents[cfg] > 0 then p.push('', dn.condition(cfg)) p.outln(contents[cfg]) p.pop('') end end p.pop('') end end function m.referencePath(prj) local cfg = p.project.getfirstconfig(prj) local paths = p.vstudio.path(prj, cfg.libdirs) if #paths > 0 then p.w('%s', table.concat(paths, ";")) end end function m.localDebuggerCommandArguments(cfg) if #cfg.debugargs > 0 then p.x('%s', table.concat(cfg.debugargs, " ")) end end local p = premake p.vstudio.cs2005 = {} local vstudio = p.vstudio local cs2005 = p.vstudio.cs2005 local dotnetbase = p.vstudio.dotnetbase local project = p.project local config = p.config local fileconfig = p.fileconfig local dotnet = p.tools.dotnet cs2005.elements = {} cs2005.elements.project = function (prj) if dotnetbase.isNewFormatProject(prj) then return { dotnetbase.projectElement, dotnetbase.projectProperties, dotnetbase.configurations, dotnetbase.applicationIcon, dotnetbase.references } else return { dotnetbase.xmlDeclaration, dotnetbase.projectElement, dotnetbase.commonProperties, dotnetbase.projectProperties, dotnetbase.configurations, dotnetbase.applicationIcon, dotnetbase.references } end end cs2005.elements.projectProperties = function (cfg) if dotnetbase.isNewFormatProject(cfg) then return { dotnetbase.outputType, dotnetbase.appDesignerFolder, dotnetbase.rootNamespace, dotnetbase.assemblyName, dotnetbase.netcore.targetFramework, dotnetbase.allowUnsafeBlocks, dotnetbase.fileAlignment, dotnetbase.bindingRedirects, dotnetbase.netcore.useWpf, dotnetbase.csversion, dotnetbase.netcore.enableDefaultCompileItems, } else return { dotnetbase.configurationCondition, dotnetbase.platformCondition, dotnetbase.productVersion, dotnetbase.schemaVersion, dotnetbase.projectGuid, dotnetbase.outputType, dotnetbase.appDesignerFolder, dotnetbase.rootNamespace, dotnetbase.assemblyName, dotnetbase.targetFrameworkVersion, dotnetbase.targetFrameworkProfile, dotnetbase.fileAlignment, dotnetbase.bindingRedirects, dotnetbase.projectTypeGuids, dotnetbase.csversion, } end end cs2005.elements.configuration = function () return { dotnetbase.propertyGroup, dotnetbase.debugProps, dotnetbase.outputProps, dotnetbase.compilerProps, dotnetbase.NoWarn } end function cs2005.generate(prj) dotnetbase.prepare(cs2005) dotnetbase.generate(prj) end function cs2005.targets(prj) if not dotnetbase.isNewFormatProject(prj) then local bin = iif(_ACTION <= "vs2010", "MSBuildBinPath", "MSBuildToolsPath") _p(1,'', bin) _p(1,'') end end local p = premake p.vstudio.dotnetbase = {} local vstudio = p.vstudio local dotnetbase = p.vstudio.dotnetbase local project = p.project local config = p.config local fileconfig = p.fileconfig local dotnet = p.tools.dotnet dotnetbase.elements = {} dotnetbase.langObj = {} dotnetbase.netcore = {} function dotnetbase.prepare(langObj) dotnetbase.elements.project = langObj.elements.project dotnetbase.elements.projectProperties = langObj.elements.projectProperties dotnetbase.elements.configuration = langObj.elements.configuration dotnetbase.langObj = langObj end function dotnetbase.generate(prj) p.utf8() p.callArray(dotnetbase.elements.project, prj) _p(1,'') dotnetbase.files(prj) _p(1,'') dotnetbase.projectReferences(prj) dotnetbase.packageReferences(prj) dotnetbase.langObj.targets(prj) dotnetbase.buildEvents(prj) p.out('') end function dotnetbase.projectElement(prj) if dotnetbase.isNewFormatProject(prj) then if prj.flags.WPF then _p('') else _p('') end else local ver = '' local action = p.action.current() if action.vstudio.toolsVersion then ver = string.format(' ToolsVersion="%s"', action.vstudio.toolsVersion) end _p('', ver) end end function dotnetbase.projectProperties(prj) _p(1,'') local cfg = project.getfirstconfig(prj) p.callArray(dotnetbase.elements.projectProperties, cfg) _p(1,'') end function dotnetbase.configurations(prj) for cfg in project.eachconfig(prj) do dotnetbase.configuration(cfg) end end function dotnetbase.configuration(cfg) p.callArray(dotnetbase.elements.configuration, cfg) _p(1,'') end function dotnetbase.dofile(node, cfg, condition) local filecfg = fileconfig.getconfig(node, cfg) if filecfg then local fname = path.translate(node.relpath) local link, count = node.relpath:gsub("%.%.%/", "") local external = (count > 0) if external and node.vpath ~= node.relpath then link = node.vpath end local info = dotnet.fileinfo(filecfg) local contents = p.capture(function () local elements = { "AutoGen", "CopyToOutputDirectory", "DesignTime", "DependentUpon", "DesignTimeSharedInput", "Generator", "LastGenOutput", "SubType", } for _, el in ipairs(elements) do local value = info[el] if value then _p(3,"<%s>%s", el, value, el) end end if info.action == "EmbeddedResource" and cfg.customtoolnamespace then _p(3,"%s", cfg.customtoolnamespace) end end) if #contents > 0 or external then _p(2,'<%s%s Include="%s">', info.action, condition, fname) if external and info.action ~= "EmbeddedResource" then _p(3,'%s', path.translate(link)) end if #contents > 0 then _p("%s", contents) end _p(2,'', info.action) else _p(2,'<%s%s Include="%s" />', info.action, condition, fname) end end end function dotnetbase.files(prj) local firstcfg = project.getfirstconfig(prj) local processfcfg = function(node) local allsame = true local first = nil for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) local info = dotnet.fileinfo(filecfg) if first == nil then first = info elseif not table.equals(first, info) then allsame = false end end if allsame then dotnetbase.dofile(node, firstcfg, '') else for cfg in project.eachconfig(prj) do dotnetbase.dofile(node, cfg, ' ' .. dotnetbase.condition(cfg)) end end end if project.isfsharp(prj) then sorter = function(a,b) verbosef('Sorting F# proj file (%s, %s), index %s < %s', a.name, b.name, a.order, b.order) return a.order < b.order end table.sort(prj._.files, sorter) table.foreachi(prj._.files, processfcfg) else local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = processfcfg }, false) end end function dotnetbase.buildEvents(prj) local function output(name, steps) if #steps > 0 then steps = os.translateCommandsAndPaths(steps, prj.basedir, prj.location) steps = table.implode(steps, "", "", "\r\n") _x(2,'<%sBuildEvent>%s', name, steps, name) end end local cfg = project.getfirstconfig(prj) if #cfg.prebuildcommands > 0 or #cfg.postbuildcommands > 0 then _p(1,'') output("Pre", cfg.prebuildcommands) output("Post", cfg.postbuildcommands) _p(1,'') end end function dotnetbase.compilerProps(cfg) _x(2,'%s', table.concat(cfg.defines, ";")) _p(2,'prompt') _p(2,'4') if not dotnetbase.isNewFormatProject(cfg) then dotnetbase.allowUnsafeBlocks(cfg) end if cfg.flags.FatalCompileWarnings then _p(2,'true') end dotnetbase.debugCommandParameters(cfg) end function dotnetbase.debugCommandParameters(cfg) if #cfg.debugargs > 0 then _x(2,'%s', table.concat(cfg.debugargs, " ")) end end function dotnetbase.debugProps(cfg) if _ACTION >= "vs2019" then if cfg.symbols == "Full" then _p(2,'full') _p(2,'true') elseif cfg.symbols == p.OFF then _p(2,'none') _p(2,'false') elseif cfg.symbols == p.ON or cfg.symbols == "FastLink" then _p(2,'pdbonly') _p(2,'true') else _p(2,'portable') _p(2,'true') end else if cfg.symbols == p.ON then _p(2,'true') _p(2,'full') else _p(2,'pdbonly') end end _p(2,'%s', iif(config.isOptimizedBuild(cfg), "true", "false")) end function dotnetbase.outputProps(cfg) local outdir = vstudio.path(cfg, cfg.buildtarget.directory) _x(2,'%s\\', outdir) local objdir = vstudio.path(cfg, cfg.objdir) if _ACTION > "vs2008" and not dotnetbase.isNewFormatProject(cfg) then _x(2,'%s\\', objdir) _p(2,'$(BaseIntermediateOutputPath)') else _x(2,'%s\\', objdir) end end dotnetbase.elements.references = function(cfg) return { dotnetbase.assemblyReferences, dotnetbase.nuGetReferences, } end function dotnetbase.references(prj) for cfg in project.eachconfig(prj) do _p(1,'', dotnetbase.condition(cfg)) p.callArray(dotnetbase.elements.references, cfg) _p(1,'') end end function dotnetbase.assemblyReferences(cfg) local prj = cfg.project config.getlinks(cfg, "system", function(original, decorated) local name = path.getname(decorated) if path.getextension(name) == ".dll" then name = name.sub(name, 1, -5) end if decorated:find("/", nil, true) then _x(2,'', name) local decPath, decVars = decorated:match("(.-),") if not decPath then decPath = decorated end _x(3,'%s', path.appendextension(path.translate(decPath), ".dll")) if not config.isCopyLocal(prj, original, true) then _p(3,"False") end _p(2,'') else _x(2,'', name) end end) end function dotnetbase.makeVersionComparable(version) local numbers = "" for number in version:gmatch("%d") do numbers = numbers .. number end return string.format("%-10d", numbers):gsub(" ", "0") end function dotnetbase.frameworkVersionForFolder(folder) if folder:match("^net%d+$") or folder:match("^[0-9%.]+$") then return dotnetbase.makeVersionComparable(folder) elseif folder == "net" then return dotnetbase.makeVersionComparable("0") end end function dotnetbase.nuGetReferences(cfg) local prj = cfg.project if _ACTION >= "vs2010" and not vstudio.nuget2010.supportsPackageReferences(prj) then for _, package in ipairs(prj.nuget) do local id = vstudio.nuget2010.packageId(package) local packageAPIInfo = vstudio.nuget2010.packageAPIInfo(prj, package) local action = p.action.current() local targetFramework = cfg.dotnetframework or action.vstudio.targetFramework local targetVersion = dotnetbase.makeVersionComparable(targetFramework) local files = {} local bestVersion, bestFolder for _, file in ipairs(packageAPIInfo.packageEntries) do local folder = file:match("^lib[\\/](.+)[\\/]") if folder and path.hasextension(file, ".dll") then local version = dotnetbase.frameworkVersionForFolder(folder) if version then files[folder] = files[folder] or {} table.insert(files[folder], file) if version <= targetVersion and (not bestVersion or version > bestVersion) then bestVersion = version bestFolder = folder end end end end if not bestVersion then p.error("NuGet package '%s' is not compatible with project '%s' .NET Framework version '%s'", id, prj.name, targetFramework) end for _, file in ipairs(files[bestFolder]) do _x(2, '', path.getbasename(file)) _x(3, '%s', vstudio.path(prj, p.filename(prj.workspace, string.format("packages\\%s.%s\\%s", id, packageAPIInfo.verbatimVersion or packageAPIInfo.version, file)))) if config.isCopyLocal(prj, package, true) then _p(3, 'True') else _p(3, 'False') end _p(2, '') end end end end function dotnetbase.projectReferences(prj) if not dotnetbase.isNewFormatProject(prj) then _p(1,'') end local deps = project.getdependencies(prj, 'linkOnly') if #deps > 0 then if dotnetbase.isNewFormatProject(prj) then _p(1,'') end for _, dep in ipairs(deps) do local relpath = vstudio.path(prj, vstudio.projectfile(dep)) _x(2,'', relpath) _p(3,'{%s}', dep.uuid) _x(3,'%s', dep.name) if not config.isCopyLocal(prj, dep.name, true) then _p(3,"False") end _p(2,'') end if dotnetbase.isNewFormatProject(prj) then _p(1,'') end end if not dotnetbase.isNewFormatProject(prj) then _p(1,'') end end function dotnetbase.packageReferences(prj) if vstudio.nuget2010.supportsPackageReferences(prj) then local hasNuget = prj.nuget and #prj.nuget>0 for cfg in project.eachconfig(prj) do if cfg.nuget and #cfg.nuget>0 then hasNuget = true end end if hasNuget then _p(1,'') if prj.nuget and #prj.nuget>0 then for _, package in ipairs(prj.nuget) do _p(2,'', vstudio.nuget2010.packageId(package), vstudio.nuget2010.packageVersion(package)) end end for cfg in project.eachconfig(prj) do if cfg.nuget and #cfg.nuget>0 then for _, package in ipairs(cfg.nuget) do if prj.nuget[package]==nil then _p(2,'', vstudio.nuget2010.packageId(package), vstudio.nuget2010.packageVersion(package), dotnetbase.condition(cfg)) end end end end _p(1,'') end end end function dotnetbase.arch(cfg) local arch = vstudio.archFromConfig(cfg) if arch == "Any CPU" then arch = "AnyCPU" end return arch end function dotnetbase.propertyGroup(cfg) p.push('', dotnetbase.condition(cfg)) local arch = dotnetbase.arch(cfg) if arch ~= "AnyCPU" or _ACTION > "vs2008" then p.x('%s', arch) end end function dotnetbase.applicationIcon(prj) if prj.icon then local icon = vstudio.path(prj, prj.icon) _p(1,'') _x(2,'%s', icon) _p(1,'') end end function dotnetbase.condition(cfg) local platform = vstudio.projectPlatform(cfg) local arch = dotnetbase.arch(cfg) return string.format('Condition=" \'$(Configuration)|$(Platform)\' == \'%s|%s\' "', platform, arch) end function dotnetbase.formatNuGetFrameworkVersion(framework) return "net" .. framework:gsub("%.", "") end function dotnetbase.appDesignerFolder(cfg) _p(2,'Properties') end function dotnetbase.assemblyName(cfg) if not dotnetbase.isNewFormatProject(cfg) then _p(2,'%s', cfg.buildtarget.basename) end end function dotnetbase.commonProperties(prj) if _ACTION > "vs2010" then _p(1,'') end end function dotnetbase.configurationCondition(cfg) _x(2,'%s', cfg.buildcfg) end function dotnetbase.fileAlignment(cfg) if _ACTION >= "vs2010" and not dotnetbase.isNewFormatProject(cfg) then _p(2,'512') end end function dotnetbase.bindingRedirects(cfg) if _ACTION >= "vs2015" and not dotnetbase.isNewFormatProject(cfg) then _p(2, 'true') end end function dotnetbase.outputType(cfg) _p(2,'%s', dotnet.getkind(cfg)) end function dotnetbase.platformCondition(cfg) _p(2,'%s', dotnetbase.arch(cfg.project)) end function dotnetbase.productVersion(cfg) local action = p.action.current() if action.vstudio.productVersion then _p(2,'%s', action.vstudio.productVersion) end end function dotnetbase.projectGuid(cfg) _p(2,'{%s}', cfg.uuid) end function dotnetbase.projectTypeGuids(cfg) if cfg.flags.WPF then _p(2,'{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}') end end function dotnetbase.rootNamespace(cfg) if not dotnetbase.isNewFormatProject(cfg) or cfg.namespace then _p(2,'%s', cfg.namespace or cfg.buildtarget.basename) end end function dotnetbase.schemaVersion(cfg) local action = p.action.current() if action.vstudio.csprojSchemaVersion then _p(2,'%s', action.vstudio.csprojSchemaVersion) end end function dotnetbase.NoWarn(cfg) if #cfg.disablewarnings > 0 then local warnings = table.concat(cfg.disablewarnings, ";") _p(2,'%s', warnings) end end function dotnetbase.targetFrameworkVersion(cfg) local action = p.action.current() local framework = cfg.dotnetframework or action.vstudio.targetFramework if framework and not dotnetbase.isNewFormatProject(cfg) then _p(2,'v%s', framework) end end function dotnetbase.csversion(cfg) if cfg.csversion then _p(2,'%s', cfg.csversion) end end function dotnetbase.targetFrameworkProfile(cfg) if _ACTION == "vs2010" then _p(2,'') _p(2,'') end end function dotnetbase.xmlDeclaration() if _ACTION > "vs2008" then p.xmlUtf8() end end function dotnetbase.isNewFormatProject(cfg) local framework = cfg.dotnetframework if not framework then return false end if framework:find('^net') ~= nil then return true end return false end function dotnetbase.netcore.targetFramework(cfg) local action = p.action.current() local framework = cfg.dotnetframework or action.vstudio.targetFramework if framework and dotnetbase.isNewFormatProject(cfg) then _p(2,'%s', framework) end end function dotnetbase.netcore.enableDefaultCompileItems(cfg) _p(2,'%s', iif(cfg.enableDefaultCompileItems, "true", "false")) end function dotnetbase.netcore.useWpf(cfg) if cfg.flags.WPF then _p(2,'true') end end function dotnetbase.allowUnsafeBlocks(cfg) if cfg.clr == "Unsafe" then _p(2,'true') end endlocal p = premake p.vstudio.sln2005 = {} local vstudio = p.vstudio local sln2005 = p.vstudio.sln2005 local project = p.project local tree = p.tree sln2005.elements = {} function sln2005.solutionSections(wks) return { "ConfigurationPlatforms", "SolutionProperties", "NestedProjects", "ExtensibilityGlobals" } end function sln2005.generate(wks) p.utf8() p.outln('') sln2005.reorderProjects(wks) sln2005.header() sln2005.projects(wks) p.push('Global') sln2005.sections(wks) p.pop('EndGlobal') p.w() end function sln2005.header() local action = p.action.current() p.w('Microsoft Visual Studio Solution File, Format Version %d.00', action.vstudio.solutionVersion) p.w('# Visual Studio %s', action.vstudio.versionName) end function sln2005.reorderProjects(wks) if wks.startproject then local np local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) if n.project.name == wks.startproject then np = n end end }) while np and np.parent do local p = np.parent local i = table.indexof(p.children, np) table.remove(p.children, i) table.insert(p.children, 1, np) np = p end end end function sln2005.buildRelativePath(prj) local prjpath = vstudio.projectfile(prj) prjpath = vstudio.path(prj.workspace, prjpath) return prjpath:gsub("$%((.-)%)", "%%%1%%") end function sln2005.projects(wks) local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) local prj = n.project p.x('Project("{%s}") = "%s", "%s", "{%s}"', vstudio.tool(prj), prj.name, sln2005.buildRelativePath(prj), prj.uuid) p.push() sln2005.projectdependencies(prj) p.pop('EndProject') end, onbranch = function(n) p.push('Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "%s", "%s", "{%s}"', n.name, n.name, n.uuid) p.pop('EndProject') end, }) end function sln2005.projectdependencies(prj) local deps = project.getdependencies(prj, 'dependOnly') if #deps > 0 then p.push('ProjectSection(ProjectDependencies) = postProject') for _, dep in ipairs(deps) do p.w('{%s} = {%s}', dep.uuid, dep.uuid) end p.pop('EndProjectSection') end end function sln2005.sharedProjects(wks) local contents = p.capture(function () local tr = p.workspace.grouptree(wks) p.tree.traverse(tr, { onleaf = function(n) local prj = n.project if prj.kind == p.SHAREDITEMS then p.w('%s*{%s}*SharedItemsImports = %s', sln2005.buildRelativePath(prj), prj.uuid:lower(), "9") else local deps = p.project.getdependencies(prj, 'linkOnly') for _, dep in ipairs(deps) do if dep.kind == p.SHAREDITEMS then p.w('%s*{%s}*SharedItemsImports = %s', sln2005.buildRelativePath(dep), prj.uuid:lower(), "4") end end end end, }) end) if #contents > 0 then p.push('GlobalSection(SharedMSBuildProjectFiles) = preSolution') p.outln(contents) p.pop('EndGlobalSection') end end sln2005.elements.projectConfigurationPlatforms = function(cfg, context) return { sln2005.activeCfg, sln2005.build0, } end function sln2005.projectConfigurationPlatforms(wks, sorted, descriptors) p.w("GlobalSection(ProjectConfigurationPlatforms) = postSolution") local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) local prj = n.project if prj.kind == p.SHAREDITEMS then return end table.foreachi(sorted, function(cfg) local context = {} context.prj = prj context.prjCfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) context.excluded = (context.prjCfg == nil or context.prjCfg.flags.ExcludeFromBuild) if context.prjCfg == nil then context.prjCfg = project.findClosestMatch(prj, cfg.buildcfg, cfg.platform) end context.descriptor = descriptors[cfg] context.platform = vstudio.projectPlatform(context.prjCfg) context.architecture = vstudio.archFromConfig(context.prjCfg, true) p.push() p.callArray(sln2005.elements.projectConfigurationPlatforms, cfg, context) p.pop() end) end }) p.w("EndGlobalSection") end function sln2005.activeCfg(cfg, context) p.w('{%s}.%s.ActiveCfg = %s|%s', context.prj.uuid, context.descriptor, context.platform, context.architecture) end function sln2005.build0(cfg, context) if not context.excluded and context.prjCfg.kind ~= p.NONE then p.w('{%s}.%s.Build.0 = %s|%s', context.prj.uuid, context.descriptor, context.platform, context.architecture) end end function sln2005.configurationPlatforms(wks) local descriptors = {} local sorted = {} for cfg in p.workspace.eachconfig(wks) do local platform = vstudio.solutionPlatform(cfg) descriptors[cfg] = string.format("%s|%s", cfg.buildcfg, platform) table.insert(sorted, cfg) end table.sort(sorted, function(cfg0, cfg1) return descriptors[cfg0]:lower() < descriptors[cfg1]:lower() end) if wks.defaultplatform then p.push('GlobalSection(SolutionConfigurationPlatforms) = preSolution') table.foreachi(sorted, function (cfg) if cfg.platform == wks.defaultplatform then p.w('%s = %s', descriptors[cfg], descriptors[cfg]) end end) p.pop("EndGlobalSection") end p.push('GlobalSection(SolutionConfigurationPlatforms) = preSolution') table.foreachi(sorted, function (cfg) if not wks.defaultplatform or cfg.platform ~= wks.defaultplatform then p.w('%s = %s', descriptors[cfg], descriptors[cfg]) end end) p.pop("EndGlobalSection") sln2005.projectConfigurationPlatforms(wks, sorted, descriptors) end function sln2005.properties(wks) p.push('GlobalSection(SolutionProperties) = preSolution') p.w('HideSolutionNode = FALSE') p.pop('EndGlobalSection') end function sln2005.nestedProjects(wks) local tr = p.workspace.grouptree(wks) if tree.hasbranches(tr) then p.push('GlobalSection(NestedProjects) = preSolution') tree.traverse(tr, { onnode = function(n) if n.parent.uuid then p.w('{%s} = {%s}', (n.project or n).uuid, n.parent.uuid) end end }) p.pop('EndGlobalSection') end end function sln2005.premakeExtensibilityGlobals(wks) if wks.editorintegration then local args = {} for _, arg in ipairs(_ARGV) do if not (arg:startswith("--file") or arg:startswith("/file")) then table.insert(args, arg); end end p.w('PremakeBinary = %s', _PREMAKE_COMMAND) p.w('PremakeScript = %s', p.workspace.getrelative(wks, _MAIN_SCRIPT)) p.w('PremakeArguments = %s', table.concat(args, ' ')) end end sln2005.elements.extensibilityGlobals = function(wks) return { sln2005.premakeExtensibilityGlobals, } end function sln2005.extensibilityGlobals(wks) local contents = p.capture(function () p.push() p.callArray(sln2005.elements.extensibilityGlobals, wks) p.pop() end) if #contents > 0 then p.push('GlobalSection(ExtensibilityGlobals) = postSolution') p.outln(contents) p.pop('EndGlobalSection') end end sln2005.elements.sections = function(wks) return { sln2005.sharedProjects, sln2005.configurationPlatforms, sln2005.properties, sln2005.nestedProjects, sln2005.extensibilityGlobals, } end function sln2005.sections(wks) p.callArray(sln2005.elements.sections, wks) end local p = premake local m = p.vstudio.vc200x m.elements.user = function(cfg) return { m.debugSettings, } end function m.generateUser(prj) p.indent("\t") local contents = {} local size = 0 for cfg in p.project.eachconfig(prj) do contents[cfg] = p.capture(function() p.push(4) p.callArray(m.elements.user, cfg) p.pop(4) end) size = size + #contents[cfg] end if size > 0 then m.xmlElement() m.visualStudioUserFile() p.push('') for cfg in p.project.eachconfig(prj) do m.userConfiguration(cfg) p.push(' 0 then p.outln(contents[cfg]) end p.pop('/>') p.pop('') end p.pop('') p.pop('') end end function m.visualStudioUserFile() p.push('') end function m.userConfiguration(cfg) p.push('') end m.elements.debugSettings = function(cfg) return { m.debugCommand, m.debugDir, m.debugArgs, m.debugEnvironment, } end function m.debugSettings(cfg) p.callArray(m.elements.debugSettings, cfg) end function m.debugArgs(cfg) if #cfg.debugargs > 0 then p.x('CommandArguments="%s"', table.concat(cfg.debugargs, " ")) end end function m.debugCommand(cfg) if cfg.debugcommand then p.x('Command="%s"', p.vstudio.path(cfg, cfg.debugcommand)) end end function m.debugDir(cfg) if cfg.debugdir then p.x('WorkingDirectory="%s"', p.vstudio.path(cfg, cfg.debugdir)) end end function m.debugEnvironment(cfg) if #cfg.debugenvs > 0 then p.x('Environment="%s"', table.concat(cfg.debugenvs, "\n")) if cfg.flags.DebugEnvsDontMerge then p.x('EnvironmentMerge="false"') end end end local p = premake p.vstudio.vc200x = {} local m = p.vstudio.vc200x local vstudio = p.vstudio local context = p.context local project = p.project local config = p.config local fileconfig = p.fileconfig m.elements = {} m.elements.project = function(prj) return { m.xmlElement, m.visualStudioProject, m.platforms, m.toolFiles, m.configurations, m.references, m.files, m.globals } end function m.generate(prj) p.indent("\t") p.callArray(m.elements.project, prj) p.pop('') p.w() end m.elements.visualStudioProject = function(prj) return { m.projectType, m.version, m.projectName, m.projectGUID, m.rootNamespace, m.keyword, m.targetFrameworkVersion } end function m.visualStudioProject(prj) p.push('') end function m.configurations(prj) p.push('') local mapping = {} for cfg in project.eachconfig(prj) do local name = vstudio.projectConfig(cfg) mapping[cfg] = name mapping[name] = cfg end for cfg in project.eachconfig(prj) do for i, arch in ipairs(architectures) do local target local testName = vstudio.projectConfig(cfg, arch) if testName == mapping[cfg] then target = cfg elseif not mapping[testName] then target = { fake = true } end if target then m.configuration(target, testName) m.tools(target) p.pop('') end end end p.pop('') end m.elements.configuration = function(cfg) if cfg.fake then return { m.intermediateDirectory, m.configurationType } else return { m.outputDirectory, m.intermediateDirectory, m.configurationType, m.useOfMFC, m.characterSet, m.managedExtensions, } end end function m.configuration(cfg, name) p.push('') end m.elements.tools = function(cfg) if vstudio.isMakefile(cfg) and not cfg.fake then return { m.VCNMakeTool } end return { m.VCPreBuildEventTool, m.VCCustomBuildTool, m.VCXMLDataGeneratorTool, m.VCWebServiceProxyGeneratorTool, m.VCMIDLTool, m.VCCLCompilerTool, m.VCManagedResourceCompilerTool, m.VCResourceCompilerTool, m.VCPreLinkEventTool, m.VCLinkerTool, m.VCALinkTool, m.VCManifestTool, m.VCXDCMakeTool, m.VCBscMakeTool, m.VCFxCopTool, m.VCAppVerifierTool, m.VCPostBuildEventTool, } end function m.tools(cfg) p.callArray(m.elements.tools, cfg, config.toolset(cfg)) end m.elements.references = function(prj) return { m.assemblyReferences, m.projectReferences, } end function m.references(prj) p.push('') p.callArray(m.elements.references, prj) p.pop('') end function m.files(prj) local tr = m.filesSorted(prj) p.push('') p.tree.traverse(tr, { onbranchenter = m.filesFilterStart, onbranchexit = m.filesFilterEnd, onleaf = m.filesFile, }, false) p.pop('') end function m.filesSorted(prj) return project.getsourcetree(prj, function(a,b) local istop = (a.parent.parent == nil) local aSortName = a.name local bSortName = b.name if a.relpath then if not b.relpath then return not istop end aSortName = a.relpath:gsub("%.%.%/", "") end if b.relpath then if not a.relpath then return istop end bSortName = b.relpath:gsub("%.%.%/", "") end return aSortName < bSortName end) end function m.filesFilterStart(node) p.push('') end function m.filesFilterEnd(node) p.pop('') end function m.filesFile(node) p.push('') local prj = node.project for cfg in project.eachconfig(prj) do m.fileConfiguration(cfg, node) end p.pop('') end m.elements.fileConfigurationAttributes = function(filecfg) return { m.excludedFromBuild, } end function m.fileConfiguration(cfg, node) local filecfg = fileconfig.getconfig(node, cfg) local configAttribs = p.capture(function () p.push() p.callArray(m.elements.fileConfigurationAttributes, filecfg) p.pop() end) local compilerAttribs = p.capture(function () p.push() m.VCCLCompilerTool(filecfg) p.pop() end) if #configAttribs > 0 or compilerAttribs:lines() > 3 then p.push(' 0 then p.outln(configAttribs) end p.w('>') p.outln(compilerAttribs) p.pop('') end end m.elements.globals = function(prj) return {} end function m.globals(prj) p.push('') p.callArray(m.elements.globals, prj) p.pop('') end function m.VCTool(name, cfg, ...) p.push('') end m.elements.DebuggerTool = function(cfg) return {} end function m.DebuggerTool(cfg) p.push('') end m.elements.VCALinkTool = function(cfg) return {} end function m.VCALinkTool(cfg) m.VCTool("VCALinkTool", cfg) end m.elements.VCAppVerifierTool = function(cfg) return {} end function m.VCAppVerifierTool(cfg) if cfg.kind ~= p.STATICLIB then m.VCTool("VCAppVerifierTool", cfg) end end m.elements.VCBscMakeTool = function(cfg) return {} end function m.VCBscMakeTool(cfg) m.VCTool("VCBscMakeTool", cfg) end m.elements.VCCLCompilerTool = function(cfg, toolset) if not toolset then return { m.customBuildTool, m.objectFile, m.additionalCompilerOptions, m.optimization, m.additionalIncludeDirectories, m.wholeProgramOptimization, m.preprocessorDefinitions, m.undefinePreprocessorDefinitions, m.minimalRebuild, m.basicRuntimeChecks, m.bufferSecurityCheck, m.stringPooling, m.exceptionHandling, m.runtimeLibrary, m.enableFunctionLevelLinking, m.enableEnhancedInstructionSet, m.floatingPointModel, m.runtimeTypeInfo, m.treatWChar_tAsBuiltInType, m.usePrecompiledHeader, m.programDataBaseFileName, m.warningLevel, m.warnAsError, m.detect64BitPortabilityProblems, m.debugInformationFormat, m.compileAs, m.disableSpecificWarnings, m.forcedIncludeFiles, m.omitDefaultLib, } else return { m.additionalExternalCompilerOptions, m.additionalIncludeDirectories, m.preprocessorDefinitions, m.undefinePreprocessorDefinitions, m.usePrecompiledHeader, m.programDataBaseFileName, m.debugInformationFormat, m.compileAs, m.forcedIncludeFiles, } end end function m.VCCLCompilerToolName(cfg) local prjcfg, filecfg = config.normalize(cfg) if filecfg and fileconfig.hasCustomBuildRule(filecfg) then return "VCCustomBuildTool" else return "VCCLCompilerTool" end end function m.VCCLCompilerTool(cfg, toolset) m.VCTool("VCCLCompilerTool", cfg, toolset) end m.elements.VCCustomBuildTool = function(cfg) return {} end function m.VCCustomBuildTool(cfg) m.VCTool("VCCustomBuildTool", cfg) end m.elements.VCFxCopTool = function(cfg) return {} end function m.VCFxCopTool(cfg) m.VCTool("VCFxCopTool", cfg) end m.elements.VCLinkerTool = function(cfg, toolset) if cfg.kind ~= p.STATICLIB then return { m.linkLibraryDependencies, m.ignoreImportLibrary, m.additionalLinkerOptions, m.additionalDependencies, m.outputFile, m.linkIncremental, m.additionalLibraryDirectories, m.moduleDefinitionFile, m.generateManifest, m.generateDebugInformation, m.programDatabaseFile, m.subSystem, m.largeAddressAware, m.optimizeReferences, m.enableCOMDATFolding, m.entryPointSymbol, m.importLibrary, m.targetMachine, } else return { m.additionalLinkerOptions, m.additionalDependencies, m.outputFile, m.additionalLibraryDirectories, } end end function m.VCLinkerToolName(cfg) if cfg.kind == p.STATICLIB then return "VCLibrarianTool" else return "VCLinkerTool" end end function m.VCLinkerTool(cfg, toolset) m.VCTool("VCLinkerTool", cfg, toolset) end m.elements.VCManagedResourceCompilerTool = function(cfg) return {} end function m.VCManagedResourceCompilerTool(cfg) m.VCTool("VCManagedResourceCompilerTool", cfg) end m.elements.VCManifestTool = function(cfg) return { m.additionalManifestFiles, } end function m.VCManifestTool(cfg) if cfg.kind ~= p.STATICLIB then m.VCTool("VCManifestTool", cfg) end end m.elements.VCMIDLTool = function(cfg) return { m.targetEnvironment } end function m.VCMIDLTool(cfg) m.VCTool("VCMIDLTool", cfg) end m.elements.VCNMakeTool = function(cfg) return { m.buildCommandLine, m.reBuildCommandLine, m.cleanCommandLine, m.output, m.preprocessorDefinitions, m.undefinePreprocessorDefinitions, m.includeSearchPath, m.forcedIncludes, m.assemblySearchPath, m.forcedUsingAssemblies, m.compileAsManaged, } end function m.VCNMakeTool(cfg) m.VCTool("VCNMakeTool", cfg) end m.elements.VCBuildTool = function(cfg, stage) return { m.commandLine, } end function m.VCBuildToolName(cfg, stage) return "VC" .. stage .. "EventTool" end function m.VCPreBuildEventTool(cfg) m.VCTool("VCBuildTool", cfg, "PreBuild") end function m.VCPreLinkEventTool(cfg) m.VCTool("VCBuildTool", cfg, "PreLink") end function m.VCPostBuildEventTool(cfg) m.VCTool("VCBuildTool", cfg, "PostBuild") end m.elements.VCResourceCompilerTool = function(cfg) return { m.additionalResourceOptions, m.resourcePreprocessorDefinitions, m.additionalResourceIncludeDirectories, m.culture, } end function m.VCResourceCompilerTool(cfg) m.VCTool("VCResourceCompilerTool", cfg) end m.elements.VCWebServiceProxyGeneratorTool = function(cfg) return {} end function m.VCWebServiceProxyGeneratorTool(cfg) m.VCTool("VCWebServiceProxyGeneratorTool", cfg) end m.elements.VCXDCMakeTool = function(cfg) return {} end function m.VCXDCMakeTool(cfg) m.VCTool("VCXDCMakeTool", cfg) end m.elements.VCXMLDataGeneratorTool = function(cfg) return {} end function m.VCXMLDataGeneratorTool(cfg) m.VCTool("VCXMLDataGeneratorTool", cfg) end function m.symbols(cfg) if not (cfg.symbols == p.ON) then return 0 elseif cfg.debugformat == "c7" then return 1 else if cfg.editandcontinue == p.OFF or config.isOptimizedBuild(cfg) or cfg.clr ~= p.OFF or cfg.architecture == p.X86_64 then return 3 else return 4 end end end function m.additionalCompilerOptions(cfg) local opts = cfg.buildoptions if cfg.flags.MultiProcessorCompile then table.insert(opts, "/MP") end if #opts > 0 then p.x('AdditionalOptions="%s"', table.concat(opts, " ")) end end function m.additionalDependencies(cfg, toolset) if #cfg.links == 0 then return end local ex = vstudio.needsExplicitLink(cfg) local links if not toolset then links = vstudio.getLinks(cfg, ex) for i, link in ipairs(links) do if link:find(" ", 1, true) then link = '"' .. link .. '"' end links[i] = path.translate(link) end else links = path.translate(toolset.getlinks(cfg, not ex)) end if #links > 0 then p.x('AdditionalDependencies="%s"', table.concat(links, " ")) end end function m.additionalExternalCompilerOptions(cfg, toolset) local buildoptions = table.join(toolset.getcxxflags(cfg), cfg.buildoptions) if not cfg.flags.NoPCH and cfg.pchheader then table.insert(buildoptions, '--use_pch="$(IntDir)/$(TargetName).pch"') end if #buildoptions > 0 then p.x('AdditionalOptions="%s"', table.concat(buildoptions, " ")) end end function m.additionalImageOptions(cfg) if #cfg.imageoptions > 0 then p.x('AdditionalOptions="%s"', table.concat(cfg.imageoptions, " ")) end end function m.additionalIncludeDirectories(cfg) if #cfg.includedirs > 0 then local dirs = vstudio.path(cfg, cfg.includedirs) p.x('AdditionalIncludeDirectories="%s"', table.concat(dirs, ";")) end end function m.additionalLibraryDirectories(cfg) if #cfg.libdirs > 0 then local dirs = vstudio.path(cfg, cfg.libdirs) p.x('AdditionalLibraryDirectories="%s"', table.concat(dirs, ";")) end end function m.additionalLinkerOptions(cfg, toolset) local flags if toolset then flags = table.join(toolset.getldflags(cfg), cfg.linkoptions) else flags = cfg.linkoptions end if #flags > 0 then p.x('AdditionalOptions="%s"', table.concat(flags, " ")) end end function m.additionalManifestFiles(cfg) local manifests = {} for i, fname in ipairs(cfg.files) do if path.getextension(fname) == ".manifest" then table.insert(manifests, project.getrelative(cfg.project, fname)) end end if #manifests > 0 then p.x('AdditionalManifestFiles="%s"', table.concat(manifests, ";")) end end function m.additionalResourceIncludeDirectories(cfg) local dirs = table.join(cfg.includedirs, cfg.resincludedirs) if #dirs > 0 then dirs = vstudio.path(cfg, dirs) p.x('AdditionalIncludeDirectories="%s"', table.concat(dirs, ";")) end end function m.additionalResourceOptions(cfg) if #cfg.resoptions > 0 then p.x('AdditionalOptions="%s"', table.concat(cfg.resoptions, " ")) end end function m.assemblyReferences(prj) local cfg = project.getfirstconfig(prj) local refs = config.getlinks(cfg, "system", "fullpath", "managed") table.foreachi(refs, function(value) p.push('') end) end function m.assemblySearchPath(cfg) p.w('AssemblySearchPath=""') end function m.basicRuntimeChecks(cfg) local cfg, filecfg = config.normalize(cfg) if not filecfg and not config.isOptimizedBuild(cfg) and cfg.clr == p.OFF and not cfg.flags.NoRuntimeChecks then p.w('BasicRuntimeChecks="3"') end end function m.bufferSecurityCheck(cfg) if cfg.flags.NoBufferSecurityCheck then p.w('BufferSecurityCheck="false"') end end function m.buildCommandLine(cfg) local cmds = os.translateCommandsAndPaths(cfg.buildcommands, cfg.project.basedir, cfg.project.location) p.x('BuildCommandLine="%s"', table.concat(cmds, "\r\n")) end function m.characterSet(cfg) if not vstudio.isMakefile(cfg) then p.w('CharacterSet="%s"', iif(cfg.characterset == p.MBCS, 2, 1)) end end function m.cleanCommandLine(cfg) local cmds = os.translateCommandsAndPaths(cfg.cleancommands, cfg.project.basedir, cfg.project.location) cmds = table.concat(cmds, "\r\n") p.x('CleanCommandLine="%s"', cmds) end function m.commandLine(cfg, stage) local field = stage:lower() local steps = cfg[field .. "commands"] local msg = cfg[field .. "message"] if #steps > 0 then if msg then p.x('Description="%s"', msg) end steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) p.x('CommandLine="%s"', table.implode(steps, "", "", "\r\n")) end end function m.compileAs(cfg, toolset) local cfg, filecfg = config.normalize(cfg) local c = p.languages.isc(cfg.language) local compileAs if filecfg then if filecfg.compileas then compileAs = iif(p.languages.iscpp(filecfg.compileas), 2, 1) elseif path.iscfile(filecfg.name) ~= c then if path.iscppfile(filecfg.name) then compileAs = iif(c, 2, 1) end end else if toolset then compileAs = "0" elseif c then compileAs = "1" end end if compileAs then p.w('CompileAs="%s"', compileAs) end end function m.disableSpecificWarnings(cfg) if #cfg.disablewarnings > 0 then p.x('DisableSpecificWarnings="%s"', table.concat(cfg.disablewarnings, ";")) end end function m.compileAsManaged(cfg) p.w('CompileAsManaged=""') end function m.configurationType(cfg) local cfgtypes = { Makefile = 0, None = 0, SharedLib = 2, StaticLib = 4, } p.w('ConfigurationType="%s"', cfgtypes[cfg.kind] or 1) end function m.culture(cfg) local value = vstudio.cultureForLocale(cfg.locale) if value then p.w('Culture="%d"', value) end end function m.customBuildTool(cfg) local cfg, filecfg = config.normalize(cfg) if filecfg and fileconfig.hasCustomBuildRule(filecfg) then local cmds = os.translateCommandsAndPaths(filecfg.buildcommands, filecfg.project.basedir, filecfg.project.location) p.x('CommandLine="%s"', table.concat(cmds,'\r\n')) local outputs = project.getrelative(filecfg.project, filecfg.buildoutputs) p.x('Outputs="%s"', table.concat(outputs, ';')) if filecfg.buildinputs and #filecfg.buildinputs > 0 then local inputs = project.getrelative(filecfg.project, filecfg.buildinputs) p.x('AdditionalDependencies="%s"', table.concat(inputs, ';')) end end end function m.debugInformationFormat(cfg, toolset) local prjcfg, filecfg = config.normalize(cfg) if not filecfg then local fmt = iif(toolset, "0", m.symbols(cfg)) p.w('DebugInformationFormat="%s"', fmt) end end function m.detect64BitPortabilityProblems(cfg) local prjcfg, filecfg = config.normalize(cfg) if _ACTION < "vs2008" and cfg.clr == p.OFF and cfg.warnings ~= p.OFF and not filecfg then p.w('Detect64BitPortabilityProblems="%s"', tostring(not cfg.flags.No64BitChecks)) end end function m.enableCOMDATFolding(cfg, toolset) if config.isOptimizedBuild(cfg) and not toolset then p.w('EnableCOMDATFolding="2"') end end function m.largeAddressAware(cfg) if (cfg.largeaddressaware == true) then p.w('LargeAddressAware="2"') end end function m.enableEnhancedInstructionSet(cfg) local map = { SSE = "1", SSE2 = "2" } local value = map[cfg.vectorextensions] if value and cfg.architecture ~= "x86_64" then p.w('EnableEnhancedInstructionSet="%d"', value) end end function m.enableFunctionLevelLinking(cfg) local cfg, filecfg = config.normalize(cfg) if not filecfg then p.w('EnableFunctionLevelLinking="true"') end end function m.entryPointSymbol(cfg, toolset) if cfg.entrypoint then p.w('EntryPointSymbol="%s"', cfg.entrypoint) end end function m.exceptionHandling(cfg) if cfg.exceptionhandling == p.OFF then p.w('ExceptionHandling="%s"', iif(_ACTION < "vs2005", "FALSE", 0)) elseif cfg.exceptionhandling == "SEH" and _ACTION > "vs2003" then p.w('ExceptionHandling="2"') end end function m.excludedFromBuild(filecfg) if not filecfg or filecfg.flags.ExcludeFromBuild then p.w('ExcludedFromBuild="true"') end end function m.floatingPointModel(cfg) local map = { Strict = "1", Fast = "2" } local value = map[cfg.floatingpoint] if value then p.w('FloatingPointModel="%d"', value) end end function m.forcedIncludeFiles(cfg) if #cfg.forceincludes > 0 then local includes = vstudio.path(cfg, cfg.forceincludes) p.w('ForcedIncludeFiles="%s"', table.concat(includes, ';')) end if #cfg.forceusings > 0 then local usings = vstudio.path(cfg, cfg.forceusings) p.w('ForcedUsingFiles="%s"', table.concat(usings, ';')) end end function m.forcedIncludes(cfg) p.w('ForcedIncludes=""') end function m.forcedUsingAssemblies(cfg) p.w('ForcedUsingAssemblies=""') end function m.keyword(prj) local windows, managed, makefile for cfg in project.eachconfig(prj) do if cfg.system == p.WINDOWS then windows = true end if cfg.clr ~= p.OFF then managed = true end if vstudio.isMakefile(cfg) then makefile = true end end if windows then local keyword = "Win32Proj" if managed then keyword = "ManagedCProj" end if makefile then keyword = "MakeFileProj" end p.w('Keyword="%s"', keyword) end end function m.generateDebugInformation(cfg, toolset) if not toolset then p.w('GenerateDebugInformation="%s"', tostring(m.symbols(cfg) ~= 0)) end end function m.generateManifest(cfg, toolset) if cfg.flags.NoManifest or toolset then p.w('GenerateManifest="false"') end end function m.ignoreImportLibrary(cfg, toolset) if cfg.flags.NoImportLib and not toolset then p.w('IgnoreImportLibrary="true"') end end function m.importLibrary(cfg, toolset) if cfg.kind == p.SHAREDLIB and not toolset then local implibdir = cfg.linktarget.abspath if cfg.flags.NoImportLib then implibdir = path.join(cfg.objdir, path.getname(implibdir)) end implibdir = vstudio.path(cfg, implibdir) p.x('ImportLibrary="%s"', implibdir) end end function m.includeSearchPath(cfg) p.w('IncludeSearchPath=""') end function m.intermediateDirectory(cfg) local objdir if not cfg.fake then objdir = vstudio.path(cfg, cfg.objdir) else objdir = "$(PlatformName)\\$(ConfigurationName)" end p.x('IntermediateDirectory="%s"', objdir) end function m.linkIncremental(cfg, toolset) local value if not toolset then value = iif(config.canLinkIncremental(cfg) , 2, 1) else value = 0 end p.w('LinkIncremental="%s"', value) end function m.linkLibraryDependencies(cfg, toolset) if vstudio.needsExplicitLink(cfg) and not toolset then p.w('LinkLibraryDependencies="false"') end end function m.managedExtensions(cfg) if cfg.clr ~= p.OFF then p.w('ManagedExtensions="1"') end end function m.minimalRebuild(cfg) if config.isDebugBuild(cfg) and cfg.debugformat ~= "c7" and not cfg.flags.NoMinimalRebuild and cfg.clr == p.OFF and not cfg.flags.MultiProcessorCompile then p.w('MinimalRebuild="true"') end end function m.moduleDefinitionFile(cfg, toolset) if not toolset then local deffile = config.findfile(cfg, ".def") if deffile then p.w('ModuleDefinitionFile="%s"', deffile) end end end function m.objectFile(cfg) local cfg, filecfg = config.normalize(cfg) if filecfg and path.iscppfile(filecfg.name) then if filecfg.objname ~= path.getbasename(filecfg.abspath) then p.x('ObjectFile="$(IntDir)\\%s.obj"', filecfg.objname) end end end function m.omitDefaultLib(cfg) if cfg.flags.OmitDefaultLibrary then p.w('OmitDefaultLibName="true"') end end function m.omitFramePointers(cfg) if cfg.omitframepointer == "On" then p.w('OmitFramePointers="true"') end end function m.optimization(cfg) local map = { Off=0, On=3, Debug=0, Full=3, Size=1, Speed=2 } local value = map[cfg.optimize] if value or not cfg.abspath then p.w('Optimization="%s"', value or 0) end end function m.optimizeReferences(cfg, toolset) if config.isOptimizedBuild(cfg) and not toolset then p.w('OptimizeReferences="2"') end end function m.output(cfg) p.w('Output="$(OutDir)%s"', cfg.buildtarget.name) end function m.outputDirectory(cfg) local outdir = project.getrelative(cfg.project, cfg.buildtarget.directory) p.x('OutputDirectory="%s"', path.translate(outdir)) end function m.outputFile(cfg) p.x('OutputFile="$(OutDir)\\%s"', cfg.buildtarget.name) end function m.outputFileName(cfg) if cfg.imagepath ~= nil then p.x('OutputFileName="%s"', path.translate(cfg.imagepath)) end end function m.platforms(prj) architectures = {} for cfg in project.eachconfig(prj) do local arch = vstudio.archFromConfig(cfg, true) if not table.contains(architectures, arch) then table.insert(architectures, arch) end end p.push('') table.foreachi(architectures, function(arch) p.push('') end) p.pop('') end function m.preprocessorDefinitions(cfg) if #cfg.defines > 0 or vstudio.isMakefile(cfg) then p.x('PreprocessorDefinitions="%s"', table.concat(cfg.defines, ";")) end end function m.undefinePreprocessorDefinitions(cfg) if #cfg.undefines > 0 then p.x('UndefinePreprocessorDefinitions="%s"', table.concat(cfg.undefines, ";")) end end function m.programDatabaseFile(cfg, toolset) if toolset then p.w('ProgramDatabaseFile=""') end end function m.programDataBaseFileName(cfg, toolset) if toolset then p.w('ProgramDataBaseFileName=""') end end function m.projectGUID(prj) p.w('ProjectGUID="{%s}"', prj.uuid) end function m.projectName(prj) p.x('Name="%s"', prj.name) end function m.projectReferences(prj) local deps = project.getdependencies(prj) if #deps > 0 then for i, dep in ipairs(deps) do local relpath = vstudio.path(prj.workspace, vstudio.projectfile(dep)) if not relpath:startswith(".") then relpath = ".\\" .. relpath end p.push('') end end end function m.projectType(prj) p.w('ProjectType="Visual C++"') end function m.reBuildCommandLine(cfg) commands = table.concat(cfg.rebuildcommands, "\r\n") p.x('ReBuildCommandLine="%s"', commands) end function m.resourcePreprocessorDefinitions(cfg) local defs = table.join(cfg.defines, cfg.resdefines) if #defs > 0 then p.x('PreprocessorDefinitions="%s"', table.concat(defs, ";")) end end function m.rootNamespace(prj) local hasWindows = project.hasConfig(prj, function(cfg) return cfg.system == p.WINDOWS end) if hasWindows and _ACTION > "vs2003" then p.x('RootNamespace="%s"', prj.name) end end function m.runtimeLibrary(cfg) local cfg, filecfg = config.normalize(cfg) if not filecfg then local runtimes = { StaticRelease = 0, StaticDebug = 1, SharedRelease = 2, SharedDebug = 3, } local runtime = config.getruntime(cfg) if runtime then p.w('RuntimeLibrary="%s"', runtimes[runtime]) else p.w('RuntimeLibrary="%s"', iif(config.isDebugBuild(cfg), 3, 2)) end end end function m.runtimeTypeInfo(cfg) if cfg.rtti == p.OFF and cfg.clr == p.OFF then p.w('RuntimeTypeInfo="false"') elseif cfg.rtti == p.ON then p.w('RuntimeTypeInfo="true"') end end function m.stringPooling(cfg) if config.isOptimizedBuild(cfg) then p.w('StringPooling="true"') end end function m.subSystem(cfg, toolset) if not toolset then p.w('SubSystem="%s"', iif(cfg.kind == "ConsoleApp", 1, 2)) end end function m.targetEnvironment(cfg) if cfg.architecture == "x86_64" then p.w('TargetEnvironment="3"') end end function m.targetFrameworkVersion(prj) local windows, makefile for cfg in project.eachconfig(prj) do if cfg.system == p.WINDOWS then windows = true end if vstudio.isMakefile(cfg) then makefile = true end end local version = 0 if makefile or not windows then version = 196613 end p.w('TargetFrameworkVersion="%d"', version) end function m.targetMachine(cfg, toolset) if not toolset then p.w('TargetMachine="%d"', iif(cfg.architecture == "x86_64", 17, 1)) end end function m.toolFiles(prj) if _ACTION > "vs2003" then p.w('') p.w('') end end function m.treatWChar_tAsBuiltInType(cfg) local map = { On = "true", Off = "false" } local value = map[cfg.nativewchar] if value then p.w('TreatWChar_tAsBuiltInType="%s"', value) end end function m.useOfMFC(cfg) if (cfg.flags.MFC) then p.w('UseOfMFC="%d"', iif(cfg.staticruntime == "On", 1, 2)) end end function m.usePrecompiledHeader(cfg) local prj, file = config.normalize(cfg) if file then if prj.pchsource == file.abspath and not prj.flags.NoPCH and prj.system == p.WINDOWS then p.w('UsePrecompiledHeader="1"') elseif file.flags.NoPCH then p.w('UsePrecompiledHeader="0"') end else if not prj.flags.NoPCH and prj.pchheader then p.w('UsePrecompiledHeader="%s"', iif(_ACTION < "vs2005", 3, 2)) p.x('PrecompiledHeaderThrough="%s"', prj.pchheader) else p.w('UsePrecompiledHeader="%s"', iif(_ACTION > "vs2003" or prj.flags.NoPCH, 0, 2)) end end end function m.version(prj) local map = { vs2002 = '7.0', vs2003 = '7.1', vs2005 = '8.0', vs2008 = '9.0' } p.w('Version="%s0"', map[_ACTION]) end function m.warnAsError(cfg) if cfg.flags.FatalCompileWarnings and cfg.warnings ~= p.OFF then p.w('WarnAsError="true"') end end function m.warningLevel(cfg) local prjcfg, filecfg = config.normalize(cfg) local level if cfg.warnings == p.OFF then level = "0" elseif cfg.warnings == "High" then level = "4" elseif cfg.warnings == "Extra" then level = "4" elseif not filecfg then level = "3" end if level then p.w('WarningLevel="%s"', level) end end function m.wholeProgramOptimization(cfg) if cfg.flags.LinkTimeOptimization then p.x('WholeProgramOptimization="true"') end end function m.xmlElement() p.w('') end local p = premake p.vstudio.vs2008 = {} local vs2008 = p.vstudio.vs2008 local vstudio = p.vstudio newaction { trigger = "vs2008", shortname = "Visual Studio 2008", description = "Generate Visual Studio 2008 project files", targetos = "windows", toolset = "msc-v90", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = vstudio.vs2005.generateSolution, onProject = vstudio.vs2005.generateProject, onCleanWorkspace = vstudio.cleanSolution, onCleanProject = vstudio.cleanProject, onCleanTarget = vstudio.cleanTarget, vstudio = { csprojSchemaVersion = "2.0", productVersion = "9.0.30729", solutionVersion = "10", versionName = "2008", toolsVersion = "3.5", } } local p = premake p.vstudio.vs2005 = {} local vs2005 = p.vstudio.vs2005 local vstudio = p.vstudio function vs2005.generateSolution(wks) p.indent("\t") p.eol("\r\n") p.escaper(vs2005.esc) p.generate(wks, ".sln", vstudio.sln2005.generate) end function vs2005.generateProject(prj) p.indent(" ") p.eol("\r\n") p.escaper(vs2005.esc) if p.project.iscsharp(prj) then p.generate(prj, ".csproj", vstudio.cs2005.generate) local user = p.capture(function() vstudio.cs2005.generateUser(prj) end) if #user > 0 then p.generate(prj, ".csproj.user", function() p.outln(user) end) end elseif p.project.isfsharp(prj) then p.generate(prj, ".fsproj", vstudio.fs2005.generate) local user = p.capture(function() vstudio.fs2005.generateUser(prj) end) if #user > 0 then p.generate(prj, ".fsproj.user", function() p.outln(user) end) end else p.generate(prj, ".vcproj", vstudio.vc200x.generate) local user = p.capture(function() vstudio.vc200x.generateUser(prj) end) if #user > 0 then p.generate(prj, ".vcproj.user", function() p.outln(user) end) end end end function vs2005.esc(value) value = string.gsub(value, '&', "&") value = value:gsub('"', """) value = value:gsub("'", "'") value = value:gsub('<', "<") value = value:gsub('>', ">") value = value:gsub('\r', " ") value = value:gsub('\n', " ") return value end newaction { trigger = "vs2005", shortname = "Visual Studio 2005", description = "Generate Visual Studio 2005 project files", targetos = "windows", toolset = "msc-v80", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Makefile", "None" }, valid_languages = { "C", "C++", "C#", "F#" }, valid_tools = { cc = { "msc" }, dotnet = { "msnet" }, }, onWorkspace = vstudio.vs2005.generateSolution, onProject = vstudio.vs2005.generateProject, onCleanWorkspace = vstudio.cleanSolution, onCleanProject = vstudio.cleanProject, onCleanTarget = vstudio.cleanTarget, vstudio = { csprojSchemaVersion = "2.0", productVersion = "8.0.50727", solutionVersion = "9", versionName = "2005", } } local p = premake p.modules.vstudio = p.modules.vstudio or {} p.modules.vstudio._VERSION = p._VERSION p.vstudio = p.modules.vstudio local vstudio = p.vstudio local project = p.project local config = p.config vstudio.vs200x_architectures = { win32 = "x86", x86 = "x86", x86_64 = "x64", ARM = "ARM", ARM64 = "ARM64", } vstudio.vs2010_architectures = { win32 = "x86", } local function architecture(system, arch) local result if _ACTION >= "vs2010" then result = vstudio.vs2010_architectures[arch] or vstudio.vs2010_architectures[system] end return result or vstudio.vs200x_architectures[arch] or vstudio.vs200x_architectures[system] end vstudio._cultures = { ["af"] = 0x0036, ["af-ZA"] = 0x0436, ["sq"] = 0x001C, ["sq-AL"] = 0x041C, ["ar"] = 0x0001, ["ar-DZ"] = 0x1401, ["ar-BH"] = 0x3C01, ["ar-EG"] = 0x0C01, ["ar-IQ"] = 0x0801, ["ar-JO"] = 0x2C01, ["ar-KW"] = 0x3401, ["ar-LB"] = 0x3001, ["ar-LY"] = 0x1001, ["ar-MA"] = 0x1801, ["ar-OM"] = 0x2001, ["ar-QA"] = 0x4001, ["ar-SA"] = 0x0401, ["ar-SY"] = 0x2801, ["ar-TN"] = 0x1C01, ["ar-AE"] = 0x3801, ["ar-YE"] = 0x2401, ["hy"] = 0x002B, ["hy-AM"] = 0x042B, ["az"] = 0x002C, ["az-Cyrl-AZ"] = 0x082C, ["az-Latn-AZ"] = 0x042C, ["eu"] = 0x002D, ["eu-ES"] = 0x042D, ["be"] = 0x0023, ["be-BY"] = 0x0423, ["bg"] = 0x0002, ["bg-BG"] = 0x0402, ["ca"] = 0x0003, ["ca-ES"] = 0x0403, ["zh-HK"] = 0x0C04, ["zh-MO"] = 0x1404, ["zh-CN"] = 0x0804, ["zh-Hans"] = 0x0004, ["zh-SG"] = 0x1004, ["zh-TW"] = 0x0404, ["zh-Hant"] = 0x7C04, ["hr"] = 0x001A, ["hr-HR"] = 0x041A, ["cs"] = 0x0005, ["cs-CZ"] = 0x0405, ["da"] = 0x0006, ["da-DK"] = 0x0406, ["dv"] = 0x0065, ["dv-MV"] = 0x0465, ["nl"] = 0x0013, ["nl-BE"] = 0x0813, ["nl-NL"] = 0x0413, ["en"] = 0x0009, ["en-AU"] = 0x0C09, ["en-BZ"] = 0x2809, ["en-CA"] = 0x1009, ["en-029"] = 0x2409, ["en-IE"] = 0x1809, ["en-JM"] = 0x2009, ["en-NZ"] = 0x1409, ["en-PH"] = 0x3409, ["en-ZA"] = 0x1C09, ["en-TT"] = 0x2C09, ["en-GB"] = 0x0809, ["en-US"] = 0x0409, ["en-ZW"] = 0x3009, ["et"] = 0x0025, ["et-EE"] = 0x0425, ["fo"] = 0x0038, ["fo-FO"] = 0x0438, ["fa"] = 0x0029, ["fa-IR"] = 0x0429, ["fi"] = 0x000B, ["fi-FI"] = 0x040B, ["fr"] = 0x000C, ["fr-BE"] = 0x080C, ["fr-CA"] = 0x0C0C, ["fr-FR"] = 0x040C, ["fr-LU"] = 0x140C, ["fr-MC"] = 0x180C, ["fr-CH"] = 0x100C, ["gl"] = 0x0056, ["gl-ES"] = 0x0456, ["ka"] = 0x0037, ["ka-GE"] = 0x0437, ["de"] = 0x0007, ["de-AT"] = 0x0C07, ["de-DE"] = 0x0407, ["de-LI"] = 0x1407, ["de-LU"] = 0x1007, ["de-CH"] = 0x0807, ["el"] = 0x0008, ["el-GR"] = 0x0408, ["gu"] = 0x0047, ["gu-IN"] = 0x0447, ["he"] = 0x000D, ["he-IL"] = 0x040D, ["hi"] = 0x0039, ["hi-IN"] = 0x0439, ["hu"] = 0x000E, ["hu-HU"] = 0x040E, ["is"] = 0x000F, ["is-IS"] = 0x040F, ["id"] = 0x0021, ["id-ID"] = 0x0421, ["it"] = 0x0010, ["it-IT"] = 0x0410, ["it-CH"] = 0x0810, ["ja"] = 0x0011, ["ja-JP"] = 0x0411, ["kn"] = 0x004B, ["kn-IN"] = 0x044B, ["kk"] = 0x003F, ["kk-KZ"] = 0x043F, ["kok"] = 0x0057, ["kok-IN"] = 0x0457, ["ko"] = 0x0012, ["ko-KR"] = 0x0412, ["ky"] = 0x0040, ["ky-KG"] = 0x0440, ["lv"] = 0x0026, ["lv-LV"] = 0x0426, ["lt"] = 0x0027, ["lt-LT"] = 0x0427, ["mk"] = 0x002F, ["mk-MK"] = 0x042F, ["ms"] = 0x003E, ["ms-BN"] = 0x083E, ["ms-MY"] = 0x043E, ["mr"] = 0x004E, ["mr-IN"] = 0x044E, ["mn"] = 0x0050, ["mn-MN"] = 0x0450, ["no"] = 0x0014, ["nb-NO"] = 0x0414, ["nn-NO"] = 0x0814, ["pl"] = 0x0015, ["pl-PL"] = 0x0415, ["pt"] = 0x0016, ["pt-BR"] = 0x0416, ["pt-PT"] = 0x0816, ["pa"] = 0x0046, ["pa-IN"] = 0x0446, ["ro"] = 0x0018, ["ro-RO"] = 0x0418, ["ru"] = 0x0019, ["ru-RU"] = 0x0419, ["sa"] = 0x004F, ["sa-IN"] = 0x044F, ["sr-Cyrl-CS"] = 0x0C1A, ["sr-Latn-CS"] = 0x081A, ["sk"] = 0x001B, ["sk-SK"] = 0x041B, ["sl"] = 0x0024, ["sl-SI"] = 0x0424, ["es"] = 0x000A, ["es-AR"] = 0x2C0A, ["es-BO"] = 0x400A, ["es-CL"] = 0x340A, ["es-CO"] = 0x240A, ["es-CR"] = 0x140A, ["es-DO"] = 0x1C0A, ["es-EC"] = 0x300A, ["es-SV"] = 0x440A, ["es-GT"] = 0x100A, ["es-HN"] = 0x480A, ["es-MX"] = 0x080A, ["es-NI"] = 0x4C0A, ["es-PA"] = 0x180A, ["es-PY"] = 0x3C0A, ["es-PE"] = 0x280A, ["es-PR"] = 0x500A, ["es-ES"] = 0x0C0A, ["es-ES_tradnl"]= 0x040A, ["es-UY"] = 0x380A, ["es-VE"] = 0x200A, ["sw"] = 0x0041, ["sw-KE"] = 0x0441, ["sv"] = 0x001D, ["sv-FI"] = 0x081D, ["sv-SE"] = 0x041D, ["syr"] = 0x005A, ["syr-SY"] = 0x045A, ["ta"] = 0x0049, ["ta-IN"] = 0x0449, ["tt"] = 0x0044, ["tt-RU"] = 0x0444, ["te"] = 0x004A, ["te-IN"] = 0x044A, ["th"] = 0x001E, ["th-TH"] = 0x041E, ["tr"] = 0x001F, ["tr-TR"] = 0x041F, ["uk"] = 0x0022, ["uk-UA"] = 0x0422, ["ur"] = 0x0020, ["ur-PK"] = 0x0420, ["uz"] = 0x0043, ["uz-Cyrl-UZ"] = 0x0843, ["uz-Latn-UZ"] = 0x0443, ["vi"] = 0x002A, ["vi-VN"] = 0x042A, } function vstudio.archFromConfig(cfg, win32) local isnative = project.isnative(cfg.project) local arch = architecture(cfg.system, cfg.architecture) if not arch then arch = iif(isnative, "x86", "Any CPU") end if win32 and isnative and arch == "x86" then arch = "Win32" end return arch end function vstudio.archFromPlatform(platform) local system = p.api.checkValue(p.fields.system, platform) local arch = p.api.checkValue(p.fields.architecture, platform) return architecture(system, arch or platform:lower()) end function vstudio.cultureForLocale(locale) if locale then local culture = vstudio._cultures[locale] if not culture then p.warnOnce("Locale" .. locale, 'Unsupported locale "%s"', locale) end return culture end end function vstudio.getLinks(cfg, explicit) return p.tools.msc.getlinks(cfg, not explicit) end function vstudio.isMakefile(cfg) return (cfg.kind == p.MAKEFILE or cfg.kind == p.NONE) end function vstudio.needsExplicitLink(cfg) if not cfg._needsExplicitLink then local ex = cfg.flags.NoImplicitLink if not ex then local prjdeps = project.getdependencies(cfg.project, "linkOnly") local cfgdeps = config.getlinks(cfg, "dependencies", "object") ex = #prjdeps ~= #cfgdeps end cfg._needsExplicitLink = ex end return cfg._needsExplicitLink end function vstudio.path(cfg, value) cfg = cfg.project or cfg local dirs = path.translate(project.getrelative(cfg, value)) if type(dirs) == 'table' then dirs = table.filterempty(dirs) end return dirs end function vstudio.projectConfig(cfg, arch) local platform = vstudio.projectPlatform(cfg) local architecture = arch or vstudio.archFromConfig(cfg, true) return platform .. "|" .. architecture end function vstudio.projectElement() p.push('') end function vstudio.projectfile(prj) local extension if project.iscsharp(prj) then extension = ".csproj" elseif project.isfsharp(prj) then extension = ".fsproj" elseif project.isc(prj) or project.iscpp(prj) then if prj.kind == p.SHAREDITEMS then extension = ".vcxitems" else extension = iif(_ACTION > "vs2008", ".vcxproj", ".vcproj") end end return p.filename(prj, extension) end function vstudio.projectPlatform(cfg) local platform = cfg.platform if platform then local pltarch = vstudio.archFromPlatform(cfg.platform) or platform local cfgarch = vstudio.archFromConfig(cfg) if pltarch == cfgarch then platform = nil end end if platform then return cfg.buildcfg .. " " .. platform else return cfg.buildcfg end end function vstudio.solutionPlatform(cfg) local platform = cfg.platform local platarch if platform then platform = vstudio.archFromPlatform(platform) or platform if platform ~= "x86" then return platform end end local hasnative = false local hasnet = false local slnarch for prj in p.workspace.eachproject(cfg.workspace) do hasnative = hasnative or project.isnative(prj) hasnet = hasnet or project.isdotnet(prj) local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) if prjcfg then local prjarch = vstudio.archFromConfig(prjcfg) if not slnarch then slnarch = prjarch elseif slnarch ~= prjarch then slnarch = "Mixed Platforms" end end end if platform then return iif(hasnet, "x86", "Win32") elseif slnarch then return iif(slnarch == "x86" and not hasnet, "Win32", slnarch) elseif hasnet and hasnative then return "Mixed Platforms" elseif hasnet then return "Any CPU" else return "Win32" end end function vstudio.solutionarch(cfg) local hasnative = false local hasdotnet = false local arch = cfg.platform for prj in p.workspace.eachproject(cfg.workspace) do hasnative = hasnative or project.isnative(prj) hasnet = hasnet or project.isdotnet(prj) if hasnative and hasdotnet then return "Mixed Platforms" end if not arch then local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) if prjcfg then if prjcfg.architecture then arch = vstudio.archFromConfig(prjcfg) end end end end arch = arch or iif(hasnative, "Win32", "Any CPU") return arch end function vstudio.solutionconfig(cfg) local platform = cfg.platform if not platform then platform = vstudio.solutionarch(cfg) end return string.format("%s|%s", cfg.buildcfg, platform) end function vstudio.tool(prj) if project.iscsharp(prj) then return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC" elseif project.isfsharp(prj) then return "F2A71F9B-5D33-465A-A702-920D77279786" elseif project.isc(prj) or project.iscpp(prj) then return "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942" end end include("vs200x_vcproj.lua") include("vs200x_vcproj_user.lua") include("vs2005_solution.lua") include("vs2005_dotnetbase.lua") include("vs2005_csproj.lua") include("vs2005_csproj_user.lua") include("vs2005_fsproj.lua") include("vs2005_fsproj_user.lua") include("vs2010_nuget.lua") include("vs2010_vcxproj.lua") include("vs2010_vcxproj_user.lua") include("vs2010_vcxproj_filters.lua") include("vs2010_rules_props.lua") include("vs2010_rules_targets.lua") include("vs2010_rules_xml.lua") include("vs2013_vcxitems.lua") return p.modules.vstudio local p = premake local project = p.project p.modules.vstudio = p.modules.vstudio or {} p.modules.vstudio._VERSION = p._VERSION p.vstudio = p.modules.vstudio include("vs2005.lua") include("vs2008.lua") include("vs2010.lua") include("vs2012.lua") include("vs2013.lua") include("vs2015.lua") include("vs2017.lua") include("vs2019.lua") include("vs2022.lua") p.api.addAllowed("debugger", "VisualStudioLocal") p.api.addAllowed("debugger", "VisualStudioRemote") p.api.addAllowed("debugger", "VisualStudioWebBrowser") p.api.addAllowed("debugger", "VisualStudioWebService") p.api.register { name = "shaderoptions", scope = "config", kind = "list:string", tokens = true, pathVars = true, } p.api.register { name = "shaderdefines", scope = "config", kind = "list:string", tokens = true, } p.api.register { name = "shaderincludedirs", scope = "config", kind = "list:directory", tokens = true, pathVars = true, } p.api.register { name = "shadertype", scope = "config", kind = "string", allowed = { "Effect", "Vertex", "Pixel", "Geometry", "Hull", "Domain", "Compute", "Mesh", "Amplification", "Texture", "RootSignature", } } p.api.register { name = "shadermodel", scope = "config", kind = "string", allowed = { "2.0", "3.0", "4.0_level_9_1", "4.0_level_9_3", "4.0", "4.1", "5.0", "5.1", "rootsig_1.0", "rootsig_1.1", "6.0", "6.1", "6.2", "6.3", "6.4", "6.5" } } p.api.register { name = "shaderentry", scope = "config", kind = "string", tokens = true, } p.api.register { name = "shadervariablename", scope = "config", kind = "string", tokens = true, } p.api.register { name = "shaderheaderfileoutput", scope = "config", kind = "string", tokens = true, } p.api.register { name = "shaderobjectfileoutput", scope = "config", kind = "string", tokens = true, } p.api.register { name = "shaderassembler", scope = "config", kind = "string", allowed = { "NoListing", "AssemblyCode", "AssemblyCodeAndHex", } } p.api.register { name = "shaderassembleroutput", scope = "config", kind = "string", tokens = true, } p.api.register { -- DEPRECATED 2019-10-21 name = "debuggerflavor", scope = "config", kind = "string", allowed = { "Local", "Remote", "WebBrowser", "WebService" } } p.api.deprecateField("debuggerflavor", 'Use `debugger` instead.', function(value) debugger('VisualStudio' .. value) end) return function(cfg) return _ACTION == "vs2005" or _ACTION == "vs2008" or _ACTION == "vs2010" or _ACTION == "vs2012" or _ACTION == "vs2013" or _ACTION == "vs2015" or _ACTION == "vs2017" or _ACTION == "vs2019" or false; end local p = premake local m = p.modules.self_test local _ = {} function m.runTest(tests) local failed = 0 local failedTests = {} local suites = m.getSuites() local suitesKeys, suiteTestsKeys, totalTestCount = _.preprocessTests(suites, tests) _.log(term.lightGreen, "[==========]", string.format(" Running %d tests from %d test suites.", totalTestCount, #suitesKeys)) local startTime = os.clock() for index, suiteName in ipairs(suitesKeys) do suite = suites[suiteName] if not m.isSuppressed(suiteName) then local test = { suiteName = suiteName, suite = suite } local suiteFailed, suiteFailedTests = _.runTestSuite(test, suiteTestsKeys[suiteName]) failed = failed + suiteFailed failedTests = table.join(failedTests, suiteFailedTests) end end _.log(term.lightGreen, "[==========]", string.format(" %d tests from %d test suites ran. (%.0f ms total)", totalTestCount, #suitesKeys, (os.clock() - startTime) * 1000)) _.log(term.lightGreen, "[ PASSED ]", string.format(" %d tests.", totalTestCount - failed)) if failed > 0 then _.log(term.lightRed, "[ FAILED ]", string.format(" %d tests, listed below:", failed)) for index, testName in ipairs(failedTests) do _.log(term.lightRed, "[ FAILED ]", " " .. testName) end end return (totalTestCount - failed), failed end function _.runTestSuite(test, keys) local failed = 0 local failedTests = {} _.log(term.lightGreen, "[----------]", string.format(" %d tests from %s", #keys, test.suiteName)) local startTime = os.clock() if test.suite ~= nil then for index, testName in ipairs(keys) do testFunction = test.suite[testName] test.testName = testName test.testFunction = testFunction if m.isValid(test) and not m.isSuppressed(test.suiteName .. "." .. test.testName) then local err = _.runTest(test) if err then failed = failed + 1 table.insert(failedTests, test.suiteName .. "." .. test.testName .. "\n" .. err) end end end end _.log(term.lightGreen, "[----------]", string.format(" %d tests from %s (%.0f ms total)\n", #keys, test.suiteName, (os.clock() - startTime) * 1000)) return failed, failedTests end function _.runTest(test) _.log(term.lightGreen, "[ RUN ]", string.format(" %s.%s", test.suiteName, test.testName)) local startTime = os.clock() local cwd = os.getcwd() local hooks = _.installTestingHooks() _TESTS_DIR = test.suite._TESTS_DIR _SCRIPT_DIR = test.suite._SCRIPT_DIR m.suiteName = test.suiteName m.testName = test.testName local ok, err = _.setupTest(test) if ok then ok, err = _.executeTest(test) end local tok, terr = _.teardownTest(test) ok = ok and tok err = err or terr _.removeTestingHooks(hooks) os.chdir(cwd) if ok then _.log(term.lightGreen, "[ OK ]", string.format(" %s.%s (%.0f ms)", test.suiteName, test.testName, (os.clock() - startTime) * 1000)) return nil else _.log(term.lightRed, "[ FAILED ]", string.format(" %s.%s (%.0f ms)", test.suiteName, test.testName, (os.clock() - startTime) * 1000)) m.print(string.format("%s", err)) return err end end function _.log(color, left, right) term.pushColor(color) io.write(left) term.popColor() m.print(right) end function _.preprocessTests(suites, filters) local suitesKeys = {} local suiteTestsKeys = {} local totalTestCount = 0 for i, filter in ipairs(filters) do for suiteName, suite in pairs(suites) do if not m.isSuppressed(suiteName) and suite ~= nil and (not filter.suiteName or filter.suiteName == suiteName) then local test = {} test.suiteName = suiteName test.suite = suite if not table.contains(suitesKeys, suiteName) then table.insertsorted(suitesKeys, suiteName) suiteTestsKeys[suiteName] = {} end for testName, testFunction in pairs(suite) do test.testName = testName test.testFunction = testFunction if m.isValid(test) and not m.isSuppressed(test.suiteName .. "." .. test.testName) and (not filter.testName or filter.testName == testName) then if not table.contains(suiteTestsKeys[suiteName], testName) then table.insertsorted(suiteTestsKeys[suiteName], testName) totalTestCount = totalTestCount + 1 end end end end end end return suitesKeys, suiteTestsKeys, totalTestCount end function _.installTestingHooks() local hooks = {} hooks.action = _ACTION hooks.options = _OPTIONS hooks.targetOs = _TARGET_OS hooks.io_open = io.open hooks.io_output = io.output hooks.os_writefile_ifnotequal = os.writefile_ifnotequal hooks.p_utf8 = p.utf8 hooks.print = print hooks.setTextColor = term.setTextColor local mt = getmetatable(io.stderr) _.builtin_write = mt.write mt.write = _.stub_stderr_write _OPTIONS = table.shallowcopy(_OPTIONS) or {} setmetatable(_OPTIONS, getmetatable(hooks.options)) io.open = _.stub_io_open io.output = _.stub_io_output os.writefile_ifnotequal = _.stub_os_writefile_ifnotequal print = _.stub_print p.utf8 = _.stub_utf8 term.setTextColor = _.stub_setTextColor stderr_capture = nil p.clearWarnings() p.eol("\n") p.escaper(nil) p.indent("\t") p.api.reset() m.stderr_capture = nil m.value_openedfilename = nil m.value_openedfilemode = nil m.value_closedfile = false return hooks end function _.removeTestingHooks(hooks) p.action.set(hooks.action) _OPTIONS = hooks.options _TARGET_OS = hooks.targetOs io.open = hooks.io_open io.output = hooks.io_output os.writefile_ifnotequal = hooks.os_writefile_ifnotequal p.utf8 = hooks.p_utf8 print = hooks.print term.setTextColor = hooks.setTextColor local mt = getmetatable(io.stderr) mt.write = _.builtin_write end function _.setupTest(test) if type(test.suite.setup) == "function" then return xpcall(test.suite.setup, _.errorHandler) else return true end end function _.executeTest(test) local result, err p.capture(function() result, err = xpcall(test.testFunction, _.errorHandler) end) return result, err end function _.teardownTest(test) if type(test.suite.teardown) == "function" then return xpcall(test.suite.teardown, _.errorHandler) else return true end end function _.errorHandler(err) local msg = err if not msg:find("stack traceback:", 1, true) then msg = debug.traceback(err, 2) end local i = msg:find("[C]: in function 'xpcall'", 1, true) if i then msg = msg:sub(1, i - 3) end local n = select(2, msg:gsub('\n', '\n')) if n == 2 then msg = msg:sub(1, msg:find('\n', 1, true) - 1) end return msg end function _.stub_io_open(fname, mode) m.value_openedfilename = fname m.value_openedfilemode = mode return { read = function() end, close = function() m.value_closedfile = true end } end function _.stub_io_output(f) end function _.stub_os_writefile_ifnotequal(content, fname) m.value_openedfilename = fname m.value_closedfile = true return 0 end function _.stub_print(s) end function _.stub_stderr_write(...) if select(1, ...) == io.stderr then m.stderr_capture = (m.stderr_capture or "") .. select(2, ...) else return _.builtin_write(...) end end function _.stub_utf8() end function _.stub_setTextColor() end local p = premake local m = p.modules.self_test function m.createWorkspace() local wks = workspace("MyWorkspace") configurations { "Debug", "Release" } local prj = m.createProject(wks) return wks, prj end function m.createsolution() local wks = workspace("MySolution") configurations { "Debug", "Release" } local prj = m.createproject(wks) return wks, prj end function m.createProject(wks) local n = #wks.projects + 1 if n == 1 then n = "" end local prj = project ("MyProject" .. n) language "C++" kind "ConsoleApp" return prj end function m.createGroup(wks) local prj = group ("MyGroup" .. (#wks.groups + 1)) return prj end function m.getWorkspace(wks) p.oven.bake() return p.global.getWorkspace(wks.name) end function m.getRule(name) p.oven.bake() return p.global.getRule(name) end function m.getProject(wks, i) wks = m.getWorkspace(wks) return p.workspace.getproject(wks, i or 1) end function m.getConfig(prj, buildcfg, platform) local wks = m.getWorkspace(prj.workspace) prj = p.workspace.getproject(wks, prj.name) return p.project.getconfig(prj, buildcfg, platform) end m.print = print p.alias(m, "createProject", "createproject") p.alias(m, "getConfig", "getconfig") p.alias(m, "getProject", "getproject") p.alias(m, "getWorkspace", "getsolution") local p = premake local m = p.modules.self_test local _ = {} _.suites = {} _.suppressed = {} function m.declare(suiteName) if _.suites[suiteName] then error('Duplicate test suite "'.. suiteName .. '"', 2) end local _suite = {} local suite = setmetatable({}, { __index = _suite, __newindex = function (table, key, value) if m.detectDuplicateTests and _suite[key] ~= nil then error('Duplicate test "'.. key .. '"', 2) end _suite[key] = value end, __pairs = function (table) return pairs(_suite) end, __ipairs = function (table) return ipairs(_suite) end, }) suite._SCRIPT_DIR = _SCRIPT_DIR suite._TESTS_DIR = _TESTS_DIR _.suites[suiteName] = suite return suite end function m.suppress(identifier) if type(identifier) == "table" then for i = 1, #identifier do m.suppress(identifier[i]) end else _.suppressed[identifier] = true end end function m.isSuppressed(identifier) return _.suppressed[identifier] end function m.isValid(test) if type(test.testFunction) ~= "function" then return false end if test.testName == "setup" or test.testName == "teardown" then return false end return true end function m.getSuites() return _.suites end function m.getTestsWithIdentifier(identifier) local suiteName, testName = m.parseTestIdentifier(identifier) if suiteName ~= nil and string.contains(suiteName, "*") then local tests = {} local pattern = string.gsub(suiteName, "*", ".*") for _suiteName, suite in pairs(_.suites) do local length = string.len(_suiteName) local start, finish = string.find(_suiteName, pattern) if start == 1 and finish == length then if testName ~= nil then if string.contains(testName, "*") then local testPattern = string.gsub(testName, "*", ".*") for _testName, test in pairs(suite) do length = string.len(_testName) start, finish = string.find(_testName, testPattern) if start == 1 and finish == length then table.insert(tests, { suiteName = _suiteName, suite = suite, testName = _testName, testFunction = test, }) end end else table.insert(tests, { suiteName = _suiteName, suite = suite, testName = testName, testFunction = suite[testName], }) end else table.insert(tests, { suiteName = _suiteName, suite = suite, testName = nil, testFunction = nil, }) end end end return tests else local suite, test, err = _.checkTestIdentifier(_.suites, suiteName, testName) if err then return nil, err end return { { suiteName = suiteName, suite = suite, testName = testName, testFunction = test } } end end function m.parseTestIdentifier(identifier) local suiteName, testName if identifier then local parts = string.explode(identifier, ".", true) suiteName = iif(parts[1] ~= "", parts[1], nil) testName = iif(parts[2] ~= "", parts[2], nil) end return suiteName, testName end function _.checkTestIdentifier(suites, suiteName, testName) local suite, test if suiteName then suite = suites[suiteName] if not suite then return nil, nil, "No such test suite '" .. suiteName .. "'" end if testName then test = suite[testName] if not _.isValidTestPair(testName, test) then return nil, nil, "No such test '" .. suiteName .. "." .. testName .. "'" end end end return suite, test end function _.isValidTestPair(testName, testFunc) if type(testFunc) ~= "function" then return false end if testName == "setup" or testName == "teardown" then return false end return true end local p = premake local m = p.modules.self_test local _ = {} function m.capture(expected) local actual = p.captured() .. p.eol() local ait = actual:gmatch("(.-)" .. p.eol()) local eit = expected:gmatch("(.-)\n") local linenum = 1 local atxt = ait() local etxt = eit() while etxt do if (etxt ~= atxt) then m.fail("(%d) expected:\n%s\n...but was:\n%s\nfulltext:\n%s", linenum, etxt, atxt, actual) end linenum = linenum + 1 atxt = ait() etxt = eit() end end function m.closedfile(expected) if expected and not m.value_closedfile then m.fail("expected file to be closed") elseif not expected and m.value_closedfile then m.fail("expected file to remain open") end end function m.contains(expected, actual) if type(expected) == "table" then for i, v in ipairs(expected) do m.contains(v, actual) end elseif not table.contains(actual, expected) then m.fail("expected value %s not found", expected) end end function m.excludes(expected, actual) if type(expected) == "table" then for i, v in ipairs(expected) do m.excludes(v, actual) end elseif table.contains(actual, expected) then m.fail("excluded value %s found", expected) end end function m.fail(format, ...) local depth = 3 local arg = {...} if type(format) == "number" then depth = depth + format format = table.remove(arg, 1) end for i = 1, #arg do if (arg[i] == nil) then arg[i] = "(nil)" elseif (type(arg[i]) == "table") then arg[i] = "{" .. table.concat(arg[i], ", ") .. "}" end end local msg = string.format(format, table.unpack(arg)) error(debug.traceback(msg, depth), depth) end function m.filecontains(expected, fn) local f = io.open(fn) local actual = f:read("*a") f:close() if (expected ~= actual) then m.fail("expected %s but was %s", expected, actual) end end function m.hasoutput() local actual = p.captured() if actual == "" then m.fail("expected output, received none"); end end function m.isemptycapture() local actual = p.captured() if actual ~= "" then m.fail("expected empty capture, but was %s", actual); end end function m.isequal(expected, actual, depth) depth = depth or 0 if type(expected) == "table" then if expected and not actual then m.fail(depth, "expected table, got nil") end if #expected < #actual then m.fail(depth, "expected %d items, got %d", #expected, #actual) end for k,v in pairs(expected) do m.isequal(expected[k], actual[k], depth + 1) end else if (expected ~= actual) then m.fail(depth, "expected %s but was %s", expected, actual or "nil") end end return true end function m.isfalse(value) if (value) then m.fail("expected false but was true") end end function m.isnil(value) if (value ~= nil) then m.fail("expected nil but was " .. tostring(value)) end end function m.isnotnil(value) if (value == nil) then m.fail("expected not nil") end end function m.issame(expected, action) if expected ~= action then m.fail("expected same value") end end function m.istrue(value) if (not value) then m.fail("expected true but was false") end end function m.missing(value, actual) if table.contains(actual, value) then m.fail("unexpected value %s found", value) end end function m.openedfile(fname) if fname ~= m.value_openedfilename then local msg = "expected to open file '" .. fname .. "'" if m.value_openedfilename then msg = msg .. ", got '" .. m.value_openedfilename .. "'" end m.fail(msg) end end function m.success(fn, ...) local ok, err = pcall(fn, ...) if not ok then m.fail("call failed: " .. err) end end function m.stderr(expected) if not expected and m.stderr_capture then m.fail("Unexpected: " .. m.stderr_capture) elseif expected then if not m.stderr_capture or not m.stderr_capture:find(expected) then m.fail(string.format("expected '%s'; got %s", expected, m.stderr_capture or "(nil)")) end end end function m.notstderr(expected) if not expected and not m.stderr_capture then m.fail("Expected output on stderr; none received") elseif expected then if m.stderr_capture and m.stderr_capture:find(expected) then m.fail(string.format("stderr contains '%s'; was %s", expected, m.stderr_capture)) end end end local p = premake p.modules.self_test = {} local m = p.modules.self_test m._VERSION = p._VERSION newaction { trigger = "self-test", shortname = "Test Premake", description = "Run Premake's own local unit test suites", execute = function() m.executeSelfTest() end } newoption { trigger = "test-only", value = "suite[.test]", description = "For self-test action; run specific suite or test" } function m.executeSelfTest() m.detectDuplicateTests = true m.loadTestsFromManifests() m.detectDuplicateTests = false local tests = {} local isAction = true for i, arg in ipairs(_ARGS) do local _tests, err = m.getTestsWithIdentifier(arg) if err then error(err, 0) end tests = table.join(tests, _tests) end if #tests == 0 or _OPTIONS["test-only"] ~= nil then local _tests, err = m.getTestsWithIdentifier(_OPTIONS["test-only"]) if err then error(err, 0) end tests = table.join(tests, _tests) end local passed, failed = m.runTest(tests) if failed > 0 then printf("\n %d FAILED TEST%s", failed, iif(failed > 1, "S", "")) os.exit(5) end end function m.loadTestsFromManifests() local mask = path.join(_MAIN_SCRIPT_DIR, "**/tests/_tests.lua") local manifests = os.matchfiles(mask) local top = path.join(_MAIN_SCRIPT_DIR, "tests/_tests.lua") if os.isfile(top) then table.insert(manifests, 1, top) end for i = 1, #manifests do local manifest = manifests[i] _TESTS_DIR = path.getdirectory(manifest) local files = dofile(manifest) for i = 1, #files do local filename = path.join(_TESTS_DIR, files[i]) dofile(filename) end end end dofile("test_assertions.lua") dofile("test_declare.lua") dofile("test_helpers.lua") dofile("test_runner.lua") return m local p = premake p.tools.ldc = { } local ldc = p.tools.ldc local project = p.project local config = p.config local d = p.modules.d ldc.namestyle = "posix" ldc.dflags = { architecture = { x86 = "-m32", x86_64 = "-m64", ARM = "-march=arm", ARM64 = "-march=aarch64", }, flags = { OmitDefaultLibrary= "-mscrtlib=", CodeCoverage= "-cov", Color= "-enable-color", Documentation= "-D", FatalWarnings= "-w", -- Use LLVM flag? : "-fatal-assembler-warnings", GenerateHeader= "-H", GenerateJSON= "-X", LowMem= "-lowmem", RetainPaths= "-op", SymbolsLikeC= "-gc", UnitTest= "-unittest", Verbose= "-v", AllInstantiate= "-allinst", BetterC= "-betterC", Main= "-main", PerformSyntaxCheckOnly= "-o-", ShowGC= "-vgc", IgnorePragma= "-ignore", }, boundscheck = { Off = "-boundscheck=off", On = "-boundscheck=on", SafeOnly = "-boundscheck=safeonly", }, checkaction = { D = "-checkaction=D", C = "-checkaction=C", Halt = "-checkaction=halt", Context = "-checkaction=context", }, cppdialect = { ["C++latest"] = "-extern-std=c++17", -- TODO: keep this up to date >_< ["C++98"] = "-extern-std=c++98", ["C++0x"] = "-extern-std=c++11", ["C++11"] = "-extern-std=c++11", ["C++1y"] = "-extern-std=c++14", ["C++14"] = "-extern-std=c++14", ["C++1z"] = "-extern-std=c++17", ["C++17"] = "-extern-std=c++17", ["C++2a"] = "-extern-std=c++20", ["C++20"] = "-extern-std=c++20", ["gnu++98"] = "-extern-std=c++98", ["gnu++0x"] = "-extern-std=c++11", ["gnu++11"] = "-extern-std=c++11", ["gnu++1y"] = "-extern-std=c++14", ["gnu++14"] = "-extern-std=c++14", ["gnu++1z"] = "-extern-std=c++17", ["gnu++17"] = "-extern-std=c++17", ["gnu++2a"] = "-extern-std=c++20", ["gnu++20"] = "-extern-std=c++20", }, deprecatedfeatures = { Allow = "-d", Warn = "-dw", Error = "-de", }, floatingpoint = { Fast = "-fp-contract=fast -enable-unsafe-fp-math", }, optimize = { Off = "-O0", On = "-O2", Debug = "-O0", Full = "-O3", Size = "-Oz", Speed = "-O3", }, pic = { On = "-relocation-model=pic", }, vectorextensions = { AVX = "-mattr=+avx", AVX2 = "-mattr=+avx2", SSE = "-mattr=+sse", SSE2 = "-mattr=+sse2", SSE3 = "-mattr=+sse3", SSSE3 = "-mattr=+ssse3", ["SSE4.1"] = "-mattr=+sse4.1", ["SSE4.2"] = "-mattr=+sse4.2", }, warnings = { Default = "-wi", High = "-wi", Extra = "-wi",-- TODO: is there a way to get extra warnings? Everything = "-wi", }, symbols = { On = "-g", FastLink = "-g", Full = "-g", } } function ldc.getdflags(cfg) local flags = config.mapFlags(cfg, ldc.dflags) if config.isDebugBuild(cfg) then table.insert(flags, "-d-debug") else table.insert(flags, "-release") end if not cfg.flags.OmitDefaultLibrary then local releaseruntime = not config.isDebugBuild(cfg) local staticruntime = true if cfg.staticruntime == "Off" then staticruntime = false end if cfg.runtime == "Debug" then releaseruntime = false elseif cfg.runtime == "Release" then releaseruntime = true end if (cfg.staticruntime and cfg.staticruntime ~= "Default") or (cfg.runtime and cfg.runtime ~= "Default") then if staticruntime == true and releaseruntime == true then table.insert(flags, "-mscrtlib=libcmt") elseif staticruntime == true and releaseruntime == false then table.insert(flags, "-mscrtlib=libcmtd") elseif staticruntime == false and releaseruntime == true then table.insert(flags, "-mscrtlib=msvcrt") elseif staticruntime == false and releaseruntime == false then table.insert(flags, "-mscrtlib=msvcrtd") end end end if cfg.flags.Documentation then if cfg.docname then table.insert(flags, "-Df=" .. p.quoted(cfg.docname)) end if cfg.docdir then table.insert(flags, "-Dd=" .. p.quoted(cfg.docdir)) end end if cfg.flags.GenerateHeader then if cfg.headername then table.insert(flags, "-Hf=" .. p.quoted(cfg.headername)) end if cfg.headerdir then table.insert(flags, "-Hd=" .. p.quoted(cfg.headerdir)) end end if #cfg.computetargets > 0 then table.insert(flags, "-mdcompute-targets=" .. table.concat(cfg.computetargets, ',')) end if #cfg.isaextensions > 0 then local isaMap = { MOVBE = "movbe", POPCNT = "popcnt", PCLMUL = "pclmul", LZCNT = "lzcnt", BMI = "bmi", BMI2 = "bmi2", F16C = "f16c", AES = "aes", FMA = "fma", FMA4 = "fma4", RDRND = "rdrnd", } for _, ext in ipairs(cfg.transition) do if isaMap[ext] ~= nil then table.insert(flags, "-mattr=+" .. isaMap[ext]) end end end if #cfg.preview > 0 then for _, opt in ipairs(cfg.preview) do table.insert(flags, "-preview=" .. opt) end end if #cfg.revert > 0 then for _, opt in ipairs(cfg.revert) do table.insert(flags, "-revert=" .. opt) end end if #cfg.transition > 0 then for _, opt in ipairs(cfg.transition) do table.insert(flags, "-transition=" .. opt) end end return flags end function ldc.getversions(versions, level) local result = {} for _, version in ipairs(versions) do table.insert(result, '-d-version=' .. version) end if level then table.insert(result, '-d-version=' .. level) end return result end function ldc.getdebug(constants, level) local result = {} for _, constant in ipairs(constants) do table.insert(result, '-d-debug=' .. constant) end if level then table.insert(result, '-d-debug=' .. level) end return result end function ldc.getimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-I=' .. p.quoted(dir)) end return result end function ldc.getstringimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-J=' .. p.quoted(dir)) end return result end function ldc.gettarget(name) return "-of=" .. name end ldc.ldflags = { architecture = { x86 = { "-m32" }, x86_64 = { "-m64" }, }, kind = { SharedLib = "-shared", StaticLib = "-lib", }, } function ldc.getldflags(cfg) local flags = config.mapFlags(cfg, ldc.ldflags) return flags end ldc.libraryDirectories = { architecture = { x86 = "-L=-L/usr/lib", x86_64 = "-L=-L/usr/lib64", } } function ldc.getLibraryDirectories(cfg) local flags = config.mapFlags(cfg, ldc.libraryDirectories) for _, dir in ipairs(config.getlinks(cfg, "system", "directory")) do table.insert(flags, '-L=-L' .. project.getrelative(cfg.project, dir)) end return flags end function ldc.getlinks(cfg, systemonly) local result = {} local links if not systemonly then links = config.getlinks(cfg, "siblings", "object") for _, link in ipairs(links) do if not link.project.external then if link.kind == p.STATICLIB then table.insert(result, "-L=" .. project.getrelative(cfg.project, link.linktarget.abspath)) else table.insert(result, "-L=-l" .. link.linktarget.basename) end end end end links = config.getlinks(cfg, "system", "fullpath") for _, link in ipairs(links) do if path.isframework(link) then table.insert(result, "-framework " .. path.getbasename(link)) elseif path.isobjectfile(link) then table.insert(result, "-L=" .. link) else table.insert(result, "-L=-l" .. path.getbasename(link)) end end return result end ldc.makesettings = { } function ldc.getmakesettings(cfg) local settings = config.mapFlags(cfg, ldc.makesettings) return table.concat(settings) end ldc.tools = { dc = "ldc2", ar = "ar", } function ldc.gettoolname(cfg, tool) return ldc.tools[tool] end local p = premake p.tools.gdc = { } local gdc = p.tools.gdc local project = p.project local config = p.config local d = p.modules.d gdc.dc = "gdc" gdc.dflags = { architecture = { x86 = "-m32", x86_64 = "-m64", }, flags = { Documentation= "-fdoc", FatalWarnings= "-Werror", GenerateHeader= "-fintfc", GenerateJSON= "-fX", RetainPaths= "-op", SymbolsLikeC= "-fdebug-c", UnitTest= "-funittest", Verbose= "-fd-verbose", ShowTLS= "-fd-vtls", ShowDependencies= "-fdeps", }, boundscheck = { Off = "-fno-bounds-check", }, deprecatedfeatures = { Allow = "-fdeprecated", }, floatingpoint = { Fast = "-ffast-math", Strict = "-ffloat-store", }, optimize = { Off = "-O0", On = "-O2 -finline-functions", Debug = "-Og", Full = "-O3 -finline-functions", Size = "-Os -finline-functions", Speed = "-O3 -finline-functions", }, pic = { On = "-fPIC", }, vectorextensions = { AVX = "-mavx", SSE = "-msse", SSE2 = "-msse2", }, warnings = { High = "-Wall", Extra = "-Wall -Wextra", Everything = "-Weverything", }, symbols = { On = "-g", FastLink = "-g", Full = "-g -gf", } } function gdc.getdflags(cfg) local flags = config.mapFlags(cfg, gdc.dflags) if config.isDebugBuild(cfg) then table.insert(flags, "-fdebug") else table.insert(flags, "-frelease") end if cfg.flags.Documentation then if cfg.docname then table.insert(flags, "-fdoc-file=" .. p.quoted(cfg.docname)) end if cfg.docdir then table.insert(flags, "-fdoc-dir=" .. p.quoted(cfg.docdir)) end end if cfg.flags.GenerateHeader then if cfg.headername then table.insert(flags, "-fintfc-file=" .. p.quoted(cfg.headername)) end if cfg.headerdir then table.insert(flags, "-fintfc-dir=" .. p.quoted(cfg.headerdir)) end end return flags end function gdc.getversions(versions, level) local result = {} for _, version in ipairs(versions) do table.insert(result, '-fversion=' .. version) end if level then table.insert(result, '-fversion=' .. level) end return result end function gdc.getdebug(constants, level) local result = {} for _, constant in ipairs(constants) do table.insert(result, '-fdebug=' .. constant) end if level then table.insert(result, '-fdebug=' .. level) end return result end function gdc.getimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-I' .. p.quoted(dir)) end return result end function gdc.getstringimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-J' .. p.quoted(dir)) end return result end function gdc.gettarget(name) return "-o " .. name end gdc.ldflags = { architecture = { x86 = { "-m32" }, x86_64 = { "-m64" }, }, kind = { SharedLib = function(cfg) local r = { iif(cfg.system == p.MACOSX, "-dynamiclib", "-shared") } if cfg.system == "windows" and not cfg.flags.NoImportLib then table.insert(r, '-Wl,--out-implib="' .. cfg.linktarget.relpath .. '"') end return r end, WindowedApp = function(cfg) if cfg.system == p.WINDOWS then return "-mwindows" end end, }, } function gdc.getldflags(cfg) local flags = config.mapFlags(cfg, gdc.ldflags) return flags end gdc.libraryDirectories = { architecture = { x86 = "-L/usr/lib", x86_64 = "-L/usr/lib64", } } function gdc.getLibraryDirectories(cfg) local flags = config.mapFlags(cfg, gdc.libraryDirectories) for _, dir in ipairs(config.getlinks(cfg, "system", "directory")) do table.insert(flags, '-Wl,-L' .. project.getrelative(cfg.project, dir)) end return flags end function gdc.getlinks(cfg, systemonly) local result = {} local links if not systemonly then links = config.getlinks(cfg, "siblings", "object") for _, link in ipairs(links) do if not link.project.external then if link.kind == p.STATICLIB then table.insert(result, "-Wl," .. project.getrelative(cfg.project, link.linktarget.abspath)) else table.insert(result, "-Wl,-l" .. link.linktarget.basename) end end end end links = config.getlinks(cfg, "system", "fullpath") for _, link in ipairs(links) do if path.isframework(link) then table.insert(result, "-framework " .. path.getbasename(link)) elseif path.isobjectfile(link) then table.insert(result, "-Wl," .. link) else table.insert(result, "-Wl,-l" .. path.getbasename(link)) end end return result end gdc.makesettings = { } function gdc.getmakesettings(cfg) local settings = config.mapFlags(cfg, gdc.makesettings) return table.concat(settings) end gdc.tools = { ps3 = { dc = "ppu-lv2-gdc", ar = "ppu-lv2-ar", }, } function gdc.gettoolname(cfg, tool) local names = gdc.tools[cfg.architecture] or gdc.tools[cfg.system] or {} local name = names[tool] return name or gdc[tool] end local tdmd = {} local p = premake local project = p.project local config = p.config local d = p.modules.d tdmd.gcc = {} tdmd.gcc.dc = "dmd" tdmd.optlink = {} tdmd.optlink.dc = "dmd" tdmd.gcc.ldflags = { architecture = { x86 = { "-m32" }, x86_64 = { "-m64" }, }, kind = { SharedLib = "-shared", StaticLib = "-lib", } } function tdmd.gcc.getldflags(cfg) local flags = config.mapFlags(cfg, tdmd.gcc.ldflags) return flags end tdmd.gcc.libraryDirectories = { architecture = { x86 = "-L-L/usr/lib", x86_64 = "-L-L/usr/lib64", } } function tdmd.gcc.getLibraryDirectories(cfg) local flags = config.mapFlags(cfg, tdmd.gcc.libraryDirectories) for _, dir in ipairs(config.getlinks(cfg, "system", "directory")) do table.insert(flags, '-L-L' .. project.getrelative(cfg.project, dir)) end return flags end function tdmd.gcc.getlinks(cfg, systemonly) local result = {} local links if not systemonly then links = config.getlinks(cfg, "siblings", "object") for _, link in ipairs(links) do if not link.project.external then if link.kind == p.STATICLIB then table.insert(result, "-L" .. project.getrelative(cfg.project, link.linktarget.abspath)) else table.insert(result, "-L-l" .. link.linktarget.basename) end end end end links = config.getlinks(cfg, "system", "fullpath") for _, link in ipairs(links) do if path.isframework(link) then table.insert(result, "-framework " .. path.getbasename(link)) elseif path.isobjectfile(link) then table.insert(result, "-L" .. link) else table.insert(result, "-L-l" .. path.getbasename(link)) end end return result end tdmd.optlink.ldflags = { architecture = { x86 = { "-m32" }, x86_64 = { "-m64" }, }, kind = { SharedLib = "-shared", StaticLib = "-lib", } } function tdmd.optlink.getldflags(cfg) local flags = config.mapFlags(cfg, tdmd.optlink.ldflags) return flags end function tdmd.optlink.getLibraryDirectories(cfg) local flags = {} for _, dir in ipairs(config.getlinks(cfg, "system", "directory")) do table.insert(flags, '-Llib "' .. project.getrelative(cfg.project, dir) .. '"') end return flags end function tdmd.optlink.getlinks(cfg) local result = {} local links = config.getlinks(cfg, "dependencies", "object") for _, link in ipairs(links) do if not link.project.externalname then local linkinfo = config.getlinkinfo(link) if link.kind == p.STATICLIB then table.insert(result, project.getrelative(cfg.project, linkinfo.abspath)) end end end links = config.getlinks(cfg, "system", "basename") for _, link in ipairs(links) do if path.isobjectfile(link) then table.insert(result, link) elseif path.hasextension(link, p.systems[cfg.system].staticlib.extension) then table.insert(result, link) end end return result end if string.match( os.getversion().description, "Windows" ) ~= nil then p.tools.dmd = tdmd.optlink else p.tools.dmd = tdmd.gcc end local dmd = p.tools.dmd dmd.dflags = { architecture = { x86 = "-m32mscoff", x86_64 = "-m64", }, flags = { OmitDefaultLibrary= "-mscrtlib=", CodeCoverage= "-cov", Color= "-color", Documentation= "-D", FatalWarnings= "-w", GenerateHeader= "-H", GenerateJSON= "-X", GenerateMap= "-map", LowMem= "-lowmem", Profile= "-profile", Quiet= "-quiet", RetainPaths= "-op", SymbolsLikeC= "-gc", UnitTest= "-unittest", Verbose= "-v", ProfileGC= "-profile=gc", StackFrame= "-gs", StackStomp= "-gx", AllInstantiate= "-allinst", BetterC= "-betterC", Main= "-main", PerformSyntaxCheckOnly= "-o-", ShowTLS= "-vtls", ShowGC= "-vgc", IgnorePragma= "-ignore", ShowDependencies= "-deps", }, boundscheck = { Off = "-boundscheck=off", On = "-boundscheck=on", SafeOnly = "-boundscheck=safeonly", }, checkaction = { D = "-checkaction=D", C = "-checkaction=C", Halt = "-checkaction=halt", Context = "-checkaction=context", }, cppdialect = { ["C++latest"] = "-extern-std=c++20", -- TODO: keep this up to date >_< ["C++98"] = "-extern-std=c++98", ["C++0x"] = "-extern-std=c++11", ["C++11"] = "-extern-std=c++11", ["C++1y"] = "-extern-std=c++14", ["C++14"] = "-extern-std=c++14", ["C++1z"] = "-extern-std=c++17", ["C++17"] = "-extern-std=c++17", ["C++2a"] = "-extern-std=c++20", ["C++20"] = "-extern-std=c++20", ["gnu++98"] = "-extern-std=c++98", ["gnu++0x"] = "-extern-std=c++11", ["gnu++11"] = "-extern-std=c++11", ["gnu++1y"] = "-extern-std=c++14", ["gnu++14"] = "-extern-std=c++14", ["gnu++1z"] = "-extern-std=c++17", ["gnu++17"] = "-extern-std=c++17", ["gnu++2a"] = "-extern-std=c++20", ["gnu++20"] = "-extern-std=c++20", }, deprecatedfeatures = { Allow = "-d", Warn = "-dw", Error = "-de", }, floatingpoint = { None = "-nofloat", }, optimize = { On = "-O -inline", Full = "-O -inline", Size = "-O -inline", Speed = "-O -inline", }, pic = { On = "-fPIC", }, symbols = { On = "-g", FastLink = "-g", Full = "-g", }, vectorextensions = { AVX = "-mcpu=avx", AVX2 = "-mcpu=avx2", }, warnings = { Default = "-wi", High = "-wi", Extra = "-wi", Everything = "-wi", }, } function dmd.getdflags(cfg) local flags = config.mapFlags(cfg, dmd.dflags) if config.isDebugBuild(cfg) then table.insert(flags, "-debug") else table.insert(flags, "-release") end if not cfg.flags.OmitDefaultLibrary then local releaseruntime = not config.isDebugBuild(cfg) local staticruntime = true if cfg.staticruntime == "Off" then staticruntime = false end if cfg.runtime == "Debug" then releaseruntime = false elseif cfg.runtime == "Release" then releaseruntime = true end if (cfg.staticruntime and cfg.staticruntime ~= "Default") or (cfg.runtime and cfg.runtime ~= "Default") then if staticruntime == true and releaseruntime == true then table.insert(flags, "-mscrtlib=libcmt") elseif staticruntime == true and releaseruntime == false then table.insert(flags, "-mscrtlib=libcmtd") elseif staticruntime == false and releaseruntime == true then table.insert(flags, "-mscrtlib=msvcrt") elseif staticruntime == false and releaseruntime == false then table.insert(flags, "-mscrtlib=msvcrtd") end end end if cfg.flags.Documentation then if cfg.docname then table.insert(flags, "-Df" .. p.quoted(cfg.docname)) end if cfg.docdir then table.insert(flags, "-Dd" .. p.quoted(cfg.docdir)) end end if cfg.flags.GenerateHeader then if cfg.headername then table.insert(flags, "-Hf" .. p.quoted(cfg.headername)) end if cfg.headerdir then table.insert(flags, "-Hd" .. p.quoted(cfg.headerdir)) end end if #cfg.preview > 0 then for _, opt in ipairs(cfg.preview) do table.insert(flags, "-preview=" .. opt) end end if #cfg.revert > 0 then for _, opt in ipairs(cfg.revert) do table.insert(flags, "-revert=" .. opt) end end if #cfg.transition > 0 then for _, opt in ipairs(cfg.transition) do table.insert(flags, "-transition=" .. opt) end end return flags end function dmd.getversions(versions, level) local result = {} for _, version in ipairs(versions) do table.insert(result, '-version=' .. version) end if level then table.insert(result, '-version=' .. level) end return result end function dmd.getdebug(constants, level) local result = {} for _, constant in ipairs(constants) do table.insert(result, '-debug=' .. constant) end if level then table.insert(result, '-debug=' .. level) end return result end function dmd.getimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-I' .. p.quoted(dir)) end return result end function dmd.getstringimportdirs(cfg, dirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-J' .. p.quoted(dir)) end return result end function dmd.gettarget(name) return "-of" .. name end dmd.makesettings = { } function dmd.getmakesettings(cfg) local settings = config.mapFlags(cfg, dmd.makesettings) return table.concat(settings) end dmd.tools = { } function dmd.gettoolname(cfg, tool) local names = dmd.tools[cfg.architecture] or dmd.tools[cfg.system] or {} local name = names[tool] return name or dmd[tool] end local p = premake local m = p.modules.d m.visuald = {} require ("vstudio") local vstudio = p.vstudio local workspace = p.workspace local project = p.project local config = p.config local tree = p.tree for k,v in pairs({ "vs2005", "vs2008", "vs2010", "vs2012", "vs2013", "vs2015", "vs2017", "vs2019" }) do local vs = p.action.get(v) if vs ~= nil then table.insert( vs.valid_languages, p.D ) vs.valid_tools.dc = { "dmd", "gdc", "ldc" } p.override(vs, "onProject", function(oldfn, prj) oldfn(prj) if project.isd(prj) then p.generate(prj, ".visualdproj", m.visuald.generate) end end) end end p.override(project, "isnative", function(oldfn, prj) return project.isd(prj) or oldfn(prj) end) p.override(vstudio, "projectfile", function(oldfn, prj) if project.isd(prj) then return p.filename(prj, ".visualdproj") end return oldfn(prj) end) p.override(vstudio, "tool", function(oldfn, prj) if project.isd(prj) then return "002A2DE9-8BB6-484D-9802-7E4AD4084715" end return oldfn(prj) end) m.elements.project = function(prj) return { m.visuald.header, m.visuald.globals, m.visuald.projectConfigurations, m.visuald.files, } end function m.visuald.generate(prj) p.eol("\r\n") p.indent(" ") p.callArray(m.elements.project, prj) _p('') end function m.visuald.header(prj) _p('') end function m.visuald.globals(prj) _p(1,'{%s}', prj.uuid) end function m.visuald.projectConfigurations(prj) for cfg in project.eachconfig(prj) do local prjPlatform = p.esc(vstudio.projectPlatform(cfg)) local slnPlatform = vstudio.solutionPlatform(cfg) local is64bit = slnPlatform == "x64" -- TODO: this seems like a hack _p(1,'', prjPlatform, slnPlatform) _p(2,'0') _p(2,'0') local isWindows = false local isDebug = string.find(cfg.buildcfg, 'Debug') ~= nil local isOptimised = config.isOptimizedBuild(cfg) if cfg.kind == p.CONSOLEAPP then _p(2,'0') _p(2,'1') elseif cfg.kind == p.STATICLIB then _p(2,'1') _p(2,'0') elseif cfg.kind == p.SHAREDLIB then _p(2,'2') _p(2,'0') -- SHOULD THIS BE '2' (windows)?? else _p(2,'0') _p(2,'2') isWindows = true end _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'%s', iif(cfg.flags.Profile, '1', '0')) _p(2,'%s', iif(cfg.flags.Quiet, '1', '0')) _p(2,'%s', iif(cfg.flags.Verbose, '1', '0')) _p(2,'0') _p(2,'%s', iif(cfg.symbols == p.ON or cfg.symbols == "FastLink" or cfg.symbols == "Full", iif(cfg.flags.SymbolsLikeC, '2', '1'), '0')) _p(2,'%s', iif(isOptimised, '1', '0')) _p(2,'0') _p(2,'%s', iif(is64bit, '1', '0')) _p(2,'0') _p(2,'0') _p(2,'%s', iif(isWindows, '1', '0')) _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'%s', iif(cfg.deprecatedfeatures == "Allow", '1', '0')) _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'%s', iif(cfg.boundscheck == "Off", '1', '0')) _p(2,'0') _p(2,'%s', iif(cfg.flags.UnitTest, '1', '0')) _p(2,'%s', iif(cfg.flags.Inline or isOptimised, '1', '0')) _p(2,'%s', iif(cfg.flags.Release or not isDebug, '1', '0')) _p(2,'0') _p(2,'%s', iif(cfg.flags.FatalCompileWarnings, '1', '0')) _p(2,'%s', iif(cfg.warnings and cfg.warnings ~= "Off", '1', '0')) _p(2,'0') _p(2,'0') _p(2,'%s', iif(cfg.pic == "On", '1', '0')) _p(2,'%s', iif(cfg.flags.CodeCoverage, '1', '0')) _p(2,'%s', iif(cfg.floatingpoint and cfg.floatingpoint == "None", '1', '0')) _p(2,'2') _p(2,'0') local compiler = { dmd="0", gdc="1", ldc="2" } local compilerName, err = p.api.checkValue(p.fields.toolset, _OPTIONS.dc or cfg.toolset or "dmd") if err then error { msg=err } end m.visuald.element(2, "compiler", compiler[compilerName]) m.visuald.element(2, "otherDMD", '0') m.visuald.element(2, "program", '$(DMDInstallDir)windows\\bin\\dmd.exe') local impdirs if #cfg.importdirs > 0 then impdirs = vstudio.path(cfg, cfg.importdirs) end m.visuald.element(2, "imppath", impdirs) m.visuald.element(2, "fileImppath") m.visuald.element(2, "outdir", path.translate(project.getrelative(cfg.project, cfg.buildtarget.directory))) m.visuald.element(2, "objdir", path.translate(project.getrelative(cfg.project, cfg.objdir))) m.visuald.element(2, "objname") m.visuald.element(2, "libname") m.visuald.element(2, "doDocComments", iif(cfg.flags.Documentation, '1', '0')) m.visuald.element(2, "docdir", cfg.docdir) m.visuald.element(2, "docname", cfg.docname) m.visuald.element(2, "modules_ddoc") m.visuald.element(2, "ddocfiles") m.visuald.element(2, "doHdrGeneration", iif(cfg.flags.GenerateHeader, '1', '0')) m.visuald.element(2, "hdrdir", cfg.headerdir) m.visuald.element(2, "hdrname", cfg.headername) m.visuald.element(2, "doXGeneration", iif(cfg.flags.GenerateJSON, '1', '0')) m.visuald.element(2, "xfilename", '$(IntDir)\\$(TargetName).json') m.visuald.element(2, "debuglevel", iif(cfg.debuglevel, tostring(cfg.debuglevel), '0')) m.visuald.element(2, "debugids", cfg.debugconstants) m.visuald.element(2, "versionlevel", iif(cfg.versionlevel, tostring(cfg.versionlevel), '0')) m.visuald.element(2, "versionids", cfg.versionconstants) _p(2,'0') _p(2,'0') _p(2,'%s', iif(cfg.kind ~= p.SHAREDLIB or cfg.flags.NoImportLib, '0', '1')) _p(2,'') _p(2,'') _p(2,'') _p(2,'0') _p(2,'') _p(2,'1') -- we will just leave this always enabled, since it's ignored if no debuginfo is written _p(2,'$(VisualDInstallDir)cv2pdb\\cv2pdb.exe') _p(2,'0') _p(2,'0') _p(2,'0') _p(2,'') _p(2,'') _p(2,'') local links local explicit = vstudio.needsExplicitLink(cfg) local toolset = config.toolset(cfg) if toolset then links = toolset.getlinks(cfg, not explicit) else local scope = iif(explicit, "all", "system") links = config.getlinks(cfg, scope, "fullpath") end m.visuald.element(2, "libfiles", table.concat(links, " ")) m.visuald.element(2, "libpaths", cfg.libdirs) _p(2,'') _p(2,'') local target = config.gettargetinfo(cfg) _p(2,'$(OutDir)\\%s', target.name) _p(2,'1') local runtime = 0 if not cfg.flags.OmitDefaultLibrary then if config.isDebugBuild(cfg) then runtime = iif(cfg.flags.StaticRuntime, "2", "4") else runtime = iif(cfg.flags.StaticRuntime, "1", "3") end end m.visuald.element(2, "cRuntime", runtime) local additionalOptions if #cfg.buildoptions > 0 then additionalOptions = table.concat(cfg.buildoptions, " ") end if #cfg.linkoptions > 0 then local linkOpts = table.implode(cfg.linkoptions, "-L", "", " ") if additionalOptions then additionalOptions = additionalOptions .. " " .. linkOpts else additionalOptions = linkOpts end end m.visuald.element(2, "additionalOptions", additionalOptions) if #cfg.prebuildcommands > 0 then _p(2,'%s',p.esc(table.implode(cfg.prebuildcommands, "", "", "\r\n"))) else _p(2,'') end if #cfg.postbuildcommands > 0 then _p(2,'%s',p.esc(table.implode(cfg.postbuildcommands, "", "", "\r\n"))) else _p(2,'') end _p(2,'*.obj;*.cmd;*.build;*.json;*.dep;*.o') _p(1,'') end end function m.visuald.files(prj) _p(1,'', prj.name) local tr = project.getsourcetree(prj) tree.traverse(tr, { onbranchenter = function(node, depth) _p(depth, '', node.name) end, onbranchexit = function(node, depth) _p(depth, '') end, onleaf = function(node, depth) _p(depth, '', path.translate(node.relpath)) end }, false, 2) _p(1,'') end function m.visuald.fileConfiguration(prj, node, depth) end function m.visuald.element(depth, name, value, ...) local isTable = type(value) == "table" if not value or (isTable and #value == 0) then _p(depth, '<%s />', name) else if isTable then value = p.esc(table.implode(value, "", "", ";")) _p(depth, '<%s>%s', name, value, name) else if select('#',...) == 0 then value = p.esc(value) end _x(depth, string.format('<%s>%s', name, value, name), ...) end end end local p = premake require ("vstudio") p.modules.d.vc2010 = {} local vc2010 = p.vstudio.vc2010 local m = p.modules.d.vc2010 m.elements = {} local vstudio = p.vstudio local vc2010 = p.vstudio.vc2010 local config = p.config p.override(vc2010.elements, "configurationProperties", function(oldfn, cfg) local items = oldfn(cfg) if cfg.kind ~= p.UTILITY then table.insert(items, m.dCompiler) end return items end) function m.dCompiler(cfg) local dc = nil if _OPTIONS.dc then local dcMap = { ["dmd"] = "DMD", ["ldc"] = "LDC", } dc = dcMap[_OPTIONS.dc] end if cfg.flags.UseLDC then dc = "LDC" end if dc then if cfg.kind == p.NONE or cfg.kind == p.MAKEFILE then if p.config.hasFile(cfg, path.isdfile) or _ACTION >= "vs2015" then vc2010.element("DCompiler", nil, dc) end else vc2010.element("DCompiler", nil, dc) end end end p.override(vc2010.elements, "itemDefinitionGroup", function(oldfn, cfg) local items = oldfn(cfg) if cfg.kind ~= p.UTILITY then table.insertafter(items, vc2010.clCompile, m.dCompile) end return items end) m.elements.dCompile = function(cfg) return { m.dOptimization, m.dImportPaths, m.dStringImportPaths, m.dVersionConstants, m.dDebugConstants, m.dCompilationModel, m.dPreserveSourcePath, m.dRuntime, m.dCodeGeneration, m.dLanguage, m.dMessages, m.dDocumentation, m.dAdditionalCompileOptions, } end function m.dCompile(cfg) if config.hasFile(cfg, path.isdfile) then p.push('') p.callArray(m.elements.dCompile, cfg) p.pop('') end end vc2010.categories.DCompile = { name = "DCompile", extensions = { ".d" }, priority = 3, emitFiles = function(prj, group) local fileCfgFunc = function(fcfg, condition) if fcfg then return { vc2010.excludedFromBuild, m.dOptimization, m.dImportPaths, m.dStringImportPaths, m.dVersionConstants, m.dDebugConstants, m.dCompilationModel, m.dPreserveSourcePath, m.dRuntime, m.dCodeGeneration, m.dLanguage, m.dMessages, m.dDocumentation, m.dAdditionalCompileOptions, } else return { vc2010.excludedFromBuild } end end vc2010.emitFiles(prj, group, "DCompile", {m.generatedFile}, fileCfgFunc) end, emitFilter = function(prj, group) vc2010.filterGroup(prj, group, "DCompile") end } function m.dOptimization(cfg, condition) local map = { Off="false", On="true", Debug="false", Full="true", Size="true", Speed="true" } if cfg.optimize then vc2010.element('Optimizer', condition, map[cfg.optimize] or "false") end end function m.dImportPaths(cfg, condition) if cfg.importdirs and #cfg.importdirs > 0 then local dirs = vstudio.path(cfg, cfg.importdirs) if #dirs > 0 then vc2010.element("ImportPaths", condition, "%s;%%(ImportPaths)", table.concat(dirs, ";")) end end end function m.dStringImportPaths(cfg, condition) if cfg.stringimportdirs and #cfg.stringimportdirs > 0 then local dirs = vstudio.path(cfg, cfg.stringimportdirs) if #dirs > 0 then vc2010.element("StringImportPaths", condition, "%s;%%(StringImportPaths)", table.concat(dirs, ";")) end end end function m.dVersionConstants(cfg, condition) if cfg.versionconstants and #cfg.versionconstants > 0 then local versionconstants = table.concat(cfg.versionconstants, ";") vc2010.element("VersionIdentifiers", condition, versionconstants) end end function m.dDebugConstants(cfg, condition) if cfg.debugconstants and #cfg.debugconstants > 0 then local debugconstants = table.concat(cfg.debugconstants, ";") vc2010.element("DebugIdentifiers", condition, debugconstants) end end function m.dCompilationModel(cfg, condition) if cfg.compilationmodel and cfg.compilationmodel ~= "Default" then vc2010.element("CompilationModel", condition, cfg.compilationmodel) end end function m.dPreserveSourcePath(cfg, condition) if cfg.flags.RetainPaths then vc2010.element("PreserveSourcePath", condition, "true") end end function m.dRuntime(cfg, condition) if cfg.flags.OmitDefaultLibrary then vc2010.element("CRuntimeLibrary", condition, "None") else local releaseruntime = not config.isDebugBuild(cfg) local staticruntime = true if cfg.staticruntime == "Off" then staticruntime = false end if cfg.runtime == "Debug" then releaseruntime = false elseif cfg.runtime == "Release" then releaseruntime = true end if (cfg.staticruntime and cfg.staticruntime ~= "Default") or (cfg.runtime and cfg.runtime ~= "Default") then if staticruntime == true and releaseruntime == true then vc2010.element("CRuntimeLibrary", condition, "MultiThreaded") elseif staticruntime == true and releaseruntime == false then vc2010.element("CRuntimeLibrary", condition, "MultiThreadedDebug") elseif staticruntime == false and releaseruntime == true then vc2010.element("CRuntimeLibrary", condition, "MultiThreadedDll") elseif staticruntime == false and releaseruntime == false then vc2010.element("CRuntimeLibrary", condition, "MultiThreadedDebugDll") end end end end function m.dCodeGeneration(cfg, condition) if cfg.buildtarget then local ObjectFileName = "" if cfg.buildtarget.basename then if cfg.buildtarget.prefix then ObjectFileName = cfg.buildtarget.prefix end ObjectFileName = ObjectFileName .. cfg.buildtarget.basename .. ".obj" end if cfg.buildtarget.directory then local outdir = vstudio.path(cfg, cfg.buildtarget.directory) ObjectFileName = path.join(outdir, ObjectFileName) end vc2010.element("ObjectFileName", condition, ObjectFileName) end if cfg.flags.Profile then vc2010.element("Profile", condition, "true") end if cfg.flags.ProfileGC then vc2010.element("ProfileGC", condition, "true") end if cfg.flags.CodeCoverage then vc2010.element("Coverage", condition, "true") end if cfg.flags.UnitTest then vc2010.element("Unittest", condition, "true") end if cfg.inlining and cfg.inlining ~= "Default" then local types = { Disabled = "false", Explicit = "true", Auto = "true", } vc2010.element("Inliner", condition, types[cfg.inlining]) end if cfg.flags.StackFrame then vc2010.element("StackFrame", condition, "true") end if cfg.flags.StackStomp then vc2010.element("StackStomp", condition, "true") end if cfg.flags.AllInstantiate then vc2010.element("AllInst", condition, "true") end if cfg.flags.Main then vc2010.element("Main", condition, "true") end if _OPTIONS.dc ~= "ldc" and not cfg.flags.UseLDC then if cfg.vectorextensions then local vextMap = { AVX = "avx", AVX2 = "avx2", } if vextMap[cfg.vectorextensions] ~= nil then vc2010.element("CPUArchitecture", condition, vextMap[cfg.vectorextensions]) end end end if config.isDebugBuild(cfg) then vc2010.element("DebugCode", condition, "Debug") else vc2010.element("DebugCode", condition, "Release") end if cfg.symbols then if cfg.symbols == p.Off then vc2010.element("DebugInfo", condition, "None") elseif cfg.symbols ~= "Default" then vc2010.element("DebugInfo", condition, iif(cfg.flags.SymbolsLikeC, "VS", "Mago")) end end if cfg.boundscheck and cfg.boundscheck ~= "Default" then local types = { Off = "Off", SafeOnly = "SafeOnly", On = "On", } vc2010.element("BoundsCheck", condition, types[cfg.boundscheck]) end if cfg.flags.PerformSyntaxCheckOnly then vc2010.element("PerformSyntaxCheckOnly", condition, "true") end end function m.dLanguage(cfg, condition) if cfg.flags.BetterC then vc2010.element("BetterC", condition, "true") end if #cfg.preview > 0 then for _, opt in ipairs(cfg.preview) do if opt == "dip25" then vc2010.element("DIP25", condition, "true") elseif opt == "dip1000" then vc2010.element("DIP1000", condition, "true") elseif opt == "dip1008" then vc2010.element("DIP1008", condition, "true") elseif opt == "fieldwise" then vc2010.element("PreviewFieldwise", condition, "true") elseif opt == "dtorfields" then vc2010.element("PreviewDtorFields", condition, "true") elseif opt == "intpromote" then vc2010.element("PreviewIntPromote", condition, "true") elseif opt == "fixAliasThis" then vc2010.element("PreviewFixAliasThis", condition, "true") end end end if #cfg.revert > 0 then for _, opt in ipairs(cfg.revert) do if opt == "import" then vc2010.element("RevertImport", condition, "true") end end end end function m.dMessages(cfg, condition) if cfg.warnings == p.OFF then vc2010.element("Warnings", condition, "None") elseif cfg.warnings and cfg.warnings ~= "Default" then vc2010.element("Warnings", condition, iif(cfg.flags.FatalCompileWarnings, "Error", "Info")) end if cfg.deprecatedfeatures and cfg.deprecatedfeatures ~= "Default" then local types = { Error = "Error", Warn = "Info", Allow = "Allow", } vc2010.element("Deprecations", condition, types[cfg.deprecatedfeatures]) end if cfg.flags.ShowCommandLine then vc2010.element("ShowCommandLine", condition, "true") end if cfg.flags.Verbose then vc2010.element("Verbose", condition, "true") end if cfg.flags.ShowTLS then vc2010.element("ShowTLS", condition, "true") end if cfg.flags.ShowGC then vc2010.element("ShowGC", condition, "true") end if cfg.flags.IgnorePragma then vc2010.element("IgnorePragma", condition, "true") end if cfg.flags.ShowDependencies then vc2010.element("ShowDependencies", condition, "true") end if #cfg.transition > 0 then for _, opt in ipairs(cfg.transition) do if opt == "field" then vc2010.element("TransitionField", condition, "true") elseif opt == "checkimports" then vc2010.element("TransitionCheckImports", condition, "true") elseif opt == "complex" then vc2010.element("TransitionComplex", condition, "true") end end end end function m.dDocumentation(cfg, condition) if cfg.docdir then vc2010.element("DocDir", condition, cfg.docdir) end if cfg.docname then vc2010.element("DocFile", condition, cfg.docname) end if #cfg.preview > 0 then for _, opt in ipairs(cfg.preview) do if opt == "markdown" then vc2010.element("PreviewMarkdown", condition, "true") end end end if #cfg.transition > 0 then for _, opt in ipairs(cfg.transition) do if opt == "vmarkdown" then vc2010.element("TransitionVMarkdown", condition, "true") end end end if cfg.dependenciesfile then vc2010.element("DepFile", condition, cfg.dependenciesfile) end if cfg.headerdir then vc2010.element("HeaderDir", condition, cfg.headerdir) end if cfg.headername then vc2010.element("HeaderFile", condition, cfg.headername) end if cfg.jsonfile then vc2010.element("JSONFile", condition, cfg.jsonfile) end end function m.dAdditionalCompileOptions(cfg, condition) local opts = cfg.buildoptions if cfg.flags.LowMem then table.insert(opts, "-lowmem") end if cfg.cppdialect and cfg.cppdialect ~= "Default" then local cppMap = { ["C++latest"] = "c++20", ["C++98"] = "c++98", ["C++0x"] = "c++11", ["C++11"] = "c++11", ["C++1y"] = "c++14", ["C++14"] = "c++14", ["C++1z"] = "c++17", ["C++17"] = "c++17", ["C++2a"] = "c++20", ["C++20"] = "c++20", ["gnu++98"] = "c++98", ["gnu++0x"] = "c++11", ["gnu++11"] = "c++11", ["gnu++1y"] = "c++14", ["gnu++14"] = "c++14", ["gnu++1z"] = "c++17", ["gnu++17"] = "c++17", ["gnu++2a"] = "c++20", ["gnu++20"] = "c++20", } if cppMap[cfg.cppdialect] ~= nil then table.insert(opts, "-extern-std=" .. cppMap[cfg.cppdialect]) end end if _OPTIONS.dc == "ldc" or cfg.flags.UseLDC then if cfg.vectorextensions then local vextMap = { AVX = "avx", AVX2 = "avx2", SSE = "sse", SSE2 = "sse2", SSE3 = "sse3", SSSE3 = "ssse3", ["SSE4.1"] = "sse4.1", ["SSE4.2"] = "sse4.2", } if vextMap[cfg.vectorextensions] ~= nil then table.insert(opts, "-mattr=+" .. vextMap[cfg.vectorextensions]) end end if #cfg.isaextensions > 0 then local isaMap = { MOVBE = "movbe", POPCNT = "popcnt", PCLMUL = "pclmul", LZCNT = "lzcnt", BMI = "bmi", BMI2 = "bmi2", F16C = "f16c", AES = "aes", FMA = "fma", FMA4 = "fma4", RDRND = "rdrnd", } for _, ext in ipairs(cfg.isaextensions) do if isaMap[ext] ~= nil then table.insert(opts, "-mattr=+" .. isaMap[ext]) end end end if #cfg.computetargets > 0 then table.insert(opts, "-mdcompute-targets=" .. table.concat(cfg.computetargets, ',')) end end if #opts > 0 then opts = table.concat(opts, " ") vc2010.element("AdditionalOptions", condition, '%s %%(AdditionalOptions)', opts) end end local p = premake local m = p.modules.d m.make = {} local dmake = m.make require ("gmake") local make = p.make local cpp = p.make.cpp local project = p.project local config = p.config local fileconfig = p.fileconfig local gmake = p.action.get( 'gmake' ) if gmake == nil then error( "Failed to locate prequisite action 'gmake'" ) end gmake.valid_languages = table.join(gmake.valid_languages, { p.D } ) gmake.valid_tools.dc = { "dmd", "gdc", "ldc" } function m.make.separateCompilation(prj) local some = false local all = true for cfg in project.eachconfig(prj) do if cfg.compilationmodel == "File" then some = true else all = false end end return iif(all, "all", iif(some, "some", "none")) end p.override( gmake, "onProject", function(oldfn, prj) p.escaper(make.esc) if project.isd(prj) then local makefile = make.getmakefilename(prj, true) p.generate(prj, makefile, m.make.generate) return end oldfn(prj) end) p.override( make, "objdir", function(oldfn, cfg) if cfg.project.language ~= "D" or cfg.compilationmodel == "File" then oldfn(cfg) end end) p.override( make, "objDirRules", function(oldfn, prj) if prj.language ~= "D" or m.make.separateCompilation(prj) ~= "none" then oldfn(prj) end end) m.elements = {} m.elements.makefile = function(prj) return { make.header, make.phonyRules, m.make.configs, m.make.objects,-- TODO: This is basically identical to make.cppObjects(), and should ideally be merged/shared make.shellType, m.make.targetRules, make.targetDirRules, make.objDirRules, make.cppCleanRules,-- D clean code is identical to C/C++ make.preBuildRules, make.preLinkRules, m.make.dFileRules, } end function m.make.generate(prj) p.callArray(m.elements.makefile, prj) end function m.make.buildRule(prj) _p('$(TARGET): $(SOURCEFILES) $(LDDEPS)') _p('\t@echo Building %s', prj.name) _p('\t$(SILENT) $(BUILDCMD)') _p('\t$(POSTBUILDCMDS)') end function m.make.linkRule(prj) _p('$(TARGET): $(OBJECTS) $(LDDEPS)') _p('\t@echo Linking %s', prj.name) _p('\t$(SILENT) $(LINKCMD)') _p('\t$(POSTBUILDCMDS)') end function m.make.targetRules(prj) local separateCompilation = m.make.separateCompilation(prj) if separateCompilation == "all" then m.make.linkRule(prj) elseif separateCompilation == "none" then m.make.buildRule(prj) else for cfg in project.eachconfig(prj) do _x('ifeq ($(config),%s)', cfg.shortname) if cfg.compilationmodel == "File" then m.make.linkRule(prj) else m.make.buildRule(prj) end _p('endif') end end _p('') end function m.make.dFileRules(prj) local separateCompilation = m.make.separateCompilation(prj) if separateCompilation ~= "none" then make.cppFileRules(prj) end end p.override(cpp, "standardFileRules", function(oldfn, prj, node) if path.isdfile(node.abspath) then _p('\t$(SILENT) $(DC) $(ALL_DFLAGS) $(OUTPUTFLAG) -c $<') else oldfn(prj, node) end end) p.override(make, "fileType", function(oldfn, node) if path.isdfile(node.abspath) then return "objects" else return oldfn(node) end end) m.elements.makeconfig = function(cfg) return { m.make.dTools, make.target, m.make.target, make.objdir, m.make.versions, m.make.debug, m.make.imports, m.make.stringImports, m.make.dFlags, make.libs, make.ldDeps, make.ldFlags, m.make.linkCmd, make.preBuildCmds, make.preLinkCmds, make.postBuildCmds, m.make.allRules, make.settings, } end function m.make.configs(prj) for cfg in project.eachconfig(prj) do local toolset = m.make.getToolset(cfg) if not toolset then error("Invalid toolset '" + (_OPTIONS.dc or cfg.toolset) + "'") end _x('ifeq ($(config),%s)', cfg.shortname) p.callArray(m.elements.makeconfig, cfg, toolset) _p('endif') _p('') end end function m.make.getToolset(cfg) local toolset, err = p.api.checkValue(p.fields.toolset, _OPTIONS.dc or cfg.toolset or "dmd") if err then error { msg=err } end return p.tools[toolset] end function m.make.dTools(cfg, toolset) local tool = toolset.gettoolname(cfg, "dc") if tool then _p(' DC = %s', tool) end end function m.make.target(cfg, toolset) if cfg.compilationmodel == "File" then _p(' OUTPUTFLAG = %s', toolset.gettarget('"$@"')) end end function m.make.versions(cfg, toolset) _p(' VERSIONS +=%s', make.list(toolset.getversions(cfg.versionconstants, cfg.versionlevel))) end function m.make.debug(cfg, toolset) _p(' DEBUG +=%s', make.list(toolset.getdebug(cfg.debugconstants, cfg.debuglevel))) end function m.make.imports(cfg, toolset) local imports = p.esc(toolset.getimportdirs(cfg, cfg.importdirs)) _p(' IMPORTS +=%s', make.list(imports)) end function m.make.stringImports(cfg, toolset) local stringImports = p.esc(toolset.getstringimportdirs(cfg, cfg.stringimportdirs)) _p(' STRINGIMPORTS +=%s', make.list(stringImports)) end function m.make.dFlags(cfg, toolset) _p(' ALL_DFLAGS += $(DFLAGS)%s $(VERSIONS) $(DEBUG) $(IMPORTS) $(STRINGIMPORTS) $(ARCH)', make.list(table.join(toolset.getdflags(cfg), cfg.buildoptions))) end function m.make.linkCmd(cfg, toolset) if cfg.compilationmodel == "File" then _p(' LINKCMD = $(DC) ' .. toolset.gettarget("$(TARGET)") .. ' $(ALL_LDFLAGS) $(LIBS) $(OBJECTS)') else _p(' BUILDCMD = $(DC) ' .. toolset.gettarget("$(TARGET)") .. ' $(ALL_DFLAGS) $(ALL_LDFLAGS) $(LIBS) $(SOURCEFILES)') end end function m.make.allRules(cfg, toolset) if cfg.compilationmodel == "File" then _p('all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)') else _p('all: $(TARGETDIR) prebuild prelink $(TARGET)') end _p('\t@:') end function m.make.objects(prj) local root = { sourcefiles={}, objects={} } local configs = {} for cfg in project.eachconfig(prj) do configs[cfg] = { sourcefiles={}, objects={} } end local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) local incfg = {} local inall = true local custom = false for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) if filecfg and not filecfg.flags.ExcludeFromBuild then incfg[cfg] = filecfg custom = fileconfig.hasCustomBuildRule(filecfg) else inall = false end end if not custom then if not path.isdfile(node.abspath) then return end local sourcename = node.relpath local objectname = "$(OBJDIR)/" .. node.objname .. ".o" if inall then table.insert(root.sourcefiles, sourcename) table.insert(root.objects, objectname) else for cfg in project.eachconfig(prj) do if incfg[cfg] then table.insert(configs[cfg].sourcefiles, sourcename) table.insert(configs[cfg].objects, objectname) end end end else for cfg in project.eachconfig(prj) do local filecfg = incfg[cfg] if filecfg then local output = project.getrelative(prj, filecfg.buildoutputs[1]) if path.isobjectfile(output) then table.insert(configs[cfg].objects, output) end end end end end }) local separateCompilation = m.make.separateCompilation(prj) function listobjects(var, list) _p('%s \\', var) for _, objectname in ipairs(list) do _x('\t%s \\', objectname) end _p('') end if separateCompilation ~= "all" then listobjects('SOURCEFILES :=', root.sourcefiles) end if separateCompilation ~= "none" then listobjects('OBJECTS :=', root.objects, 'o') end for cfg in project.eachconfig(prj) do local files = configs[cfg] if (#files.sourcefiles > 0 and separateCompilation ~= "all") or (#files.objects > 0 and separateCompilation ~= "none") then _x('ifeq ($(config),%s)', cfg.shortname) if #files.sourcefiles > 0 and separateCompilation ~= "all" then listobjects(' SOURCEFILES +=', files.sourcefiles) end if #files.objects > 0 and separateCompilation ~= "none" then listobjects(' OBJECTS +=', files.objects) end _p('endif') end end _p('') end local p = premake p.modules.d = {} local m = p.modules.d m._VERSION = p._VERSION m.elements = {} local api = p.api function p.project.isd(prj) return prj.language == p.D end function path.isdfile(fname) return path.hasextension(fname, { ".d" }) end function path.isdheader(fname) return path.hasextension(fname, { ".di" }) end include( "tools/dmd.lua" ) include( "tools/gdc.lua" ) include( "tools/ldc.lua" ) include( "actions/gmake.lua" ) include( "actions/vcxproj.lua" ) include( "actions/visuald.lua" ) return m local p = premake local api = p.api p.D = "D" api.addAllowed("language", p.D) api.addAllowed("floatingpoint", "None") api.addAllowed("flags", { "CodeCoverage", "Color", "Documentation", "GenerateHeader", "GenerateJSON", "GenerateMap", "LowMem", "Profile", "Quiet", "RetainPaths", "SymbolsLikeC", "UnitTest", "UseLDC", "ProfileGC", "StackFrame", "StackStomp", "AllInstantiate", "BetterC", "Main", "PerformSyntaxCheckOnly", "ShowCommandLine", "Verbose", "ShowTLS", "ShowGC", "IgnorePragma", "ShowDependencies", }) api.addAllowed("toolset", { "dmd", "gdc", "ldc", }) api.register { name = "boundscheck", scope = "config", kind = "string", allowed = { "Default", "Off", "On", "SafeOnly", }, } api.register { name = "compilationmodel", scope = "config", kind = "string", allowed = { "Default", "File", "Package",-- TODO: this doesn't work with gmake!! "Project", }, } api.register { name = "checkaction", scope = "config", kind = "string", allowed = { "Default", "D", "C", "Halt", "Context", }, } api.register { name = "computetargets", scope = "config", kind = "list:string", } api.register { name = "debugconstants", scope = "config", kind = "list:string", tokens = true, } api.register { name = "debuglevel", scope = "config", kind = "integer", } api.register { name = "dependenciesfile", scope = "config", kind = "path", tokens = true, } api.register { name = "deprecatedfeatures", scope = "config", kind = "string", allowed = { "Default", "Allow", "Warn", "Error", }, } api.register { name = "docdir", scope = "config", kind = "path", tokens = true, } api.register { name = "docname", scope = "config", kind = "string", tokens = true, } api.register { name = "headerdir", scope = "config", kind = "path", tokens = true, } api.register { name = "headername", scope = "config", kind = "string", tokens = true, } api.register { name = "jsonfile", scope = "config", kind = "path", tokens = true, } api.register { name = "importdirs", scope = "config", kind = "list:path", tokens = true, } api.register { name = "preview", scope = "config", kind = "list:string", allowed = { "dip25", "dip1000", "dip1008", "fieldwise", "markdown", "fixAliasThis", "intpromote", "dtorfields", }, } api.register { name = "revert", scope = "config", kind = "list:string", allowed = { "dip25", "import", }, } api.register { name = "stringimportdirs", scope = "config", kind = "list:path", tokens = true, } api.register { name = "transition", scope = "config", kind = "list:string", allowed = { "field", "checkimports", "complex", "tls", "vmarkdown", }, } api.register { name = "versionconstants", scope = "config", kind = "list:string", tokens = true, } api.register { name = "versionlevel", scope = "config", kind = "integer", } newoption { category= "compilers", trigger= "dc", value= "VALUE", description= "Choose a D compiler", allowed = { { "dmd", "Digital Mars (dmd)" }, { "gdc", "GNU GDC (gdc)" }, { "ldc", "LLVM LDC (ldc2)" }, } } return function (cfg) return (cfg.language == p.D or cfg.language == "C" or cfg.language == "C++") end local p = premake local tree = p.tree local project = p.project local config = p.config local codelite = p.modules.codelite codelite.project = {} local m = codelite.project function codelite.getLinks(cfg) return config.getlinks(cfg, "system", "fullpath") end function codelite.getSiblingLinks(cfg) return config.getlinks(cfg, "siblings", "fullpath") end m.elements = {} m.ctools = { gcc = "gnu gcc", clang = "clang", msc = "Visual C++", } m.cxxtools = { gcc = "gnu g++", clang = "clang++", msc = "Visual C++", } function m.getcompilername(cfg) local tool = _OPTIONS.cc or cfg.toolset or p.CLANG local toolset = p.tools[tool] if not toolset then error("Invalid toolset '" + (_OPTIONS.cc or cfg.toolset) + "'") end if p.languages.isc(cfg.language) then return m.ctools[tool] elseif p.languages.iscpp(cfg.language) then return m.cxxtools[tool] end end function m.getcompiler(cfg) local toolset = p.tools[_OPTIONS.cc or cfg.toolset or p.CLANG] if not toolset then error("Invalid toolset '" + (_OPTIONS.cc or cfg.toolset) + "'") end return toolset end local function configuration_iscustombuild(cfg) return cfg and (cfg.kind == p.MAKEFILE) and (#cfg.buildcommands > 0) end local function configuration_isfilelist(cfg) return cfg and (cfg.buildaction == "None") and not configuration_iscustombuild(cfg) end local function configuration_needresoptions(cfg) return cfg and config.findfile(cfg, ".rc") and not configuration_iscustombuild(cfg) end m.internalTypeMap = { ConsoleApp = "Console", WindowedApp = "Console", Makefile = "", SharedLib = "Library", StaticLib = "Library" } function m.header(prj) _p('') local type = m.internalTypeMap[prj.kind] or "" _x('', prj.name, type) end function m.plugins(prj) _p(1, '') end function m.description(prj) _p(1, '') end function m.files(prj) local tr = project.getsourcetree(prj) tree.traverse(tr, { onbranchenter = function(node, depth) _p(depth, '', node.name) end, onbranchexit = function(node, depth) _p(depth, '') end, onleaf = function(node, depth) local excludesFromBuild = {} for cfg in project.eachconfig(prj) do local cfgname = codelite.cfgname(cfg) local fcfg = p.fileconfig.getconfig(node, cfg) if not fcfg or fcfg.flags.ExcludeFromBuild then table.insert(excludesFromBuild, cfgname) end end if #excludesFromBuild > 0 then _p(depth, '', node.relpath, table.concat(excludesFromBuild, ';')) else _p(depth, '', node.relpath) end end, }, true) end function m.dependencies(prj) local dependencies = project.getdependencies(prj) for cfg in project.eachconfig(prj) do cfgname = codelite.cfgname(cfg) if #dependencies > 0 then _p(1, '', cfgname) for _, dependency in ipairs(dependencies) do _p(2, '', dependency.name) end _p(1, '') else _p(1, '', cfgname) end end end function m.global_compiler(prj) _p(3, '') _p(4, '') _p(3, '') end function m.global_linker(prj) _p(3, '') _p(4, '') _p(3, '') end function m.global_resourceCompiler(prj) _p(3, '') end m.elements.globalSettings = function(prj) return { m.global_compiler, m.global_linker, m.global_resourceCompiler, } end function m.compiler(cfg) if configuration_iscustombuild(cfg) or configuration_isfilelist(cfg) then _p(3, '') return end local toolset = m.getcompiler(cfg) local sysincludedirs = toolset.getincludedirs(cfg, {}, cfg.sysincludedirs, cfg.frameworkdirs) local forceincludes = toolset.getforceincludes(cfg) local cxxflags = table.concat(table.join(sysincludedirs, toolset.getcxxflags(cfg), forceincludes, cfg.buildoptions), ";") local cflags = table.concat(table.join(sysincludedirs, toolset.getcflags(cfg), forceincludes, cfg.buildoptions), ";") local asmflags = "" local pch = p.tools.gcc.getpch(cfg) local usepch = "yes" if pch == nil then pch = ""; usepch = "no" end _x(3, '', cxxflags, cflags, asmflags, pch, usepch) for _, includedir in ipairs(cfg.includedirs) do _x(4, '', project.getrelative(cfg.project, includedir)) end for _, define in ipairs(cfg.defines) do _p(4, '', p.esc(define):gsub(' ', '\\ ')) end _p(3, '') end function m.linker(cfg) if configuration_iscustombuild(cfg) or configuration_isfilelist(cfg) then _p(3, '') return end local toolset = m.getcompiler(cfg) local flags = table.join(toolset.getldflags(cfg), toolset.getincludedirs(cfg, {}, nil, cfg.frameworkdirs), toolset.getrunpathdirs(cfg, table.join(cfg.runpathdirs, config.getsiblingtargetdirs(cfg))), cfg.linkoptions, toolset.getlinks(cfg)) _x(3, '', table.concat(flags, ";")) for _, libdir in ipairs(cfg.libdirs) do _p(4, '', project.getrelative(cfg.project, libdir)) end _p(3, '') end function m.resourceCompiler(cfg) if not configuration_needresoptions(cfg) then _p(3, '') return end local toolset = m.getcompiler(cfg) local defines = table.implode(toolset.getdefines(table.join(cfg.defines, cfg.resdefines)), "", ";", "") local options = table.concat(cfg.resoptions, ";") _x(3, '', defines, options) for _, includepath in ipairs(table.join(cfg.sysincludedirs, cfg.includedirs, cfg.resincludedirs)) do _x(4, '', project.getrelative(cfg.project, includepath)) end _p(3, '') end function m.general(cfg) if configuration_isfilelist(cfg) then _p(3, '') return end local prj = cfg.project local isExe = prj.kind == "WindowedApp" or prj.kind == "ConsoleApp" local targetpath = project.getrelative(prj, cfg.buildtarget.directory) local objdir = project.getrelative(prj, cfg.objdir) local targetname = project.getrelative(prj, cfg.buildtarget.abspath) local workingdir = cfg.debugdir or prj.location local command = iif(isExe, path.getrelative(workingdir, cfg.buildtarget.abspath), "") local cmdargs = iif(isExe, table.concat(cfg.debugargs, " "), "") -- TODO: should this be debugargs instead? local useseparatedebugargs = "no" local debugargs = "" local workingdir = iif(isExe, project.getrelative(prj, cfg.debugdir), "") local pauseexec = iif(prj.kind == "ConsoleApp", "yes", "no") local isguiprogram = iif(prj.kind == "WindowedApp", "yes", "no") local isenabled = iif(cfg.flags.ExcludeFromBuild, "no", "yes") _x(3, '', targetname, objdir, command, cmdargs, useseparatedebugargs, debugargs, workingdir, pauseexec, isguiprogram, isenabled) end function m.environment(cfg) local envs = table.concat(cfg.debugenvs, "\n") _p(3, '') _p(4, '', envs) _p(3, '') end function m.debugger(cfg) _p(3, '', iif(cfg.debugremotehost, "yes", "no"), cfg.debugremotehost or "", iif(cfg.debugport, tostring(cfg.debugport), ""), iif(cfg.debugextendedprotocol, "yes", "no")) if #cfg.debugsearchpaths > 0 then p.escaper(codelite.escElementText) _p(4, '%s', table.concat(p.esc(project.getrelative(cfg.project, cfg.debugsearchpaths)), "\n")) p.escaper(codelite.esc) else _p(4, '') end if #cfg.debugconnectcommands > 0 then p.escaper(codelite.escElementText) _p(4, '%s', table.concat(p.esc(cfg.debugconnectcommands), "\n")) p.escaper(codelite.esc) else _p(4, '') end if #cfg.debugstartupcommands > 0 then p.escaper(codelite.escElementText) _p(4, '%s', table.concat(p.esc(cfg.debugstartupcommands), "\n")) p.escaper(codelite.esc) else _p(4, '') end _p(3, '') end function m.preBuild(cfg) if #cfg.prebuildcommands > 0 or cfg.prebuildmessage then _p(3, '') p.escaper(codelite.escElementText) if cfg.prebuildmessage then local command = os.translateCommandsAndPaths("@{ECHO} " .. cfg.prebuildmessage, cfg.project.basedir, cfg.project.location) _x(4, '%s', command) end local commands = os.translateCommandsAndPaths(cfg.prebuildcommands, cfg.project.basedir, cfg.project.location) for _, command in ipairs(commands) do _x(4, '%s', command) end p.escaper(codelite.esc) _p(3, '') end end function m.postBuild(cfg) if #cfg.postbuildcommands > 0 or cfg.postbuildmessage then _p(3, '') p.escaper(codelite.escElementText) if cfg.postbuildmessage then local command = os.translateCommandsAndPaths("@{ECHO} " .. cfg.postbuildmessage, cfg.project.basedir, cfg.project.location) _x(4, '%s', command) end local commands = os.translateCommandsAndPaths(cfg.postbuildcommands, cfg.project.basedir, cfg.project.location) for _, command in ipairs(commands) do _x(4, '%s', command) end p.escaper(codelite.esc) _p(3, '') end end function m.customBuild(cfg) if not configuration_iscustombuild(cfg) then _p(3, '') return end local build = table.implode(cfg.buildcommands,"","","") local clean = table.implode(cfg.cleancommands,"","","") local rebuild = table.implode(cfg.rebuildcommands,"","","") _p(3, '') _x(4, '%s', build) _x(4, '%s', clean) _x(4, '%s', rebuild) _p(4, '') _p(4, '') _p(4, '') _p(4, '') _p(4, '') _p(3, '') end function m.additionalRules(cfg) if configuration_iscustombuild(cfg) then _p(3, '') return end _p(3, '') _p(4, '') local dependencies = {} local makefilerules = {} local function addrule(dependencies, makefilerules, config, filename) if #config.buildcommands == 0 or #config.buildOutputs == 0 then return false end local inputs = table.implode(project.getrelative(cfg.project, config.buildInputs), "", "", " ") if filename ~= "" and inputs ~= "" then filename = filename .. " " end local outputs = project.getrelative(cfg.project, config.buildOutputs[1]) local buildmessage = "" if config.buildmessage then buildmessage = "\t@{ECHO} " .. config.buildmessage .. "\n" end local commands = table.implode(config.buildCommands,"\t","\n","") table.insert(makefilerules, os.translateCommandsAndPaths(outputs .. ": " .. filename .. inputs .. "\n" .. buildmessage .. commands, cfg.project.basedir, cfg.project.location)) table.insertflat(dependencies, outputs) return true end local tr = project.getsourcetree(cfg.project) p.tree.traverse(tr, { onleaf = function(node, depth) local filecfg = p.fileconfig.getconfig(node, cfg) local prj = cfg.project local rule = p.global.getRuleForFile(node.name, prj.rules) if not addrule(dependencies, makefilerules, filecfg, node.relpath) and rule then local environ = table.shallowcopy(filecfg.environ) if rule.propertydefinition then p.rule.prepareEnvironment(rule, environ, cfg) p.rule.prepareEnvironment(rule, environ, filecfg) end local rulecfg = p.context.extent(rule, environ) addrule(dependencies, makefilerules, rulecfg, node.relpath) end end }) addrule(dependencies, makefilerules, cfg, "") if #makefilerules == 0 and #dependencies == 0 then _p(4, '') else _p(4, '' .. table.implode(dependencies,"",""," ")) _p(0, table.implode(makefilerules,"","","\n") .. '') end _p(3, '') end function m.isCpp11(cfg) return (cfg.cppdialect == 'gnu++11') or (cfg.cppdialect == 'C++11') or (cfg.cppdialect == 'gnu++0x') or (cfg.cppdialect == 'C++0x') end function m.isCpp14(cfg) return (cfg.cppdialect == 'gnu++14') or (cfg.cppdialect == 'C++14') or (cfg.cppdialect == 'gnu++1y') or (cfg.cppdialect == 'C++1y') end function m.completion(cfg) _p(3, '', iif(m.isCpp11(cfg), "yes", "no"), iif(m.isCpp14(cfg), "yes", "no") ) _p(4, '') _p(4, '') _p(4, '') -- TODO: we might want to set special code completion macros...? _p(4, '') -- TODO: search paths for code completion? _p(3, '') end m.elements.settings = function(cfg) return { m.compiler, m.linker, m.resourceCompiler, m.general, m.environment, m.debugger, m.preBuild, m.postBuild, m.customBuild, m.additionalRules, m.completion, } end m.types = { ConsoleApp = "Executable", Makefile = "", SharedLib = "Dynamic Library", StaticLib = "Static Library", WindowedApp = "Executable", Utility = "", } m.debuggers = { Default = "GNU gdb debugger", GDB = "GNU gdb debugger", LLDB = "LLDB Debugger", } function m.settings(prj) _p(1, '', m.types[prj.kind] or "") _p(2, '') p.callArray(m.elements.globalSettings, prj) _p(2, '') for cfg in project.eachconfig(prj) do local cfgname = codelite.cfgname(cfg) local compiler = m.getcompilername(cfg) local debugger = m.debuggers[cfg.debugger] or m.debuggers.Default local type = m.types[cfg.kind] _x(2, '', cfgname, compiler, debugger, type) p.callArray(m.elements.settings, cfg) _p(2, '') end _p(1, '') end m.elements.project = function(prj) return { m.header, m.plugins, m.description, m.files, m.dependencies, m.settings, } end function m.generate(prj) p.utf8() p.callArray(m.elements.project, prj) _p('') end local p = premake local project = p.project local workspace = p.workspace local tree = p.tree local codelite = p.modules.codelite codelite.workspace = {} local m = codelite.workspace function m.generate(wks) p.utf8() p.w('') local tagsdb = "" p.push('', wks.name, tagsdb) local tr = workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) local prj = n.project local prjpath = p.filename(prj, ".project") prjpath = path.getrelative(prj.workspace.location, prjpath) if (prj.name == wks.startproject) then p.w('', prj.name, prjpath) else p.w('', prj.name, prjpath) end end, onbranchenter = function(n) p.push('', n.name) end, onbranchexit = function(n) p.pop('') end, }) local platformsPresent = {} local numPlatforms = 0 for cfg in workspace.eachconfig(wks) do local platform = cfg.platform if platform and not platformsPresent[platform] then numPlatforms = numPlatforms + 1 platformsPresent[platform] = true end end if numPlatforms >= 2 then codelite.workspace.multiplePlatforms = true end p.push('') local selected = "yes" -- only one configuration should be selected for cfg in workspace.eachconfig(wks) do local cfgname = codelite.cfgname(cfg) p.push('', cfgname, selected) selected = "no" local tr = workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) local prj = n.project p.w('', prj.name, cfgname) end }) p.pop('') end p.pop('') p.pop('') end local p = premake p.modules.codelite = {} p.modules.codelite._VERSION = p._VERSION local codelite = p.modules.codelite local project = p.project function codelite.cfgname(cfg) local cfgname = cfg.buildcfg if codelite.workspace.multiplePlatforms then cfgname = string.format("%s-%s", cfg.platform, cfg.buildcfg) end return cfgname end function codelite.escElementText(value) local result = value:gsub('&', '&') result = result:gsub('<', '<') result = result:gsub('>', '>') return result end function codelite.esc(value) local result = value:gsub('&', '&') result = result:gsub('<', '<') result = result:gsub('>', '>') result = result:gsub('"', '"') return result end function codelite.generateWorkspace(wks) p.eol("\r\n") p.indent(" ") p.escaper(codelite.esc) p.generate(wks, ".workspace", codelite.workspace.generate) end function codelite.generateProject(prj) p.eol("\r\n") p.indent(" ") p.escaper(codelite.esc) if project.isc(prj) or project.iscpp(prj) then p.generate(prj, ".project", codelite.project.generate) end end function codelite.cleanWorkspace(wks) p.clean.file(wks, wks.name .. ".workspace") p.clean.file(wks, wks.name .. "_wsp.mk") p.clean.file(wks, wks.name .. ".tags") p.clean.file(wks, ".clang") end function codelite.cleanProject(prj) p.clean.file(prj, prj.name .. ".project") p.clean.file(prj, prj.name .. ".mk") p.clean.file(prj, prj.name .. ".list") p.clean.file(prj, prj.name .. ".out") end function codelite.cleanTarget(prj) end include("codelite_workspace.lua") include("codelite_project.lua") return codelite local p = premake newaction { trigger = "codelite", shortname = "CodeLite", description = "Generate CodeLite project files", toolset = "clang", valid_kinds = { "ConsoleApp", "WindowedApp", "Makefile", "SharedLib", "StaticLib", "Utility" }, valid_languages = { "C", "C++" }, valid_tools = { cc = { "gcc", "clang", "msc" } }, onWorkspace = function(wks) p.modules.codelite.generateWorkspace(wks) end, onProject = function(prj) p.modules.codelite.generateProject(prj) end, onCleanWorkspace = function(wks) p.modules.codelite.cleanWorkspace(wks) end, onCleanProject = function(prj) p.modules.codelite.cleanProject(prj) end, onCleanTarget = function(prj) p.modules.codelite.cleanTarget(prj) end, } return function(cfg) return (_ACTION == "codelite") end local p = premake local gmake2 = p.modules.gmake2 local tree = p.tree local project = p.project function gmake2.generate_workspace(wks) p.eol("\n") gmake2.header(wks) gmake2.configmap(wks) gmake2.projects(wks) gmake2.workspacePhonyRule(wks) gmake2.groupRules(wks) gmake2.projectrules(wks) gmake2.cleanrules(wks) gmake2.helprule(wks) end function gmake2.configmap(wks) local first = true for cfg in p.workspace.eachconfig(wks) do if first then _p('ifeq ($(config),%s)', cfg.shortname) first = false else _p('else ifeq ($(config),%s)', cfg.shortname) end for prj in p.workspace.eachproject(wks) do local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) if prjcfg then _p(' %s_config = %s', gmake2.tovar(prj.name), prjcfg.shortname) end end _p('') end if not first then _p('else') _p(' $(error "invalid configuration $(config)")') _p('endif') _p('') end end function gmake2.cleanrules(wks) _p('clean:') for prj in p.workspace.eachproject(wks) do local prjpath = p.filename(prj, gmake2.getmakefilename(prj, true)) local prjdir = path.getdirectory(path.getrelative(wks.location, prjpath)) local prjname = path.getname(prjpath) _x(1,'@${MAKE} --no-print-directory -C %s -f %s clean', prjdir, prjname) end _p('') end function gmake2.helprule(wks) _p('help:') _p(1,'@echo "Usage: make [config=name] [target]"') _p(1,'@echo ""') _p(1,'@echo "CONFIGURATIONS:"') for cfg in p.workspace.eachconfig(wks) do _x(1, '@echo " %s"', cfg.shortname) end _p(1,'@echo ""') _p(1,'@echo "TARGETS:"') _p(1,'@echo " all (default)"') _p(1,'@echo " clean"') for prj in p.workspace.eachproject(wks) do _p(1,'@echo " %s"', prj.name) end _p(1,'@echo ""') _p(1,'@echo "For more information, see https://github.com/premake/premake-core/wiki"') end function gmake2.projects(wks) _p('PROJECTS := %s', table.concat(p.esc(table.extract(wks.projects, "name")), " ")) _p('') end function gmake2.workspacePhonyRule(wks) local groups = {} local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onbranch = function(n) table.insert(groups, n.path) end }) _p('.PHONY: all clean help $(PROJECTS) ' .. table.implode(groups, '', '', ' ')) _p('') _p('all: $(PROJECTS)') _p('') end function gmake2.groupRules(wks) local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onbranch = function(n) local rule = n.path .. ":" local projectTargets = {} local groupTargets = {} for i, c in pairs(n.children) do if type(i) == "string" then if c.project then table.insert(projectTargets, c.name) else table.insert(groupTargets, c.path) end end end if #groupTargets > 0 then table.sort(groupTargets) rule = rule .. " " .. table.concat(groupTargets, " ") end if #projectTargets > 0 then table.sort(projectTargets) rule = rule .. " " .. table.concat(projectTargets, " ") end _p(rule) _p('') end }) end function gmake2.projectrules(wks) for prj in p.workspace.eachproject(wks) do local deps = project.getdependencies(prj) deps = table.extract(deps, "name") _p('%s:%s', p.esc(prj.name), gmake2.list(deps)) local cfgvar = gmake2.tovar(prj.name) _p('ifneq (,$(%s_config))', cfgvar) _p(1,'@echo "==== Building %s ($(%s_config)) ===="', prj.name, cfgvar) local prjpath = p.filename(prj, gmake2.getmakefilename(prj, true)) local prjdir = path.getdirectory(path.getrelative(wks.location, prjpath)) local prjname = path.getname(prjpath) _x(1,'@${MAKE} --no-print-directory -C %s -f %s config=$(%s_config)', prjdir, prjname, cfgvar) _p('endif') _p('') end end local p = premake local gmake2 = p.modules.gmake2 gmake2.utility = {} local utility = gmake2.utility local project = p.project local config = p.config local fileconfig = p.fileconfig utility.elements = {} utility.elements.makefile = function(prj) return { gmake2.header, gmake2.phonyRules, gmake2.shellType, utility.initialize, utility.createFileTable, utility.outputConfigurationSection, utility.outputFilesSection, utility.outputRulesSection, utility.outputFileRuleSection, } end function utility.generate(prj) p.eol("\n") p.callArray(utility.elements.makefile, prj) for cfg in project.eachconfig(prj) do cfg._gmake = nil end prj._gmake = nil end function utility.initialize(prj) prj._gmake = prj._gmake or {} prj._gmake.rules = prj.rules prj._gmake.filesets = { } end function utility.createFileTable(prj) for cfg in project.eachconfig(prj) do cfg._gmake = cfg._gmake or {} cfg._gmake.filesets = {} cfg._gmake.fileRules = {} local files = table.shallowcopy(prj._.files) table.foreachi(files, function(node) utility.addFile(cfg, node, prj) end) for _, f in pairs(cfg._gmake.filesets) do table.sort(f) end cfg._gmake.kinds = table.keys(cfg._gmake.filesets) table.sort(cfg._gmake.kinds) prj._gmake.kinds = table.join(prj._gmake.kinds or {}, cfg._gmake.kinds) end prj._gmake.kinds = table.unique(prj._gmake.kinds) table.sort(prj._gmake.kinds) end function utility.addFile(cfg, node, prj) local filecfg = fileconfig.getconfig(node, cfg) if not filecfg or filecfg.flags.ExcludeFromBuild then return end if node.generated then return end if fileconfig.hasCustomBuildRule(filecfg) then local env = table.shallowcopy(filecfg.environ) env.PathVars = { ["file.basename"] = { absolute = false, token = node.basename }, ["file.abspath"] = { absolute = true, token = node.abspath }, ["file.relpath"] = { absolute = false, token = node.relpath }, ["file.name"] = { absolute = false, token = node.name }, ["file.path"] = { absolute = true, token = node.path }, } local shadowContext = p.context.extent(filecfg, env) local buildoutputs = p.project.getrelative(cfg.project, shadowContext.buildoutputs) if buildoutputs and #buildoutputs > 0 then local file = { buildoutputs = buildoutputs, source = node.relpath, buildmessage = shadowContext.buildmessage, buildcommands = shadowContext.buildcommands, buildinputs = p.project.getrelative(cfg.project, shadowContext.buildinputs) } table.insert(cfg._gmake.fileRules, file) for _, output in ipairs(buildoutputs) do utility.addGeneratedFile(cfg, node, output) end end else utility.addRuleFile(cfg, node) end end function utility.addGeneratedFile(cfg, source, filename) cfg.project.hasGeneratedFiles = true local files = cfg.project._.files local node = files[filename] if not node then node = fileconfig.new(filename, cfg.project) files[filename] = node table.insert(files, node) end node.dependsOn = source node.generated = true if not fileconfig.getconfig(node, cfg) then fileconfig.addconfig(node, cfg) end local filesets = cfg.project._gmake.filesets local kind = "CUSTOM" local fileset = cfg._gmake.filesets[kind] or {} table.insert(fileset, filename) cfg._gmake.filesets[kind] = fileset utility.addRuleFile(cfg, node) end function utility.addRuleFile(cfg, node) local rules = cfg.project._gmake.rules local rule = rules[path.getextension(node.abspath):lower()] if rule then local filecfg = fileconfig.getconfig(node, cfg) local environ = table.shallowcopy(filecfg.environ) if rule.propertydefinition then p.rule.prepareEnvironment(rule, environ, cfg) p.rule.prepareEnvironment(rule, environ, filecfg) end local shadowContext = p.context.extent(rule, environ) local buildoutputs = shadowContext.buildoutputs local buildmessage = shadowContext.buildmessage local buildcommands = shadowContext.buildcommands local buildinputs = shadowContext.buildinputs buildoutputs = p.project.getrelative(cfg.project, buildoutputs) if buildoutputs and #buildoutputs > 0 then local file = { buildoutputs = buildoutputs, source = node.relpath, buildmessage = buildmessage, buildcommands = buildcommands, buildinputs = buildinputs } table.insert(cfg._gmake.fileRules, file) for _, output in ipairs(buildoutputs) do utility.addGeneratedFile(cfg, node, output) end end end end utility.elements.configuration = function(cfg) return { utility.bindirs, utility.exepaths, gmake2.settings, gmake2.preBuildCmds, gmake2.preLinkCmds, gmake2.postBuildCmds, } end function utility.outputConfigurationSection(prj) _p('# Configurations') _p('# #############################################') _p('') gmake2.outputSection(prj, utility.elements.configuration) end function utility.bindirs(cfg, toolset) local dirs = project.getrelative(cfg.project, cfg.bindirs) if #dirs > 0 then p.outln('EXECUTABLE_PATHS = "' .. table.concat(dirs, ":") .. '"') end end function utility.exepaths(cfg, toolset) local dirs = project.getrelative(cfg.project, cfg.bindirs) if #dirs > 0 then p.outln('EXE_PATHS = PATH=$(EXECUTABLE_PATHS):$$PATH;') end end utility.elements.filesets = function(cfg) local result = {} for _, kind in ipairs(cfg._gmake.kinds) do for _, f in ipairs(cfg._gmake.filesets[kind]) do table.insert(result, function(cfg, toolset) utility.outputFileset(cfg, kind, f) end) end end return result end function utility.outputFilesSection(prj) _p('# File sets') _p('# #############################################') _p('') for _, kind in ipairs(prj._gmake.kinds) do _x('%s :=', kind) end _x('') gmake2.outputSection(prj, utility.elements.filesets) end function utility.outputFileset(cfg, kind, file) _x('%s += %s', kind, file) end utility.elements.rules = function(cfg) return { utility.allRules, utility.targetRules, gmake2.targetDirRules, utility.cleanRules, } end function utility.outputRulesSection(prj) _p('# Rules') _p('# #############################################') _p('') gmake2.outputSection(prj, utility.elements.rules) end function utility.allRules(cfg, toolset) local allTargets = 'all: $(TARGETDIR) $(TARGET)' for _, kind in ipairs(cfg._gmake.kinds) do allTargets = allTargets .. ' $(' .. kind .. ')' end _p(allTargets) _p('\t@:') _p('') end function utility.targetRules(cfg, toolset) local targets = '' for _, kind in ipairs(cfg._gmake.kinds) do targets = targets .. '$(' .. kind .. ') ' end _p('$(TARGET): %s', targets) _p('\t$(PREBUILDCMDS)') _p('\t$(PRELINKCMDS)') _p('\t$(POSTBUILDCMDS)') _p('') end function utility.cleanRules(cfg, toolset) _p('clean:') _p('\t@echo Cleaning %s', cfg.project.name) _p('') end utility.elements.fileRules = function(cfg) local funcs = {} for _, fileRule in ipairs(cfg._gmake.fileRules) do table.insert(funcs, function(cfg, toolset) utility.outputFileRules(cfg, fileRule) end) end return funcs end function utility.outputFileRuleSection(prj) _p('# File Rules') _p('# #############################################') _p('') gmake2.outputSection(prj, utility.elements.fileRules) end function utility.outputFileRules(cfg, file) local outputs = table.concat(file.buildoutputs, ' ') local dependencies = p.esc(file.source) if file.buildinputs and #file.buildinputs > 0 then dependencies = dependencies .. " " .. table.concat(p.esc(file.buildinputs), " ") end _p('%s: %s', outputs, dependencies) if file.buildmessage then _p('\t@echo %s', file.buildmessage) end if file.buildcommands then local cmds = os.translateCommandsAndPaths(file.buildcommands, cfg.project.basedir, cfg.project.location) for _, cmd in ipairs(cmds) do if cfg.bindirs and #cfg.bindirs > 0 then _p('\t$(SILENT) $(EXE_PATHS) %s', cmd) else _p('\t$(SILENT) %s', cmd) end end end end local p = premake local gmake2 = p.modules.gmake2 gmake2.makefile = {} local makefile = gmake2.makefile local project = p.project local config = p.config local fileconfig = p.fileconfig makefile.elements = {} makefile.elements.makefile = function(prj) return { gmake2.header, gmake2.phonyRules, makefile.configs, makefile.targetRules } end function makefile.generate(prj) p.eol("\n") p.callArray(makefile.elements.makefile, prj) end makefile.elements.configuration = function(cfg) return { gmake2.target, gmake2.buildCommands, gmake2.cleanCommands, } end function makefile.configs(prj) local first = true for cfg in project.eachconfig(prj) do local toolset = p.tools[cfg.toolset or "gcc"] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end if first then _x('ifeq ($(config),%s)', cfg.shortname) first = false else _x('else ifeq ($(config),%s)', cfg.shortname) end p.callArray(makefile.elements.configuration, cfg, toolset) _p('') end if not first then _p('else') _p(' $(error "invalid configuration $(config)")') _p('endif') _p('') end end function makefile.targetRules(prj) _p('$(TARGET):') _p('\t$(BUILDCMDS)') _p('') _p('clean:') _p('\t$(CLEANCMDS)') _p('') end function gmake2.buildCommands(cfg) _p(' define BUILDCMDS') local steps = cfg.buildcommands if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) _p('\t@echo Running build commands') _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p(' endef') end function gmake2.cleanCommands(cfg) _p(' define CLEANCMDS') local steps = cfg.cleancommands if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) _p('\t@echo Running clean commands') _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p(' endef') end local p = premake local gmake2 = p.modules.gmake2 gmake2.cs = {} local cs = gmake2.cs local project = p.project local config = p.config local fileconfig = p.fileconfig cs.elements = {} cs.elements.makefile = function(prj) return { gmake2.header, gmake2.phonyRules, gmake2.csConfigs, gmake2.csProjectConfig, gmake2.csSources, gmake2.csEmbedFiles, gmake2.csCopyFiles, gmake2.csResponseFile, gmake2.shellType, gmake2.csAllRules, gmake2.csTargetRules, gmake2.targetDirRules, gmake2.csResponseRules, gmake2.objDirRules, gmake2.csCleanRules, gmake2.preBuildRules, gmake2.csFileRules, } end function cs.generate(prj) p.eol("\n") local toolset = p.tools.dotnet p.callArray(cs.elements.makefile, prj, toolset) end cs.elements.configuration = function(cfg) return { gmake2.csTools, gmake2.target, gmake2.objdir, gmake2.csFlags, gmake2.csLinkCmd, gmake2.preBuildCmds, gmake2.preLinkCmds, gmake2.postBuildCmds, gmake2.settings, } end function gmake2.csConfigs(prj, toolset) for cfg in project.eachconfig(prj) do _x('ifeq ($(config),%s)', cfg.shortname) p.callArray(cs.elements.configuration, cfg, toolset) _p('endif') _p('') end end function cs.getresourcefilename(cfg, fname) if path.getextension(fname) == ".resx" then local name = cfg.buildtarget.basename .. "." local dir = path.getdirectory(fname) if dir ~= "." then name = name .. path.translate(dir, ".") .. "." end return "$(OBJDIR)/" .. p.esc(name .. path.getbasename(fname)) .. ".resources" else return fname end end function cs.listsources(prj, selector) local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) local value = selector(node) if value then _x('\t%s \\', value) end end }) end function gmake2.csAllRules(prj, toolset) _p('all: prebuild $(EMBEDFILES) $(COPYFILES) $(TARGET)') _p('') end function gmake2.csCleanRules(prj, toolset) end function gmake2.csCopyFiles(prj, toolset) end function cs.getresponsefilename(prj) return '$(OBJDIR)/' .. prj.filename .. '.rsp' end function gmake2.csResponseFile(prj, toolset) _x('RESPONSE += ' .. gmake2.cs.getresponsefilename(prj)) end function gmake2.csResponseRules(prj) local toolset = p.tools.dotnet local ext = gmake2.getmakefilename(prj, true) local makefile = path.getname(p.filename(prj, ext)) local response = gmake2.cs.getresponsefilename(prj) _p('$(RESPONSE): %s', makefile) _p('\t@echo Generating response file', prj.name) _p('ifeq (posix,$(SHELLTYPE))') _x('\t$(SILENT) rm -f $(RESPONSE)') _p('else') _x('\t$(SILENT) if exist $(RESPONSE) del %s', path.translate(response, '\\')) _p('endif') local sep = os.istarget("windows") and "\\" or "/" local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) if toolset.fileinfo(node).action == "Compile" then _x('\t@echo %s >> $(RESPONSE)', path.translate(node.relpath, sep)) end end }) _p('') end function gmake2.csEmbedFiles(prj, toolset) local cfg = project.getfirstconfig(prj) _p('EMBEDFILES += \\') cs.listsources(prj, function(node) local fcfg = fileconfig.getconfig(node, cfg) local info = toolset.fileinfo(fcfg) if info.action == "EmbeddedResource" then return cs.getresourcefilename(cfg, node.relpath) end end) _p('') end function gmake2.csFileRules(prj, toolset) end function gmake2.csFlags(cfg, toolset) _p(' FLAGS =%s', gmake2.list(toolset.getflags(cfg))) end function gmake2.csLinkCmd(cfg, toolset) local deps = p.esc(config.getlinks(cfg, "dependencies", "fullpath")) _p(' DEPENDS =%s', gmake2.list(deps)) _p(' REFERENCES = %s', table.implode(deps, "/r:", "", " ")) end function gmake2.csProjectConfig(prj, toolset) local cfg = project.getfirstconfig(prj) local kindflag = "/t:" .. toolset.getkind(cfg):lower() local libdirs = table.implode(p.esc(cfg.libdirs), "/lib:", "", " ") _p('FLAGS += %s', table.concat(table.join(kindflag, libdirs), " ")) local refs = p.esc(config.getlinks(cfg, "system", "fullpath")) _p('REFERENCES += %s', table.implode(refs, "/r:", "", " ")) _p('') end function gmake2.csSources(prj, toolset) local cfg = project.getfirstconfig(prj) _p('SOURCES += \\') cs.listsources(prj, function(node) local fcfg = fileconfig.getconfig(node, cfg) local info = toolset.fileinfo(fcfg) if info.action == "Compile" then return node.relpath end end) _p('') end function gmake2.csTargetRules(prj, toolset) _p('$(TARGET): $(SOURCES) $(EMBEDFILES) $(DEPENDS) $(RESPONSE) | $(TARGETDIR)') _p('\t$(PRELINKCMDS)') _p('\t$(SILENT) $(CSC) /nologo /out:$@ $(FLAGS) $(REFERENCES) @$(RESPONSE) $(patsubst %%,/resource:%%,$(EMBEDFILES))') _p('\t$(POSTBUILDCMDS)') _p('') end function gmake2.csTools(cfg, toolset) _p(' CSC = %s', toolset.gettoolname(cfg, "csc")) _p(' RESGEN = %s', toolset.gettoolname(cfg, "resgen")) end local p = premake local gmake2 = p.modules.gmake2 gmake2.cpp = {} local cpp = gmake2.cpp local project = p.project local config = p.config local fileconfig = p.fileconfig cpp.elements = {} cpp.elements.makefile = function(prj) return { gmake2.header, gmake2.phonyRules, gmake2.shellType, cpp.createRuleTable, cpp.outputConfigurationSection, cpp.outputPerFileConfigurationSection, cpp.createFileTable, cpp.outputFilesSection, cpp.outputRulesSection, cpp.outputFileRuleSection, cpp.dependencies, } end function cpp.generate(prj) p.eol("\n") p.callArray(cpp.elements.makefile, prj) for cfg in project.eachconfig(prj) do cfg._gmake = nil end prj._gmake = nil end function cpp.initialize() rule 'cpp' fileExtension { ".cc", ".cpp", ".cxx", ".mm" } buildoutputs { "$(OBJDIR)/%{file.objname}.o" } buildmessage '$(notdir $<)' buildcommands {'$(CXX) %{premake.modules.gmake2.cpp.fileFlags(cfg, file)} $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"'} rule 'cc' fileExtension {".c", ".s", ".m"} buildoutputs { "$(OBJDIR)/%{file.objname}.o" } buildmessage '$(notdir $<)' buildcommands {'$(CC) %{premake.modules.gmake2.cpp.fileFlags(cfg, file)} $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"'} rule 'resource' fileExtension ".rc" buildoutputs { "$(OBJDIR)/%{file.objname}.res" } buildmessage '$(notdir $<)' buildcommands {'$(RESCOMP) $< -O coff -o "$@" $(ALL_RESFLAGS)'} global(nil) end function cpp.createRuleTable(prj) local rules = {} local function addRule(extension, rule) if type(extension) == 'table' then for _, value in ipairs(extension) do addRule(value, rule) end else rules[extension] = rule end end local usedRules = table.join({'cpp', 'cc', 'resource'}, prj.rules) for _, name in ipairs(usedRules) do local rule = p.global.getRule(name) addRule(rule.fileExtension, rule) end local filesets = { ['.o'] = 'OBJECTS', ['.obj'] = 'OBJECTS', ['.cc'] = 'SOURCES', ['.cpp'] = 'SOURCES', ['.cxx'] = 'SOURCES', ['.mm'] = 'SOURCES', ['.c'] = 'SOURCES', ['.s'] = 'SOURCES', ['.m'] = 'SOURCES', ['.rc'] = 'RESOURCES', } prj._gmake = prj._gmake or {} prj._gmake.rules = rules prj._gmake.filesets = filesets end function cpp.createFileTable(prj) for cfg in project.eachconfig(prj) do cfg._gmake = cfg._gmake or {} cfg._gmake.filesets = {} cfg._gmake.fileRules = {} local files = table.shallowcopy(prj._.files) table.foreachi(files, function(node) cpp.addFile(cfg, node) end) for _, f in pairs(cfg._gmake.filesets) do table.sort(f) end cfg._gmake.kinds = table.keys(cfg._gmake.filesets) table.sort(cfg._gmake.kinds) prj._gmake.kinds = table.join(prj._gmake.kinds or {}, cfg._gmake.kinds) end if prj.hasGeneratedFiles and p.project.iscpp(prj) then p.oven.assignObjectSequences(prj) end prj._gmake.kinds = table.unique(prj._gmake.kinds) table.sort(prj._gmake.kinds) end function cpp.addFile(cfg, node) local filecfg = fileconfig.getconfig(node, cfg) if not filecfg or filecfg.flags.ExcludeFromBuild then return end if node.generated then return end if fileconfig.hasCustomBuildRule(filecfg) then local env = table.shallowcopy(filecfg.environ) env.PathVars = { ["file.basename"] = { absolute = false, token = node.basename }, ["file.abspath"] = { absolute = true, token = node.abspath }, ["file.relpath"] = { absolute = false, token = node.relpath }, ["file.name"] = { absolute = false, token = node.name }, ["file.objname"] = { absolute = false, token = node.objname }, ["file.path"] = { absolute = true, token = node.path }, ["file.directory"] = { absolute = true, token = path.getdirectory(node.abspath) }, ["file.reldirectory"] = { absolute = false, token = path.getdirectory(node.relpath) }, } local shadowContext = p.context.extent(filecfg, env) local buildoutputs = p.project.getrelative(cfg.project, shadowContext.buildoutputs) if buildoutputs and #buildoutputs > 0 then local file = { buildoutputs = buildoutputs, source = node.relpath, buildmessage = shadowContext.buildmessage, buildcommands = shadowContext.buildcommands, buildinputs = p.project.getrelative(cfg.project, shadowContext.buildinputs) } table.insert(cfg._gmake.fileRules, file) for _, output in ipairs(buildoutputs) do cpp.addGeneratedFile(cfg, node, output) end end else cpp.addRuleFile(cfg, node) end end function cpp.determineFiletype(cfg, node) local filecfg = fileconfig.getconfig(node, cfg) local fileext = path.getextension(node.abspath):lower() if filecfg and filecfg.compileas then if p.languages.isc(filecfg.compileas) then fileext = ".c" elseif p.languages.iscpp(filecfg.compileas) then fileext = ".cpp" end end return fileext; end function cpp.addGeneratedFile(cfg, source, filename) cfg.project.hasGeneratedFiles = true local files = cfg.project._.files local node = files[filename] if not node then node = fileconfig.new(filename, cfg.project) files[filename] = node table.insert(files, node) end node.dependsOn = source node.generated = true if not fileconfig.getconfig(node, cfg) then fileconfig.addconfig(node, cfg) end local fileext = cpp.determineFiletype(cfg, node) local filesets = cfg.project._gmake.filesets local kind = filesets[fileext] or "CUSTOM" if path.isobjectfile(filename) and source.linkbuildoutputs == false then kind = "CUSTOM" end local fileset = cfg._gmake.filesets[kind] or {} table.insert(fileset, filename) cfg._gmake.filesets[kind] = fileset local generatedKind = "GENERATED" local generatedFileset = cfg._gmake.filesets[generatedKind] or {} table.insert(generatedFileset, filename) cfg._gmake.filesets[generatedKind] = generatedFileset cpp.addRuleFile(cfg, node) end function cpp.addRuleFile(cfg, node) local rules = cfg.project._gmake.rules local fileext = cpp.determineFiletype(cfg, node) local rule = rules[fileext] if rule then local filecfg = fileconfig.getconfig(node, cfg) local environ = table.shallowcopy(filecfg.environ) if rule.propertydefinition then p.rule.prepareEnvironment(rule, environ, cfg) p.rule.prepareEnvironment(rule, environ, filecfg) end local shadowContext = p.context.extent(rule, environ) local buildoutputs = shadowContext.buildoutputs local buildmessage = shadowContext.buildmessage local buildcommands = shadowContext.buildcommands local buildinputs = shadowContext.buildinputs buildoutputs = p.project.getrelative(cfg.project, buildoutputs) if buildoutputs and #buildoutputs > 0 then local file = { buildoutputs = buildoutputs, source = node.relpath, buildmessage = buildmessage, buildcommands = buildcommands, buildinputs = buildinputs } table.insert(cfg._gmake.fileRules, file) for _, output in ipairs(buildoutputs) do cpp.addGeneratedFile(cfg, node, output) end end end end cpp.elements.configuration = function(cfg) return { cpp.tools, gmake2.target, gmake2.objdir, cpp.pch, cpp.defines, cpp.includes, cpp.forceInclude, cpp.cppFlags, cpp.cFlags, cpp.cxxFlags, cpp.resFlags, cpp.libs, cpp.ldDeps, cpp.ldFlags, cpp.linkCmd, cpp.bindirs, cpp.exepaths, gmake2.settings, gmake2.preBuildCmds, gmake2.preLinkCmds, gmake2.postBuildCmds, } end function cpp.outputConfigurationSection(prj) _p('# Configurations') _p('# #############################################') _p('') gmake2.outputSection(prj, cpp.elements.configuration) end function cpp.tools(cfg, toolset) local tool = toolset.gettoolname(cfg, "cc") if tool then _p('ifeq ($(origin CC), default)') _p(' CC = %s', tool) _p('endif' ) end tool = toolset.gettoolname(cfg, "cxx") if tool then _p('ifeq ($(origin CXX), default)') _p(' CXX = %s', tool) _p('endif' ) end tool = toolset.gettoolname(cfg, "ar") if tool then _p('ifeq ($(origin AR), default)') _p(' AR = %s', tool) _p('endif' ) end tool = toolset.gettoolname(cfg, "rc") if tool then _p('RESCOMP = %s', tool) end end function cpp.pch(cfg, toolset) local pch = p.tools.gcc.getpch(cfg) if pch == nil then return end p.outln('PCH = ' .. pch) p.outln('PCH_PLACEHOLDER = $(OBJDIR)/$(notdir $(PCH))') p.outln('GCH = $(PCH_PLACEHOLDER).gch') end function cpp.defines(cfg, toolset) p.outln('DEFINES +=' .. gmake2.list(table.join(toolset.getdefines(cfg.defines, cfg), toolset.getundefines(cfg.undefines)))) end function cpp.includes(cfg, toolset) local includes = toolset.getincludedirs(cfg, cfg.includedirs, cfg.sysincludedirs, cfg.frameworkdirs) p.outln('INCLUDES +=' .. gmake2.list(includes)) end function cpp.forceInclude(cfg, toolset) local includes = toolset.getforceincludes(cfg) p.outln('FORCE_INCLUDE +=' .. gmake2.list(includes)) end function cpp.cppFlags(cfg, toolset) local flags = gmake2.list(toolset.getcppflags(cfg)) p.outln('ALL_CPPFLAGS += $(CPPFLAGS)' .. flags .. ' $(DEFINES) $(INCLUDES)') end function cpp.cFlags(cfg, toolset) local flags = gmake2.list(table.join(toolset.getcflags(cfg), cfg.buildoptions)) p.outln('ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS)' .. flags) end function cpp.cxxFlags(cfg, toolset) local flags = gmake2.list(table.join(toolset.getcxxflags(cfg), cfg.buildoptions)) p.outln('ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS)' .. flags) end function cpp.resFlags(cfg, toolset) local resflags = table.join(toolset.getdefines(cfg.resdefines), toolset.getincludedirs(cfg, cfg.resincludedirs), cfg.resoptions) p.outln('ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)' .. gmake2.list(resflags)) end function cpp.libs(cfg, toolset) local flags = toolset.getlinks(cfg) p.outln('LIBS +=' .. gmake2.list(flags, true)) end function cpp.ldDeps(cfg, toolset) local deps = config.getlinks(cfg, "siblings", "fullpath") p.outln('LDDEPS +=' .. gmake2.list(p.esc(deps))) end function cpp.ldFlags(cfg, toolset) local flags = table.join(toolset.getLibraryDirectories(cfg), toolset.getrunpathdirs(cfg, table.join(cfg.runpathdirs, config.getsiblingtargetdirs(cfg))), toolset.getldflags(cfg), cfg.linkoptions) p.outln('ALL_LDFLAGS += $(LDFLAGS)' .. gmake2.list(flags)) end function cpp.linkCmd(cfg, toolset) if cfg.kind == p.STATICLIB then if cfg.architecture == p.UNIVERSAL then p.outln('LINKCMD = libtool -o "$@" $(OBJECTS)') else p.outln('LINKCMD = $(AR) -rcs "$@" $(OBJECTS)') end elseif cfg.kind == p.UTILITY then p.outln('LINKCMD =') else local cc = iif(p.languages.isc(cfg.language), "CC", "CXX") p.outln('LINKCMD = $(' .. cc .. ') -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)') end end function cpp.bindirs(cfg, toolset) local dirs = project.getrelative(cfg.project, cfg.bindirs) if #dirs > 0 then p.outln('EXECUTABLE_PATHS = "' .. table.concat(dirs, ":") .. '"') end end function cpp.exepaths(cfg, toolset) local dirs = project.getrelative(cfg.project, cfg.bindirs) if #dirs > 0 then p.outln('EXE_PATHS = export PATH=$(EXECUTABLE_PATHS):$$PATH;') end end function cpp.outputPerFileConfigurationSection(prj) _p('# Per File Configurations') _p('# #############################################') _p('') for cfg in project.eachconfig(prj) do table.foreachi(prj._.files, function(node) local fcfg = fileconfig.getconfig(node, cfg) if fcfg then cpp.perFileFlags(cfg, fcfg) end end) end _p('') end function cpp.makeVarName(prj, value, saltValue) prj._gmake = prj._gmake or {} prj._gmake.varlist = prj._gmake.varlist or {} prj._gmake.varlistlength = prj._gmake.varlistlength or 0 local cache = prj._gmake.varlist local length = prj._gmake.varlistlength local key = value .. saltValue if (cache[key] ~= nil) then return cache[key], false end local var = string.format("PERFILE_FLAGS_%d", length) cache[key] = var prj._gmake.varlistlength = length + 1 return var, true end function cpp.perFileFlags(cfg, fcfg) local toolset = gmake2.getToolSet(cfg) local isCFile = path.iscfile(fcfg.name) local getflags = iif(isCFile, toolset.getcflags, toolset.getcxxflags) local value = gmake2.list(table.join(getflags(fcfg), fcfg.buildoptions)) if fcfg.defines or fcfg.undefines then local defs = table.join(toolset.getdefines(fcfg.defines, cfg), toolset.getundefines(fcfg.undefines)) if #defs > 0 then value = value .. gmake2.list(defs) end end if fcfg.includedirs or fcfg.sysincludedirs or fcfg.frameworkdirs then local includes = toolset.getincludedirs(cfg, fcfg.includedirs, fcfg.sysincludedirs, fcfg.frameworkdirs) if #includes > 0 then value = value .. gmake2.list(includes) end end if #value > 0 then local newPerFileFlag = false fcfg.flagsVariable, newPerFileFlag = cpp.makeVarName(cfg.project, value, iif(isCFile, '_C', '_CPP')) if newPerFileFlag then if isCFile then _p('%s = $(ALL_CFLAGS)%s', fcfg.flagsVariable, value) else _p('%s = $(ALL_CXXFLAGS)%s', fcfg.flagsVariable, value) end end end end function cpp.fileFlags(cfg, file) local fcfg = fileconfig.getconfig(file, cfg) local flags = {} if cfg.pchheader and not cfg.flags.NoPCH and (not fcfg or not fcfg.flags.NoPCH) then table.insert(flags, "-include $(PCH_PLACEHOLDER)") end if fcfg and fcfg.flagsVariable then table.insert(flags, string.format("$(%s)", fcfg.flagsVariable)) else local fileExt = cpp.determineFiletype(cfg, file) if path.iscfile(fileExt) then table.insert(flags, "$(ALL_CFLAGS)") elseif path.iscppfile(fileExt) then table.insert(flags, "$(ALL_CXXFLAGS)") end end return table.concat(flags, ' ') end cpp.elements.filesets = function(cfg) local result = {} for _, kind in ipairs(cfg._gmake.kinds) do for _, f in ipairs(cfg._gmake.filesets[kind]) do table.insert(result, function(cfg, toolset) cpp.outputFileset(cfg, kind, f) end) end end return result end function cpp.outputFilesSection(prj) _p('# File sets') _p('# #############################################') _p('') for _, kind in ipairs(prj._gmake.kinds) do _x('%s :=', kind) end _x('') gmake2.outputSection(prj, cpp.elements.filesets) end function cpp.outputFileset(cfg, kind, file) _x('%s += %s', kind, file) end cpp.elements.rules = function(cfg) return { cpp.allRules, cpp.targetRules, gmake2.targetDirRules, gmake2.objDirRules, cpp.cleanRules, gmake2.preBuildRules, cpp.customDeps, cpp.pchRules, } end function cpp.outputRulesSection(prj) _p('# Rules') _p('# #############################################') _p('') gmake2.outputSection(prj, cpp.elements.rules) end function cpp.allRules(cfg, toolset) if cfg.system == p.MACOSX and cfg.kind == p.WINDOWEDAPP then _p('all: $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist') _p('\t@:') _p('') _p('$(dir $(TARGETDIR))PkgInfo:') _p('$(dir $(TARGETDIR))Info.plist:') else _p('all: $(TARGET)') _p('\t@:') end _p('') end function cpp.targetRules(cfg, toolset) local targets = '' for _, kind in ipairs(cfg._gmake.kinds) do if kind ~= 'OBJECTS' and kind ~= 'RESOURCES' then targets = targets .. '$(' .. kind .. ') ' end end targets = targets .. '$(OBJECTS) $(LDDEPS)' if cfg._gmake.filesets['RESOURCES'] then targets = targets .. ' $(RESOURCES)' end _p('$(TARGET): %s | $(TARGETDIR)', targets) _p('\t$(PRELINKCMDS)') _p('\t@echo Linking %s', cfg.project.name) _p('\t$(SILENT) $(LINKCMD)') _p('\t$(POSTBUILDCMDS)') _p('') end function cpp.customDeps(cfg, toolset) for _, kind in ipairs(cfg._gmake.kinds) do if kind == 'CUSTOM' or kind == 'SOURCES' then _p('$(%s): | prebuild', kind) end end end function cpp.cleanRules(cfg, toolset) _p('clean:') _p('\t@echo Cleaning %s', cfg.project.name) _p('ifeq (posix,$(SHELLTYPE))') _p('\t$(SILENT) rm -f $(TARGET)') _p('\t$(SILENT) rm -rf $(GENERATED)') _p('\t$(SILENT) rm -rf $(OBJDIR)') _p('else') _p('\t$(SILENT) if exist $(subst /,\\\\,$(TARGET)) del $(subst /,\\\\,$(TARGET))') _p('\t$(SILENT) if exist $(subst /,\\\\,$(GENERATED)) rmdir /s /q $(subst /,\\\\,$(GENERATED))') _p('\t$(SILENT) if exist $(subst /,\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\,$(OBJDIR))') _p('endif') _p('') end function cpp.pchRules(cfg, toolset) _p('ifneq (,$(PCH))') _p('$(OBJECTS): $(GCH) | $(PCH_PLACEHOLDER)') _p('$(GCH): $(PCH) | prebuild') _p('\t@echo $(notdir $<)') local cmd = iif(p.languages.isc(cfg.language), "$(CC) -x c-header $(ALL_CFLAGS)", "$(CXX) -x c++-header $(ALL_CXXFLAGS)") _p('\t$(SILENT) %s -o "$@" -MF "$(@:%%.gch=%%.d)" -c "$<"', cmd) _p('$(PCH_PLACEHOLDER): $(GCH) | $(OBJDIR)') _p('ifeq (posix,$(SHELLTYPE))') _p('\t$(SILENT) touch "$@"') _p('else') _p('\t$(SILENT) echo $null >> "$@"') _p('endif') _p('else') _p('$(OBJECTS): | prebuild') _p('endif') _p('') end cpp.elements.fileRules = function(cfg) local funcs = {} for _, fileRule in ipairs(cfg._gmake.fileRules) do table.insert(funcs, function(cfg, toolset) cpp.outputFileRules(cfg, fileRule) end) end return funcs end function cpp.outputFileRuleSection(prj) _p('# File Rules') _p('# #############################################') _p('') gmake2.outputSection(prj, cpp.elements.fileRules) end function cpp.outputFileRules(cfg, file) local dependencies = p.esc(file.source) if file.buildinputs and #file.buildinputs > 0 then dependencies = dependencies .. " " .. table.concat(p.esc(file.buildinputs), " ") end _p('%s: %s', file.buildoutputs[1], dependencies) if file.buildmessage then _p('\t@echo %s', file.buildmessage) end if file.buildcommands then local cmds = os.translateCommandsAndPaths(file.buildcommands, cfg.project.basedir, cfg.project.location) for _, cmd in ipairs(cmds) do if cfg.bindirs and #cfg.bindirs > 0 then _p('\t$(SILENT) $(EXE_PATHS) %s', cmd) else _p('\t$(SILENT) %s', cmd) end end end if #file.buildoutputs > 1 then _p('%s: %s', table.concat({ table.unpack(file.buildoutputs, 2) }, ' '), file.buildoutputs[1]) end end function cpp.dependencies(prj) _p('-include $(OBJECTS:%%.o=%%.d)') _p('ifneq (,$(PCH))') _p(' -include $(PCH_PLACEHOLDER).d') _p('endif') end local p = premake local project = p.project p.modules.gmake2 = {} p.modules.gmake2._VERSION = p._VERSION local gmake2 = p.modules.gmake2 function gmake2.defaultconfig(target) local eachconfig = iif(target.project, project.eachconfig, p.workspace.eachconfig) local defaultconfig = nil if target.defaultplatform then for cfg in eachconfig(target) do if cfg.platform == target.defaultplatform then defaultconfig = cfg break end end end if not defaultconfig then local iter = eachconfig(target) defaultconfig = iter() end if defaultconfig then _p('ifndef config') _x(' config=%s', defaultconfig.shortname) _p('endif') _p('') end end function gmake2.esc(value) result = value:gsub("\\", "\\\\") result = result:gsub("\"", "\\\"") result = result:gsub(" ", "\\ ") result = result:gsub("%(", "\\(") result = result:gsub("%)", "\\)") result = result:gsub("$\\%((.-)\\%)", "$(%1)") return result end function gmake2.getmakefilename(this, searchprjs) local count = 0 for wks in p.global.eachWorkspace() do if wks.location == this.location then count = count + 1 end if searchprjs then for _, prj in ipairs(wks.projects) do if prj.location == this.location then count = count + 1 end end end end if count == 1 then return "Makefile" else return ".make" end end function gmake2.header(target) local kind = iif(target.project, "project", "workspace") _p('# %s %s makefile autogenerated by Premake', p.action.current().shortname, kind) _p('') gmake2.defaultconfig(target) _p('ifndef verbose') _p(' SILENT = @') _p('endif') _p('') end function gmake2.mkdir(dirname) _p('ifeq (posix,$(SHELLTYPE))') _p('\t$(SILENT) mkdir -p %s', dirname) _p('else') _p('\t$(SILENT) mkdir $(subst /,\\\\,%s)', dirname) _p('endif') end function gmake2.mkdirRules(dirname) _p('%s:', dirname) _p('\t@echo Creating %s', dirname) gmake2.mkdir(dirname) _p('') end function gmake2.list(value, quoted) quoted = false if #value > 0 then if quoted then local result = "" for _, v in ipairs (value) do if #result then result = result .. " " end result = result .. p.quoted(v) end return result else return " " .. table.concat(value, " ") end else return "" end end function gmake2.tovar(value) value = value:gsub("[ -]", "_") value = value:gsub("[()]", "") return value end function gmake2.getToolSet(cfg) local default = iif(cfg.system == p.MACOSX, "clang", "gcc") local toolset = p.tools[_OPTIONS.cc or cfg.toolset or default] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end return toolset end function gmake2.outputSection(prj, callback) local root = {} for cfg in project.eachconfig(prj) do local toolset = gmake2.getToolSet(cfg) local settings = {} local funcs = callback(cfg) for i = 1, #funcs do local c = p.capture(function () funcs[i](cfg, toolset) end) if #c > 0 then table.insert(settings, c) end end if not root.settings then root.settings = table.arraycopy(settings) else root.settings = table.intersect(root.settings, settings) end root[cfg] = settings end if #root.settings > 0 then for _, v in ipairs(root.settings) do p.outln(v) end p.outln('') end local first = true for cfg in project.eachconfig(prj) do local settings = table.difference(root[cfg], root.settings) if #settings > 0 then if first then _x('ifeq ($(config),%s)', cfg.shortname) first = false else _x('else ifeq ($(config),%s)', cfg.shortname) end for k, v in ipairs(settings) do p.outln(v) end _p('') end end if not first then p.outln('endif') p.outln('') end end function gmake2.phonyRules(prj) _p('.PHONY: clean prebuild') _p('') end function gmake2.shellType() _p('SHELLTYPE := posix') _p('ifeq (.exe,$(findstring .exe,$(ComSpec)))') _p('\tSHELLTYPE := msdos') _p('endif') _p('') end function gmake2.target(cfg, toolset) p.outln('TARGETDIR = ' .. project.getrelative(cfg.project, cfg.buildtarget.directory)) p.outln('TARGET = $(TARGETDIR)/' .. cfg.buildtarget.name) end function gmake2.objdir(cfg, toolset) p.outln('OBJDIR = ' .. project.getrelative(cfg.project, cfg.objdir)) end function gmake2.settings(cfg, toolset) if #cfg.makesettings > 0 then for _, value in ipairs(cfg.makesettings) do p.outln(value) end end local value = toolset.getmakesettings(cfg) if value then p.outln(value) end end function gmake2.buildCmds(cfg, event) _p('define %sCMDS', event:upper()) local steps = cfg[event .. "commands"] local msg = cfg[event .. "message"] if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) msg = msg or string.format("Running %s commands", event) _p('\t@echo %s', msg) _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p('endef') end function gmake2.preBuildCmds(cfg, toolset) gmake2.buildCmds(cfg, "prebuild") end function gmake2.preLinkCmds(cfg, toolset) gmake2.buildCmds(cfg, "prelink") end function gmake2.postBuildCmds(cfg, toolset) gmake2.buildCmds(cfg, "postbuild") end function gmake2.targetDirRules(cfg, toolset) gmake2.mkdirRules("$(TARGETDIR)") end function gmake2.objDirRules(cfg, toolset) gmake2.mkdirRules("$(OBJDIR)") end function gmake2.preBuildRules(cfg, toolset) _p('prebuild: | $(OBJDIR)') _p('\t$(PREBUILDCMDS)') _p('') end include("gmake2_cpp.lua") include("gmake2_csharp.lua") include("gmake2_makefile.lua") include("gmake2_utility.lua") include("gmake2_workspace.lua") return gmake2 local p = premake local project = p.project newaction { trigger = "gmake2", shortname = "Alternative GNU Make", description = "Generate GNU makefiles for POSIX, MinGW, and Cygwin", toolset = "gcc", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Utility", "Makefile" }, valid_languages = { "C", "C++", "C#" }, valid_tools = { cc = { "clang", "gcc" }, dotnet = { "mono", "msnet", "pnet" } }, onInitialize = function() require("gmake2") p.modules.gmake2.cpp.initialize() end, onWorkspace = function(wks) p.escaper(p.modules.gmake2.esc) p.generate(wks, p.modules.gmake2.getmakefilename(wks, false), p.modules.gmake2.generate_workspace) end, onProject = function(prj) p.escaper(p.modules.gmake2.esc) local makefile = p.modules.gmake2.getmakefilename(prj, true) if prj.kind == p.UTILITY then p.generate(prj, makefile, p.modules.gmake2.utility.generate) elseif prj.kind == p.MAKEFILE then p.generate(prj, makefile, p.modules.gmake2.makefile.generate) else if project.isdotnet(prj) then p.generate(prj, makefile, p.modules.gmake2.cs.generate) elseif project.isc(prj) or project.iscpp(prj) then p.generate(prj, makefile, p.modules.gmake2.cpp.generate) end end end, onCleanWorkspace = function(wks) p.clean.file(wks, p.modules.gmake2.getmakefilename(wks, false)) end, onCleanProject = function(prj) p.clean.file(prj, p.modules.gmake2.getmakefilename(prj, true)) end } return function(cfg) return (_ACTION == "gmake2") end local p = premake local make = p.make local tree = p.tree local project = p.project function make.generate_workspace(wks) p.eol("\n") make.header(wks) make.configmap(wks) make.projects(wks) make.workspacePhonyRule(wks) make.groupRules(wks) make.projectrules(wks) make.cleanrules(wks) make.helprule(wks) end function make.configmap(wks) for cfg in p.workspace.eachconfig(wks) do _p('ifeq ($(config),%s)', cfg.shortname) for prj in p.workspace.eachproject(wks) do local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) if prjcfg then _p(' %s_config = %s', make.tovar(prj.name), prjcfg.shortname) end end _p('endif') end _p('') end function make.cleanrules(wks) _p('clean:') for prj in p.workspace.eachproject(wks) do local prjpath = p.filename(prj, make.getmakefilename(prj, true)) local prjdir = path.getdirectory(path.getrelative(wks.location, prjpath)) local prjname = path.getname(prjpath) _x(1,'@${MAKE} --no-print-directory -C %s -f %s clean', prjdir, prjname) end _p('') end function make.helprule(wks) _p('help:') _p(1,'@echo "Usage: make [config=name] [target]"') _p(1,'@echo ""') _p(1,'@echo "CONFIGURATIONS:"') for cfg in p.workspace.eachconfig(wks) do _x(1, '@echo " %s"', cfg.shortname) end _p(1,'@echo ""') _p(1,'@echo "TARGETS:"') _p(1,'@echo " all (default)"') _p(1,'@echo " clean"') for prj in p.workspace.eachproject(wks) do _p(1,'@echo " %s"', prj.name) end _p(1,'@echo ""') _p(1,'@echo "For more information, see https://github.com/premake/premake-core/wiki"') end function make.projects(wks) _p('PROJECTS := %s', table.concat(p.esc(table.extract(wks.projects, "name")), " ")) _p('') end function make.workspacePhonyRule(wks) local groups = {} local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onbranch = function(n) table.insert(groups, n.path) end }) _p('.PHONY: all clean help $(PROJECTS) ' .. table.implode(groups, '', '', ' ')) _p('') _p('all: $(PROJECTS)') _p('') end function make.groupRules(wks) local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onbranch = function(n) local rule = n.path .. ":" local projectTargets = {} local groupTargets = {} for i, c in pairs(n.children) do if type(i) == "string" then if c.project then table.insert(projectTargets, c.name) else table.insert(groupTargets, c.path) end end end if #groupTargets > 0 then table.sort(groupTargets) rule = rule .. " " .. table.concat(groupTargets, " ") end if #projectTargets > 0 then table.sort(projectTargets) rule = rule .. " " .. table.concat(projectTargets, " ") end _p(rule) _p('') end }) end function make.projectrules(wks) for prj in p.workspace.eachproject(wks) do local deps = project.getdependencies(prj) deps = table.extract(deps, "name") _p('%s:%s', p.esc(prj.name), make.list(deps)) local cfgvar = make.tovar(prj.name) _p('ifneq (,$(%s_config))', cfgvar) _p(1,'@echo "==== Building %s ($(%s_config)) ===="', prj.name, cfgvar) local prjpath = p.filename(prj, make.getmakefilename(prj, true)) local prjdir = path.getdirectory(path.getrelative(wks.location, prjpath)) local prjname = path.getname(prjpath) _x(1,'@${MAKE} --no-print-directory -C %s -f %s config=$(%s_config)', prjdir, prjname, cfgvar) _p('endif') _p('') end end local p = premake p.make.utility = {} local make = p.make local utility = p.make.utility local project = p.project local config = p.config local fileconfig = p.fileconfig utility.elements = {} utility.elements.makefile = { "header", "phonyRules", "utilityConfigs", "utilityTargetRules" } function make.utility.generate(prj) p.eol("\n") p.callarray(make, utility.elements.makefile, prj) end utility.elements.configuration = { "target", "preBuildCmds", "postBuildCmds", } function make.utilityConfigs(prj) for cfg in project.eachconfig(prj) do local toolset = p.tools[cfg.toolset or "gcc"] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end _x('ifeq ($(config),%s)', cfg.shortname) p.callarray(make, utility.elements.configuration, cfg, toolset) _p('endif') _p('') end end function make.utilityTargetRules(prj) _p('$(TARGET):') _p('\t$(PREBUILDCMDS)') _p('\t$(POSTBUILDCMDS)') _p('') end local p = premake p.make.makefile = {} local make = p.make local makefile = p.make.makefile local project = p.project local config = p.config local fileconfig = p.fileconfig makefile.elements = {} makefile.elements.makefile = { "header", "phonyRules", "makefileConfigs", "makefileTargetRules" } function make.makefile.generate(prj) p.eol("\n") p.callarray(make, makefile.elements.makefile, prj) end makefile.elements.configuration = { "target", "buildCommands", "cleanCommands", } function make.makefileConfigs(prj) for cfg in project.eachconfig(prj) do local toolset = p.tools[cfg.toolset or "gcc"] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end _x('ifeq ($(config),%s)', cfg.shortname) p.callarray(make, makefile.elements.configuration, cfg, toolset) _p('endif') _p('') end end function make.makefileTargetRules(prj) _p('$(TARGET):') _p('\t$(BUILDCMDS)') _p('') _p('clean:') _p('\t$(CLEANCMDS)') _p('') end function make.buildCommands(cfg) _p(' define BUILDCMDS') local steps = cfg.buildcommands if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) _p('\t@echo Running build commands') _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p(' endef') end function make.cleanCommands(cfg) _p(' define CLEANCMDS') local steps = cfg.cleancommands if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) _p('\t@echo Running clean commands') _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p(' endef') end local p = premake p.make.cs = {} local make = p.make local cs = p.make.cs local project = p.project local config = p.config local fileconfig = p.fileconfig cs.elements = {} cs.elements.makefile = function(prj) return { make.header, make.phonyRules, make.csConfigs, make.csProjectConfig, make.csSources, make.csEmbedFiles, make.csCopyFiles, make.csResponseFile, make.shellType, make.csAllRules, make.csTargetRules, make.targetDirRules, make.csResponseRules, make.objDirRules, make.csCleanRules, make.preBuildRules, make.preLinkRules, make.csFileRules, } end function make.cs.generate(prj) p.eol("\n") local toolset = p.tools.dotnet p.callArray(cs.elements.makefile, prj, toolset) end cs.elements.configuration = function(cfg) return { make.csTools, make.target, make.objdir, make.csFlags, make.csLinkCmd, make.preBuildCmds, make.preLinkCmds, make.postBuildCmds, make.settings, } end function make.csConfigs(prj, toolset) for cfg in project.eachconfig(prj) do _x('ifeq ($(config),%s)', cfg.shortname) p.callArray(cs.elements.configuration, cfg, toolset) _p('endif') _p('') end end function cs.getresourcefilename(cfg, fname) if path.getextension(fname) == ".resx" then local name = cfg.buildtarget.basename .. "." local dir = path.getdirectory(fname) if dir ~= "." then name = name .. path.translate(dir, ".") .. "." end return "$(OBJDIR)/" .. p.esc(name .. path.getbasename(fname)) .. ".resources" else return fname end end function cs.listsources(prj, selector) local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) local value = selector(node) if value then _x('\t%s \\', value) end end }) end function make.csAllRules(prj, toolset) _p('all: $(TARGETDIR) $(OBJDIR) prebuild $(EMBEDFILES) $(COPYFILES) prelink $(TARGET)') _p('') end function make.csCleanRules(prj, toolset) end function make.csCopyFiles(prj, toolset) end function make.cs.getresponsefilename(prj) return '$(OBJDIR)/' .. prj.filename .. '.rsp' end function make.csResponseFile(prj, toolset) _x('RESPONSE += ' .. make.cs.getresponsefilename(prj)) end function make.csResponseRules(prj) local toolset = p.tools.dotnet local ext = make.getmakefilename(prj, true) local makefile = path.getname(p.filename(prj, ext)) local response = make.cs.getresponsefilename(prj) _p('$(RESPONSE): %s', makefile) _p('\t@echo Generating response file', prj.name) _p('ifeq (posix,$(SHELLTYPE))') _x('\t$(SILENT) rm -f $(RESPONSE)') _p('else') _x('\t$(SILENT) if exist $(RESPONSE) del %s', path.translate(response, '\\')) _p('endif') local sep = os.istarget("windows") and "\\" or "/" local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) if toolset.fileinfo(node).action == "Compile" then _x('\t@echo %s >> $(RESPONSE)', path.translate(node.relpath, sep)) end end }) _p('') end function make.csEmbedFiles(prj, toolset) local cfg = project.getfirstconfig(prj) _p('EMBEDFILES += \\') cs.listsources(prj, function(node) local fcfg = fileconfig.getconfig(node, cfg) local info = toolset.fileinfo(fcfg) if info.action == "EmbeddedResource" then return cs.getresourcefilename(cfg, node.relpath) end end) _p('') end function make.csFileRules(prj, toolset) end function make.csFlags(cfg, toolset) _p(' FLAGS =%s', make.list(toolset.getflags(cfg))) end function make.csLinkCmd(cfg, toolset) local deps = p.esc(config.getlinks(cfg, "dependencies", "fullpath")) _p(' DEPENDS =%s', make.list(deps)) _p(' REFERENCES = %s', table.implode(deps, "/r:", "", " ")) end function make.csProjectConfig(prj, toolset) local cfg = project.getfirstconfig(prj) local kindflag = "/t:" .. toolset.getkind(cfg):lower() local libdirs = table.implode(p.esc(cfg.libdirs), "/lib:", "", " ") _p('FLAGS += %s', table.concat(table.join(kindflag, libdirs), " ")) local refs = p.esc(config.getlinks(cfg, "system", "fullpath")) _p('REFERENCES += %s', table.implode(refs, "/r:", "", " ")) _p('') end function make.csSources(prj, toolset) local cfg = project.getfirstconfig(prj) _p('SOURCES += \\') cs.listsources(prj, function(node) local fcfg = fileconfig.getconfig(node, cfg) local info = toolset.fileinfo(fcfg) if info.action == "Compile" then return node.relpath end end) _p('') end function make.csTargetRules(prj, toolset) _p('$(TARGET): $(SOURCES) $(EMBEDFILES) $(DEPENDS) $(RESPONSE)') _p('\t$(SILENT) $(CSC) /nologo /out:$@ $(FLAGS) $(REFERENCES) @$(RESPONSE) $(patsubst %%,/resource:%%,$(EMBEDFILES))') _p('\t$(POSTBUILDCMDS)') _p('') end function make.csTools(cfg, toolset) _p(' CSC = %s', toolset.gettoolname(cfg, "csc")) _p(' RESGEN = %s', toolset.gettoolname(cfg, "resgen")) end local p = premake p.make.cpp = {} local make = p.make local cpp = p.make.cpp local project = p.project local config = p.config local fileconfig = p.fileconfig cpp.elements = {} cpp.elements.makefile = function(prj) return { make.header, make.phonyRules, make.cppConfigs, make.cppObjects, make.shellType, make.cppTargetRules, make.cppCustomFilesRules, make.cppTargetDirRules, make.cppObjDirRules, make.cppCleanRules, make.preBuildRules, make.preLinkRules, make.pchRules, make.cppFileRules, make.cppDependencies, } end function make.fileTypeExtensions() return { ["objects"] = "o", ["resources"] = "res", } end function make.fileType(node) local kind if path.iscppfile(node.abspath) then kind = "objects" elseif path.isresourcefile(node.abspath) then kind = "resources" end return kind end function make.fileDependency(prj, node) local filetype = make.fileType(node) _x('$(OBJDIR)/%s.%s: %s', node.objname, make.fileTypeExtensions()[filetype], node.relpath) _p('\t@echo $(notdir $<)') end function make.cpp.generate(prj) p.eol("\n") p.callArray(cpp.elements.makefile, prj) end cpp.elements.standardFileRules = function(prj, node) return { make.fileDependency, cpp.standardFileRules, } end cpp.elements.customFileRules = function(prj, node) return { make.fileDependency, cpp.customFileRules, } end cpp.elements.customBuildRules = function(prj, node) return { cpp.customFileRules } end cpp.elements.configuration = function(cfg, toolset) return { make.configBegin, make.cppTools, make.target, make.objdir, make.pch, make.defines, make.includes, make.forceInclude, make.cppFlags, make.cFlags, make.cxxFlags, make.resFlags, make.libs, make.ldDeps, make.ldFlags, make.linkCmd, make.exePaths, make.preBuildCmds, make.preLinkCmds, make.postBuildCmds, make.cppAllRules, make.settings, make.configEnd, } end function make.cppConfigs(prj) for cfg in project.eachconfig(prj) do local toolset = p.tools[_OPTIONS.cc or cfg.toolset or "gcc"] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end p.callArray(cpp.elements.configuration, cfg, toolset) _p('') end end function make.exePaths(cfg) local dirs = project.getrelative(cfg.project, cfg.bindirs) if #dirs > 0 then _p(' EXECUTABLE_PATHS = "%s"', table.concat(dirs, ":")) _p(' EXE_PATHS = export PATH=$(EXECUTABLE_PATHS):$$PATH;') end end function cpp.compileas(prj, node) local result if node["compileas"] then if p.languages.isc(node.compileas) or node.compileas == p.OBJECTIVEC then result = '$(CC) $(ALL_CFLAGS)' elseif p.languages.iscpp(node.compileas) or node.compileas == p.OBJECTIVECPP then result = '$(CXX) $(ALL_CXXFLAGS)' end end return result end function cpp.buildcommand(prj, objext, node) local flags = cpp.compileas(prj, node) if not flags then local iscfile = node and path.iscfile(node.abspath) or false flags = iif(prj.language == "C" or iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)') end _p('\t$(SILENT) %s $(FORCE_INCLUDE) -o "$@" -MF "$(@:%%.%s=%%.d)" -c "$<"', flags, objext) end function make.cppFileRules(prj) local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) local rules for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) if fileconfig.hasCustomBuildRule(filecfg) then rules = cpp.elements.customBuildRules(prj, node) break end if fileconfig.hasFileSettings(filecfg) then rules = cpp.elements.customFileRules(prj, node) break end end if not rules and make.fileType(node) then rules = cpp.elements.standardFileRules(prj, node) end if rules then p.callArray(rules, prj, node) end end }) _p('') end function cpp.standardFileRules(prj, node) local kind = make.fileType(node) if kind == "objects" then cpp.buildcommand(prj, make.fileTypeExtensions()[kind], node) elseif kind == "resources" then _p('\t$(SILENT) $(RESCOMP) $< -O coff -o "$@" $(ALL_RESFLAGS)') end end function cpp.customFileRules(prj, node) for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) if filecfg then make.configBegin(cfg) if fileconfig.hasCustomBuildRule(filecfg) then local output = project.getrelative(prj, filecfg.buildoutputs[1]) local dependencies = filecfg.relpath if filecfg.buildinputs and #filecfg.buildinputs > 0 then local inputs = project.getrelative(prj, filecfg.buildinputs) dependencies = dependencies .. " " .. table.concat(p.esc(inputs), " ") end _p('%s: %s', output, dependencies) _p('\t@echo "%s"', filecfg.buildmessage or ("Building " .. filecfg.relpath)) local cmds = os.translateCommandsAndPaths(filecfg.buildcommands, cfg.project.basedir, cfg.project.location) for _, cmd in ipairs(cmds) do if cfg.bindirs and #cfg.bindirs > 0 then _p('\t$(SILENT) $(EXE_PATHS) %s', cmd) else _p('\t$(SILENT) %s', cmd) end end else cpp.standardFileRules(prj, filecfg) end make.configEnd(cfg) end end end function make.cppObjects(prj) local root = { objects={}, resources={}, customfiles={} } local configs = {} for cfg in project.eachconfig(prj) do configs[cfg] = { objects={}, resources={}, customfiles={} } end local tr = project.getsourcetree(prj) p.tree.traverse(tr, { onleaf = function(node, depth) local incfg = {} local inall = true local custom = false for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) if filecfg and not filecfg.flags.ExcludeFromBuild then incfg[cfg] = filecfg custom = fileconfig.hasCustomBuildRule(filecfg) else inall = false end end if not custom then local kind if path.iscppfile(node.abspath) then kind = "objects" elseif path.isresourcefile(node.abspath) then kind = "resources" end if not custom and not kind then return end objectname = "$(OBJDIR)/" .. node.objname .. iif(kind == "objects", ".o", ".res") if inall then table.insert(root[kind], objectname) else for cfg in project.eachconfig(prj) do if incfg[cfg] then table.insert(configs[cfg][kind], objectname) end end end else for cfg in project.eachconfig(prj) do local filecfg = incfg[cfg] if filecfg then local output = project.getrelative(prj, filecfg.buildoutputs[1]) if path.isobjectfile(output) and (filecfg.linkbuildoutputs == true or filecfg.linkbuildoutputs == nil) then table.insert(configs[cfg].objects, output) else table.insert(configs[cfg].customfiles, output) end end end end end }) function listobjects(var, list) _p('%s \\', var) for _, objectname in ipairs(list) do _x('\t%s \\', objectname) end _p('') end listobjects('OBJECTS :=', root.objects, 'o') listobjects('RESOURCES :=', root.resources, 'res') listobjects('CUSTOMFILES :=', root.customfiles) for cfg in project.eachconfig(prj) do local files = configs[cfg] if #files.objects > 0 or #files.resources > 0 or #files.customfiles > 0 then make.configBegin(cfg, toolset) if #files.objects > 0 then listobjects(' OBJECTS +=', files.objects) end if #files.resources > 0 then listobjects(' RESOURCES +=', files.resources) end if #files.customfiles > 0 then listobjects(' CUSTOMFILES +=', files.customfiles) end make.configEnd(cfg, toolset) _p('') end end end function make.configBegin(cfg, toolset) if cfg then _x('ifeq ($(config),%s)', cfg.shortname) end end function make.configEnd(cfg, toolset) if cfg then _p('endif') end end function make.cFlags(cfg, toolset) _p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS)%s', make.list(table.join(toolset.getcflags(cfg), cfg.buildoptions))) end function make.cppAllRules(cfg, toolset) if cfg.system == p.MACOSX and cfg.kind == p.WINDOWEDAPP then _p('all: prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist') _p('\t@:') _p('') _p('$(dir $(TARGETDIR))PkgInfo:') _p('$(dir $(TARGETDIR))Info.plist:') else _p('all: prebuild prelink $(TARGET)') _p('\t@:') end end function make.cppFlags(cfg, toolset) _p(' ALL_CPPFLAGS += $(CPPFLAGS)%s $(DEFINES) $(INCLUDES)', make.list(toolset.getcppflags(cfg))) end function make.cxxFlags(cfg, toolset) _p(' ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS)%s', make.list(table.join(toolset.getcxxflags(cfg), cfg.buildoptions))) end function make.cppCleanRules(prj) _p('clean:') _p('\t@echo Cleaning %s', prj.name) _p('ifeq (posix,$(SHELLTYPE))') _p('\t$(SILENT) rm -f $(TARGET)') _p('\t$(SILENT) rm -rf $(OBJDIR)') _p('else') _p('\t$(SILENT) if exist $(subst /,\\\\,$(TARGET)) del $(subst /,\\\\,$(TARGET))') _p('\t$(SILENT) if exist $(subst /,\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\,$(OBJDIR))') _p('endif') _p('') end function make.cppDependencies(prj) _p('-include $(OBJECTS:%%.o=%%.d)') _p('ifneq (,$(PCH))') _p(' -include $(OBJDIR)/$(notdir $(PCH)).d') _p('endif') end function make.cppTargetRules(prj) _p('$(TARGET): $(GCH) ${CUSTOMFILES} $(OBJECTS) $(LDDEPS) $(RESOURCES) | $(TARGETDIR)') _p('\t@echo Linking %s', prj.name) _p('\t$(SILENT) $(LINKCMD)') _p('\t$(POSTBUILDCMDS)') _p('') end function make.cppCustomFilesRules(prj) _p('$(CUSTOMFILES): | $(OBJDIR)') _p('') end function make.cppTargetDirRules(prj) _p('$(TARGETDIR):') _p('\t@echo Creating $(TARGETDIR)') make.mkdir('$(TARGETDIR)') _p('') end function make.cppObjDirRules(prj) _p('$(OBJDIR):') _p('\t@echo Creating $(OBJDIR)') make.mkdir('$(OBJDIR)') _p('') end function make.cppTools(cfg, toolset) local tool = toolset.gettoolname(cfg, "cc") if tool then _p(' ifeq ($(origin CC), default)') _p(' CC = %s', tool) _p(' endif' ) end tool = toolset.gettoolname(cfg, "cxx") if tool then _p(' ifeq ($(origin CXX), default)') _p(' CXX = %s', tool) _p(' endif' ) end tool = toolset.gettoolname(cfg, "ar") if tool then _p(' ifeq ($(origin AR), default)') _p(' AR = %s', tool) _p(' endif' ) end tool = toolset.gettoolname(cfg, "rc") if tool then _p(' RESCOMP = %s', tool) end end function make.defines(cfg, toolset) _p(' DEFINES +=%s', make.list(table.join(toolset.getdefines(cfg.defines, cfg), toolset.getundefines(cfg.undefines)))) end function make.forceInclude(cfg, toolset) local includes = toolset.getforceincludes(cfg) if not cfg.flags.NoPCH and cfg.pchheader then table.insert(includes, 1, "-include $(OBJDIR)/$(notdir $(PCH))") end _x(' FORCE_INCLUDE +=%s', make.list(includes)) end function make.includes(cfg, toolset) local includes = toolset.getincludedirs(cfg, cfg.includedirs, cfg.sysincludedirs, cfg.frameworkdirs) _p(' INCLUDES +=%s', make.list(includes)) end function make.ldDeps(cfg, toolset) local deps = config.getlinks(cfg, "siblings", "fullpath") _p(' LDDEPS +=%s', make.list(p.esc(deps))) end function make.ldFlags(cfg, toolset) local flags = table.join(toolset.getLibraryDirectories(cfg), toolset.getrunpathdirs(cfg, table.join(cfg.runpathdirs, config.getsiblingtargetdirs(cfg))), toolset.getldflags(cfg), cfg.linkoptions) _p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(flags)) end function make.libs(cfg, toolset) local flags = toolset.getlinks(cfg) _p(' LIBS +=%s', make.list(flags, true)) end function make.linkCmd(cfg, toolset) if cfg.kind == p.STATICLIB then if cfg.architecture == p.UNIVERSAL then _p(' LINKCMD = libtool -o "$@" $(OBJECTS)') else _p(' LINKCMD = $(AR) ' .. (toolset.arargs or '-rcs') ..' "$@" $(OBJECTS)') end elseif cfg.kind == p.UTILITY then _p(' LINKCMD =') else local cc = iif(p.languages.isc(cfg.language), "CC", "CXX") _p(' LINKCMD = $(%s) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)', cc) end end function make.pch(cfg, toolset) local pch = p.tools.gcc.getpch(cfg) if pch == nil then return end _x(' PCH = %s', pch) _p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch') end function make.pchRules(prj) _p('ifneq (,$(PCH))') _p('$(OBJECTS): $(GCH) $(PCH) | $(OBJDIR)') _p('$(GCH): $(PCH) | $(OBJDIR)') _p('\t@echo $(notdir $<)') local cmd = iif(prj.language == "C", "$(CC) -x c-header $(ALL_CFLAGS)", "$(CXX) -x c++-header $(ALL_CXXFLAGS)") _p('\t$(SILENT) %s -o "$@" -MF "$(@:%%.gch=%%.d)" -c "$<"', cmd) _p('else') _p('$(OBJECTS): | $(OBJDIR)') _p('endif') _p('') end function make.resFlags(cfg, toolset) local resflags = table.join(toolset.getdefines(cfg.resdefines), toolset.getincludedirs(cfg, cfg.resincludedirs), cfg.resoptions) _p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s', make.list(resflags)) end local p = premake p.modules.gmake = {} p.modules.gmake._VERSION = p._VERSION p.make = p.modules.gmake local make = p.make local project = p.project function make.defaultconfig(target) local eachconfig = iif(target.project, project.eachconfig, p.workspace.eachconfig) local defaultconfig = nil if target.defaultplatform then for cfg in eachconfig(target) do if cfg.platform == target.defaultplatform then defaultconfig = cfg break end end end if not defaultconfig then local iter = eachconfig(target) defaultconfig = iter() end if defaultconfig then _p('ifndef config') _x(' config=%s', defaultconfig.shortname) _p('endif') _p('') end end function make.esc(value) result = value:gsub("\\", "\\\\") result = result:gsub("\"", "\\\"") result = result:gsub(" ", "\\ ") result = result:gsub("%(", "\\(") result = result:gsub("%)", "\\)") result = result:gsub("$\\%((.-)\\%)", "$(%1)") return result end function make.getmakefilename(this, searchprjs) local count = 0 for wks in p.global.eachWorkspace() do if wks.location == this.location then count = count + 1 end if searchprjs then for _, prj in ipairs(wks.projects) do if prj.location == this.location then count = count + 1 end end end end if count == 1 then return "Makefile" else return ".make" end end function make.header(target) local kind = iif(target.project, "project", "workspace") _p('# %s %s makefile autogenerated by Premake', p.action.current().shortname, kind) _p('') if kind == "workspace" then local haspch = false for _, prj in ipairs(target.projects) do for cfg in project.eachconfig(prj) do if cfg.pchheader then haspch = true end end end if haspch then _p('.NOTPARALLEL:') _p('') end end make.defaultconfig(target) _p('ifndef verbose') _p(' SILENT = @') _p('endif') _p('') end function make.mkdir(dirname) _p('ifeq (posix,$(SHELLTYPE))') _p('\t$(SILENT) mkdir -p %s', dirname) _p('else') _p('\t$(SILENT) mkdir $(subst /,\\\\,%s)', dirname) _p('endif') end function make.mkdirRules(dirname) _p('%s:', dirname) _p('\t@echo Creating %s', dirname) make.mkdir(dirname) _p('') end function make.list(value, quoted) quoted = false if #value > 0 then if quoted then local result = "" for _, v in ipairs (value) do if #result then result = result .. " " end result = result .. p.quoted(v) end return result else return " " .. table.concat(value, " ") end else return "" end end function make.tovar(value) value = value:gsub("[ -]", "_") value = value:gsub("[()]", "") return value end function make.objdir(cfg) _x(' OBJDIR = %s', p.esc(project.getrelative(cfg.project, cfg.objdir))) end function make.objDirRules(prj) make.mkdirRules("$(OBJDIR)") end function make.phonyRules(prj) _p('.PHONY: clean prebuild prelink') _p('') end function make.buildCmds(cfg, event) _p(' define %sCMDS', event:upper()) local steps = cfg[event .. "commands"] local msg = cfg[event .. "message"] if #steps > 0 then steps = os.translateCommandsAndPaths(steps, cfg.project.basedir, cfg.project.location) msg = msg or string.format("Running %s commands", event) _p('\t@echo %s', msg) _p('\t%s', table.implode(steps, "", "", "\n\t")) end _p(' endef') end function make.preBuildCmds(cfg, toolset) make.buildCmds(cfg, "prebuild") end function make.preBuildRules(prj) _p('prebuild:') _p('\t$(PREBUILDCMDS)') _p('') end function make.preLinkCmds(cfg, toolset) make.buildCmds(cfg, "prelink") end function make.preLinkRules(prj) _p('prelink:') _p('\t$(PRELINKCMDS)') _p('') end function make.postBuildCmds(cfg, toolset) make.buildCmds(cfg, "postbuild") end function make.settings(cfg, toolset) if #cfg.makesettings > 0 then for _, value in ipairs(cfg.makesettings) do _p(value) end end local value = toolset.getmakesettings(cfg) if value then _p(value) end end function make.shellType() _p('SHELLTYPE := posix') _p('ifeq (.exe,$(findstring .exe,$(ComSpec)))') _p('\tSHELLTYPE := msdos') _p('endif') _p('') end function make.target(cfg) _x(' TARGETDIR = %s', project.getrelative(cfg.project, cfg.buildtarget.directory)) _x(' TARGET = $(TARGETDIR)/%s', cfg.buildtarget.name) end function make.targetDirRules(prj) make.mkdirRules("$(TARGETDIR)") end include("gmake_cpp.lua") include("gmake_csharp.lua") include("gmake_makefile.lua") include("gmake_utility.lua") include("gmake_workspace.lua") return p.modules.gmake local p = premake local project = p.project newaction { trigger = "gmake", shortname = "GNU Make", description = "Generate GNU makefiles for POSIX, MinGW, and Cygwin", toolset = "gcc", valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Utility", "Makefile" }, valid_languages = { "C", "C++", "C#" }, valid_tools = { cc = { "clang", "gcc" }, dotnet = { "mono", "msnet", "pnet" } }, onWorkspace = function(wks) p.escaper(p.make.esc) p.generate(wks, p.make.getmakefilename(wks, false), p.make.generate_workspace) end, onProject = function(prj) p.escaper(p.make.esc) local makefile = p.make.getmakefilename(prj, true) if prj.kind == p.UTILITY then p.generate(prj, makefile, p.make.utility.generate) elseif prj.kind == p.MAKEFILE then p.generate(prj, makefile, p.make.makefile.generate) else if project.isdotnet(prj) then p.generate(prj, makefile, p.make.cs.generate) elseif project.isc(prj) or project.iscpp(prj) then p.generate(prj, makefile, p.make.cpp.generate) end end end, onCleanWorkspace = function(wks) p.clean.file(wks, p.make.getmakefilename(wks, false)) end, onCleanProject = function(prj) p.clean.file(prj, p.make.getmakefilename(prj, true)) end } return function(cfg) return (_ACTION == "gmake") end local p = premake p.raw = { } local raw = p.raw local gvisited = { } function raw.workspace(wks) if not gvisited[wks.global] then gvisited[wks.global] = true raw.printTable({ global = wks.global }) end end function raw.printTable(t, i) i = i or 0 placement = raw._createPlacement(t) raw._printTableRecursive(t, i, placement) end function raw._printTableRecursive(t, i, placement) elements = { } for k, v in pairs(t) do table.insert(elements, { key = k, value = v }) end table.sort(elements, function(a, b) local n1 = type(a.key) == "number" local n2 = type(b.key) == "number" if n1 ~= n2 then return n1 end local k1 = n1 and a.key or raw._encode(a.key) local k2 = n2 and b.key or raw._encode(b.key) return k1 < k2 end) for _, elem in ipairs(elements) do p = placement[elem.value] if p and elem.key == p.key and t == p.parent then _p(i, "%s", raw._encode(elem.key) .. ': ' .. raw._encode(elem.value) .. ' {') raw._printTableRecursive(elem.value, i + 1, placement) _p(i, '} # ' .. raw._encode(elem.key)) else _p(i, "%s", raw._encode(elem.key) .. ': ' .. raw._encode(elem.value)) end end end function raw._createPlacement(tbl) placement = { } placementList = { tbl } while #placementList ~= 0 do parentList = { } for _, parent in ipairs(placementList) do for k, v in pairs(parent) do if type(v) == "table" and not placement[v] then table.insert(parentList, v) placement[v] = { parent = parent, key = k } end end end placementList = parentList end return placement end function raw._encode(v) if type(v) == "string" then return '"' .. v .. '"' else return tostring(v) end end local p = premake p.modules.raw = {} local m = p.modules.raw m.elements = {} dofile("_preload.lua") dofile("raw_action.lua") return m newaction { trigger = "raw", shortname = "Raw output", description = "Generate raw representation of Premake structures", onsolution = function(sln) require('raw') premake.generate(sln, ".raw", premake.raw.workspace) end, } return function(cfg) return (_ACTION == "raw") end local p = premake local m = p.modules.xcode local xcode = p.modules.xcode local project = p.project local config = p.config local fileconfig = p.fileconfig local tree = p.tree function xcode.mustExcludeFromTarget(node, prj) if not node.configs then return false end local value for cfg in premake.project.eachconfig(prj) do local filecfg = premake.fileconfig.getconfig(node, cfg) if filecfg then local newValue = not not filecfg.flags.ExcludeFromBuild if value == nil then value = newValue elseif value ~= newValue then p.warn(node.name .. " is excluded in just some configurations. Autocompletion will not work correctly on this file in Xcode.") return false end end end return value end function xcode.buildprjtree(prj) local tr = project.getsourcetree(prj, nil , false) tr.project = prj tr.configs = {} for cfg in project.eachconfig(prj) do cfg.xcode = {} cfg.xcode.targetid = xcode.newid(prj.xcode.projectnode.name, cfg.buildcfg, "target") cfg.xcode.projectid = xcode.newid(tr.name, cfg.buildcfg) table.insert(tr.configs, cfg) end tree.traverse(tr, { onbranch = function(node) if path.getextension(node.name) == ".lproj" then local lang = path.getbasename(node.name) -- "English", "French", etc. for _, filenode in ipairs(node.children) do local grpnode = node.parent.children[filenode.name] if not grpnode then grpnode = tree.insert(node.parent, tree.new(filenode.name)) grpnode.kind = "vgroup" end filenode.name = path.getbasename(lang) tree.insert(grpnode, filenode) end tree.remove(node) end end }) tr.frameworks = tree.new("Frameworks") for cfg in project.eachconfig(prj) do for _, link in ipairs(config.getlinks(cfg, "system", "fullpath")) do local name = path.getname(link) if xcode.isframeworkordylib(name) and not tr.frameworks.children[name] then node = tree.insert(tr.frameworks, tree.new(name)) node.path = link end end end if #tr.frameworks.children > 0 then tree.insert(tr, tr.frameworks) end tr.products = tree.insert(tr, tree.new("Products")) tr.projects = tree.new("Projects") for _, dep in ipairs(project.getdependencies(prj, "linkOnly")) do xcode.addDependency(prj, tr, dep, true) end for _, dep in ipairs(project.getdependencies(prj, "dependOnly")) do xcode.addDependency(prj, tr, dep, false) end if #tr.projects.children > 0 then tree.insert(tr, tr.projects) end tree.traverse(tr, { onnode = function(node) local nodePath if node.path then nodePath = path.getrelative(tr.project.location, node.path) end node.id = xcode.newid(node.name, nil, nodePath) node.isResource = xcode.isItemResource(prj, node) if node.configs then for cfg in project.eachconfig(prj) do local filecfg = fileconfig.getconfig(node, cfg) if fileconfig.hasCustomBuildRule(filecfg) then if not node.buildcommandid then node.buildcommandid = xcode.newid(node.name, "buildcommand", nodePath) end end end end if xcode.getbuildcategory(node) and not node.excludefrombuild and not xcode.mustExcludeFromTarget(node, tr.project) then node.buildid = xcode.newid(node.name, "build", nodePath) if xcode.shouldembed(tr, node) then node.embedid = xcode.newid(node.name, "embed", nodepath) end end if string.endswith(node.name, "Info.plist") then tr.infoplist = node end end }, true) node = tree.insert(tr.products, prj.xcode.projectnode) node.kind = "product" node.path = node.cfg.buildtarget.fullpath node.cfgsection = xcode.newid(node.name, "cfg") node.resstageid = xcode.newid(node.name, "rez") node.sourcesid = xcode.newid(node.name, "src") node.fxstageid = xcode.newid(node.name, "fxs") node.embedstageid = xcode.newid(node.name, "embed") return tr end function xcode.addDependency(prj, tr, dep, build) local xcpath = xcode.getxcodeprojname(dep) local xcnode = tree.insert(tr.projects, tree.new(path.getname(xcpath))) xcnode.path = xcpath xcnode.project = dep xcnode.productgroupid = xcode.newid(xcnode.name, "prodgrp") xcnode.productproxyid = xcode.newid(xcnode.name, "prodprox") xcnode.targetproxyid = xcode.newid(xcnode.name, "targprox") xcnode.targetdependid = xcode.newid(xcnode.name, "targdep") local lprj = p.workspace.findproject(prj.workspace, dep.name) local cfg = project.findClosestMatch(lprj, prj.configurations[1]) node = tree.insert(xcnode, tree.new(cfg.linktarget.name)) node.path = cfg.linktarget.fullpath node.cfg = cfg if build == false then node.excludefrombuild = true end end m.elements.project = function(prj) return { m.header, } end function m.generateProject(prj) local tr = xcode.buildprjtree(prj) p.callArray(m.elements.project, prj) xcode.PBXBuildFile(tr) xcode.PBXContainerItemProxy(tr) xcode.PBXFileReference(tr) xcode.PBXFrameworksBuildPhase(tr) xcode.PBXCopyFilesBuildPhaseForEmbedFrameworks(tr) xcode.PBXGroup(tr) xcode.PBXNativeTarget(tr) xcode.PBXAggregateTarget(tr) xcode.PBXProject(tr) xcode.PBXReferenceProxy(tr) xcode.PBXResourcesBuildPhase(tr) xcode.PBXShellScriptBuildPhase(tr) xcode.PBXSourcesBuildPhase(tr) xcode.PBXTargetDependency(tr) xcode.PBXVariantGroup(tr) xcode.XCBuildConfiguration(tr) xcode.XCBuildConfigurationList(tr) xcode.footer(prj) end function m.header(prj) p.w('// !$*UTF8*$!') p.push('{') p.w('archiveVersion = 1;') p.w('classes = {') p.w('};') p.w('objectVersion = 46;') p.push('objects = {') p.w() end function xcode.footer(prj) p.pop('};') p.w('rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;') p.pop('}') end local p = premake local xcode = p.modules.xcode local tree = p.tree local workspace = p.workspace local project = p.project local config = p.config local fileconfig = p.fileconfig function xcode.getbuildcategory(node) local categories = { [".a"] = "Frameworks", [".c"] = "Sources", [".cc"] = "Sources", [".cpp"] = "Sources", [".cxx"] = "Sources", [".c++"] = "Sources", [".dylib"] = "Frameworks", [".framework"] = "Frameworks", [".m"] = "Sources", [".mm"] = "Sources", [".strings"] = "Resources", [".nib"] = "Resources", [".xib"] = "Resources", [".storyboard"] = "Resources", [".icns"] = "Resources", [".s"] = "Sources", [".S"] = "Sources", [".swift"] = "Sources", [".metal"] = "Resources", } if node.isResource then return "Resources" elseif node.cfg and (node.cfg.kind == p.SHAREDLIB or node.cfg.kind == p.STATICLIB) then return "Frameworks" end return categories[path.getextension(node.name)] end function xcode.isItemResource(project, node) local res if project and project.xcodebuildresources then if type(project.xcodebuildresources) == "table" then res = project.xcodebuildresources end end local function checkItemInList(item, list) if item then for _,v in pairs(list) do if string.find(item, path.wildcards(v)) then return true end end end return false end if (checkItemInList(node.path, res)) then return true end return false end function xcode.getfiletypekey(node, cfg) if node.configs then local filecfg = fileconfig.getconfig(node, cfg) if filecfg and filecfg["compileas"] then return "explicitFileType" end end return "lastKnownFileType" end function xcode.getfiletype(node, cfg) if node.configs then local filecfg = fileconfig.getconfig(node, cfg) if filecfg then if p.languages.isc(filecfg.compileas) then return "sourcecode.c.c" elseif p.languages.iscpp(filecfg.compileas) then return "sourcecode.cpp.cpp" elseif filecfg.compileas == p.OBJECTIVEC then return "sourcecode.c.objc" elseif filecfg.compileas == p.OBJECTIVECPP then return "sourcecode.cpp.objcpp" end end end local types = { [".c"] = "sourcecode.c.c", [".cc"] = "sourcecode.cpp.cpp", [".cpp"] = "sourcecode.cpp.cpp", [".css"] = "text.css", [".cxx"] = "sourcecode.cpp.cpp", [".c++"] = "sourcecode.cpp.cpp", [".S"] = "sourcecode.asm.asm", [".framework"] = "wrapper.framework", [".gif"] = "image.gif", [".h"] = "sourcecode.c.h", [".html"] = "text.html", [".lua"] = "sourcecode.lua", [".m"] = "sourcecode.c.objc", [".mm"] = "sourcecode.cpp.objc", [".nib"] = "wrapper.nib", [".storyboard"] = "file.storyboard", [".pch"] = "sourcecode.c.h", [".plist"] = "text.plist.xml", [".strings"] = "text.plist.strings", [".xib"] = "file.xib", [".icns"] = "image.icns", [".s"] = "sourcecode.asm", [".bmp"] = "image.bmp", [".wav"] = "audio.wav", [".xcassets"] = "folder.assetcatalog", [".swift"] = "sourcecode.swift", [".metal"] = "sourcecode.metal", [".dylib"] = "compiled.mach-o.dylib", } return types[path.getextension(node.path)] or "text" end xcode.escapeSpecialChars = { ['\n'] = '\\n', ['\r'] = '\\r', ['\t'] = '\\t', } function xcode.escapeChar(c) return xcode.escapeSpecialChars[c] or '\\'..c end function xcode.escapeArg(value) value = value:gsub('[\'"\\\n\r\t ]', xcode.escapeChar) return value end function xcode.escapeSetting(value) value = value:gsub('["\\\n\r\t]', xcode.escapeChar) return value end function xcode.stringifySetting(value) value = value..'' if not value:match('^[%a%d_./]+$') then value = '"'..xcode.escapeSetting(value)..'"' end return value end function xcode.customStringifySetting(value) value = value..'' local test = value:match('^[%a%d_./%+]+$') if test then value = '"'..xcode.escapeSetting(value)..'"' end return value end function xcode.printSetting(level, name, value) if type(value) == 'function' then value(level, name) elseif type(value) ~= 'table' then _p(level, '%s = %s;', xcode.stringifySetting(name), xcode.stringifySetting(value)) elseif #value >= 1 then _p(level, '%s = (', xcode.stringifySetting(name)) for _, item in ipairs(value) do _p(level + 1, '%s,', xcode.stringifySetting(item)) end _p(level, ');') end end function xcode.printSettingsTable(level, settings) local keys = table.keys(settings) table.sort(keys) for _, k in ipairs(keys) do xcode.printSetting(level, k, settings[k]) end end function xcode.overrideSettings(settings, overrides) if type(overrides) == 'table' then for name, value in pairs(overrides) do settings[name] = iif(not table.equals(value, { false }), value, nil) end end end function xcode.getproducttype(node) local types = { ConsoleApp = "com.apple.product-type.tool", WindowedApp = "com.apple.product-type.application", StaticLib = "com.apple.product-type.library.static", SharedLib = "com.apple.product-type.library.dynamic", OSXBundle = "com.apple.product-type.bundle", OSXFramework = "com.apple.product-type.framework", XCTest = "com.apple.product-type.bundle.unit-test", } return types[iif(node.cfg.kind == "SharedLib" and node.cfg.sharedlibtype, node.cfg.sharedlibtype, node.cfg.kind)] end function xcode.gettargettype(node) local types = { ConsoleApp = "\"compiled.mach-o.executable\"", WindowedApp = "wrapper.application", StaticLib = "archive.ar", SharedLib = "\"compiled.mach-o.dylib\"", OSXBundle = "wrapper.cfbundle", OSXFramework = "wrapper.framework", XCTest = "wrapper.cfbundle", } return types[iif(node.cfg.kind == "SharedLib" and node.cfg.sharedlibtype, node.cfg.sharedlibtype, node.cfg.kind)] end function xcode.getToolSet(cfg) local default = "clang" local minOSVersion = project.systemversion(cfg) if minOSVersion ~= nil and cfg.system == p.MACOSX and p.checkVersion(minOSVersion, "<10.7") then default = "gcc" end local toolset = p.tools[_OPTIONS.cc or cfg.toolset or default] if not toolset then error("Invalid toolset '" .. cfg.toolset .. "'") end return toolset end function xcode.getdebugformat(cfg) local formats = { ["Dwarf"] = "dwarf", ["Default"] = "dwarf-with-dsym", ["SplitDwarf"] = "dwarf-with-dsym", } local rval = "dwarf-with-dsym" if cfg.debugformat then rval = formats[cfg.debugformat] or rval end return rval end function xcode.getxcodeprojname(prj) local fname = p.filename(prj, ".xcodeproj") return fname end function xcode.isframework(fname) return (path.getextension(fname) == ".framework") end function xcode.isdylib(fname) return (path.getextension(fname) == ".dylib") end function xcode.isframeworkordylib(fname) return xcode.isframework(fname) or xcode.isdylib(fname) end function xcode.newid(...) local name = '' local arg = {...} for i, v in pairs(arg) do name = name..v..'****' end return ("%08X%08X%08X"):format(name:hash(16777619), name:hash(2166136261), name:hash(46577619)) end function xcode.prepareWorkspace(wks) wks.xcode = { } for prj in p.workspace.eachproject(wks) do local cfg = project.getconfig(prj, prj.configurations[1], prj.platforms[1]) local bundlepath = cfg.buildtarget.bundlename ~= "" and cfg.buildtarget.bundlename or cfg.buildtarget.name; if (prj.external) then bundlepath = cfg.project.name end local node = p.tree.new(path.getname(bundlepath)) node.cfg = cfg node.id = xcode.newid(node.name, "product") node.targetid = xcode.newid(node.name, "target") prj.xcode = {} prj.xcode.projectnode = node end end function xcode.PBXBuildFile(tr) local settings = {}; tree.traverse(tr, { onnode = function(node) if node.buildid then settings[node.buildid] = function(level) _p(level,'%s /* %s in %s */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };', node.buildid, node.name, xcode.getbuildcategory(node), node.id, node.name) if node.embedid then local attrs = "" if xcode.shouldembedandsign(tr, node) then attrs = attrs .. "CodeSignOnCopy, " end if xcode.isframework(node.name) then attrs = attrs .. "RemoveHeadersOnCopy, " end if attrs ~= "" then attrs = " settings = {ATTRIBUTES = (" .. attrs .. "); };" end _p(level,'%s /* %s in Embed Libraries */ = {isa = PBXBuildFile; fileRef = %s /* %s */;%s };', node.embedid, node.name, node.id, node.name, attrs) end end end end }) if not table.isempty(settings) then _p('/* Begin PBXBuildFile section */') xcode.printSettingsTable(2, settings); _p('/* End PBXBuildFile section */') _p('') end end function xcode.PBXContainerItemProxy(tr) local settings = {} for _, node in ipairs(tr.projects.children) do settings[node.productproxyid] = function() _p(2,'%s /* PBXContainerItemProxy */ = {', node.productproxyid) _p(3,'isa = PBXContainerItemProxy;') _p(3,'containerPortal = %s /* %s */;', node.id, path.getrelative(node.parent.parent.project.location, node.path)) _p(3,'proxyType = 2;') _p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.id) _p(3,'remoteInfo = %s;', xcode.stringifySetting(node.project.xcode.projectnode.name)) _p(2,'};') end settings[node.targetproxyid] = function() _p(2,'%s /* PBXContainerItemProxy */ = {', node.targetproxyid) _p(3,'isa = PBXContainerItemProxy;') _p(3,'containerPortal = %s /* %s */;', node.id, path.getrelative(node.parent.parent.project.location, node.path)) _p(3,'proxyType = 1;') _p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.targetid) _p(3,'remoteInfo = %s;', xcode.stringifySetting(node.project.xcode.projectnode.name)) _p(2,'};') end end if not table.isempty(settings) then _p('/* Begin PBXContainerItemProxy section */') xcode.printSettingsTable(2, settings); _p('/* End PBXContainerItemProxy section */') _p('') end end function xcode.PBXFileReference(tr) local cfg = project.getfirstconfig(tr.project) local settings = {} tree.traverse(tr, { onleaf = function(node) if not node.path then return end if node.kind == "product" then settings[node.id] = function(level) _p(level,'%s /* %s */ = {isa = PBXFileReference; explicitFileType = %s; includeInIndex = 0; name = %s; path = %s; sourceTree = BUILT_PRODUCTS_DIR; };', node.id, node.name, xcode.gettargettype(node), xcode.stringifySetting(node.name), xcode.stringifySetting(path.getname(node.cfg.buildtarget.bundlename ~= "" and node.cfg.buildtarget.bundlename or node.cfg.buildtarget.relpath))) end elseif node.parent.parent == tr.projects then settings[node.parent.id] = function(level) local relpath = path.getrelative(path.getabsolute(tr.project.location), path.getabsolute(node.parent.project.location)) _p(level,'%s /* %s */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = %s; path = %s; sourceTree = SOURCE_ROOT; };', node.parent.id, node.name, xcode.customStringifySetting(node.parent.name), xcode.stringifySetting(path.join(relpath, node.parent.name))) end else settings[node.id] = function(level) local pth, src if xcode.isframework(node.path) then local nodePath = node.path local _, matchEnd, variable = string.find(nodePath, "^%$%((.+)%)/") if variable then nodePath = string.sub(nodePath, matchEnd + 1) end if string.find(nodePath,'/') then if string.find(nodePath,'^%.')then pth = path.getrelative(tr.project.location, node.path) src = "SOURCE_ROOT" variable = src else pth = nodePath src = "" end end if variable then src = variable if string.find(pth, '^/') then pth = string.sub(pth, 2) end else pth = "System/Library/Frameworks/" .. node.path src = "SDKROOT" end elseif xcode.isdylib(node.path) then local nodePath = node.path local _, matchEnd, variable = string.find(nodePath, "^%$%((.+)%)/") if variable then nodePath = string.sub(nodePath, matchEnd + 1) end if string.find(nodePath,'^%/') then pth = nodePath src = "" else pth = path.getrelative(tr.project.location, node.path) src = "SOURCE_ROOT" end else src = "" if node.abspath then pth = path.getrelative(tr.project.location, node.abspath) else pth = node.path end end _p(level,'%s /* %s */ = {isa = PBXFileReference; %s = %s; name = %s; path = %s; sourceTree = %s; };', node.id, node.name, xcode.getfiletypekey(node, cfg), xcode.getfiletype(node, cfg), xcode.stringifySetting(node.name), xcode.stringifySetting(pth), xcode.stringifySetting(src)) end end end }) if not table.isempty(settings) then _p('/* Begin PBXFileReference section */') xcode.printSettingsTable(2, settings) _p('/* End PBXFileReference section */') _p('') end end function xcode.PBXFrameworksBuildPhase(tr) _p('/* Begin PBXFrameworksBuildPhase section */') _p(2,'%s /* Frameworks */ = {', tr.products.children[1].fxstageid) _p(3,'isa = PBXFrameworksBuildPhase;') _p(3,'buildActionMask = 2147483647;') _p(3,'files = (') tree.traverse(tr.frameworks, { onleaf = function(node) if node.buildid then _p(4,'%s /* %s in Frameworks */,', node.buildid, node.name) end end }) tree.traverse(tr.projects, { onleaf = function(node) if node.buildid then _p(4,'%s /* %s in Frameworks */,', node.buildid, node.name) end end }) _p(3,');') _p(3,'runOnlyForDeploymentPostprocessing = 0;') _p(2,'};') _p('/* End PBXFrameworksBuildPhase section */') _p('') end function xcode.embedListContains(list, node) local entryname = node.name if node.parent.project then entryname = node.parent.project.name end return table.contains(list, entryname) end function xcode.shouldembed(tr, node) if not xcode.isframeworkordylib(node.name) then return false end for _, cfg in ipairs(tr.configs) do if xcode.embedListContains(cfg.embed, node) or xcode.embedListContains(cfg.embedAndSign, node) then return true end end end function xcode.shouldembedandsign(tr, node) if not xcode.isframeworkordylib(node.name) then return false end for _, cfg in ipairs(tr.configs) do if xcode.embedListContains(cfg.embedAndSign, node) then return true end end end function xcode.PBXCopyFilesBuildPhaseForEmbedFrameworks(tr) _p('/* Begin PBXCopyFilesBuildPhase section */') _p(2,'%s /* Embed Libraries */ = {', tr.products.children[1].embedstageid) _p(3,'isa = PBXCopyFilesBuildPhase;') _p(3,'buildActionMask = 2147483647;') _p(3,'dstPath = "";') _p(3,'dstSubfolderSpec = 10;') _p(3,'files = (') tree.traverse(tr.frameworks, { onleaf = function(node) if node.embedid then _p(4,'%s /* %s in Frameworks */,', node.embedid, node.name) end end }) tree.traverse(tr.projects, { onleaf = function(node) if node.embedid then _p(4,'%s /* %s in Projects */,', node.embedid, node.parent.project.name) end end }) _p(3,');') _p(3,'name = "Embed Libraries";') _p(3,'runOnlyForDeploymentPostprocessing = 0;') _p(2,'};') _p('/* End PBXCopyFilesBuildPhase section */') _p('') end function xcode.PBXGroup(tr) local settings = {} tree.traverse(tr, { onnode = function(node) if (node.path and #node.children == 0) or node.kind == "vgroup" then return end local function isAggregateTarget(node) local productsId = xcode.newid("Products") return node.id == productsId and node.parent.project and node.parent.project.kind == "Utility" end if isAggregateTarget(node) then return end settings[node.productgroupid or node.id] = function() if node.parent == tr.projects then _p(2,'%s /* Products */ = {', node.productgroupid) else _p(2,'%s /* %s */ = {', node.id, node.name) end _p(3,'isa = PBXGroup;') _p(3,'children = (') for _, childnode in ipairs(node.children) do if not isAggregateTarget(childnode) then _p(4,'%s /* %s */,', childnode.id, childnode.name) end end _p(3,');') if node.parent == tr.projects then _p(3,'name = Products;') else _p(3,'name = %s;', xcode.stringifySetting(node.name)) local vpath = project.getvpath(tr.project, node.name) if node.path and node.name ~= vpath then local p = node.path if node.parent.path then p = path.getrelative(node.parent.path, node.path) end _p(3,'path = %s;', xcode.stringifySetting(p)) end end _p(3,'sourceTree = "";') _p(2,'};') end end }, true) if not table.isempty(settings) then _p('/* Begin PBXGroup section */') xcode.printSettingsTable(2, settings) _p('/* End PBXGroup section */') _p('') end end function xcode.GetBuildCommands(tr) local buildCommandInfos = {} tree.traverse(tr, { onnode = function(node) if node.buildcommandid then local info = { node = node, inputs = { node.relpath }, outputs = {}, depends = {}, transact = false, } for cfg in project.eachconfig(tr.project) do local filecfg = fileconfig.getconfig(node, cfg) if filecfg then for _, v in ipairs(filecfg.buildinputs) do table.insert(info.inputs, project.getrelative(tr.project, v)) end for _, v in ipairs(filecfg.buildoutputs) do table.insert(info.outputs, project.getrelative(tr.project, v)) end end end table.insert(buildCommandInfos, info) end end }) for _, mine in ipairs(buildCommandInfos) do for _, their in ipairs(buildCommandInfos) do if mine ~= their then for _, input in ipairs(mine.inputs) do if table.contains(their.outputs, input) then table.insert(mine.depends, their) break end end end end end local buildCommands = {} local leftover = #buildCommandInfos while leftover > 0 do local prev = leftover for _, info in ipairs(buildCommandInfos) do if not info.transact then local transact = true for _, depend in ipairs(info.depends) do transact = depend.transact if not transact then break end end if transact then table.insert(buildCommands, info.node) info.transact = true leftover = leftover - 1 end end end if prev == leftover then error('detect circular reference.') end end return buildCommands end function xcode.PBXAggregateOrNativeTarget(tr, pbxTargetName) local kinds = { Aggregate = { "Utility", }, Native = { "ConsoleApp", "WindowedApp", "SharedLib", "StaticLib", }, } local hasTarget = false for _, node in ipairs(tr.products.children) do hasTarget = table.contains(kinds[pbxTargetName], node.cfg.kind) if hasTarget then break end end if not hasTarget then return end _p('/* Begin PBX%sTarget section */', pbxTargetName) local buildCommands = xcode.GetBuildCommands(tr) for _, node in ipairs(tr.products.children) do local name = tr.project.name local function hasBuildCommands(which) for _, cfg in ipairs(tr.configs) do if #cfg[which] > 0 then return true end end end _p(2,'%s /* %s */ = {', node.targetid, name) _p(3,'isa = PBX%sTarget;', pbxTargetName) _p(3,'buildConfigurationList = %s /* Build configuration list for PBX%sTarget "%s" */;', node.cfgsection, pbxTargetName, xcode.escapeSetting(name)) _p(3,'buildPhases = (') if hasBuildCommands('prebuildcommands') then _p(4,'9607AE1010C857E500CD1376 /* Prebuild */,') end for _, v in ipairs(buildCommands) do _p(4,'%s /* Build "%s" */,', v.buildcommandid, v.name) end if pbxTargetName == "Native" then _p(4,'%s /* Resources */,', node.resstageid) _p(4,'%s /* Sources */,', node.sourcesid) end if hasBuildCommands('prelinkcommands') then _p(4,'9607AE3510C85E7E00CD1376 /* Prelink */,') end if pbxTargetName == "Native" then _p(4,'%s /* Frameworks */,', node.fxstageid) _p(4,'%s /* Embed Libraries */,', node.embedstageid) end if hasBuildCommands('postbuildcommands') then _p(4,'9607AE3710C85E8F00CD1376 /* Postbuild */,') end _p(3,');') _p(3,'buildRules = (') _p(3,');') _p(3,'dependencies = (') for _, node in ipairs(tr.projects.children) do _p(4,'%s /* PBXTargetDependency */,', node.targetdependid) end _p(3,');') _p(3,'name = %s;', xcode.stringifySetting(name)) if pbxTargetName == "Native" then local p if node.cfg.kind == "ConsoleApp" then p = "$(HOME)/bin" elseif node.cfg.kind == "WindowedApp" then p = "$(HOME)/Applications" end if p then _p(3,'productInstallPath = %s;', xcode.stringifySetting(p)) end end _p(3,'productName = %s;', xcode.stringifySetting(name)) if pbxTargetName == "Native" then _p(3,'productReference = %s /* %s */;', node.id, node.name) _p(3,'productType = %s;', xcode.stringifySetting(xcode.getproducttype(node))) end _p(2,'};') end _p('/* End PBX%sTarget section */', pbxTargetName) _p('') end function xcode.PBXAggregateTarget(tr) xcode.PBXAggregateOrNativeTarget(tr, "Aggregate") end function xcode.PBXNativeTarget(tr) xcode.PBXAggregateOrNativeTarget(tr, "Native") end function xcode.PBXProject(tr) _p('/* Begin PBXProject section */') _p(2,'08FB7793FE84155DC02AAC07 /* Project object */ = {') _p(3,'isa = PBXProject;') local capabilities = tr.project.xcodesystemcapabilities if not table.isempty(capabilities) then local keys = table.keys(capabilities) table.sort(keys) _p(3, 'attributes = {') _p(4, 'TargetAttributes = {') _p(5, '%s = {', tr.project.xcode.projectnode.targetid) _p(6, 'SystemCapabilities = {') for _, key in pairs(keys) do _p(7, '%s = {', key) _p(8, 'enabled = %d;', iif(capabilities[key], 1, 0)) _p(7, '};') end _p(6, '};') _p(5, '};') _p(4, '};') _p(3, '};') end _p(3,'buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "%s" */;', tr.name) _p(3,'compatibilityVersion = "Xcode 3.2";') _p(3,'hasScannedForEncodings = 1;') _p(3,'mainGroup = %s /* %s */;', tr.id, tr.name) _p(3,'projectDirPath = "";') if #tr.projects.children > 0 then _p(3,'projectReferences = (') for _, node in ipairs(tr.projects.children) do _p(4,'{') _p(5,'ProductGroup = %s /* Products */;', node.productgroupid) _p(5,'ProjectRef = %s /* %s */;', node.id, path.getname(node.path)) _p(4,'},') end _p(3,');') end _p(3,'projectRoot = "";') _p(3,'targets = (') for _, node in ipairs(tr.products.children) do _p(4,'%s /* %s */,', node.targetid, node.name) end _p(3,');') _p(2,'};') _p('/* End PBXProject section */') _p('') end function xcode.PBXReferenceProxy(tr) local settings = {} tree.traverse(tr.projects, { onleaf = function(node) settings[node.id] = function() _p(2,'%s /* %s */ = {', node.id, node.name) _p(3,'isa = PBXReferenceProxy;') _p(3,'fileType = %s;', xcode.gettargettype(node)) _p(3,'path = %s;', xcode.stringifySetting(node.name)) _p(3,'remoteRef = %s /* PBXContainerItemProxy */;', node.parent.productproxyid) _p(3,'sourceTree = BUILT_PRODUCTS_DIR;') _p(2,'};') end end }) if not table.isempty(settings) then _p('/* Begin PBXReferenceProxy section */') xcode.printSettingsTable(2, settings) _p('/* End PBXReferenceProxy section */') _p('') end end function xcode.PBXResourcesBuildPhase(tr) _p('/* Begin PBXResourcesBuildPhase section */') for _, target in ipairs(tr.products.children) do _p(2,'%s /* Resources */ = {', target.resstageid) _p(3,'isa = PBXResourcesBuildPhase;') _p(3,'buildActionMask = 2147483647;') _p(3,'files = (') tree.traverse(tr, { onnode = function(node) if xcode.getbuildcategory(node) == "Resources" then _p(4,'%s /* %s in Resources */,', node.buildid, node.name) end end }) _p(3,');') _p(3,'runOnlyForDeploymentPostprocessing = 0;') _p(2,'};') end _p('/* End PBXResourcesBuildPhase section */') _p('') end function xcode.PBXShellScriptBuildPhase(tr) local wrapperWritten = false local function doblock(id, name, which) local commands = {} for _, cfg in ipairs(tr.configs) do local cfgcmds = cfg[which] if #cfgcmds > 0 then table.insert(commands, 'if [ "${CONFIGURATION}" = "' .. cfg.buildcfg .. '" ]; then') for i = 1, #cfgcmds do table.insert(commands, cfgcmds[i]) end table.insert(commands, 'fi') end end if #commands > 0 then table.insert(commands, 1, 'set -e') -- Tells the shell to exit when any command fails commands = os.translateCommands(commands, p.MACOSX) if not wrapperWritten then _p('/* Begin PBXShellScriptBuildPhase section */') wrapperWritten = true end _p(2,'%s /* %s */ = {', id, name) _p(3,'isa = PBXShellScriptBuildPhase;') _p(3,'buildActionMask = 2147483647;') _p(3,'files = (') _p(3,');') _p(3,'inputPaths = ('); _p(3,');'); _p(3,'name = %s;', name); _p(3,'outputPaths = ('); _p(3,');'); _p(3,'runOnlyForDeploymentPostprocessing = 0;'); _p(3,'shellPath = /bin/sh;'); _p(3,'shellScript = %s;', xcode.stringifySetting(table.concat(commands, '\n'))) _p(2,'};') end end doblock("9607AE1010C857E500CD1376", "Prebuild", "prebuildcommands") local settings = {} tree.traverse(tr, { onnode = function(node) if node.buildcommandid then settings[node.buildcommandid] = function(level) local commands = {} local inputs = {} local outputs = {} for cfg in project.eachconfig(tr.project) do local filecfg = fileconfig.getconfig(node, cfg) if filecfg then table.insert(commands, 'if [ "${CONFIGURATION}" = "' .. cfg.buildcfg .. '" ]; then') if filecfg.buildmessage then table.insert(commands, '\techo "' .. filecfg.buildmessage .. '"') end local cmds = os.translateCommandsAndPaths(filecfg.buildcommands, filecfg.project.basedir, filecfg.project.location) for _, cmd in ipairs(cmds) do table.insert(commands, '\t' .. cmd) end table.insert(commands, 'fi') for _, v in ipairs(filecfg.buildinputs) do if not table.indexof(inputs, v) then table.insert(inputs, v) end end for _, v in ipairs(filecfg.buildoutputs) do if not table.indexof(outputs, v) then table.insert(outputs, v) end end end end if #commands > 0 then table.insert(commands, 1, 'set -e') -- Tells the shell to exit when any command fails end _p(level,'%s /* Build "%s" */ = {', node.buildcommandid, node.name) _p(level+1,'isa = PBXShellScriptBuildPhase;') _p(level+1,'buildActionMask = 2147483647;') _p(level+1,'files = (') _p(level+1,');') _p(level+1,'inputPaths = ('); _p(level+2,'"%s",', xcode.escapeSetting(node.relpath)) for _, v in ipairs(inputs) do _p(level+2,'"%s",', xcode.escapeSetting(project.getrelative(tr.project, v))) end _p(level+1,');') _p(level+1,'name = %s;', xcode.stringifySetting('Build "' .. node.name .. '"')) _p(level+1,'outputPaths = (') for _, v in ipairs(outputs) do _p(level+2,'"%s",', xcode.escapeSetting(project.getrelative (tr.project, v))) end _p(level+1,');') _p(level+1,'runOnlyForDeploymentPostprocessing = 0;'); _p(level+1,'shellPath = /bin/sh;'); _p(level+1,'shellScript = %s;', xcode.stringifySetting(table.concat(commands, '\n'))) _p(level,'};') end end end }) if not table.isempty(settings) then if not wrapperWritten then _p('/* Begin PBXShellScriptBuildPhase section */') wrapperWritten = true end xcode.printSettingsTable(2, settings) end doblock("9607AE3510C85E7E00CD1376", "Prelink", "prelinkcommands") doblock("9607AE3710C85E8F00CD1376", "Postbuild", "postbuildcommands") if wrapperWritten then _p('/* End PBXShellScriptBuildPhase section */') _p('') end end function xcode.PBXSourcesBuildPhase(tr) _p('/* Begin PBXSourcesBuildPhase section */') for _, target in ipairs(tr.products.children) do _p(2,'%s /* Sources */ = {', target.sourcesid) _p(3,'isa = PBXSourcesBuildPhase;') _p(3,'buildActionMask = 2147483647;') _p(3,'files = (') tree.traverse(tr, { onleaf = function(node) if xcode.getbuildcategory(node) == "Sources" and node.buildid then _p(4,'%s /* %s in Sources */,', node.buildid, node.name) end end }) _p(3,');') _p(3,'runOnlyForDeploymentPostprocessing = 0;') _p(2,'};') end _p('/* End PBXSourcesBuildPhase section */') _p('') end function xcode.PBXVariantGroup(tr) local settings = {} tree.traverse(tr, { onbranch = function(node) settings[node.id] = function() if node.kind == "vgroup" then _p(2,'%s /* %s */ = {', node.id, node.name) _p(3,'isa = PBXVariantGroup;') _p(3,'children = (') for _, lang in ipairs(node.children) do _p(4,'%s /* %s */,', lang.id, lang.name) end _p(3,');') _p(3,'name = %s;', node.name) _p(3,'sourceTree = "";') _p(2,'};') end end end }) if not table.isempty(settings) then _p('/* Begin PBXVariantGroup section */') xcode.printSettingsTable(2, settings) _p('/* End PBXVariantGroup section */') _p('') end end function xcode.PBXTargetDependency(tr) local settings = {} tree.traverse(tr.projects, { onleaf = function(node) settings[node.parent.targetdependid] = function() _p(2,'%s /* PBXTargetDependency */ = {', node.parent.targetdependid) _p(3,'isa = PBXTargetDependency;') _p(3,'name = %s;', xcode.stringifySetting(node.name)) _p(3,'targetProxy = %s /* PBXContainerItemProxy */;', node.parent.targetproxyid) _p(2,'};') end end }) if not table.isempty(settings) then _p('/* Begin PBXTargetDependency section */') xcode.printSettingsTable(2, settings) _p('/* End PBXTargetDependency section */') _p('') end end function xcode.XCBuildConfiguration_Target(tr, target, cfg) local settings = {} settings['ALWAYS_SEARCH_USER_PATHS'] = 'NO' if cfg.symbols ~= p.OFF then settings['DEBUG_INFORMATION_FORMAT'] = xcode.getdebugformat(cfg) end if cfg.kind ~= "StaticLib" and cfg.buildtarget.prefix ~= '' then settings['EXECUTABLE_PREFIX'] = cfg.buildtarget.prefix end if cfg.buildtarget.extension then local exts = { WindowedApp = "app", SharedLib = "dylib", StaticLib = "a", OSXBundle = "bundle", OSXFramework = "framework", XCTest = "xctest", } local ext = cfg.buildtarget.extension:sub(2) if ext ~= exts[iif(cfg.kind == "SharedLib" and cfg.sharedlibtype, cfg.sharedlibtype, cfg.kind)] then if cfg.kind == "WindowedApp" or (cfg.kind == "SharedLib" and cfg.sharedlibtype) then settings['WRAPPER_EXTENSION'] = ext elseif cfg.kind == "SharedLib" or cfg.kind == "StaticLib" then settings['EXECUTABLE_EXTENSION'] = ext end end end local outdir = path.getrelative(tr.project.location, path.getdirectory(cfg.buildtarget.relpath)) if outdir ~= "." then settings['CONFIGURATION_BUILD_DIR'] = outdir end settings['GCC_DYNAMIC_NO_PIC'] = 'NO' if tr.infoplist then settings['INFOPLIST_FILE'] = config.findfile(cfg, path.getextension(tr.infoplist.name)) end local installpaths = { ConsoleApp = '/usr/local/bin', WindowedApp = '"$(HOME)/Applications"', SharedLib = '/usr/local/lib', StaticLib = '/usr/local/lib', OSXBundle = '$(LOCAL_LIBRARY_DIR)/Bundles', OSXFramework = '$(LOCAL_LIBRARY_DIR)/Frameworks', } settings['INSTALL_PATH'] = installpaths[iif(cfg.kind == "SharedLib" and cfg.sharedlibtype, cfg.sharedlibtype, cfg.kind)] local fileNameList = {} local file_tree = project.getsourcetree(tr.project) tree.traverse(tr, { onnode = function(node) if node.buildid and not node.isResource and node.abspath then local filecfg = fileconfig.getconfig(node, cfg) if filecfg and filecfg.flags.ExcludeFromBuild then table.insert(fileNameList, xcode.escapeArg(node.name)) end end end }) if not table.isempty(fileNameList) then settings['EXCLUDED_SOURCE_FILE_NAMES'] = fileNameList end settings['PRODUCT_NAME'] = iif(cfg.kind == "ConsoleApp" and cfg.buildtarget.extension, cfg.buildtarget.basename .. cfg.buildtarget.extension, cfg.buildtarget.basename) if os.istarget(p.IOS) then settings['SDKROOT'] = 'iphoneos' settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = cfg.xcodecodesigningidentity or 'iPhone Developer' local minOSVersion = project.systemversion(cfg) if minOSVersion ~= nil then settings['IPHONEOS_DEPLOYMENT_TARGET'] = minOSVersion end local families = { ['iPhone/iPod touch'] = '1', ['iPad'] = '2', ['Universal'] = '1,2', } local family = families[cfg.iosfamily] if family then settings['TARGETED_DEVICE_FAMILY'] = family end else local minOSVersion = project.systemversion(cfg) if minOSVersion ~= nil then settings['MACOSX_DEPLOYMENT_TARGET'] = minOSVersion end end xcode.overrideSettings(settings, cfg.xcodebuildsettings) _p(2,'%s /* %s */ = {', cfg.xcode.targetid, cfg.buildcfg) _p(3,'isa = XCBuildConfiguration;') _p(3,'buildSettings = {') xcode.printSettingsTable(4, settings) _p(3,'};') xcode.printSetting(3, 'name', cfg.buildcfg); _p(2,'};') end xcode.cLanguageStandards = { ["Default"] = "compiler-default", -- explicit compiler default ["C89"] = "c89", ["C90"] = "c90", ["C99"] = "c99", ["C11"] = "c11", ["gnu89"] = "gnu89", ["gnu90"] = "gnu90", ["gnu99"] = "gnu99", ["gnu11"] = "gnu11" } function xcode.XCBuildConfiguration_CLanguageStandard(settings, cfg) if not cfg.cdialect then return end local cLanguageStandard = xcode.cLanguageStandards[cfg.cdialect] if cLanguageStandard then settings['GCC_C_LANGUAGE_STANDARD'] = cLanguageStandard end end xcode.cppLanguageStandards = { ["Default"] = "compiler-default", -- explicit compiler default ["C++98"] = "c++98", ["C++0x"] = "c++11", ["C++11"] = "c++11", ["C++1y"] = "c++14", ["C++14"] = "c++14", ["C++1z"] = "c++1z", ["C++17"] = "c++1z", ["C++2a"] = "c++2a", ["C++20"] = "c++2a", ["gnu++98"] = "gnu++98", ["gnu++0x"] = "gnu++0x", ["gnu++11"] = "gnu++0x", -- Xcode project GUI uses gnu++0x, but gnu++11 also works ["gnu++1y"] = "gnu++14", ["gnu++14"] = "gnu++14", ["gnu++1z"] = "gnu++1z", ["gnu++17"] = "gnu++1z", ["gnu++2a"] = "gnu++2a", ["gnu++20"] = "gnu++2a", } function xcode.XCBuildConfiguration_CppLanguageStandard(settings, cfg) if not cfg.cppdialect then return end local cppLanguageStandard = xcode.cppLanguageStandards[cfg.cppdialect] if cppLanguageStandard then settings['CLANG_CXX_LANGUAGE_STANDARD'] = cppLanguageStandard end end function xcode.XCBuildConfiguration_SwiftLanguageVersion(settings, cfg) if cfg.swiftversion then settings['SWIFT_VERSION'] = cfg.swiftversion end end function xcode.XCBuildConfiguration_Project(tr, cfg) local settings = {} local toolset = xcode.getToolSet(cfg) local archs = { Native = "$(NATIVE_ARCH_ACTUAL)", x86 = "i386", x86_64 = "x86_64", Universal32 = "$(ARCHS_STANDARD_32_BIT)", Universal64 = "$(ARCHS_STANDARD_64_BIT)", Universal = "$(ARCHS_STANDARD_32_64_BIT)", } settings['ARCHS'] = archs[cfg.platform or "Native"] local targetdir = path.getdirectory(cfg.buildtarget.relpath) if targetdir ~= "." then settings['CONFIGURATION_BUILD_DIR'] = '$(SYMROOT)' end settings['CONFIGURATION_TEMP_DIR'] = '$(OBJROOT)' if config.isDebugBuild(cfg) then settings['COPY_PHASE_STRIP'] = 'NO' end xcode.XCBuildConfiguration_CLanguageStandard(settings, cfg) xcode.XCBuildConfiguration_CppLanguageStandard(settings, cfg) if cfg.exceptionhandling == p.OFF then settings['GCC_ENABLE_CPP_EXCEPTIONS'] = 'NO' end if cfg.rtti == p.OFF then settings['GCC_ENABLE_CPP_RTTI'] = 'NO' end if cfg.symbols == p.ON and cfg.editandcontinue ~= "Off" then settings['GCC_ENABLE_FIX_AND_CONTINUE'] = 'YES' end if cfg.exceptionhandling == p.OFF then settings['GCC_ENABLE_OBJC_EXCEPTIONS'] = 'NO' end local optimizeMap = { On = 3, Size = 's', Speed = 3, Full = 'fast', Debug = 1 } settings['GCC_OPTIMIZATION_LEVEL'] = optimizeMap[cfg.optimize] or 0 if cfg.pchheader and not cfg.flags.NoPCH then settings['GCC_PRECOMPILE_PREFIX_HEADER'] = 'YES' settings['GCC_PREFIX_HEADER'] = cfg.pchheader end local escapedDefines = { } for i,v in ipairs(cfg.defines) do escapedDefines[i] = xcode.escapeArg(v) end settings['GCC_PREPROCESSOR_DEFINITIONS'] = escapedDefines settings["GCC_SYMBOLS_PRIVATE_EXTERN"] = 'NO' if cfg.unsignedchar ~= nil then settings['GCC_CHAR_IS_UNSIGNED_CHAR'] = iif(cfg.unsignedchar, "YES", "NO") end if cfg.flags.FatalWarnings then settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'YES' end settings['GCC_WARN_ABOUT_RETURN_TYPE'] = 'YES' settings['GCC_WARN_UNUSED_VARIABLE'] = 'YES' local includedirs = project.getrelative(cfg.project, cfg.includedirs) for i,v in ipairs(includedirs) do cfg.includedirs[i] = p.quoted(v) end settings['USER_HEADER_SEARCH_PATHS'] = cfg.includedirs local sysincludedirs = project.getrelative(cfg.project, cfg.sysincludedirs) for i,v in ipairs(sysincludedirs) do cfg.sysincludedirs[i] = p.quoted(v) end if not table.isempty(cfg.sysincludedirs) then table.insert(cfg.sysincludedirs, "$(inherited)") end settings['SYSTEM_HEADER_SEARCH_PATHS'] = cfg.sysincludedirs for i,v in ipairs(cfg.libdirs) do cfg.libdirs[i] = p.project.getrelative(cfg.project, cfg.libdirs[i]) end for i,v in ipairs(cfg.syslibdirs) do cfg.syslibdirs[i] = p.project.getrelative(cfg.project, cfg.syslibdirs[i]) end settings['LIBRARY_SEARCH_PATHS'] = table.join (cfg.libdirs, cfg.syslibdirs) for i,v in ipairs(cfg.frameworkdirs) do cfg.frameworkdirs[i] = p.project.getrelative(cfg.project, cfg.frameworkdirs[i]) end settings['FRAMEWORK_SEARCH_PATHS'] = cfg.frameworkdirs local runpathdirs = table.join (cfg.runpathdirs, config.getsiblingtargetdirs (cfg)) settings['LD_RUNPATH_SEARCH_PATHS'] = toolset.getrunpathdirs(cfg, runpathdirs, "path") local objDir = path.getrelative(tr.project.location, cfg.objdir) settings['OBJROOT'] = objDir settings['ONLY_ACTIVE_ARCH'] = iif(p.config.isDebugBuild(cfg), 'YES', 'NO') local checks = { ["-ffast-math"] = cfg.floatingpoint == "Fast", ["-fomit-frame-pointer"] = cfg.omitframepointer == "On", ["-fno-omit-frame-pointer"] = cfg.omitframepointer == "Off", } local flags = { } for flag, check in pairs(checks) do if check then table.insert(flags, flag) end end settings['OTHER_CFLAGS'] = table.join(flags, cfg.buildoptions) flags = { } for _, lib in ipairs(config.getlinks(cfg, "system")) do if not xcode.isframeworkordylib(lib) then table.insert(flags, "-l" .. lib) end end for _, lib in ipairs(config.getlinks(cfg, "dependencies", "object")) do if (lib.external) then if not xcode.isframeworkordylib(lib.linktarget.basename) then table.insert(flags, "-l" .. xcode.escapeArg(lib.linktarget.basename)) end end end settings['OTHER_LDFLAGS'] = table.join(flags, cfg.linkoptions) if cfg.flags.StaticRuntime then settings['STANDARD_C_PLUS_PLUS_LIBRARY_TYPE'] = 'static' end if targetdir ~= "." then settings['SYMROOT'] = path.getrelative(tr.project.location, targetdir) end if cfg.warnings == "Off" then settings['WARNING_CFLAGS'] = '-w' elseif cfg.warnings == "High" then settings['WARNING_CFLAGS'] = '-Wall' elseif cfg.warnings == "Extra" then settings['WARNING_CFLAGS'] = '-Wall -Wextra' elseif cfg.warnings == "Everything" then settings['WARNING_CFLAGS'] = '-Weverything' end xcode.XCBuildConfiguration_SwiftLanguageVersion(settings, cfg) xcode.overrideSettings(settings, cfg.xcodebuildsettings) _p(2,'%s /* %s */ = {', cfg.xcode.projectid, cfg.buildcfg) _p(3,'isa = XCBuildConfiguration;') _p(3,'buildSettings = {') xcode.printSettingsTable(4, settings) _p(3,'};') xcode.printSetting(3, 'name', cfg.buildcfg); _p(2,'};') end function xcode.XCBuildConfiguration(tr) local settings = {} for _, target in ipairs(tr.products.children) do for _, cfg in ipairs(tr.configs) do settings[cfg.xcode.targetid] = function() xcode.XCBuildConfiguration_Target(tr, target, cfg) end end end for _, cfg in ipairs(tr.configs) do settings[cfg.xcode.projectid] = function() xcode.XCBuildConfiguration_Project(tr, cfg) end end if not table.isempty(settings) then _p('/* Begin XCBuildConfiguration section */') xcode.printSettingsTable(0, settings) _p('/* End XCBuildConfiguration section */') _p('') end end function xcode.XCBuildConfigurationList(tr) local wks = tr.project.workspace local defaultCfgName = xcode.stringifySetting(tr.configs[1].buildcfg) local settings = {} for _, target in ipairs(tr.products.children) do settings[target.cfgsection] = function() _p(2,'%s /* Build configuration list for PBXNativeTarget "%s" */ = {', target.cfgsection, target.name) _p(3,'isa = XCConfigurationList;') _p(3,'buildConfigurations = (') for _, cfg in ipairs(tr.configs) do _p(4,'%s /* %s */,', cfg.xcode.targetid, cfg.buildcfg) end _p(3,');') _p(3,'defaultConfigurationIsVisible = 0;') _p(3,'defaultConfigurationName = %s;', defaultCfgName) _p(2,'};') end end settings['1DEB928908733DD80010E9CD'] = function() _p(2,'1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "%s" */ = {', tr.name) _p(3,'isa = XCConfigurationList;') _p(3,'buildConfigurations = (') for _, cfg in ipairs(tr.configs) do _p(4,'%s /* %s */,', cfg.xcode.projectid, cfg.buildcfg) end _p(3,');') _p(3,'defaultConfigurationIsVisible = 0;') _p(3,'defaultConfigurationName = %s;', defaultCfgName) _p(2,'};') end _p('/* Begin XCConfigurationList section */') xcode.printSettingsTable(2, settings) _p('/* End XCConfigurationList section */') end local p = premake local m = p.modules.xcode local tree = p.tree m.elements.workspace = function(wks) return { m.xmlDeclaration, m.workspace, m.reorderProjects, m.workspaceFileRefs, m.workspaceTail, } end function m.generateWorkspace(wks) m.prepareWorkspace(wks) p.callArray(m.elements.workspace, wks) end function m.workspace() p.push('') end function m.workspaceTail() p.out('') end function m.reorderProjects(wks) if wks.startproject then local np local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) if n.project.name == wks.startproject then np = n end end }) while np and np.parent do local p = np.parent local i = table.indexof(p.children, np) table.remove(p.children, i) table.insert(p.children, 1, np) np = p end end end m.elements.workspaceFileRef = function(prj) return { m.workspaceLocation, } end function m.workspaceFileRefs(wks) local tr = p.workspace.grouptree(wks) tree.traverse(tr, { onleaf = function(n) local prj = n.project p.push('") p.pop('') end, onbranchenter = function(n) local prj = n.project p.push('', n.name) end, onbranchexit = function(n) p.pop('') end, }) end function m.workspaceLocation(prj) local fname = p.filename(prj, ".xcodeproj") fname = path.getrelative(prj.workspace.location, fname) p.w('location = "group:%s"', fname) end function m.xmlDeclaration() p.xmlUtf8(true) end local p = premake p.modules.xcode = {} local m = p.modules.xcode m._VERSION = p._VERSION m.elements = {} include("xcode_common.lua") include("xcode4_workspace.lua") include("xcode_project.lua") return m local p = premake p.api.register { name = "xcodebuildsettings", scope = "config", kind = "key-array", } p.api.register { name = "xcodebuildresources", scope = "config", kind = "list", } p.api.register { name = "xcodecodesigningidentity", scope = "config", kind = "string", } p.api.register { name = "xcodesystemcapabilities", scope = "project", kind = "key-boolean", } p.api.register { name = "iosfamily", scope = "config", kind = "string", allowed = { "iPhone/iPod touch", "iPad", "Universal", } } p.api.register { name = "embed", scope = "config", kind = "list", } p.api.register { name = "embedAndSign", scope = "config", kind = "list", } newaction { trigger = "xcode4", shortname = "Apple Xcode 4", description = "Generate Apple Xcode 4 project files", toolset = "clang", valid_kinds = { "ConsoleApp", "WindowedApp", "SharedLib", "StaticLib", "Makefile", "Utility", "None" }, valid_languages = { "C", "C++" }, valid_tools = { cc = { "gcc", "clang" }, }, onWorkspace = function(wks) p.generate(wks, ".xcworkspace/contents.xcworkspacedata", p.modules.xcode.generateWorkspace) end, onProject = function(prj) p.generate(prj, ".xcodeproj/project.pbxproj", p.modules.xcode.generateProject) end, } return function(cfg) return (_ACTION == "xcode4") end local p = premake local api = p.api local DOC_URL = "See https://github.com/premake/premake-core/wiki/" api.register { name = "architecture", scope = "config", kind = "string", allowed = { "universal", p.X86, p.X86_64, p.ARM, p.ARM64, }, aliases = { i386 = p.X86, amd64 = p.X86_64, x32 = p.X86,-- these should be DEPRECATED x64 = p.X86_64, }, } api.register { name = "atl", scope = "config", kind = "string", allowed = { "Off", "Dynamic", "Static", }, } api.register { name = "basedir", scope = "project", kind = "path" } api.register { name = "buildaction", scope = "config", kind = "string", } api.register { name = "buildcommands", scope = { "config", "rule" }, kind = "list:string", tokens = true, pathVars = true, } api.register { name = "buildcustomizations", scope = "project", kind = "list:string", } api.register { name = "builddependencies", scope = { "rule" }, kind = "list:string", tokens = true, pathVars = true, } api.register { name = "buildlog", scope = { "config" }, kind = "path", tokens = true, pathVars = true, } api.register { name = "buildmessage", scope = { "config", "rule" }, kind = "string", tokens = true, pathVars = true, } api.register { name = "buildoptions", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "buildoutputs", scope = { "config", "rule" }, kind = "list:path", tokens = true, pathVars = false, } api.register { name = "buildinputs", scope = "config", kind = "list:path", tokens = true, pathVars = false, } api.register { name = "buildrule", -- DEPRECATED scope = "config", kind = "table", tokens = true, } api.register { name = "characterset", scope = "config", kind = "string", allowed = { "Default", "ASCII", "MBCS", "Unicode", } } api.register { name = "cleancommands", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "cleanextensions", scope = "config", kind = "list:string", } api.register { name = "clr", scope = "config", kind = "string", allowed = { "Off", "On", "Pure", "Safe", "Unsafe", "NetCore", } } api.register { name = "compilebuildoutputs", scope = "config", kind = "boolean" } api.register { name = "compileas", scope = "config", kind = "string", allowed = { "Default", "C", "C++", "Objective-C", "Objective-C++", "Module", "ModulePartition", "HeaderUnit" } } api.register { name = "configmap", scope = "project", kind = "list:keyed:array:string", } api.register { name = "configurations", scope = "project", kind = "list:string", } api.register { name = "copylocal", scope = "config", kind = "list:mixed", tokens = true, } api.register { name = "debugargs", scope = "config", kind = "list:string", tokens = true, pathVars = true, allowDuplicates = true, } api.register { name = "debugcommand", scope = "config", kind = "path", tokens = true, pathVars = true, } api.register { name = "debugconnectcommands", scope = "config", kind = "list:string", tokens = true, } api.register { name = "debugdir", scope = "config", kind = "path", tokens = true, pathVars = true, } api.register { name = "debugenvs", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "debugextendedprotocol", scope = "config", kind = "boolean", } api.register { name = "debugformat", scope = "config", kind = "string", allowed = { "Default", "c7", "Dwarf", "SplitDwarf", }, } api.register { name = "debugger", scope = "config", kind = "string", allowed = { "Default", "GDB", "LLDB", } } api.register { name = "debuggertype", scope = "config", kind = "string", allowed = { "Mixed", "NativeOnly", "ManagedOnly", } } api.register { name = "debugpathmap", scope = "config", kind = "list:keyed:path", tokens = true, } api.register { name = "debugport", scope = "config", kind = "integer", } api.register { name = "debugremotehost", scope = "config", kind = "string", tokens = true, } api.register { name = "debugsearchpaths", scope = "config", kind = "list:path", tokens = true, } api.register { name = "debugstartupcommands", scope = "config", kind = "list:string", tokens = true, } api.register { name = "debugtoolargs", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "debugtoolcommand", scope = "config", kind = "path", tokens = true, pathVars = true, } api.register { name = "defaultplatform", scope = "project", kind = "string", } api.register { name = "defines", scope = "config", kind = "list:string", tokens = true, } api.register { name = "dependson", scope = "config", kind = "list:string", tokens = true, } api.register { name = "disablewarnings", scope = "config", kind = "list:string", tokens = true, } api.register { name = "display", scope = "rule", kind = "string", } api.register { name = "dpiawareness", scope = "config", kind = "string", allowed = { "Default", "None", "High", "HighPerMonitor", } } api.register { name = "editandcontinue", scope = "config", kind = "string", allowed = { "Default", "On", "Off", }, } api.register { name = "exceptionhandling", scope = "config", kind = "string", allowed = { "Default", "On", "Off", "SEH", "CThrow", }, } api.register { name = "enablewarnings", scope = "config", kind = "list:string", tokens = true, } api.register { name = "endian", scope = "config", kind = "string", allowed = { "Default", "Little", "Big", }, } api.register { name = "entrypoint", scope = "config", kind = "string", } api.register { name = "fastuptodate", scope = "project", kind = "boolean", } api.register { name = "fatalwarnings", scope = "config", kind = "list:string", tokens = true, } api.register { name = "fileextension", scope = "rule", kind = "list:string", } api.register { name = "filename", scope = { "project", "rule" }, kind = "string", tokens = true, } api.register { name = "files", scope = "config", kind = "list:file", tokens = true, } api.register { name = "functionlevellinking", scope = "config", kind = "boolean" } api.register { name = "flags", scope = "config", kind = "list:string", allowed = { "Component", -- DEPRECATED "DebugEnvsDontMerge", "DebugEnvsInherit", "EnableSSE", -- DEPRECATED "EnableSSE2", -- DEPRECATED "ExcludeFromBuild", "ExtraWarnings", -- DEPRECATED "FatalCompileWarnings", "FatalLinkWarnings", "FloatFast", -- DEPRECATED "FloatStrict", -- DEPRECATED "LinkTimeOptimization", "Managed", -- DEPRECATED "Maps", "MFC", "MultiProcessorCompile", "NativeWChar", -- DEPRECATED "No64BitChecks", "NoCopyLocal", "NoEditAndContinue", -- DEPRECATED "NoFramePointer", -- DEPRECATED "NoImplicitLink", "NoImportLib", "NoIncrementalLink", "NoManifest", "NoMinimalRebuild", "NoNativeWChar", -- DEPRECATED "NoPCH", "NoRuntimeChecks", "NoBufferSecurityCheck", "NoWarnings", -- DEPRECATED "OmitDefaultLibrary", "Optimize", -- DEPRECATED "OptimizeSize", -- DEPRECATED "OptimizeSpeed", -- DEPRECATED "RelativeLinks", "ReleaseRuntime", -- DEPRECATED "ShadowedVariables", "StaticRuntime", -- DEPRECATED "Symbols", -- DEPRECATED "UndefinedIdentifiers", "WinMain", -- DEPRECATED "WPF", "C++11", -- DEPRECATED "C++14", -- DEPRECATED "C90", -- DEPRECATED "C99", -- DEPRECATED "C11", -- DEPRECATED }, aliases = { FatalWarnings = { "FatalWarnings", "FatalCompileWarnings", "FatalLinkWarnings" }, Optimise = 'Optimize', OptimiseSize = 'OptimizeSize', OptimiseSpeed = 'OptimizeSpeed', }, } api.register { name = "floatingpoint", scope = "config", kind = "string", allowed = { "Default", "Fast", "Strict", } } api.register { name = "floatingpointexceptions", scope = "config", kind = "boolean" } api.register { name = "inlining", scope = "config", kind = "string", allowed = { "Default", "Disabled", "Explicit", "Auto" } } api.register { name = "callingconvention", scope = "config", kind = "string", allowed = { "Cdecl", "FastCall", "StdCall", "VectorCall", } } api.register { name = "forceincludes", scope = "config", kind = "list:mixed", tokens = true, } api.register { name = "forceusings", scope = "config", kind = "list:file", tokens = true, } api.register { name = "fpu", scope = "config", kind = "string", allowed = { "Software", "Hardware", } } api.register { name = "dotnetframework", scope = "config", kind = "string", } api.register { name = "enabledefaultcompileitems", scope = "config", kind = "boolean", default = false } api.register { name = "csversion", scope = "config", kind = "string", } api.register { name = "gccprefix", scope = "config", kind = "string", tokens = true, } api.register { name = "ignoredefaultlibraries", scope = "config", kind = "list:mixed", tokens = true, } api.register { name = "icon", scope = "project", kind = "file", tokens = true, } api.register { name = "imageoptions", scope = "config", kind = "list:string", tokens = true, } api.register { name = "imagepath", scope = "config", kind = "path", tokens = true, } api.register { name = "implibdir", scope = "config", kind = "path", tokens = true, } api.register { name = "implibextension", scope = "config", kind = "string", tokens = true, } api.register { name = "implibname", scope = "config", kind = "string", tokens = true, } api.register { name = "implibprefix", scope = "config", kind = "string", tokens = true, } api.register { name = "implibsuffix", scope = "config", kind = "string", tokens = true, } api.register { name = "includedirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "intrinsics", scope = "config", kind = "boolean" } api.register { name = "bindirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "kind", scope = "config", kind = "string", allowed = { "ConsoleApp", "Makefile", "None", "SharedLib", "StaticLib", "WindowedApp", "Utility", "SharedItems", }, } api.register { name = "sharedlibtype", scope = "project", kind = "string", allowed = { "OSXBundle", "OSXFramework", "XCTest", }, } api.register { name = "language", scope = "project", kind = "string", allowed = { "C", "C++", "C#", "F#" } } api.register { name = "cdialect", scope = "config", kind = "string", allowed = { "Default", "C89", "C90", "C99", "C11", "gnu89", "gnu90", "gnu99", "gnu11", } } api.register { name = "cppdialect", scope = "config", kind = "string", allowed = { "Default", "C++latest", "C++98", "C++0x", "C++11", "C++1y", "C++14", "C++1z", "C++17", "C++2a", "C++20", "gnu++98", "gnu++0x", "gnu++11", "gnu++1y", "gnu++14", "gnu++1z", "gnu++17", "gnu++2a", "gnu++20", } } api.register { name = "conformancemode", scope = "config", kind = "boolean" } api.register { name = "usefullpaths", scope = "config", kind = "boolean" } api.register { name = "removeunreferencedcodedata", scope = "config", kind = "boolean" } api.register { name = "swiftversion", scope = "config", kind = "string", allowed = { "4.0", "4.2", "5.0", } } api.register { name = "libdirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "frameworkdirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "linkbuildoutputs", scope = "config", kind = "boolean" } api.register { name = "linkoptions", scope = "config", kind = "list:string", tokens = true, } api.register { name = "links", scope = "config", kind = "list:mixed", tokens = true, } api.register { name = "linkgroups", scope = "config", kind = "string", allowed = { "Off", "On", } } api.register { name = "locale", scope = "config", kind = "string", tokens = false, } api.register { name = "location", scope = { "project", "rule" }, kind = "path", tokens = true, } api.register { name = "makesettings", scope = "config", kind = "list:string", tokens = true, } api.register { name = "namespace", scope = "project", kind = "string", tokens = true, } api.register { name = "nativewchar", scope = "config", kind = "string", allowed = { "Default", "On", "Off", } } api.register { name = "nuget", scope = "config", kind = "list:string", tokens = true, } api.register { name = "nugetsource", scope = "project", kind = "string", tokens = true, } api.register { name = "objdir", scope = "config", kind = "path", tokens = true, } api.register { name = "optimize", scope = "config", kind = "string", allowed = { "Off", "On", "Debug", "Size", "Speed", "Full", } } api.register { name = "runpathdirs", scope = "config", kind = "list:path", tokens = true, } api.register { name = "runtime", scope = "config", kind = "string", allowed = { "Debug", "Release", } } api.register { name = "pchheader", scope = "config", kind = "string", tokens = true, } api.register { name = "pchsource", scope = "config", kind = "path", tokens = true, } api.register { name = "pic", scope = "config", kind = "string", allowed = { "Off", "On", } } api.register { name = "platforms", scope = "project", kind = "list:string", } api.register { name = "postbuildcommands", scope = "config", kind = "list:string", tokens = true, pathVars = true, allowDuplicates = true, } api.register { name = "postbuildmessage", scope = "config", kind = "string", tokens = true, pathVars = true, } api.register { name = "prebuildcommands", scope = "config", kind = "list:string", tokens = true, pathVars = true, allowDuplicates = true, } api.register { name = "prebuildmessage", scope = "config", kind = "string", tokens = true, pathVars = true, } api.register { name = "prelinkcommands", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "prelinkmessage", scope = "config", kind = "string", tokens = true, pathVars = true, } api.register { name = "propertydefinition", scope = "rule", kind = "list:table", } api.register { name = "rebuildcommands", scope = "config", kind = "list:string", tokens = true, pathVars = true, } api.register { name = "resdefines", scope = "config", kind = "list:string", tokens = true, } api.register { name = "resincludedirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "resoptions", scope = "config", kind = "list:string", tokens = true, } api.register { name = "resourcegenerator", scope = "project", kind = "string", allowed = { "internal", "public" } } api.register { name = "rtti", scope = "config", kind = "string", allowed = { "Default", "On", "Off", }, } api.register { name = "rules", scope = "project", kind = "list:string", } api.register { name = "startproject", scope = "workspace", kind = "string", tokens = true, } api.register { name = "staticruntime", scope = "config", kind = "string", allowed = { "Default", "On", "Off" } } api.register { name = "strictaliasing", scope = "config", kind = "string", allowed = { "Off", "Level1", "Level2", "Level3", } } api.register { name = "stringpooling", scope = "config", kind = "boolean" } api.register { name = "symbols", scope = "config", kind = "string", allowed = { "Default", "On", "Off", "FastLink", -- Visual Studio 2015+ only, considered 'On' for all other cases. "Full", -- Visual Studio 2017+ only, considered 'On' for all other cases. }, } api.register { name = "symbolspath", scope = "config", kind = "path", tokens = true, } api.register { name = "sysincludedirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "syslibdirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "system", scope = "config", kind = "string", allowed = { "aix", "bsd", "haiku", "ios", "linux", "macosx", "solaris", "wii", "windows", }, } api.register { name = "systemversion", scope = "config", kind = "string", } api.register { name = "tags", scope = "config", kind = "list:string", } api.register { name = "tailcalls", scope = "config", kind = "boolean" } api.register { name = "targetdir", scope = "config", kind = "path", tokens = true, } api.register { name = "targetextension", scope = "config", kind = "string", tokens = true, } api.register { name = "targetname", scope = "config", kind = "string", tokens = true, } api.register { name = "targetprefix", scope = "config", kind = "string", tokens = true, } api.register { name = "targetsuffix", scope = "config", kind = "string", tokens = true, } api.register { name = "toolset", scope = "config", kind = "string", allowed = function(value) value = value:lower() local tool, version = p.tools.canonical(value) if tool then return p.tools.normalize(value) else return nil end end, } api.register { name = "toolsversion", scope = "project", kind = "string", tokens = true, } api.register { name = "customtoolnamespace", scope = "config", kind = "string", } api.register { name = "undefines", scope = "config", kind = "list:string", tokens = true, } api.register { name = "usingdirs", scope = "config", kind = "list:directory", tokens = true, } api.register { name = "uuid", scope = "project", kind = "string", allowed = function(value) local ok = true if (#value ~= 36) then ok = false end for i=1,36 do local ch = value:sub(i,i) if (not ch:find("[ABCDEFabcdef0123456789-]")) then ok = false end end if (value:sub(9,9) ~= "-") then ok = false end if (value:sub(14,14) ~= "-") then ok = false end if (value:sub(19,19) ~= "-") then ok = false end if (value:sub(24,24) ~= "-") then ok = false end if (not ok) then return nil, "invalid UUID" end return value:upper() end } api.register { name = "vectorextensions", scope = "config", kind = "string", allowed = { "Default", "AVX", "AVX2", "IA32", "SSE", "SSE2", "SSE3", "SSSE3", "SSE4.1", "SSE4.2", } } api.register { name = "isaextensions", scope = "config", kind = "list:string", allowed = { "MOVBE", "POPCNT", "PCLMUL", "LZCNT", "BMI", "BMI2", "F16C", "AES", "FMA", "FMA4", "RDRND", } } api.register { name = "vpaths", scope = "project", kind = "list:keyed:list:path", tokens = true, pathVars = true, } api.register { name = "warnings", scope = "config", kind = "string", allowed = { "Off", "Default", "High", "Extra", "Everything", } } api.register { name = "largeaddressaware", scope = "config", kind = "boolean", } api.register { name = "editorintegration", scope = "workspace", kind = "boolean", } api.register { name = "preferredtoolarchitecture", scope = "workspace", kind = "string", allowed = { "Default", p.X86, p.X86_64, } } api.register { name = "unsignedchar", scope = "config", kind = "boolean", } p.api.register { name = "structmemberalign", scope = "config", kind = "integer", allowed = { "1", "2", "4", "8", "16", } } api.register { name = "omitframepointer", scope = "config", kind = "string", allowed = { "Default", "On", "Off" } } api.register { name = "visibility", scope = "config", kind = "string", allowed = { "Default", "Hidden", "Internal", "Protected" } } api.register { name = "inlinesvisibility", scope = "config", kind = "string", allowed = { "Default", "Hidden" } } api.register { name = "assemblydebug", scope = "config", kind = "boolean" } api.register { name = "justmycode", scope = "project", kind = "string", allowed = { "On", "Off" } } api.register { name = "openmp", scope = "project", kind = "string", allowed = { "On", "Off" } } api.alias("buildcommands", "buildCommands") api.alias("builddependencies", "buildDependencies") api.alias("buildmessage", "buildMessage") api.alias("buildoutputs", "buildOutputs") api.alias("cleanextensions", "cleanExtensions") api.alias("dotnetframework", "framework") api.alias("editandcontinue", "editAndContinue") api.alias("fileextension", "fileExtension") api.alias("propertydefinition", "propertyDefinition") api.alias("removefiles", "excludes") api.deprecateField("buildrule", 'Use `buildcommands`, `buildoutputs`, and `buildmessage` instead.', function(value) if value.description then buildmessage(value.description) end buildcommands(value.commands) buildoutputs(value.outputs) end) api.deprecateValue("flags", "Component", 'Use `buildaction "Component"` instead.', function(value) buildaction "Component" end) api.deprecateValue("flags", "EnableSSE", 'Use `vectorextensions "SSE"` instead.', function(value) vectorextensions("SSE") end, function(value) vectorextensions "Default" end) api.deprecateValue("flags", "EnableSSE2", 'Use `vectorextensions "SSE2"` instead.', function(value) vectorextensions("SSE2") end, function(value) vectorextensions "Default" end) api.deprecateValue("flags", "FloatFast", 'Use `floatingpoint "Fast"` instead.', function(value) floatingpoint("Fast") end, function(value) floatingpoint "Default" end) api.deprecateValue("flags", "FloatStrict", 'Use `floatingpoint "Strict"` instead.', function(value) floatingpoint("Strict") end, function(value) floatingpoint "Default" end) api.deprecateValue("flags", "NativeWChar", 'Use `nativewchar "On"` instead."', function(value) nativewchar("On") end, function(value) nativewchar "Default" end) api.deprecateValue("flags", "NoNativeWChar", 'Use `nativewchar "Off"` instead."', function(value) nativewchar("Off") end, function(value) nativewchar "Default" end) api.deprecateValue("flags", "Optimize", 'Use `optimize "On"` instead.', function(value) optimize ("On") end, function(value) optimize "Off" end) api.deprecateValue("flags", "OptimizeSize", 'Use `optimize "Size"` instead.', function(value) optimize ("Size") end, function(value) optimize "Off" end) api.deprecateValue("flags", "OptimizeSpeed", 'Use `optimize "Speed"` instead.', function(value) optimize ("Speed") end, function(value) optimize "Off" end) api.deprecateValue("flags", "ReleaseRuntime", 'Use `runtime "Release"` instead.', function(value) runtime "Release" end, function(value) end) api.deprecateValue("flags", "ExtraWarnings", 'Use `warnings "Extra"` instead.', function(value) warnings "Extra" end, function(value) warnings "Default" end) api.deprecateValue("flags", "NoWarnings", 'Use `warnings "Off"` instead.', function(value) warnings "Off" end, function(value) warnings "Default" end) api.deprecateValue("flags", "Managed", 'Use `clr "On"` instead.', function(value) clr "On" end, function(value) clr "Off" end) api.deprecateValue("flags", "NoEditAndContinue", 'Use editandcontinue "Off"` instead.', function(value) editandcontinue "Off" end, function(value) editandcontinue "On" end) api.deprecateValue("flags", "Symbols", 'Use `symbols "On"` instead', function(value) symbols "On" end, function(value) symbols "Default" end) api.deprecateValue("flags", "C++11", 'Use `cppdialect "C++11"` instead', function(value) cppdialect "C++11" end, function(value) cppdialect "Default" end) api.deprecateValue("flags", "C++14", 'Use `cppdialect "C++14"` instead', function(value) cppdialect "C++14" end, function(value) cppdialect "Default" end) api.deprecateValue("flags", "C90", 'Use `cdialect "gnu90"` instead', function(value) cdialect "gnu90" end, function(value) cdialect "Default" end) api.deprecateValue("flags", "C99", 'Use `cdialect "gnu99"` instead', function(value) cdialect "gnu99" end, function(value) cdialect "Default" end) api.deprecateValue("flags", "C11", 'Use `cdialect "gnu11"` instead', function(value) cdialect "gnu11" end, function(value) cdialect "Default" end) api.deprecateValue("flags", "WinMain", 'Use `entrypoint "WinMainCRTStartup"` instead', function(value) entrypoint "WinMainCRTStartup" end, function(value) entrypoint "mainCRTStartup" end) api.deprecateValue("flags", "StaticRuntime", 'Use `staticruntime "On"` instead', function(value) staticruntime "On" end, function(value) staticruntime "Default" end) api.deprecateValue("flags", "NoFramePointer", 'Use `omitframepointer "On"` instead.', function(value) omitframepointer("On") end, function(value) omitframepointer("Default") end) newoption { category= "compilers", trigger = "cc", value = "VALUE", description = "Choose a C/C++ compiler set", allowed = { { "clang", "Clang (clang)" }, { "gcc", "GNU GCC (gcc/g++)" }, { "mingw", "MinGW GCC (gcc/g++)" }, } } newoption { category= "compilers", trigger = "dotnet", value = "VALUE", description = "Choose a .NET compiler set", allowed = { { "msnet", "Microsoft .NET (csc)" }, { "mono", "Novell Mono (mcs)" }, { "pnet", "Portable.NET (cscc)" }, } } newoption { trigger = "fatal", description = "Treat warnings from project scripts as errors" } newoption { trigger = "debugger", description = "Start MobDebug remote debugger. Works with ZeroBrane Studio" } newoption { trigger = "file", value = "FILE", description = "Read FILE as a Premake script; default is 'premake5.lua'" } newoption { trigger = "help", description = "Display this information" } newoption { trigger = "verbose", description = "Generate extra debug text output" } newoption { trigger = "interactive", description = "Interactive command prompt" } newoption { trigger = "os", value = "VALUE", description = "Generate files for a different operating system", allowed = { { "aix", "IBM AIX" }, { "bsd", "OpenBSD, NetBSD, or FreeBSD" }, { "haiku", "Haiku" }, { "hurd", "GNU/Hurd" }, { "ios", "iOS" }, { "linux", "Linux" }, { "macosx", "Apple Mac OS X" }, { "solaris", "Solaris" }, { "windows", "Microsoft Windows" }, } } newoption { trigger = "scripts", value = "PATH", description = "Search for additional scripts on the given path" } newoption { trigger = "systemscript", value = "FILE", description = "Override default system script (premake5-system.lua)" } newoption { trigger = "version", description = "Display version information" } if http ~= nil then newoption { trigger = "insecure", description = "forfit SSH certification checks." } end characterset "Default" clr "Off" editorintegration "Off" exceptionhandling "Default" rtti "Default" symbols "Default" nugetsource "https://api.nuget.org/v3/index.json" language "C++" filter { "kind:SharedLib" } targetprefix "lib" targetextension ".so" filter { "kind:StaticLib" } targetprefix "lib" targetextension ".a" filter { "system:darwin", "kind:WindowedApp" } targetextension ".app" filter { "system:darwin", "kind:SharedLib" } targetextension ".dylib" filter { "system:darwin", "kind:SharedLib", "sharedlibtype:OSXBundle" } targetprefix "" targetextension ".bundle" filter { "system:darwin", "kind:SharedLib", "sharedlibtype:OSXFramework" } targetprefix "" targetextension ".framework" filter { "system:darwin", "kind:SharedLib", "sharedlibtype:XCTest" } targetprefix "" targetextension ".xctest" filter { "system:Windows or language:C# or language:F#", "kind:ConsoleApp or WindowedApp" } targetextension ".exe" filter { "system:Windows", "kind:SharedLib" } targetprefix "" targetextension ".dll" implibextension ".lib" filter { "system:Windows", "kind:StaticLib" } targetprefix "" targetextension ".lib" filter { "language:C# or language:F#", "kind:SharedLib" } targetprefix "" targetextension ".dll" implibextension ".dll" filter { "kind:SharedLib", "system:not Windows" } pic "On" filter { "system:darwin" } toolset "clang" filter { "platforms:Win64" } architecture "x86_64" filter {} premake.clean = {} newaction { trigger = "clean", description = "Remove all binaries and generated files", execute = function() print("** The clean action has not yet been ported") end } local p = premake p.tools.mingw = p.tools.gcc local p = premake p.tools.clang = {} local clang = p.tools.clang local gcc = p.tools.gcc local config = p.config function clang.getcppflags(cfg) local flags = gcc.getcppflags(cfg) return flags end clang.shared = { architecture = gcc.shared.architecture, flags = gcc.shared.flags, floatingpoint = { Fast = "-ffast-math", }, strictaliasing = gcc.shared.strictaliasing, optimize = { Off = "-O0", On = "-O2", Debug = "-O0", Full = "-O3", Size = "-Os", Speed = "-O3", }, pic = gcc.shared.pic, vectorextensions = gcc.shared.vectorextensions, isaextensions = gcc.shared.isaextensions, warnings = gcc.shared.warnings, symbols = gcc.shared.symbols, unsignedchar = gcc.shared.unsignedchar, omitframepointer = gcc.shared.omitframepointer, compileas = gcc.shared.compileas } clang.cflags = table.merge(gcc.cflags, { }) function clang.getcflags(cfg) local shared = config.mapFlags(cfg, clang.shared) local cflags = config.mapFlags(cfg, clang.cflags) local flags = table.join(shared, cflags) flags = table.join(flags, clang.getwarnings(cfg), clang.getsystemversionflags(cfg)) return flags end function clang.getwarnings(cfg) return gcc.getwarnings(cfg) end function clang.getsystemversionflags(cfg) local flags = {} if cfg.system == p.MACOSX or cfg.system == p.IOS then local minVersion = p.project.systemversion(cfg) if minVersion ~= nil then local name = iif(cfg.system == p.MACOSX, "macosx", "iphoneos") table.insert (flags, "-m" .. name .. "-version-min=" .. p.project.systemversion(cfg)) end end return flags end clang.cxxflags = table.merge(gcc.cxxflags, { }) function clang.getcxxflags(cfg) local shared = config.mapFlags(cfg, clang.shared) local cxxflags = config.mapFlags(cfg, clang.cxxflags) local flags = table.join(shared, cxxflags) flags = table.join(flags, clang.getwarnings(cfg), clang.getsystemversionflags(cfg)) return flags end function clang.getdefines(defines) local flags = gcc.getdefines(defines) return flags end function clang.getundefines(undefines) local flags = gcc.getundefines(undefines) return flags end function clang.getforceincludes(cfg) local flags = gcc.getforceincludes(cfg) return flags end function clang.getincludedirs(cfg, dirs, sysdirs, frameworkdirs) local flags = gcc.getincludedirs(cfg, dirs, sysdirs, frameworkdirs) return flags end clang.getrunpathdirs = gcc.getrunpathdirs function clang.getsharedlibarg(cfg) return gcc.getsharedlibarg(cfg) end clang.ldflags = { architecture = { x86 = "-m32", x86_64 = "-m64", }, flags = { LinkTimeOptimization = "-flto", }, kind = { SharedLib = function(cfg) local r = { clang.getsharedlibarg(cfg) } if cfg.system == "windows" and not cfg.flags.NoImportLib then table.insert(r, '-Wl,--out-implib="' .. cfg.linktarget.relpath .. '"') elseif cfg.system == p.LINUX then table.insert(r, '-Wl,-soname=' .. p.quoted(cfg.linktarget.name)) elseif table.contains(os.getSystemTags(cfg.system), "darwin") then table.insert(r, '-Wl,-install_name,' .. p.quoted('@rpath/' .. cfg.linktarget.name)) end return r end, WindowedApp = function(cfg) if cfg.system == p.WINDOWS then return "-mwindows" end end, }, system = { wii = "$(MACHDEP)", } } function clang.getldflags(cfg) local flags = config.mapFlags(cfg, clang.ldflags) return flags end function clang.getLibraryDirectories(cfg) local flags = gcc.getLibraryDirectories(cfg) return flags end function clang.getlinks(cfg, systemonly, nogroups) return gcc.getlinks(cfg, systemonly, nogroups) end function clang.getmakesettings(cfg) local flags = gcc.getmakesettings(cfg) return flags end clang.tools = { cc = "clang", cxx = "clang++", ar = function(cfg) return iif(cfg.flags.LinkTimeOptimization, "llvm-ar", "ar") end } function clang.gettoolname(cfg, tool) local value = clang.tools[tool] if type(value) == "function" then value = value(cfg) end return value end local p = premake p.tools.snc = {} local snc = p.tools.snc local gcc = p.tools.gcc snc.shared = { flags = { FatalCompileWarnings = "-Xquit=2", }, optimize = { Off = "-O0", On = "-O1", Debug = "-Od", Full = "-O3", Size = "-Os", Speed = "-O2", }, warnings = { Extra = "-Xdiag=2", } } snc.cflags = { } function snc.getcflags(cfg) local shared = p.config.mapFlags(cfg, snc.shared) local cflags = p.config.mapFlags(cfg, snc.cflags) local flags = table.join(shared, cflags, snc.getwarnings(cfg)) return flags end snc.cxxflags = { exceptionhandling = { Default = "-Xc+=exceptions", On = "-Xc+=exceptions", SEH = "-Xc-=exceptions", }, rtti = { Default = "-Xc+=rtti", On = "-Xc+=rtti", SEH = "-Xc-=rtti", } } function snc.getcxxflags(cfg) local shared = config.mapFlags(cfg, snc.shared) local cxxflags = config.mapFlags(cfg, snc.cxxflags) local flags = table.join(shared, cxxflags, snc.getwarnings(cfg)) return flags end function snc.getforceincludes(cfg) local flags = gcc.getforceincludes(cfg) return flags end function snc.getldflags(cfg) local flags = { } if not (cfg.symbols == p.ON) then table.insert(flags, "-s") end return flags end snc.getcppflags = gcc.getcppflags snc.getdefines = gcc.getdefines snc.getincludedirs = gcc.getincludedirs snc.getrunpathdirs = gcc.getrunpathdirs snc.getLibraryDirectories = gcc.getLibraryDirectories snc.getlinks = gcc.getlinks function snc.getmakesettings(cfg) return nil end snc.tools = { } function snc.gettoolname(cfg, tool) local names = snc.tools[cfg.architecture] or snc.tools[cfg.system] or {} return names[tool] end local p = premake p.tools.msc = {} local msc = p.tools.msc local project = p.project local config = p.config function msc.getcppflags(cfg) return {} end local function getRuntimeFlag(cfg, isstatic) local rt = cfg.runtime local flag = iif(isstatic, "/MT", "/MD") if (rt == "Debug") or (rt == nil and config.isDebugBuild(cfg)) then flag = flag .. "d" end return flag end msc.shared = { clr = { On = "/clr", Unsafe = "/clr", Pure = "/clr:pure", Safe = "/clr:safe", }, flags = { FatalCompileWarnings = "/WX", LinkTimeOptimization = "/GL", MultiProcessorCompile = "/MP", NoMinimalRebuild = "/Gm-", OmitDefaultLibrary = "/Zl" }, floatingpoint = { Fast = "/fp:fast", Strict = "/fp:strict", }, floatingpointexceptions = { On = "/fp:except", Off = "/fp:except-", }, functionlevellinking = { On = "/Gy", Off = "/Gy-", }, callingconvention = { Cdecl = "/Gd", FastCall = "/Gr", StdCall = "/Gz", VectorCall = "/Gv", }, intrinsics = { On = "/Oi", }, optimize = { Off = "/Od", On = "/Ot", Debug = "/Od", Full = "/Ox", Size = "/O1", Speed = "/O2", }, vectorextensions = { AVX = "/arch:AVX", AVX2 = "/arch:AVX2", SSE = "/arch:SSE", SSE2 = "/arch:SSE2", SSE3 = "/arch:SSE2", SSSE3 = "/arch:SSE2", ["SSE4.1"] = "/arch:SSE2", ["SSE4.2"] = "/arch:SSE2", }, warnings = { Off = "/W0", High = "/W4", Extra = "/W4", Everything = "/Wall", }, staticruntime = { _ = function(cfg) return getRuntimeFlag(cfg, false) end, Default = function(cfg) return getRuntimeFlag(cfg, false) end, On = function(cfg) return getRuntimeFlag(cfg, true) end, Off = function(cfg) return getRuntimeFlag(cfg, false) end, }, stringpooling = { On = "/GF", Off = "/GF-", }, symbols = { On = "/Z7" }, unsignedchar = { On = "/J", }, omitframepointer = { On = "/Oy" }, justmycode = { On = "/JMC", Off = "/JMC-" }, openmp = { On = "/openmp", Off = "/openmp-" } } msc.cflags = { } function msc.getcflags(cfg) local shared = config.mapFlags(cfg, msc.shared) local cflags = config.mapFlags(cfg, msc.cflags) local flags = table.join(shared, cflags, msc.getwarnings(cfg)) return flags end msc.cxxflags = { exceptionhandling = { Default = "/EHsc", On = "/EHsc", SEH = "/EHa", }, rtti = { Off = "/GR-" } } function msc.getcxxflags(cfg) local shared = config.mapFlags(cfg, msc.shared) local cxxflags = config.mapFlags(cfg, msc.cxxflags) local flags = table.join(shared, cxxflags, msc.getwarnings(cfg)) return flags end msc.defines = { characterset = { Default = { '/D"_UNICODE"', '/D"UNICODE"' }, MBCS = '/D"_MBCS"', Unicode = { '/D"_UNICODE"', '/D"UNICODE"' }, ASCII = { }, } } function msc.getdefines(defines, cfg) local result if cfg and defines then result = config.mapFlags(cfg, msc.defines) else result = {} end for _, define in ipairs(defines) do table.insert(result, '/D"' .. define .. '"') end if cfg and cfg.exceptionhandling == p.OFF then table.insert(result, "/D_HAS_EXCEPTIONS=0") end return result end function msc.getundefines(undefines) local result = {} for _, undefine in ipairs(undefines) do table.insert(result, '/U"' .. undefine .. '"') end return result end function msc.getforceincludes(cfg) local result = {} table.foreachi(cfg.forceincludes, function(value) local fn = project.getrelative(cfg.project, value) table.insert(result, "/FI" .. p.quoted(fn)) end) return result end function msc.getrunpathdirs() return {} end function msc.getincludedirs(cfg, dirs, sysdirs, frameworkdirs) local result = {} dirs = table.join(dirs, sysdirs) for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-I' .. p.quoted(dir)) end return result end msc.linkerFlags = { flags = { FatalLinkWarnings = "/WX", LinkTimeOptimization = "/LTCG", NoIncrementalLink = "/INCREMENTAL:NO", NoManifest = "/MANIFEST:NO", OmitDefaultLibrary = "/NODEFAULTLIB", }, kind = { SharedLib = "/DLL", WindowedApp = "/SUBSYSTEM:WINDOWS" }, symbols = { On = "/DEBUG" } } msc.librarianFlags = { flags = { FatalLinkWarnings = "/WX", } } function msc.getldflags(cfg) local map = iif(cfg.kind ~= p.STATICLIB, msc.linkerFlags, msc.librarianFlags) local flags = config.mapFlags(cfg, map) table.insert(flags, 1, "/NOLOGO") for i, ignore in ipairs(cfg.ignoredefaultlibraries) do if not msc.getLibraryExtensions()[ignore:match("[^.]+$")] then ignore = path.appendextension(ignore, ".lib") end table.insert(flags, '/NODEFAULTLIB:' .. ignore) end return flags end function msc.getLibraryDirectories(cfg) local flags = {} local dirs = table.join(cfg.libdirs, cfg.syslibdirs) for i, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(flags, '/LIBPATH:"' .. dir .. '"') end return flags end function msc.getLibraryExtensions() return { ["lib"] = true, ["obj"] = true, } end function msc.getlinks(cfg, systemonly, nogroups) local links = {} if not systemonly then links = config.getlinks(cfg, "siblings", "fullpath") end local system = config.getlinks(cfg, "system", "fullpath") for i = 1, #system do local link = system[i] if not p.tools.msc.getLibraryExtensions()[link:match("[^.]+$")] then link = path.appendextension(link, ".lib") end table.insert(links, link) end return links end function msc.getmakesettings(cfg) return nil end function msc.gettoolname(cfg, tool) return nil end function msc.getwarnings(cfg) local result = {} for _, enable in ipairs(cfg.enablewarnings) do table.insert(result, '/w1"' .. enable .. '"') end for _, disable in ipairs(cfg.disablewarnings) do table.insert(result, '/wd"' .. disable .. '"') end for _, fatal in ipairs(cfg.fatalwarnings) do table.insert(result, '/we"' .. fatal .. '"') end return result end local p = premake p.tools.gcc = {} local gcc = p.tools.gcc local project = p.project local config = p.config gcc.cppflags = { system = { haiku = "-MMD", wii = { "-MMD", "-MP", "-I$(LIBOGC_INC)", "$(MACHDEP)" }, _ = { "-MMD", "-MP" } } } function gcc.getcppflags(cfg) local flags = config.mapFlags(cfg, gcc.cppflags) return flags end function gcc.getdebugformat(cfg) local flags = { Default = "", Dwarf = "dwarf", SplitDwarf = "split-dwarf", } return flags end gcc.shared = { architecture = { x86 = "-m32", x86_64 = "-m64", }, flags = { FatalCompileWarnings = "-Werror", LinkTimeOptimization = "-flto", ShadowedVariables = "-Wshadow", UndefinedIdentifiers = "-Wundef", }, floatingpoint = { Fast = "-ffast-math", Strict = "-ffloat-store", }, strictaliasing = { Off = "-fno-strict-aliasing", Level1 = { "-fstrict-aliasing", "-Wstrict-aliasing=1" }, Level2 = { "-fstrict-aliasing", "-Wstrict-aliasing=2" }, Level3 = { "-fstrict-aliasing", "-Wstrict-aliasing=3" }, }, optimize = { Off = "-O0", On = "-O2", Debug = "-Og", Full = "-O3", Size = "-Os", Speed = "-O3", }, pic = { On = "-fPIC", }, vectorextensions = { AVX = "-mavx", AVX2 = "-mavx2", SSE = "-msse", SSE2 = "-msse2", SSE3 = "-msse3", SSSE3 = "-mssse3", ["SSE4.1"] = "-msse4.1", ["SSE4.2"] = "-msse4.2", }, isaextensions = { MOVBE = "-mmovbe", POPCNT = "-mpopcnt", PCLMUL = "-mpclmul", LZCNT = "-mlzcnt", BMI = "-mbmi", BMI2 = "-mbmi2", F16C = "-mf16c", AES = "-maes", FMA = "-mfma", FMA4 = "-mfma4", RDRND = "-mrdrnd", }, warnings = { Off = "-w", High = "-Wall", Extra = {"-Wall", "-Wextra"}, Everything = "-Weverything", }, symbols = function(cfg, mappings) local values = gcc.getdebugformat(cfg) local debugformat = values[cfg.debugformat] or "" return { On = "-g" .. debugformat, FastLink = "-g" .. debugformat, Full = "-g" .. debugformat, } end, unsignedchar = { On = "-funsigned-char", Off = "-fno-unsigned-char" }, omitframepointer = { On = "-fomit-frame-pointer", Off = "-fno-omit-frame-pointer" }, compileas = { ["Objective-C"] = "-x objective-c", ["Objective-C++"] = "-x objective-c++", } } gcc.cflags = { cdialect = { ["C89"] = "-std=c89", ["C90"] = "-std=c90", ["C99"] = "-std=c99", ["C11"] = "-std=c11", ["gnu89"] = "-std=gnu89", ["gnu90"] = "-std=gnu90", ["gnu99"] = "-std=gnu99", ["gnu11"] = "-std=gnu11", } } function gcc.getcflags(cfg) local shared_flags = config.mapFlags(cfg, gcc.shared) local cflags = config.mapFlags(cfg, gcc.cflags) local flags = table.join(shared_flags, cflags, gcc.getsystemversionflags(cfg)) flags = table.join(flags, gcc.getwarnings(cfg)) return flags end function gcc.getwarnings(cfg) local result = {} for _, enable in ipairs(cfg.enablewarnings) do table.insert(result, '-W' .. enable) end for _, disable in ipairs(cfg.disablewarnings) do table.insert(result, '-Wno-' .. disable) end for _, fatal in ipairs(cfg.fatalwarnings) do table.insert(result, '-Werror=' .. fatal) end return result end function gcc.getsystemversionflags(cfg) local flags = {} if cfg.system == p.MACOSX then local minVersion = p.project.systemversion(cfg) if minVersion ~= nil then table.insert (flags, "-mmacosx-version-min=" .. minVersion) end end return flags end gcc.cxxflags = { exceptionhandling = { Off = "-fno-exceptions" }, flags = { NoBufferSecurityCheck = "-fno-stack-protector", }, cppdialect = { ["C++98"] = "-std=c++98", ["C++0x"] = "-std=c++0x", ["C++11"] = "-std=c++11", ["C++1y"] = "-std=c++1y", ["C++14"] = "-std=c++14", ["C++1z"] = "-std=c++1z", ["C++17"] = "-std=c++17", ["C++2a"] = "-std=c++2a", ["C++20"] = "-std=c++20", ["gnu++98"] = "-std=gnu++98", ["gnu++0x"] = "-std=gnu++0x", ["gnu++11"] = "-std=gnu++11", ["gnu++1y"] = "-std=gnu++1y", ["gnu++14"] = "-std=gnu++14", ["gnu++1z"] = "-std=gnu++1z", ["gnu++17"] = "-std=gnu++17", ["gnu++2a"] = "-std=gnu++2a", ["gnu++20"] = "-std=gnu++20", ["C++latest"] = "-std=c++20", }, rtti = { Off = "-fno-rtti" }, visibility = { Default = "-fvisibility=default", Hidden = "-fvisibility=hidden", Internal = "-fvisibility=internal", Protected = "-fvisibility=protected", }, inlinesvisibility = { Hidden = "-fvisibility-inlines-hidden" } } function gcc.getcxxflags(cfg) local shared_flags = config.mapFlags(cfg, gcc.shared) local cxxflags = config.mapFlags(cfg, gcc.cxxflags) local flags = table.join(shared_flags, cxxflags) flags = table.join(flags, gcc.getwarnings(cfg), gcc.getsystemversionflags(cfg)) return flags end function gcc.getdefines(defines) local result = {} for _, define in ipairs(defines) do table.insert(result, '-D' .. p.esc(define)) end return result end function gcc.getundefines(undefines) local result = {} for _, undefine in ipairs(undefines) do table.insert(result, '-U' .. p.esc(undefine)) end return result end function gcc.getforceincludes(cfg) local result = {} table.foreachi(cfg.forceincludes, function(value) local fn = project.getrelative(cfg.project, value) table.insert(result, string.format('-include %s', p.quoted(fn))) end) return result end function gcc.getincludedirs(cfg, dirs, sysdirs, frameworkdirs) local result = {} for _, dir in ipairs(dirs) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-I' .. p.quoted(dir)) end if table.contains(os.getSystemTags(cfg.system), "darwin") then for _, dir in ipairs(frameworkdirs or {}) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-F' .. p.quoted(dir)) end end for _, dir in ipairs(sysdirs or {}) do dir = project.getrelative(cfg.project, dir) table.insert(result, '-isystem ' .. p.quoted(dir)) end return result end function gcc.getpch(cfg) if not cfg.pchheader or cfg.flags.NoPCH then return nil end local pch = cfg.pchheader local found = false local testname = path.join(cfg.project.basedir, pch) if os.isfile(testname) then return project.getrelative(cfg.project, testname) else for _, incdir in ipairs(cfg.includedirs) do testname = path.join(incdir, pch) if os.isfile(testname) then return project.getrelative(cfg.project, testname) end end end return project.getrelative(cfg.project, path.getabsolute(pch)) end function gcc.getrunpathdirs(cfg, dirs, mode) local result = {} mode = iif (mode == nil, "linker", mode) if not (table.contains(os.getSystemTags(cfg.system), "darwin") or (cfg.system == p.LINUX)) then return result end for _, fullpath in ipairs(dirs) do local rpath = path.getrelative(cfg.buildtarget.directory, fullpath) if table.contains(os.getSystemTags(cfg.system), "darwin") then rpath = "@loader_path/" .. rpath elseif (cfg.system == p.LINUX) then rpath = iif(rpath == ".", "", "/" .. rpath) rpath = "$$ORIGIN" .. rpath end if mode == "linker" then rpath = "-Wl,-rpath,'" .. rpath .. "'" end table.insert(result, rpath) end return result end function gcc.getsharedlibarg(cfg) if table.contains(os.getSystemTags(cfg.system), "darwin") then if cfg.sharedlibtype == "OSXBundle" then return "-bundle" elseif cfg.sharedlibtype == "XCTest" then return "-bundle" elseif cfg.sharedlibtype == "OSXFramework" then return "-framework" else return "-dynamiclib" end else return "-shared" end end function gcc.ldsymbols(cfg) return iif(table.contains(os.getSystemTags(cfg.system), "darwin"), "-Wl,-x", "-s") end gcc.ldflags = { architecture = { x86 = "-m32", x86_64 = "-m64", }, flags = { LinkTimeOptimization = "-flto", }, kind = { SharedLib = function(cfg) local r = { gcc.getsharedlibarg(cfg) } if cfg.system == p.WINDOWS and not cfg.flags.NoImportLib then table.insert(r, '-Wl,--out-implib="' .. cfg.linktarget.relpath .. '"') elseif cfg.system == p.LINUX then table.insert(r, '-Wl,-soname=' .. p.quoted(cfg.linktarget.name)) elseif table.contains(os.getSystemTags(cfg.system), "darwin") then table.insert(r, '-Wl,-install_name,' .. p.quoted('@rpath/' .. cfg.linktarget.name)) end return r end, WindowedApp = function(cfg) if cfg.system == p.WINDOWS then return "-mwindows" end end, }, system = { wii = "$(MACHDEP)", }, symbols = { Off = gcc.ldsymbols, Default = gcc.ldsymbols, } } function gcc.getldflags(cfg) local flags = config.mapFlags(cfg, gcc.ldflags) return flags end gcc.libraryDirectories = { architecture = { x86 = function (cfg) local r = {} if not table.contains(os.getSystemTags(cfg.system), "darwin") then table.insert (r, "-L/usr/lib32") end return r end, x86_64 = function (cfg) local r = {} if not table.contains(os.getSystemTags(cfg.system), "darwin") then table.insert (r, "-L/usr/lib64") end return r end, }, system = { wii = "-L$(LIBOGC_LIB)", } } function gcc.getLibraryDirectories(cfg) local flags = {} for _, dir in ipairs(config.getlinks(cfg, "system", "directory")) do table.insert(flags, '-L' .. p.quoted(dir)) end if table.contains(os.getSystemTags(cfg.system), "darwin") then for _, dir in ipairs(cfg.frameworkdirs) do dir = project.getrelative(cfg.project, dir) table.insert(flags, '-F' .. p.quoted(dir)) end end if cfg.flags.RelativeLinks then for _, dir in ipairs(config.getlinks(cfg, "siblings", "directory")) do local libFlag = "-L" .. p.project.getrelative(cfg.project, dir) if not table.contains(flags, libFlag) then table.insert(flags, libFlag) end end end for _, dir in ipairs(cfg.syslibdirs) do table.insert(flags, '-L' .. p.quoted(dir)) end local gccFlags = config.mapFlags(cfg, gcc.libraryDirectories) flags = table.join(flags, gccFlags) return flags end function gcc.getlinks(cfg, systemonly, nogroups) local result = {} if not systemonly then if cfg.flags.RelativeLinks then local libFiles = config.getlinks(cfg, "siblings", "basename") for _, link in ipairs(libFiles) do if string.startswith(link, "lib") then link = link:sub(4) end table.insert(result, "-l" .. link) end else result = config.getlinks(cfg, "siblings", "fullpath") end end local links = config.getlinks(cfg, "system", "fullpath") local static_syslibs = {"-Wl,-Bstatic"} local shared_syslibs = {} for _, link in ipairs(links) do if path.isframework(link) then table.insert(result, "-framework") table.insert(result, path.getbasename(link)) elseif path.isobjectfile(link) then table.insert(result, link) else local endswith = function(s, ptrn) return ptrn == string.sub(s, -string.len(ptrn)) end local name = path.getname(link) if endswith(name, ":static") then name = string.sub(name, 0, -8) table.insert(static_syslibs, "-l" .. name) elseif endswith(name, ":shared") then name = string.sub(name, 0, -8) table.insert(shared_syslibs, "-l" .. name) else table.insert(shared_syslibs, "-l" .. name) end end end local move = function(a1, a2) local t = #a2 for i = 1, #a1 do a2[t + i] = a1[i] end end if #static_syslibs > 1 then table.insert(static_syslibs, "-Wl,-Bdynamic") move(static_syslibs, result) end move(shared_syslibs, result) if not nogroups and #result > 1 and (cfg.linkgroups == p.ON) then table.insert(result, 1, "-Wl,--start-group") table.insert(result, "-Wl,--end-group") end return result end gcc.makesettings = { system = { wii = [[ ifeq ($(strip $(DEVKITPPC)),) $(error "DEVKITPPC environment variable is not set")' endif include $(DEVKITPPC)/wii_rules']] } } function gcc.getmakesettings(cfg) local settings = config.mapFlags(cfg, gcc.makesettings) return table.concat(settings) end gcc.tools = { cc = "gcc", cxx = "g++", ar = "ar", rc = "windres" } function gcc.gettoolname(cfg, tool) if (cfg.gccprefix and gcc.tools[tool]) or tool == "rc" then return (cfg.gccprefix or "") .. gcc.tools[tool] end return nil end local p = premake p.tools.dotnet = {} local dotnet = p.tools.dotnet local project = p.project local config = p.config function dotnet.fileinfo(fcfg) local info = {} if (fcfg == nil) then return info end local fname = fcfg.abspath local ext = path.getextension(fname):lower() if fcfg.buildaction == "Compile" or ext == ".cs" or ext == ".fs" then info.action = "Compile" elseif fcfg.buildaction == "Embed" or ext == ".resx" then info.action = "EmbeddedResource" elseif fcfg.buildaction == "Copy" or ext == ".asax" or ext == ".aspx" or ext == ".dll" or ext == ".tt" then info.action = "Content" elseif fcfg.buildaction == "Resource" then info.action = "Resource" elseif ext == ".xaml" then if fcfg.buildaction == "Application" or path.getbasename(fname) == "App" then if fcfg.project.kind == p.SHAREDLIB then info.action = "None" else info.action = "ApplicationDefinition" end else info.action = "Page" end else info.action = "None" end if info.action == "Compile" and fname:endswith(".cs") then if fname:endswith(".Designer.cs") then local basename = fname:sub(1, -13) local testname = basename .. ".resx" if project.hasfile(fcfg.project, testname) then info.AutoGen = "True" info.DependentUpon = testname end testname = basename .. ".settings" if project.hasfile(fcfg.project, testname) then info.AutoGen = "True" info.DependentUpon = testname info.DesignTimeSharedInput = "True" end testname = basename .. ".cs" if project.hasfile(fcfg.project, testname) then info.AutoGen = nil info.SubType = "Dependency" info.DependentUpon = testname end testname = basename .. ".xsd" if project.hasfile(fcfg.project, testname) then info.AutoGen = "True" info.DesignTime = "True" info.DependentUpon = testname end elseif fname:endswith(".xaml.cs") then info.SubType = "Code" info.DependentUpon = fname:sub(1, -4) else local basename = fname:sub(1, -4) testname = basename .. ".xsd" if project.hasfile(fcfg.project, testname) then info.DependentUpon = testname end testname = basename .. ".Designer.cs" if project.hasfile(fcfg.project, testname) then info.SubType = "Form" end testname = basename .. ".tt" if project.hasfile(fcfg.project, testname) then info.AutoGen = "True" info.DesignTime = "True" info.DependentUpon = testname end end if fcfg.buildaction == "Component" or fcfg.buildaction == "Form" or fcfg.buildaction == "UserControl" then info.SubType = fcfg.buildaction end if fcfg.flags and fcfg.flags.Component then info.SubType = "Component" end end if info.action == "Content" then info.CopyToOutputDirectory = "PreserveNewest" end if info.action == "EmbeddedResource" and fname:endswith(".resx") then local basename = fname:sub(1, -6) local testname = basename .. ".cs" if project.hasfile(fcfg.project, testname) then info.DependentUpon = testname if project.hasfile(fcfg.project, basename .. ".Designer.cs") then info.SubType = "DesignerType" end else testname = basename .. ".Designer.cs" if project.hasfile(fcfg.project, testname) then info.SubType = "Designer" local resourceAccessGenerator = "ResXFileCodeGenerator" if fcfg.project.resourcegenerator then if fcfg.project.resourcegenerator == "public" then resourceAccessGenerator = "PublicResXFileCodeGenerator" end end info.Generator = resourceAccessGenerator info.LastGenOutput = path.getname(testname) end end end if info.action == "None" and fname:endswith(".settings") then local testname = fname:sub(1, -10) .. ".Designer.cs" if project.hasfile(fcfg.project, testname) then info.Generator = "SettingsSingleFileGenerator" info.LastGenOutput = path.getname(testname) end end if info.action == "Content" and fname:endswith(".tt") then local testname = fname:sub(1, -4) .. ".cs" if project.hasfile(fcfg.project, testname) then info.Generator = "TextTemplatingFileGenerator" info.LastGenOutput = path.getname(testname) info.CopyToOutputDirectory = nil end end if info.action == "None" and fname:endswith(".xsd") then local testname = fname:sub(1, -5) .. ".Designer.cs" if project.hasfile(fcfg.project, testname) then info.SubType = "Designer" info.Generator = "MSDataSetGenerator" info.LastGenOutput = path.getname(testname) end end if info.action == "None" and (fname:endswith(".xsc") or fname:endswith(".xss")) then local testname = fname:sub(1, -5) .. ".xsd" if project.hasfile(fcfg.project, testname) then info.DependentUpon = testname end end if fname:endswith(".xaml") then local testname = fname .. ".cs" if project.hasfile(fcfg.project, testname) then info.SubType = "Designer" info.Generator = "MSBuild:Compile" end end if info.DependentUpon then info.DependentUpon = path.getname(info.DependentUpon) end return info end function dotnet.gettoolname(cfg, tool) local compilers = { msnet = "csc", mono = "mcs", pnet = "cscc", } if tool == "csc" then local toolset = _OPTIONS.dotnet or "msnet" return compilers[toolset] else return "resgen" end end dotnet.flags = { clr = { Unsafe = "/unsafe", }, flags = { FatalWarning = "/warnaserror", }, optimize = { On = "/optimize", Size = "/optimize", Speed = "/optimize", }, symbols = { On = "/debug", } } function dotnet.getflags(cfg) local flags = config.mapFlags(cfg, dotnet.flags) table.insert(flags, '/noconfig') if cfg.project.icon then local fn = project.getrelative(cfg.project, cfg.project.icon) table.insert(flags, string.format('/win32icon:"%s"', fn)) end if #cfg.defines > 0 then table.insert(flags, table.implode(cfg.defines, "/d:", "", " ")) end if cfg.csversion ~= nil then table.insert(flags, '/langversion:' .. cfg.csversion) end return table.join(flags, cfg.buildoptions) end function dotnet.getkind(cfg) if (cfg.kind == "ConsoleApp") then return "Exe" elseif (cfg.kind == "WindowedApp") then return "WinExe" elseif (cfg.kind == "SharedLib") then return "Library" else error("invalid dotnet kind " .. cfg.kind .. ". Valid kinds are ConsoleApp, WindowsApp, SharedLib") end end function dotnet.getmakesettings(cfg) return nil end function premake.showhelp() printf("Premake %s, a build script generator", _PREMAKE_VERSION) printf(_PREMAKE_COPYRIGHT) printf("%s %s", _VERSION, _COPYRIGHT) printf("") printf("Usage: premake5 [options] action [arguments]") printf("") local categories = {} for option in premake.option.each() do local cat = "OPTIONS - General" if option.category then cat = "OPTIONS - " .. option.category; end if categories[cat] then table.insert(categories[cat], option) else categories[cat] = {option} end end for k, options in spairs(categories) do printf(k) printf("") local length = 0 for _, option in ipairs(options) do local trigger = option.trigger if (option.value) then trigger = trigger .. "=" .. option.value end if (#trigger > length) then length = #trigger end end for _, option in ipairs(options) do local trigger = option.trigger local description = option.description if (option.value) then trigger = trigger .. "=" .. option.value end if (option.allowed) then description = description .. "; one of:" end printf(" --%-" .. length .. "s %s", trigger, description) if (option.allowed) then local function compareValue(a, b) return a[1] < b[1] end table.sort(option.allowed, compareValue) for _, value in ipairs(option.allowed) do printf(" %-" .. length-1 .. "s %s", value[1], value[2]) end printf("") end end printf("") end printf("ACTIONS") printf("") for action in premake.action.each() do printf(" %-17s %s", action.trigger, action.description) end printf("") printf("For additional information, see https://premake.github.io") end local p = premake local _captured local _esc = function(v) return v end local _eol = "\n" local _indentString = "\t" local _indentLevel = 0 global("root") function premake.capture(fn) local old = _captured _captured = buffered.new() fn() local captured = p.captured() buffered.close(_captured) _captured = old return captured end function premake.captured() if _captured then return buffered.tostring(_captured) else return "" end end function premake.eol(s) _eol = s or _eol return _eol end function premake.esc(value) if type(value) == "table" then local result = {} local n = #value for i = 1, n do table.insert(result, p.esc(value[i])) end return result end return _esc(value or "") end function premake.escaper(func) _esc = func if not _esc then _esc = function (value) return value end end end function premake.generate(obj, ext, callback) local output = p.capture(function () _indentLevel = 0 callback(obj) _indentLevel = 0 end) local fn = p.filename(obj, ext) local dir = path.getdirectory(fn) local ok, err = os.mkdir(dir) if not ok then error(err, 0) end local f, err = os.writefile_ifnotequal(output, fn); if (f == 0) then return false -- file not modified elseif (f < 0) then error(err, 0) elseif (f > 0) then printf("Generated %s...", path.getrelative(os.getcwd(), fn)) return true -- file modified end end function premake.touch(obj, ext) local fn = premake.filename(obj, ext) local dir = path.getdirectory(fn) local ok, err = os.mkdir(dir) if not ok then error(err, 0) end local f, err = os.touchfile(fn); if (f == 0) then return false -- file marked as modified elseif (f < 0) then error(err, 0) elseif (f > 0) then return true -- file created end end function premake.filename(obj, ext) local fname = obj.location or obj.basedir if ext and not ext:startswith(".") then fname = path.join(fname, ext) else fname = path.join(fname, obj.filename) if ext then fname = fname .. ext end end return path.getabsolute(fname) end function premake.indent(s, i) _indentString = s or "\t" _indentLevel = i or 0 end function premake.out(s) if not _captured then io.write(s) else buffered.write(_captured, s) end end function premake.outln(s) p.out(s) p.out(_eol or "\n") end function premake.pop(i, ...) if i == nil or type(i) == "number" then _indentLevel = _indentLevel - (i or 1) else _indentLevel = _indentLevel - 1 p.w(i, ...) end end function premake.push(i, ...) if i == nil or type(i) == "number" then _indentLevel = _indentLevel + (i or 1) else p.w(i, ...) _indentLevel = _indentLevel + 1 end end function premake.quoted(value) local q = value:find(" ", 1, true) if not q then q = value:find("$%(.-%)", 1) end if q then value = '"' .. value .. '"' end return value end function p.utf8() p.out('\239\187\191') end function premake.w(...) if select("#", ...) > 0 then p.outln(string.rep(_indentString or "\t", _indentLevel) .. string.format(...)) else p.outln(''); end end function premake.x(msg, ...) local arg = {...} for i = 1, #arg do arg[i] = p.esc(arg[i]) end p.w(msg, table.unpack(arg)) end function premake.xmlUtf8(upper) local encoding = iif(upper, "UTF-8", "utf-8") p.w('', encoding) end function _p(i, ...) if type(i) == "number" then _indentLevel = i p.w(...) else _indentLevel = 0 p.w(i, ...) end end function _x(i, ...) local arg = {...} for i = 2, #arg do arg[i] = p.esc(arg[i]) end _p(i, table.unpack(arg)) end local p = premake p.validation = {} local m = p.validation m.elements = {} m.elements.global = function(glb) return { } end function p.global.validate(self) p.callArray(m.elements.global, self) p.container.validateChildren(self) end m.elements.workspace = function(wks) return { m.workspaceHasConfigs, m.uniqueProjectIds, } end function p.workspace.validate(self) p.callArray(m.elements.workspace, self) p.container.validateChildren(self) end m.elements.project = function(prj) return { m.projectHasLanguage, m.actionSupportsLanguage, m.actionSupportsKind, m.projectRulesExist, m.projectValuesInScope, } end function p.project.validate(self) p.callArray(m.elements.project, self) for cfg in p.project.eachconfig(self) do p.config.validate(cfg) end end m.elements.config = function(cfg) return { m.configHasKind, m.configSupportsKind, m.configValuesInScope, } end function p.config.validate(self) p.callArray(m.elements.config, self) end m.elements.rule = function(rule) return { } end function p.rule.validate(self) p.callArray(m.elements.rule, self) end function p.config.validateScopes(self, container, expected) for f in p.field.each() do local scope for i = 1, #f.scopes do if f.scopes[i] == "config" or p.container.classIsA(container.class, f.scopes[i]) then scope = f.scopes[i] break end end local okay = (not scope or scope == "config") okay = okay or scope == expected okay = okay or p.oven.bubbledFields[f.name] okay = okay or p.field.compare(f, self[scope][f.name], self[f.name]) if not okay then local key = "validate." .. f.name p.warnOnce(key, "'%s' on %s '%s' differs from %s '%s'; may be set out of scope", f.name, expected, self.name, scope, self[scope].name) end end end function m.actionSupportsKind(prj) if not p.action.supports(prj.kind) then p.warn("Unsupported kind '%s' used for project '%s'", prj.kind, prj.name) end end function m.actionSupportsLanguage(prj) if not p.action.supports(prj.language) then p.warn("Unsupported language '%s' used for project '%s'", prj.language, prj.name) end end function m.configHasKind(cfg) if not cfg.kind then p.error("Project '%s' needs a kind in configuration '%s'", cfg.project.name, cfg.name) end end function m.configSupportsKind(cfg) if not p.action.supports(cfg.kind) then p.warn("Unsupported kind '%s' used in configuration '%s'", cfg.kind, cfg.name) end if (cfg.kind == p.MAKEFILE or cfg.kind == p.NONE) and p.project.isdotnet(cfg.project) then p.error("Project '%s' uses '%s' kind in configuration '%s'; language must not be C#", cfg.project.name, cfg.kind, cfg.name) end end function m.configValuesInScope(cfg) p.config.validateScopes(cfg, cfg.project, "config") end function m.projectHasLanguage(prj) if not prj.language then p.error("project '%s' does not have a language", prj.name) end end function m.projectRulesExist(prj) for i = 1, #prj.rules do local rule = prj.rules[i] if not p.global.getRule(rule) then p.error("project '%s' uses missing rule '%s'", prj.name, rule) end end end function m.projectValuesInScope(prj) p.config.validateScopes(prj, prj, "project") end function m.uniqueProjectIds(wks) local uuids = {} for prj in p.workspace.eachproject(wks) do if uuids[prj.uuid] then p.error("projects '%s' and '%s' have the same UUID", uuids[prj.uuid], prj.name) end uuids[prj.uuid] = prj.name end end function m.workspaceHasConfigs(wks) if not wks.configurations or #wks.configurations == 0 then p.error("workspace '%s' does not contain any configurations", wks.name) end end local p = premake p.oven = {} local oven = p.oven local context = p.context p.oven.bubbledFields = { configmap = true, vpaths = true } function oven.bake() local root = p.api.rootContainer() root._isBaked = false; p.container.bake(root) end function oven.bakeWorkspace(wks) return p.container.bake(wks) end p.alias(oven, "bakeWorkspace", "bakeSolution") local function addCommonContextFilters(self) context.addFilter(self, "_ACTION", _ACTION) context.addFilter(self, "action", _ACTION) self.system = self.system or os.target() context.addFilter(self, "system", os.getSystemTags(self.system)) context.addFilter(self, "host", os.getSystemTags(os.host())) local options = {} for key, value in pairs(_OPTIONS) do local term = key if value ~= "" then term = term .. "=" .. tostring(value) end table.insert(options, term) end context.addFilter(self, "_OPTIONS", options) context.addFilter(self, "options", options) end function p.workspace.bake(self) addCommonContextFilters(self) self.environ = { wks = self, sln = self, } context.compile(self) self.location = self.location or self.basedir context.basedir(self, self.location) self.configs = oven.bakeConfigs(self) p.container.bakeChildren(self) oven.bakeObjDirs(self) oven.addGeneratedFiles(self) end function oven.addGeneratedFiles(wks) local function addGeneratedFile(cfg, source, filename) cfg.project.hasGeneratedFiles = true local files = cfg.project._.files local node = files[filename] if not node then node = p.fileconfig.new(filename, cfg.project) files[filename] = node table.insert(files, node) end node.dependsOn = source node.generated = true if not p.fileconfig.getconfig(node, cfg) then p.fileconfig.addconfig(node, cfg) end end local function addFile(cfg, node) local filecfg = p.fileconfig.getconfig(node, cfg) if not filecfg or filecfg.flags.ExcludeFromBuild or not filecfg.compilebuildoutputs then return end if p.fileconfig.hasCustomBuildRule(filecfg) then local buildoutputs = filecfg.buildoutputs if buildoutputs and #buildoutputs > 0 then for _, output in ipairs(buildoutputs) do if not path.islinkable(output) then addGeneratedFile(cfg, node, output) end end end end end for prj in p.workspace.eachproject(wks) do local files = table.shallowcopy(prj._.files) for cfg in p.project.eachconfig(prj) do table.foreachi(files, function(node) addFile(cfg, node) end) end if prj.hasGeneratedFiles and p.project.isnative(prj) then oven.assignObjectSequences(prj) end end end function p.project.bake(self) verbosef(' Baking %s...', self.name) self.solution = self.workspace self.global = self.workspace.global local wks = self.workspace context.copyFilters(self, wks) self.system = self.system or os.target() context.addFilter(self, "system", os.getSystemTags(self.system)) context.addFilter(self, "host", os.getSystemTags(os.host())) context.addFilter(self, "architecture", self.architecture) context.addFilter(self, "tags", self.tags) context.addFilter(self, "kind", self.kind) self.project = self self.environ = { wks = wks, sln = wks, prj = self, } context.compile(self) p.container.bakeChildren(self) self.location = self.location or self.basedir context.basedir(self, self.location) local cfgs = table.fold(self.configurations or {}, self.platforms or {}) oven.bubbleFields(self, self, cfgs) self._cfglist = oven.bakeConfigList(self, cfgs) local projectSystem = self.system self.system = nil self.configs = {} for _, pairing in ipairs(self._cfglist) do local buildcfg = pairing[1] local platform = pairing[2] local cfg = oven.bakeConfig(wks, self, buildcfg, platform) if p.action.supportsconfig(p.action.current(), cfg) then self.configs[(buildcfg or "*") .. (platform or "")] = cfg end end self._ = {} self._.files = oven.bakeFiles(self) if p.project.isnative(self) then oven.assignObjectSequences(self) end self.system = projectSystem end function p.rule.bake(self) addCommonContextFilters(self) self.environ = { rule = self, } context.compile(self) table.sort(self.propertydefinition, function (a, b) return a.name < b.name end) self.location = self.location or self.basedir context.basedir(self, self.location) end function oven.bakeObjDirs(wks) local function getobjdirs(cfg) local objdir = cfg.objdir or "obj" local i = objdir:find("!", 1, true) if i then cfg.objdir = objdir:sub(1, i - 1) .. objdir:sub(i + 1) return nil end local dirs = {} local dir = path.getabsolute(path.join(cfg.project.location, objdir)) table.insert(dirs, dir) if cfg.platform then dir = path.join(dir, cfg.platform) table.insert(dirs, dir) end dir = path.join(dir, cfg.buildcfg) table.insert(dirs, dir) dir = path.join(dir, cfg.project.name) table.insert(dirs, dir) return dirs end local counts = {} local configs = {} for prj in p.workspace.eachproject(wks) do for cfg in p.project.eachconfig(prj) do local dirs = getobjdirs(cfg) if dirs then configs[cfg] = dirs for _, dir in ipairs(dirs or {}) do counts[dir] = (counts[dir] or 0) + 1 end end end end for cfg, dirs in pairs(configs) do for _, dir in ipairs(dirs) do if counts[dir] == 1 then cfg.objdir = dir break end end end end function oven.bakeConfigs(wks) local buildcfgs = wks.configurations or {} local platforms = wks.platforms or {} local configs = {} local pairings = table.fold(buildcfgs, platforms) for _, pairing in ipairs(pairings) do local cfg = oven.bakeConfig(wks, nil, pairing[1], pairing[2]) if p.action.supportsconfig(p.action.current(), cfg) then table.insert(configs, cfg) end end return configs end function oven.bubbleFields(ctx, cset, cfgs) local configurations = {} local platforms = {} for _, cfg in ipairs(cfgs) do if cfg[1] then table.insert(configurations, cfg[1]:lower()) end if cfg[2] then table.insert(platforms, cfg[2]:lower()) end end local terms = table.deepcopy(ctx.terms) terms.configurations = configurations terms.platforms = platforms for key in pairs(oven.bubbledFields) do local field = p.field.get(key) if not field then ctx[key] = rawget(ctx, key) else local value = p.configset.fetch(cset, field, terms, ctx) if value then ctx[key] = value end end end end function oven.bakeConfigList(ctx, cfgs) for i, cfg in ipairs(cfgs) do cfgs[i] = p.project.mapconfig(ctx, cfg[1], cfg[2]) end local buildcfgs = {} local platforms = {} for _, pairing in ipairs(cfgs) do local buildcfg = pairing[1] local platform = pairing[2] if not table.contains(buildcfgs, buildcfg) then table.insert(buildcfgs, buildcfg) end if platform and not table.contains(platforms, platform) then table.insert(platforms, platform) end end return table.fold(buildcfgs, platforms) end function oven.bakeConfig(wks, prj, buildcfg, platform, extraFilters) local system = os.target() local architecture = nil local toolset = p.action.current().toolset if platform then system = p.api.checkValue(p.fields.system, platform) or system architecture = p.api.checkValue(p.fields.architecture, platform) or architecture toolset = p.api.checkValue(p.fields.toolset, platform) or toolset end local environ = { wks = wks, sln = wks, prj = prj, } local ctx = context.new(prj or wks, environ) ctx.project = prj ctx.workspace = wks ctx.solution = wks ctx.global = wks.global ctx.buildcfg = buildcfg ctx.platform = platform ctx.action = _ACTION environ.cfg = ctx context.copyFilters(ctx, wks) context.addFilter(ctx, "configurations", buildcfg) context.addFilter(ctx, "platforms", platform) if prj then context.addFilter(ctx, "language", prj.language) end ctx.system = ctx.system or system context.addFilter(ctx, "system", os.getSystemTags(ctx.system)) context.addFilter(ctx, "host", os.getSystemTags(os.host())) ctx.architecture = ctx.architecture or architecture context.addFilter(ctx, "architecture", ctx.architecture) ctx.toolset = _OPTIONS.cc or ctx.toolset or toolset context.addFilter(ctx, "toolset", ctx.toolset) context.addFilter(ctx, "kind", ctx.kind) context.addFilter(ctx, "sharedlibtype", ctx.sharedlibtype) context.addFilter(ctx, "tags", ctx.tags) if extraFilters then for k, v in pairs(extraFilters) do context.addFilter(ctx, k, v) end end context.compile(ctx) ctx.location = ctx.location or prj and prj.location context.basedir(ctx, ctx.location) oven.finishConfig(ctx) return ctx end function oven.bakeFiles(prj) local files = {} for cfg in p.project.eachconfig(prj) do local function addFile(fname, i) local fcfg = files[fname] if not fcfg then fcfg = p.fileconfig.new(fname, prj) fcfg.order = i files[fname] = fcfg table.insert(files, fcfg) end p.fileconfig.addconfig(fcfg, cfg) end table.foreachi(cfg.files, addFile) if #prj.nuget > 0 and (_ACTION < "vs2017" or p.project.iscpp(prj)) then addFile("packages.config") end end table.sort(files, function(a,b) return a.vpath < b.vpath end) return files end function oven.uniqueSequence(f, cfg, seq, bases) while true do f.sequence = seq[cfg] or 0 seq[cfg] = f.sequence + 1 if f.sequence == 0 then break end local lowerobj = f.objname:lower() if not bases[lowerobj] then bases[lowerobj] = {} end if not bases[lowerobj][cfg] then bases[lowerobj][cfg] = 1 break end end end function oven.assignObjectSequences(prj) local bases = {} table.foreachi(prj._.files, function(file) if not path.isnativefile(file.abspath) then return end local lowerbase = file.basename:lower() if not bases[lowerbase] then bases[lowerbase] = {} end local sequences = bases[lowerbase] for cfg in p.project.eachconfig(prj) do local fcfg = p.fileconfig.getconfig(file, cfg) if fcfg ~= nil and not fcfg.flags.ExcludeFromBuild then oven.uniqueSequence(fcfg, cfg, sequences, bases) end end oven.uniqueSequence(file, prj, sequences, bases) end) end function oven.finishConfig(cfg) cfg.longname = table.concat({ cfg.buildcfg, cfg.platform }, "|") cfg.shortname = table.concat({ cfg.buildcfg, cfg.platform }, " ") cfg.shortname = cfg.shortname:gsub(" ", "_"):lower() cfg.name = cfg.longname if cfg.project and cfg.kind then cfg.buildtarget = p.config.gettargetinfo(cfg) cfg.buildtarget.relpath = p.project.getrelative(cfg.project, cfg.buildtarget.abspath) cfg.linktarget = p.config.getlinkinfo(cfg) cfg.linktarget.relpath = p.project.getrelative(cfg.project, cfg.linktarget.abspath) end end local p = premake p.rule = p.api.container("rule", p.global) local rule = p.rule function rule.new(name) local self = p.container.new(rule, name) _G[name .. "Vars"] = function(vars) rule.setVars(self, vars) end local lowerName = name:gsub("^%u+", string.lower) _G[lowerName .. "Vars"] = _G[name .. "Vars"] return self end function rule.eachProperty(self) local props = self.propertydefinition local i = 0 return function () i = i + 1 if i <= #props then return props[i] end end end function rule.getProperty(self, name) local props = self.propertydefinition for i = 1, #props do local prop = props[i] if prop.name == name then return prop end end end function rule.getPropertyField(self, prop) if prop._field then return prop._field end local kind = prop.kind or "string" if kind == "list" then kind = "list:string" end local fld = p.field.new { name = "_rule_" .. self.name .. "_" .. prop.name, scope = "config", kind = kind, tokens = true, } prop._field = fld return fld end function rule.setVars(self, vars) for key, value in pairs(vars) do local prop = rule.getProperty(self, key) if not prop then error (string.format("rule '%s' does not have property '%s'", self.name, key)) end local fld = rule.getPropertyField(self, prop) p.api.storeField(fld, value) end end function rule.createEnvironment(self, format) local environ = {} for _, def in ipairs(self.propertydefinition) do environ[def.name] = string.format(format, def.name) end return environ end function rule.preparePathVars(self, pathVars, format) for _, def in ipairs(self.propertydefinition) do pathVars[def.name] = { absolute = true, token = string.format(format, def.name) } end end function rule.createPathVars(self, format) local pathVars = {} rule.preparePathVars(self, pathVars, format) return pathVars end function rule.prepareEnvironment(self, environ, cfg) local function path(cfg, value) cfg = cfg.project or cfg local dirs = path.translate(project.getrelative(cfg, value)) if type(dirs) == 'table' then dirs = table.filterempty(dirs) end return dirs end local function expandRuleString(prop, value) if type(value) == "table" then if #value > 0 then local switch = prop.switch or "" if prop.separator then return switch .. table.concat(value, prop.separator) else return switch .. table.concat(value, " " .. switch) end else return nil end end if prop.switch and type(value) == "boolean" then if value then return prop.switch else return nil end end if prop.values then local switch = prop.switch or {} value = table.findKeyByValue(prop.values, value) if value == nil then return nil end return switch[value] end local switch = prop.switch or "" value = tostring(value) if #value > 0 then return switch .. value else return nil end end for _, prop in ipairs(self.propertydefinition) do local fld = p.rule.getPropertyField(self, prop) local value = cfg[fld.name] if value ~= nil then if fld.kind == "path" then value = path(cfg, value) elseif fld.kind == "list:path" then value = path(cfg, value) end value = expandRuleString(prop, value) if value ~= nil and #value > 0 then environ[prop.name] = p.esc(value) end end end end local p = premake p.fileconfig = {} local fileconfig = p.fileconfig local context = p.context local project = p.project fileconfig.fcfg_mt = {} fileconfig.fsub_mt = {} function fileconfig.new(fname, prj) local environ = { } local fcfg = context.new(prj, environ) context.copyFilters(fcfg, prj) context.addFilter(fcfg, "files", fname:lower()) for key, value in pairs(prj.environ) do environ[key] = value end environ.file = fcfg context.compile(fcfg) fcfg.project = prj fcfg.workspace = prj.workspace fcfg.configs = {} fcfg.abspath = fname context.basedir(fcfg, prj.location) setmetatable(fcfg, fileconfig.fcfg_mt) local vpath = project.getvpath(prj, fname) if vpath ~= fcfg.abspath then fcfg.vpath = vpath end return fcfg end function fileconfig.addconfig(fcfg, cfg) local prj = cfg.project local wks = cfg.workspace local environ = {} local fsub = context.new(prj, environ) context.copyFilters(fsub, fcfg) context.mergeFilters(fsub, cfg) fcfg.configs[cfg] = fsub for key, value in pairs(cfg.environ) do environ[key] = value end for key, value in pairs(fcfg.environ) do environ[key] = value end context.compile(fsub) fsub.abspath = fcfg.abspath fsub.vpath = fcfg.vpath fsub.config = cfg fsub.project = prj fsub.workspace = wks context.basedir(fsub, prj.location) return setmetatable(fsub, fileconfig.fsub_mt) end function fileconfig.getconfig(fcfg, cfg) return fcfg.configs[cfg] end function fileconfig.hasCustomBuildRule(fcfg) return fcfg and (#fcfg.buildcommands > 0) and (#fcfg.buildoutputs > 0) end function fileconfig.hasFileSettings(fcfg) if not fcfg then return false end for key, field in pairs(p.fields) do if field.scopes[1] == "config" then local value = fcfg[field.name] if value then if type(value) == "table" then if #value > 0 then return true end else return true end end end end return false end local fcfg_mt = fileconfig.fcfg_mt fcfg_mt.__index = function(fcfg, key) if type(fcfg_mt[key]) == "function" then return fcfg_mt[key](fcfg) end return context.__mt.__index(fcfg, key) end fileconfig.fsub_mt.__index = function(fsub, key) if type(fcfg_mt[key]) == "function" then return fcfg_mt[key](fsub) end return context.__mt.__index(fsub, key) end function fcfg_mt.basename(fcfg) return path.getbasename(fcfg.abspath) end function fcfg_mt.directory(fcfg) return path.getdirectory(fcfg.abspath) end function fcfg_mt.reldirectory(fcfg) return path.getdirectory(fcfg.relpath) end function fcfg_mt.name(fcfg) return path.getname(fcfg.abspath) end function fcfg_mt.objname(fcfg) if fcfg.sequence ~= nil and fcfg.sequence > 0 then return fcfg.basename .. fcfg.sequence else return fcfg.basename end end function fcfg_mt.path(fcfg) return fcfg.relpath end function fcfg_mt.relpath(fcfg) return project.getrelative(fcfg.project, fcfg.abspath) end function fcfg_mt.vpath(fcfg) return fcfg.relpath end function fcfg_mt.extension(fcfg) return path.getextension(fcfg.abspath) end local p = premake p.config = {} local project = p.project local config = p.config function config.buildtargetinfo(cfg, kind, field) local basedir = cfg.project.location local targetdir if cfg.platform then targetdir = path.join(basedir, 'bin', cfg.platform, cfg.buildcfg) else targetdir = path.join(basedir, 'bin', cfg.buildcfg) end local directory = cfg[field.."dir"] or cfg.targetdir or targetdir local basename = cfg[field.."name"] or cfg.targetname or cfg.project.name local prefix = cfg[field.."prefix"] or cfg.targetprefix or "" local suffix = cfg[field.."suffix"] or cfg.targetsuffix or "" local extension = cfg[field.."extension"] or cfg.targetextension or "" local bundlename = "" local bundlepath = "" if table.contains(os.getSystemTags(cfg.system), "darwin") and (kind == p.WINDOWEDAPP or (kind == p.SHAREDLIB and cfg.sharedlibtype)) then bundlename = basename .. extension bundlepath = path.join(bundlename, iif(kind == p.SHAREDLIB and cfg.sharedlibtype == "OSXFramework", "Versions/A", "Contents/MacOS")) end local info = {} info.directory = directory info.basename = basename .. suffix info.name = prefix .. info.basename .. extension info.extension = extension info.abspath = path.join(directory, info.name) info.fullpath = info.abspath info.bundlename = bundlename info.bundlepath = path.join(directory, bundlepath) info.prefix = prefix info.suffix = suffix return info end function config.canLink(cfg, target, linkage) if type(target) ~= "string" then if target.kind ~= "SharedLib" and target.kind ~= "StaticLib" then return false end if cfg.language == "C++" then if cfg.clr == p.ON then return true end end if target.language == "C++" then if target.clr == p.ON then return true end end local cfgManaged = project.isdotnet(cfg.project) or (cfg.clr ~= p.OFF) local tgtManaged = project.isdotnet(target.project) or (target.clr ~= p.OFF) return (cfgManaged == tgtManaged) end if project.isdotnet(cfg.project) then return true end local isManaged = (path.getextension(target) == ".dll") if isManaged and cfg.clr == p.OFF then return false end return (isManaged) == (linkage == "managed") end function config.canLinkIncremental(cfg) if cfg.kind == "StaticLib" or config.isOptimizedBuild(cfg) or cfg.flags.NoIncrementalLink then return false end return true end function config.findfile(cfg, ext) for _, fname in ipairs(cfg.files) do if fname:endswith(ext) then return project.getrelative(cfg.project, fname) end end end function config.getlinkinfo(cfg) local kind = cfg.kind if project.isnative(cfg.project) then if cfg.system == p.WINDOWS and kind == p.SHAREDLIB and not cfg.flags.NoImportLib then kind = p.STATICLIB end end return config.buildtargetinfo(cfg, kind, "implib") end function config.getlinks(cfg, kind, part, linkage) local result = {} if part == "directory" then table.foreachi(cfg.libdirs, function(dir) table.insert(result, project.getrelative(cfg.project, dir)) end) end for i = 1, #cfg.links do local link = cfg.links[i] local item local prj = p.workspace.findproject(cfg.workspace, link) if prj and kind ~= "system" then local prjcfg = project.getconfig(prj, cfg.buildcfg, cfg.platform) if prjcfg and (kind == "dependencies" or config.canLink(cfg, prjcfg)) then if part == "object" then item = prjcfg else item = project.getrelative(cfg.project, prjcfg.linktarget.fullpath) end end elseif not prj and (kind == "system" or kind == "all") then if config.canLink(cfg, link, linkage) then item = link if item:find("/", nil, true) then item = project.getrelative(cfg.project, item) end end end if item and item ~= cfg then if part == "directory" then item = path.getdirectory(item) if item == "." then item = nil end elseif part == "name" then item = path.getname(item) elseif part == "basename" then item = path.getbasename(item) elseif type(part) == "function" then part(link, item) end end if item and not table.contains(result, item) then table.insert(result, item) end end return result end function config.getsiblingtargetdirs(cfg) local paths = {} for _, sibling in ipairs(config.getlinks(cfg, "siblings", "object")) do if (sibling.kind == p.SHAREDLIB) then local p = sibling.linktarget.directory if not (table.contains(paths, p)) then table.insert(paths, p) end end end return paths end function config.getruntime(cfg) if (not cfg.staticruntime or cfg.staticruntime == "Default") and not cfg.runtime then return nil -- indicate that no runtime was explicitly selected end local linkage = iif(cfg.staticruntime == "On", "Static", "Shared") -- assume 'Shared' is default? if not cfg.runtime then return linkage .. iif(config.isDebugBuild(cfg), "Debug", "Release") else return linkage .. cfg.runtime end end function config.gettargetinfo(cfg) return config.buildtargetinfo(cfg, cfg.kind, "target") end function config.hasFile(self, testfn) local files = self.files for i = 1, #files do if testfn(files[i]) then return true end end return false end function config.isCopyLocal(cfg, linkname, default) if cfg.flags.NoCopyLocal then return false end if #cfg.copylocal > 0 then return table.contains(cfg.copylocal, linkname) end return default end function config.isDebugBuild(cfg) return cfg.symbols ~= nil and cfg.symbols ~= p.OFF and cfg.symbols ~= "Default" and not config.isOptimizedBuild(cfg) end function config.isOptimizedBuild(cfg) return cfg.optimize ~= nil and cfg.optimize ~= p.OFF and cfg.optimize ~= "Debug" end function config.linksToProject(cfg, prjName) prjName = prjName:lower() local n = #cfg.links for i = 1,n do if cfg.links[i]:lower() == prjName then return true end end end function config.mapFlags(cfg, mappings) local flags = {} local function add(replacement) if type(replacement) == "function" then replacement = replacement(cfg) end table.insertflat(flags, replacement) end for field in p.field.eachOrdered() do local map = mappings[field.name] if type(map) == "function" then map = map(cfg, mappings) end if map then local values = cfg[field.name] if type(values) == "boolean" then values = iif(values, "On", "Off") end if type(values) ~= "table" then values = { values } end local foundValue = false table.foreachi(values, function(value) local replacement = map[value] if replacement ~= nil then foundValue = true add(replacement) end end) if not foundValue then add(map._) end for key, replacement in pairs(map) do if #key > 1 and key:startswith("_") then key = key:sub(2) if values[key] == nil then add(replacement) end end end end end return flags end function config.normalize(cfg) if cfg and cfg.config ~= nil then return cfg.config, cfg else return cfg, nil end end function config.toolset(cfg) if cfg.toolset then return p.tools.canonical(cfg.toolset) end end local p = premake p.project = p.api.container("project", p.workspace, { "config" }) local project = p.project local tree = p.tree external = externalproject function project.new(name) local prj = p.container.new(project, name) prj.uuid = os.uuid(name) if p.api.scope.group then prj.group = p.api.scope.group.name else prj.group = "" end return prj end function project.eachconfig(prj) local configs = prj._cfglist local count = #configs local seen = {} local i = 0 return function () i = i + 1 if i <= count then local cfg = project.getconfig(prj, configs[i][1], configs[i][2]) if not seen[cfg] then seen[cfg] = true return cfg else i = i + 1 end end end end function project.findClosestMatch(prj, buildcfg, platform) buildcfg = project.mapconfig(prj, buildcfg)[1] platform = project.mapconfig(prj, platform)[1] if not table.contains(prj.configurations, buildcfg) then buildcfg = prj.configurations[1] end if not table.contains(prj.platforms, platform) then platform = prj.platforms[1] end return project.getconfig(prj, buildcfg, platform) end function project.getconfig(prj, buildcfg, platform) if not buildcfg then return prj end local pairing = project.mapconfig(prj, buildcfg, platform) buildcfg = pairing[1] platform = pairing[2] local key = (buildcfg or "*") .. (platform or "") return prj.configs[key] end function project.getdependencies(prj, mode) if not prj.dependencies then prj.dependencies = {} end local m = mode or 'all' local result = prj.dependencies[m] if result then return result end local function add_to_project_list(cfg, depproj, result) local dep = p.workspace.findproject(cfg.workspace, depproj) if dep and not table.contains(result, dep) then table.insert(result, dep) end end local linkOnly = m == 'linkOnly' local depsOnly = m == 'dependOnly' result = {} for cfg in project.eachconfig(prj) do if not depsOnly then for _, link in ipairs(cfg.links) do if link ~= prj.name then add_to_project_list(cfg, link, result) end end end if not linkOnly then for _, depproj in ipairs(cfg.dependson) do add_to_project_list(cfg, depproj, result) end end end prj.dependencies[m] = result return result end function project.getfirstconfig(prj) local iter = project.eachconfig(prj) local first = iter() return first end function project.getrelative(prj, filename) if type(filename) == "table" then local result = {} for i, name in ipairs(filename) do result[i] = project.getrelative(prj, name) end return result else if filename then local result = filename if path.hasdeferredjoin(result) then result = path.resolvedeferredjoin(result) end return path.getrelative(prj.location, result) end end end function project.getsourcetree(prj, sorter) if prj._.sourcetree then return prj._.sourcetree end local tr = tree.new(prj.name) table.foreachi(prj._.files, function(fcfg) if fcfg.generated then return; end local flags if fcfg.vpath ~= fcfg.relpath then flags = { trim = false } end local parent = tree.add(tr, path.getdirectory(fcfg.vpath), flags) local node = tree.insert(parent, tree.new(path.getname(fcfg.vpath))) setmetatable(node, { __index = fcfg }) end) table.foreachi(prj._.files, function(fcfg) if not fcfg.generated then return; end local parent = tree.add(tr, path.getdirectory(fcfg.dependsOn.vpath)) local node = tree.insert(parent, tree.new(path.getname(fcfg.vpath))) setmetatable(node, { __index = fcfg }) end) tree.trimroot(tr) tree.sort(tr, sorter) prj._.sourcetree = tr return tr end function project.getvpath(prj, abspath) local vpath = abspath local fname = path.getname(abspath) local max = abspath:len() - fname:len() for _, vpaths in ipairs(prj.vpaths) do for replacement, patterns in pairs(vpaths) do for _, pattern in ipairs(patterns) do local i = abspath:find(path.wildcards(pattern)) if i == 1 then i = pattern:find("*", 1, true) or (pattern:len() + 1) local leaf if i < max then leaf = abspath:sub(i) else leaf = fname end if leaf:startswith("/") then leaf = leaf:sub(2) end local stem = "" if replacement:len() > 0 then stem, stars = replacement:gsub("%*", "") if stars == 0 then leaf = path.getname(leaf) end else leaf = path.getname(leaf) end vpath = path.join(stem, leaf) return vpath end end end end return vpath end function project.hasConfig(prj, func) for cfg in project.eachconfig(prj) do if func(cfg) then return true end end end function project.hasfile(prj, filename) return (prj._.files[filename] ~= nil) end function project.isdotnet(prj) return p.languages.iscsharp(prj.language) or p.languages.isfsharp(prj.language) end function project.iscsharp(prj) return p.languages.iscsharp(prj.language) end function project.isfsharp(prj) return p.languages.isfsharp(prj.language) end function project.isc(prj) return p.languages.isc(prj.language) end function project.iscpp(prj) return p.languages.iscpp(prj.language) end function project.isnative(prj) return project.isc(prj) or project.iscpp(prj) end function project.mapconfig(prj, buildcfg, platform) local pairing = { buildcfg, platform } local testpattern = function(pattern, pairing, i) local j = 1 while i <= #pairing and j <= #pattern do local wd = path.wildcards(pattern[j]) if pairing[i]:match(wd) ~= pairing[i] then return false end i = i + 1 j = j + 1 end return true end local maps = prj.configmap or {} for mi = 1, #maps do for pattern, replacements in pairs(maps[mi]) do if type(pattern) ~= "table" then pattern = { pattern } end for i = 1, #pairing do if testpattern(pattern, pairing, i) then if #pattern == 1 and #replacements == 1 then pairing[i] = replacements[1] else pairing = { replacements[1], replacements[2] } end end end end end return pairing end function project.systemversion(prj) if prj.systemversion ~= nil then local values = string.explode(prj.systemversion, ":", true) return values[1], values[2] end end local p = premake p.group = p.api.container("group", p.workspace) local group = p.group group.placeholder = true function group.new(name) return p.container.new(group, name) end local p = premake p.workspace = p.api.container("workspace", p.global) local workspace = p.workspace p.solution = workspace workspace.alias = "solution" p.alias(_G, "workspace", "solution") p.alias(_G, "externalworkspace", "externalsolution") function workspace.new(name) local wks = p.container.new(workspace, name) return wks end function workspace.eachconfig(self) self = p.oven.bakeWorkspace(self) local i = 0 return function() i = i + 1 if i > #self.configs then return nil else return self.configs[i] end end end function workspace.eachproject(self) local i = 0 return function () i = i + 1 if i <= #self.projects then return p.workspace.getproject(self, i) end end end function workspace.findproject(self, name) name = name:lower() for _, prj in ipairs(self.projects) do if name == prj.name:lower() then return prj end end return nil end function workspace.grouptree(self) if self.grouptree then return self.grouptree end local tr = p.tree.new() for prj in workspace.eachproject(self) do local prjpath = path.join(prj.group, prj.name) local node = p.tree.add(tr, prjpath) node.project = prj end p.tree.traverse(tr, { onbranch = function(node) node.uuid = os.uuid("group:" .. node.path) end }) p.tree.sort(tr, function(a,b) return a.name < b.name end) self.grouptree = tr return tr end function workspace.getproject(self, idx) self = p.oven.bakeWorkspace(self) return self.projects[idx] end function workspace.hasProject(self, func) return p.container.hasChild(self, p.project, func) end function workspace.getrelative(self, filename) if type(filename) == "table" then local result = {} for i, name in ipairs(filename) do if name and #name > 0 then table.insert(result, workspace.getrelative(self, name)) end end return result else if filename then local result = filename if path.hasdeferredjoin(result) then result = path.resolvedeferredjoin(result) end return path.getrelative(self.location, result) end end end local p = premake p.global = p.api.container("global") local global = p.global function global.new(name) return p.container.new(p.global, name) end function global.bake(self) p.container.bakeChildren(self) end function global.eachRule() local root = p.api.rootContainer() return p.container.eachChild(root, p.rule) end function global.eachWorkspace() local root = p.api.rootContainer() return p.container.eachChild(root, p.workspace) end p.alias(global, "eachWorkspace", "eachSolution") function global.getRule(key) local root = p.api.rootContainer() return root.rules[key] end function global.getRuleForFile(fname, rules) for rule in global.eachRule() do if not rules or table.contains(rules, rule.name) then if path.hasextension(fname, rule.fileextension) then return rule end end end end function global.getWorkspace(key) local root = p.api.rootContainer() return root.workspaces[key] end p.alias(global, "getWorkspace", "getSolution") local p = premake p.api = {} local api = p.api local configset = p.configset api.scope = {} function api.container(containerName, parentContainer, extraScopes) local class, err = p.container.newClass(containerName, parentContainer, extraScopes) if not class then error(err, 2) end _G[containerName] = function(name) local c = api._setContainer(class, name) if api._isIncludingExternal then c.external = true end return c end _G["external" .. containerName] = function(name) local c = _G[containerName](name) c.external = true return c end p.alias(_G, "external" .. containerName, "external" .. containerName:capitalized()) return class end function includeexternal(fname) local fullPath = p.findProjectScript(fname) local wasIncludingExternal = api._isIncludingExternal api._isIncludingExternal = true fname = fullPath or fname dofile(fname) api._isIncludingExternal = wasIncludingExternal end p.alias(_G, "includeexternal", "includeExternal") function api.rootContainer() return api.scope.global end function api._setContainer(class, name) local instance if name == "*" then return api._setContainer(class.parent) end if not name then instance = api.scope[class.name] if not instance then error("no " .. class.name .. " in scope", 3) end end local parent if not instance and class.parent then parent = api.scope[class.parent.name] if not parent then error("no " .. class.parent.name .. " in scope", 3) end instance = p.container.getChild(parent, class, name) end if instance then configset.addFilter(instance, {}, os.getcwd()) end if not instance then instance = class.new(name, parent) if parent then p.container.addChild(parent, instance) end end api._clearContainerChildren(class) if not class.placeholder then api.scope.current = instance end while instance do api.scope[instance.class.name] = instance if instance.class.alias then api.scope[instance.class.alias] = instance end instance = instance.parent end return api.scope.current end function api._clearContainerChildren(class) for childClass in p.container.eachChildClass(class) do api.scope[childClass.name] = nil if childClass.alias then api.scope[childClass.alias] = nil end api._clearContainerChildren(childClass) end end function api.register(field) local name = field.name if not name then error("missing name", 2) end if rawget(_G, name) then error("name '" .. name .. "' in use", 2) end field, err = p.field.new(field) if not field then error(err) end field.paths = p.field.property(field, "paths") if type(field.allowed) == "table" then for i, item in ipairs(field.allowed) do field.allowed[item:lower()] = item end end if type(field.aliases) == "table" then local keys = table.keys(field.aliases) for i, key in ipairs(keys) do field.aliases[key:lower()] = field.aliases[key] end end _G[name] = function(value) return api.storeField(field, value) end if p.field.removes(field) then _G["remove" .. name] = function(value) return api.remove(field, value) end end return field end function api.unregister(field) if type(field) == "string" then field = p.field.get(field) end p.field.unregister(field) _G[field.name] = nil _G["remove" .. field.name] = nil end function api.alias(original, alias) p.alias(_G, original, alias) if _G["remove" .. original] then p.alias(_G, "remove" .. original, "remove" .. alias) end end function api.addAllowed(fieldName, value) local field = p.field.get(fieldName) if not field then error("No such field: " .. fieldName, 2) end if type(value) == "table" then for i, item in ipairs(value) do api.addAllowed(fieldName, item) end else field.allowed = field.allowed or {} if type(field.allowed) == "function" then field.allowed = { field.allowed } end if field.allowed[value:lower()] == nil then table.insert(field.allowed, value) field.allowed[value:lower()] = value end end end function api.addAliases(fieldName, value) local field = p.field.get(fieldName) if not field then error("No such field: " .. fieldName, 2) end field.aliases = field.aliases or {} for k, v in pairs(value) do field.aliases[k] = v field.aliases[k:lower()] = v end end function api.deprecateField(name, message, handler) p.fields[name].deprecated = { handler = handler, message = message } end function api.deprecateValue(name, value, message, addHandler, removeHandler) if type(value) == "table" then for _, v in pairs(value) do api.deprecateValue(name, v, message, addHandler, removeHandler) end else local field = p.fields[name] field.deprecated = field.deprecated or {} field.deprecated[value] = { add = addHandler, remove = removeHandler, message = message } end end function api.deprecations(value) value = value:lower() if not table.contains({ "on", "off", "error"}, value) then error("Invalid value: " .. value, 2) end api._deprecations = value:lower() end api._deprecations = "on" function api.target(field) if p.container.classCanContain(api.scope.current.class, field.scope) then return api.scope.current end return nil end function api.storeField(field, value) if value == nil then return end if field.deprecated and type(field.deprecated.handler) == "function" then field.deprecated.handler(value) if field.deprecated.message and api._deprecations ~= "off" then local caller = filelineinfo(2) local key = field.name .. "_" .. caller p.warnOnce(key, "the field %s has been deprecated and will be removed.\n %s\n @%s\n", field.name, field.deprecated.message, caller) if api._deprecations == "error" then error("deprecation errors enabled", 3) end end end local target = api.target(field) if not target then local err = string.format("unable to set %s in %s scope, should be %s", field.name, api.scope.current.class.name, table.concat(field.scopes, ", ")) error(err, 3) end local status, err = configset.store(target, field, value) if err then error(err, 3) end end function api.remove(field, value) if value == nil then return end local target = api.target(field) if not target then local err = string.format("unable to remove %s from %s scope, should be %s", field.name, api.scope.current.class.name, table.concat(field.scopes, ", ")) error(err, 3) end local hasDeprecatedValues = (type(field.deprecated) == "table") local removes = {} local function check(value) if field.deprecated[value] then local handler = field.deprecated[value] if handler.remove then handler.remove(value) end if handler.message and api._deprecations ~= "off" then local caller = filelineinfo(8) local key = field.name .. "_" .. value .. "_" .. caller p.warnOnce(key, "the %s value %s has been deprecated and will be removed.\n %s\n @%s\n", field.name, value, handler.message, caller) if api._deprecations == "error" then error { msg="deprecation errors enabled" } end end end end local function recurse(value) if type(value) == "table" then table.foreachi(value, recurse) elseif hasDeprecatedValues and value:contains("*") then local current = configset.fetch(target, field, { matcher = function(cset, block, filter) local current = cset.current return criteria.matches(current._criteria, block._criteria.terms or {}) or criteria.matches(block._criteria, current._criteria.terms or {}) end }) local mask = path.wildcards(value) for _, item in ipairs(current) do if item:match(mask) == item then recurse(item) end end else local value, err, additional = api.checkValue(field, value) if err then error { msg=err } end if field.deprecated then check(value) end table.insert(removes, value) if additional then table.insert(removes, additional) end end end local ok, err = pcall(function () recurse(value) end) if not ok then if type(err) == "table" then err = err.msg end error(err, 3) end configset.remove(target, field, removes) end function api.checkValue(field, value, kind) if not field.allowed then return value end local canonical, result local lowerValue = value:lower() if field.aliases then canonical = field.aliases[lowerValue] end if not canonical then if type(field.allowed) == "function" then canonical = field.allowed(value, kind or "string") else canonical = field.allowed[lowerValue] end end if not canonical then for _, allow in ipairs(field.allowed) do if type(allow) == "function" then canonical = allow(value, kind or "string") end if canonical then break end end end if not canonical then return nil, "invalid value '" .. value .. "' for " .. field.name end if field.deprecated and field.deprecated[canonical] then local handler = field.deprecated[canonical] handler.add(canonical) if handler.message and api._deprecations ~= "off" then local caller = filelineinfo(9) local key = field.name .. "_" .. value .. "_" .. caller p.warnOnce(key, "the %s value %s has been deprecated and will be removed.\n %s\n @%s\n", field.name, canonical, handler.message, caller) if api._deprecations == "error" then return nil, "deprecation errors enabled" end end end return canonical end local numBuiltInGlobalBlocks function api.reset() if numBuiltInGlobalBlocks == nil then numBuiltInGlobalBlocks = #api.scope.global.blocks end for containerClass in p.container.eachChildClass(p.global) do api.scope.global[containerClass.pluralName] = {} end api.scope.current = api.scope.global local currentGlobalBlockCount = #api.scope.global.blocks for i = currentGlobalBlockCount, numBuiltInGlobalBlocks, -1 do table.remove(api.scope.global.blocks, i) end configset.addFilter(api.scope.current, {}, os.getcwd()) end premake.field.kind("array", { store = function(field, current, value, processor) if type(value) ~= "table" then value = { value } end for i, item in ipairs(value) do value[i] = processor(field, nil, value[i]) end return value end, compare = function(field, a, b, processor) if a == nil or b == nil or #a ~= #b then return false end for i = 1, #a do if not processor(field, a[i], b[i]) then return false end end return true end }) premake.field.kind("boolean", { store = function(field, current, value, processor) local mapping = { ["false"] = false, ["no"] = false, ["off"] = false, ["on"] = true, ["true"] = true, ["yes"] = true, } if type(value) == "string" then value = mapping[value:lower()] if value == nil then error { msg="expected boolean; got " .. value } end return value end if type(value) == "boolean" then return value end if type(value) == "number" then return (value ~= 0) end return (value ~= nil) end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("directory", { paths = true, store = function(field, current, value, processor) return path.getabsolute(value) end, remove = function(field, current, value, processor) return path.getabsolute(value) end, compare = function(field, a, b, processor) return (a == b) end, translate = function(field, current, _, processor) if current:find("*") then return os.matchdirs(current) end return { current } end }) premake.field.kind("file", { paths = true, store = function(field, current, value, processor) return path.getabsolute(value) end, remove = function(field, current, value, processor) return path.getabsolute(value) end, compare = function(field, a, b, processor) return (a == b) end, translate = function(field, current, _, processor) if current:find("*") then return os.matchfiles(current) end return { current } end }) premake.field.kind("function", { store = function(field, current, value, processor) local t = type(value) if t ~= "function" then error { msg="expected function; got " .. t } end return value end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("integer", { store = function(field, current, value, processor) local t = type(value) if t ~= "number" then error { msg="expected number; got " .. t } end if math.floor(value) ~= value then error { msg="expected integer; got " .. tostring(value) } end return value end, compare = function(field, a, b, processor) return (a == b) end }) local function storeKeyed(field, current, value, processor) current = current or {} for k, v in pairs(value) do if processor then v = processor(field, current[k], v) end current[k] = v end return current end local function mergeKeyed(field, current, value, processor) value = value or {} for k, v in pairs(value) do current[k] = v end return current end premake.field.kind("keyed", { store = storeKeyed, merge = mergeKeyed, compare = function(field, a, b, processor) if a == nil or b == nil then return false end for k in pairs(a) do if not processor(field, a[k], b[k]) then return false end end return true end, translate = function(field, current, _, processor) if not processor then return { current } end for k, v in pairs(current) do current[k] = processor(field, v, nil)[1] end return { current } end }) local function storeListItem(current, item, allowDuplicates) if not allowDuplicates and current[item] then table.remove(current, table.indexof(current, item)) end table.insert(current, item) current[item] = item end local function storeList(field, current, value, processor) if type(value) == "table" then if #value > 0 then for i = 1, #value do current = storeList(field, current, value[i], processor) end return current end if table.isempty(value) then return current end end current = current or {} if processor then value = processor(field, nil, value) end if type(value) == "table" then if #value > 0 then for i = 1, #value do storeListItem(current, value[i], field.allowDuplicates) end elseif not table.isempty(value) then storeListItem(current, value, field.allowDuplicates) end elseif value then storeListItem(current, value, field.allowDuplicates) end return current end local function mergeList(field, current, value, processor) value = value or {} for i = 1, #value do storeListItem(current, value[i], field.allowDuplicates) end return current end premake.field.kind("list", { store = storeList, remove = storeList, merge = mergeList, compare = function(field, a, b, processor) if a == nil or b == nil or #a ~= #b then return false end for i = 1, #a do if not processor(field, a[i], b[i]) then return false end end return true end, translate = function(field, current, _, processor) if not processor then return { current } end local ret = {} for _, value in ipairs(current) do for _, processed in ipairs(processor(field, value, nil)) do table.insert(ret, processed) end end return { ret } end }) premake.field.kind("mixed", { paths = true, store = function(field, current, value, processor) if type(value) == "string" and value:find('/', nil, true) then if string.sub(value, 1, 2) ~= "%{" then value = path.getabsolute(value) end end return value end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("number", { store = function(field, current, value, processor) local t = type(value) if t ~= "number" then error { msg="expected number; got " .. t } end return value end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("path", { paths = true, store = function(field, current, value, processor) return path.deferredjoin(os.getcwd(), value) end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("string", { store = function(field, current, value, processor) if type(value) == "table" then error { msg="expected string; got table" } end if value ~= nil then local err value, err = api.checkValue(field, value) if err then error { msg=err } end end return value end, compare = function(field, a, b, processor) return (a == b) end }) premake.field.kind("table", { store = function(field, current, value, processor) if type(value) ~= "table" then value = { value } end return value end, compare = function(field, a, b, processor) return true end }) function configuration(terms) premake.warnOnce("configuration", "`configuration` has been deprecated; use `filter` instead (https://premake.github.io/docs/Filters/)") if terms then if (type(terms) == "table" and #terms == 1 and terms[1] == "*") or (terms == "*") then terms = nil end configset.addblock(api.scope.current, {terms}, os.getcwd()) end return api.scope.current end function filter(terms) if terms then if (type(terms) == "table" and #terms == 1 and terms[1] == "*") or (terms == "*") then terms = nil end local ok, err = configset.addFilter(api.scope.current, {terms}, os.getcwd()) if not ok then error(err, 2) end end end function newaction(a) p.action.add(a) end function newoption(opt) p.option.add(opt) end local p = premake p.action = {} local action = p.action _ACTION = nil _ARGS = {} for i, arg in ipairs(_ARGV) do if not arg:startswith("/") and not arg:startswith("--") then if not _ACTION then _ACTION = arg else table.insert(_ARGS, arg) _ARGS[arg] = arg end end end action._list = {} function action.add(act) local missing for _, field in ipairs({"description", "trigger"}) do if not act[field] then missing = field end end if missing then local name = act.trigger or "" error(string.format('action "%s" needs a %s', name, missing), 3) end if act.os ~= nil then p.warnOnce(act.trigger, "action '" .. act.trigger .. "' sets 'os' field, which is deprecated, use 'targetos' instead.") act.targetos = act.os act.os = nil end action._list[act.trigger] = act end function action.initialize(name) local a = action._list[name] if (a.onInitialize) then a.onInitialize() end end function action.call(name) local a = action._list[name] if a.onStart then a.onStart() end for wks in p.global.eachWorkspace() do local onWorkspace = a.onWorkspace or a.onSolution or a.onsolution if onWorkspace and not wks.external then onWorkspace(wks) end for prj in p.workspace.eachproject(wks) do local onProject = a.onProject or a.onproject if onProject and not prj.external then onProject(prj) end end end for rule in p.global.eachRule() do local onRule = a.onRule or a.onrule if onRule and not rule.external then onRule(rule) end end if a.execute then a.execute() end if a.onEnd then a.onEnd() end end function action.current() return action.get(_ACTION) end function action.get(name) return action._list[name] end function action.each() local keys = { } for _, act in pairs(action._list) do table.insert(keys, act.trigger) end table.sort(keys) local i = 0 return function() i = i + 1 return action._list[keys[i]] end end function action.isConfigurable(self) if not self then self = action.current() or {} end if self.onWorkspace or self.onSolution or self.onsolution then return true end if self.onProject or self.onproject then return true end return false end function action.set(name) _ACTION = name local act = action.get(name) if act then _TARGET_OS = act.targetos or _TARGET_OS end if act and act.module then require(act.module) end end function action.supports(feature) if not feature then return true end local self = action.current() if not self then return false end if not self.valid_languages and not self.valid_kinds then return true end if self.valid_languages and table.contains(self.valid_languages, feature) then return true end if self.valid_kinds and table.contains(self.valid_kinds, feature) then return true end return false end function p.action.supportsconfig(action, cfg) if not action then return false end if action.supportsconfig then return action.supportsconfig(cfg) end return true end local p = premake p.option = {} local m = p.option local _OPTIONS_metatable = { __index = function(tbl, key) if type(key) == "string" then key = key:lower() end return rawget(tbl, key) end, __newindex = function(tbl, key, value) if type(key) == "string" then key = key:lower() end rawset(tbl, key, value) end } _OPTIONS = {} setmetatable(_OPTIONS, _OPTIONS_metatable) for i, arg in ipairs(_ARGV) do local key, value local i = arg:find("=", 1, true) if i then key = arg:sub(1, i - 1) value = arg:sub(i + 1) else key = arg value = "" end if key:startswith("/") then _OPTIONS[key:sub(2)] = value elseif key:startswith("--") then _OPTIONS[key:sub(3)] = value end end m.list = {} function m.add(opt) local missing for _, field in ipairs({ "description", "trigger" }) do if (not opt[field]) then missing = field end end if (missing) then error("option needs a " .. missing, 3) end p.option.list[opt.trigger:lower()] = opt if opt.default and not _OPTIONS[opt.trigger] then _OPTIONS[opt.trigger] = opt.default end end function m.get(name) return p.option.list[name] end function m.each() local keys = { } for _, option in pairs(p.option.list) do table.insert(keys, option.trigger) end table.sort(keys) local i = 0 return function() i = i + 1 return p.option.list[keys[i]] end end function m.validate(values) for key, value in pairs(values) do local opt = p.option.get(key) if (not opt) then return false, "invalid option '" .. key .. "'" end if (opt.value and value == "") then return false, "no value specified for option '" .. key .. "'" end if opt.allowed then local found = false for _, match in ipairs(opt.allowed) do if match[1] == value then found = true break end end if not found then return false, string.format("invalid value '%s' for option '%s'", value, key) end end end return true end local p = premake p.container = {} local container = p.container container.classes = {} function container.newClass(name, parent, extraScopes) local class = p.configset.new(parent) class.name = name class.pluralName = name:plural() class.containedClasses = {} class.extraScopes = extraScopes if parent then table.insert(parent.containedClasses, class) end container.classes[name] = class return class end function container.new(class, name) local self = p.configset.new() setmetatable(self, p.configset.metatable(self)) self.class = class self.name = name self.filename = name self.script = _SCRIPT self.basedir = os.getcwd() self.external = false for childClass in container.eachChildClass(class) do self[childClass.pluralName] = {} end return self end function container.addChild(self, child) local children = self[child.class.pluralName] table.insert(children, child) children[child.name] = child child.parent = self child[self.class.name] = self if self.class.alias then child[self.class.alias] = self end end function container.bake(self) if self._isBaked then return self end self._isBaked = true local ctx = p.context.new(self) for key, value in pairs(self) do ctx[key] = value end local parent = self.parent if parent then ctx[parent.class.name] = parent end for class in container.eachChildClass(self.class) do for child in container.eachChild(self, class) do child.parent = ctx child[self.class.name] = ctx end end if type(self.class.bake) == "function" then self.class.bake(ctx) end return ctx end function container.bakeChildren(self) for class in container.eachChildClass(self.class) do local children = self[class.pluralName] for i = 1, #children do local ctx = container.bake(children[i]) children[i] = ctx children[ctx.name] = ctx end end end function container.classCanContain(class, scope) if type(scope) == "table" then for i = 1, #scope do if container.classCanContain(class, scope[i]) then return true end end return false end for child in container.eachChildClass(class) do if (container.classCanContain(child, scope)) then return true end end if class.name == scope or class.alias == scope then return true end if class.extraScopes and table.contains(class.extraScopes, scope) then return true end return false end function container.classIsA(class, scope) while class do if class.name == scope or class.alias == scope then return true end class = class.parent end return false end function container.eachChildClass(class) local children = class.containedClasses local i = 0 return function () i = i + 1 if i <= #children then return children[i] end end end function container.eachChild(self, class) local children = self[class.pluralName] local i = 0 return function () i = i + 1 if i <= #children then return children[i] end end end function container.getChild(self, class, name) local children = self[class.pluralName] return children[name] end function container.getClass(name) return container.classes[name] end function container.hasChild(self, class, func) for child in container.eachChild(self, class) do if func(child) then return true end end end function container.validate(self) if type(self.class.validate) == "function" then self.class.validate(self) end end function container.validateChildren(self) for class in container.eachChildClass(self.class) do local children = self[class.pluralName] for i = 1, #children do container.validate(children[i]) end end end local p = premake p.context = {} local context = p.context local configset = p.configset function context.new(cfgset, environ) local ctx = {} ctx._cfgset = cfgset ctx.environ = environ or {} ctx.terms = {} ctx._basedir = os.getcwd() setmetatable(ctx, context.__mt) return ctx end function context.extent(baseContext, newEnvVars) local ctx = {} ctx._ctx = baseContext ctx.environ = newEnvVars or baseContext.environ ctx.terms = {} ctx._basedir = baseContext._basedir setmetatable(ctx, context.__mt_uncached) return ctx end function context.addFilter(ctx, key, value) if type(value) == "table" then for i = 1, #value do value[i] = tostring(value[i]):lower() end elseif value ~= nil then value = tostring(value):lower() end ctx.terms[key:lower()] = value end function context.copyFilters(ctx, src) ctx.terms = {} for k,v in pairs(src.terms) do ctx.terms[k] = v end end function context.mergeFilters(ctx, src) for k, v in pairs(src.terms) do if k == "tags" then ctx.terms[k] = table.join(ctx.terms[k], v) else ctx.terms[k] = v end end end function context.basedir(ctx, basedir) ctx._basedir = basedir or ctx._basedir return ctx._basedir end function context.compile(ctx) ctx._cfgset = configset.compile(ctx._cfgset, ctx.terms) end function context.empty(ctx) return configset.empty(ctx._cfgset) end function context.fetchvalue(ctx, key, onlylocal) if not onlylocal then local value = rawget(ctx, key) if value ~= nil then return value end end local field = p.field.get(key) if not field then return nil end local value = configset.fetch(ctx._cfgset, field, ctx.terms, ctx, onlylocal and ctx._cfgset) if value then rawset(ctx, key, value) end return value end context.__mt = { __index = context.fetchvalue } context.__mt_uncached = { __index = function(ctx, key) local field = p.field.get(key) if not field then return nil end local parent = rawget(ctx, '_ctx') return configset.fetch(parent._cfgset, field, ctx.terms, ctx, nil) end } local p = premake p.configset = {} local configset = p.configset local criteria = p.criteria function configset.new(parent) local cset = {} cset.parent = parent cset.blocks = {} cset.current = nil cset.compiled = false return cset end function configset.fetch(cset, field, filter, ctx, origin) filter = filter or {} ctx = ctx or {} if p.field.merges(field) then return configset._fetchMerged(cset, field, filter, ctx, origin) else return configset._fetchDirect(cset, field, filter, ctx, origin) end end function configset._dofilter(cset, block, filter) if not filter.matcher then return (cset.compiled or criteria.matches(block._criteria, filter)) else return filter.matcher(cset, block, filter) end end function configset._fetchDirect(cset, field, filter, ctx, origin) if origin and origin ~= cset and not origin.compiled then return configset._fetchDirect(origin, field, filter, ctx, origin) end local abspath = filter.files local basedir local key = field.name local blocks = cset.blocks local n = #blocks for i = n, 1, -1 do local block = blocks[i] if not origin or block._origin == origin then local value = block[key] if value ~= nil and abspath and not cset.compiled and block._basedir and block._basedir ~= basedir then basedir = block._basedir filter.files = path.getrelative(basedir, abspath) end if value ~= nil and configset._dofilter(cset, block, filter) then if type(value) == "table" then value = table.deepcopy(value) end if field.tokens and ctx.environ then value = p.detoken.expand(value, ctx.environ, field, ctx._basedir) end return value end end end filter.files = abspath if cset.parent then return configset._fetchDirect(cset.parent, field, filter, ctx, origin) end end function configset._fetchMerged(cset, field, filter, ctx, origin) if origin and origin ~= cset and not origin.compiled then return configset._fetchMerged(origin, field, filter, ctx, origin) end local result = {} local function remove(patterns) for _, pattern in ipairs(patterns) do if field.tokens and ctx.environ then pattern = p.detoken.expand(pattern, ctx.environ, field, ctx._basedir) end pattern = path.wildcards(pattern):lower() local j = 1 while j <= #result do local value = result[j]:lower() if value:match(pattern) == value then result[result[j]] = nil table.remove(result, j) else j = j + 1 end end end end if cset.parent then result = configset._fetchMerged(cset.parent, field, filter, ctx, origin) end local abspath = filter.files local basedir local key = field.name local blocks = cset.blocks local n = #blocks for i = 1, n do local block = blocks[i] if not origin or block._origin == origin then if abspath and block._basedir and block._basedir ~= basedir and not cset.compiled then basedir = block._basedir filter.files = path.getrelative(basedir, abspath) end if configset._dofilter(cset, block, filter) then if block._removes and block._removes[key] then remove(block._removes[key]) end local value = block[key] if type(value) == "table" then value = table.deepcopy(value) end if value then if field.tokens and ctx.environ then value = p.detoken.expand(value, ctx.environ, field, ctx._basedir) end if field and p.field.translates(field) then value = p.field.translate(field, value) end result = p.field.merge(field, result, value) end end end end filter.files = abspath return result end function configset.metatable(cset) return { __newindex = function(tbl, key, value) local f = p.field.get(key) if f then local status, err = configset.store(cset, f, value) if err then error(err, 2) end else rawset(tbl, key, value) return value end end, __index = function(tbl, key) local f = p.field.get(key) if f then return configset.fetch(cset, f) else return nil end end } end function configset.addblock(cset, terms, basedir) configset.addFilter(cset, terms, basedir, true) return cset.current end function configset.addFilter(cset, terms, basedir, unprefixed) local crit, err = criteria.new(terms, unprefixed) if not crit then return nil, err end local block = {} block._criteria = crit block._origin = cset if basedir then block._basedir = basedir:lower() end table.insert(cset.blocks, block) cset.current = block return true end function configset.getFilter(cset) return { _criteria = cset.current._criteria, _basedir = cset.current._basedir } end function configset.setFilter(cset, filter) local block = {} block._criteria = filter._criteria block._basedir = filter._basedir block._origin = cset table.insert(cset.blocks, block) cset.current = block; end function configset.store(cset, field, value) if not cset.current then configset.addblock(cset, {}) end local key = field.name local current = cset.current local status, result = pcall(function () current[key] = p.field.store(field, current[key], value) end) if not status then if type(result) == "table" then result = result.msg end return nil, result end return true end function configset.remove(cset, field, values) local block = {} block._basedir = cset.current._basedir block._criteria = cset.current._criteria block._origin = cset table.insert(cset.blocks, block) cset.current = block values = p.field.remove(field, {}, values) current = cset.current current._removes = {} current._removes[field.name] = values end function configset.empty(cset) return (#cset.blocks == 0) end function configset.compile(cset, filter) local result if cset.parent then result = configset.compile(cset.parent, filter) else result = configset.new() end local blocks = cset.blocks local n = #blocks local abspath = filter.files local basedir for i = 1, n do local block = blocks[i] if block._origin == cset then block._origin = result end if abspath and block._basedir and block._basedir ~= basedir then basedir = block._basedir filter.files = path.getrelative(basedir, abspath) end if criteria.matches(block._criteria, filter) then table.insert(result.blocks, block) end end filter.files = abspath result.compiled = true return result end local p = premake p.detoken = {} local detoken = p.detoken function detoken.expand(value, environ, field, basedir) function expandtoken(token, e, f) local varMap = {} if f.pathVars or e.overridePathVars then local action = p.action.current() if action then varMap = action.pathVars or {} end end local envMap = e.pathVars or {} setmetatable(e, {__index = _G}) local isAbs = false local err local result local success local dontMakeRelative = token:startswith('!') if dontMakeRelative then token = token:sub(2, -1) end local mapped = envMap[token] or varMap[token] if mapped then err = nil result = mapped if type(result) == "function" then success, result = pcall(result, e) if not success then return nil, result end end if (type(result) == "table") then isAbs = result.absolute result = result.token else isAbs = path.isabsolute(result) end else local func func, err = load("return " .. token, nil, 't', e) if not func then return nil, "load error: " .. err end success, result = pcall(func) if not success then err = result result = nil else err = nil result = result or "" end if result ~= nil then result = tostring(result) if path.hasdeferredjoin(result) then result = path.resolvedeferredjoin(result) end isAbs = path.isabsolute(result) if isAbs and not f.paths and basedir and not dontMakeRelative then result = path.getrelative(basedir, result) end end end if result ~= nil and isAbs and f.paths then result = "\0" .. result end return result, err end function expandvalue(value, e, f) if type(value) ~= "string" then return value end local count repeat value, count = value:gsub("%%{(.-)}", function(token) local result, err = expandtoken(token:gsub("\\", "\\\\"), e, f) if err then error(err .. " in token: " .. token, 0) end if not result then error("Token returned nil, it may not exist: " .. token, 0) end return result end) until count == 0 if f.paths then local i, j repeat i, j = value:find("\0") if i then value = value:sub(i + 1) end until not i end return value end local expand_cache = {} function recurse(value, e, f) if type(value) == "table" then local res_table = {} for k, v in pairs(value) do if tonumber(k) ~= nil then res_table[k] = recurse(v, e, f) else local nk = recurse(k, e, f) res_table[nk] = recurse(v, e, f) end end return res_table else local res = expand_cache[value] if res == nil then if type(value) == "string" and path.hasdeferredjoin(value) then value = path.resolvedeferredjoin(value) end res = expandvalue(value, e, f) expand_cache[value] = res end return res end end return recurse(value, environ, field or {}) end local p = premake p.criteria = criteria -- criteria namespace is defined in C host local criteria = p.criteria criteria._validPrefixes = { _action = true, action = true, architecture = true, configurations = true, files = true, kind = true, language = true, _options = true, options = true, platforms = true, sharedlibtype = true, system = true, toolset = true, tags = true, host = true, } function criteria.flatten(terms) local result = {} local function flatten(terms) for key, value in pairs(terms) do if type(key) == "number" then if type(value) == "table" then flatten(value) elseif value then table.insert(result, value) end elseif type(key) == "string" then local word = key .. ":" if type(value) == "table" then local values = table.flatten(value) word = word .. table.concat(values, " or ") else word = word .. value end table.insert(result, word) else error("Unknown key type in terms.") end end end flatten(terms) return result end function criteria.new(terms, unprefixed) terms = criteria.flatten(terms) local patterns = {} for i, term in ipairs(terms) do term = term:lower() local pattern = {} local prefix = iif(unprefixed, nil, "configurations") local words = term:explode(" or ") for _, word in ipairs(words) do word, prefix = criteria._word(word, prefix) if prefix and not criteria._validPrefixes[prefix] then return nil, string.format("Invalid field prefix '%s'", prefix) end if prefix then local fld = p.field.get(prefix) if fld and fld.aliases then word[1] = fld.aliases[word[1]] or word[1] end end table.insert(pattern, word) end table.insert(patterns, pattern) end local crit = {} crit.patterns = patterns crit.data = criteria._compile(patterns) crit.terms = terms return crit end function criteria._word(word, prefix) local wildcard local assertion = true while (true) do if word:startswith("not ") then assertion = not assertion word = word:sub(5) else local i = word:find(":", 1, true) if prefix and i then prefix = word:sub(1, i - 1) word = word:sub(i + 1) else wildcard = (word:find("*", 1, true) ~= nil) if wildcard then word = path.wildcards(word) end break end end end return { word, prefix, assertion, wildcard }, prefix end function criteria.allowPrefix(prefix) criteria._validPrefixes[prefix:lower()] = true end local p = premake p.field = {} local field = p.field field._list = {} field._loweredList = {} field._sortedList = nil field._kinds = {} premake.fields = field._list field._accessors = {} function field.new(f) if f.kind:startswith("key-") then f.kind = f.kind:sub(5) f.keyed = true end if f.kind:endswith("-list") then f.kind = f.kind:sub(1, -6) f.list = true end local kind = f.kind if kind == "object" or kind == "array" then kind = "table" end if f.list then kind = "list:" .. kind end if f.keyed then kind = "keyed:" .. kind end f._kind = kind if type(f.scope) == "table" then f.scopes = f.scope else f.scopes = { f.scope } end if not field.accessor(f, "store") then return nil, "invalid field kind '" .. f._kind .. "'" end field._list[f.name] = f field._loweredList[f.name:lower()] = f field._sortedList = nil return f end function field.unregister(f) field._list[f.name] = nil field._loweredList[f.name:lower()] = nil field._sortedList = nil end function field.each() local index return function () index = next(field._list, index) return field._list[index] end end function field.eachOrdered() if not field._sortedList then local keys = table.keys(field._list) table.sort(keys) field._sortedList = {} for i = 1, #keys do field._sortedList[i] = field._list[keys[i]] end end local i = 0 return function () i = i + 1 return field._sortedList[i] end end function field.kind(tag, settings) if settings then field._kinds[tag] = settings end return field._kinds[tag] end function field.accessor(f, method) field._accessors[method] = field._accessors[method] or {} local cache = field._accessors[method] local function accessorForKind(kind) if kind == "" then return nil end if cache[kind] then return cache[kind] end local thisKind = kind:match('(.-):') or kind local nextKind = kind:sub(#thisKind + 2) local functions = field._kinds[thisKind] if not functions then return nil, "Invalid field kind '" .. thisKind .. "'" end local processor = functions[method] if not processor then return nil end local nextAccessor = accessorForKind(nextKind) accessor = function(f, current, value) return processor(f, current, value, nextAccessor) end cache[kind] = accessor return accessor end return accessorForKind(f._kind) end function field.compare(f, a, b) local processor = field.accessor(f, "compare") if processor then return processor(f, a, b) else return (a == b) end end function field.get(name) return field._list[name] or field._loweredList[name:lower()] end function field.merge(f, current, value) local processor = field.accessor(f, "merge") if processor then return processor(f, current, value) else return value end end function field.merges(f) return (field.accessor(f, "merge") ~= nil) end function field.property(f, tag) local kinds = string.explode(f._kind, ":", true) for i, kind in ipairs(kinds) do local value = field._kinds[kind][tag] if value ~= nil then return value end end end function field.override(fieldName, accessorName, func) local kind = field.kind(fieldName) p.override(kind, accessorName, func) field._accessors = {} end function field.remove(f, current, value) local processor = field.accessor(f, "remove") if processor then return processor(f, current, value) else return value end end function field.removes(f) return (field.accessor(f, "merge") ~= nil and field.accessor(f, "remove") ~= nil) end function field.store(f, current, value) local processor = field.accessor(f, "store") if processor then return processor(f, current, value) else return value end end function field.translate(f, value) local processor = field.accessor(f, "translate") if processor then return processor(f, value, nil)[1] else return value end end function field.translates(f) return (field.accessor(f, "translate") ~= nil) end term.black = 0 term.blue = 1 term.green = 2 term.cyan = 3 term.red = 4 term.purple = 5 term.brown = 6 term.lightGray = 7 term.gray = 8 term.lightBlue = 9 term.lightGreen = 10 term.lightCyan = 11 term.lightRed = 12 term.magenta = 13 term.yellow = 14 term.white = 15 term.warningColor = term.magenta term.errorColor = term.lightRed term.infoColor = term.lightCyan term._colorStack = {} function term.pushColor(color) local old = term.getTextColor() table.insert(term._colorStack, old) term.setTextColor(color) end function term.popColor() if #term._colorStack > 0 then local color = table.remove(term._colorStack) term.setTextColor(color) end end local p = premake p.languages = {} function p.languages.isc(value) return value == "C"; end function p.languages.iscpp(value) return value == "C++"; end function p.languages.iscsharp(value) return value == "C#"; end function p.languages.isfsharp(value) return value == "F#"; end json = {} local implementation = dofile('json.lua') local err json.implementation = implementation function implementation.assert(condition, message) if not condition then err = message end assert(condition, message) end function json.encode(value) err = nil local success, result = pcall(implementation.encode, implementation, value) if not success then return nil, err end return result end function json.encode_pretty(value) err = nil local success, result = pcall(implementation.encode_pretty, implementation, value) if not success then return nil, err end return result end function json.decode(value) err = nil local success, result = pcall(implementation.decode, implementation, value) if not success then return nil, err end return result end local VERSION = '20161109.21' -- version history at end of file local AUTHOR_NOTE = "-[ JSON.lua package by Jeffrey Friedl (http://regex.info/blog/lua/json) version 20161109.21 ]-" local OBJDEF = { VERSION = VERSION, AUTHOR_NOTE = AUTHOR_NOTE, } local default_pretty_indent = " " local default_pretty_options = { pretty = true, align_keys = false, indent = default_pretty_indent } local isArray = { __tostring = function() return "JSON array" end } isArray.__index = isArray local isObject = { __tostring = function() return "JSON object" end } isObject.__index = isObject function OBJDEF:newArray(tbl) return setmetatable(tbl or {}, isArray) end function OBJDEF:newObject(tbl) return setmetatable(tbl or {}, isObject) end local function getnum(op) return type(op) == 'number' and op or op.N end local isNumber = { __tostring = function(T) return T.S end, __unm = function(op) return getnum(op) end, __concat = function(op1, op2) return tostring(op1) .. tostring(op2) end, __add = function(op1, op2) return getnum(op1) + getnum(op2) end, __sub = function(op1, op2) return getnum(op1) - getnum(op2) end, __mul = function(op1, op2) return getnum(op1) * getnum(op2) end, __div = function(op1, op2) return getnum(op1) / getnum(op2) end, __mod = function(op1, op2) return getnum(op1) % getnum(op2) end, __pow = function(op1, op2) return getnum(op1) ^ getnum(op2) end, __lt = function(op1, op2) return getnum(op1) < getnum(op2) end, __eq = function(op1, op2) return getnum(op1) == getnum(op2) end, __le = function(op1, op2) return getnum(op1) <= getnum(op2) end, } isNumber.__index = isNumber function OBJDEF:asNumber(item) if getmetatable(item) == isNumber then -- it's already a JSON number object. return item elseif type(item) == 'table' and type(item.S) == 'string' and type(item.N) == 'number' then -- it's a number-object table that lost its metatable, so give it one return setmetatable(item, isNumber) else -- the normal situation... given a number or a string representation of a number.... local holder = { S = tostring(item), -- S is the representation of the number as a string, which remains precise N = tonumber(item), -- N is the number as a Lua number. } return setmetatable(holder, isNumber) end end function OBJDEF:forceString(item) if type(item) == 'table' and type(item.S) == 'string' then return item.S else return tostring(item) end end function OBJDEF:forceNumber(item) if type(item) == 'table' and type(item.N) == 'number' then return item.N else return tonumber(item) end end local function unicode_codepoint_as_utf8(codepoint) -- -- codepoint is a number -- if codepoint <= 127 then return string.char(codepoint) elseif codepoint <= 2047 then -- -- 110yyyxx 10xxxxxx <-- useful notation from http://en.wikipedia.org/wiki/Utf8 -- local highpart = math.floor(codepoint / 0x40) local lowpart = codepoint - (0x40 * highpart) return string.char(0xC0 + highpart, 0x80 + lowpart) elseif codepoint <= 65535 then -- -- 1110yyyy 10yyyyxx 10xxxxxx -- local highpart = math.floor(codepoint / 0x1000) local remainder = codepoint - 0x1000 * highpart local midpart = math.floor(remainder / 0x40) local lowpart = remainder - 0x40 * midpart highpart = 0xE0 + highpart midpart = 0x80 + midpart lowpart = 0x80 + lowpart -- -- Check for an invalid character (thanks Andy R. at Adobe). -- See table 3.7, page 93, in http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf#G28070 -- if ( highpart == 0xE0 and midpart < 0xA0 ) or ( highpart == 0xED and midpart > 0x9F ) or ( highpart == 0xF0 and midpart < 0x90 ) or ( highpart == 0xF4 and midpart > 0x8F ) then return "?" else return string.char(highpart, midpart, lowpart) end else -- -- 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx -- local highpart = math.floor(codepoint / 0x40000) local remainder = codepoint - 0x40000 * highpart local midA = math.floor(remainder / 0x1000) remainder = remainder - 0x1000 * midA local midB = math.floor(remainder / 0x40) local lowpart = remainder - 0x40 * midB return string.char(0xF0 + highpart, 0x80 + midA, 0x80 + midB, 0x80 + lowpart) end end function OBJDEF:onDecodeError(message, text, location, etc) if text then if location then message = string.format("%s at byte %d of: %s", message, location, text) else message = string.format("%s: %s", message, text) end end if etc ~= nil then message = message .. " (" .. OBJDEF:encode(etc) .. ")" end if self.assert then self.assert(false, message) else assert(false, message) end end function OBJDEF:onTrailingGarbage(json_text, location, parsed_value, etc) return self:onDecodeError("trailing garbage", json_text, location, etc) end OBJDEF.onDecodeOfNilError = OBJDEF.onDecodeError OBJDEF.onDecodeOfHTMLError = OBJDEF.onDecodeError function OBJDEF:onEncodeError(message, etc) if etc ~= nil then message = message .. " (" .. OBJDEF:encode(etc) .. ")" end if self.assert then self.assert(false, message) else assert(false, message) end end local function grok_number(self, text, start, options) -- -- Grab the integer part -- local integer_part = text:match('^-?[1-9]%d*', start) or text:match("^-?0", start) if not integer_part then self:onDecodeError("expected number", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local i = start + integer_part:len() -- -- Grab an optional decimal part -- local decimal_part = text:match('^%.%d+', i) or "" i = i + decimal_part:len() -- -- Grab an optional exponential part -- local exponent_part = text:match('^[eE][-+]?%d+', i) or "" i = i + exponent_part:len() local full_number_text = integer_part .. decimal_part .. exponent_part if options.decodeNumbersAsObjects then return OBJDEF:asNumber(full_number_text), i end -- -- If we're told to stringify under certain conditions, so do. -- We punt a bit when there's an exponent by just stringifying no matter what. -- I suppose we should really look to see whether the exponent is actually big enough one -- way or the other to trip stringification, but I'll be lazy about it until someone asks. -- if (options.decodeIntegerStringificationLength and (integer_part:len() >= options.decodeIntegerStringificationLength or exponent_part:len() > 0)) or (options.decodeDecimalStringificationLength and (decimal_part:len() >= options.decodeDecimalStringificationLength or exponent_part:len() > 0)) then return full_number_text, i -- this returns the exact string representation seen in the original JSON end local as_number = tonumber(full_number_text) if not as_number then self:onDecodeError("bad number", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end return as_number, i end local function grok_string(self, text, start, options) if text:sub(start,start) ~= '"' then self:onDecodeError("expected string's opening quote", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local i = start + 1 -- +1 to bypass the initial quote local text_len = text:len() local VALUE = "" while i <= text_len do local c = text:sub(i,i) if c == '"' then return VALUE, i + 1 end if c ~= '\\' then VALUE = VALUE .. c i = i + 1 elseif text:match('^\\b', i) then VALUE = VALUE .. "\b" i = i + 2 elseif text:match('^\\f', i) then VALUE = VALUE .. "\f" i = i + 2 elseif text:match('^\\n', i) then VALUE = VALUE .. "\n" i = i + 2 elseif text:match('^\\r', i) then VALUE = VALUE .. "\r" i = i + 2 elseif text:match('^\\t', i) then VALUE = VALUE .. "\t" i = i + 2 else local hex = text:match('^\\u([0123456789aAbBcCdDeEfF][0123456789aAbBcCdDeEfF][0123456789aAbBcCdDeEfF][0123456789aAbBcCdDeEfF])', i) if hex then i = i + 6 -- bypass what we just read -- We have a Unicode codepoint. It could be standalone, or if in the proper range and -- followed by another in a specific range, it'll be a two-code surrogate pair. local codepoint = tonumber(hex, 16) if codepoint >= 0xD800 and codepoint <= 0xDBFF then -- it's a hi surrogate... see whether we have a following low local lo_surrogate = text:match('^\\u([dD][cdefCDEF][0123456789aAbBcCdDeEfF][0123456789aAbBcCdDeEfF])', i) if lo_surrogate then i = i + 6 -- bypass the low surrogate we just read codepoint = 0x2400 + (codepoint - 0xD800) * 0x400 + tonumber(lo_surrogate, 16) else -- not a proper low, so we'll just leave the first codepoint as is and spit it out. end end VALUE = VALUE .. unicode_codepoint_as_utf8(codepoint) else -- just pass through what's escaped VALUE = VALUE .. text:match('^\\(.)', i) i = i + 2 end end end self:onDecodeError("unclosed string", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local function skip_whitespace(text, start) local _, match_end = text:find("^[ \n\r\t]+", start) -- [http://www.ietf.org/rfc/rfc4627.txt] Section 2 if match_end then return match_end + 1 else return start end end local grok_one -- assigned later local function grok_object(self, text, start, options) if text:sub(start,start) ~= '{' then self:onDecodeError("expected '{'", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local i = skip_whitespace(text, start + 1) -- +1 to skip the '{' local VALUE = self.strictTypes and self:newObject { } or { } if text:sub(i,i) == '}' then return VALUE, i + 1 end local text_len = text:len() while i <= text_len do local key, new_i = grok_string(self, text, i, options) i = skip_whitespace(text, new_i) if text:sub(i, i) ~= ':' then self:onDecodeError("expected colon", text, i, options.etc) return nil, i -- in case the error method doesn't abort, return something sensible end i = skip_whitespace(text, i + 1) local new_val, new_i = grok_one(self, text, i, options) VALUE[key] = new_val -- -- Expect now either '}' to end things, or a ',' to allow us to continue. -- i = skip_whitespace(text, new_i) local c = text:sub(i,i) if c == '}' then return VALUE, i + 1 end if text:sub(i, i) ~= ',' then self:onDecodeError("expected comma or '}'", text, i, options.etc) return nil, i -- in case the error method doesn't abort, return something sensible end i = skip_whitespace(text, i + 1) end self:onDecodeError("unclosed '{'", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local function grok_array(self, text, start, options) if text:sub(start,start) ~= '[' then self:onDecodeError("expected '['", text, start, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end local i = skip_whitespace(text, start + 1) -- +1 to skip the '[' local VALUE = self.strictTypes and self:newArray { } or { } if text:sub(i,i) == ']' then return VALUE, i + 1 end local VALUE_INDEX = 1 local text_len = text:len() while i <= text_len do local val, new_i = grok_one(self, text, i, options) -- can't table.insert(VALUE, val) here because it's a no-op if val is nil VALUE[VALUE_INDEX] = val VALUE_INDEX = VALUE_INDEX + 1 i = skip_whitespace(text, new_i) -- -- Expect now either ']' to end things, or a ',' to allow us to continue. -- local c = text:sub(i,i) if c == ']' then return VALUE, i + 1 end if text:sub(i, i) ~= ',' then self:onDecodeError("expected comma or ']'", text, i, options.etc) return nil, i -- in case the error method doesn't abort, return something sensible end i = skip_whitespace(text, i + 1) end self:onDecodeError("unclosed '['", text, start, options.etc) return nil, i -- in case the error method doesn't abort, return something sensible end grok_one = function(self, text, start, options) -- Skip any whitespace start = skip_whitespace(text, start) if start > text:len() then self:onDecodeError("unexpected end of string", text, nil, options.etc) return nil, start -- in case the error method doesn't abort, return something sensible end if text:find('^"', start) then return grok_string(self, text, start, options.etc) elseif text:find('^[-0123456789 ]', start) then return grok_number(self, text, start, options) elseif text:find('^%{', start) then return grok_object(self, text, start, options) elseif text:find('^%[', start) then return grok_array(self, text, start, options) elseif text:find('^true', start) then return true, start + 4 elseif text:find('^false', start) then return false, start + 5 elseif text:find('^null', start) then return nil, start + 4 else self:onDecodeError("can't parse JSON", text, start, options.etc) return nil, 1 -- in case the error method doesn't abort, return something sensible end end function OBJDEF:decode(text, etc, options) -- -- If the user didn't pass in a table of decode options, make an empty one. -- if type(options) ~= 'table' then options = {} end -- -- If they passed in an 'etc' argument, stuff it into the options. -- (If not, any 'etc' field in the options they passed in remains to be used) -- if etc ~= nil then options.etc = etc end if type(self) ~= 'table' or self.__index ~= OBJDEF then local error_message = "JSON:decode must be called in method format" OBJDEF:onDecodeError(error_message, nil, nil, options.etc) return nil, error_message -- in case the error method doesn't abort, return something sensible end if text == nil then local error_message = "nil passed to JSON:decode()" self:onDecodeOfNilError(error_message, nil, nil, options.etc) return nil, error_message -- in case the error method doesn't abort, return something sensible elseif type(text) ~= 'string' then local error_message = "expected string argument to JSON:decode()" self:onDecodeError(string.format("%s, got %s", error_message, type(text)), nil, nil, options.etc) return nil, error_message -- in case the error method doesn't abort, return something sensible end if text:match('^%s*$') then -- an empty string is nothing, but not an error return nil end if text:match('^%s*<') then -- Can't be JSON... we'll assume it's HTML local error_message = "HTML passed to JSON:decode()" self:onDecodeOfHTMLError(error_message, text, nil, options.etc) return nil, error_message -- in case the error method doesn't abort, return something sensible end -- -- Ensure that it's not UTF-32 or UTF-16. -- Those are perfectly valid encodings for JSON (as per RFC 4627 section 3), -- but this package can't handle them. -- if text:sub(1,1):byte() == 0 or (text:len() >= 2 and text:sub(2,2):byte() == 0) then local error_message = "JSON package groks only UTF-8, sorry" self:onDecodeError(error_message, text, nil, options.etc) return nil, error_message -- in case the error method doesn't abort, return something sensible end -- -- apply global options -- if options.decodeNumbersAsObjects == nil then options.decodeNumbersAsObjects = self.decodeNumbersAsObjects end if options.decodeIntegerStringificationLength == nil then options.decodeIntegerStringificationLength = self.decodeIntegerStringificationLength end if options.decodeDecimalStringificationLength == nil then options.decodeDecimalStringificationLength = self.decodeDecimalStringificationLength end -- -- Finally, go parse it -- local success, value, next_i = pcall(grok_one, self, text, 1, options) if success then local error_message = nil if next_i ~= #text + 1 then -- something's left over after we parsed the first thing.... whitespace is allowed. next_i = skip_whitespace(text, next_i) -- if we have something left over now, it's trailing garbage if next_i ~= #text + 1 then value, error_message = self:onTrailingGarbage(text, next_i, value, options.etc) end end return value, error_message else -- If JSON:onDecodeError() didn't abort out of the pcall, we'll have received -- the error message here as "value", so pass it along as an assert. local error_message = value if self.assert then self.assert(false, error_message) else assert(false, error_message) end -- ...and if we're still here (because the assert didn't throw an error), -- return a nil and throw the error message on as a second arg return nil, error_message end end local function backslash_replacement_function(c) if c == "\n" then return "\\n" elseif c == "\r" then return "\\r" elseif c == "\t" then return "\\t" elseif c == "\b" then return "\\b" elseif c == "\f" then return "\\f" elseif c == '"' then return '\\"' elseif c == '\\' then return '\\\\' else return string.format("\\u%04x", c:byte()) end end local chars_to_be_escaped_in_JSON_string = '[' .. '"' -- class sub-pattern to match a double quote .. '%\\' -- class sub-pattern to match a backslash .. '%z' -- class sub-pattern to match a null .. '\001' .. '-' .. '\031' -- class sub-pattern to match control characters .. ']' local LINE_SEPARATOR_as_utf8 = unicode_codepoint_as_utf8(0x2028) local PARAGRAPH_SEPARATOR_as_utf8 = unicode_codepoint_as_utf8(0x2029) local function json_string_literal(value, options) local newval = value:gsub(chars_to_be_escaped_in_JSON_string, backslash_replacement_function) if options.stringsAreUtf8 then -- -- This feels really ugly to just look into a string for the sequence of bytes that we know to be a particular utf8 character, -- but utf8 was designed purposefully to make this kind of thing possible. Still, feels dirty. -- I'd rather decode the byte stream into a character stream, but it's not technically needed so -- not technically worth it. -- newval = newval:gsub(LINE_SEPARATOR_as_utf8, '\\u2028'):gsub(PARAGRAPH_SEPARATOR_as_utf8,'\\u2029') end return '"' .. newval .. '"' end local function object_or_array(self, T, etc) -- -- We need to inspect all the keys... if there are any strings, we'll convert to a JSON -- object. If there are only numbers, it's a JSON array. -- -- If we'll be converting to a JSON object, we'll want to sort the keys so that the -- end result is deterministic. -- local string_keys = { } local number_keys = { } local number_keys_must_be_strings = false local maximum_number_key for key in pairs(T) do if type(key) == 'string' then table.insert(string_keys, key) elseif type(key) == 'number' then table.insert(number_keys, key) if key <= 0 or key >= math.huge then number_keys_must_be_strings = true elseif not maximum_number_key or key > maximum_number_key then maximum_number_key = key end else self:onEncodeError("can't encode table with a key of type " .. type(key), etc) end end if #string_keys == 0 and not number_keys_must_be_strings then -- -- An empty table, or a numeric-only array -- if #number_keys > 0 then return nil, maximum_number_key -- an array elseif tostring(T) == "JSON array" then return nil elseif tostring(T) == "JSON object" then return { } else -- have to guess, so we'll pick array, since empty arrays are likely more common than empty objects return nil end end table.sort(string_keys) local map if #number_keys > 0 then -- -- If we're here then we have either mixed string/number keys, or numbers inappropriate for a JSON array -- It's not ideal, but we'll turn the numbers into strings so that we can at least create a JSON object. -- if self.noKeyConversion then self:onEncodeError("a table with both numeric and string keys could be an object or array; aborting", etc) end -- -- Have to make a shallow copy of the source table so we can remap the numeric keys to be strings -- map = { } for key, val in pairs(T) do map[key] = val end table.sort(number_keys) -- -- Throw numeric keys in there as strings -- for _, number_key in ipairs(number_keys) do local string_key = tostring(number_key) if map[string_key] == nil then table.insert(string_keys , string_key) map[string_key] = T[number_key] else self:onEncodeError("conflict converting table with mixed-type keys into a JSON object: key " .. number_key .. " exists both as a string and a number.", etc) end end end return string_keys, nil, map end local encode_value -- must predeclare because it calls itself function encode_value(self, value, parents, etc, options, indent, for_key) -- -- keys in a JSON object can never be null, so we don't even consider options.null when converting a key value -- if value == nil or (not for_key and options and options.null and value == options.null) then return 'null' elseif type(value) == 'string' then return json_string_literal(value, options) elseif type(value) == 'number' then if value ~= value then -- -- NaN (Not a Number). -- JSON has no NaN, so we have to fudge the best we can. This should really be a package option. -- return "null" elseif value >= math.huge then -- -- Positive infinity. JSON has no INF, so we have to fudge the best we can. This should -- really be a package option. Note: at least with some implementations, positive infinity -- is both ">= math.huge" and "<= -math.huge", which makes no sense but that's how it is. -- Negative infinity is properly "<= -math.huge". So, we must be sure to check the ">=" -- case first. -- return "1e+9999" elseif value <= -math.huge then -- -- Negative infinity. -- JSON has no INF, so we have to fudge the best we can. This should really be a package option. -- return "-1e+9999" else return tostring(value) end elseif type(value) == 'boolean' then return tostring(value) elseif type(value) ~= 'table' then self:onEncodeError("can't convert " .. type(value) .. " to JSON", etc) elseif getmetatable(value) == isNumber then return tostring(value) else -- -- A table to be converted to either a JSON object or array. -- local T = value if type(options) ~= 'table' then options = {} end if type(indent) ~= 'string' then indent = "" end if parents[T] then self:onEncodeError("table " .. tostring(T) .. " is a child of itself", etc) else parents[T] = true end local result_value local object_keys, maximum_number_key, map = object_or_array(self, T, etc) if maximum_number_key then -- -- An array... -- local ITEMS = { } for i = 1, maximum_number_key do table.insert(ITEMS, encode_value(self, T[i], parents, etc, options, indent)) end if options.pretty then result_value = "[ " .. table.concat(ITEMS, ", ") .. " ]" else result_value = "[" .. table.concat(ITEMS, ",") .. "]" end elseif object_keys then -- -- An object -- local TT = map or T if options.pretty then local KEYS = { } local max_key_length = 0 for _, key in ipairs(object_keys) do local encoded = encode_value(self, tostring(key), parents, etc, options, indent, true) if options.align_keys then max_key_length = math.max(max_key_length, #encoded) end table.insert(KEYS, encoded) end local key_indent = indent .. tostring(options.indent or "") local subtable_indent = key_indent .. string.rep(" ", max_key_length) .. (options.align_keys and " " or "") local FORMAT = "%s%" .. string.format("%d", max_key_length) .. "s: %s" local COMBINED_PARTS = { } for i, key in ipairs(object_keys) do local encoded_val = encode_value(self, TT[key], parents, etc, options, subtable_indent) table.insert(COMBINED_PARTS, string.format(FORMAT, key_indent, KEYS[i], encoded_val)) end result_value = "{\n" .. table.concat(COMBINED_PARTS, ",\n") .. "\n" .. indent .. "}" else local PARTS = { } for _, key in ipairs(object_keys) do local encoded_val = encode_value(self, TT[key], parents, etc, options, indent) local encoded_key = encode_value(self, tostring(key), parents, etc, options, indent, true) table.insert(PARTS, string.format("%s:%s", encoded_key, encoded_val)) end result_value = "{" .. table.concat(PARTS, ",") .. "}" end else -- -- An empty array/object... we'll treat it as an array, though it should really be an option -- result_value = "[]" end parents[T] = false return result_value end end local function top_level_encode(self, value, etc, options) local val = encode_value(self, value, {}, etc, options) if val == nil then --PRIVATE("may need to revert to the previous public verison if I can't figure out what the guy wanted") return val else return val end end function OBJDEF:encode(value, etc, options) if type(self) ~= 'table' or self.__index ~= OBJDEF then OBJDEF:onEncodeError("JSON:encode must be called in method format", etc) end -- -- If the user didn't pass in a table of decode options, make an empty one. -- if type(options) ~= 'table' then options = {} end return top_level_encode(self, value, etc, options) end function OBJDEF:encode_pretty(value, etc, options) if type(self) ~= 'table' or self.__index ~= OBJDEF then OBJDEF:onEncodeError("JSON:encode_pretty must be called in method format", etc) end -- -- If the user didn't pass in a table of decode options, use the default pretty ones -- if type(options) ~= 'table' then options = default_pretty_options end return top_level_encode(self, value, etc, options) end function OBJDEF.__tostring() return "JSON encode/decode package" end OBJDEF.__index = OBJDEF function OBJDEF:new(args) local new = { } if args then for key, val in pairs(args) do new[key] = val end end return setmetatable(new, OBJDEF) end return OBJDEF:new() if http == nil then return end function http.reportProgress(total, current) local width = 70 local progress = math.floor(current * width / total) if progress == width then io.write(string.rep(' ', width + 2) .. '\r') else io.write('[' .. string.rep('=', progress) .. string.rep(' ', width - progress) .. ']\r') end end function http.escapeUrlParam(param) local url_encodings = { [' '] = '%%20', ['!'] = '%%21', ['"'] = '%%22', ['#'] = '%%23', ['$'] = '%%24', ['&'] = '%%26', ['\''] = '%%27', ['('] = '%%28', [')'] = '%%29', ['*'] = '%%2A', ['+'] = '%%2B', ['-'] = '%%2D', ['.'] = '%%2E', ['/'] = '%%2F', [':'] = '%%3A', [';'] = '%%3B', ['<'] = '%%3C', ['='] = '%%3D', ['>'] = '%%3E', ['?'] = '%%3F', ['@'] = '%%40', ['['] = '%%5B', ['\\'] = '%%5C', [']'] = '%%5D', ['^'] = '%%5E', ['_'] = '%%5F', ['`'] = '%%60' } param = param:gsub('%%', '%%25') for k,v in pairs(url_encodings) do param = param:gsub('%' .. k, v) end return param endlocal semver = { _VERSION = '1.2.1', _DESCRIPTION = 'semver for Lua', _URL = 'https://github.com/kikito/semver.lua', _LICENSE = [[ MIT LICENSE Copyright (c) 2015 Enrique García Cota Permission is hereby granted, free of charge, to any person obtaining a copy of tother software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and tother permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] } local function checkPositiveInteger(number, name) assert(number >= 0, name .. ' must be a valid positive number') assert(math.floor(number) == number, name .. ' must be an integer') end local function present(value) return value and value ~= '' end local function splitByDot(str) str = str or "" local t, count = {}, 0 str:gsub("([^%.]+)", function(c) count = count + 1 t[count] = c end) return t end local function parsePrereleaseAndBuildWithSign(str) local prereleaseWithSign, buildWithSign = str:match("^(-[^+]+)(+.+)$") if not (prereleaseWithSign and buildWithSign) then prereleaseWithSign = str:match("^(-.+)$") buildWithSign = str:match("^(+.+)$") end assert(prereleaseWithSign or buildWithSign, ("The parameter %q must begin with + or - to denote a prerelease or a build"):format(str)) return prereleaseWithSign, buildWithSign end local function parsePrerelease(prereleaseWithSign) if prereleaseWithSign then local prerelease = prereleaseWithSign:match("^-(%w[%.%w-]*)$") assert(prerelease, ("The prerelease %q is not a slash followed by alphanumerics, dots and slashes"):format(prereleaseWithSign)) return prerelease end end local function parseBuild(buildWithSign) if buildWithSign then local build = buildWithSign:match("^%+(%w[%.%w-]*)$") assert(build, ("The build %q is not a + sign followed by alphanumerics, dots and slashes"):format(buildWithSign)) return build end end local function parsePrereleaseAndBuild(str) if not present(str) then return nil, nil end local prereleaseWithSign, buildWithSign = parsePrereleaseAndBuildWithSign(str) local prerelease = parsePrerelease(prereleaseWithSign) local build = parseBuild(buildWithSign) return prerelease, build end local function parseVersion(str) local sMajor, sMinor, sPatch, sPrereleaseAndBuild = str:match("^(%d+)%.?(%d*)%.?(%d*)(.-)$") assert(type(sMajor) == 'string', ("Could not extract version number(s) from %q"):format(str)) local major, minor, patch = tonumber(sMajor), tonumber(sMinor), tonumber(sPatch) local prerelease, build = parsePrereleaseAndBuild(sPrereleaseAndBuild) return major, minor, patch, prerelease, build end local function compare(a,b) return a == b and 0 or a < b and -1 or 1 end local function compareIds(myId, otherId) if myId == otherId then return 0 elseif not myId then return -1 elseif not otherId then return 1 end local selfNumber, otherNumber = tonumber(myId), tonumber(otherId) if selfNumber and otherNumber then -- numerical comparison return compare(selfNumber, otherNumber) -- numericals are always smaller than alphanums elseif selfNumber then return -1 elseif otherNumber then return 1 else return compare(myId, otherId) -- alphanumerical comparison end end local function smallerIdList(myIds, otherIds) local myLength = #myIds local comparison for i=1, myLength do comparison = compareIds(myIds[i], otherIds[i]) if comparison ~= 0 then return comparison == -1 end -- if comparison == 0, continue loop end return myLength < #otherIds end local function smallerPrerelease(mine, other) if mine == other or not mine then return false elseif not other then return true end return smallerIdList(splitByDot(mine), splitByDot(other)) end local methods = {} function methods:nextMajor() return semver(self.major + 1, 0, 0) end function methods:nextMinor() return semver(self.major, self.minor + 1, 0) end function methods:nextPatch() return semver(self.major, self.minor, self.patch + 1) end local mt = { __index = methods } function mt:__eq(other) return self.major == other.major and self.minor == other.minor and self.patch == other.patch and self.prerelease == other.prerelease -- notice that build is ignored for precedence in semver 2.0.0 end function mt:__lt(other) if self.major ~= other.major then return self.major < other.major end if self.minor ~= other.minor then return self.minor < other.minor end if self.patch ~= other.patch then return self.patch < other.patch end return smallerPrerelease(self.prerelease, other.prerelease) -- notice that build is ignored for precedence in semver 2.0.0 end function mt:__pow(other) if self.major == 0 then return self == other end return self.major == other.major and self.minor <= other.minor end function mt:__tostring() local buffer = { ("%d.%d.%d"):format(self.major, self.minor, self.patch) } if self.prerelease then table.insert(buffer, "-" .. self.prerelease) end if self.build then table.insert(buffer, "+" .. self.build) end return table.concat(buffer) end local function new(major, minor, patch, prerelease, build) assert(major, "At least one parameter is needed") if type(major) == 'string' then major,minor,patch,prerelease,build = parseVersion(major) end patch = patch or 0 minor = minor or 0 checkPositiveInteger(major, "major") checkPositiveInteger(minor, "minor") checkPositiveInteger(patch, "patch") local result = {major=major, minor=minor, patch=patch, prerelease=prerelease, build=build} return setmetatable(result, mt) end setmetatable(semver, { __call = function(_, ...) return new(...) end }) semver._VERSION= semver(semver._VERSION) return semver function dofileopt(fname) if type(fname) == "string" then fname = {fname} end for i = 1, #fname do local found = os.locate(fname[i]) if not found then found = os.locate(fname[i] .. ".lua") end if found then dofile(found) return true end end end io._includedFiles = {} function include(fname) local fullPath = premake.findProjectScript(fname) fname = fullPath or fname if not io._includedFiles[fname] then io._includedFiles[fname] = true return dofile(fname) end end premake.override(_G, "require", function(base, modname, versions) local result, mod = pcall(base,modname) if not result then error(mod, 3) end if mod and versions and not premake.checkVersion(mod._VERSION, versions) then error(string.format("module %s %s does not meet version criteria %s", modname, mod._VERSION or "(none)", versions), 3) end return mod end) local p = premake p.tree = {} local tree = p.tree function tree.new(n) local t = { name = n, children = {} } return t end function tree.add(tr, p, extraFields) if p == "." or p == "/" then return tr end local parentnode = tree.add(tr, path.getdirectory(p), extraFields) local childname = path.getname(p) local childnode = parentnode.children[childname] if not childnode or childnode.path ~= p then childnode = tree.insert(parentnode, tree.new(childname)) childnode.path = p if extraFields then for k,v in pairs(extraFields) do childnode[k] = v end end end return childnode end function tree.insert(parent, child) table.insert(parent.children, child) if child.name then parent.children[child.name] = child end child.parent = parent return child end function tree.getlocalpath(node) if node.parent.path then return node.name elseif node.cfg then return node.cfg.name else return node.path end end function tree.hasbranches(tr) local n = #tr.children if n > 0 then for i = 1, n do if #tr.children[i].children > 0 then return true end end end return false end function tree.isparent(n, child) local p = child.parent while p do if p == n then return true end p = p.parent end return false end function tree.remove(node) local children = node.parent.children for i = 1, #children do if children[i] == node then table.remove(children, i) end end node.children = {} end function tree.sort(tr, fn) if not fn then fn = function(a,b) return a.name < b.name end end tree.traverse(tr, { onnode = function(node) table.sort(node.children, fn) end }, true) end function tree.traverse(t, fn, includeroot, initialdepth) local donode, dochildren donode = function(node, fn, depth) if node.isremoved then return end if fn.onnode then fn.onnode(node, depth) end if #node.children > 0 then if fn.onbranchenter then fn.onbranchenter(node, depth) end if fn.onbranch then fn.onbranch(node, depth) end dochildren(node, fn, depth + 1) if fn.onbranchexit then fn.onbranchexit(node, depth) end else if fn.onleaf then fn.onleaf(node, depth) end end end dochildren = function(parent, fn, depth) local i = 1 while i <= #parent.children do local node = parent.children[i] donode(node, fn, depth) if node == parent.children[i] then i = i + 1 end end end if not initialdepth then initialdepth = 0 end if includeroot then donode(t, fn, initialdepth) else dochildren(t, fn, initialdepth) end end function tree.trimroot(tr) local trimmed while #tr.children == 1 do local node = tr.children[1] if #node.children == 0 or node.trim == false then break end trimmed = true local numChildren = #node.children for i = 1, numChildren do local child = node.children[i] child.parent = node.parent tr.children[i] = child end end local dotdot local count = #tr.children repeat dotdot = false for i = 1, count do local node = tr.children[i] if node.name == ".." and #node.children == 1 then local child = node.children[1] child.parent = node.parent tr.children[i] = child trimmed = true dotdot = true end end until not dotdot if trimmed then tree.traverse(tr, { onnode = function(node) if node.parent.path then node.path = path.join(node.parent.path, node.name) else node.path = node.name end end }, false) end end local p = premake p.tools = {} function p.tools.normalize(identifier) if identifier:startswith("v") then -- TODO: this should be deprecated? identifier = 'msc-' .. identifier end local parts = identifier:explode("-", true, 1) if parts[2] == nil then return parts[1] end if parts[1] == "msc" and tonumber(parts[2]:sub(1,3)) ~= nil then parts[2] = "v" .. parts[2] end if parts[2]:startswith("llvm-vs") then parts[2] = "LLVM-" .. parts[2]:sub(6) end return parts[1] .. '-' .. parts[2] end function p.tools.canonical(identifier) identifier = p.tools.normalize(identifier) local parts = identifier:explode("-", true, 1) return p.tools[parts[1]], parts[2] end premake.override(io, "open", function(base, fname, mode) if mode and (mode:find("w") or mode:find("a")) then local dir = path.getdirectory(fname) ok, err = os.mkdir(dir) if not ok then error(err, 0) end end return base(fname, mode) end) function io.writefile(filename, content) local file = io.open(filename, "w+b") if file then file:write(content) file:close() return true end end function io.readfile(filename) local file = io.open(filename, "rb") if file then local content = file:read("*a") file:close() return content end endpremake.override(os, "execute", function(base, cmd) cmd = os.translateCommands(cmd) return base(cmd) end) function os.executef(cmd, ...) cmd = string.format(cmd, ...) return os.execute(cmd) end local function parse_ld_so_conf(conf_file) local first, last local dirs = { } for line in io.lines(conf_file) do first = line:find("#", 1, true) if first ~= nil then line = line:sub(1, first - 1) end if line ~= "" then first, last = line:find("include%s+") if first ~= nil then local include_glob = line:sub(last + 1) local includes = os.matchfiles(include_glob) for _, v in ipairs(includes) do dirs = table.join(dirs, parse_ld_so_conf(v)) end else table.insert(dirs, line) end end end return dirs end local function get_library_search_path() local path if os.istarget("windows") then path = os.getenv("PATH") or "" elseif os.istarget("haiku") then path = os.getenv("LIBRARY_PATH") or "" else if os.istarget("darwin") then path = os.getenv("DYLD_LIBRARY_PATH") or "" else path = os.getenv("LD_LIBRARY_PATH") or "" for _, prefix in ipairs({"", "/opt"}) do local conf_file = prefix .. "/etc/ld.so.conf" if os.isfile(conf_file) then for _, v in ipairs(parse_ld_so_conf(conf_file)) do if (#path > 0) then path = path .. ":" .. v else path = v end end end end end path = path or "" local archpath = "/lib:/usr/lib:/usr/local/lib" if os.is64bit() and not (os.istarget("darwin")) then archpath = "/lib64:/usr/lib64/:usr/local/lib64" .. ":" .. archpath end if (#path > 0) then path = path .. ":" .. archpath else path = archpath end end return path end function os.findlib(libname, libdirs) local path = get_library_search_path() local formats if os.istarget("windows") then formats = { "%s.dll", "%s" } elseif os.istarget("haiku") then formats = { "lib%s.so", "%s.so" } else if os.istarget("darwin") then formats = { "lib%s.dylib", "%s.dylib" } else formats = { "lib%s.so", "%s.so" } end table.insert(formats, "%s") end local userpath = "" if type(libdirs) == "string" then userpath = libdirs elseif type(libdirs) == "table" then userpath = table.implode(libdirs, "", "", ":") end if (#userpath > 0) then if (#path > 0) then path = userpath .. ":" .. path else path = userpath end end for _, fmt in ipairs(formats) do local name = string.format(fmt, libname) local result = os.pathsearch(name, path) if result then return result end end end function os.findheader(headerpath, headerdirs) local path = get_library_search_path() path = path .. ':' path = path:gsub ('/lib[0-9]*([:/])', '/include%1') path = path:sub (1, #path - 1) local userpath = "" if type(headerdirs) == "string" then userpath = headerdirs elseif type(headerdirs) == "table" then userpath = table.implode(headerdirs, "", "", ":") end if (#userpath > 0) then if (#path > 0) then path = userpath .. ":" .. path else path = userpath end end local result = os.pathsearch (headerpath, path) return result end function os.target() return _OPTIONS.os or _TARGET_OS end function os.get() local caller = filelineinfo(2) premake.warnOnce(caller, "os.get() is deprecated, use 'os.target()' or 'os.host()'.\n @%s\n", caller) return os.target() end _G_metatable = { __index = function(t, k) if (k == '_OS') then premake.warnOnce("_OS+get", "_OS is deprecated, use '_TARGET_OS'.") return rawget(t, "_TARGET_OS") else return rawget(t, k) end end, __newindex = function(t, k, v) if (k == '_OS') then premake.warnOnce("_OS+set", "_OS is deprecated, use '_TARGET_OS'.") rawset(t, "_TARGET_OS", v) else rawset(t, k, v) end end } setmetatable(_G, _G_metatable) function os.istarget(id) local tags = os.getSystemTags(os.target()) return table.contains(tags, id:lower()) end function os.is(id) local caller = filelineinfo(2) premake.warnOnce(caller, "os.is() is deprecated, use 'os.istarget()' or 'os.ishost()'.\n @%s\n", caller) return os.istarget(id) end function os.ishost(id) local tags = os.getSystemTags(os.host()) return table.contains(tags, id:lower()) end premake.override(os, "isdir", function(base, p) p = path.normalize(p) return base(p) end) premake.override(os, "isfile", function(base, p) p = path.normalize(p) return base(p) end) local _is64bit local _64BitHostTypes = { "x86_64", "ia64", "amd64", "ppc64", "powerpc64", "sparc64" } function os.is64bit() if _is64bit ~= nil then return _is64bit end _is64bit = false if (os._is64bit()) then _is64bit = true else local arch if os.ishost("windows") then arch = os.getenv("PROCESSOR_ARCHITECTURE") elseif os.ishost("macosx") then arch = os.outputof("echo $HOSTTYPE") else arch = os.outputof("uname -m") end arch = arch:lower() for _, hosttype in ipairs(_64BitHostTypes) do if arch:find(hosttype) then _is64bit = true end end end return _is64bit end function os.match(mask) mask = path.normalize(mask) local starpos = mask:find("%*") local before = path.getdirectory(starpos and mask:sub(1, starpos - 1) or mask) local slashpos = starpos and mask:find("/", starpos) local after = slashpos and mask:sub(slashpos + 1) local recurse = starpos and mask:sub(starpos + 1, starpos + 1) == '*' and (starpos == 1 or mask:sub(starpos - 1, starpos - 1) == '/') local results = { } if recurse then local submask = mask:sub(1, starpos) .. mask:sub(starpos + 2) results = os.match(submask) local pattern = mask:sub(1, starpos) local m = os.matchstart(pattern) while os.matchnext(m) do if not os.matchisfile(m) then local matchpath = path.join(before, os.matchname(m), mask:sub(starpos)) results = table.join(results, os.match(matchpath)) end end os.matchdone(m) else local pattern = mask:sub(1, slashpos and slashpos - 1) local m = os.matchstart(pattern) while os.matchnext(m) do if not (slashpos and os.matchisfile(m)) then local matchpath = path.join(before, matchpath, os.matchname(m)) if after then results = table.join(results, os.match(path.join(matchpath, after))) else table.insert(results, matchpath) end end end os.matchdone(m) end return results end function os.matchdirs(mask) local results = os.match(mask) for i = #results, 1, -1 do if not os.isdir(results[i]) then table.remove(results, i) end end return results end function os.matchfiles(mask) local results = os.match(mask) for i = #results, 1, -1 do if not os.isfile(results[i]) then table.remove(results, i) end end return results end local builtin_mkdir = os.mkdir function os.mkdir(p) p = path.normalize(p) local dir = iif(p:startswith("/"), "/", "") for part in p:gmatch("[^/]+") do dir = dir .. part if (part ~= "" and not path.isabsolute(part) and not os.isdir(dir)) then local ok, err = builtin_mkdir(dir) if (not ok) then return nil, err end end dir = dir .. "/" end return true end function os.outputof(cmd, streams) cmd = path.normalize(cmd) streams = streams or "both" local redirection if streams == "both" then redirection = " 2>&1" elseif streams == "output" then redirection = " 2>/dev/null" elseif streams == "error" then redirection = " 2>&1 1>/dev/null" else error ('Invalid stream(s) selection. "output", "error", or "both" expected.') end local pipe = io.popen(cmd .. redirection) local result = pipe:read('*a') local success, what, code = pipe:close() if success then if result then result = string.gsub(result, "[\r\n]+$", "") end return result, code, what else return nil, code, what end end local builtin_remove = os.remove function os.remove(f) if type(f) == "string" then local p = os.matchfiles(f) for _, v in pairs(p) do local ok, err, code = builtin_remove(v) if not ok then return ok, err, code end end if #p == 0 then return nil, "Couldn't find any file matching: " .. f, 1 end elseif type(f) == "table" then for _, v in pairs(f) do local ok, err, code = os.remove(v) if not ok then return ok, err, code end end end return true end local builtin_rmdir = os.rmdir function os.rmdir(p) local dirs = os.matchdirs(p .. "/*") for _, dname in ipairs(dirs) do local ok, err = os.rmdir(dname) if not ok then return ok, err end end local files = os.matchfiles(p .. "/*") for _, fname in ipairs(files) do local ok, err = os.remove(fname) if not ok then return ok, err end end return builtin_rmdir(p) end premake.override(os, "stat", function(base, p) p = path.normalize(p) return base(p) end) os.commandTokens = { _ = { chdir = function(v) return "cd " .. path.normalize(v) end, copy = function(v) return "cp -rf " .. path.normalize(v) end, copyfile = function(v) return "cp -f " .. path.normalize(v) end, copydir = function(v) return "cp -rf " .. path.normalize(v) end, delete = function(v) return "rm -f " .. path.normalize(v) end, echo = function(v) return "echo " .. v end, mkdir = function(v) return "mkdir -p " .. path.normalize(v) end, move = function(v) return "mv -f " .. path.normalize(v) end, rmdir = function(v) return "rm -rf " .. path.normalize(v) end, touch = function(v) return "touch " .. path.normalize(v) end, }, windows = { chdir = function(v) return "chdir " .. path.translate(path.normalize(v)) end, copy = function(v) v = path.translate(path.normalize(v)) local src = string.match(v, '^".-"') or string.match(v, '^.- ') or v src = string.match(src, '^.*%S') return "IF EXIST " .. src .. "\\ (xcopy /Q /E /Y /I " .. v .. " > nul) ELSE (xcopy /Q /Y /I " .. v .. " > nul)" end, copyfile = function(v) v = path.translate(path.normalize(v)) return "copy /B /Y " .. v end, copydir = function(v) v = path.translate(path.normalize(v)) return "xcopy /Q /E /Y /I " .. v end, delete = function(v) return "del " .. path.translate(path.normalize(v)) end, echo = function(v) return "echo " .. v end, mkdir = function(v) v = path.translate(path.normalize(v)) return "IF NOT EXIST " .. v .. " (mkdir " .. v .. ")" end, move = function(v) return "move /Y " .. path.translate(path.normalize(v)) end, rmdir = function(v) return "rmdir /S /Q " .. path.translate(path.normalize(v)) end, touch = function(v) v = path.translate(path.normalize(v)) return string.format("type nul >> %s && copy /b %s+,, %s", v, v, v) end, } } function os.translateCommands(cmd, map) map = map or os.target() if type(map) == "string" then map = os.commandTokens[map] or os.commandTokens["_"] end local processOne = function(cmd) local i, j, prev repeat i, j = cmd:find("{.-}") if i then if i == prev then break end local token = cmd:sub(i + 1, j - 1):lower() local args = cmd:sub(j + 2) local func = map[token] or os.commandTokens["_"][token] if func then cmd = cmd:sub(1, i -1) .. func(args) end prev = i end until i == nil return cmd end if type(cmd) == "table" then local result = {} for i = 1, #cmd do result[i] = processOne(cmd[i]) end return result else return processOne(cmd) end end function os.translateCommandAndPath(dir, map) if map == 'windows' then return path.translate(dir) end return dir end function os.translateCommandsAndPaths(cmds, basedir, location, map) local translatedBaseDir = path.getrelative(location, basedir) map = map or os.target() local translateFunction = function(value) local result = path.join(translatedBaseDir, value) result = os.translateCommandAndPath(result, map) if value:endswith('/') or value:endswith('\\') or -- if orginal path ends with a slash then ensure the same value:endswith('/"') or value:endswith('\\"') then result = result .. '/' end return result end local processOne = function(cmd) local replaceFunction = function(value) value = value:sub(3, #value - 1) return '"' .. translateFunction(value) .. '"' end return string.gsub(cmd, "%%%[[^%]\r\n]*%]", replaceFunction) end if type(cmds) == "table" then local result = {} for i = 1, #cmds do result[i] = processOne(cmds[i]) end return os.translateCommands(result, map) else return os.translateCommands(processOne(cmds), map) end end os._uuids = {} local builtin_uuid = os.uuid function os.uuid(name) local id = builtin_uuid(name) if name then if os._uuids[id] and os._uuids[id] ~= name then premake.warnOnce(id, "UUID clash between %s and %s", os._uuids[id], name) end os._uuids[id] = name end return id end os.systemTags = { ["aix"] = { "aix", "posix" }, ["bsd"] = { "bsd", "posix" }, ["haiku"] = { "haiku", "posix" }, ["ios"] = { "ios", "darwin", "posix", "mobile" }, ["linux"] = { "linux", "posix" }, ["macosx"] = { "macosx", "darwin", "posix" }, ["solaris"] = { "solaris", "posix" }, ["windows"] = { "windows", "win32" }, } function os.getSystemTags(name) return os.systemTags[name:lower()] or { name:lower() } end function path.appendExtension(p, ext) if not ext or ext == "" then return p end local endquote if p:endswith('"') then p = p:sub(1, -2) endquote = '"' end if not path.hasextension(p, ext) then p = p .. ext end if endquote then p = p .. endquote end return p end path.appendextension = path.appendExtension function path.getbasename(p) local name = path.getname(p) local i = name:findlast(".", true) if (i) then return name:sub(1, i - 1) else return name end end function path.getdirectory(p) local i = p:findlast("/", true) if (i) then if i > 1 then i = i - 1 end return p:sub(1, i) else return "." end end function path.getdrive(p) local ch1 = p:sub(1,1) local ch2 = p:sub(2,2) if ch2 == ":" then return ch1 end end function path.getextension(p) p = path.getname(p) local i = p:findlast(".", true) if (i) then return p:sub(i) else return "" end end function path.removeextension(p) local i = p:findlast(".", true) if (i) then if i > 1 then i = i - 1 end return p:sub(1, i) else return "" end end function path.getname(p) local i = p:findlast("[/\\]") if (i) then return p:sub(i + 1) else return p end end function path.hasextension(fname, extensions) local fext = path.getextension(fname):lower() if type(extensions) == "table" then for _, extension in pairs(extensions) do if fext == extension then return true end end return false else return (fext == extensions) end end function path.isasmfile(fname) return path.hasextension(fname, { ".s" }) end function path.iscfile(fname) return path.hasextension(fname, { ".c" }) or path.isasmfile(fname)-- is this really right? or path.isobjcfile(fname)-- there is code that depends on this behaviour, which would need to change end function path.iscppfile(fname) return path.hasextension(fname, { ".cc", ".cpp", ".cxx", ".c++" }) or path.isobjcppfile(fname)-- is this really right? or path.iscfile(fname) end function path.isobjcfile(fname) return path.hasextension(fname, { ".m" }) end function path.isobjcppfile(fname) return path.hasextension(fname, { ".mm" }) end function path.iscppheader(fname) return path.hasextension(fname, { ".h", ".hh", ".hpp", ".hxx" }) end function path.isnativefile(fname) return path.iscfile(fname) or path.iscppfile(fname) or path.isasmfile(fname) or path.isobjcfile(fname) or path.isobjcppfile(fname) end function path.isframework(fname) return path.hasextension(fname, ".framework") end function path.islinkable(fname) return path.hasextension(fname, { ".o", ".obj", ".a", ".lib", ".so" }) end function path.isobjectfile(fname) return path.hasextension(fname, { ".o", ".obj" }) end function path.isresourcefile(fname) return path.hasextension(fname, ".rc") end function path.isidlfile(fname) return path.hasextension(fname, ".idl") end function path.ishlslfile(fname) return path.hasextension(fname, ".hlsl") end function path.rebase(p, oldbase, newbase) p = path.getabsolute(path.join(oldbase, p)) p = path.getrelative(newbase, p) return p end function path.replaceextension(p, newext) local ext = path.getextension(p) if not ext then return p end if #newext > 0 and not newext:findlast(".", true) then newext = "."..newext end return p:match("^(.*)"..ext.."$")..newext end function path.getDefaultSeparator() if os.istarget('windows') then return '\\' else return '/' end end function table.arraycopy(object) local result = {} for i, value in ipairs(object) do result[i] = value end return result end function table.contains(t, value) for _,v in pairs(t) do if (v == value) then return true end end return false end function table.shallowcopy(object) local copy = {} for k, v in pairs(object) do copy[k] = v end return copy end function table.deepcopy(object) local seen = {} local function copy(object) if type(object) ~= "table" then return object elseif seen[object] then return seen[object] end local clone = {} seen[object] = clone for key, value in pairs(object) do clone[key] = copy(value) end setmetatable(clone, getmetatable(object)) return clone end return copy(object) end function table.extract(arr, fname) local result = { } for _,v in ipairs(arr) do table.insert(result, v[fname]) end return result end function table.filter(arr, fn) local result = { } table.foreachi(arr, function(val) if fn(val) then table.insert(result, val) end end) return result end function table.flatten(arr) local result = {} local function flatten(arr) local n = #arr for i = 1, n do local v = arr[i] if type(v) == "table" then flatten(v) elseif v then table.insert(result, v) end end end flatten(arr) return result end function table.foreachi(arr, func) if arr then local n = #arr for i = 1, n do local v = arr[i] if v then func(v, i) end end end end function table.fold(list1, list2) local result = {} for _, item1 in ipairs(list1 or {}) do if list2 and #list2 > 0 then for _, item2 in ipairs(list2) do table.insert(result, { item1, item2 }) end else table.insert(result, { item1 }) end end return result end function table.implode(arr, before, after, between) local result = "" for _,v in ipairs(arr) do if (result ~= "" and between) then result = result .. between end result = result .. before .. v .. after end return result end function table.indexof(tbl, obj) for k, v in ipairs(tbl) do if v == obj then return k end end end function table.findKeyByValue(tbl, obj) for k, v in pairs(tbl) do if v == obj then return k end end end function table.insertafter(tbl, after, value) local i = table.indexof(tbl, after) if i then table.insert(tbl, i + 1, value) else table.insert(tbl, value) end end function table.insertflat(tbl, values) if values == nil then return elseif type(values) == "table" then for _, value in ipairs(values) do table.insertflat(tbl, value) end else table.insert(tbl, values) end return tbl end function table.insertkeyed(tbl, pos, value) if value == nil then value = pos pos = #tbl + 1 end if tbl[value] ~= nil then return false end table.insert(tbl, pos, value) tbl[value] = value return true end function table.insertsorted(tbl, value, fn) if value == nil then return else fn = fn or function(a, b) return a < b end local minindex = 1 local maxindex = #tbl + 1 while minindex < maxindex do local index = minindex + ((maxindex - minindex) >> 1) local test = tbl[index] if fn(value, test) then maxindex = index else minindex = index + 1 if not fn(test, value) then break end end end table.insert(tbl, minindex, value) end return tbl end function table.isempty(t) return next(t) == nil end function table.join(...) local result = { } local arg = {...} for _,t in ipairs(arg) do if type(t) == "table" then for _,v in ipairs(t) do table.insert(result, v) end else table.insert(result, t) end end return result end function table.keys(tbl) local keys = {} for k, _ in pairs(tbl) do table.insert(keys, k) end return keys end function table.merge(...) local result = {} local arg = {...} for _,t in ipairs(arg) do if type(t) == "table" then for k,v in pairs(t) do if type(result[k]) == "table" and type(v) == "table" then result[k] = table.merge(result[k], v) else result[k] = v end end else error("invalid value") end end return result end function table.replace(self, value, replacement) for i = 1, #self do if self[i] == value then self[i] = replacement end end end function table.translate(arr, translation) if not translation then return {} end local result = {} for i = 1, #arr do local tvalue if type(translation) == "function" then tvalue = translation(arr[i]) else tvalue = translation[arr[i]] end if (tvalue) then table.insert(result, tvalue) end end return result end function table.tostring(tab, recurse, indent) local res = '' if not indent then indent = 0 end local format_value = function(k, v, i) formatting = string.rep("\t", i) if k then if type(k) == "table" then k = '[table]' end formatting = formatting .. k .. ": " end if not v then return formatting .. '(nil)' elseif type(v) == "table" then if recurse and recurse > 0 then return formatting .. '\n' .. table.tostring(v, recurse-1, i+1) else return formatting .. "" end elseif type(v) == "function" then return formatting .. tostring(v) elseif type(v) == "userdata" then return formatting .. "" elseif type(v) == "boolean" then if v then return formatting .. 'true' else return formatting .. 'false' end else return formatting .. v end end if type(tab) == "table" then local first = true local mt = getmetatable(tab) if mt then res = res .. format_value('__mt', mt, indent) first = false end for k, v in pairs(tab) do if not first then res = res .. '\n' end res = res .. format_value(k, v, indent) first = false end else res = res .. format_value(nil, tab, indent) end return res end function table.unique(tab) local elems = { } local result = { } table.foreachi(tab, function(elem) if not elems[elem] then table.insert(result, elem) elems[elem] = true end end) return result end function table.filterempty(dirs) return table.translate(dirs, function(val) if val and #val > 0 then return val else return nil end end) end function table.equals(a, b) for k, v in pairs(a) do if b[k] ~= v then return false end end for k, v in pairs(b) do if a[k] ~= v then return false end end return true end function spairs(t) local keys = {} for k in pairs(t) do table.insert(keys, k) end table.sort(keys) local i = 0 return function() i = i + 1 if keys[i] then return keys[i], t[keys[i]] end end end function table.intersect(a, b) local result = {} for _, v in ipairs(b) do if table.indexof(a, v) then table.insert(result, v) end end return result end function table.difference(a, b) local result = {} for _, v in ipairs(a) do if not table.indexof(b, v) then table.insert(result, v) end end return result end function string.capitalized(self) return self:gsub("^%l", string.upper) end function string.contains(s, match) return string.find(s, match, 1, true) ~= nil end function string.explode(s, pattern, plain, maxTokens) if (pattern == '') then return false end local pos = 0 local arr = { } for st,sp in function() return s:find(pattern, pos, plain) end do table.insert(arr, s:sub(pos, st-1)) pos = sp + 1 if maxTokens ~= nil and maxTokens > 0 then maxTokens = maxTokens - 1 if maxTokens == 0 then break end end end table.insert(arr, s:sub(pos)) return arr end function string.findlast(s, pattern, plain) local curr = 0 repeat local next = s:find(pattern, curr + 1, plain) if (next) then curr = next end until (not next) if (curr > 0) then return curr end end function string.lines(s) local trailing, n = s:gsub('.-\n', '') if #trailing > 0 then n = n + 1 end return n end function string:plural() if self:endswith("y") then return self:sub(1, #self - 1) .. "ies" else return self .. "s" end end function string.escapepattern(s) return s:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%0") end premake = premake or {} premake._VERSION = _PREMAKE_VERSION package.loaded["premake"] = premake premake.modules = {} premake.extensions = premake.modules local semver = dofile('semver.lua') local p = premake local _warnings = {} local _aliases = {} premake.C = "C" premake.C7 = "c7" premake.CLANG = "clang" premake.CONSOLEAPP = "ConsoleApp" premake.CPP = "C++" premake.CSHARP = "C#" premake.GCC = "gcc" premake.HAIKU = "haiku" premake.ANDROID = "android" premake.IOS = "ios" premake.LINUX = "linux" premake.MACOSX = "macosx" premake.MAKEFILE = "Makefile" premake.MBCS = "MBCS" premake.NONE = "None" premake.DEFAULT = "Default" premake.OBJECTIVEC = "Objective-C" premake.OBJECTIVECPP = "Objective-C++" premake.ON = "On" premake.OFF = "Off" premake.POSIX = "posix" premake.PS3 = "ps3" premake.SHAREDITEMS = "SharedItems" premake.SHAREDLIB = "SharedLib" premake.STATICLIB = "StaticLib" premake.UNICODE = "Unicode" premake.UNIVERSAL = "universal" premake.UTILITY = "Utility" premake.PACKAGING = "Packaging" premake.WINDOWEDAPP = "WindowedApp" premake.WINDOWS = "windows" premake.X86 = "x86" premake.X86_64 = "x86_64" premake.ARM = "ARM" premake.ARM64 = "ARM64" function p.alias(scope, canonical, alias) scope, canonical = p.resolveAlias(scope, canonical) if not scope[canonical] then error("unable to alias '" .. canonical .. "'; no such function", 2) end _aliases[scope] = _aliases[scope] or {} _aliases[scope][alias] = canonical scope[alias] = function(...) return scope[canonical](...) end end function premake.callArray(funcs, ...) if type(funcs) == "function" then funcs = funcs(...) end if funcs then for i = 1, #funcs do funcs[i](...) end end end function premake.callarray(namespace, array, ...) local n = #array for i = 1, n do local fn = namespace[array[i]] if not fn then error(string.format("Unable to find function '%s'", array[i])) end fn(...) end end function p.checkVersion(version, checks) if not version then return false end if not premake.isSemVer(version) then p.warn("'" .. version .. "' is not semver compatible, and cannot be compared against '" .. checks .. "'."); return true end local function eq(a, b) return a == b end local function le(a, b) return a <= b end local function lt(a, b) return a < b end local function ge(a, b) return a >= b end local function gt(a, b) return a > b end local function compat(a, b) return a ^ b end version = semver(version) checks = string.explode(checks, " ", true) for i = 1, #checks do local check = checks[i] local func if check:startswith(">=") then func = ge check = check:sub(3) elseif check:startswith(">") then func = gt check = check:sub(2) elseif check:startswith("<=") then func = le check = check:sub(3) elseif check:startswith("<") then func = lt check = check:sub(2) elseif check:startswith("=") then func = eq check = check:sub(2) elseif check:startswith("^") then func = compat check = check:sub(2) else func = ge end check = semver(check) if not func(version, check) then return false end end return true end function premake.clearWarnings() _warnings = {} end function premake.error(message, ...) error(string.format("** Error: " .. message, ...), 0) end function premake.findProjectScript(fname) return os.locate(fname, fname .. ".lua", path.join(fname, "premake5.lua"), path.join(fname, "premake4.lua")) end function iif(condition, trueValue, falseValue) if condition then return trueValue else return falseValue end end function premake.override(scope, name, repl) scope, name = p.resolveAlias(scope, name) local original = scope[name] if not original then error("unable to override '" .. name .. "'; no such function", 2) end scope[name] = function(...) return repl(original, ...) end if scope == premake.main then table.replace(premake.main.elements, original, scope[name]) end end function p.resolveAlias(scope, name) local aliases = _aliases[scope] if aliases then while aliases[name] do name = aliases[name] end end return scope, name end function premake.warn(message, ...) message = string.format(message, ...) if _OPTIONS.fatal then error(message) else term.pushColor(term.warningColor) io.stderr:write(string.format("** Warning: " .. message .. "\n", ...)) term.popColor(); end end function premake.warnOnce(key, message, ...) if not _warnings[key] then _warnings[key] = true premake.warn(message, ...) end end function premake.info(message, ...) message = string.format(message, ...) term.pushColor(term.infoColor) io.stdout:write(string.format("** Info: " .. message .. "\n", ...)) term.popColor(); end function printf(msg, ...) print(string.format(msg, ...)) end function verbosef(msg, ...) if _OPTIONS.verbose then print(string.format(msg, ...)) end end function filelineinfo(level) local info = debug.getinfo(level+1, "Sl") if info == nil then return nil end if info.what == "C" then return "C function" else local sep = iif(os.ishost('windows'), '\\', '/') return string.format("%s(%d)", path.translate(info.short_src, sep), info.currentline) end end function premake.isSemVer(version) local sMajor, sMinor, sPatch, sPrereleaseAndBuild = version:match("^(%d+)%.?(%d*)%.?(%d*)(.-)$") return (type(sMajor) == 'string') end 0123456789ABCDEF#EgܺvT2CLICOLORCLICOLOR_FORCE%s does not exist Error creating file: %s Failed to create symbolic link [%s->%s] Writing data to %s failed %d bytes were written %d bytes were attempted to be written File may be corrupt ++P+++P+P++P++++++++++++++P++++++++++++++++P+G4GTGlGGGGHDHGp@$LuaVersion: Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio $$LuaAuthors: R. Ierusalimschy, L. H. de Figueiredo, W. Celes $(*no name)globalfieldconstant_ENV (%s '%s')(*temporary)(*vararg)=?=[C]for iteratormetamethod%s:%d: %sattempt to %s a %s value%sconcatenateattempt to compare %s with %s8QXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQPXQXQXQXQXQPPXQXQXQPQ@R@RvQvQRPPvQvQvQvQQY[[[[[[D[[[[[[[[[[[[[[[[[[[Y[[[[[Z[lZ[[[[[XZ ] ]\<\\<\ ]S]S]S]S]S]S]S]S]S]S]S]S]L]E]<\>]7]<\0])]"]<\<\\\<\<\<\]number%s has no integer representationattempt to compare two %s valueserror in error handlingbinaryC stack overflowcannot resume dead coroutineattempt to load a %s chunk (mode is '%s')cannot resume non-suspended coroutineattempt to yield across a C-call boundaryattempt to yield from outside a coroutinePhP8PPPPPPPPPPPPPP8Lua  (w@Xȝ0l|$$$$$$$$$$$$$$$$$$$$$$$$$$$L pHpض@(̷$ ND4$ͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺͺ߹no messageerror in __gc metamethod (%s)_Gpackageiomathutf8%lld%.14gFILE*cannot close standard file_IO_outputstandard %s file is closedfile (closed)file (%p)_IO_inputattempt to use a closed filecannot open file '%s' (%s)too many argumentsrwainvalid modecurpPeEinvalid formatfile is already closed__indexstdoutstderrnofullflushseeksetvbufpopentmpfilewrong number of argumentsinterval is emptyinterval too largefloatpihugemaxintegerminintegerabsacosasinatanceildegexptointegerfloorfmodlogmaxminmodfradrandomseedsqrt9RFߑ?cܥL@>?@$@0CC-DT! @too many %s (limit is %d)memory allocation error: block too bigsearchersmodule '%s' not found:%s_PRELOAD no file '%s';;;;cpath'package.%s' must be a stringluaopen_%s no module '%s' in file '%s'initLUA_PATHLUA_CPATH/ ; ? ! - configloadedpreloadloadlibsearchpath'package.searchers' must be a table no field package.preload['%s']error loading module '%s' from file '%s': %s/usr/local/share/lua/5.3/?.lua;/usr/local/share/lua/5.3/?/init.lua;/usr/local/lib/lua/5.3/?.lua;/usr/local/lib/lua/5.3/?/init.lua;./?.lua;./?/init.lua/usr/local/lib/lua/5.3/?.so;/usr/local/lib/lua/5.3/loadall.so;./?.sospoH(8;$ t  X # .xXnN-0123456789(null)<\%d>invalid option '%%%c' to 'lua_pushfstring'`qATPP\l< or '...' expectedtoo many %s (limit is %d) in %s at line %d jumps into the scope of local '%s'<%s> at line %d not inside a loopno visible label '%s' for at line %dcannot use '...' outside a vararg function%s expected (to close %s at line %d)label '%s' already defined on line %d   not enough memorynot enough memorresulting string too largevalue out of rangeunable to dump given functionstring slice too longtoo many capturesinvalid capture index %%%dunfinished capture0x%llxno value-+ #0\%d\%03d%avalue has no literal formstring contains zerosinvalid format option '%c'integer overflowunsigned overflowstring longer than given sizeformat result too largevariable-length formatdata string too shorttoo many resultspattern too complexinvalid pattern capture^$*+?.([%-bytechardumpfindgmatchlowerrepreverseupperpacksizevKvvvKvKvwKvKvKvKv4wKvKvKvTwKvKvtwKvwKvwwKvvT܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃܃L܃܃܃܃܃܃܃܃T܃L܃L܃܃܃܃܃L܃܃܃L܃܃L̆44444444444444444444444444444܆44444̇|4|4444444|444444444444L4 4<444444 44444`pP,,Ĕ ܕlD|l\\|,H pppppppppppppppppppppppppp00ppppppppȠ@HpHpppppppHpppPpppppppppX@pppp@pppppppp0pxęęd4 ԚԚԚ`8pH invalid format (repeated flags)invalid format (width or precision too long)invalid option '%%%c' to 'format'integral size (%d) out of limits [1,%d]missing size for format option 'c'invalid next option for option 'X'format asks for alignment not power of 2string length does not fit in given sizeinitial position out of string%d-byte integer does not fit into Lua Integermalformed pattern (missing arguments to '%%b')missing '[' after '%%f' in patternmalformed pattern (ends with '%%')malformed pattern (missing ']')string/function/table expectedinvalid use of '%c' in replacement stringinvalid replacement value (a %s)88XT4 table overflowinvalid key to 'next'table index is niltable index is NaNAtoo many results to unpack__newindex__lenposition out of boundstoo many elements to movedestination wrap aroundarray too biginsertsortinvalid value (%s) at index %d in table for 'concat'wrong number of arguments to 'insert'invalid order function for sortingperform bitwise operation onperform arithmetic on__mode__eq__add__sub__mul__mod__pow__div__idiv__band__bor__bxor__shl__shr__unm__bnot__lt__le__concat__callbooleanthreadprotouserdata%s: %s precompiled chunktruncated%s size mismatch inbinary stringnot aversion mismatch incorruptedsize_tInstructionlua_Integerlua_Numberendianness mismatch infloat format mismatch in               position out of rangefinal position out of string%Uinvalid UTF-8 codecharpatternoffsetcodepointinitial position is a continuation byte[--][-]*string length overflowget length ofattempt to divide by zeroattempt to perform 'n%%0''for' limit must be a number'for' step must be a number'__index' chain too long; possible loop'__newindex' chain too long; possible loop'for' initial value must be a number8"H" `" ! " " ,,,,,,,,,,,,,,,,,,,,,,,,,L,L,L,,,,,,,,,>L:$:99D?,<<7\766,64A?=<,98l?$8>4>;l:;;553l3T5$2/|/ /.L10$4D0224-|@index out of rangebase out of range table or string expectedtoo many nested functionscollectnil or table expected__metatablebt=(load)__pairsassertion failed!Lua 5.3stoprestartcountstepsetpausesetstepmulisrunningassertcollectgarbagedofilegetmetatableipairsloadfilerawequalrawlenrawgetrawsetselectsetmetatabletonumberxpcall'tostring' must return a string to 'print'reader function must return a stringcannot change a protected metatable P?constantscontrol structure too longopcodes@~}}h~h~p}p}}D\~~}}}}`TT(( ܖܖ\\xhТТL$;;ȣ0oo tĦDD 8ȥPt44<<`00$tԪ`(($̱̱ܰXX,Ddd\\h`ee\̵|??``dĻ||8PPhhLP8 |((((````````````000000Hfunction or expression needs too many registersthread expectedsuspendednormaldeadtoo many arguments to resumetoo many results to resumecreatestatusyieldisyieldable lua_debug> cont =(debug command)invalid upvalue indexLua function expectedflnStu>%sinvalid optionshort_srclastlinedefinedcurrentlinenupsnparamsisvarargnamewhatistailcallactivelinesfunclevel out of rangeexternal hookreturntail callgetuservaluegethookgetinfogetlocalgetregistrygetupvalueupvaluejoinupvalueidsetuservaluesethooksetlocalsetupvaluetracebacklexical element too long%s near %schunk has too many linescommentEePpmalformed numberinvalid long string delimiterunfinished stringhexadecimal digit expectedmissing '{'UTF-8 value too largemissing '}'invalid escape sequencedecimal escape too largedoelseelseifforgotothenuntilwhile>=<=~=<<>>::unfinished long %s (starting at line %d)<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~# #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %No errorClosing zip archive failedSeek errorRead errorWrite errorCRC errorNo such fileFile already existsCan't open fileZlib errorMalloc failureEntry has been changedPremature EOFInvalid argumentNot a zip archiveInternal errorZip archive inconsistentCan't remove fileEntry has been deletedRead-only archiveNo password providedWrong password providedMulti-disk zip archives not supportedRenaming temporary file failedContaining zip archive was closedFailure to create temporary fileCompression method not supportedEncryption method not supportedhpHБИؗp0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-A1b62S-+ldEw}ZVǖAOIъ OM~-QJ#SpxAaU׮.7׵Y-6]]wll?AԞZ͢$ Faw$eڪ]]FD(koipvk19Z* ,  m86F߲]qTp0ek*1u4yީ%8S1bSWĔՖk1**ykʬHpo].*F6fcTT"eM©g0&):{ϼkZ> 8$,52F*sw1pHkQ6Fzw]cN̵J #pAF]#l8?1(BOgT~yUbL8^#ܖTZ1ObbSyOIV~P-{b-R4٠~^eGnHl/Su6: #jT$+e?yHf'*b#ٽЧ ?&~?$pi;FBzw[keZ~7 Sv8H 3?r$7jnԄYFܨ |OQ;օ U d S - =G\ p&Gw)` /a߫i5&LsZ<#0zMzFM8,9; :R:(q-v,.7/pXqYs3r%w+OQvrtEux܉~OK }!b|tyBxʠz{.lD~m8onlk[wjR1h58ib?mcf+aQ`צedd"fig HINSKyuJcO NZLݘMFGN@E$DD2AsX@*IBCPhTg3U>uW ַVS:R|P~Q9ZS [fYX4])\ZEo^m/_5qϱ٥s\ۼqދ!K7 kfֶԁ-b3Πjp]$^'~*I@VW<âM˟ŏ{ tDCm-@wm.B+(铜>Td"ŀǼϭ~8y$owJ1}05_K^ iϏ은BI#ƈdX܁T̓cQ: rՆ⩗ fn|xK)o%ƭ/3vUuA?)C:|sĵ@͂ Ͳ;bIUeh"׻_HS1޼^Z4eg Wb27_k%8ם(ŊO}do׸Jj3wVcXWP0qB{߭gCru&op-?'Bs ưGz>2[Ȏg; i8P/ _Y=чe:ZO?(3wwXR @hQ+ğH*0"ZOWoI}@mNП5+#*'G| AH=XX?#1jvʬ`p^Y<L~i/{kHwâ hs)aLoD~Pf7VM'(@ﰤ ہg9x+n&;f?/X)T`D1 ߨMߒ.FgTp'Hq/L0UEc?kǃh6ry7]P\@TN%s7@'>$!AxUʰ\3;Y^U~PGl!;b F2ȂpԞ(Q_V:1X: n3 m:@/)IJNv"2x+ٗ Kx.HҥfAj^y9*O]#kM`~b_R 7zFh!1߈Vc0a"j6nS Nr)Υ{t*F8#vufz`rs"WG9^EMvc΍&DAdQy/4Aڱ&S֚E biLQ<6'5P..T&q]w4.6IE? v\[YI>U!lDa>Ԫ΋ϩ7~8A]&nv|oY yKiw\¹9~$ 66nQfq>,o,IӔ 渱{I .H>C-Yn馑gQz tafw0a, Qmpjc5dۈ2yܸو L+~|-dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE\u ϫ=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m=-dlc\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3 L_ |Pq<'A  Wh% of a^)ɘИ"רY=. \;l  tҚG9w&sc d; mj>zjZ '}DhibW]egl6qnkv+zZgJoC`֣ѓ~8ORѻgWg?H6K +گ L6JAz``ègU1nFiyaf%oҠRh6 w G"U&/ź; (+Z\j1,ٞ[ޮd°c&ujm 6?rgWJz{+ 8Ҏվ | !Bhݳڃn&[owGwZjpf; \ebiaklE x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻G0齽ʺŠS0$6TW)#gfz.aJ]h*o+ 7 Z-1A26b+-Sdl}wEVZOAي»IˬO ~M-JQS#xpaA.U7Y-۩6˚w]]llA?Z$㧲F waރ$Ųe]]DFok(vpi91k *Z  ,8mF6]pTqke0*1¶u4%y<8syjHA}X*ݹ1SbSW§ٖծ1k**kypH]oF*.f6TTcMe"¤0g)&Ůޟ:{kZ >8,$5*F21wsHpQkzF6c]wN̵ׄJ# pȄA#]F8l1?(gOB~TUyLbˁ8#^TO1ZbbySIOP~V{-b-4R^~Ge­lHnuS/:6# $Tj?e+y䏼Hf*'˼Ѝb# &??~p$iBF;[wzek~ZS 7H8v ?3$rj7nFY |OQ; U dؓS - \G=&pGw`)/ ai5&sL <:R=Pe6^X7}o5641W0ճ2k3$k%'1&-[#bML"'{ "!$*x(+)`F(> q-q,v.Ț/7pqXsYr3w%vQO+tru՛E~xKO} |b!ytxBz{l.m~Do8nkljw[h1Ri85bcm?a+f`Qeddf"giH IKSNJuyOcN LZMݥFĚGE@ND$A2D@XsBI*CThPU3gWu>V SR:P|Q~Z9[ SYfX]4\)^oEZ_/m5qs<\kg2z &J8 좞V`a/6i\lU,zB\uHƒ=&FW A+Ox]`غ7W>9q߳!7Kk ֩fض-bѠ3pj$]^Ĝ'*~@IWVÕ<ӂMʏş{ Dt͆mC-@mw+B.(>dT"ş~Ϝ8yo$w1J}50K_ ^ϋiBۉI#dXфTQc:r Р fΫnx|)Ko%3/uUv?A)ġ:C|sд@͉ ;IbeU"hH_S1ފZ^ھ4ge ȋbW72%k_ܝ8Ŵ(}OodJֿjw3XcVPW0Bq{gǧurCo&p-?О'sB zGɠ2>[ ;g/P8i_ Y=嗇e:ϏOZw3(?RXw@ Qh+HZ"0*WOIo@}m5N#+'*GA |􏒨HX=#?X1vjʨ`^pYL'!$UxAׯ3\Y;U^GP~b;!lڇF 2p(ԐQV_:X1: 3n :m@I)/NJ2"v+x xKH.jAf^O*9y]#Mk~`bю_޶ Rz7hFм!10cV"ajحn6 SrN){t*8Fv#fu`zrϮsɛW"G9E^vMcD&dA/yQA4S&ֿ EbLil!>aDƋΪ~7A8n&]|vYoᡱ Kyi׫w¡\~9$66 Qnf>q,o,ӹI 散 I{.C>HnY-Qg̰t zfa deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler incorrect header checkunknown compression methodinvalid window sizeunknown header flags setheader crc mismatchinvalid block typeinvalid stored block lengthsinvalid code lengths setinvalid bit length repeatinvalid literal/lengths setinvalid distances setinvalid literal/length codeinvalid distance codeinvalid distance too far backincorrect data checkincorrect length checktoo many length or distance symbolsinvalid code -- missing end-of-blockPx @"90gA@!  @a`10  @`Psp0  ` @ X ;x8 h( H T+t4  d$ D \ S|< l,  L R#r2  b" B Z Cz: j*  J V@3v6 f& F  ^ c~> n. N `Qq1  a! A Y ;y9 i)  I U+u5  e% E ] S}= m-  M S#s3  c# C [ C{; k+  K W@3w7 g' G  _ c? o/ O `Psp0  ` @ X ;x8 h( H T+t4  d$ D \ S|< l,  L R#r2  b" B Z Cz: j*  J V@3v6 f& F  ^ c~> n. N `Qq1  a! A Y ;y9 i)  I U+u5  e% E ] S}= m-  M S#s3  c# C [ C{; k+  K W@3w7 g' G  _ c? o/ O      @@ !1Aa  0@`HN #+3;CScs inflate 1.2.8 Copyright 1995-2013 Mark Adler   0@`  0@`  (08@P`p        L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}   S S  3 3  s s    K K  + +  k k     [ [  ; ;  { {     G G  ' '  g g     W W  7 7  w w     O O  / /  o o     _ _  ? ?     @ `P0pH(hX8xD$dT4tC#c      need dictionarystream endfile errorstream errordata errorinsufficient memorybuffer errorincompatible versioneasy handle already used in multi handleCONNECT_ONLY is required!Failed to get recent socketSRRRRRRRRSCT2T!TRRRRRTRUUDU3U"UURRTRRRRRTRTTTfURTRRRuTdTTTSQQQQQQQQQQQQQQQQSQQRQQQQQQQQRRRQQQRQQQQRQQQQQQQRQQ Q Q Q Q QQ Q Q Q Q Q Q Q QHP QHPAU.UUUTTTTPPPPThTUTPBTPPPPPPPPPPPPP/T%s:%dname lookup timed outPrevious alarm fired off!%255[^:]:%d%255[^:]:%d:%255sAdded %s:%d:%s to DNS cache Hostname in DNS cache was stale, zapped Hostname %s was found in DNS cache remaining timeout of %ld too small to resolve via SIGALRM methodCouldn't parse CURLOPT_RESOLVE removal entry '%s'! Couldn't parse CURLOPT_RESOLVE entry '%s'! Address in '%s' found illegal! getaddrinfo(3) failed for %s:%d %d.%d.%d.%d%lxuuuHpuppAupphqqqhqqqqqqqhqhqqhqhqqhqhqhqhqhqhqhqhqhqhqqqqqqqqqqqqqqqqqqqhqqqhqqqqqqqqqqqqqqqqqqqqqqqqqhqqqqhqqqqqhqqqqqqqqqhqLq4r4r\q4r4r4r4r4r4rpq4rqlq4r|pppppppppp4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4rq4r4rbp4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4r4rq4r4r4r\p4r4r4r4rp4r4r4r4r4r4r4r4rbplr:s~r:s:s:s:s:s:s:s:s:s:s:sp:s:s:s:sr:s:s:s:s:s:s:s:s:s:srrrrr:sr:s:s:s:srr/s:s:sp:s s:s:ss`vxXzy0v`v`vvH0(nil)(nil)0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz.%ld0000000000000000Connection cache is full, closing the oldest one. Connection #%ld to host %s left intact Internal error removing splay node = %d Internal error clearing splay node = %d Pipe broke: handle %p, url = %s In state %d with no easy_conn, bail out! Resolving timed out after %ld millisecondsConnection timed out after %ld millisecondsOperation timed out after %ld milliseconds with %ld out of %ld bytes receivedOperation timed out after %ld milliseconds with %ld bytes receivedHostname '%s' was found in DNS cache Re-used connection seems dead, get a new one H($d$,DtDTRUEFALSEServer %s is blacklisted Conn: %ld (%p) Receive pipe weight: (%ld/%zu), penalized: %s Site %s:%d is pipeline blacklisted %2ld:%02ld:%02ld%3ldd %02ldh%7ldd%5ld%4ldk%2ld.%0ldM%4ldM%2ld.%0ldG%4ldG%4ldT%4ldPCallback aborted** Resuming transfer from byte position %ld %% Total %% Received %% Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed %3ld %s %3ld %s %3ld %s %s %s %s %s %s %s0Hx@@Data[%s %s %s]Send failure: %sRecv failure: %sFailed writing headerHeaderfromWrite callback asked for PAUSE when not supported!Failed writing body (%zu != %zu)* < > { } { } 0S7Operation too slow. Less than %ld bytes/sec transferred the last %ld secondsUnsupported protocolFailed initializationCouldn't resolve proxy nameCouldn't resolve host nameCouldn't connect to serverWeird server replyFTP: unknown PASS replyFTP: unknown PASV replyFTP: couldn't set file typeTransferred a partial fileQuote command returned errorHTTP response code said errorOut of memoryTimeout was reachedFTP: command PORT failedFTP: command REST failedSSL connect errorCouldn't resume downloadCouldn't read a file:// fileLDAP: cannot bindLDAP: search failedMalformed telnet optionSSL crypto engine not foundInvalid LDAP URLMaximum file size exceededRequested SSL level failedLogin deniedTFTP: File Not FoundTFTP: Access ViolationTFTP: Illegal operationTFTP: Unknown transfer IDRemote file already existsTFTP: No such userConversion failedRemote file not foundError in the SSH layerRTSP session errorUnable to parse FTP file listChunk callback failedUnknown errorInvalid multi handleInvalid easy handleInvalid socket argumentUnknown optionUnknown share optionShare currently in useInvalid share handleCURLSHcode unknownUnknown error %dURL using bad/illegal format or missing URLA requested feature, protocol or option was not found built-in in this libcurl due to a build-time decision.Access denied to remote resourceFTP: The server failed to connect to data portFTP: Accepting server connect has timed outFTP: The server did not accept the PRET command.FTP: unknown 227 response formatFTP: can't figure out the host in the PASV responseError in the HTTP2 framing layerFTP: couldn't retrieve (RETR failed) the specified fileFailed writing received data to disk/applicationUpload failed (at start/before it took off)Failed to open/read local data from file/applicationRequested range was not delivered by the serverInternal problem setting up the POSTA required function in the library was not foundOperation was aborted by an application callbackA libcurl function was given a bad argumentFailed binding local connection endNumber of redirects hit maximum amountAn unknown option was passed in to libcurlSSL peer certificate or SSH remote key was not OKServer returned nothing (no headers, no data)Can not set SSL crypto engine as defaultFailed to initialise SSL crypto engineFailed sending data to the peerFailure when receiving data from the peerProblem with the local SSL certificateCouldn't use specified SSL cipherPeer certificate cannot be authenticated with given CA certificatesProblem with the SSL CA cert (path? access rights?)Unrecognized or bad HTTP Content or Transfer-EncodingFailed to shut down the SSL connectionFailed to load CRL file (path? access rights?, format?)Issuer check against peer certificate failedSend failed since rewinding of the data stream failedDisk full or allocation exceededCaller must register CURLOPT_CONV_ callback optionsSocket not ready for send/recvRTSP CSeq mismatch or invalid CSeqThe max connection limit is reachedSSL public key does not match pinned public keySSL server certificate status verification FAILEDStream error in the HTTP/2 framing layerPlease call curl_multi_perform() soonThe easy handle is already added to a multi handleFeature not enabled in this library "!!!!!!!!|!l!\!L! malformedFTP.DICT.LDAP.IMAP.SMTP.POP3.%s://%s%sRebuilt URL to: %s file:, Closing connection %ld deflate, gzipSESSFLUSHSet-Cookie:User-Agent: %s [can pipelinecan multiplexserially%s://%smemory shortageno_proxyNO_PROXYhttp_proxyall_proxyALL_PROXY;type=%c%s://%s%s%s:%hu%s%s%sPort number out of rangeIllegal port numberanonymousftp@example.comConnecting to hostname: %s Connecting to port: %d Pipe is full, skip (%zu) Penalized, skip No connections available. %lu-Couldn't resolve host '%s'Couldn't resolve proxy '%s'Unsupported proxy '%s', libcurl is built without the HTTPS-proxy support.Unsupported proxy scheme for '%s'Please URL encode %% as %%25, see RFC 6874. No valid port number in proxy string (%s) Illegal characters found in URLBad URL, colon is first characterFile drive letters are only accepted in MSDOS/Windows.Invalid file://hostname/, expected localhost or 127.0.0.1 or noneUnwillingly accepted illegal URL using %d slash%s! Protocol "%s" not supported or disabled in libcurlIDN support not present, can't parse Unicode domains Connection %ld seems to be dead! /etc/ssl/certs/ca-certificates.crtCURLOPT_SSL_VERIFYHOST no longer supports 1 as value!unknown proxytype option givenConnected to %s (%s) port %ld (#%ld) [%*45[0123456789abcdefABCDEF:.]%cIPv6 numerical address used in URL without bracketsCouldn't find host %s in the .netrc file; using defaults No valid port number in connect to host string (%s) Found bundle for host %s: %p [%s] Server doesn't support multi-use yet, wait Server doesn't support multi-use (yet) Could pipeline, but not asked to! Could multiplex, but not asked to! Connection #%ld isn't open enough, can't reuse Multiplexed connection found! Found pending candidate for reuse and CURLOPT_PIPEWAIT is set Found connection %ld, with requests in the pipe (%zu) We can reuse, but we want a new connection anyway Re-using existing connection! (#%ld) with %s %s No more connections allowed to host: %d No connections available in cache Unix socket path too long: '%s' zlib/%s7.53.1-DEVLinuxlibcurl/7.53.1-DUnrecognized parameter value passed via CURLOPT_SSLVERSION public key hash: sha256//%s ;sha256//-----BEGIN PUBLIC KEY----- -----END PUBLIC KEY-----%c%c==%c%c%c=%c%c%c%cABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/%s:%ldgetpeername() failed with errno %d: %sgetsockname() failed with errno %d: %sssrem inet_ntop() failed with errno %d: %sssloc inet_ntop() failed with errno %d: %sCould not set TCP_NODELAY: %s sa_addr inet_ntop() failed with errno %d: %sFailed to set SO_KEEPALIVE on fd %d Failed to set TCP_KEEPIDLE on fd %d Failed to set TCP_KEEPINTVL on fd %d Couldn't bind to interface '%s'Local Interface %s is ip %s using address family %i SO_BINDTODEVICE %s failed with errno %d: %s; will do regular bind Name '%s' family %i resolved to '%s' family %i Bind to local port %hu failed, trying next Immediate connect fail for %s: %s After %ldms connect time, move on! connect to %s port %ld failed: %s Failed to connect to %s port %ld: %sTCP_NODELAY set Trying %s... if!host!Couldn't bind to '%s'Local port: %hu bind failed with errno %d: %sConnection time-outConnection failed Error while processing content unencoding: %sError while processing content unencoding: Unknown failure within decompression software.1.2.0.4%1023[^; =] =%4999[^; ]httponlydomainlocalhostmax-ageexpires#HttpOnly_AddedReplacednone%s%s%s %s %s %s %ld %s %s# # Fatal libcurl error skipped cookie with bad tailmatch domain: %s %s cookie %s="%s" for domain %s, path %s, expire %ld ignoring failed cookie_init for %s # Netscape HTTP Cookie File # https://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. WARNING: failed to save cookies in %s 667y777-8/.//./..//..%%%02XZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZEmpty reply from serverDigestBasicProxy-authorization:Proxy-%sAuthorization: Basic %s ProxyAuthorization:Expect:100-continueExpect: 100-continue Host:Content-Type:Content-LengthConnectionTransfer-Encoding:Invalid TIMEVALUEIf-Modified-Since: %s If-Unmodified-Since: %s Last-Modified: %s POSTPUTTransfer-Encoding: chunked Accept: */* ; User-Agent:Referer:Referer: %s Accept-Encoding:Accept-Encoding: %s TE:%s, TE TE: gzip Connection: TE TE: gzip chunkedHost: %s%s%s Host: %s%s%s:%hu ftp://;type=Accept:Could not seek streamRange: bytes=%s Content-Range:Content-Range: bytes %s/%ld %s ftp://%s:%s@%sProxy-Connection:Cookie: %s%s=%sContent-Length: 0 Failed sending POST requestInternal HTTP POST error!Content-Length:Content-Length: %ld Failed sending PUT request%x Failed sending HTTP requestReceived 101 HTTP/%d.%d %d HTTP/2 %d HTTP %3d RTSP/%d.%d %3dHTTPServer:keep-alivedeflatex-gzipContent-Encoding:Last-Modified:WWW-Authenticate:Proxy-authenticate:Location:HTTP/HTTPSThe requested URL returned error: %d%s auth using %s with user '%s' Ignoring duplicate digest auth header. Authentication problem. Ignoring this. %s, %02d %s %4d %02d:%02d:%02d GMTProxy-Connection: Keep-Alive Chunky upload is not supported by HTTP 1.0Could only read %ld bytes from the inputFile already completely uploadedContent-Range: bytes 0-%ld/%ld Content-Range: bytes %s%ld/%ld %s HTTP/%s %s%s%s%s%s%s%s%s%s%s%sCould not get Content-Type header line!Content-Type: application/x-www-form-urlencoded Failed sending HTTP POST requestupload completely sent off: %ld out of %ld bytes Avoided giant realloc for header (max is %d)!Failed to alloc memory for big header!no chunk, no close, no size. Assume close to signal end Keep sending data to get tossed away! HTTP error before end of send, keep sending HTTP error before end of send, stop sending Lying server, not serving HTTP/2 The requested URL returned error: %sHTTP 1.0, assume close after body Negative content-length: %ld, closing after transfer HTTP/1.0 proxy connection set to keep alive! HTTP/1.1 proxy connection set close! HTTP/1.0 connection set to keep alive! Illegal or missing hexadecimal sequencepH аToo long hexadecimal numberMalformed encoding foundBad content-encoding found%.*s%sAuthorization: Digest %s CONNECT%s%s%s:%huHost: %s CONNECT response too large!Proxy CONNECT abortedchunk reading DONE Ignore chunked response-body CONNECT responded chunked HTTP/1.%d %dTUNNEL_STATE switched to: %d Connect me again please CONNECT %s HTTP/%s %s%s%s%sEstablish HTTP proxy tunnel to %s:%hu Failed sending CONNECT to proxyProxy CONNECT aborted due to timeoutProxy CONNECT aborted due to select/poll errorProxy CONNECT connection closed Ignore %ld bytes of response-body Content-Length: in %03d responseTransfer-Encoding: in %03d responseReceived HTTP code %d from proxy after CONNECTProxy replied OK to CONNECT request mbedTLS does not support SSLv2Failed - mbedTLS: ctr_drbg_init returned (-0x%04X) %s Error reading ca cert file %s - mbedTLS: (-0x%04X) %sError reading ca cert path %s - mbedTLS: (-0x%04X) %sError reading client cert file %s - mbedTLS: (-0x%04X) %sError reading private key %s - mbedTLS: (-0x%04X) %sError reading CRL file %s - mbedTLS: (-0x%04X) %smbedTLS: Set min SSL version to TLS 1.0 mbedTLS: Set SSL version to SSLv3 mbedTLS: Set SSL version to TLS 1.0 mbedTLS: Set SSL version to TLS 1.1 mbedTLS: Set SSL version to TLS 1.2 mbedTLS: TLS 1.3 is not yet supportedUnrecognized parameter passed via CURLOPT_SSLVERSIONmbedtls_ssl_set_session returned -0x%xcouldn't set hostname in mbedTLSssl_handshake returned - mbedTLS: (-0x%04X) %smbedTLS: Handshake complete, cipher is %s Cert verify failed: BADCERT_EXPIREDCert verify failed: BADCERT_REVOKEDCert verify failed: BADCERT_CN_MISMATCHCert verify failed: BADCERT_NOT_TRUSTEDUnable to dump certificate information. Failed due to missing peer certificateFailed copying peer certificateFailed copying public key from peer certificateFailed - mbedTLS: ctr_drbg_seed returned (-0x%04X) %s mbedTLS: ctr_drbg_init returned (-0x%04X) %s select/poll on SSL socket, errno: %dmbedtls_ssl_get_session returned -0x%xmbedTLS: Connecting to %s:%d mbedTLS: ssl_init failedmbedTLS: ssl_config failedmbedTLS re-using session * Dumping cert info: %s SSL connected mbedTLS/%d.%d.%dSSL connection timeoutfailed to store ssl session @#Eg machinedefaultlogin.netrc%31[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]%02d:%02d:%02d%nJanFebMarAprMayJunJulAugSepOctNovDecMondayTuesdayWednesdayThursdayFridaySaturdaySundayMonTueWedThuFriSatSun;Zx0NGMTUTCWETBSTWAT<ASTADTEST,EDTCSThCDT,MSTMDThPSTPDTYSTYDTHSTXHDTCATXAHSTXNTIDLWCETMETMEWTMESTCESTMESZFWTFSTEETWAST\WADT CCT JSTEASTEADTlGSTNZT0NZST0NZDTIDLE0A<BxCDE,FhGHIKXLMNOPLQRST\U VWXlY0ZSOCKS4%s request granted. SOCKS5: no connection hereSOCKS5: connection timeoutSOCKS5 nothing to readSOCKS5 read timeoutSOCKS5 read error occurredSOCKS5 request granted. SOCKS4%s: connecting to HTTP proxy %s port %d SOCKS4 communication to %s:%d SOCKS4 connect to IPv4 %s (locally resolved) SOCKS4 connection to %s not supported Failed to resolve "%s" for SOCKS4 connect.Too long SOCKS proxy name, can't use! Failed to send SOCKS4 connect request.Failed to receive SOCKS4 connect request ack.SOCKS4 reply has wrong version, version should be 4.Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d), request rejected or failed.Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d), request rejected because SOCKS server cannot connect to identd on the client.Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d), request rejected because the client program and identd report different user-ids.Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d), Unknown.SOCKS5: connecting to HTTP proxy %s port %d SOCKS5: server resolving disabled for hostnames of length > 255 [actual len=%zu] SOCKS5: error occurred during connectionSOCKS5 communication to %s:%d Unable to send initial SOCKS5 request.Unable to receive initial SOCKS5 response.Received invalid version in initial SOCKS5 response.Failed to send SOCKS5 sub-negotiation request.Unable to receive SOCKS5 sub-negotiation response.User was rejected by the SOCKS5 server (%d %d).SOCKS5 GSSAPI per-message authentication is not supported.No authentication method was acceptable. (It is quite likely that the SOCKS5 server wanted a username/password, since none was supplied to the server on this connection.)No authentication method was acceptable.Undocumented SOCKS5 mode attempted to be used by server.SOCKS5 connect to IPv4 %s (locally resolved) SOCKS5 connect to IPv6 %s (locally resolved) SOCKS5 connection to %s not supported Failed to resolve "%s" for SOCKS5 connect.Failed to send SOCKS5 connect request.Failed to receive SOCKS5 connect request ack.SOCKS5 reply has wrong version, version should be 5.Can't complete SOCKS5 connection to %d.%d.%d.%d:%d. (%d)Can't complete SOCKS5 connection to %s:%d. (%d)Can't complete SOCKS5 connection to %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%d. (%d)nonce="realm="algorithm=qop="md5-sessauthauth-intauth-conf%08x%08x%08x%08xnoncestalerealmopaqueqopalgorithmMD5-sess%s:%s:%08x:%s:%s:%s%s, opaque="%s"%s, algorithm="%s"username="%s",realm="%s",nonce="%s",cnonce="%s",nc="%s",digest-uri="%s",response=%s,qop=%sd41d8cd98f00b204e9800998ecf8427eusername="%s", realm="%s", nonce="%s", uri="%s", cnonce="%s", nc=%08x, qop=%s, response="%s"username="%s", realm="%s", nonce="%s", uri="%s", response="%s"; filename="%s"application/octet-stream%s; boundary=%s --%s Content-Type: %s %scouldn't open file "%s" --%s-- --%s-- .gifimage/gif.jpgimage/jpeg.jpeg.txttext/plain.htmltext/html.xmlapplication/xmlpXpHx8HppContent-Type: multipart/form-data------------------------%08x%08xContent-Disposition: form-data; name=" Content-Type: multipart/mixed; boundary=%s --%s Content-Disposition: attachmentWARNING: Using weak random seed %s/%s@%s\/@ CTR_DRBG (PR = TRUE) : CTR_DRBG (PR = FALSE): T0=~>|o!4V)5cY#TB!\ f_?Ti)ϭHlZM^+1XTuyXۇ>V!|h8 ^VJLF=w~N .]D jTo pInbRmQX;7_F">E"c1ikWGO7ɘ 1MUZ^䓒#V,Jnh  ENTROPY test: CIPHER - The selected feature is not availableCIPHER - Failed to allocate memoryCIPHER - Input data contains invalid padding and is rejectedCIPHER - Decryption of block requires a full blockCIPHER - Authentication failed (for AEAD modes)CIPHER - The context is invalid. For example, because it was freedCIPHER - Cipher hardware accelerator failedDHM - Reading of the DHM parameters failedDHM - Making of the DHM parameters failedDHM - Reading of the public values failedDHM - Making of the public value failedDHM - Calculation of the DHM secret failedDHM - The ASN.1 data is not formatted correctlyDHM - Allocation of memory failedDHM - Read or write of file failedDHM - DHM hardware accelerator failedDHM - Setting the modulus and generator failedECP - Bad input parameters to functionECP - The buffer is too small to write toECP - The requested feature is not available, for example, the requested curve is not supportedECP - The signature is not validECP - Memory allocation failedECP - Generation of random value, such as ephemeral key, failedECP - Invalid private or public keyECP - The buffer contains a valid signature followed by more dataECP - The ECP hardware accelerator failedECP - Operation in progress, call again with the same parameters to continueMD - The selected feature is not availableMD - Bad input parameters to functionMD - Failed to allocate memoryMD - Opening or reading of file failedMD - MD hardware accelerator failedPEM - No PEM header or footer foundPEM - PEM string is not as expectedPEM - Failed to allocate memoryPEM - RSA IV is not in hex-formatPEM - Unsupported key encryption algorithmPEM - Private key password can't be emptyPEM - Given private key password does not allow for correct decryptionPEM - Unavailable feature, e.g. hashing/encryption combinationPEM - Bad input parameters to functionPK - Type mismatch, eg attempt to encrypt with an ECDSA keyPK - Bad input parameters to functionPK - Read/write of file failedPK - Key algorithm is unsupported (only RSA and EC are supported)PK - Private key password can't be emptyPK - Given private key password does not allow for correct decryptionPK - The pubkey tag or value is invalid (only RSA and EC are supported)PK - The algorithm tag or value is invalidPK - Elliptic curve is unsupported (only NIST curves are supported)PK - Unavailable feature, e.g. RSA disabled for RSA keyPK - The buffer contains a valid signature followed by more dataPK - PK hardware accelerator failedPKCS12 - Bad input parameters to functionPKCS12 - Feature not available, e.g. unsupported encryption schemePKCS12 - PBE ASN.1 data not as expectedPKCS12 - Given private key password does not allow for correct decryptionPKCS5 - Bad input parameters to functionPKCS5 - Requested encryption or digest alg not availablePKCS5 - Given private key password does not allow for correct decryptionRSA - Bad input parameters to functionRSA - Input data contains invalid padding and is rejectedRSA - Something failed during generation of a keyRSA - Key failed to pass the validity check of the libraryRSA - The public key operation failedRSA - The private key operation failedRSA - The PKCS#1 verification failedRSA - The output buffer for decryption is not large enoughRSA - The random generator failed to generate non-zerosRSA - The implementation does not offer the requested operation, for example, because of security violations or lack of functionalityRSA - RSA hardware accelerator failedSSL - The requested feature is not availableSSL - Bad input parameters to functionSSL - Verification of the message MAC failedSSL - An invalid SSL record was receivedSSL - The connection indicated an EOFSSL - An unknown cipher was receivedSSL - The server has no ciphersuites in common with the clientSSL - No RNG was provided to the SSL moduleSSL - No client certification received from the client, but required by the authentication modeSSL - Our own certificate(s) is/are too large to send in an SSL messageSSL - The own certificate is not set, but needed by the serverSSL - The own private key or pre-shared key is not set, but neededSSL - No CA Chain is set, but required to operateSSL - An unexpected message was received from our peerSSL - A fatal alert message was received from our peerSSL - Verification of our peer failedSSL - The peer notified us that the connection is going to be closedSSL - Processing of the ClientHello handshake message failedSSL - Processing of the ServerHello handshake message failedSSL - Processing of the Certificate handshake message failedSSL - Processing of the CertificateRequest handshake message failedSSL - Processing of the ServerKeyExchange handshake message failedSSL - Processing of the ServerHelloDone handshake message failedSSL - Processing of the ClientKeyExchange handshake message failedSSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read PublicSSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate SecretSSL - Processing of the CertificateVerify handshake message failedSSL - Processing of the ChangeCipherSpec handshake message failedSSL - Processing of the Finished handshake message failedSSL - Memory allocation failedSSL - Hardware acceleration function returned with errorSSL - Hardware acceleration function skipped / left alone dataSSL - Processing of the compression / decompression failedSSL - Handshake protocol not within min/max boundariesSSL - Processing of the NewSessionTicket handshake message failedSSL - Session ticket has expiredSSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)SSL - Unknown identity received (eg, PSK identity)SSL - Internal error (eg, unexpected failure in lower-level module)SSL - A counter would wrap (eg, too many messages exchanged)SSL - Unexpected message at ServerHello in renegotiationSSL - DTLS client must retry for hello verificationSSL - A buffer is too small to receive or write a messageSSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)SSL - No data of requested type currently available on underlying transportSSL - Connection requires a write callSSL - The client initiated a reconnect from the same portSSL - Record header looks valid but is not expectedSSL - The alert message received indicates a non-fatal errorSSL - Couldn't set the hash for verifying CertificateVerifySSL - Internal-only message signaling that further message-processing should be doneSSL - The asynchronous operation is not completed yetSSL - Internal-only message signaling that a message arrived earlySSL - An encrypted DTLS-frame with an unexpected CID was receivedSSL - An operation failed due to an unexpected version or configurationSSL - A cryptographic operation is in progress. Try again laterSSL - Invalid value in SSL configX509 - Unavailable feature, e.g. RSA hashing/encryption combinationX509 - Requested OID is unknownX509 - The CRT/CRL/CSR format is invalid, e.g. different type expectedX509 - The CRT/CRL/CSR version element is invalidX509 - The serial tag or value is invalidX509 - The algorithm tag or value is invalidX509 - The name tag or value is invalidX509 - The date tag or value is invalidX509 - The signature tag or value invalidX509 - The extension tag or value is invalidX509 - CRT/CRL/CSR has an unsupported version numberX509 - Signature algorithm (oid) is unsupportedX509 - Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid)X509 - Certificate verification failed, e.g. CRL, CA or signature check failedX509 - Format not recognized as DER or PEMX509 - Allocation of memory failedX509 - Read/write of file failedX509 - Destination buffer is too smallX509 - A fatal error occurred, eg the chain is too long or the vrfy callback failedAES - Invalid data input lengthAES - Feature not available. For example, an unsupported AES key sizeAES - AES hardware accelerator failedARC4 - ARC4 hardware accelerator failedASN1 - Out of data when parsing an ASN1 data structureASN1 - ASN1 tag was of an unexpected valueASN1 - Error when trying to determine the length or invalid lengthASN1 - Actual length differs from expected lengthASN1 - Memory allocation failedASN1 - Buffer too small when writing ASN.1 data structureBASE64 - Output buffer too smallBASE64 - Invalid character in inputBIGNUM - An error occurred while reading from or writing to a fileBIGNUM - Bad input parameters to functionBIGNUM - There is an invalid character in the digit stringBIGNUM - The buffer is too small to write toBIGNUM - The input arguments are negative or result in illegal outputBIGNUM - The input argument for division is zero, which is not allowedBIGNUM - The input arguments are not acceptableBIGNUM - Memory allocation failedBLOWFISH - Invalid data input lengthBLOWFISH - Blowfish hardware accelerator failedCAMELLIA - Invalid data input lengthCAMELLIA - Camellia hardware accelerator failedCCM - Bad input parameters to the functionCCM - Authenticated decryption failedCCM - CCM hardware accelerator failedCHACHA20 - Invalid input parameter(s)CHACHA20 - Feature not available. For example, s part of the API is not implementedCHACHA20 - Chacha20 hardware accelerator failedCHACHAPOLY - The requested operation is not permitted in the current stateCHACHAPOLY - Authenticated decryption failed: data was not authenticCTR_DRBG - The entropy source failedCTR_DRBG - The requested random buffer length is too bigCTR_DRBG - The input (entropy + additional data) is too largeCTR_DRBG - Read or write error in fileDES - The data input has an invalid lengthDES - DES hardware accelerator failedENTROPY - Critical entropy source failureENTROPY - No more sources can be addedENTROPY - No sources have been added to pollENTROPY - No strong sources have been added to pollENTROPY - Read/write error in fileERROR - This is a bug in the libraryGCM - Authenticated decryption failedGCM - GCM hardware accelerator failedGCM - Bad input parameters to functionHKDF - Bad input parameters to functionHMAC_DRBG - Too many random requested in single callHMAC_DRBG - Input too large (Entropy + additional)HMAC_DRBG - Read/write error in fileHMAC_DRBG - The entropy source failedMD5 - MD5 hardware accelerator failedNET - The connection to the given server / port failedNET - Binding of the socket failedNET - Could not listen on the socketNET - Could not accept the incoming connectionNET - Reading information from the socket failedNET - Sending information through the socket failedNET - Connection was reset by peerNET - Failed to get an IP address for the given hostnameNET - Buffer is too small to hold the dataNET - The context is invalid, eg because it was free()edNET - Polling the net context failedOID - output buffer is too smallPADLOCK - Input data should be alignedPLATFORM - Hardware accelerator failedPLATFORM - The requested feature is not supported by the platformPOLY1305 - Invalid input parameter(s)POLY1305 - Feature not available. For example, s part of the API is not implementedPOLY1305 - Poly1305 hardware accelerator failedRIPEMD160 - RIPEMD160 hardware accelerator failedSHA1 - SHA-1 hardware accelerator failedSHA1 - SHA-1 input data was malformedSHA256 - SHA-256 hardware accelerator failedSHA256 - SHA-256 input data was malformedSHA512 - SHA-512 hardware accelerator failedSHA512 - SHA-512 input data was malformedXTEA - The data input has an invalid lengthXTEA - XTEA hardware accelerator failedCIPHER - Bad input parametersDHM - Bad input parametersPK - Memory allocation failedPK - Unsupported key versionPK - Invalid key tag or valuePKCS5 - Unexpected ASN.1 dataSSL - The operation timed outX509 - Input invalidAES - Invalid key lengthAES - Invalid input dataASN1 - Data is invalidBLOWFISH - Bad input dataCAMELLIA - Bad input dataERROR - Generic errorNET - Failed to open a socketNET - Input invalidOID - OID is not foundUNKNOWN ERROR CODE (%04X)invalid PKrsa.Nrsa.Eeckey.QRSA-altECDSAEC_DHECRSA*****************H=*H  *H  -----BEGIN -----END RSA PRIVATE KEY----------END EC PRIVATE KEY----------END PRIVATE KEY----------BEGIN PRIVATE KEY----------END RSA PUBLIC KEY----------BEGIN RSA PRIVATE KEY----------BEGIN EC PRIVATE KEY----------END ENCRYPTED PRIVATE KEY----------BEGIN ENCRYPTED PRIVATE KEY----------BEGIN RSA PUBLIC KEY----------END PUBLIC KEY----- -----BEGIN PUBLIC KEY----- -----END EC PRIVATE KEY----- -----END RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY----- -----BEGIN EC PRIVATE KEY----- 9292758453063D803DD603D5E777D7888ED1D5BF35786190FA2F23EBC0848AEADDA92CA6C3D80B32C4D109BE0F36D6AE7130B9CED7ACDF54CFC7555AC14EEBAB93A89813FBF3C4F8066D2D800F7C38A81AE31942917403FF4946B0A83D3D3E05EE57C6F5F5606FB5D4BC6CD34EE0801A5E94BB77B07507233A0BC7BAC8F90F79C36D0EB7FCD285223CFB5AABA5BDA3D82C01CAD19EA484A87EA4377637E75500FCB2005C5C7DD6EC4AC023CDA285D796C3D9E75E1EFC42488BB4F1D13AC30A57C000DF51A7C77AE8D7C7370C1FF55B69E211C2B9E5DB1ED0BF61D0D9899620F4910E4168387E3C30AA1E00C339A795088452DD96A9A5EA5D9DCA68DA636032AF24BF6185468786FDD303083D25E64EFC66CA472BC44D253102F8B4A9D3BFA75091386C0077937FE33FA3252D28855837AE1B484A8A9A45F7EE8C0C634F99E8CDDF79C5CE07EE72C7F123142198164234CABB724CF78B8173B9F880FC86322407AF1FEDFDDE2BEB674CA15F3E81A1521E071513A1E85B5DFA031F21ECAE91A34D10001 RSA key validation: PKCS#1 data sign : passed PKCS#1 sig. verify: passed PKCS#1 decryption : passed PKCS#1 encryption : "3 SHA-1 test #%d: >6Gj>%qxPl؝>D;nJQ)Fp4<ڤ+ۭ'1e4o8abcabcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqBuffer allocation failed SHA-%d test #%d: # }"4"BwU*你lu8Q'v]]PE\RR%% yFU ػaK?BXHNgxAA@]"#aza$ja8& >`9gH m9,8abcabcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq/BD7q۵[V9Y?^[1$} Ut]rހܛtiGƝ̡ $o,-tJܩ\ڈvRQ>m1'Y GQcg)) '8!.m,M 8STs e jv.,r迢KfpK£Ql$օ5pjl7LwH'4 9JNOʜ[o.htocxxȄnjlPxqg jgrn<:ORQhك[؞|6p09Y1 XhdOu?E^=iP',2c`ZC[퀆+#X4% 3 3G=/ǂGS;;/U~-ft`9 qdtnN1 JHRyrpL*[8뮗=ݯ5azAsI A1N~ KUӚ!*'O6<#EMD#d<*OLuڌ(?wyrP(I3ĵC:)&T^[K H= idN.BǼc; D(V2sD~ LC,w\,I.Npabcabcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"(ט/Be#D7q/;Mۉ۵8H[V9YO?m^BؾopE[N1$} Uo{t]r;ހ5%ܛ&itJi%O8GՌƝew̡ $u+Yo,-ntJAܩ\SڈvfRQ>2-m1?!'Y= % GoQcpn g))/F '&&\8!.*Zm,M߳ 8ScTs ew< jvG.;5,rdL迢0BKfpK0TQlReU$* qW5ѻ2pjҸSAQl7LwH'Hᵼ4cZų 9ˊAJNscwOʜ[o.h]t`/CocxrxȄ9dnj(c#齂lPyƲ+SrxqƜa&>'!Ǹ}xnO}orgȢ}c ?G5 q}#w($@{2 ˾L*~e)Y:o_XGJDlɼg j;ʄg+rn<6_:OтRQl>+hkAكy!~[؞]|6*)bp0ZY9Y/1 g&3gXhJd . ۤOHGTLS-DHE-RSA-WITH-AES-256-CCMTLS-DHE-RSA-WITH-AES-128-CCMTLS-RSA-WITH-AES-128-CBC-SHATLS-RSA-WITH-AES-256-CBC-SHATLS-RSA-WITH-AES-256-CCMTLS-RSA-WITH-AES-256-CCM-8TLS-RSA-WITH-AES-128-CCMTLS-RSA-WITH-AES-128-CCM-8TLS-RSA-WITH-3DES-EDE-CBC-SHATLS-RSA-WITH-RC4-128-MD5TLS-RSA-WITH-RC4-128-SHATLS-ECDH-RSA-WITH-RC4-128-SHATLS-PSK-WITH-AES-128-CBC-SHATLS-PSK-WITH-AES-256-CBC-SHATLS-PSK-WITH-AES-256-CCMTLS-PSK-WITH-AES-256-CCM-8TLS-PSK-WITH-AES-128-CCMTLS-PSK-WITH-AES-128-CCM-8TLS-PSK-WITH-3DES-EDE-CBC-SHATLS-PSK-WITH-RC4-128-SHATLS-DHE-PSK-WITH-AES-256-CCMTLS-DHE-PSK-WITH-AES-128-CCMTLS-DHE-PSK-WITH-RC4-128-SHATLS-RSA-PSK-WITH-RC4-128-SHATLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256TLS-DHE-RSA-WITH-CHACHA20-POLY1305-SHA256TLS-PSK-WITH-CHACHA20-POLY1305-SHA256TLS-ECDHE-PSK-WITH-CHACHA20-POLY1305-SHA256TLS-DHE-PSK-WITH-CHACHA20-POLY1305-SHA256TLS-RSA-PSK-WITH-CHACHA20-POLY1305-SHA256TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHATLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHATLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384TLS-ECDHE-ECDSA-WITH-AES-256-CCMTLS-ECDHE-ECDSA-WITH-AES-256-CCM-8TLS-ECDHE-ECDSA-WITH-AES-128-CCMTLS-ECDHE-ECDSA-WITH-AES-128-CCM-8TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHATLS-ECDHE-ECDSA-WITH-RC4-128-SHATLS-ECDHE-RSA-WITH-AES-128-CBC-SHATLS-ECDHE-RSA-WITH-AES-256-CBC-SHATLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHATLS-ECDHE-RSA-WITH-RC4-128-SHATLS-DHE-RSA-WITH-AES-256-GCM-SHA384TLS-DHE-RSA-WITH-AES-128-GCM-SHA256TLS-DHE-RSA-WITH-AES-128-CBC-SHA256TLS-DHE-RSA-WITH-AES-256-CBC-SHA256TLS-DHE-RSA-WITH-AES-128-CBC-SHATLS-DHE-RSA-WITH-AES-256-CBC-SHATLS-DHE-RSA-WITH-AES-256-CCM-8TLS-DHE-RSA-WITH-AES-128-CCM-8TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHATLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHATLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHATLS-RSA-WITH-AES-256-GCM-SHA384TLS-RSA-WITH-AES-128-GCM-SHA256TLS-RSA-WITH-AES-128-CBC-SHA256TLS-RSA-WITH-AES-256-CBC-SHA256TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256TLS-RSA-WITH-CAMELLIA-128-CBC-SHATLS-RSA-WITH-CAMELLIA-256-CBC-SHATLS-RSA-WITH-CAMELLIA-128-GCM-SHA256TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384TLS-ECDH-RSA-WITH-AES-128-CBC-SHATLS-ECDH-RSA-WITH-AES-256-CBC-SHATLS-ECDH-RSA-WITH-AES-128-CBC-SHA256TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHATLS-ECDH-ECDSA-WITH-AES-128-CBC-SHATLS-ECDH-ECDSA-WITH-AES-256-CBC-SHATLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHATLS-ECDH-ECDSA-WITH-RC4-128-SHATLS-PSK-WITH-AES-128-GCM-SHA256TLS-PSK-WITH-AES-256-GCM-SHA384TLS-PSK-WITH-AES-128-CBC-SHA256TLS-PSK-WITH-AES-256-CBC-SHA384TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384TLS-DHE-PSK-WITH-AES-128-GCM-SHA256TLS-DHE-PSK-WITH-AES-256-GCM-SHA384TLS-DHE-PSK-WITH-AES-128-CBC-SHA256TLS-DHE-PSK-WITH-AES-256-CBC-SHA384TLS-DHE-PSK-WITH-AES-128-CBC-SHATLS-DHE-PSK-WITH-AES-256-CBC-SHATLS-DHE-PSK-WITH-AES-256-CCM-8TLS-DHE-PSK-WITH-AES-128-CCM-8TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHATLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384TLS-ECDHE-PSK-WITH-AES-128-CBC-SHATLS-ECDHE-PSK-WITH-AES-256-CBC-SHATLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHATLS-ECDHE-PSK-WITH-RC4-128-SHATLS-RSA-PSK-WITH-AES-128-GCM-SHA256TLS-RSA-PSK-WITH-AES-256-GCM-SHA384TLS-RSA-PSK-WITH-AES-128-CBC-SHA256TLS-RSA-PSK-WITH-AES-256-CBC-SHA384TLS-RSA-PSK-WITH-AES-128-CBC-SHATLS-RSA-PSK-WITH-AES-256-CBC-SHATLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA,0$(k 9}sw]aSIME+/#'g 3|rvE\`RHLD86mqg75lpf=52*.&{yu_cQKO=</1)-%zAxt^bPJN<oinhkejd4 3  ;:9-; .,skip swap epochsunknown record type %umajor version mismatchminor version mismatchinput record headerConsider record for bufferingreplayed recordset_timer to %d mstimer expired=> encrypt bufcomputed macshould never happenmbedtls_cipher_cryptIV used (internal)IV used (transmitted)additional data used for AEADmbedtls_cipher_auth_encryptafter encrypt: tagusing encrypt then macMAC'd meta-data<= encrypt buf=> decrypt bufmsglen (%d) < taglen (%d) IV usedTAG usedmbedtls_cipher_auth_decryptmessage macexpected macmessage mac does not matchmbedtls_ssl_cf_hmac<= decrypt buf=> mbedtls_ssl_check_recordrecord bufferssl_parse_record_headermbedtls_ssl_decrypt_buf<= mbedtls_ssl_check_record=> flush output<= flush outputssl->f_sendmbedtls_ssl_flush_output=> write record=> compress bufssl_compress_buf<= compress bufssl_encrypt_bufoutput record sent to network<= write recordmbedtls_ssl_write_record=> mbedtls_ssl_resend<= mbedtls_ssl_resend=> fetch inputin_left: %d, nb_want: %d<= fetch inputtimer has expiredf_recv_timeout: %u msssl->f_recv(_timeout)mtu autoreduction to %d byteshandshake timeout=> write handshake message=> ssl_flight_appendmessage appended to flightalloc %d bytes failed<= ssl_flight_append<= write handshake messageinvalid handshake headerinvalid CCS message, len: %dis a close notify message=> send alert message<= send alert messagefullypartiallynot yet => read recordremaining content in record=> ssl_load_buffered_messsage<= ssl_load_buffered_message=> ssl_load_buffered_record<= ssl_load_buffered_recordmbedtls_ssl_fetch_inputBuffer record from epoch %uBuffered recordssl_check_client_reconnectssl_check_dtls_clihlo_cookiesending HelloVerifyRequestresetinput record from networkinput payload after decryptbad message lengthtoo many records with bad MAC=> decompress bufssl_decompress_buf<= decompress bufssl_get_next_record=> ssl_buffer_messageRemember CCS message<= ssl_buffer_messagemessage %scompletereuse previously read message<= read record=> write change cipher spec<= write change cipher spec=> parse change cipher specmbedtls_ssl_read_recordDTLS epoch would wrap<= parse change cipher spec=> readssl_check_ctr_renegotiatembedtls_ssl_handshakereceived handshake messagebad application data message<= read=> write<= write=> write close notify<= write close notify../../contrib/mbedtls/library/ssl_msg.cdatagram of length %u too small to hold DTLS record header of length %uinput record: msgtype = %d, version = [%d:%d], msglen = %dDatagram of length %u too small to contain record of advertised length %u.record from another epoch: expected %d, received %dno transform provided to encrypt_bufbad record structure provided to encrypt_bufbefore encrypt: output payloadRecord content %u too large, maximum %dBuffer provided for encrypted record not large enoughbefore encrypt: msglen = %d, including %d bytes of paddingbefore encrypt: msglen = %d, including 0 bytes of paddingNo PRNG provided to encrypt_record routinebefore encrypt: msglen = %d, including %d bytes of IV and %d bytes of paddingbad record structure provided to decrypt_bufmsglen (%d) < explicit_iv_len (%d) msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )msglen (%d) %% ivlen (%d) != 0Bad usage of mbedtls_ssl_set_bio() or mbedtls_ssl_set_bio()message length: %d, out_left: %df_send returned %d bytes but only %lu bytes were sentmbedtls_ssl_get_max_out_record_payloadfragment larger than the (negotiated) maximum fragment length: %d > %dbefore compression: msglen = %d, before compression: output payloadfailed to perform compression (%d)after compression: msglen = %d, after compression: output payloadoutput record: msgtype = %d, version = [%d:%d], msglen = %doutgoing message counter would wrapupdate timeout value to %d millisecsssl_get_remaining_payload_in_datagramStill %u bytes available in current datagram=> mbedtls_ssl_flight_transmitinitialise flight transmissionswap epochs to send finished messagefragmenting handshake message (%u > %u)<= mbedtls_ssl_flight_transmitrequesting more data than fitsnext record in same datagram, offset: %dmbedtls_ssl_resend_hello_requestf_recv returned %d bytes but only %lu were requestedRecord too large: size %u, maximum %uDTLS handshake message too large: size %u, maximum %uhandshake message too short: %dhandshake message: msglen = %d, type = %d, hslen = %dreceived future handshake message of sequence number %u (next %u)received message from last flight, message_seq = %d, start_of_flight = %ddropping out-of-sequence message: message_seq = %d, expected = %dfound fragmented DTLS handshake messageTLS handshake fragmentation not supportedinvalid CCS message, content: %02xdropping ChangeCipherSpec outside handshakereceived out-of-order ChangeCipherSpec - rememberinvalid alert message, len: %dgot an alert message, type: [%d:%d]is a fatal alert message (msg %d)is a SSLv3 no renegotiation alertdropping unexpected ApplicationDatasend alert level=%u message=%uCCS not seen in the current flightInjecting buffered CCS messageFuture message with sequence number %u %s buffered.Next handshake message has been buffered - loadBuffered handshake message (incl. header)Next handshake message %u not or only partially buffferedBuffered record not from current epoch.Found buffered record from current epoch - loadBuffering of future epoch record of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore possible client reconnect from the same portno cookie callbacks, can't check reconnect validitydiscarding unexpected record (header)discarding invalid record (header)more than one record within datagramrecord type after decrypt (before %d): %dinvalid zero-length message type: %dreceived four consecutive empty messages, possible DoS attackincoming message counter would wrapdiscarding invalid record (mac)before decompression: msglen = %d, before decompression: input payloadfailed to perform decompression (%d)after decompression: msglen = %d, after decompression: input payloadIgnore future HS message with sequence number %u, buffering window %u - %uBuffering HS message with sequence number %u, offset %u Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- attempt to make space by freeing buffered future messages Attempt to free buffered messages to have %u bytes availableEnough space available after freeing future epoch recordFree buffering slot %d to make space for reassembly of next handshake messageEnough space available after freeing buffered HS messagesReassembly of next message of size %u (%u with bitmap) would exceed the compile-time limit %u (already %u bytes buffered) -- fail initialize reassembly, total length = %dFragment header mismatch - ignoreadding fragment, offset = %d, length = %dmbedtls_ssl_handle_message_typecookie is valid, resetting contextmbedtls_ssl_write_handshake_msgbad change cipher spec messageswitching to new transform spec for inbound datassl_check_pending: record held back for processingssl_check_pending: more records within current datagramssl_check_pending: more handshake messages within current recordssl_check_pending: application data record is being processedssl_check_pending: nothing pendingrecord counter limit reached: renegotiatehandshake received (not HelloRequest)handshake received (not ClientHello)mbedtls_ssl_start_renegotiationrefusing renegotiation, sending alertrenegotiation requested, but not honored by clientignoring non-fatal non-closure alertmbedtls_ssl_send_alert_messageclient finishedserver finished=> calc finished tls sha256finished sha2 statecalc finished result<= calc finished=> calc verify sha256calculated verify result<= calc verify=> calc finished tls sha384finished sha512 state=> calc verify sha384=> calc finished tlsfinished md5 statefinished sha1 state=> calc verify tlscipher info for %d not foundkey expansionprfciphersuite = %skey blockmbedtls_md_setupmbedtls_cipher_setupmbedtls_cipher_setkeyInitializing zlib statesextended master secret=> derive keysssl_set_handshake_prfsssl_compute_masterpremaster secretssl_populate_transformAllocating compression bufferalloc(%d bytes) failed<= derive keysmbedtls_dhm_calc_secretDHM: K mbedtls_ecdh_calc_secret=> write hello request<= write hello request=> write certificate<= skip write certificategot no certificate to sendown certificate<= write certificate++=> parse certificate<= skip parse certificatebad certificate message mbedtls_x509_crt_parse_derpeer certificatex509_verify_certgot no CA chain<= parse certificate=> write finishedmbedtls_ssl_flight_transmit<= write finished=> parse finishedbad finished message<= parse finishedDTLSv1.0DTLSv1.2unknown (DTLS)SSLv3.0TLSv1.1=> handshake<= handshake=> renegotiate<= renegotiate=> handshake wrapupcache did not store session<= handshake wrapupInitial handshake isn't overHandshake isn't completedOnly DTLS is supportedOnly version 1.2 supportedsaved contextcontext to load<= free=> freembedtls_md5_starts_retmbedtls_md5_update_retmbedtls_md5_finish_retmbedtls_sha1_starts_retmbedtls_sha1_update_retmbedtls_sha1_finish_retmbedtls_md_startsmbedtls_md_updatembedtls_md_finish../../contrib/mbedtls/library/ssl_tls.cciphersuite info for %d not foundmbedtls_md info for %d not foundkeylen: %u, minlen: %u, ivlen: %u, maclen: %umbedtls_cipher_set_padding_modeFailed to initialize compressionno premaster (session resumed)session hash for extended master secretno longer retransmitting hello requestcertificate too large, %d > %dTLSv1 client has no certificateCheck that peer CRT hasn't changed during renegotiationnew server cert during renegotiationUse context-specific verification callbackUse configuration-specific verification callbackbad certificate (EC key curve)bad certificate (usage extensions)! Certificate verification flags %xCertificate verification flags clearswitching to new transform spec for outbound dataMTU too low for record expansionYou must use mbedtls_ssl_set_timer_cb() for DTLS=> handshake wrapup: final free<= handshake wrapup: final freealloc() of ssl sub-contexts failedskip freeing handshake and transformSerialised structures aren't readyThere is pending incoming dataThere is pending outgoing dataOnly AEAD ciphersuites supportedRenegotiation must not be enabledPerform mbedtls-based computation of digest of ServerKeyExchangeڢ!h4b)Ngt ;"QJy4:C0+ m_7O5mmQE䅵vb^~LB7k \8kZ$|KI(fQ[=|cH6UӚi?$_e]#ܣbV R)pmg 5NJtl!|2^F.6;w,']oLR+X9I|j&rZh TIMING tests note: will take some time! TIMING test #1 (set_alarm / get_timer): cycles=%lu ratio=%lu millisecs=%lu secs=%lu hardfail=%d a=%lu b=%lu elapsed(hires)=%lu elapsed(ctx)=%lu status(ctx)=%d TIMING test #2 (set/get_delay ): TIMING test #3 (hardclock / get_timer): failed at line %d failed (ignored)mbed TLS 2.25.0-----END X509 CRL----------BEGIN X509 CRL-----%sCRL version : %d %sissuer name : %sRevoked certificates: %sserial number: %ssigned using : %sthis update : %04d-%02d-%02d %02d:%02d:%02d %snext update : %04d-%02d-%02d %02d:%02d:%02d revocation date: %04d-%02d-%02d %02d:%02d:%02dU-----BEGIN CERTIFICATE----------END CERTIFICATE-----???%scert. version : %d %sserial number : %sissuer name : %ssubject name : %ssigned using : %s%-18s: %d bits %sbasic constraints : CA=%s, max_pathlen=%d %ssubject alt name : %s otherName : %s dNSName : %s %s %scert. type : %sSSL Client %skey usage : %sDigital Signature %sext key usage : %scertificate policies : %sSSL Server%sEmail%sObject Signing%sReserved%sSSL CA%sEmail CA%sObject Signing CA%sNon Repudiation%sKey Encipherment%sData Encipherment%sKey Agreement%sKey Cert Sign%sCRL Sign%sEncipher Only%sDecipher Only%s%s The CRL is expiredCertificate was missingThe CRL is from the future Certificate is uninitialised! %sissued on : %04d-%02d-%02d %02d:%02d:%02d %sexpires on : %04d-%02d-%02d %02d:%02d:%02d %s hardware module name : %s hardware type : %s hardware serial number : The certificate validity has expired%sUnknown reason (this should not happen) The certificate has been revoked (is on a CRL)The certificate Common Name (CN) does not match with the expected CNThe certificate is not correctly signed by the trusted CAThe CRL is not correctly signed by the trusted CACertificate verification was skippedOther reason (can be used by verify callback)The certificate validity starts in the futureUsage does not match the keyUsage extensionUsage does not match the extendedKeyUsage extensionUsage does not match the nsCertType extensionThe certificate is signed with an unacceptable hash.The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA).The certificate is signed with an unacceptable key (eg bad curve, RSA too short).The CRL is signed with an unacceptable hash.The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA).The CRL is signed with an unacceptable key (eg bad curve, RSA too short).` decenc AES-ECB-%3u (%s): AES-CBC-%3u (%s): AES-CFB128-%3u (%s): AES-OFB-%3u (%s): AES-CTR-128 (%s): AES-XTS-128 (%s): 3333333333|h웟ݦC테e/.T^jn93@8ot(Ӕ3kYz .IҒL~ !S!"zDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""" $ ]Oy-au&Qry Aӈ.FW0ߑA(H/FRrE@+mx6՚\S%/Single block msg   !"#0lT;YH {'w?JhRgKvUw~$xC2Scv^P na);?.- 34IRK٬*~yK~̈́]8`Og@ :ȏj*OqGn[&g{SZ@k.@=~s*-WoEQ0F\ R$EO+A{l7+~(Ҧ O<sdR+ybR,k{`=q+s}w5,;a- ;?.- 34IШ&zut 1b=Uqk.@=~s*-WoEQ0F\ R$EO+A{l7 +~(Ҧ O<sdR+ybR,k{`=q+s}w5,;a- ^ Z(h={f:ҭ{/Eỏ͈7Sspnsɯ]xNuhƭ|{H၏)uW1L,ڍsE_)u*׃8AV1y̓]0!cmDAjshould not happen ECDH: QECDH: QpECDH: z DES%c-ECB-%3d (%s): DES%c-CBC-%3d (%s): 4sC|NhmHM`vfPdvXHe_xגT%uH4Vx՗&sMŵB7dAobo7+ReY8ZepVhiNow is t#Eg#EgEg#  #%&)*,/12478;=>@CEFIJLOQRTWX[]^abdghkmnpsuvyz|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                              @ @@@ @ @@ @@ @@@ @@ @@@ @@@@ @ @ @@@@ @@@@@ @ @ @@@@ @@ @@ @ @@ @@@ @@@@ @ @@ @@@@@ @@ @@ B@@@BB@@@@BBB@BBB@B@@B@BBBB@B@@@                                -----END DH PARAMETERS----------BEGIN DH PARAMETERS----- DHM parameter load: passed -----BEGIN DH PARAMETERS----- MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh 1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32 9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC -----END DH PARAMETERS----- BLINDING CONTEXTfailed (%u) secp521r1brainpoolP512r1secp384r1brainpoolP384r1secp256r1secp256k1brainpoolP256r1secp224r1secp224k1secp192r1secp192k1x25519x448000000000000000000000000000000000000000000000001FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8C5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D254000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55555555555555555555555555555555555555555555555540000000000000000000000000000000000000000000000000000000000000005C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C305715ECCE24583F7A7023C24164390586842E816D7280A49EF6DF4EAE6B280BF841A2B017516F6D254E1F002BCCBADD54BE30F8CEC737A0E912B4963B6BA7446055555555555555555555555555555555555555555555555555555555555555507FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 ECP SW test #1 (constant op_count, base point G): ECP SW test #2 (constant op_count, other point): ECP Montgomery test (constant op_count): H h@`8X0xP(p01DB4298AA14DEF9DEA2F79CD65812631A5CF5D3ED8335DC163BB124B65129C96FDE933D8D723A70AADC873D6D54A7BB0DȳȫجxX`Xpi]ӱGaA&LA\>Up3pʜcɳ03?۸ݪ:xT/+Ѯc'K[^H_JIܲ[{$ "xϩ2cV]8}" "5h^j@GPm|_}{hPx; b;ٵp텓jL.2!Zd.ؽ䮁#c (^P@g>ʔwM+Ț. :%Z]-cA4=ʔwM+Ț. :%Z]-cA4=˔L#Eq2;`10xH:XV`(Ƃ-/(怣*ͮBhƛM}q3pʜcɳ03?۸ݪee2;k:ϧ%lnVT q/AP~o](m8S<&ABw!FF()OdX) bRϕ\ uGⲇF64& O~Gk?:EhdLP:ە9|b>.}/|DT9&("Ǩ&("Ǩ:PJe'O  r< =Ƃ{S1Gq)Ӭ#ڱVT q/AP~o](m8VHaz9q f>Wi/T\T-EwaF5~Tb2ΚSD:#'޹/HK,W~˹ҋk\)|׻ٵ0DKJl\&ٵ0DKJl\&UzA0uW0,u Z}wSnH ( &#;nr f>WAA6Ќ^ҿ;HܮGTH]eģ&w:H[Y(- ΕbU~fy/vqʄaamUKYʂB4~\e~upgi(0ߙM3[EmtjFi&/^و@4cA(Vm//}lѥ4}&WO7 d8oGɵ;Х Hk/QPfџv@rp<5a?P@&^r,f>'hDWID},_\;xj)9f1~~BjH3ި'(Yw^K=Mk`(!?9dB#f>?PkE4,=s5;R{~Q9V 񎑉[rڢ@!a>Qs)jzH X-7Mc_|Cz~α` 1|()ܒ]o,&J6 vr8^T:l)U]U8*TAYb;nt DZ7"ʇ*ȅ*.9VZPAn-k>/1Q%cʹQ7h@^1kW3+|J玛BO˜E93-}w@cGB,kK`'><;S̰evU:5Z=*\\E)>4~DdGZuC"L#c7!\ր24"VJ2k U#C9 'ؿ׷DPV2A 1(Ҵk6ޙHyws$kcx+ C |0F޸I0$r瀜!d AES-GCM-%3d #%d (%s): AES-GCM-%3d #%d split (%s): X~0a6WEZnG,:gWM\*'d,Z+[O2!۔ZG6;VJaŮ F*<P3sKW$5/9'Xu$Xs6MgJ%IG7Um'aeb:$ O̤ 53f)%VvSE6csȧk&[Ԋ4qP"plvnNh߈S-U:3}F^EI.JfȵZ`(¹qxB!wt$Kr!Ԝ!/,5~#).!Tf}jZ 9j =XG?YB!wt$Kr!Ԝ!/,5~#).!Tf}jZ 9j =Xa5;L(Jw*GUi*qO7f{lt#si$+ uDԉkBI?EIbV3?â&*<~,䩤<ܲԌ|o(uҬL4$|A&~C9 <Ać*'Wلb }w=D%aJ?GD/$'V9 <Ać*'Wلb }w=D%aJ?GD/$'T$n%2Mfc.OG(PpW)ߚGueA:G?b~h$C"JL qs"NԿ'F4ջI_ȤYy4|ݥyWf!Fs:5![[Ď3t՛19`Hі% <%ʸ-Tspz%^KNj+F\ q@\DDɫX>O>[dHiZBMB`^@M{YTuiQRIPEMD160@P`p\LL<Paabcmessage digestabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678912345678901234567890123456789012345678901234567890123456789012345678901234567890U*H *H *H=+*H *H *H  .%uPBE with SHA1 and 3-Key 3DES*H  PBE with SHA1 and 2-Key 3DEShmacSHA1HMAC-SHA-1*H hmacSHA224HMAC-SHA-224*H  hmacSHA256HMAC-SHA-256*H  hmacSHA384HMAC-SHA-384*H  hmacSHA512HMAC-SHA-512id-md5+id-sha1`Heid-sha224`Heid-sha256`Heid-sha384`Heid-sha512+$id-ripemd160RIPEMD-160desCBC*H des-ede3-cbc*H=+$brainpool256r1+$ brainpool384r1+$ brainpool512r1rsaEncryption*H=id-ecPublicKeyGeneric EC key+ id-ecDHEC key for ECDHmd5WithRSAEncryptionRSA with MD5*H sha-1WithRSAEncryptionRSA with SHA1*H sha224WithRSAEncryptionRSA with SHA-224*H  sha256WithRSAEncryptionRSA with SHA-256*H  sha384WithRSAEncryptionRSA with SHA-384*H  sha512WithRSAEncryptionRSA with SHA-512+*H=ecdsa-with-SHA1ECDSA with SHA1*H=ecdsa-with-SHA224ECDSA with SHA224*H=ecdsa-with-SHA256ECDSA with SHA256*H=ecdsa-with-SHA384ECDSA with SHA384*H=ecdsa-with-SHA512ECDSA with SHA512*H  RSASSA-PSSanyPolicyAny Policyid-kp-serverAuthTLS Web Server Authenticationid-kp-clientAuthTLS Web Client Authentication+id-kp-codeSigningCode Signing+id-kp-emailProtectionE-mail Protection+id-kp-timeStampingTime Stamping+ id-kp-OCSPSigningOCSP Signing+%id-kp-wisun-fan-deviceid-ce-basicConstraintsBasic ConstraintsUid-ce-keyUsageU%id-ce-extKeyUsageExtended Key UsageUid-ce-subjectAltNameSubject Alt Name`HBid-netscape-certtypeNetscape Certificate TypeU id-ce-certificatePoliciesCertificate Policiesid-at-commonNameCommon NameCNUid-at-countryNameCountryUid-at-localityLocalityUid-at-stateStateU id-at-organizationNameOrganizationOU id-at-organizationalUnitNameOrg UnitOU*H  emailAddressE-mail addressUid-at-serialNumberSerial numberUid-at-postalAddressPostal addressUid-at-postalCodePostal codeUid-at-surNameSurnameSNU*id-at-givenNameGiven nameGNU+id-at-initialsInitialsU,id-at-generationQualifierGeneration qualifierU id-at-titleTitleU.id-at-dnQualifierDistinguished Name qualifierUAid-at-pseudonymPseudonym &,did-domainComponentDomain componentDCU-id-at-uniqueIdentifierUnique IdentifierU +!+"+#++ + pbeWithSHAAnd3-KeyTripleDES-CBCpbeWithSHAAnd2-KeyTripleDES-CBCWi-SUN Alliance Field Area Network (FAN)Proc-Type: 4,ENCRYPTEDDEK-Info: DES-EDE3-CBC,DEK-Info: DES-CBC,DEK-Info: AES-128-CBC,DEK-Info: AES-192-CBC,DEK-Info: AES-256-CBC,DEK-Info: AES-*H  PBKDF2 (SHA1) #%d: `q$`/7lM-o*AމWKyeHI&!e)=.O6bJ)Lp8VjUH 74%saltsaltsaltsaltSALTsaltSALTsaltSALTsaltSALTsaltsalt$passwordpasswordpasswordpasswordPASSWORDpasswordpassword RIPEMD-160 test #%d: Ta(~H%1 ܝ-%k>ڮ4{܃ZF]zJưZ ]Ir#_!Y_6'i,V[(epS8J l'b+ n1d:q0yQu.EW=K92Paabcmessage digestabcdefghijklmnopqrstuvwxyzabcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678912345678901234567890123456789012345678901234567890123456789012345678901234567890buffer too small for encrypted pms../../contrib/mbedtls/library/ssl_cli.crenegotiation requested, but not honored by servernon-handshake message during renegotiationincoming HelloVerifyRequest message is too shortcookie length does not match incoming message sizeserver version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d]server hello, current time: %luserver hello, bad compression: %dciphersuite info for %04x not foundserver hello, session id len.: %dserver hello, chosen ciphersuite: %04xserver hello, compress alg.: %dserver hello, chosen ciphersuite: %sserver hello, total extension length: %dnon-matching renegotiation infonon-zero length renegotiation infofound max_fragment_length extensionnon-matching max fragment length extensionfound truncated_hmac extensionnon-matching truncated HMAC extensionfound encrypt_then_mac extensionnon-matching encrypt-then-MAC extensionfound extended_master_secret extensionnon-matching extended master secret extensionfound session_ticket extensionnon-matching session ticket extensionfound supported_point_formats extensionALPN extension: no matching protocolunknown extension found: %d (ignoring)legacy renegotiation, breaking off handshakerenegotiation_info extension missing (secure)legacy renegotiation not allowedrenegotiation_info extension present (legacy)configured max major version is invalid, consider using mbedtls_ssl_config_defaults()client hello, max version: [%d:%d]client hello, current time: %luclient hello, session id len.: %dclient hello, add ciphersuite: %#04x (%s)client hello, got %d ciphersuites (excluding SCSVs)adding EMPTY_RENEGOTIATION_INFO_SCSVclient hello, compress len.: %dclient hello, compress alg.: %dclient hello, compress alg.: %d %dclient hello, adding server name extension: %sclient hello, adding renegotiation extensionclient hello, adding signature_algorithms extensionlength in bytes of sig-hash-alg extension too bigssl_write_signature_algorithms_extclient hello, adding supported_elliptic_curves extensioninvalid curve in ssl configurationmalformed supported_elliptic_curves extension in configclient hello, adding supported_point_formats extensionssl_write_supported_elliptic_curves_extssl_write_supported_point_formats_extclient hello, adding max_fragment_length extensionssl_write_max_fragment_length_extclient hello, adding truncated_hmac extensionclient hello, adding encrypt_then_mac extensionssl_write_encrypt_then_mac_extclient hello, adding extended_master_secret extensionclient hello, adding alpn extensionclient hello, adding session ticket extensionsending session ticket of length %dclient hello, total extension length: %d<= skip parse server key exchangebad server certificate (ECDH curve)bad server key exchange messageserver key exchange message must not be skippedbad server key exchange message (psk_identity_hint length)bad server key exchange message (ECDHE curve)Server used unsupported HashAlgorithm %dserver used unsupported SignatureAlgorithm %dserver used HashAlgorithm %d that was not offeredServer used SignatureAlgorithm %d<= skip parse certificate requestbad certificate request messageSupported Signature Algorithm found: %d,%dpsk identity too long or SSL buffer too shortpsk identity or DHM size too long or SSL buffer too shortmbedtls_ssl_psk_derive_premaster<= skip write certificate verifygot no private key for certificatebad new session ticket messageticket in use, discarding session idf_rngcertificate key type mismatchmbedtls_rsa_pkcs1_encrypt=> parse server hellobad server hello messagereceived hello verify request<= parse server hello=> parse hello verify requestbad server versionalloc failed (%d bytes)<= parse hello verify requestserver hello, versionserver hello, random bytesserver hello, session idmbedtls_ssl_derive_keys%s session has been resumedfound renegotiation extensionpoint format selected: %dno point format in commonfound alpn extensionnon-matching ALPN extension=> write client hellono RNG providedssl_generate_randomclient hello, random bytesclient hello, session idno verify cookie to sendclient hello, cookieadding FALLBACK_SCSVssl_write_hostname_extssl_write_renegotiation_extssl_write_truncated_hmac_extssl_write_extended_ms_extssl_write_alpn_extssl_write_session_ticket_ext<= write client helloclient state: %d=> parse server key exchangeserver key not ECDH capablembedtls_ecdh_get_paramsECDH curve: %sssl_get_ecdh_params_from_certmbedtls_dhm_read_paramsDHM prime too short: %d < %dDHM: P DHM: G DHM: GYmbedtls_ecdh_read_paramsServer used HashAlgorithm %dparameters hashmbedtls_pk_verify<= parse server key exchange=> parse certificate requestgot %s certificate request<= parse certificate request=> parse server hello donebad server hello done message<= parse server hello done=> write client key exchangembedtls_dhm_make_publicDHM: X DHM: GXmbedtls_ecdh_make_public<= write client key exchange=> write certificate verifymbedtls_pk_sign<= write certificate verify=> parse new session ticketticket length: %dticket alloc failed<= parse new session tickethandshake: doneinvalid state %dv4vDvTvdvDwwdxtxz}|}|||},tbad client key exchange message../../contrib/mbedtls/library/ssl_srv.cclient hello v3, message type: %dclient hello v3, message len.: %dclient hello v3, protocol version: [%d:%d]client hello v3, handshake type: %dclient hello v3, handshake len.: %dbad client hello message_seq: %d (expected %d)ClientHello fragmentation not supportedclient only supports ssl smaller than minimum [%d:%d] < [%d:%d]found signature_algorithms extensionclient hello v3, signature_algorithm ext unknown sig alg encoding %dclient hello v3, signature_algorithm ext: unknown hash alg encoding %dclient hello v3, signature_algorithm ext: match sig %d and hash %dclient hello v3, signature_algorithm ext: hash alg %d not supportedfound supported elliptic curves extensionfound supported point formats extensionfound max fragment length extensionfound truncated hmac extensionfound encrypt then mac extensionfound extended master secret extensionfound session ticket extensionticket rejected: renegotiatingsession successfully restored from ticketreceived TLS_EMPTY_RENEGOTIATION_INFO received RENEGOTIATION SCSV during renegotiationtrying ciphersuite: %#04x (%s)ciphersuite mismatch: no common elliptic curveciphersuite mismatch: no pre-shared keyciphersuite mismatch: no suitable hash algorithm for signature algorithm %dciphersuite requires certificatecandidate certificate chain, certificatecertificate mismatch: key typecertificate mismatch: (extended) key usage extensioncertificate not preferred: sha-2 with pre-TLS 1.2 clientselected certificate chain, certificateciphersuite mismatch: no suitable certificategot ciphersuites in common, but none of them usableclient hello v3, signature_algorithm ext: %dno hash algorithm for signature algorithm %d - should not happencertificate mismatch: elliptic curveclient hello was not authenticatedserver hello, chosen version: [%d:%d]session successfully restored from cacheserver hello, compress alg.: 0x%02Xserver hello, secure renegotiation extensionserver hello, max_fragment_length extensionserver hello, adding truncated hmac extensionserver hello, adding encrypt then mac extensionserver hello, adding extended master secret extensionserver hello, adding session ticket extensionserver hello, supported_point_formats extensionserver hello, adding alpn extensionpick hash algorithm %d for signing<= skip write server key exchange<= write server key exchange (pending)<= skip write certificate requestskipping CAs: buffer too shortssl_parse_parse_encrypted_pms_secret<= skip parse certificate verifybad certificate verify messagepeer not adhering to requested sig_alg for verify messagesig_alg doesn't match cert keymbedtls_dhm_read_public=> parse client hellobad client hello messagereplayed record, discardingrecord contentsclient hello, versioncookie verification failedcookie verification passedcookie verification skippedclient hello, ciphersuitelistclient hello, compressionclient hello extensionsfound ServerName extensionparse ServerName extensionssl_sni_wrapperticket is not authenticticket is expiredmbedtls_ssl_ticket_parsereceived FALLBACK_SCSVinapropriate fallbackciphersuite mismatch: versionciphersuite mismatch: rc4server has no certificateselected ciphersuite: %sgot no ciphersuites in common<= parse client hellogot no RSA private keygot no pre-shared keyUnknown PSK identityserver state: %d=> write server hello<= write server hello=> write hello verify requestinconsistent cookie callbacksf_cookie_writecookie sent<= write hello verify request=> write server key exchangeno DH parameters setmbedtls_dhm_set_groupmbedtls_dhm_make_paramsno matching curve for ECDHEECDHE curve: %smbedtls_ecp_group_loadmbedtls_ecdh_make_paramsgot no private keymy signature<= write server key exchange=> write certificate requestrequested DN<= write certificate request=> write server hello done<= write server hello done=> parse client key exchangessl_parse_client_dh_publicbad client key exchangembedtls_ecdh_read_publicssl_parse_client_psk_identityssl_parse_encrypted_pms<= parse client key exchange=> parse certificate verify<= parse certificate verify=> write new session ticketmbedtls_ssl_ticket_write<= write new session ticket @د P`*H  + %s=??=....%02X%s (%s, MGF1-%s, 0x%02X)%s key size X.509 certificate load: passed X.509 signature verify: ARC4 test #%d: uŖtKyA7]:#Eg#Eg#Eg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ Base64 encoding test: passed Base64 decoding test: JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPKswcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==$HnVbZ٢ o"ʳv1l4l8CTPKA1Z >?456789:;<=@  !"#$%&'()*+,-./0123ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 1Ѭߘr/Ḗ~&jE|,G$l iciNWqX~=t XrX͋qJT{YZ90`*#`(yA8۸y:`l>w'K1/x`\`U%U攫UbHW@cj9U*4\̴ATr|*oc]ũ+1t>\3֯\$lS2zw(H;Kkē!(f a!`|H2]]]u#&܈e>#Ŭom9BD . Ji^Bh!la gӫҠQjh/T(3Ql n;zP;*~ev9>YfCoEå}^;uos D@jVbNw?6r=B$7H ۛIrS{y%P;LylO`@ž\^c$johSl>9oR;Qm,0DE ^J3(fK.WtE9_ ӹyU 2`yr,@%g̣饎"2u<kaP/R=2`#H{1S>W\o.ViB~(2gsUO'[iXʻ]=!lJ[-ySeEIҐK3~ˤAb Lw6~д+MەqՓkю%ǯ/[{AI~-%^q h"W6d$ cUYCxSZ٢[} Źv&ϕbhAJsN-GJ{RQ)S?Wƛv`+t恵oWk *!ec.4dV]-SGjnpzKD). u#&İn}ߧI`fqilRdVឱ¥6)L u@Y>:䚘T?eB[k?ҡ08-M]% L&pc^?kh >\D}W7: P tAu8/;21>8TNmO Bo ,y|$ryVw.?rU$qk.P̈́GXzt}K:zfC cdG27;C$CMQe*P:qUN1w_V5kǣ;< $Y,n<pEㆱo ^*>Zw=Ne)։>%fRxL.jxS<- N=+6&9`y#RnfE{7(2åZl!Xeh;/ۭ}*/n[(!pa)uGa0a4c\s9pL ު˼,b`\ndi#PZe2Zh@*<1! T_~}=b7w-_h)5ǡޖXxWcr"ÃF T0.SHُ(1mX4a(s<|J]d]B> EꫪOlOBBǵj;Oe!AyMjGKPb=bF&[$ti GV[ Htb#*BXU >ap?#r3A~_;"lY7|`t˧@n2w΄PU5ai Z .zD4Egɞs͈Uy_g@Cge48>q(= m!>J=+hZ=@&L4)i Av.khq$j 3ԷCaP.9FE$tO!@MpE/f m1'A9UG%ښ ʫ%xP()Sچ, mbhiHפh'?Oz|Ϊ_7әxB*k@5 ٫9N;VmK1f&tn:2C[Ah xN جV@E'H::SU kKмgUXc)3VJ*%1?~^|1)p/'\,(H"m?H܆AyG@n]Q_2Տd5A4x{%`*`lc´2Of#k>3b $;" r(-Exb}doITH}'>AcG t.no:7`L knU{7,gm;e' )̒9 i{f} ϑ^و/$[Qy{;v.97yY̗&-1.Bh;+jLu.x7BjQ满PcKkؽ%=YBD n *Ngd_ڈ鿾dW{x`M``FѰ8Ew63kBqA_^;Z4ٷ,Q+:Ֆ}}>(-}|%rZLZq)GW;()f(.y_xU`uD^mm%adâW<'*:m?!cf&(3uU4V<wQ( gQ̫_QM08bX7 z{>d!Q2Ow~㶨F=)iSHd$m-if! FEdlX [@X̻k~jEY:D 5>ʹrdfGof,ҏ"W##v215VbuZ6ns҈bIPLVq z2E{Sb%ҽ5iq"|˶+v>S@`8G% 8vFšw``u N˅؍芰z~L\HjiԐ\-% ?2aN[wߏWr:j?$.Dsp"8 1).lN!(Ew8fTl 4)P|ɵՄ? Gy CAMELLIA-ECB-%3d (%s): CAMELLIA-CBC-%3d (%s): CAMELLIA-CTR-128 (%s):  $Нša |v ?Ǎ|weD+1ܧ,tS`Hu/MsK+\sO-]ΘPSingle block msg   !"#0lT;YH {'w?JhRgKvUw~$xC2Scv^P na)IK6 1g)x@ťߵHPϋZcXcbT>T*H0Zġ@YU!ϓ]ZLBd.7Y46؄hIϣ_+JM, g7>6sPK@p+!P`U)}30 k.@=~s*-WoEQ0F\ R +~(Ҧ O<sdR+ybR,k{`=q+s}w5,;a- gg18TisWVHC8?<# !" '$%& :;89ABC@+()*p,W#kEO|>^ 9]ZQlt+4vm:2Sz$`ibTdu ݇͐sRƁoc駟)/xqԫr6*<@ӻCw'5 A!Ne0_G=VM f- L~1Xa"DP}[H?\J3g&7;K.ynYjF%BU Ih8({Ǟ8Avٓ`r«uWɢҐ'IC\>gn/ Se꣮-k+6ņM3fX: xB&a?;Ԙ ,oN y"Y=tT0~(UhP1*p2ib$EsmJ.%H{οq)ldcK_F7^G[Z|`4Mrzؚ5aZ$V@c 3h oSb.(t½6"8d9,0Dek#HQҠUAC/<+ȥ G͵~)!f;Ť7Lnv-ޖ&}\O?yRm^i1 όuJWEsYlTxpIPw*[=p,'W5 A#kE!ONe|>0_^ 9G]=ZQVlM f̰-t+ 𱄙L4~vm1X:a2S"Dϲõz$`iPР}bT[dHuۊ ?ݔ\J3sgR&7;oKc.yn)/YxjFq%BrU 6I*h<8@({Cwǀf;XzsL/7ƾOSTo'-hˆV CCM: setup failed CCM-AES #%u: qb[M%]ҡQ_bw=Y=Oz͗ av٤BHCQ !"#$%&'()*+,-./01234567 @ABCDEFGHIJKLMNOw -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW 5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb +EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4 /anT1dVxr/BtwJfiESoK3/4CeXR1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUA A4IBAQABE3OEPfEd/bcJW5ZdU3/VgPNS4tMzh8gnJP/V2FcvFtGylMpQq6YnEBYI yBHAL4DRvlMY5rnXGBp3ODR8MpqHC6AquRTCLzjS57iYff//4QFQqW9n92zctspv czkaPKgjqo1No3Uq0Xaz10rcxyTUPrf5wNVRZ2V0KvllvAAVSzbI4mpdUXztjhST S5A2BeWQAAOr0zq1F7TSRVJpJs7jmB2ai/igkh1IAjcuwV6VwlP+sbw0gjQ0NpGM iHpnlzRAi/tIbtOvMIGOBU2TIfax/5jq1agUx5aPmT5TWAiJPOOP6l5xXnDwxeYS NWqiX9GyusBZjezaCaHabjDLU0qQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICBDCCAYigAwIBAgIJAMFD4n5iQ8zoMAwGCCqGSM49BAMCBQAwPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMB4XDTE5MDIxMDE0NDQwMFoXDTI5MDIxMDE0NDQwMFowPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEw9orNEE3WC+HVv78ibopQ0tO 4G7DDldTMzlY1FK0kZU5CyPfXxckYkj8GpUpziwth8KIUoCv1mqrId240xxuWLjK 6LJpjvNBrSnDtF91p0dv1RkpVWmaUzsgtGYWYDMeo1AwTjAMBgNVHRMEBTADAQH/ MB0GA1UdDgQWBBSdbSAkSQE/K8t4tRm8fiTJ2/s2fDAfBgNVHSMEGDAWgBSdbSAk SQE/K8t4tRm8fiTJ2/s2fDAMBggqhkjOPQQDAgUAA2gAMGUCMFHKrjAPpHB0BN1a LH8TwcJ3vh0AxeKZj30mRdOKBmg/jLS3rU3g8VQBHpn8sOTTBwIxANxPO5AerimZ hCjMe0d4CTHf1gFZMF70+IqEP+o5VHsIp2Cqvflb0VGWFC5l9a4cQg== -----END CERTIFICATE----- EE -----BEGIN CERTIFICATE----- MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu 1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v 4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/ /DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC AQEAXidv1d4pLlBiKWED95rMycBdgDcgyNqJxakFkRfRyA2y1mlyTn7uBXRkNLY5 ZFzK82GCjk2Q2OD4RZSCPAJJqLpHHU34t71ciffvy2KK81YvrxczRhMAE64i+qna yP3Td2XuWJR05PVPoSemsNELs9gWttdnYy3ce+EY2Y0n7Rsi7982EeLIAA7H6ca4 2Es/NUH//JZJT32OP0doMxeDRA+vplkKqTLLWf7dX26LIriBkBaRCgR5Yv9LBPFc NOtpzu/LbrY7QFXKJMI+JXDudCsOn8KCmiA4d6Emisqfh3V3485l7HEQNcvLTxlD 6zDQyi0/ykYUYZkwQTK1N2Nvlw== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1 bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9 Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH 7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz 4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7 wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi 33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60 ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0 BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+ UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc 7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv 8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAC465FJh Pqel7zJngHIHJrqj/wVAxGAFOTF396XKATGAp+HRCqJ81Ry60CNK1jDzk8dv6M6U HoS7RIFiM/9rXQCbJfiPD5xMTejZp5n5UYHAmxsxDaazfA5FuBhkfokKK6jD4Eq9 1C94xGKb6X4/VkaPF7cqoBBw/bHxawXc0UEPjqayiBpCYU/rJoVZgLqFVP7Px3sv a1nOrNx8rPPI1hJ+ZOg8maiPTxHZnBVLakSSLQy/sWeWyazO1RnrbxjrbgQtYKz0 e3nwGpu1w13vfckFmUSBhHXH7AAS/HpKC4IH7G2GAk3+n8iSSN71sZzpxonQwVbo pMZqLmbBm/7WPLc= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2 2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ ++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z /r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28 CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs 3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP 3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH 4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW 5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb +EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4 /anT1dVxr/BtwJfiESoK3/4CeXR1 -----END CERTIFICATE----- PolarSSLTest-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B 9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA 7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9 gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J 9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2 iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/ tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL 1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5 X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2 -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAC465FJh Pqel7zJngHIHJrqj/wVAxGAFOTF396XKATGAp+HRCqJ81Ry60CNK1jDzk8dv6M6U HoS7RIFiM/9rXQCbJfiPD5xMTejZp5n5UYHAmxsxDaazfA5FuBhkfokKK6jD4Eq9 1C94xGKb6X4/VkaPF7cqoBBw/bHxawXc0UEPjqayiBpCYU/rJoVZgLqFVP7Px3sv a1nOrNx8rPPI1hJ+ZOg8maiPTxHZnBVLakSSLQy/sWeWyazO1RnrbxjrbgQtYKz0 e3nwGpu1w13vfckFmUSBhHXH7AAS/HpKC4IH7G2GAk3+n8iSSN71sZzpxonQwVbo pMZqLmbBm/7WPLc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW 5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb +EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4 /anT1dVxr/BtwJfiESoK3/4CeXR1 -----END CERTIFICATE----- - j -----BEGIN CERTIFICATE----- MIIB3zCCAWOgAwIBAgIBDTAMBggqhkjOPQQDAgUAMD4xCzAJBgNVBAYTAk5MMREw DwYDVQQKDAhQb2xhclNTTDEcMBoGA1UEAwwTUG9sYXJTU0wgVGVzdCBFQyBDQTAe Fw0xOTAyMTAxNDQ0MDBaFw0yOTAyMTAxNDQ0MDBaMEExCzAJBgNVBAYTAk5MMREw DwYDVQQKDAhQb2xhclNTTDEfMB0GA1UEAwwWUG9sYXJTU0wgVGVzdCBDbGllbnQg MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFflrrFz39Osu5O4gf8Sru7mU6zO VVP2NA7MLuNjJQvfmOLzXGA2lsDVGBRw5X+f1UtFGOWwbNVc+JaPh3Cj5MejTTBL MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMB8GA1Ud IwQYMBaAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8MAwGCCqGSM49BAMCBQADaAAwZQIx AMqme4DKMldUlplDET9Q6Eptre7uUWKhsLOF+zPkKDlfzpIkJYEFgcloDHGYw80u IgIwNftyPXsabTqMM7iEHgVpX/GRozKklY9yQI/5eoA6gGW7Y+imuGR/oao5ySOb a9Vk -----END CERTIFICATE----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49 AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw== -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu 1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v 4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/ /DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC AQEAXidv1d4pLlBiKWED95rMycBdgDcgyNqJxakFkRfRyA2y1mlyTn7uBXRkNLY5 ZFzK82GCjk2Q2OD4RZSCPAJJqLpHHU34t71ciffvy2KK81YvrxczRhMAE64i+qna yP3Td2XuWJR05PVPoSemsNELs9gWttdnYy3ce+EY2Y0n7Rsi7982EeLIAA7H6ca4 2Es/NUH//JZJT32OP0doMxeDRA+vplkKqTLLWf7dX26LIriBkBaRCgR5Yv9LBPFc NOtpzu/LbrY7QFXKJMI+JXDudCsOn8KCmiA4d6Emisqfh3V3485l7HEQNcvLTxlD 6zDQyi0/ykYUYZkwQTK1N2Nvlw== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1 bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9 Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH 7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz 4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7 wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi 33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60 ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0 BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+ UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc 7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv 8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA 2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V fGa5kHvHARBPc8YAIVIqDvHH1Q== -----END CERTIFICATE----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49 AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/ 6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w== -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJklg3Q4 cB7v7BzsxM/vLyKccO6op0/gZzM4ghuLq2Y32kl0sM6kSNUUmduuq3u/+GmUZN2A O/7c+Hw7hDFEIvZk98aBGjCLqn3DmgHIv8ToQ67nellQxx2Uj309PdgjNi/r9HOc KNAYPbBcg6MJGWWj2TI6vNaceios/DhOYx5V0j5nfqSJ/pnU0g9Ign2LAhgYpGJE iEM9wW7hEMkwmk0h/sqZsrJsGH5YsF/VThSq/JVO1e2mZH2vruyZKJVBq+8tDNYp HkK6tSyVYQhzIt3StMJWKMl/o5k2AYz6tSC164+1oG+ML3LWg8XrGKa91H4UOKap Awgk0+4m0T25cNs= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAC465FJh Pqel7zJngHIHJrqj/wVAxGAFOTF396XKATGAp+HRCqJ81Ry60CNK1jDzk8dv6M6U HoS7RIFiM/9rXQCbJfiPD5xMTejZp5n5UYHAmxsxDaazfA5FuBhkfokKK6jD4Eq9 1C94xGKb6X4/VkaPF7cqoBBw/bHxawXc0UEPjqayiBpCYU/rJoVZgLqFVP7Px3sv a1nOrNx8rPPI1hJ+ZOg8maiPTxHZnBVLakSSLQy/sWeWyazO1RnrbxjrbgQtYKz0 e3nwGpu1w13vfckFmUSBhHXH7AAS/HpKC4IH7G2GAk3+n8iSSN71sZzpxonQwVbo pMZqLmbBm/7WPLc= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2 2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ ++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z /r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28 CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs 3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP 3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH 4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIICBDCCAYigAwIBAgIJAMFD4n5iQ8zoMAwGCCqGSM49BAMCBQAwPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMB4XDTE5MDIxMDE0NDQwMFoXDTI5MDIxMDE0NDQwMFowPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEw9orNEE3WC+HVv78ibopQ0tO 4G7DDldTMzlY1FK0kZU5CyPfXxckYkj8GpUpziwth8KIUoCv1mqrId240xxuWLjK 6LJpjvNBrSnDtF91p0dv1RkpVWmaUzsgtGYWYDMeo1AwTjAMBgNVHRMEBTADAQH/ MB0GA1UdDgQWBBSdbSAkSQE/K8t4tRm8fiTJ2/s2fDAfBgNVHSMEGDAWgBSdbSAk SQE/K8t4tRm8fiTJ2/s2fDAMBggqhkjOPQQDAgUAA2gAMGUCMFHKrjAPpHB0BN1a LH8TwcJ3vh0AxeKZj30mRdOKBmg/jLS3rU3g8VQBHpn8sOTTBwIxANxPO5AerimZ hCjMe0d4CTHf1gFZMF70+IqEP+o5VHsIp2Cqvflb0VGWFC5l9a4cQg== -----END CERTIFICATE----- PolarSSLTest-----BEGIN EC PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,307EAB469933D64E IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUA A4IBAQABE3OEPfEd/bcJW5ZdU3/VgPNS4tMzh8gnJP/V2FcvFtGylMpQq6YnEBYI yBHAL4DRvlMY5rnXGBp3ODR8MpqHC6AquRTCLzjS57iYff//4QFQqW9n92zctspv czkaPKgjqo1No3Uq0Xaz10rcxyTUPrf5wNVRZ2V0KvllvAAVSzbI4mpdUXztjhST S5A2BeWQAAOr0zq1F7TSRVJpJs7jmB2ai/igkh1IAjcuwV6VwlP+sbw0gjQ0NpGM iHpnlzRAi/tIbtOvMIGOBU2TIfax/5jq1agUx5aPmT5TWAiJPOOP6l5xXnDwxeYS NWqiX9GyusBZjezaCaHabjDLU0qQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW 5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb +EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4 /anT1dVxr/BtwJfiESoK3/4CeXR1 -----END CERTIFICATE----- PolarSSLTest-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B 9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA 7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9 gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J 9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2 iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/ tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL 1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5 X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2 -----END RSA PRIVATE KEY----- Cy0?0'0  *H  0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0 190210144406Z 290210144406Z0<1 0 UNL10U PolarSSL10U PolarSSL Client 20"0  *H 0 t̹yE`}k3 0  *H  ^'o).Pb)a]7 ډũ irN~td49d\aME<IGM\bV/3F"weXtO' gc-{ٍ'"6ƸK?5AIO}?Gh3DY 2Y_n" ybK\4in;@U$>%pt+‚ 8w&ʟuweq5OC0-?Fa0A27co0t̹yE`}k3 l^k)^jҥrŞk7^Kwg0Ah@Ӝ*"x)d[/xdJk>PzYU/缗"ͤˊeEz)Мab1k3-e(6nT =Q,BR:rtM{QzV /4)뿽1OPIܾĐ(B )采ٟ5m|W(CM>7O#RLLU?Q0;s%?wyR@HO4ä6s EQnsX9B%+]a4|T-i:Lj0S/\JNȽm2^;pШAWlS(bCb.lqU[jtzĬ;&us ,oAxs2YZ>etڠt_XN,d0w dgdNM"z8d2a* *H=DBW宱sӬSUS4.c% ߘ\`6pKEl\p00c 0 *H=0>1 0 UNL10U PolarSSL10U PolarSSL Test EC CA0 190210144400Z 290210144400Z0A1 0 UNL10U PolarSSL10U PolarSSL Test Client 20Y0*H=*H=BW宱sӬSUS4.c% ߘ\`6pKEl\pǣM0K0 U00Uz_d];;&?0U#0m $I?+x~$6|0 *H=h0e1ʦ{2WTC?PJmQb3(9_Β$%h q."05r={m:3i_2r@z:ec覸d9#kd-----BEGIN CERTIFICATE----- MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu 1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v 4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/ /DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC AQEAXidv1d4pLlBiKWED95rMycBdgDcgyNqJxakFkRfRyA2y1mlyTn7uBXRkNLY5 ZFzK82GCjk2Q2OD4RZSCPAJJqLpHHU34t71ciffvy2KK81YvrxczRhMAE64i+qna yP3Td2XuWJR05PVPoSemsNELs9gWttdnYy3ce+EY2Y0n7Rsi7982EeLIAA7H6ca4 2Es/NUH//JZJT32OP0doMxeDRA+vplkKqTLLWf7dX26LIriBkBaRCgR5Yv9LBPFc NOtpzu/LbrY7QFXKJMI+JXDudCsOn8KCmiA4d6Emisqfh3V3485l7HEQNcvLTxlD 6zDQyi0/ykYUYZkwQTK1N2Nvlw== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1 bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9 Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH 7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz 4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7 wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi 33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60 ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0 BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+ UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc 7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv 8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA== -----END RSA PRIVATE KEY----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49 AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw== -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIB3zCCAWOgAwIBAgIBDTAMBggqhkjOPQQDAgUAMD4xCzAJBgNVBAYTAk5MMREw DwYDVQQKDAhQb2xhclNTTDEcMBoGA1UEAwwTUG9sYXJTU0wgVGVzdCBFQyBDQTAe Fw0xOTAyMTAxNDQ0MDBaFw0yOTAyMTAxNDQ0MDBaMEExCzAJBgNVBAYTAk5MMREw DwYDVQQKDAhQb2xhclNTTDEfMB0GA1UEAwwWUG9sYXJTU0wgVGVzdCBDbGllbnQg MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFflrrFz39Osu5O4gf8Sru7mU6zO VVP2NA7MLuNjJQvfmOLzXGA2lsDVGBRw5X+f1UtFGOWwbNVc+JaPh3Cj5MejTTBL MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMB8GA1Ud IwQYMBaAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8MAwGCCqGSM49BAMCBQADaAAwZQIx AMqme4DKMldUlplDET9Q6Eptre7uUWKhsLOF+zPkKDlfzpIkJYEFgcloDHGYw80u IgIwNftyPXsabTqMM7iEHgVpX/GRozKklY9yQI/5eoA6gGW7Y+imuGR/oao5ySOb a9Vk -----END CERTIFICATE----- ;;y#-0700  *H  0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0 190210144406Z 290210144406Z041 0 UNL10U PolarSSL10U localhost0"0  *H 0 MIrx:$4$w&d(}R6ԣvؐafR6&St^}* -If[%sF Oi ڂf}T+eya@Ih FиVDڋD^b/f]}')Ő?'0J'k=z<>4[sKR,i9ZY/0M0K0 U00Ud`PM`dMC0U#0Z䥳Rզ>0  *H  .:Ra>2gr&@`91w1 |#J0oΔDb3k]%LM٧Q1 |Ed~ +J/xb~?VF*pkABaO&YT{/kYά|~d$4$w&d(}R6ԣvؐafR6&St^}* -If[%sF Oi ڂf}T+eya@Ih FиVDڋD^b/f]}')Ő?'0J'k=z<>4[sKR,i9ZY/0M0K0 U00Ud`PM`dMC0U#0Z䥳Rզ>0  *H s Jˠcv+ ŏ:Ŝ5zw TRxYOQi/ 煒غv]a-醵*?S(BsC_enzX"9rQ״u/:+PM[$4$w&d(}R6ԣvؐafR6&St^}* -If[%sF Oi ڂf}T+eya@Ih FиVDڋD^b/f]}')Ő?'0J'k=z<>4[sKR,i9ZY/0GDY-:ClHxl8 _AdcD B^y SKegHj$4,y֢C\%A'R+ns #Ca*NCY4r^6m+xRiW黡7;\a߃AI.| mu]1f9 ZMl[y:%^$7&@/JRQ2$ DwX1 ঌsdLo oi<" 'ACBڠ\xUk΃+?C3Ԕojݮ͠r/qK>)g0$Xv=#8? ejUW6D;J@M|BaXwX=b C M/|BӭKy*laj;[%s[لW9qcx]njÇq~_.<6Y: xoBK, #a-l<]ݛ/uutz& ynۼ:Ğ n실q§GHjԳ Zo0zG@bB,ܸU<HX4ϴ#&xOzYo==lG^I H=w*s߽nd+xOsy3y5 >L'.uX!#dq,,b:4ѲZO=78pGH|vg|ȏ`?I.kScc٫!.- LQĒ!e [l?/h8lx/o!.V0w * vpY- n|tЭh"YbN#/4]]kw U͊*ȴ00 0 *H=0>1 0 UNL10U PolarSSL10UPolarssl Test EC CA0 130924155204Z 230922155204Z041 0 UNL10U PolarSSL10U localhost0Y0*H=*H=B7Vv Zr>Y- n|tЭh"YbN#/4]]kw U͊*ȴ00 U00UPaׂ ecF0nU#g0em $I?+x~$6|B@0>1 0 UNL10U PolarSSL10UPolarssl Test EC CA C~bC0 *H=h0e1,\צۢd Na1ǫssT ]м/!)5>90!6] '%;5%Y^|f{Os!R*-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAC465FJh Pqel7zJngHIHJrqj/wVAxGAFOTF396XKATGAp+HRCqJ81Ry60CNK1jDzk8dv6M6U HoS7RIFiM/9rXQCbJfiPD5xMTejZp5n5UYHAmxsxDaazfA5FuBhkfokKK6jD4Eq9 1C94xGKb6X4/VkaPF7cqoBBw/bHxawXc0UEPjqayiBpCYU/rJoVZgLqFVP7Px3sv a1nOrNx8rPPI1hJ+ZOg8maiPTxHZnBVLakSSLQy/sWeWyazO1RnrbxjrbgQtYKz0 e3nwGpu1w13vfckFmUSBhHXH7AAS/HpKC4IH7G2GAk3+n8iSSN71sZzpxonQwVbo pMZqLmbBm/7WPLc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJklg3Q4 cB7v7BzsxM/vLyKccO6op0/gZzM4ghuLq2Y32kl0sM6kSNUUmduuq3u/+GmUZN2A O/7c+Hw7hDFEIvZk98aBGjCLqn3DmgHIv8ToQ67nellQxx2Uj309PdgjNi/r9HOc KNAYPbBcg6MJGWWj2TI6vNaceios/DhOYx5V0j5nfqSJ/pnU0g9Ign2LAhgYpGJE iEM9wW7hEMkwmk0h/sqZsrJsGH5YsF/VThSq/JVO1e2mZH2vruyZKJVBq+8tDNYp HkK6tSyVYQhzIt3StMJWKMl/o5k2AYz6tSC164+1oG+ML3LWg8XrGKa91H4UOKap Awgk0+4m0T25cNs= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2 2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ ++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z /r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28 CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs 3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP 3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH 4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg== -----END RSA PRIVATE KEY----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49 AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/ 6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w== -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA 2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V fGa5kHvHARBPc8YAIVIqDvHH1Q== -----END CERTIFICATE----- EE  j0A0)0  *H  0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0 190210144400Z 290210144400Z0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0"0  *H 0 7?ޖ2}D!|Xŋ8{98]pxӞٓrQΣ0R@pDr @>Jc)tW;q?֥<*'`Ɵ˺`}2OX&"[Դ.p..AU4.}$riG@}g1y.bo'>XT !s70o.(~K#8ed nqȳɫχ2XoP0N0 U00UZ䥳Rզ>0U#0Z䥳Rզ>0  *H  8Tk!8(aɰ62DVF18堮 SN /9wLԻDsw6s]PÀWV5$I{r I/<70M6y|Qޒ@qrGls<}׷ԛ_ }Ք IOhSic5k 'Mb➪\7OU;-B48,)1dl8qm* ytu0A0)0  *H 0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0 110212144400Z 210212144400Z0;1 0 UNL10U PolarSSL10U PolarSSL Test CA0"0  *H 0 7?ޖ2}D!|Xŋ8{98]pxӞٓrQΣ0R@pDr @>Jc)tW;q?֥<*'`Ɵ˺`}2OX&"[Դ.p..AU4.}$riG@}g1y.bo'>XT !s70o.(~K#8ed nqȳɫχ2XoP0N0 U00UZ䥳Rզ>0U#0Z䥳Rզ>0  *H s= []SՀR3'$W/ѲP'/ѾSw84|2 */8縘}Poglܶos9<#Mu*vJ$>Qget*eK6j]Q|K6:ERi&H7.^S4446zg4@Hnӯ0M!ըǖ>SX<^q^p5j_ѲY n0SJ07?ޖ2}D!|Xŋ8{98]pxӞٓrQΣ0R@pDr @>Jc)tW;q?֥<*'`Ɵ˺`}2OX&"[Դ.p..AU4.}$riG@}g1y.bo'>XT !s70o.(~K#8ed nqȳɫχ2Xo?4o77Ecu5w*[w~ѷ˩ZZ8h*,238r՜N& fՑ|֏Kv+h0plN5>X !8ĻEo[NXk55iH Qk]KCH,\1I M }+"ħ>fW,>tvot21t"¨C# Ddgҏi)%Pu)>kYGն_cD?:OMFTt g؉eLX*G7U9Ou:Ef|e#k^flo8.iqk"r :pKޫ/Q*uX@'p1H !4LW!+ͧ v"5D?%)}y1첿4;xZ3>⁂5cčLwq[mx,yJyp4Vqh3E0;ҟ*8sxuKˆJIfJf<W3_u]4er"AОi8tpCPmsȧĝ] ՟yT·l=}-xZ3* mbBнJ ԩ޿,čye"ӷIlM"`:8l4|@xS#ꠚ`ȏ) K13[[WsHz刑*KЋ>w/G~Q eއ $ү(; I h@Ã484 Am\B29i>a6Gm.*4d0N&A6S|9BP(2m78 "͕MoCe/ i 00qW38]m)vEׇo#D d{v煕tѤ^+"db+4A7X/V)CKNnWS39XR9 #_$bH),-ˆRj!ݸnXiA)ô_uGo)UiS; f`300 C~bC0 *H=0>1 0 UNL10U PolarSSL10U Polarssl Test EC CA0 190210144400Z 290210144400Z0>1 0 UNL10U PolarSSL10U Polarssl Test EC CA0v0*H=+"b+4A7X/V)CKNnWS39XR9 #_$bH),-ˆRj!ݸnXiA)ô_uGo)UiS; f`3P0N0 U00Um $I?+x~$6|0U#0m $I?+x~$6|0 *H=h0e0Qʮ0ptZ,w♏}&Eӊh?MT1O;)({Gx 1Y0^?9T{`[Q.eB-----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW 5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb +EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4 /anT1dVxr/BtwJfiESoK3/4CeXR1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/ MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUA A4IBAQABE3OEPfEd/bcJW5ZdU3/VgPNS4tMzh8gnJP/V2FcvFtGylMpQq6YnEBYI yBHAL4DRvlMY5rnXGBp3ODR8MpqHC6AquRTCLzjS57iYff//4QFQqW9n92zctspv czkaPKgjqo1No3Uq0Xaz10rcxyTUPrf5wNVRZ2V0KvllvAAVSzbI4mpdUXztjhST S5A2BeWQAAOr0zq1F7TSRVJpJs7jmB2ai/igkh1IAjcuwV6VwlP+sbw0gjQ0NpGM iHpnlzRAi/tIbtOvMIGOBU2TIfax/5jq1agUx5aPmT5TWAiJPOOP6l5xXnDwxeYS NWqiX9GyusBZjezaCaHabjDLU0qQ -----END CERTIFICATE----- PolarSSLTest-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B 9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA 7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9 gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J 9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2 iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/ tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL 1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5 X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2 -----END RSA PRIVATE KEY----- PolarSSLTest-----BEGIN EC PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,307EAB469933D64E IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm -----END EC PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIICBDCCAYigAwIBAgIJAMFD4n5iQ8zoMAwGCCqGSM49BAMCBQAwPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMB4XDTE5MDIxMDE0NDQwMFoXDTI5MDIxMDE0NDQwMFowPjELMAkGA1UE BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0 IEVDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEw9orNEE3WC+HVv78ibopQ0tO 4G7DDldTMzlY1FK0kZU5CyPfXxckYkj8GpUpziwth8KIUoCv1mqrId240xxuWLjK 6LJpjvNBrSnDtF91p0dv1RkpVWmaUzsgtGYWYDMeo1AwTjAMBgNVHRMEBTADAQH/ MB0GA1UdDgQWBBSdbSAkSQE/K8t4tRm8fiTJ2/s2fDAfBgNVHSMEGDAWgBSdbSAk SQE/K8t4tRm8fiTJ2/s2fDAMBggqhkjOPQQDAgUAA2gAMGUCMFHKrjAPpHB0BN1a LH8TwcJ3vh0AxeKZj30mRdOKBmg/jLS3rU3g8VQBHpn8sOTTBwIxANxPO5AerimZ hCjMe0d4CTHf1gFZMF70+IqEP+o5VHsIp2Cqvflb0VGWFC5l9a4cQg== -----END CERTIFICATE----- ChaCha20 test %u failed (output)@wvୠ=@]jS(6̋w AY|QWHw$?J7jCÇie}/O7l>spA`]OOW,KyU*r)7pGßV1^% @B'KKD ؁/BRyPBwsةG)AheU*vM^ZIrb&fBKm-C7%IJߴl9if(5U;l\{5Ԟ+qͬc9^(25u>d1(?w?0GhHhFIF0IF`IG`JTG@LGLGM HOXHPtHPHQHXI[\I`I`I`IPaIpaJi`JPiJiJiJ@jJkKmo?o?o@o0@oP@o@p A>0>H0?l@CCTEH0JPVXZ0\t `h```@D`Џԝ@p$@l`0ԞЖ 8ЗPd`x`ȟ `0D РpР,`PPP Т@pأ(йT0@DܥD@ P `  ( LP p<@Pd0 \p Щ"#H`$%& (p)+ P2X33@4ج445L067ح :;Į<`C@GpPGIЯPLM``P RذRpS$T`@Vı@XDZ]ز@bgdhԳ@iii kl`Ф@ХX0`̵`4PPl Զ` @Эh`0H pظ,PLȹ4phн@LP 0(`dx`мD@@`p(T`@(dP 80<@P00@!P!p!!4"P@"l"#$$$p%L%x&'`,@0.013L 4h445608T80>PCXhX|@YYZ0Z pZ4p[x\j$j8 kdkl|0}P~p~0 $Pt0Кl0 80pPp0 DhР@0\t \@(X` 08PЯPH`p@(t P8t`( P@0h``x@p`php0H`XP8t@@(lPP`(@p0<!"0$`$$%l%&@AHBx GJLXMlPNOQ S8SLwxx`z`zt}}0(@x0dxpPp0 D0XPl`p л8P`0$p00$`@`40L`dx0DP D@H\`Tp*@,--.0`/L/d/x////00 3PP3d`4x9;$P>`>@0F|F HHPIDK`LpOQ8RpUVW@ WT0Wh@W|PW`WpW@X[Ds v$yt{|0~hP~`~P @@PHЃP  Ѕ4dtP h0|p Xp @pxp<ЪL0 @p0p8л`P` p `H d   `( p< P d Px    @   P8 T h |   0 ,    P ` H   0 L 4 @@P00T@jPk0l@m@n\op0p`pppq q<sxt`4\px0  8lЦ(`DXP0@DPX`lpЯ(Pt0 0Pdз ,0@@TPh`|pи <X 00D@XPlо`0Pd`p@$Pt0$ `t  @ !X!@!!!!""h"""@#,#ph# #$`$P$0 $ %p D%` % %@ &0x&& &<'P'''P(h(()PP)`d)) ) ) * !0*P!P*!x*#+0$P+$+@%+%, &\,',@',p',',0(-@(-P(0-`(D-p(X-(x-(-(- )-).*@.0,.,. -.-(/.X/2/7/909009L00<0P=0`>1@?1@B1C02`2x83yL3~3~303@H4`h4 45@$5``555p50(6h6 |66@6Ж6<7@7P777P 8X8Ъ889Э909t999:0H:t::::(;x;@;0;p<= 8=Ph=|==>T>>>>0,?? ?@,@`x@@@`A0AA0AAA @BpBB C04CpPCdCxCCCPCC DXD"D$D'HE)E/E@/F@3PF04lF`4F4F5F88G 8LG8G;GA H0BpHpBH PHWHpi8IiLIjIlIo,J@oHJpodJqJqJr KsXK@tKptKtKtKuL@uLuPLuLvLvL wMxMpyM z NPz Nz4NzHNz\N {tN@{N`{N{N{N{N{N|O|O |,O0|@OP|XO|O`}P}4P}LP}`P}xP~P8QQPQp R$R8RPRlRRRRDS`StSS`HTTT U DUPUVPVVМ,W`xWW(XtXX`YtYY Y0ZLZxZ Z[п\[[P(\\@\0L]p`]t]]@]0^P^ ^<___0T``aPaaaP bPlbbb,cP c c cpde\epe e HfP\fppfff fP2f3Hg3\g5g7g9,h;\h@>h@hE(i@E|`F̶O  P4PHP\Qp`QQQR`RԷRS`S,S@STTpTU0VPVVDZ 0\]`]_eL f0gPhhiؼiij00jL`jhjjjkܽ k0k@kPk,`k@pkTkpkkkkȾlܾ lPl`l$pl8lTllllm0m̿@mPm`mpmm0mDm`m|mnn n0nPnnn0nDn\opo@o`ooooo o o4oHp\0px0tu$u8w|wz,z@zT0~~ @p( <Ppd@P ,P@t`<@P0DP0H``\@$xp0$Xp@ 8 X (0<  @<` @P,Ph0 D$Pt DXtp8@lP0@X P  P` 0dpPPp$h0 "#@$&'0(@,@3`04 6@794@`A@E`KXpMOPZ(\\P_paa0b,f|@hjl\q@q}P}@}T@P4`H@P$8LpX`pP`0@`xpД0DТ@ph Pp0DдXl0p pp` P@Pl  p484PdPp  @ 4H\p l!$D'+082PGl[z{ОlС 0DPXpH0HpL$`|`@@T`h@`@P0l0@`t%&*l, . p/\ P= D @D D` D| E  E L M P T U  U `U U0 0[ \ ^8 @_T _p _ ` ` bdLeg@k00nt@n`nnrPudvxy @zhPzzRx +zRx $P FJ w?;*3$"D \0p<&AdHPBBE B(D0A8GP 8A0A(B BBBH LBBB B(D0A8Gj 8A0A(B BBBH (7AuHD=BBG B(A0A8G` 8A0A(B BBBC HBBD B(F0A8G`a 8A0A(B BBBE #Aa Ay F U K (QBAF BCBHHDBBE B(F0A8GI 8D0A(B BBBA HBBG B(D0A8Dp 8F0A(B BBBE H, BBI B(A0A8Gp 8A0A(B BBBH ,@ TQI U AA xTA]LXBBE B(D0A8T& 8A0A(B BBBD $6AAG cDA ,Dc$!A[@Am B 4\`BAD J  AABF ( AAQ AAI H!BBD B(A0A8G` 8A0A(B BBBF < `#BBB H(H0 (H BBBJ HL% BBD B(F0A8G`8 8D0A(B BBBC H$1BBD A(F0 (C DBBG (F ABB<h2nBBB A(H0 (J BBBD $4X84BBD A(F0J @ 0A(A BBBG J R [ A LX6BBF A(J  R [ A { (A ABBG L7BBD A(Q  R [ A z (A ABBD 4(9#(HD9RAD W ABG 4t(:dBAA X ABA u ABH `:@D{: TKD:BBB A(D0G } 0A(A BBBI L$8<BBA A(J0O (C ABBI . (F ABBG (t=AAJg AAK 4,>\BAD J$  AABG 8T?)BBD A(N (A ABBF L H@ABBH B(G0A8Mr 8A0A(B BBBA 8d HC BBD A(L (A ABBF H EBBE B(D0A8G`g 8A0A(B BBBH ( ElAAG0Y CAA 4 FBAC ] FBE y FBG 4P \FEAD I FBE UFB$ FAAR lCA LGAYH PGBBD A(J0Z (D ABBJ D(C DBBH GBBD A(J0c (A DBBA I(D ABBHd GEEE D(A0x (A BBBE M(J BBB< \HWAAJ R GAR D AAB DKA< |H9BBD A(L (A ABBA 00 |JABAC J{  AABA 4d KCBAD T ABB _AB8 KBBE A(D0p (A BBBK 8 L_BBA A(IP@ (A ABBK ( (MAAI@P AAC 0@ MBAC G0|  AABC 0t MBAD J0K  AABH H NBBB B(A0A8Gp 8A0A(B BBBH H XQgBBB B(A0A8Dm 8A0A(B BBBK H@|TrBBB B(D0A8Jr 8A0A(B BBBE 0WBAA G0  AABA 0,XBAA G0  AABA @XBBG A(A0K@~ 0A(A BBBB 8TYHL`YBBB B(A0A8Kp 8A0A(B BBBF 84[BBA A(N0p (D ABBC ([RFAD qIBD[BBE A(D0J@& 0A(A BBBJ H_FD0| A (d_aAAM@J AAA <`AAJ0M AAE G AAG UAALl`BAD G0Y  AABE d  FABC U AAB( `xAAG0g AAA 8L0aBBD A(I0 (G ABBJ DcBBE B(C0A8I@8F0A(B BBB(\dgBAD ZCBLd>BBE H(A0 (A BBBA T (A BBBE LLeTBBE B(D0A8MA 8A0A(B BBBH j+AiLjBAD G0G  AABG D  KABN J PAB`kBBE A(D0 (D BBBH k (D BBBC (D BBBllDQ4lhAAN e FAD `FA<mBBC A(L@n (A ABBH LmBBD B(F0A8J@ 8A0A(B BBBG Lo(Af`hpDBBC A(L0 (F ABBB K (F ABBJ h(F ABB4pBAC b FBH ]FBXqDN,`qjAAOQ AAA LqDOdq*Ah0qSBAA J[  AABC rTAGPX AG  tKN(tDP$ 0tAQZ AC 4t{AQb AA Xu\GO A $tHuAQU AH uDN$uHAAJ yAAluBBB A(D0 (A BBBB a (C BBBF t (F BBBH h(F BBBHL wBBD B(F0A8G@ 8F0A(B BBBH w9Awx%Ac0xAAL ` FAK NFA4xBBF A(G0(A ABB0< yBAD O  AABE 0pzhAAN e FAD `FAH{BBI B(D0A8J@q 8D0A(B BBBD 8|rBAC V CBG AFB4,|BAC O ]  AABJ 4dX}hAAN e FAD `FA4}KBAC O  AABG \~rBBC A(L0 (F ABBH r (A ABBH f (F ABBG t4BBC A(NpxJKGKFFFFFFFFFZpc (A ABBH H@4BBE B(H0A8O  8A0A(B BBBK 84BBF A(G@ (A ABBH D4WBBE A(D0Q 0A(A BBBG <| TBBA A(J (A ABBF L@BBD B(F0A8JЀM 8A0A(B BBBF 8 BBA A(G0D (A ABBI <HdBBB A(A0O (D BBBG HBBD B(F0A8G@e 8F0A(B BBBD LBBD B(F0A8G@e 8F0A(B BBBD H$ BBB B(D0A8P@ 8A0A(B BBBF LpLBBE B(A0A8JЀ 8A0A(B BBBA  DT5As<%BBC A(O (A ABBG L\В@BBD B(F0A8G 8A0A(B BBBA 4BBD A(J0j(F ABB8HDBBB A(A0J 0A(A BBBG LDfBBG B(D0A8G 8A0A(B BBBF 8(4BDH ABH(BBC A(L0l (F ABBE F(A ABB |A G (@ lBAC CB4l BBD A(S0[(D ABB0 HBAD V V  AABI ` zBBE A(D0 (C BBBI F (C BBBA V (C BBBA `AAN kAA=Q$H=4QqZBE B(A0A8OP 8A0A(B BBBH H$>hS%BBB B(A0A8Gp 8A0A(B BBBB (p>LV6BAA nABH>`VIBBB B(A0A8Ip 8A0A(B BBBA 8>dYBBA A(G0 (A DBBK ,$?[MIGA xABHT?([FBBE B(G0A8IP 8A0A(B BBBD $?,\oAB E U C N?t\>A|?\0Ad0@\BAD J@l  DABA (4@]AAJ@u AAA H`@l]BBB B(A0A8JA 8A0A(B BBBF (@^rAAS t CAK @_(Ab@(_VAu J U8Ah_BBF A(G0 (F ABBG 0PAarAAL B FAI DFAHAhaBBC A(L0r (F ABBG D(G ABB(AajAAS d DAR \AbBBD B(F0A8G@ 8F0A(B BBBF D8G0A(B BBB\Bb]AS EC,|BcBHA y FBD BckAS } AF (BccAAS d LAJ (B d[AAS g CAH (CTdAL V AL ,LCdBHA e ABM 8|CPeBHA u FBH H ABE ,Ce3BAF  FBI ,Cf3BAF  FBI HDg BBE B(D0A8J~ 8A0A(B BBBF (dDXqjAAS d DAR (DqSAAS W DAO \DqkBBF A(G@ (K ABBM _ (C ABBI D(K ABB<ErBBF A(G0(F ABB\Ept%AcxEt%AcEt"A` EtJAL c FA Et"A`Et$D_PFuqBAD D0z  KABM R  FABE r  FABE 8\F0vBBD A(D0O (F ABBI 8FvBBD A(D0O (F ABBI FvAL  FD $Fw@AAL jFA Gw"A` 8A0A(B BBBF 8WfBBF A(KPD (A ABBA 8XWbBBD A(Spt (A ABBJ W((WD-Ak(WXRVAG fAAJ(WZBAA RAB8XBBA A(G0(D ABB4XXTBBE A(M0q(G ABB(XBAA ABXP>dVXx<XK8XBBD A(F0 (A ABBG 8YC<LYaBBB A(D0^ (A BBBH $Y5AAP `AAY(DHYdBBE B(D0A8GPV 8D0A(B BBBF <ZIFB A(D0n (D BBBB TZHHKw A tZxQAL x FA ZDN0ZBAF J@  AABA 0Z8BAF J@  AABA H[BBG B(A0A8JA 8A0A(B BBBK 0d[BAF J@  AABA 8[tHDA V ABJ R ABK 0[BAF G@  FABA H\BBB B(A0A8JA 8A0A(B BBBH 0T\HBAF J@  AABA 8\BBF A(G@ (A ABBF H\zBBG B(A0A8GP 8A0A(B BBBJ H]BBE B(D0A8NP 8D0A(B BBBE L\]G BBB B(A0A8JA0 8A0A(B BBBB (]AAJ C AAG L]tW BBD B(F0A8JBf 8A0A(B BBBE L(^BBD B(F0A8T= 8A0A(B BBBD Lx^%'BBD B(F0A8J 8A0A(B BBBG H^3BBB B(A0A8IP 8A0A(B BBBI H_h6 BBE B(A0A8JP 8D0A(B BBBG d`_,>BBG B(A0A8G`6 8C0A(B BBBH  8A0A(B BBBN L_FBBG B(A0A8JF 8A0A(B BBBH L`U BBE B(A0A8G 8A0A(B BBBA h`Tb|`Pb `LbA `baAG0h AG L`,dBBB A(A0b (A BBBG z (A BBBA \ adBBA A(J0- (A ABBE ^ (A ABBD i (A ABBA afHDC$aTf]AAJ }GAafhafH(a$g;AAG` AAG (b8iAAJ0k AAG L@b k]BBB B(A0A8J 8A0A(B BBBE LboABBE B(D0A8H 8A0A(B BBBH bt8b(t,BBD A(J@x (A ABBG 0cvAK0O AD Tcv"\lcxBBF A(L0 (D ABBB D (K ABBL D (D DBBH 4cpyBBA A(G0(F ABB`dy0BBB B(D0A8IP_ 8G0A(B BBBK 8G0A(B BBB8hdzBBF A(G0 (F ABBE Ld{BBG B(A0A8JAc 8A0A(B BBBJ Ld}BBF A(G0 (C ABBH D (K ABBL HDe}BBG B(D0A8G@ 8F0A(B BBBB He|BBB B(A0A8D` 8A0A(B BBBF (e>AAL  CAI f=A{4$f(aBBH A(I0D(A ABB(\f`8AAL P AAH fta0fЇAAD ` AAH WAA8f,BBD A(J0i (A ABBF L gzBBE A(D0 (A BBBD h (C BBBG @\gЉcBBE A(D0M@ 0A(A BBBE `gBBE A(D0 (A BBBJ l (F BBBH f (A DEBF h(AhD0h'A(Hh AAL` AAA LthoBBB B(D0A8J 8A0A(B BBBJ ,hAAJ AAA h?A}@iTBBG A(D0D@ 0A(A BBBG @TiؙBBG A(A0G@~ 0A(A BBBF Hi4cBBB B(A0A8J@ 8A0A(B BBBF @iXBBG A(D0D@ 0A(A BBBI 0(jBAF G0T  AABH \j@eAc(|jAAJP| AAF 8jDuBBD A(JP (A ABBH `jDBBE B(D0A8O@ 8P0A(B BBBM D 8A0A(B BBBB |HktBBB B(D0A8LP 8A0J(B BBBL H 8A0A(B BBBF ` 8G0A(B BBBH @kBBB A(D0J@C 0D(A BBBE L lPBBD A(J@@ (A ABBG  (A DBBG 8\lyBBA A(JPN (A ABBD Ll$BBB B(D0A8G4 8A0A(B BBBF lldBBD A(J0u (S ABBP U (A ABBE U (A ABBE i (A ABBA XmNGpmLMFm3PmABAE s ABB M AFD a ABD _ ABF Pm79BBB B(A0A8GL6 8A0A(B BBBA DnlAG R AE hnD|nBBB A(A0D@ 0A(A BBBB nhDI(npVAAL e FAF o$Ab($oBAD  ABG HPo,ZBBG B(A0A8Gpd 8A0A(B BBBD o@NALotAAoIAGo>A|H pBBB B(G0A8LP# 8A0A(B BBBG XpD=A{tphGAE0pAAV k GAM qCA$p8DAAL mGA0p`AAQ o DAI hDA@ qBHH R FBD y FBG LFB0dqHAAG  FAI LDA0qAAL X FAC dKA8qP|BBF A(I@ (A ABBB rOAx G N0(rvAAP J DAG DDA\rAQ F j0|r@AAG Q CAB XFArAr E D8rBAC o FBC d FBD < sAAL  DAL D DAG hDALs@oAmHlsBBE B(D0A8JPv 8C0A(B BBBD 0slBAA Dpr  AABB PsKBB A(D0 (A BBBD hB0<@t<BBB A(D0i (A BBBE t8thBBD A(I` (A ABBI Ht~BBB B(D0A8IP 8A0A(B BBBE u w44u AAL } AAC D CAA lu u u 8u BAA T ABE l ABA u ru` vl ,$vh MMAD cABHTv 3chv 9iH|v BBB B(A0A8Gp 8A0A(B BBBD HvdBBB B(A0A8G 8A0A(B BBBD w,wX4@wV K y G X H G I bFHHxw BBB B(D0A8GPS 8A0A(B BBBG HwBBB B(D0A8GPY 8C0A(B BBBG `xBBB B(D0A8GP 8A0A(B BBBF w 8G0A(B BBBI 4tx$kAAJ  GAH k AAK (x@'9AAJP AAF HxT,BBE B(D0A8Pp 8A0A(B BBBK H$y2BBD A(J0^ (A ABBI R (G ABBJ 8pyL5pBBD A(J`_ (A ABBH 8y=BAD " ABD k ABB 8y4BBAD  ABD k ABB 0$zFiBAD JP5  AABF `XzKBBA A(J0\ (A ABBF [ (A ABBG ` (A ABBJ tzNTAD  ABD A ABL C ABR I ABL K ABJ P 4{RKNB A(A0& (A BBBF W (A BBBB  (D BBBF (A BBBKH0{X4{XBAK R ABE UAB |@YAX(|DYAPD|HYAX$`|LYLAAQ qFA(|tYAAOp AAE L|XZBBF A(G0 (D ABBH E (D ABBB $}[`AAQ EFA8,}[aBAF  ABF v ABG h}$]=A{}H]DS}P]LAJ}]AA}].Al}]<A` G S4~]dBAH JE  AABA 4H~$_AAV c AAC k GAU $~|_iAAL VCA$~_vAAL cCA(~`~AAL L FAG L~p`BBG A(A0Y (F BBBF [ (F BBBA ,L`)BAF  CBH D|aiBBG A(A0JI 0A(A BBBH @fBBG A(A0J 0A(A BBBG 0gBAF J0  AABD D<@iBBG A(A0J 0A(A BBBI Hj.BBG B(A0A8GP; 8C0A(B BBBC Ѐl=A{4lkBBH A(X0(A ABB$lT$84mBBA A(I0(`mAAG N AAG HnBBB B(A0A8G@  8A0D(B BBBB (؁oBBE A(A0Hhp6BBB B(D0A8GPr 8A0A(B BBBA HP\uBBE B(A0A8Dp 8A0A(B BBBC L0z;BBE B(G0A8K  8A0A(B BBBD  D@BAD ` ABF J DBH QAB$DxAAQ lAAl2aPAP6@4BBE A(D0M@ 0A(A BBBD H0BBB B(A0A8G@ 8A0A(B BBBF \Hԑa BBB B(A0A8Gx 8A0A(B BBBE HZB(pbFAG BDA<BBB A(A0d (A BBBA 8(BBD A(L0} (D ABBE Ld8BBE B(A0A8J_ 8A0A(B BBBH Aa F ԅXRAA N A bFw K Xq,P+@lD0XSBAD N0  AABA HL BBE B(D0A8J[ 8A0A(B BBBA ԿH g A ~ B D,P*@lbHTBBB B(A0A8D@ 8D0A(B BBBF L BBE B(D0A8M 8A0A(B BBBA \=$%AAM IGA$@CAAM hFA$hDAAN qGA([AAJ0LAA4JAG  DAO pAU$8 LAU4hJOAJ U AAG IAAE ȉTAJ B AA H&BBE B(D0A8F` 8D0A(B BBBH `PnKBH B(D0A8JPP 8D0A(B BBBE CP(:FAG bAAFdUHBBE B(A0A8DP 8A0A(B BBBD HD(BBE B(D0A8N@r 8D0A(B BBBC LlhBEB B(A0A8HV 8A0A(B BBBA 4BBD A(D0l(D ABB3,,rMDC TABEL\`7BBB B(A0A8GN 8A0A(B BBBG ,PAAG a CAB ,܌AAAL i AAA D BEA K ABJ U CBF SCBLT(BBE B(C0A8R@ 8A0A(B BBBA  DBBD A(J8A@Q8A0 (D ABBI ,qPT D cEHX4L 0d(9AEF U HAF DCA049AAI R HAJ DCA̎@TLqBBA A(D0p (D ABBE D (C DBBI H4BBB B(A0A8GM 8A0A(B BBBH (JAD  AAG g0@>JAD : AAE ot8@&T@7P@KBB A(A0 (A BBBF uF0A6HA|4BKBB B(A0A8DpO 8A0A(B BBBH  8A0A(B BBBA oFp0[@JAD0 AAJ ,̞\WAD  AAF `H`]>BBB B(A0A8DPI 8A0A(B BBBG <HTa~`AD  ABH hP Pd7TBA A(D0 (A ABBG PP0ܟfg@guKBA A(G0 (A ABBB DHi\AG  AAG f FAC @P (jn\G  AI pP knLРBBB B(D0A8N 8A0A(B BBBG XL DPAA  ABD M ABH HH j CBI HTERBBE B(D0A8N@ 8D0A(B BBBC HhFNBBF A(I0 (D ABBA T(D ABB@lGTxG HhtGBBB B(A0A8DJ 8A0A(B BBBF HHBBB B(A0A8DC 8A0A(B BBBE O8ObZBH A(G0-(C ABB8PLPsVAD { ABG ACBJ8PBBA A(D@ (A ABBA ȱQD`O E 8xSrBA A(J0n (A ABBD d TBBB B(A0A8D`X 8D0A(B BBBM  8A0A(B BBBF 0dVAQ AADH 4W@AD ABDH |XYBBI B(D0A8G` 8A0A(B BBBG  8D0A(B BBBI 1 8A0A(B BBBE (t[fAU cAAG |\lAD Q AI ij\س\\\\(\4<\BBA A(D0(A ABBPtH]BB A(D0 (C BBBA `H0ȴ_BBB B(A0A8D 8A0A(B BBBF 9 D^DpDMA^DaE{DQBH\x/BBH B(D0A8DI 8A0A(B BBBF LyUBBE B(D0A8In 8A0A(B BBBG L}BBD A(M0O (C ABBC  (C ABBH LHD~BBD A(M0O (C ABBC  (C ABBH PBBD A(S0O (C ABBE  (C ABBD AWĀ DBBD A(D08L@N8A0D (D ABBK <dhjBAD G0k  AABC e AABzyu J ATķKBD A(J0G(C ABBEH0](F ABB`PUBBE B(A0A8D@ 8A0A(B BBBK W 8F0A(B BBBJ HLBBB A(A0Z (D BBBD [(D BBB\̸EBE A(A0c (F BBBC Y (A BBBH \(F BBB, @,T8;hd;|,H G ] C  F a G pTBBB B(A0A8Gk 8A0A(B BBBJ IDGLFDB]\RpAAI B AAA W AAG R AAD R AAD e AAI e AAI e AAI e AAI eAAYAW$HaDK A C E HT<BBB A(D0G@ 0A(A BBBE ^0A(A BBBTBBB A(D0G@ 0A(A BBBE ^0A(A BBB33tؐBBB B(A0A8G, 8A0A(B BBBI DBDDDDB`LBBA A(D0~ (C ABBH D (C CBBA LܼBBE B(C0A8GN 8A0A(B BBBB L,BBB B(A0A8FPW 8D0A(B BBBD |0BAA J  AABK 4ĽxBAA J*  AABD LBBE B(A0A8Jm 8A0A(B BBBB LAM V AK LpBBD A(P0E (D ABBI L (A DBBA ḶBBC A(P0N (A ABBD G (A ABBA X|BBD A(O0g (D ABBH K (D ABBD L(D ABB`l BBB B(A0A8D` 8A0C(B BBBG  8A0A(B BBBH dпBBE B(A0A8G`K 8A0A(B BBBG d 8A0C(B BBBA $8$GAV I W I F@`LBBE A(F0P@ 0A(A BBBI Lح1BBE B(D0A8L8 8A0A(B BBBB ȯ@Al C O iAD` AG @84KAA E ABK pCBKP |9Eg D H9Ef E H$0RAAO ~AA4hBDD n ABE w ABA 8EAA g ABG y ABD (X4BFAG kAAEX 0TBAD J0O  AABD "DP D 8$JDD z DBF XH L$ضBBA A(D0U (D ABBA w (G ABBD 4tRAM DAAJ@ f0 ,{$й9{$h<hPldx@xBBE A(D0 (A BBBG AD0w A D-`+|HxBBE B(D0A8G`9 8A0A(B BBBF (`< AAD a AAG lWRGHs\lABBE B(D0A8D> 8A0A(B BBBD N{A\$,8A D y G d D fhdL|`BBB B(D0A8GZ 8A0A(B BBBH 8BAA  DBG [ ABB 8d"AAG  AAG KAADXX.t`l@BBE B(D0A8Gp 8A0A(B BBBG ~ 8A0A(B BBBH H|BBE B(H0A8Pp 8A0A(B BBBE L BBE B(D0A8Q 8A0A(B BBBE lw.O.bPNA@A9`RBB B(A0A8G` 8C0A(B BBBE D 8F0A(B BBBE 0BAD S  AABA (PD.]SAJ yAAAD|hBA A(J0(C ABBAH0LHBBB B(D0A8J4 8A0A(B BBBK (BAH xMB8@|BBF A(T0 (C ABBI 4|PKAD CBFC  H K FL BBF A(L0  (D ABBA  (D ABBA ($ cMBAA D0  DABL   CABF   DABJ   AABE   DABE   AABE   DABE G  DABE XWKBA A(D0 (C ABBH `(C ABBHH00Y[DVHHdYBBD A(J0 (A ABBD T(D ABBH(ZBBB B(A0A8Dp 8A0A(B BBBA 0Z9Ni I pHy G ^ J [(d\<p\#P\&d\&(x\BAA j ABG ]6At8]BAD 0 ABF A HBE (0_AAK  CAD `(_+BBE B(A0A8JBAHN 8A0A(B BBBD (pAAD H AAH $$YAZ fHAZcv(v[AJ W AAA 4(D?AAJ  AAA F AAH `LrAp|%TP0ЎeG x AK Y AF RFHDlbAJ0r AAG RFAGX0YAA8'L"H`BBB B(A0A8Dp# 8A0A(B BBBE pAE|PBBE B(A0A8Dp 8A0A(B BBBG J 8F0A(B BBBG ~ 8F0A(B BBBK ,\pOBAD * DBI >A4^BDA @ ABF JAB<P dDN,|rKAD UABHH`BBD A(G0r (A CBBF d(F ABBDԗBBB B(D0A8M`8C0A(B BBBD@lBBE B(D0A8J`8C0A(B BBBHBBB B(A0A8Fp 8A0A(B BBBH 4YBBD A(Q0x(A ABB 4L`tܜ؜(Ԝ<МP̜dȜxĜA]zFmEl =BBE B(D0A8GP^ 8F0A(B BBBD LX``KXAPi 8C0A(B BBBK dLUBBE B(D0A8Dps 8A0A(B BBBG W 8F0A(B BBBB    ܠ2F_  04AAD  DAA fDAHhBBB B(D0A8G` 8A0A(B BBBD 0(BAA D@  AABD @BBB A(A0DP 0A(A BBBA $,@jAD0U AE T(hAAFP AAI XLBBB B(A0A8G 8A0A(B BBBI (ԪAAT0S AAE 0$HBAA D@t  AABH XԫqD T H 0t8lAAF | CAH VCALt BBH B(A0A8Jy 8A0A(B BBBC HBEB B(E0A8GP# 8C0A(B BBBI HD(IBBD A(G0 (A ABBE u(F ABBH,kBBB B(D0A8GT 8A0A(B BBBF 4PBAD M!  AABG :8(_BAD V ABH sABd x H)BBE B(F0A8TP 8D0A(B BBBF H BBE B(D0A8NPW 8D0A(B BBBF 88TBBD A(Q@ (A ABBG t(AN A W(^AW8lBAA v ABC X ABE 4AAD D DAA R HAM p$xBBE B(D0A8I h 8A0A(B BBBE ' J _ A  J _ A H{BBE B(D0A8IP 8D0A(B BBBH 4(BAA { ABN aABLBBB B(A0A8I 8A0A(B BBBI ,l@KAD ABG(FAG jAAFD$KBB A(A0 (A BBBB P,KDA }DBT@L&BBB B(A0A8D@THAPIXB`O@8D0A(B BBB`$BBB B(D0A8GP  8I0A(B BBBI :XA`IhBpOPHBBB B(A0A8DPi 8D0A(B BBBD (HBFAG oAAAHt([BBE B(A0A8D` 8A0A(B BBBD < X8BBE A(D0N@I 0A(A BBBC e 0A(A BBBC 00)BAD O`  AABE ldBEE D(F0z (A BBBI ] (A BBBD S (A BBBF O(A BBBh2LBBB B(D0A8D@~ 8D0A(B BBBD H<RBBB B(A0A8Dpr 8A0A(B BBBF H8BBB B(A0A8DP 8D0A(B BBBF  LBBB B(D0A8K* 8A0A(B BBBD (84AAF@t AAB d|GDB*FY'DV F F$GAAJ pDA ceBB B(A0A8I@8A0F(B BBBEP@D 8C0A(B BBBH K8F0A(B BBBH BBB B(D0A8JP 8D0A(B BBBG H~BBE A(D0Z (A BBBA A(F BBBP GBE A(D0R (E BBBH A(C BBBA(tHhBAD ]AB<jNEE A(A0C(A BBBDPVBB B(D0A8JPz 8A0A(B BBBA h4H4Ht/WT`t 7Ae J F0,$81AL bA@DXEAA | ABJ T ABI LAB8BAA G CBH } ABH HIBBE B(D0A8G@ 8A0A(B BBBH (AAL0z AAF 4<_BAD H ABF ACB4t(xBAD M CBG TAB,pBAA  DBF (PBAA m ABD HDBBE B(D0A8G`' 8A0A(B BBBH HTBBE B(E0A8DP 8C0A(B BBBJ \ X "D\Hl bBBE B(A0A8Jp 8A0A(B BBBF L BBA A(M0k (A ABBD  (C ABBG (l` AAM AAE LD BBD A(M0q (C ABBA c (F ABBB ( WAG AAAL BBB B(D0A8D 8A0A(B BBBD LdXpBBA A(Fpt (A ABBJ ZxEEHfpxBBH B(A0A8D7 8A0A(B BBBK  DBABDAIBASHVAF`AI QB ' AE Ll-XBBE B(D0A8G 8A0A(B BBBH EHEBBE B(D0A8Jp 8A0A(B BBBG pJ44JBAA ` GBK AFB\l@KBBE B(A0A8DFbAc 8A0A(B BBBH LAWlL BBE B(A0A8G$HaAR 8A0A(B BBBB HQA4\@YBAC JN  AABF Z8[ BBA A(IK (A ABBH D[BBB A(A0DpN 0A(A BBBF ,\1Ao,H\BDD I ABJ 0xt]MAD VFAAP <^KAD  ABK XH ^^X_MGd E \84_BBD A(S0n (A ABBH Lp_ BBB B(A0A8J 8A0A(B BBBE L|i{BBB B(A0A8JJ 8A0A(B BBBH m$$mAAQ _IALnAL$hnDAAJ sCAH 8A0A(B BBBD H( BBB B(D0A8Mf 8A0A(B BBBF LܛGBBE B(D0A8J  8A0A(B BBBI @ܞ%DJB G(D0IHdBBB B(A0A8Dp  8D0A(B BBBH XTBBE B(D0A8JpX 8C0A(B BBBB JxBGGIpL BBE B(D0A8T  8A0A(B BBBI \@JxԩBBE A(A0GC 0A(A BBBC pyHAH^MAEI\BHB]F{xHA[^MApI\BZB]BLDBBB B(A0A8G 8A0A(B BBBE HgBBB B(A0A8D 8A0A(B BBBE HBBE B(D0A8J 8A0A(B BBBF L,BBE B(D0A8J  8A0A(B BBBC L| BBE B(D0A8Mp_ 8A0A(B BBBJ и): $# @!L0 \4BBE B(A0A8G 8C0A(B BBBA H LnBBB B(D0A8O@_ 8D0A(B BBBH  p\ lGBB A(D0b(A BBBGH0` (A BBBA <@! RBB A(D0W (A BBBG ,!BAE D ABA ,!BAE D ABA <!<BBD A(L (A ABBB 4 "BAD L  AABJ PX"@BBG B(H0A8Z [ 8A0A(B BBBK ")""C"DN"LL#C BBI B(A0A8K 8A0A(B BBBA H`#nBBB B(D0A8O@_ 8D0A(B BBBH #\#GBB A(D0b(A BBBGH0` (A BBBA < $|RBB A(D0W (A BBBG ,`$L3BAE  ABD ,$\3BAE  ABD D$lBBB A(D0T 0A(A BBBE 0%(BAD N  AABG L<%BBG B(A0A8I~ 8A0A(B BBBH %/%%(% %L%7BBB B(A0A8J 8A0A(B BBBA H@&SBBB B(D0A8O@_ 8D0A(B BBBH &\&GBG A(D0](A BBBGH0` (A BBBA <' RBG A(D0V (A BBBC ,@'BAE  ABE ,p'BAE  ABC <'BBD A(Q (A ABBD 4'l!BAD Q  AABI P(D'd BBE B(F0A8L< 8A0A(B BBBD l(`10(1TAAD x DAE FDA(22(42H((p2ABAF tAB)23)2#0)2D)2 \)2+E G J)3BBE B(D0A8J@HMPiHHPIXI``@JHPP\HF@P 8A0A(B BBBF  8A0A(B BBBC HPPVHG@FHKP]HF@( *l7ZKAW fEA L*7TMTGChp*7 BBB B(D0A8YrKeBJ]AJ\[MB 8A0A(B BBBH dPdPIBmCA[BFQGcGBSVGqPkAl+@ BBI B(F0A8YK]Ac 8A0A(B BBBE DFJ]CLRIAIE\FC7^HA JR }UGChJjB EQ b JL Pd,RBBI A(D0[_PYAQ 0A(A BBBA h,SQBHH y(H0Z(A I ABF a ABD  ABD D(K0a(C A ABI $-U<BBE B(D0A8G_EEVPrHQ 8A0A(B BBBH {N\BUN|B[K\F(-t]:FAG bAAF8-]BAD ' ABG U ABH 00._AAZ  AAD WAAd.`BBI B(H0A8T_EEVOrS; 8A0A(B BBBC MZASM}Bd.hBBI B(H0A8SP 8C0A(B BBBE XH`_XBPVX`JXAP$`/AAZ0 CAJ  CAF } CAG o AEC (l>`AAZ@ AAA >]AW>/>4/>P>\?h?t,?p @?l T?hh?t |?p ?l ?h?t?p?l?x \@tTBA A(D@H (A ABBF ] (A ABBE HP@h@|@@8@uBAD L ABJ J ABA @8@uBAD L ABJ J ABA 0A\DAh XAd HlA`BBE B(D0A8M@ 8C0A(B BBBG @AKBA A(D0 (A ABBJ WA` ,B\eBAH U0@ AAB4@BbBBD H(J@A(A ABB,xB]BHA X0u AABBBBLBBBA A(G0g (A ABBF b (C ABBF 4C HHCuBBD A(G0~ (F ABBG L(C ABBCCCCCC D D 4DFHDT\D`pDlDxDD D|DDDE#$E#8E}LE0`EtEx E$ T,Ep {BAA  ABB E LE BBA A(D0L (D ABBA U (D ABBB 0F LDF( rFEE D(A00 (A BBBD A (I BBBH XFXBBF A(D0D@g 0D(A BBBK 9 0D(A BBBD FFNP J RF(GAAD  CAF 4@G BAA  ABK AABxGA8GH(BBA A(G0@ (C ABBK (G<dAAG   CAF 4G&BAD  ABO NAB44HxAAW s CAH g CAE PlH0_AAD D AAL  CAH r CAB g CAE (H<AAI DA,HBAH  ABa I BFt8I!BBB B(A0A8G`hcpI8F0A(B BBBF` 8A0A(B BBBG K 8F0A(B BBBF pI(pBBF B(D0A8DPmXK`dXAPXO`AhBpBxFPP 8D0A(B BBBE (0J0JAW IA\J2/<pJ2DBBA A(Q (A ABBH $J5AAN IAJT62ApJx6K6K60K61DK6XK6lK6K6<K7<(K47EDA t ABG K7eHKT8BBE B(D0A8J 8A0A(B BBBE L4L:BBE B(D0A8P` 8A0A(B BBBH L< L BBE B(A0A8G 8A0A(B BBBA DNEDYKBDYgOEDXhNEDYOEDXNINI,N I 8DNIBBD A(G0 (A ABBE LNIiBBB B(A0A8G 8A0A(B BBBA XNQLBBB B(A0A8D 8A0A(B BBBF DPTA ,OR|AJ@j AA POlRdBBI B(D0A8RXP`JXAPXG`GhGpGxGKP|XG`GhGpGxGKPXZ`EhEpExEQP 8C0A(B BBBB D8F0A(B BBBP,U/PHU <,P@U<EBB A(D0 (D BBBA (lP8OIAQ nAAA,PVBAA a ABH 8PVBBD A(G0m (A ABBE pQHX BBB B(A0A8G_FUBFPAJ 8A0A(B BBBA 8xQdDBBD A(GB (A ABBH HQ?#BBB B(A0A8G8A0A(B BBBLRfBBE B(D0A8P 8A0A(B BBBG XPR\mgBBB B(A0A8J 8A0A(B BBBC yPTALRpoBBB B(A0A8G 8A0A(B BBBC LRvBBB B(A0A8G 8A0A(B BBBC LLS|nBBB B(A0A8G 8A0A(B BBBI \SE BBB B(A0A8GPRC- 8A0A(B BBBF \SЌBBB B(D0A8GVJ`A 8A0A(B BBBB \T\BBB B(A0A8Jh]SAmHHHHHK}HHHHHK 8A0A(B BBBF HB`BRFKBMVAK\Al8UBBI B(H0A8TPUXM`VXAPl 8A0C(B BBBC D 8F0A(B BBBE UGdU@SBD A(N0w (A ABBK P(C ABBHH0D(F ABB4$VgBAA V ABC ACB\V!DDB V|VПV̟Vȟ/V LVBBG B(F0A8QF 8A0A(B BBBK WP0W /DW(XW4dlW*FZ`W BBB B(A0A8DPp 8A0A(B BBBH x 8D0D(B BBBH HW@BBG B(D0A8Gc 8A0A(B BBBJ 48XabAF _ ABE IAB4pXܳabAF _ ABE IABLXBBB B(D0A8D 8A0A(B BBBC XL YBBB B(D0A8D 8A0A(B BBBK \Y`XpY\jBBD A(Q0[ (A ABBE D (A ABBF D(L ABBTYp`KBE B(D0A8PP 8C0A(B BBBH JL$ZxBBB B(A0A8Ml 8A0A(B BBBC HtZ8`BBB B(A0A8DP 8A0A(B BBBH HZLBBB B(A0A8D`  8A0A(B BBBH ` [BBB B(A0A8DPz 8A0A(B BBBF d 8C0A(B BBBA Hp[ BBB B(A0A8D`P 8A0A(B BBBH L[`ABBG B(D0A8K h 8A0A(B BBBA  \`<K`E(\\<\DP A X\t|l\m8\8dBBE A(D0{ (A BBBH \l\X&\t&\]4$]JfAM  AAK PP \]np]OBBE B(A0A8DP 8A0A(B BBBG d 8F0A(B BBBE l 8F0A(B BBBE l 8F0A(B BBBE H 8C0A(B BBBD  ^F(4^BFAG gAAI`^<FBB E(A0A8DP~ 8A0A(B BBBC  8F0A(B BBBE l 8F0A(B BBBE d 8F0A(B BBBE H 8C0A(B BBBD _R8X4_7D0Z B P_2F^$l_WAAD NAA,_BEAA wAB_(F_d_& `,FIh G FB8$`XJBBD A(M0 (A ABBD ``lF0t`NJA x ABD h8`*BBD A(M0* (A ABBJ `xf` a@ aNED A(G0~ (A ABBE h0daNJA x ABD h0aNJA x ABD h0a`NJA x ABD h<b<BHB D(D0 (A BBBH <@bFBB A(H0 (A BBBK 0b NJA x ABD hLbmBBE B(D0A8JPc 8D0A(B BBBF cDn F x$ch #BBE B(D0A8Lp 8A0A(B BBBH l 8A0A(B BBBB H8A0A(B BBBc,cQe D ^ J `](cAAG r AAC Hd<ZBBB B(D0A8JP 8A0A(B BBBK \dPpd\JF}ETdOBD A(A0J (A BBBH U (A BBBA GDd5OBB A(D0 (A BBBI _,eMBB B(D0A8G@H@n 8A0A(B BBBH E 8A0A(B BBBI | 8C0A(B BBBH 0e BAD JP  AABF eUD0K A HfBBB B(A0A8DP 8A0A(B BBBG \\f@KBB B(A0A8DP&8A0A(B BBBIHP(fBAD z ABD f$(Hf@ BBB B(D0A8HPL 8A0A(B BBBE HgI\g@zpgz8gBBD A(L@ (A ABBD @glBBE A(D0L@ 0A(A BBBB h P4h!BAA  ABG YFBHThx",BBB B(D0A8RP 8A0A(B BBBH (h\%bAG n AAG h&hl'HhX(zBB B(A0A80F(B BBBH@i )dTi)BBB B(D0A8GPX 8A0A(B BBBJ d 8C0A(B BBBH 0iP+BAD JP  AABF 4i,AAJ m AAE S AAK 4(j-AAJ m AAE S AAK @`j\.AAJ m AAE S AAK [AA(j/7AAGP AAB (j,07AAGP AAB Lj@1KBBE B(D0A8G 8A0A(B BBBB LLk@4BBB B(A0A8D` 8A0A(B BBBH 4k:BAA G   AABA Hk; BBB B(A0A8Jo 8A0A(B BBBC L lH=BBB B(A0A8G 8A0A(B BBBB Lpl O}BBB B(A0A8G 8A0A(B BBBE lBBB B(D0A8Dr 8A0A(B BBBC L$BBE B(D0E8Hi 8A0A(B BBBA HhcBBE A(M0O (I ABBD b(C ABB6NXL̂@tBBB B(A0A8D 8A0A(B BBBA HpFBBB B(A0A8G 8A0A(B BBBK htFuXdBBB B(D0A8G 8A0A(B BBBD L`LA<.BEE H(A0 (C BBBD ( FAAN AAD LD` OBBE D(A0\8I@R8A0A(A BBBPBBE A(D0JjHZA` 0A(A BBBC iAgDM G 4rF[TP<BBB B(A0A8Dpt 8A0A(B BBBD KxQKxAp0BAD J0u  AABF @܅`AAJ0t AAF D OAL \ OAL l BBB B(A0A8DPK 8A0A(B BBBE DXM`YXAPO 8M0A(B BBBH (,dAAJ0P AAA \poBBB B(A0A8DMPXAh 8A0A(B BBBJ \BBB B(A0A8J 8A0A(B BBBK YIVA\|BBB B(A0A8G0HZAz 8A0A(B BBBH t܇BBB B(D0A8G 8A0A(B BBBE AEFbABAiT hDLA B(A0IDB B(E0I\BBB B(A0A8J 8A0A(B BBBK YIVAt |BBB B(A0A8L  8A0A(B BBBC AKF\EQDAStBBB B(A0A8L  8A0A(B BBBC AKF\EQDAS`,`BBB B(A0A8M 8A0A(B BBBD 2QDASHt(BBE B(A0A8H 8A0A(B BBBF HBBE B(A0A8H 8A0A(B BBBF 4 @BAD P ABF XAB(DhAAJ0b AAH p 8PAD A ABG ABF4kBAD K ABK GAB4$cBAD F ABH GAB0\PFAAP P AAD [AA4lcBAD F ABH GABLȌBBB B(A0A8J 8A0A(B BBBH HQBBE B(D0A8Qp 8A0A(B BBBA @d(oBBE A(D0Jt 0A(A BBBD LT BBE B(D0A8K 8A0A(B BBBA H BBE B(D0A8G 8A0A(B BBBE D(X$l*20TAAD x DAE FDAȎ4܎@AVDAA0*FV4LKAD v IBO `4:KAA  ABJ h0DAAJ M AAE UIA6AR E YL$BBE B(D0A8Ki 8A0A(B BBBB Lt8`BBB B(A0A8G  8A0A(B BBBH ĐH1DT(ܐP1GAAJ o AAC 4t1DBAD O ABG \AB@1BBE B(D0A8QP| 8A0A(B BBBI | 8F0A(B BBBE U 8A0A(B BBBA z 8A0A(B BBBL lԑ2vKBE A(D0i (A BBBI R (A BBBG F (A BBBC pΠD3LBB B(A0A8D@ 8A0A(B BBBL I 8A0A(B BBBE  8A0A(B BBBH D 8F0A(B BBBE ``4KBE B(E0A8PPs 8C0A(B BBBG PPL 6`6t7WHd7BBB B(D0A8P 8A0A(B BBBF `ԓ9BBB B(A0A8DPt 8P0A(B BBBE I 8A0A(B BBBE l8:BBB B(A0A8DJRA 8A0A(B BBBF JXAld=BBB B(A0A8DHRA 8A0A(B BBBD HXAh@RBE B(D0A8P@FHHPRHA@D8A0A(B BBBAH@d@BBE B(D0A8RpF 8C0A(B BBBD DxHXxApGxHVxAp0CMAJ qAAEH H CEBBH B(A0A8Dp 8A0A(B BBBK TlE"BBE B(D0A8P@V 8A0A(B BBBH RHHPRHA@TĖhF"BBE B(D0A8P@P 8A0A(B BBBF VHHPRHA@H@G/BBB A(D0U (A BBBI r8L@R8A0Hh$HbBBE B(D0A8O@K 8C0A(B BBBJ \HIIBH A(M0K (G DBBE N(A ABBDH0\xI/BBB B(A0A8GHZA 8A0A(B BBBB ltHMBBI B(H0A8P 8A0A(B BBBE DH\AH[A(SAAG AAG 8TBBA A(G (A ABBD (LPVAAD AAB <xDW8BBA A(G (A ABBG LDYBBG B(A0A8N 8A0A(B BBBD 0`AAL O CAG CAL<`BBG B(A0A8K 8A0A(B BBBF L0dBBG B(A0A8N> 8A0A(B BBBK Hܚj BBB B(A0A8G 8A0A(B BBBI H(k BBB B(A0A8G 8A0A(B BBBI 4tm BAC GP  AABF 0 xBAD O@  AABK 8|zeBBF A(K`R (A ABBB 0|BAD G@P  AABF P~/Hd~BBD A(P0q (A ABBH [ (D ABBL L~BBB B(A0A8D8 8A0A(B BBBH L<BBE B(D0A8JN 8A0A(B BBBA @Pl\BBB A(A0DP: 0A(A BBBB HBBB B(D0A8PV 8A0A(B BBBC HBBB B(A0A8GZ 8A0A(B BBBK ,`"FQPHt BBB B(A0A8GL 8A0A(B BBBI $2AAJ aCAĞ3L؞4hBBE B(D0A8G0 8A0A(B BBBG H(T=BBE B(D0A8M 8A0A(B BBBC @tH BBB A(D0G 0A(A BBBG L̟BBE A(D0U (A BBBF _ (A BBBJ `0;BBE B(F0A8PPP 8A0A(B BBBD m 8O0A(B BBBK xtp`РlBBB B(D0A8MP> 8A0A(B BBBF r 8A0A(B BBBD 4 H*F]E0dBAA Ts  AABA @BBE A(H0M 0A(A BBBK DܡBBB A(C0L 0A(A BBBB $84L`lthNkO,N] E K E K E K E K4ĢhzHJ Q AAA N 0v{AJ y ABF 0,D^X^l@DܫBBB A(D0G' 0A(A BBBG HȣBBB B(A0A8D 8A0A(B BBBA 8f@(!BBB A(A0Dy 0A(A BBBC |lfVAD M AAF  AAJ D AAJ D AAJ D AAJ D AAJ DFAELp BBB B(A0A8GX 8A0A(B BBBE <^P d x),84ȥdܥpL|BBB B(A0A8G 8C0A(B BBBA @\TGBB A(D0b(A BBBGH0` (A BBBA <RBB A(D0W (A BBBG ,BAE " ABC ,$BAE " ABC LTBBG B(D0A8Gm 8A0A(B BBBH LXBBG B(D0A8Ge 8A0A(B BBBH LwBBB B(H0A8L 8A0A(B BBBH LD(GBD A(N0C (A ABBK D(F ABBALh~GBD A(N0B (A ABBD D(F ABBALGBD A(N0C (A ABBK D(F ABBAL4GBD A(N0C (A ABBK D(F ABBALGBD A(N0C (A ABBK D(F ABBAPԩXGEE D(A0K (A BBBH A(F BBBA(>L<~GBD A(N0B (A ABBD D(F ABBANL,~GBD A(N0B (A ABBD D(F ABBA\NL~GBD A(N0B (A ABBD D(F ABBALT~GBD A(N0B (A ABBD D(F ABBANL4~GBD A(N0B (A ABBD D(F ABBAPdGEE D(A0K (A BBBH A(F BBBA\\RBE A(H0U8l@M8A0O (F BBBD D(C BBBH`BBE B(D0A8G 8A0A(B BBBF H$ABBE B(D0A8G 8A0A(B BBBF T(Lh$ BBB B(A0A8G 8A0A(B BBBF 4AnLԭyBBE B(C0A8Op 8A0A(B BBBD H$BBB B(D0A8G 8A0A(B BBBH tp1BBE B(D0A8LVBGS 8A0A(B BBBH LNBES`BBE B(D0A8JPBBS` 8A0A(B BBBD LL [BBB B(D0A8M 8A0A(B BBBD l0BBH B(A0A8G 8A0A(B BBBF WE`AGIhAl BBB B(A0A8IO_A 8A0A(B BBBG \W_A| )  :D #̰` !L| BBB B(A0A8Gj 8C0A(B BBBA H0 nBBB B(D0A8O@_ 8D0A(B BBBH |!\!GBB A(D0b(A BBBGH0` (A BBBA <|#RBB A(D0W (A BBBG H0L%BBE B(D0A8DP 8A0A(B BBBF H|(BBE B(D0A8DP 8A0A(B BBBF LȲ*BBE B(F0A8J 8A0A(B BBBF L-{BBE B(F0A8G 8A0A(B BBBA Ph$1BFB I(A0F8GL 8A0A(B BBBI l`6>BBE B(D0A8GPXC`KXAPu 8A0A(B BBBI  8A0A(B BBBG ,08oBBI B(H0A8Q 8A0A(B BBBD @LCTf~FE'_dB P|BaPKB;HACAHVKeBBI B(H0A8S`\h\pThA`khopJhA`hOpYhB`Ch\p]hB`V 8C0A(B BBBE HhKpkhB`hPp^hA`_BBB B(A0A8GYPA6 8A0A(B BBBH EBBN \QAdGDvR[BOVBHZB8\}BBD A(G0o (D ABBH Td~A#BBI B(H0A8[hImBAXkA 8A0A(B BBBJ RIsAPQB@MFXMNN_L`A\\BnEuBN`A)P[ARNZA FkBNKAFWAOVA\\BBE B(D0A8OCOA 8A0A(B BBBC <PBAD G0  AABE 8O@e8F04wNAD CABGP ȸܸ'BBB B(A0A8G\xBSxJAPkB% 8A0A(B BBBI M PdAWXBPrAPj}BR[AWDSB4̹ vZDK h AAE DFAEhDTpDTH4xBBB B(A0A8G 8A0A(B BBBD H BBE B(G0A8Gp 8A0A(B BBBF 8̺WBBA A(J@{ (A ABBG 0BAD G0X  AABF \<@QBD A(P@o (A ABBC I (A ABBA xB@0BAD P0t  AABA Lл,BBG B(A0A8J 8A0A(B BBBA TBBE B(D0A8DPXD`WXAPA 8A0A(E BBBG I 8A0A(B BBBE H 8A0A(E BBBK TwBBE B(D0A8P`q 8A0A(B BBBE hFpehA`?As D F AI`o AF DAI`o AF XhtBAA G   AABE ` G U A  G W A Ľ/ؽP E< A ,  NAE QJBGL<BBG B(D0A8V 8A0A(B BBBA 4P[DC ABDP Tľ:KHD  FBF Z JBB n ABG UJ <BBA A(I (A ABBE \PAx/L cLE F(A0D8\ 0C(B BBBA i|A E P| MEE D(D0G (C BBBA (C BBBA4dHBBA A(  ABBK D BBB B(A0A8 0A(B BBBA D/ `H l BFB F(A0D8Q 8A0A(B BBBD 0lBAD L  AABA LBBF B(A0A8G 8A0A(B BBBA T|"KBE B(D0A8PP 8C0A(B BBBD HH$$-BBB B(A0A8DP 8A0A(B BBBK H%PBBB B(A0A8D`0 8A0A(B BBBA P & BBE B(A0A8K 8A0A(B BBBG L43BBB B(A0A8G 8A0A(B BBBA :)H$:BBD A(P0q (A ABBH D (G IBBH X:"FQl:h:L(t:BBB B(A0A8G 8A0A(B BBBA xAtABBG B(D0A8Q} 8A0A(B BBBF BIA[PBABXLxDBBE B(A0A8G 8A0A(B BBBA TH)Agp II=DI5AsdhIKBE B(D0A8Jp~ 8C0A(B BBBC CpLNHBBE B(D0A8R 8C0A(B BBBA LlOpBBI B(D0A8Q 8A0A(B BBBB QAAQRFK(R8$RBBD A(IE (A ABBC DR&8XR?BBD A(DP (A ABBB 8SBBA A(DP* (A ABBF HUBBE B(D0A8Oc 8A0A(B BBBD HV BBE B(D0A8Oh 8A0A(B BBBG HhXBBB B(D0A8G 8A0A(B BBBF @\BBF B(D0A80A(B BBB^  ^ ^pAn\<_?KBB B(D0A8J`8C0A(B BBBIH`Ha<BBB B(A0A8JP 8A0A(B BBBG @dtBBE A(F0M 0A(A BBBF L, fBBE B(H0A8In 8A0A(B BBBK $|g[aDxFDheBBE B(H0H8M@r8A0A(B BBBhh0baӡ7 %@/5 EX \ j: pТ` " 7N@cG z `tc?pǣiޣ@hQe7`,H 2@  D 'V n`+ @`+Τykj.j%i;N^0y ]`H G%Fť@@$إ@;*.&? W^ q`{uhCcGƦ`\>s1X `.-@(Ъ`!C )9.@ a i }@-`k#Lb;ɧ`٧]`  *E@>_` t <%b`;g4Ȩ<@K E 0`E6@ Iv(bP  p}s `\!}`=95,ܩ($  9@9(\=[Q6o{,H JĎ788s 8a@i88i`=s0 8 d@ a0c 8ip$8 ĵiP80"88P88#8888!8`$8"`P888@8 888`98ĵ8888*2307P):p5:/: : :9:???????????@@@@@"@&@+@*@/@4@8@=@A@E@I@J@N@R@Y@]@`@?c@h@t@p@y@@@@@@@@@`A!A'A0ABA8ALN>ApLGALKOAPKVAK]AJdA`JBAQnALNG SGPXGP]G"7bG-QiGbp"oGsGкS{G QG`Q@nS?;RAQ<Q;VA>RBBRK7QRQS SSSS"S(S.S5SPa:]aJeaEwY:na >ya ?8SBbbbbEbbSaQ^S?S`bbbbbbbbbbbbbjl0ljjjjjPljjkxlk k/klFkTkekwkkkklkkk! `) `)`) `) `) `)ǤҤXKkgA \ D `E B A A A \ D `E A P  @ %,048<@DX6` P  `6 @  0 Й   f6 0 Й  l6 @ @ Й  o6 @ xIIIIIIJI0JI`JIJI J J#K+8K$`K,KK-K-L+(L+rPLsLLLM%8M*`MM'M/M(N0(NvPNwNNNO%8O*XOOgOkO3O9 PF-HP-F+hP+PPEPQ|8Q}hQQ%QQ<R= R/G57GTG-mG-G+G+@RhRARRzR{S G%G*G*0S XS )S 1S *S 2S x T yPT T T  T%  H* U 0U %XU -U &U .U tU u(V XV V V% V* W W@W`W*HGHdH-}H-H+H+WWWWH%H* XHXpXXXXI-Y- I+0Y+PYYYYZ%=I*78Z8`Z5Z6ZZ[48[%3`[*[[[[ \H\p\\\]0]%ZI*8h @(P @HЗ(X`A AAA`A AA A `AC ADAEA `A A ~AF@~AG~A`}A }A|A+@|A,|A-{A*qA&rA'rA(`rA) rA {AzAzA`zA zAyAyA`yA yAxAxA`xAwAwA@wA.vA/`vA0 vA uA"tA$sA!@uA#`tA%sAHpAI@pAI 4 pA ЂHF  qA Ѓ`@*OqA`)X sA(e sA't sA& sAP@0 %tA$tAp`P@#tA"tAp`!@uA @ȨuA 0Ш vA/ vA. vAP0 xA xA% xA6`{AG`{AX`{Ai`{A}`{A`{A`{A`{Aǩ`{Aة`{A`{A`{Ap`0-F |A,  |A+G |AP0 }A# }A/ }AG ;~AF G~A@0 0 SA _A kAEwADACA A AAȪAԪAAAAA Јp ٷ  !1 ;E O Y `Z@-0 @@@ @@0 ?%\ g#'#)1 ;E OY cDm ww !%EEc11  ioٷٷuOO {;;   !   o6&5DJR bw    #;L Vn"4=Oa kk^vja0BK^lu 3 D Nc}g? e@ $;HJNktw  $'+;FIM\Seio .15L;@AeYHPM:Z;gpeiekf?@isiy,<,,@67p@pß̟ҟ0ٟP0p!0+7pA@K V\0gppv{0 P@0٠@ pҠq it6@6`71@:NL68W&:"6@%6Pk7MKA KA 0I .A.Ao5 ޕ șAP8 oooo~oAfIvIIIIIIIIIJJ&J6JFJVJfJvJJJJJJJJJKK&K6KFKVKfKvKKKKKKKKKLL&L6LFLVLfLvLLLLLLLLLMM&M6MFMVMfMvMMMMMMMMMNN&N6NFNVNfNvNNNNNNNNNOO&O6OFOVOfOvOOOOOOOOOPP&P6PFPVPfPvPPPPPPPPPQQ&Q6QFQVQfQvQQQQQQQQQRR&R6RFRVRfRvRRRRRRRRRSS&S6SFSVSfSvSSSSSSSSSTT&T6TFTVTfTvTTTAE@C`CCCC G0DE@BBJJHPIKGHOPQRTUVpW0XMPLM Y@Y`YYYPZ`[\0\P\\0]@^_`apbcxd eefhik0l0mn0p qqsPt0`t t`vpv@wwOxxPІy`zP|@}@ `0  ` б`Я`P P@p``aa@  5  KA+,`@`GKKR-W@W^bbGCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.data.bss.comment 88TT !tt$4o3> 55@FޕNo~~[ojtBP8P8~0I0IyPIPIP TT TT>  00LF__H.A.!.A.! .A .!i A!șAș!(A! A!) 0!)!