pax_global_header00006660000000000000000000000064122552357540014524gustar00rootroot0000000000000052 comment=9466ff0d7ac54291aaf17160e06dfcddd62fb952 nqp-2013.12.1/000077500000000000000000000000001225523575400126315ustar00rootroot00000000000000nqp-2013.12.1/.gitignore000066400000000000000000000011151225523575400146170ustar00rootroot00000000000000Makefile /parrot /install .*.swp *.o *.so *.RES *.res *.ilk *.obj *.rc *.dll *.dll.a *.manifest *.exp *.lib *.pdb *.dump *.exe *.suo *.bundle *~ *.pbc src/vm/parrot/ops/*.h src/vm/parrot/ops/*.c src/vm/parrot/pmc/pmc_*.h src/vm/parrot/pmc/*.c /nqp nqp.c nqp_group.c nqp_group.h src/gen/*.pir src/gen/*.nqp src/gen/*.pm src/gen/*.setting src/stage1 src/stage2 config.status config.default 3rdparty/dyncall/ConfigVars 3rdparty/dyncall/*/*.a /nqp_const.pir bin nqp-runtime.jar *.class *.jar /nqp-j /nqp-p /nqp-m /nqp-j.bat /nqp-p.bat /nqp-m.bat /jvmconfig.properties *.moarvm MoarVM MANIFEST nqp-2013.12.1/3rdparty/000077500000000000000000000000001225523575400144015ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/asm/000077500000000000000000000000001225523575400151615ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/asm/LICENSE.txt000066400000000000000000000030761225523575400170120ustar00rootroot00000000000000 ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA, France Telecom All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nqp-2013.12.1/3rdparty/asm/asm-4.1.jar000066400000000000000000001343771225523575400167560ustar00rootroot00000000000000PKˈNA180+META-INF/MANIFEST.MF}QO0ߗ?4<Mlن 0 S3^ڵuNpA1>/so3J`Ki4E1 eFȹ˝n$\{B(zqnImV^c ti=(gM%JZx<ꕴFE814xŠ|;ȫyn ZKѭen  3s pSG"thW.e0Hol񗅫vumI)0@pKu/9FGT8O *1gED31i`h`DyLX!jXcE<2$ KdEdUȚȺƺ•>G`Ae5xH]ע?C prxj5onou }a_8I/Sl| ]^Q3%=d®Ve9+`߅l3pG,_pZ^/YC,N9~PKɈNAۖc$ e(org/objectweb/asm/AnnotationWriter.classVkSW~6ˆtUM(b5$_$ KjKi&AK*Z^M/tڙv֙vi?3~}ݍd ayϞ9{9g7spO]u~:su 7ƮL*5.{uPjLbɡsHBt1k fcMmJ G!SD{9҅ r(MJ:,O& zki} iM$p&Lq#H=jq "^B3g'0NCx&jְ`k#p5`357mz+xNc 9 9ؼ8x2h. 6v CC0Cԡdr4NG'(!i Z3A1L7 XfڢH*>N܈ goD:o([|8BuXwF) ^ P =ԮhwaMPi,7@߈qj2>1ZT*MNrɢFwM hbo$?D e!WHY(4$E_ϋ/054OK$kx/tH,uR$5|GYi]u@{=RT?w/riB)I~`VF*YtJ/]Ue\1-p=FN=tYe^pTN*'R *'.C.+ҰDJMJҨE*ߑiC4]V*6 /R)C]V*mv -Rg&-ze=Js8 |L,LgNp+"ٞ y'9ɤ ސpGQfp6+ 7 r;r1D=7cNq Ѯc t_-_ݭ?I| qRlvΣklǦUU&i=Sr' >)3e)4|䔜m锘B>^}ɲ!O%7)$^\1Wsx|=0SOih7잫l馣Y].vE>l^ 4|z",,=S)Ep\,d_Sd)W싨."zed/e/scnPKɈNA۠( !org/objectweb/asm/Attribute.classRQSQ. {6CjS22i&SƘf\t0gYcxC6CsQvν|;9}0$4pozl̆ 5c*^c=OZeX}$]?u= GIQ/y2slTxjyNzW dӉ-r?i~f2)3g~:$p|̳5}.*b0~A<s=QX5uur 3eKMS/6˴>kXY.劢{Rsh\ 7J gF8/]O|-0([Лi̓c'-LZMҢ`7ɏ$nrq帥6NW%/dW@p}6 Npᾀ.1せCܔX'nJH?2Pd z"ePI(;9اf7rp``%.r7g`O{T^AT}дA)A[TDVe҉V1XW1ʍ5/Q(z6:@GBDvi"iY|*^t vDyyYH0"o#I)$5*?҈8IQ.kx:I*GLabIkJbmicʮJ6`-2b[: x Uv1 njc'>r.]YɸjkTm\U?z̏0 !Mslg )|A'FK)|h"͗HD"E?7q"U7zTEBmhvҔǥToC6E^manҁl'=)W:6SӪA DsɡהJ)K/): ࠲W_?w&)h[v=q~@% N4@*NEWו^shѥ3RQV8.<ҺLH(YH}YӶ&VN1$RiO7+aj#mfʈVj]GC2SdgF}W"_fFhu ^/~EyVU|ZRWh?قl!DA1X1,x_ PKɈNAa"Ə]./?3~?qXUCb%>MuwuUuwuUu|zǁ#P Pzq8ry[ 1phfPU7UY]mڒ2mz\hO^2+޷s֒d<ӽ3ӻPYπ\LZպF*5Ih(h YBln.*P$Xg)8DC5ȺU*D,,]|vbg!$(byg#o7;?h6p+=-,6ަ3ܸbuc 6mvt4t'QQVeAO=E}&ʠ1_l#H>!7_1I;{f5wOBwmy)nTAJDudHmcoݚ [P Pݳ+p* bbb{i˩.B/4HG]d|ʿS`ugD)Slctw}L'13Tǻ; 8#bI?//F[wk9wF )?;M NK6Nd9J(T4)dCog2!OGTldb'?(Bb#06v#s;ob#qRmThuEBc,x_'Xma6dm9urFqV#v׍o5Eb8ɒ3[ "M$Ҟd_7KjyʅNBI[{;P= ߾d;>ՏmgS뺥-zdK]zɪ+Yr^ʗuwHlw{bMGӖ/ii[FeK뒵8Qԗ޼ja`6ww'zńHEtv'Vܒ]҅SWԕw/mF&b/DNnO$;qO{k}Găf_&:M8P+Qֵ0NvL4w_*z0̲1ed_qKW_DV$M˖-. :uǓ㪶DSbKe>EhKwBsV-rvok[WB֮YW[ռymM˚X{q3P6ln$-98ϣƌQqtx; UvJ⽽==Pxg\ۂپ=޻948@&FT Ͷ %KP<{Lt'ɖe"J*3!6z۩[6NTR[͕R-m[>Im;&mr0{PD%}2K&249 @|'dڞ]=q7)wAhͅBlڀ`B pYVhDۓ4>/[zDE'$)YMv3=}tL ,\Tm)SJf k/C0J;hzE#DeL}[l5=YUbXd̛o&e\]l %2Lcڿ3+@l}Vh4wuz{e,v)OseifݼgGiOw|g-EJ]ѿsWᐶ#S( S`$=;w]ݙl.0TKd Z'1%W N]vIy"i#niWO^Ȋ Mv l|Ҁ+ 7݀[ aN>e@}|ڀYy3 e`tx@:dt?G:ApR?tOu?:RuxB'uxJ_ T$PEJ\QkXO` ~@ ۠ۄT@=p P|HjI'' 0T &0\H@ .%p: $ HKn1vXaW` _&|r8 שuM& Iw$ߠ7V sL8H̓˄| &|1TGj? p|&O$MWلY&:NPiXg¯I"kMxjLxB&&m` M{XjhWH?A u&/20ۄh4` %lF>E& xp\`22ZMibS*\KK.6XC`'"@?=%@n$p3[J+F[@ m.e;E*n!pVh%%&l2# fSمn6-qWl:k$e7c fAB ,.v&yD7'z)i7z\v/> < 7kݨf+l $p8v [ l#@'+ "$ $p]&paL>? p?!0D1?&pҍGxgܸM.#& \N` 74 XH'p ~HGxCx#% N?bv/Q!pB'0XZ`sm; *TPz%UQb%G,+(ay60-  9BLJ)ۿb"IX)d! Z3Q{f %X!pb#5ՇA#zܱS\|HTc!}/{& nO 'WHcD4qEp3H,c\܈hi0ut:N76ȞBAjӞ" b~RI& VI bzP(ۤ<~*c X.&J܌EA?~~-*{UAQε2kAk{{ h0HСKbb JCqZ}ĉ'P#1`#׆u잂|n(>OHo(xٴ4.FWqY86ø wa -F*,3܌ҒfӲQ.I3oJFM;/,⨂p=yk Q> g*Biې dzLU{1\[6yw qDh aO`Rq)%gQVpbRqZ*w7 a0$^W;" :2ʤ 8A\ ܁/y= g()PFF1L"N<sf⬢-=TJNjqՃXDM9?PG @JƠ3סwG=GQRPWM$?K;e(唡 CKJ}oFYi¨;* sTU&gs&Gi@~ؐrV"-\nkb !dOyArj_ QeƐ2YPT1FOQz6jzU!OgVF(P^Jyܬr"ϣ&`K2jYnNd/K“e۲ua!A]dtF1rG)p!ZnԜey ʶ6:ɢ,ZƢ,qD*JGˢUҥQ9ّ ^VkU Jwx3ͮ TDimdc~v,(Lq~W/ŕgq=i ņ.IÇ^V3r ^VCھ'S 23ciZ4 _TZ1"AtG}H!|-V+0^Y"h؟}y77~U-$egci RfE}Y>jEN g|8PPZ4 *\;, h{̓`X'$dViFiN@i*-OFYq5 FP"h MD aEdѐR_䕂RUgUUu"ʭ* YU|Gïq~{Qr/ QXGQ.Lq#UM^;=&윂tc!%(59:$eIBeqj=X>>^IЂJV tNEu9"n霒W0eQ-;p*LV{rmn;",J툘H#R戔;"@E+/dmy)U^fW9,vH/؝Ѭq#!@!M 7w*Dޥ8 ixlAkzljͤ< LL^+fi[W {FʅF<9{*bodoܪʑ{+$굼,l~>E(=I{I:4`p>jW AJD10u'LM>Ҝq"I duAG0p׆2/TfU )7P4H+~n C7ZIW Cн mYCSUCJcd,1|?x{tA5=!C`JJ*Rx#aUD/0݋_ [At]1̤JWsr7QU8&I"%xgw+@q7h(D6{n50FJ`R>rɚY!K^a?,lY7b֙aܴ`n홤4C͡[ǩ1{rRt4 hr۱X@0GIp#RE |5@GblRc1bAgKCX) t0as6! ZC2lS\ef pv aS4gp-)p1+Zztpn}$`.w† 3Z uVI%f{_7QdwʇK7y lUڸ+*?eBKdB#7AT*~DD0u4wiZAEnTLoMƃmJ)B%5a̱1PqeLX5kd>\J,;<2SJ<a {:)[cy w)21c,x)^Ȑ6FAou+!0)BnS Re !pvI{qGBYHT/fyOu{57`9 B7 Mf0)D7uj?<h^A9OM$ޛ > >6qSAܼ cX2~C4Z 3{j[BܗQ6Qt,>On.pC|5xOs(W|o<)x* rKܑkii*?d+ib3F ac1մM(&ɑX'p C3M~H-Venh ]fJ3 S`3ʶ0P(b`5u^+[CIǡ 1دCr 4Ԗ4;IEUIs،Y` Q6M`b윌r ;ȰYF{%g F*/*k RcYrP^ A1BE b61XDkSE<xBc?P0!+`MĉfO *J(bB:Ug Ğ@(G%8z#p̐(#rWRvXhGhy☿j:[z6H9_PV/c76d`9H8gqC0jj[L`~Gzg!qh~fXK&1^A_A=՟n2h\G?ŘQeqS>ټ /bR5\}2&^ˑǘ;>WOorq3U˅gh~r3m)RC<vfpO-/Rzf-抣<,QcyROBP 0B_6s.> |&}A3VVU5v*"OϞvy* Wv\clFRo=[%Kq+=0~SgId| P[&j醆BKI0Ӆ=<[8/!7ŋ )q)])MK i0I>rXWr.\-ݿ9o:p W~ w]0wN/p& )l(p5a~ҵ/^J4`@~DHwW4MT!*SSDXIri!GٯWEvKgpLݴ>͸*o8 a18\چùfWby ˈOwpm{'̢qb[-J9P輦R+ܕÆGy~#6kEln3!Wa ˟, IeL<,֧61QrkĒ>rI 5vW|ᆻL,=9l39~_O^D/αk K2;o_母 j >DP&]fۅi ^gKJx:SN]KFB< 9kmC3a!ʩQkhxソn[砎Bdc37tpR5gsSzP @ݒ>X.C;;g>kقO>EfclFNgHq>ƦfOChRJql`v4hk9Da"kxT]Tc6v}buc7ϼxqvPKɈNA{|%4$org/objectweb/asm/ClassVisitor.classTmOP~֭ Q1 CB0iDTF3%[A)&(9}aS&.sn}vOחo4 k]Iټt}81* îWvܦe׫켹iױw`jqi+ܫslZ-uUF}p/Lo]fm4V+"q^r`JOkj_wkm;ZnCAFtޱk%,rѠm8IpG@v"0Oo4̺Xo֏MP38#F` ^ d|ۮO`0؉ 76}/m6}i'||y7kQc c #`C n@R0 ( rL)y$L_19)Lc6 n1ag %2"Ò4CXD $Nl~WV1rI 0A E:,:">"ӯq{I=CT>r$:C9N>clbN%rI"U*&)  J S~| uC5e2w:t=<<!$$XP@Nd"t]!h̄)IV"6E7^t[- MB/նF)TdLH8HPKɈNApy_1#org/objectweb/asm/ClassWriter.class[ |T?͒E."*jhD$(Af K$1٨XJڪ+;و.sɟ {9JX%qS:74)i>)v @hhuZ# 'HqK$(B9s N]mm]uv>v^xP[X QA*(&pb},V4+OJ^9 (&Q2 RÕ;IXVx0yn:tx6upe*Ki>Tm"plm4C_oCѬ<AlX@a/qg0Ê5k>Mf,$=8#+A\]ǀj2aLґ} 3[ޜ=ġNkVD )!fwi:v992تV>{bd8PduS_"(b;q8H$ tNm7lXЪXXSx#u, K2~& ȕd8 XUa;Y[-IbLe^)Sʺ+dF69axВA{W Ϊ\T^=V$T/f@F5Mht|S!J}J4)j*omhoGb24`E ~FXiԮnC'Xmu4ql5=Hbݑycʻ&fUF\sGB NT}f6ji:cqq7>>x}?HR A v HZ?#9rnK=d5*3fiW[c.Us 79J-+4\S1Zsa-Zkڗ̓fsǢhp0EtK r4.(tK<$JOVV/)@Vg{|~u/pr7tYnZnZtnMrnFwhtFwitFhԩѽݧ!֨K=ѓ=jOg4FjS~R (,TjuZFQVPN!j)LuZC@M:5K-:ma`4` `,`<``"d@512Ll@`.j "MuDGt)e02Xp]F 唯4p t@{CAK9:]I&{}x*0ru!Ut55ໆm:]K>~Dy:]Gct=@ɡBrT qqW"gP̳?<5jiJ|MTY#s..E_n9U bqXA,IKiIbZR_iJ*v=zfpn^e/[+9GEonjDS~!'XˋL|qr?FAֵu3rc M6V7dxl^ qSpRpCf'{\4zK}n4vf;ǽh3h+ڎ^2 UI!xrhy-$铹z߱wver{2mINdwgfd^{I7J]#l fL4`Gfh~r.wspYՐxo_Sstq[>p6n.܊XYdn xcSVZFF~%lQY 'd[RleIFCĈΚLb;1Ck򰒽]~ܯwxbɹƏ,ƀ']މ{*&]OK-o&h+FT~{?#f >9zOOͤJ9 ?Hn^tdf^*A|[w=brNϟyzXe0˿ O4+!^#p&-z\++87OW$g 4syB,ENk8/iO;`O䁝% I 9,1^0'$D88H7>uȬnt,7GTs7Kϻ955a]Q„-KU:h U;n~𳗟ˮA{Ƈ+'_/ n=*uyp*"8J^Ep붹*F.h).A8^n ySdŧlQ AOS;YTlIRLo"Ä+07 f&Bùe=xVV̌lmlỠqx~EJB9`MLʯ)'/-{w\B|`IޑY#8^~D !S1Ketz:l5-JqJHꕻoO-ۀy,mЋ3mӥ8F9~"u6A#/jcS:RORO^~o+2W+$JA[ ͎kf7Anq>rbef蔕Q. ;ūlV^\llk0ޚƯ$.F'8>1̆ *ق$xMؼ.xYp2:^/dK̄x)!~QS?Kv95/s <ޏVruêw܍:$ MMg]l&TR.ԒR}$">qX]̯FO2͔Lug߫MHW j\p]"g8:fu-s8V{39ɺJ [| .nǻ6#.Aij wMξξL9|ooטڭ4QYS Gv1O'ڀ`tsK~9!0cg|ę9sv7 j43doF^p!1xp,eaZp*`T #j6TˉSMݨ$$! ʖ()z>q2O{227_2+Or6v~a*fi٩nghlTvEab;R.W4S$SJ hvθ֚͵B`aɏ9gxfXfaa31O/Űp7@1|4c0( } 7SG8\E8E]\Ec"-*;J%w&B\>:^J<>w>r#>TbK|Wr@}e#fk\f#w)]ucto@-N?R[Hv6k?XbWSl d˷~>Kve!Kvj& DKk4G3evYc]سG"~MKNޡI[a.ͅX&<%dD. 3vRlrTMp2c8 e8N6/&"7br39G،9E'&jiM,G9R*=s|P$vV/PKɈNAnG qorg/objectweb/asm/Frame.classX}pT?o}o7 $F I4ҀP@k6%YLvfç QߕVQV ITԶtә3isټ [s~u;ͅ@%Qr KdC0] ,2B$p <^Y%7 24qI.E,(h*PEBa( Ҳ 敖;֦xR\/r-[IQJ[-b1tq5EhX|e"YhHmWz}}Gݒ,%w& jn`R^ۯ柿J6%=,>VRECOD\hl͓Ԍ< z3XV?kњԐSԀᚚ(>ih^e ɓHi9Vy}k[Zוђx"UۛHTWIG?+Ib,+Sٕh7q|/-%F d2#ѻH 'RA _S;dgO4꫋GZd|mlWOYlu$cDbx$#!L= %̞ СpADT'ڸ#*S88V\۝}X SX|[hժh+YG}3iaNZ `W\ \;j󿫼.5urRhU jPA4XF 6Vu*ܯz6T*@XG`N7$ g ~BS%^wC_,QH.+~e+g&Sę'B 8Z=mꞭA|q`5) ٠܈6/N1rk[oatlOREأ<'wp3n(|=p,_).Cy N@a)mi< r7؏ i6A{|Q~&NltaZ3 <`\j̊1`A%+f|ʽ%>j1W'ڇ?=}]ta+$incnb&+ yp :uň;tĞ/hhyىD6D0 JqɱT6Hsv ߍAPAA|GE0@gNL5S3pSK|4ϝ8\4 h6 \vrf*'õd(*yNZWGըXWm]qczQF}aaolX pi(3cPx`a42rPiiH]d@Ѕ욁l GPl~#*!+FrmԆ?g]$?*?h U)ѷP8Q:%|Y!uU@Z4$fMt5nAۉY uatmg.y{ T;-,] i+P6z@ФV\Sn}W,Fr?Rv!˿AiNMH#a}#}%k.R+Rn$ ]o}>mgOw >ƪS脜O:x\cx+wE8 ݅Nz3ךg!_٩6O[O;_7?i&x`LGLۋ>iUa dž u!ἅLسrV.䌭dm]]5X?b8|wC$RX߾zNeUyu͖,Wg8g×J* rǮ`^ 10owR2(vCP- 9(s j>4blKx9e4 }"ǣh"+ra eAeDe_wb²ܕb[ Y)&.yMQ u`2?7Ţ/PKɈNA_&&org/objectweb/asm/Handle.classRoP.-adC`:((NƇIԙhL4>XV&0Oƒ&MGϽE]56ss~ <6:U9ݸk6^mV!od7vv^zpK~)CNm= ouc~2}mPPWG~yq`w JvuϻoѸ0yۇӣ:rMʵ~S<ᷔ0=CkZ]x,gݱF ^mLEIUD 8UY98̨pZEC,*HAA9 fKX`Y151nx'PKɈNAx-org/objectweb/asm/Handler.class}QMKQ=/g1}YSMeYY(ͮEE6}-嘓(`R-h0 އ&;s0_6 z=P:s*PI덒[/T_pKw߫~cQ+?nNVn h{/ wUVrOrDsң*PS8B`7X$$$%&4 "1c0a041(LbfcgH0,D`a6 LEU0$/Of)C'Q 'ĺڋZ .Ӆ.l )ҋX%NojYF=E8.Z9n KZF זxĬeX=buԂ,p: agmoI[-9FJ,XRb9+VHñ%gQPKɈNA"] org/objectweb/asm/Item.classRKOQ.m("/ Q7-)ZB4QB7N"teb41,ƅ;5&&V #)9wn;Gds{9y'A\v=pԷtdya%t4ïU+648ZGt@N>u_~ buYVX]`u ^Dp ^4"IZ(lUH I&$+TإNt z:5 B_`>(w3xmqbTUJ",ǘ_+"/"8Z(cXcE3N1Q\ jVs' >`ͬaFOwQ4E1T1%)N.G"Pz0}UWD>ahCE6wHIaFH45 u+ {;#Ì]t YvԡpO>Lp±}rժ\!Z-u0XZo" bPdS?+ydvK~T'2/G#_DQ:|n[dkh|8b^cEDFPND"63^?PKɈNA˖& org/objectweb/asm/Label.classTKSSg~9$DL#DDimZ j5-VÉB0hLkYpRҶ.\Nut3]tх_P9\*2s~^?>ЍJ,Lrl}A!-iEx/OUQ$s];inyfgCΙ-lLLs9xOJO[SDk$8=EْiGRYQ,;:mh,Ykf&d/VBS2YL*3Eca'-Lpn,.Q,K3雡3K_|=,!y`.c윽t(9˹¬Ey qR5#a_Ϙ u` {|GJ@Eе(]IhawU-bsūv@Mzږӧ{5thХ[kxGÑ!3 P@+@Q@u \M` hc ; 5 Ipp1 1Xׇs 0|8~?zpʏ^28FT"èj_N3|0pD@4*h *(*m 䂾}&\Kh{H *>n="G+R86VC>#jȍL ёn]xMksceg* enX9NNܚq6$ki-R2Kd@m<>W`fӻ8(hPM?gGǻW#>Frt+3ݲ/̮SrS .{p{xęt"u'-cEW3I -.j~#v障9O:\wP̉|̴C )5Ry喴>7)N7r#^<] Frzzn'`oJ%WG +gXQ LU9 yyGXsd.$ՎUw0'aG kl`<|LT0h3LհVAư]EQX"^WQ^9:X:A7~?!()5 +Եh"=ZyYym7~04>F/;W*㏰*/PKɈNA{K6A %org/objectweb/asm/MethodVisitor.classRG h"a/!,;1r`@H0Y"=Kt""ͱyk^21Ǔj\;q$[XiRΠ%'[;zs5t:։k_)W2+JJ˸oy]Rߴ$ڮrjۧe6C67#F:YĄ. LC`C\en@X`!81(@XM 0*p |%1F>%;wc=˲{,X>cYayȲʲƲs,',_dY6X6Yyǎ N#uwR:!KO#=0?9j1L\ Lqܐr^_fZ?^/| ,< '=d٣ Gpٿ).!,>9652Yڬir/!˂)P>0 |4Q J m>Q'꟧%α&yoJ :5(O<||Ԡ|mfytEC]n=JNy^ :F=7 ,b~^˪8Nv<3_iEpB/ȕ ''fsTM]MAb,k*62~<'>uS\((01!UU٘f$FLZYZnq9]‰#pԥ/_ 0rA-+w*urkFvveC :k}"9vOD|;nhEtYǏT^YܴF5 S!={Vt]m)w5kQC 5b1Z6[mn!TL]R'q\ev]j\xŬ.z/{qB >znw:!p;6,!Ǐ$y‘yxMZK7b4gi<}\:NQϗ-_LYcVb9'"D씲*0jN_"h$aEwQMzr2PeBY\SWU겮&\R(S/Y+@φb2ZӪf7^F&w=W#/_:sEMcբ\U\RZ) f 9-l~M2JRjjX5qk#+ZVUcqM%6ʹ iM_ڦklZh"UfmZmnfaf~hz6XlFZ,dѣĢ=fZfQE,n=iю ͤ~ ,Ji6- ΥeAOBjo)I)UҵAZ@ RZPjDjt=]+Vn}  pP@lsBQc0` ({zi-Jk!r,~/}]G#j$߃tJ mAap1# xAEӃπ^xN s(uP Ci?ZNt!ǶB\1`_x0 p&f|/L%WT%& ~a VP~" +VE(( /@0RSN0t38 `P*R5,XpWp#o4|V=;.QXOEQ>W\5s}.L=@bz7E8(K(p <#8 psn9nLM/,( 0@1 `89|`<f\0JyIjwDP@B(\ vp^(!;u@~,[H|x˜W̷״wFσ,gtΛtO5a]_=Y|WպJ?2ht|W|nAfht%O>b`ķmxX 6.yBXME+%?^\30./oj?Æ, mX&~6;hTܵ1Xx}gMқ;~Z(/2ڡLSC{Hri6sc9vZggwϦ);;]/R?ݽP9M 9V9#ck,r}dŶy/Cw[=Q)MބXj(w{UG%AX Ogid?olBt/lVhorV}$˖5%ˎd(5~1U{7bs72ɑ}<Ii:S9uQ0>*lݑ4?Nt'ANWvgQ8&aھ8m*H#C#8\?D E.iUӫ:+Ms34BRy7I損PdIE[Q~d\5ocȅ*9,])j_`<.ZhΎ즡S[GQh$u-UrVH}*g&s'lzމKgꙪgaG!ߚlwQ.K#CѬld$c( c +oBQWt Kq8W/*g|T6)w(o}ԑd9N".4񒛸Ma_ـU4F;9zdcXᕍY|ϓ#Xk~o ~f>J\8<@6[ք,qLi98 >$,>, [fIcnv,suMaL)3[ o-r'F>^ae7k=zoG 5>jkT㜧9@uQBeHo*}xr0S)afIA]t 1S*hQ:]5x'O!Je<A/iZȘirVp\U܁0ߑL=", C (sU/5B߀Bjfi +W*4BN(^9\ӏ6Q!4fΕ[&w/-ݨ nlz`;\e9MzAsqwT{ q alU3+6ӓ4u\v5FS&mylS+gmo|0y B tXd a|@1`!@&CWi{M6.g8M̋I¥.\zm[1u0) 3PW.`C|N=L{ R)do%k%[+~zҺw&04E2ԛrH]ݩsEC7n"iHѝZoФwXĮC|JUڬb8_OFk Mjki;\z3c!s'.r7G<mQޠK7-s0[Z,QKs|E9a;9M>W|(۲V=CU3tK33EJ]¥wLiatBX.M^N/yFI.9ޢs2p;eJpFٳNNf& Sbޡ3**܁c8l+M<-an#`aޅ8s}%;ӄKS(?"1OI -C;L`=!P@h 'VYọ/}f@Q_PZ.w.p܅X֍#V9eTg9|M M̞{2w^wj}g^ T|meJCt->r5\vNg~'A [Pq!L.ȰS-(UJV.'2瘛r|bp&bQ 0{ [=A'$P lAօ)6WҝO;IuAOun kWR|lBZqK+Q(p FrL\9S"/878Aﬦ ǎ]DAhWLQ''Da㴡etD2آw8Hg1YK{"j]>LyT3YRwǨqƱ٢jhߜqZ5Gz~3@N / k[ \K#QV7kζ 6c| 8FhU7iv跽—Ic$)wh;抶` w?փPׅ}K(pg;a;Q&7ڌec <&p-%EV\QnSe&Mӝ cMv9^2oװ}dz9i)]fS( *79j'oSwt;= th>[,x>Tְ7avJo6oiH&xG3]h&nm8{*fWOf#Dzst*ϽgcLwW坨_QrgA y  ZҨiZ c&\Q/3Kft^ٌW024"`ӹ粽XFIհj<1Ick}j,̱(Art| У׹Ofh~^R`31r*a hƆF.Pj]9}NWh|$tME8U.SE(6^qq*LU,/ljyMv/ǥK)]Bmk!>{ef#~toN!MG}=;k #"0XOTL;ӹ%&>-ٿ[HD$CXw,J&}z:XEݠ{?f[dZf[fZtЅq~Q2oxO俳}d>Ag@jbJ%ӌ7_ף{8D|9ϿRݐ1z6 S Y:Kjo8@72ymKvoַ֏oeZՒ Kzo2Ɨ6`X}2UF5y#Ps zB*,ᐛ]|'ݓbfG#Y, )gB|x=51m7z;v{qY\|([ܒ-Qxj^wgL'Sڛ)ɔu lw3x&¹〕ˮn=$%UcN=9A{fz{oNgrl#14aJ%p?)rgѣcſj;%FX)C2]'r|ݿ.a=-EG8)cNfevmzjVLڍxȎ nYZ獬uxUd9XQ-aT556bi|DE M,"s)=^AIC7ɛiŝFabRL/>$sz1jy|L4;ֹD{ӕ}Dl$W2S*Uqp>^wӋXXt`3Őقw9|O5^Y##34)rt=%Nx m;󜻎mzʏ~țv1}hK{o4ʽYAO3+'ocZI,V*dVs^m$ijvsv9.b݅z0&Mn9 пD-(f2ԜPH T->ä)w Ƥ;3WeWA4Bm 펙(S(RTk[DS-s.rUs2Wbxe5Z/'dԋQt mi'eec2yYB&+R5pU6V}ΫlY^]붪J u)ﯧM1"|7>eg#I?[ SW? $F}*mDtE01 LX:>ffiKch߆>A<ӝ{'6^"wQ2-\B›(r|-)Z'̰W@w^7&i.43'3zٺNZR ;ۚLmuNSݰWʉp桤1HwbS}Viw~]|Lxj8W^e-hPcڋm)~_XD:W^hG[&io>\[3Gj.},}(rM,Kbv|+ЌOX$v,9kk~}ZiZ>FnW \Bn™;Υ$& 6.π{#eZ0~)Žs&Z,|Q*PKɈNA[d org/objectweb/asm/Opcodes.classew|gMfXc@dw&;2Yvg7%@'E) *Rb z{ͷ#<{Ξs|4m~ 1kN!bD""A}~DQO'A`Xbq@ %FHbD&cqxb1DL!<"CL#D윂Ň,.Yص"]xFJj #{YSdh4uR|÷=W9kZү)35ob+L7ߪk -5]glYňH?J&k0Di&fRf͎,IS镬y3kU&YϵgpR6U_H٦P0F%WZ9N0AE7 ҒfdF;/k˶qLOc\.siq sjC.|sf;ϡSu2-VLɩT׉M5Y"&O)NSaT5R*2 b]`{<՚Wf G&=kr0T)T.3|P*GMϨ @MjJ)ڊ|bX\R.V)7K6q -+I\F+HRŭ +feVdLWML{X8 "gGH[ n=t~JҸ0o)̀.16/VrM[Iy6"L^<sfŤbJRtqIvEvi\;ܩݻ3v ѽp,VtjeNS?,|U893(<7ՈUʢ1¸Ըhz-O cG;US]YIpluHpgq-|]{jwVUy}dcC#mG:nNPd$>nOg%9Q{悔wx=NNNNqK]tz7)o~I;t!Erx.:36OQ)9唜 %'H)!H)䨔ruh\5߹<vr.:3m񢏩{|ă(y{/X^1S-gr.WJxx|oJ|F_l<48v~:$Hu]K/*_`*XbK{YT λ6ײm(U@bLP qA1oO-/>ŽuޜEs{t{n%k:4v\-o:):C}^o@D5&}^SM!n$n"n&n!nw$Vtt: A>XzLk7 E O_-$5Oo~ |x+cᇅW_#?π ?$>A_ Ÿßomzo^ _W~U7 _)^[_z ̷dE; 2~Ƅv}k# q K^HU~Xo/KRrg"8=2"892S"64nFȺe#떫go]x?O@^=~ X/C?~ |V?UoU+["/ ?~~:|3#g&,F?,<FpEx#_)|$|Q›G#| )|W-|JDxIVO B_~1,| /&<Hgy-hOiho>KTph?A .C ,|'g S}xQx"# ~pOx;|JwY)|&<-||Kc_"?Vl1;9/>{?;M _;Jb—>Mxn_/Wrwxg _ ?Wxg _ ?[0k_-||+ࣄo7 >\U77m[˄o~5|k·/*:{¯Gwk^-|Kn/~#"7' ~[ _(6~U]o/>_~~LhOjjf4}G{쐾9nqJ3Vm kTx'Ä b80hTPKɈNAf [org/objectweb/asm/Type.classX |[UNMnmY3֥SHQck*iaiRl)*"(n V | T|7!>P)wIz&||;7rT^D f B`% !LXt#5I`aR$u&FLR;(L4Vc yʚ,. VDH0fP"h#]SIߺFH"7h3œiOtAIҵ֡`bH/5%]6EQ8Qwbp2&-0>.2ncl*ש>?3 cɹOy9cH#`rK9?\xh$CʜCQDX6pyFej+tYb+| =VB  V>n>U \GFQUc |\O(pTz>B- V"8Oa M A [ g` *|>6RtzrTR.TNv8C0 *l*.%m)p9x+Tp%^> R&p`/j10kvgȑs~`b& `Kҹ=2e;z=9x98sD'N@_9*rE"ɗGwb{ Š gXT(6X#,nJ'R|&VY%;elXT`+(z}Tbc0U3a8tBybKZԻc}(1S?Y"Ow, N~7,$oMuwܫ'i1vx*T>:|^,{ ʓ Skhaqz`nkZ/"oԹ)IeR]Z'LbִlnmX|A7$;T$(D6x~ꈶqelj $Qf죇!=`< *EucەnD? /N?mn,Nl{PSSS 6:US9:Z`NfCC;;z{J~2y^w՟Eb^,̃BɩW"Z*נql'\x)ﯸcc8\eG`Q9ѣ/LGOpf`[#67`[+ u`B#BŴ㖴KimiǭiiL=] [0 @Ԗqsewwb:* /ͲGs/iye{´ f-RͲXm,oŴLZ8Lqfч49¶ůy2mܾj?1?ğsg@[(bvkKV|ƬeŧUsTw2 g 2S~{]+*h՜1OgFv]y!3XΚZ~{#gzlN3]kg Ϣ[|-~iucצu"Mۊz?mZ2#lYϰMkGf?6 E~۴uXu^7x'|Wno26ꛊ뭫2*Y2;Ny?iƫuZrLG͸g#WŧF^V &`j7)O aA\W5./Eֶ\.} rnͺ +=g4!^Lx݅^-G`CY:{dj?$%nnQz2+=Q܉*M*i(w%j;Jn0*cFͭng. ⃠JO dg[IԖruԊJ+{jr)w[Lxf+-ԷE\O+3}X3s ZCUcξJ9ue<"hW8Qx PKɈNA^Jd1org/objectweb/asm/signature/SignatureReader.classUMoU=SgbwLR&iG= PSbא8 5$dA&u匣 VTM,$dfT b+$`͸1u}s߻Ό}<6$Dɢ rï뎻vf9RYk5(,II\)SM]1YM$ή;^5k^F,/ ;8b j^;Wa}K riI{;$WʷXUܻ+7%NB{Ra[RUש(kባs/ 杦c".ԝfs*A,rn"XY^?%ȥԙζOT\hѐ%MB"l$8ntcoYk~ϐ0.뵆ל1)4hhCaT 'j4F4D\ng*wtD({wâ_M"J0qq] E5$.kL3"bny& 8Rb,$n5y ! 3||H ОaܷLzxoQ5ɶeqS73H@' @69 3)WhC}z.bbк3W. }.lz2M xHS/? PKɈNA.iL2org/objectweb/asm/signature/SignatureVisitor.classn@Ҵ!In4 p]@J+EҪt\9hVpx(ۡE,s Zy2R^c_Lp!10y06w$y8Utf^ W ygxcX,PM_6tBс޺ 30r-\0O=!Pt^k'G E}Fk˰r$Zmd]j]Mhv5y x9-?糒HS#l5v$t}H<՘{Z9劏E(hZ:R jXKTJ̇:-Ea=tKVDPMj4 >W.x*(XA%i{xBd2 ܛ= h;`hR#J*QXםɯV"6\ ϾC T&Q,Ӹ-a2 v?=`2X#m4zohb7BjXưyePKɈNA N1org/objectweb/asm/signature/SignatureWriter.classSNQm -u)\ZP D~!%hb<-m[G?&\M|8st.JΙo.9 a(Эe6!˕Ym9aİerVϼcJfLmjxyf8+/ 9a({Krtl1]n=WQu0 ge׭=@2;3j{Q^M^o3c߱ cVS qH͎8Mw;zjkVO4#.$&(r/E^u t"ڲ+L7f.: O0!gEބɀl-}q^٪W] teWRM3`2BOzЧ$/ :L )C.2ЮB?@,dcdrd&yu>P *QrqB{-_A}y~k:x`owOa7z j^ nQM˫鄩@@G>":xQh zFtr;~:0}Q7E` Uv#9,R!z1" 7JSfķyEng8WK핽_PKˈNA180+META-INF/MANIFEST.MFPKȈNAXl)aorg/objectweb/asm/AnnotationVisitor.classPKɈNAۖc$ e(yorg/objectweb/asm/AnnotationWriter.classPKɈNA۠( ! org/objectweb/asm/Attribute.classPKɈNA#pY"M1" org/objectweb/asm/ByteVector.classPKɈNAaI` ƟL t1&9[0sq'v"$}1z7f @? 0=6q]z$`t;MQDkfjJ O@Kc;$b͔C/j\fi3)9F2EA+PKɈNA`L-org/objectweb/asm/tree/AbstractInsnNode.classS@7miI[~ X*m)ԟ( $i-  I >8#n:^{F$M!i#HIx?I$HAIŁ;8De{z~ZE®zB(V%f֎)pv%ʚԗ8={e| ܷrB6jvaE$US\ h,"XNUMҙ6ZU{ Ӱw)tp_D9-*m9A9xIRS0풚wq{A9CV* .-;Ց|~#GJޭUk sG?m~tt88ukr8g'8}c Vf}}0y< BzpH.a0 $i@C VH$U5?,I,Q%A;v!O3Fb؃f 9ư>1ۑo2#3Ga8g8ayNk w!O0܍'{JM9/'9ٚ`Rlp`l0rf g{֛PnB;<\ Oh9BW-t`7J(R+nP?4˳d^yF}~==(VB+/#FH?J } ͯ88 K**1 YBtUrcKc@'Yb$eҥ$nK$.ů+RDO*U7*ΆPKɈNA_ &org/objectweb/asm/tree/ClassNode.classVYsU:44$$D',m2a% d`.&4Lfp'@Bq_qAE-|*&1|*/>7sn,L(⡿sY9z7DP4tSp\M {iQYD {͔l~ˡb<xE6t&SXª1ޥkdNQCT3JTߥGw=|b%?^_W^}72s޶%IS5d"_6x='~VT@eU)J{\5@kJ]|/$MEOf+ɘ&A7eӸhT;aڊa7CxLR鴴բ)YL3_GԈ艄:FyDO S'Zd[|mzʪj|>yH_LC }&a'F*&)M+%ݢ+hE/[$TW?XONh9I k[BeCLNO0TT4ڥ5fOhn_La6 j]Rcv&T)d~hYSY ;TGEY|3HaɝKz -,v 222eel񔌍2g,Űà0T*C5U V`UPUxBj`-k !Lİa V&)hfaC+S`6<*Q往E "XX=(^ 2D4# Gtc  C I o0 := 0pMS =TK! >d8A/HۏW 2cH0{)~h e6 ՖlI^7r-7r-w|-m֖mr!itIU H@4?J&ƀo fo ogp.ͫyu<&njH2 _u 28:32uEuyݿi|[HQgN;lh5Nk 7mܼlϣqp/vݦbMO's +dmI?R2:t>$x8)Uk<=8I^wQɴ+OwQæ z.sq[#*:69knϦZ4niry]ArNI|6n5lcB8ɇ5btOC xI|%gqM/ E$#knPKɈNA*{F*org/objectweb/asm/tree/FieldInsnNode.classQJA}e1jܢqˢ&2w#B'&N3aU' FANTpAU꽪gkXbUXZ>fX/Uwmladn\-knWʻ~аZ;,;Lj?t2:e-G12Bbnj_AC80AT .3s'Pe د@E ␛0&fefF3H0 bLI3D>~\b*znpT>OGr~SSG{f\}[Ԁ'BbH5987p[T0&*H!i5$U0|dRYkFf C g"ѧc#Z-$ ܬ`AM,zfvfo`hX I񐴎bwXx% ?>:-1[bMD.)3F|xjOPKɈNA*T&org/objectweb/asm/tree/FrameNode.classS[OQNw@E omkrS,"oO۲biIwՠ$_}1h"J5}onBE̙ c 8CL 3|jJ;TԴ 3eegǃY͚褠*S=z?t2h"cs4L{[?Yּ_ik2t雓kTfK6,+:v9;7N9i9S; b.20쇩#֢>❉ +Pp@!QЩ W^ {j^^QC dvjhGA4kOGQA. A(;уA:">aQň8)N@="8Y:WOOsƋЉVOf: l"VJ:ymKm{M~z~de.WIIH2,[+X aXƘ|E4kJ#Iʍ4 k|セ%CW:]A2OyI.0˸L&Vcĥ"nפJL sÝ",U\y+3% z|B<-@2!_Ik%_K_nBr x$L(wZXq*a0!alۄwb?w_;pUBE/e_ICDB V^&"|}z?"1 Dn,zP9PKɈNA^YV4)org/objectweb/asm/tree/IincInsnNode.classMK@m~[D4[S$iԔdxxPh-(Qllagya?^M![.CB|6o;2;l{C[3i/ s[ {p+uCWAKH+Nh10Z#i; Z=..Ƥ ?)/E)ebkf"k*i$AI#4r2䡤P¦ [ (k(b]v(c`&d+8)rҭNB`q?ǶQjf<Q*/6)@ib EL61ʙcJSTQ[zhTHI,咜PKɈNAV7+org/objectweb/asm/tree/InnerClassNode.classN@@V(^PQb4݋qʄRiG|.V>egİ 1ng;g&ϯW8fȻ}k;3Ox8ev:*|vxGg1y2$ dU @2A0Ce@>G9 P=>XiRaO?t~Gk_fEOL5&6`,08JJJYDUɶ%6زQ.PTT=wj&dh]Mk^3Áwл̰U @Wg9jKO ONQ{oPKɈNA;B6org/objectweb/asm/tree/InsnList$InsnListIterator.classTYOQ.- AAEEv L]ҊZhB4QrC`\5ƒ&M'IQs,.&=|;=73?} `x"'OU\y,@ʮ7oA᭜5-T䬯1C)ܪC06Wٌ&4Ԑ"yZ໅*jDf.3 8zpL<gKcK<0&k{\NxM{7m`4}vJR0FTʋZ[(xTX-: J*5:Z(5N| ;Y?qy-U2H?@t)/&O%5䤗j_[ f&Kb2VV4tmgHaԞ$+2Ԭ>>nyǝu^=b ;rYCjEJ֐P#5^+}IwbAuݧ10C&$Cgf'Б[8Dǒ8I=s=F$|h'qxc3f2c06q7K!ejz?'=Hi5&L@^E{~&a n΅S0FHDE%.ϴB0ybDBaB rb] ;/:+#a=T7{1f۪>ӽgm乡06 @,sT]k/$>o)Nw$D%S3BEW#i"1=Bz.y qAEM5Ƥm!rD,SbV$1nva;E%&73H4B#x**d !>""%6e{L JDLE$ Kru\$XH Vc|aB~y^KSI2-Ƙ6e M~҇,KeORh4 )!.ec[yl#9BQƟ]~ qA-vM_q/YU?PKɈNA )%org/objectweb/asm/tree/InsnNode.classJ@MXmjAS$iԔ Z<(gcKAv柝oُwGfнvuc7 g+Ӡ a~ˌsl,d7ɓ 1þsy-F88Xsc`MEB!Ҩv0g8_z/a͔M8&VLT9X`6дQGæ=uSSӡ=̎[~80ސ;L;6Eȹy܋Dh;"6Îw~ؖ3Cs>:Fk(@":. s ?0sk_He".gkhc9d(XTQԠ !%AÂT*2ֲ(c%K*H7 H\u UVE<3Sl @\DT"S1y.n*BD~e12Q{Y3Py,R3ANbWT.͇'PKɈNAC`)2org/objectweb/asm/tree/InvokeDynamicInsnNode.classN@IB\#$.eBB&5$ȞtJIP3g2K CT)3vxu.Pš .'QQLBT]4.kuc>0Oc7UXwx+wAXw"ՄP,u1 -In2T[t/T0rnGg2=q& t;IjħD eSHޠ |WيKn"ia¨1YmяA|1e^1eV˜&$rFt  k"F{veCq>::Xt2~0DC٠YdqZ(9m&T?(>̨^/@1+TPKɈNAb0})org/objectweb/asm/tree/JumpInsnNode.class.AƿikQbѢnޫHUAr&TwĿx%LH{|̙zC*VLX NP䞸5Ǎ[2ÀU)0[?!E6tqnZK:¯;nXu"t=QiD eg(X=}..?ETw~o?6 eMo/y< 49x΅4JnC:L' T?eXsv {W1 N-H   !a`F308 Lc 2,Y]!cy,R:K+Z)KPRQ]1iO(<ʐ% 5iOXiUT*i#CsTF%+a?c[f$yyڅK(W4PKɈNA"BPV&org/objectweb/asm/tree/LabelNode.classRMO@}8q |4 J #BB"%pAHgvd/TO= hRTA*$3޼y?!e4 e θ#eG_^KrNv|3¶<XGj1Ol6 r9蟸+P2\{dJ\2c; >SNU04h33/eq6g01E y[wB*VTx#Tt, E:Aa5aCC*jʣMlQZ߈AG(S)'AUKgtfLK@rsE:7רMHI,HܖHɼB /`Ώd@G6XMVf5sf./(]w PKɈNA㸛`+org/objectweb/asm/tree/LineNumberNode.classN@`VA#QJ5^R/۲]1!>qxH F.:;;3?؆ɠ*C(ww,;lY5 CܨOꟐo ̋>tyݵK5CS<;lWTa;3!~ =QAدYG0=GK9ڮ;!66)GϹMOVy"Ciȍ1a/9l9뺻SؓoP Hu{ TtD:b("+;f^akv/ וy2ucU -߆<,6flͰ9k{$vEI KiGB]%t.J$JZw#6hjbĊ P'[Xҳase㛆6544liخ` _+c/@k[`:NL\0%0a*&.@ФkhV3 M^/f^fdؿ(MaxŇuH!D{c=6PKɈNA8 vZ1org/objectweb/asm/tree/LookupSwitchInsnNode.classT]O`~^VVU8DYΉ "St T\j]V x.Ba JaPf1Y|<}?m8h I;3ύ`DhR1@ Py=jlt%Q\$w&'cZa۲(a977=4 NlgctAN0JA eUg N^O;\!W.tRWV2gvf,wi*G+TXdWpU3A:a*I؏xN]==a7[n#P 2O-e :BLYbԙ9gRo9F 4l b}}E pMh ^'Ѵe8=h wىI?j(W̳J2Ze8%C2dUp C !3T(hFWp @0\cA> G_>D=x.3K  iD Kly}Jd~#F-|ȏE$BCMi!{QmqkCn0RFJa>) io SZ@:W:jxI~FOncW q-^+'WN.pg_3ʃOjm]ǽ|KG/B#,48W1:QD\-;46,^z)א܌dwS))i-n PKɈNAãЙ+org/objectweb/asm/tree/MethodInsnNode.classQJP=KbkVZm\nE .c^jJMJrU'Gso* 0gNfΙ$oO/6T Jz°YK^:jD~!܎owk=?hY~q["i"QBoCx3y↮Cr=Wlc`t{9$wC)M: z,x9%:jT +|_O]ҿ8MN\>:Fu7` e`X K6x Y$IiLc&M(NߏI1&'l$NOEĨLG,k= L;@9'H3b53C?Db7^Zm1\5Q(Q(P5D_^_rӯG,*PKɈNAT=!)org/objectweb/asm/tree/MethodNode$1.classAK0YjYv=OыP xq˨-EP~(x0{_/'CtLwx< r{/H1O YNWRO: p(XSr<'אan <ՈaqhU_14Ci4@e-m@XtAzš́ jlcF hK TmCq(4aPBKA; l[Bc5 .q~헂PKɈNA8TUx 'org/objectweb/asm/tree/MethodNode.classXy|:q(A\$c` IM9jڤJzGDRIJғ3} =--hAi$3{H+{6C۝ͼyfG$@.WɋSĊ'){;Mk-T ЦH\_-+GHdi!<-鴺d)TG$Rjb1zm,Rz^U%9c4SYcQ.i*0{B TQn='q]xŵD՘p!XOv 9lf6Nted +iKj|;p旛{{6[y9e[tZICKϞ5JMmݼfk<۹q|*CW?>vXԩ-Vf +]ky#TbCeilolO1yT2f/Nw'lofLRlJbW9u1{dDT#$?ɘ(42]`c.u AZ~UY1ڲlXUd-`7ÈY 5`F)[),k˽6uŪx32\m깆dT 8iԈ,J5kVRY[5Ӈ2Cպd4X%cwh&=2X+2ɸPddAe|@e|HE2T2:e)M2elqM22z 32 *  A !:30a6Bgd4E P(8 gTKX;^`e8QrD4+ |6ûJ(Qa6f^!jV[1G6p5ⓘӨTy^> 7'e~c]S_3 cxI3 a+_g_Ə ˏ,ۉ1c ?cxOKv#>.5ǔ9RcWHit)1m.09uy gHBB@oSI.hU"'< *TI&9 XNb:٤΄Lj$UJAoN,,JM5z)&k\~x./ 1jH(䝘SKcsN`}Qރd8:OߩOŔ!}''"91!JfR$ۙJI5}O~GyEbZsH1LB׉:MRmVC^Q1 q|ayz!:0~Zc̹$8f(OZF9Z0,G(..zxY1To'bN?k2S(ӣ@^ͱzJ яp}N(ь0\]NL3,Cst0t[oy% ^ '.Z2'mϹQ֩بL}(VMgzz)!^ԛbzAD)7={~}tds)|t`GE('jm/*Fǣhޢwmc0!j+QAwΉzSk!-<к;{"y6k0٩cr*j^&<6 z uطbN+|lwQn=y [qϟW=m%ݭL%1̓bNL a7Yx%dE):9YRޅpv1fGl55҂SYBRkң룫((@iA0Dj\KB7n?gPDbd8]`?/}B 7SJar KVt%DA)#䶨෽bJ d1~W^iR.,`Q:i%8ۢ27(*wH'?2Z(}~)?uWk@Z=_?N4zިnE^jj>5M{d-pxovo?(N0$+Q͇x8Rӆrf\KTE\,ʛx 6}l]?f^K1蟯`8l ª^Qu7˪0(4D4İ!% 6ٌb[QR4}\LPd EԉJ. T)vK)K)_F狍$bs1\ܤ6riB&?agc՟*$}`0NÙR!6PMZ-ҷjR!yoI[a]'#tDrz;j{zIfhHjfr-[+F{0 W }R%M}ipRz^xMmR-GD@DWD C QB$やs$tEEx%t#2%/U0 è;&99L A!iFqG>px0)8J!/oB]KӸpoo,ԐWf"h31Ds w1w'< ʗh\  V4K6e`0CO(Á#=}FeU1t&5LiHh6G8 `&TT0Q(XU#EsH2ST1'q8buLj'>rvs#zfh"B\,=b(Rp%PKɈNAw~qy)org/objectweb/asm/tree/TypeInsnNode.classQMO@(( "ĂŘO$ R6X-iWɃ&"&mxP̛y`^m0DF͐;92sN.}#2jzsKa׆87;LK49uΰ nqqv۶o 2C۱ sB} Je`Z!e}Aqqq7 ZG`aR|.fɑL*TT,kP%ACL"4 CyYXE! rqZB5COF"[E UV9Zarmo#4$ _(d`*!~Ń^&wkO(W|"LV$$eWd/ 6%>PKɈNAq`P(org/objectweb/asm/tree/VarInsnNode.class_K`Ɵg9L3seE\3JȺ 9_lbތSPCE]nyww猽ǦHVOBq:'uݱյv1߲eGmw;-a2~znr?l \~D'4'A5dqXig{R2~qv_Ȟ~C$<=)@RPPPTAFJ D)#CU,cME+*]kآZ?A_/hRYR@U[ )@l̰aS@$>PKΈNANKpMETA-INF/MANIFEST.MFPKɈNA`L-org/objectweb/asm/tree/AbstractInsnNode.classPKɈNAI:G+org/objectweb/asm/tree/AnnotationNode.classPKɈNA_ &corg/objectweb/asm/tree/ClassNode.classPKɈNA*{F*7org/objectweb/asm/tree/FieldInsnNode.classPKɈNA/Lh&org/objectweb/asm/tree/FieldNode.classPKɈNA*T&org/objectweb/asm/tree/FrameNode.classPKɈNA^YV4)Corg/objectweb/asm/tree/IincInsnNode.classPKɈNAV7+org/objectweb/asm/tree/InnerClassNode.classPKɈNA;B6`org/objectweb/asm/tree/InsnList$InsnListIterator.classPKɈNAd'7 %org/objectweb/asm/tree/InsnList.classPKɈNA )%"org/objectweb/asm/tree/InsnNode.classPKɈNAcaaT(1$org/objectweb/asm/tree/IntInsnNode.classPKɈNAC`)2%org/objectweb/asm/tree/InvokeDynamicInsnNode.classPKɈNAb0})'org/objectweb/asm/tree/JumpInsnNode.classPKɈNA"BPV&)org/objectweb/asm/tree/LabelNode.classPKɈNA!D,(+org/objectweb/asm/tree/LdcInsnNode.classPKɈNA㸛`+I-org/objectweb/asm/tree/LineNumberNode.classPKɈNA.-/org/objectweb/asm/tree/LocalVariableNode.classPKɈNA8 vZ11org/objectweb/asm/tree/LookupSwitchInsnNode.classPKɈNAãЙ+o4org/objectweb/asm/tree/MethodInsnNode.classPKɈNAT=!)Q6org/objectweb/asm/tree/MethodNode$1.classPKɈNA8TUx '7org/objectweb/asm/tree/MethodNode.classPKɈNA$oo3Borg/objectweb/asm/tree/MultiANewArrayInsnNode.classPKɈNA5_0Dorg/objectweb/asm/tree/TableSwitchInsnNode.classPKɈNA}}B.Gorg/objectweb/asm/tree/TryCatchBlockNode.classPKɈNAw~qy)~Iorg/objectweb/asm/tree/TypeInsnNode.classPKɈNAq`P(6Korg/objectweb/asm/tree/VarInsnNode.classPK Lnqp-2013.12.1/3rdparty/dyncall/000077500000000000000000000000001225523575400160275ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/AUTHORS000066400000000000000000000002011225523575400170700ustar00rootroot00000000000000Daniel Adler Tassilo Philipp Olivier Chafik nqp-2013.12.1/3rdparty/dyncall/BSDmakefile000066400000000000000000000026041225523575400200620ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # bsdmake makefile # BSDmakefile # #/////////////////////////////////////////////////// TOP = . .include "$(TOP)/buildsys/bsdmake/prolog.bsdmake" # directories: DIRS = dyncall dyncallback dynload AUTOS = ConfigVars .PHONY: test doc test: cd $@; $(MAKE) doc: cd $@; $(MAKE) .include "$(TOP)/buildsys/bsdmake/epilog.bsdmake" nqp-2013.12.1/3rdparty/dyncall/BUGS000066400000000000000000000002041225523575400165060ustar00rootroot00000000000000- dyncall sparc64 port: works fine on Debian 6, but has issues on OpenBSD and Solaris regarding passing of float and double values. nqp-2013.12.1/3rdparty/dyncall/CMakeLists.txt000066400000000000000000000057501225523575400205760ustar00rootroot00000000000000# Package: dyncall # File: CMakeLists.txt # Description: DynCall Project cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # cmake_minimum_required (VERSION 2.6) project(DynCall) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "dyncall enables dynamic invocation of machine-level function calls") set(CPACK_PACKAGE_VENDOR "dyncall project") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/Description.txt") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt") if(APPLE) set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/Description.txt") endif(APPLE) set(CPACK_PACKAGE_NAME "dyncall") include(CPack) # add cmake modules shipped with the package to cmake's module path. # currently we have no use for this, but maybe later.. #set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/buildsys/cmake/Modules" "${CMAKE_MODULE_PATH}") if(MSVC) enable_language(ASM_MASM) #if(CMAKE_SIZEOF_VOID_P MATCHES 8) # set(CMAKE_ASM_COMPILER "ml64") #else() # set(CMAKE_ASM_COMPILER "ml") #endif() #set(CMAKE_ASM_COMPILER_ARG1 "/c") #set(CMAKE_ASM_MASM_SOURCE_FILE_EXTENSIONS asm) #set(CMAKE_ASM_MASM_COMPILE_OBJECT " /c /Fo ") elseif(CMAKE_COMPILER_IS_GNUCC) # when used in shared libraries, -fPIC is required by several architectures # and platforms (observed on AMD64, Solaris/Sparc). # we enable it per default here. add_definitions("-fPIC") # enable gcc as front-end to assembler for .S files set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}") set(CMAKE_ASM_COMPILER_ARG1 "${CPPFLAGS} -c") enable_language(ASM) elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro") set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}") set(CMAKE_ASM_COMPILER_ARG1 "${CPPFLAGS} -c") enable_language(ASM) endif() add_subdirectory(dynload) add_subdirectory(dyncall) add_subdirectory(dyncallback) add_subdirectory(doc EXCLUDE_FROM_ALL) add_subdirectory(test EXCLUDE_FROM_ALL) # install cmake Find scripts (disabled per default) option(INSTALL_CMAKE_MODULES "install cmake modules to locate dyncall" "NO") if(INSTALL_CMAKE_MODULES) file(GLOB INSTALL_CMAKE_MODULES_FILES buildsys/cmake/Modules/Find*.cmake) install(FILES ${INSTALL_CMAKE_MODULES_FILES} DESTINATION ${CMAKE_ROOT}/Modules) endif(INSTALL_CMAKE_MODULES) nqp-2013.12.1/3rdparty/dyncall/ChangeLog000066400000000000000000000135621225523575400176100ustar00rootroot00000000000000This file lists big/noteworthy changes, only... Version 0.7 architecture: o added subproject: portasm - portable (GNU AS,+Apple and MASM) assembly framework o added subproject: autovar - predefined macro framework (was dyncall_macros.h) o added support for sparc (32-bit) (tested on linux/debian,openbsd,solaris) o added support for sparc (64-bit) (tested on linux/debian,openbsd,solaris) o added support for Solaris and SunPro compiler for i386, x86_64, sparc and sparc64 o improved auto-detection via preprocessor defines dyncall updates: o uses portasm (GNU,Apple,Microsoft) common sources for x86,x64,ppc32,arm32_arm o bug fixes for x64/win64 calling convention o added support for mingw32-w64 on x64 o improved cdecl x86 calling convention: stack always 16 byte aligned o updated API and initial support for structs (for x86/AMD64) o initial support for syscalls on x86, added x86 int80h linux/bsd o added Minix port (stable) o optimized vector buffer for small type pushing o minor fix for amd64/sysv: alignment to 32-byte o bug fix for ppc32/sysv: ellipsis calls work now o updated API, introduced DC_CALL_C_ELLIPSIS_VARARGS o changed interface: dcMode does not reset internally anymore dyncallback updates: o uses portasm for x86,x64 o added Solaris/x86/sunpro port (stable) o added Minix port (unstable) o updates source, uses relative includes dynload updates: o fixes for missing includes (dyncall_alloc.h) o fixes for self-resolving symbols on windows o removed Dbghelf.lib dependency o bug fixes for cygwin/x86 o fixes for beos/haiku o no dependencies to libdyncall sources. buildsys additions: o added zero-config (BSD,GNU,SUN) make files (Makefile.embedded) o added in/out-of-source configure2 w/ (BSD,GNU) make files (Makefile.generic') o added bootstrap lua script (download/build) o Nmakefile: more tests included (resolve_self) o improved cross-compilation for iOS (upgrade to 4.3 sdk) o darwin 8.0 support o added 'install' support for Makefile.embedded buildsys/gmake updates: o added support for msvc/x64 tool-chain o default settings for build-dir changed to '.' o cleanup: removed top-level Make{Prolog,Epilog,Rules} files and updated all sub-projects and tests o added support for DESTDIR staging installation o added support for manual page installation buildsys/cmake updates: o updated find module scripts (see cmake/Modules) o added support for using dyncall as sub-project (via *Config.cmake files) see details in README.CMake o fixes for msvc and ml o fixes for CPack o fixes for universal builds on Mac OS X o supports SunPro with *.S files. o added experimental 'dynMake' portable make-based build-system (not stable, yet) documentation updates: o added dyncallback documentation o updated dyncall documentation o minor updates tests: o added flexible test suite for calls (call_suite) based on Lua and C o added syscall test o updates to resolve-self test (adding additional link flags to export symbols) o improved dir name portability (renamed plain_c++ -> plain_cxx) o renamed *.cpp -> *.cc files (OpenBSD/Sun make has no implicit rules for cpp) Version 0.6 building: o new build systems: CMake and Plan9's mk o buildsys/gmake tool chain update: pcc and iphone sdk o x64 bugfix: added "-fPIC" even for static libs dynload updates: o enum symbols update: Mach-O and Win64 (thanks Olivier) o numerous convenience changes to dynload interface (thanks Olivier) o added support for resolving application images itself dyncall updates: o new platform support: arm/iphone (armv6), x86/Plan9 o new mips calling conventions: oabi, n64 (both endian models) o cleanup: unexported functions in MASM files, b/c export not needed (thanks Olivier) o interface update: added error reporting facility 'dcGetError' o bugfix for ppc32/sysv: ellipsis calls were broken o interface update: added new abstract mode for ellipsis calls (DC_CALL_C_ELLIPSIS) docs: o comprehensive update tests: o plain: split "plain" test up in C and C++ part o callbacksuite: added multiple configuration support for callback_suite Version 0.5 o renamed arm9 stuff to arm32 o added non-EABI ABI for arm32 (before, EABI was the default implementation) o added dyncallback support for x64/windows (thanks Olivier), x64/darwin, arm32/arm, arm32/thumb o synced documentation again with current state of the source (lots of small changes) o updated ruby binding to current state of signature string (still some features missing, though) o added a couple of new options to configure scripts (e.g. prefix-bd, new targets, etc.) o darwin universal binary support o added new tests callback_plain and calback_suite o added Haiku/BeOS support Version 0.4 o added 'doc' makefile target for coherency and ease of use o fixed nmake buildfiles and configure.bat (were out of date and wrong) o test suite clean up (GNUmake, BSDmake): target "config" modified, phony without dependencies to other builds o bugfix: GNU fastcall calling convention for float and double arguments was wrong. no skip of register. o update: x86win32* suite tests are built on cygwin now, added total result output o signature types change: C Strings: 'S' -> 'Z' long: 'l' -> 'j' long long: 'L' -> 'l' added unsigned integer type signature characters: upper case encoding o added: callbacks component (support only for some platforms ATM) o added: test cases for alloc_wx, thunk o updated Documentation Version 0.3 o added Linux PPC32 support o added ARM THUMB mode support o cosmetic changes, documentation updated o bugfix: on cygwin exported C symbols in GNU as are prefixed with '_' now. o removed scons build support Version 0.2 o added scons build support o configure variables all prefix CONFIG_* now o configure variable INSTALL_DIR changed to INSTALL_PREFIX o configure (shell version) option "--prefix" changed to "--prefix=" Version 0.1: o initial release nqp-2013.12.1/3rdparty/dyncall/Description.txt000066400000000000000000000022561225523575400210600ustar00rootroot00000000000000DynCall Project The dyncall library encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual "bind argument parameters from left to right and then call" interface allowing programmers to call C functions in a completely dynamic manner. In other words, instead of calling a function directly, the dyncall library provides a mechanism to push the function parameters manually and to issue the call afterwards. This means, that a program can determine at runtime what function to call, and what parameters to pass to it. The library is written in C and assembly and provides a very simple C interface to program against. The library comes in very handy to power flexible message systems, dynamic function call dispatch mechanisms, closure implementations or even to bridge different programming languages. When it comes to language bindings, the dyncall library provides a clean and portable C interface to dynamically issue calls to foreign code using small call kernels written in assembly. Instead of providing code for every bridged function call, which unnecessarily results in code bloat, only a couple of instructions are used to invoke every possible call. nqp-2013.12.1/3rdparty/dyncall/GNUmakefile000066400000000000000000000023641225523575400201060ustar00rootroot00000000000000# Package: dyncall # File: GNUmakefile # Description: Top-level buildsys/gmake GNUmakefile # License: # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # FIXME: workaround for Parrot issue #735 CFLAGS += -Wno-strict-prototypes TOP = . GMAKE_TOP ?= $(TOP)/buildsys/gmake include $(GMAKE_TOP)/prolog.gmake DIRS = dyncall dynload dyncallback include $(GMAKE_TOP)/epilog.gmake .PHONY: test doc test: $(MAKE_COMMAND) -C $@ doc: $(MAKE_COMMAND) -C $@ nqp-2013.12.1/3rdparty/dyncall/LICENSE000066400000000000000000000015001225523575400170300ustar00rootroot00000000000000Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. nqp-2013.12.1/3rdparty/dyncall/License.txt000066400000000000000000000015001225523575400201460ustar00rootroot00000000000000Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. nqp-2013.12.1/3rdparty/dyncall/Makefile.M000066400000000000000000000015021225523575400176600ustar00rootroot00000000000000#include "buildsys/dynmake/Makefile.base.M" all: cd dyncall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd dynload _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd dyncallback _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean: cd dyncall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd dynload _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd dyncallback _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean tests: cd test _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) nqp-2013.12.1/3rdparty/dyncall/Makefile.embedded000066400000000000000000000024341225523575400212220ustar00rootroot00000000000000MAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} all: cd dynload && ${MAKE_CMD} cd dyncall && ${MAKE_CMD} cd dyncallback && ${MAKE_CMD} tests: cd test && ${MAKE_CMD} clean: cd dynload && ${MAKE_CMD} clean cd dyncall && ${MAKE_CMD} clean cd dyncallback && ${MAKE_CMD} clean cd test && ${MAKE_CMD} clean install: cd dynload && ${MAKE_CMD} install cd dyncall && ${MAKE_CMD} install cd dyncallback && ${MAKE_CMD} install bsd: ${MAKE_CMD} all linux: ${MAKE_CMD} all linux64: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all minix-gcc: cd dyncall && CC=gcc CFLAGS= ${MAKE_CMD} cd dyncallback && CC=gcc CFLAGS= ${MAKE_CMD} mingw32: ${MAKE_CMD} CC=gcc AS="gcc -c" all osx: ${MAKE_CMD} all osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="libtool" ARFLAGS="-static -o" ${MAKE_CMD} all sun: CFLAGS="${CFLAGS}" ${MAKE_CMD} all sun-64bit: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all sun-gcc: CC=gcc CFLAGS="${CFLAGS} -fPIC" ${MAKE_CMD} all sun-gcc-64bit: CC=gcc CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all .PHONY: all tests clean install bsd linux linux64 minix-gcc osx osx-universal sun sun-64bit sun-gcc sun-gcc-64bit nqp-2013.12.1/3rdparty/dyncall/Makefile.generic000066400000000000000000000010631225523575400211020ustar00rootroot00000000000000MAKEFILE ?= Makefile.generic MAKE_CMD = ${MAKE} -f ${MAKEFILE} .PHONY: all clean install test osx-universal linux bsd all: cd dyncall ; ${MAKE_CMD} cd dynload ; ${MAKE_CMD} cd dyncallback ; ${MAKE_CMD} clean: cd dyncall ; ${MAKE_CMD} clean cd dynload ; ${MAKE_CMD} clean cd dyncallback ; ${MAKE_CMD} clean install: cd dyncall ; ${MAKE_CMD} install cd dynload ; ${MAKE_CMD} install cd dyncallback ; ${MAKE_CMD} install test: cd test ; ${MAKE_CMD} osx-universal: ${MAKE_CMD} CPPFLAGS="-arch i386 -arch ppc -arch x86_64" MKLIB="libtool -static -o" nqp-2013.12.1/3rdparty/dyncall/Makefile.psp000066400000000000000000000024121225523575400202670ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # Makefile.psp for dyncall # # TODO # - integrate tests (low-prio) # DIRS = dyncall EXTRA_DIRS = test .PHONY: all clean install $(DIRS) $(EXTRA_DIRS) all clean install: $(DIRS) $(DIRS) $(EXTRA_DIRS): $(MAKE) -C $@ -f Makefile.psp $(MAKECMDGOALS) # tests: test nqp-2013.12.1/3rdparty/dyncall/Nmakefile000066400000000000000000000030011225523575400176370ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = . !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake DIRS = dyncall dynload dyncallback test: dummy !echo Building tests ... && cd $@ && $(MAKE) /NOLOGO /F Nmakefile && cd .. doc: dummy !echo Building documentation ... && cd $@ && $(MAKE) /NOLOGO /F Nmakefile && cd .. # Pseudo-targets are always out of date... dummy: !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake nqp-2013.12.1/3rdparty/dyncall/README-Cross.txt000066400000000000000000000004631225523575400206170ustar00rootroot00000000000000Cross-compilation with gcc: set CC,AR,LD explicitly export CC=$PREFIX-gcc export AR=$PREFIX-ar export LD=$PREFIX-ld # required for tests: export CXX=$PREFIX-g++ ./configure useful flags: --target-windows compiling for windows on cygwin --target-x86 compiling for x86 on x64 nqp-2013.12.1/3rdparty/dyncall/README-Darwin.txt000066400000000000000000000011401225523575400207430ustar00rootroot00000000000000Build on Darwin: Building Universal Binaries: $ ./configure --target-universal or $ set TARGET_ARCH="-arch i386 -arch ppc -arch x86_64" $ ./configure Then build with GNU- or BSD-Make. Notes for Mac OS X 10.4/Darwin 8: The applications in the test directory might fail with "XXX.dylib does not contain an architecture that matches the specified ..." Here is a workaround: Explicitly set TARGET_ARCH to "" (empty string) or the desired architecture (e.g. "-arch ppc") before building the applications. This prevents building universal binary executables, but the static libraries are still built. nqp-2013.12.1/3rdparty/dyncall/README.CMake000066400000000000000000000042011225523575400176630ustar00rootroot00000000000000Notes on building with CMake ---------------------------- Build with CMake (in-source) ---------------------------- cd On Unix: cmake . make -f Makefile NOTE: The "-f Makefile" flag ! If you build in-source make sure to specify the makefile with "-f Makefile". Otherwise the GNUmakfile files will be used by make that originate from buildsys/gmake. On Windows: cmake . -G "NMake Makefiles" nmake /f Makefile NOTE: Assembly Support is broken for Visual Studio Generators in CMake So we support NMake for now only. Install in a specific location ------------------------------ cmake -DCMAKE_INSTALL_PREFIX= Tested settings --------------- - CMake Unix Makefile generators on Mac OS X and Linux. Using from other CMake-based projects ------------------------------------- Under buildsys/cmake/Modules you find some Find*() scripts which you might find useful. Make Universal Binary --------------------- cmake -DCMAKE_OSX_ARCHITECTURES="i386;x86_64;ppc" CMake Framework --------------- The project name is "DynCall". Each library in the source tree represents a target (not a sub-project!). Support scripts for 'find_package' are at buildsys/cmake/Modules. find_package( [DynLoad | DynCall | DynCallback] ) will set the variables: Dyn*_INCLUDE_DIRS Dyn*_LIBRARIES Using dyncall libraries in other CMake projects ----------------------------------------------- find_package(DynLoad REQUIRED) add_includes(${DynLoad_INCLUDE_DIRS}) target_link_libraries( ... ${DynLoad_LIBRARIES}) Use as sub-project within CMake top-level project ------------------------------------------------- add_subdirectory(path/to/dyncall/project/tree) set(DynLoad_DIR ${DynCall_SOURCE_DIR}/dynload) set(DynCall_DIR ${DynCall_SOURCE_DIR}/dyncall) set(DynCallback_DIR ${DynCall_SOURCE_DIR}/dyncallback) has the effect, that the 'find_package' works from within the project source tree. Building for SPARC64 Architectures ---------------------------------- Supported Compilers: GCC, SunPro Add -m64 to C, C++ and ASM flags, e.g. $ cmake -DCMAKE_C_FLAGS=-m64 -DCMAKE_ASM_FLAGS=-m64 -DCMAKE_ASM_CXX_FLAGS=-m64 nqp-2013.12.1/3rdparty/dyncall/README.Configure2000066400000000000000000000010151225523575400207060ustar00rootroot00000000000000Some experiences with configure2 and Makefile.generic NetBSD/FreeBSD: Embedded Default NetBSD make: make -f Makefile.generic (cd test ; LDFLAGS=-lm make -f Makefile.generic) Configure: in-source: ./configure2 make make install DESTDIR=/tmp Out-of-source: mkdir build cd build ../configure2 make OpenBSD: Embedded Default OpenBSD make: make -f Makefile.generic (cd test ; LDFLAGS=-lm make -f Makefile.generic all-c) nqp-2013.12.1/3rdparty/dyncall/README.Generic000066400000000000000000000107411225523575400202650ustar00rootroot00000000000000Building with generic makefiles =============================== Description ----------- Makefile.generic is a simple and _hybrid_ make-based build system setup for dyncall, designed to work with with GNU and BSD make. This build-flavour supports two operating modes: Embedded and Configure. Project files are specified in Makefile.generic. History ------- During the integration of dyncall into the R package rdyncall, there was a need for a clean simple build system that could be launched from R and works with various make's such as GNU, BSD and sun make. Generic Usage ------------- [MAKEFILE=Makefile.generic] [g|bsd]make [-f Makefile.generic] [all|clean|autogen|install] [INSTALL_TOP=] Embedded Mode ------------- Makefile.generic makefiles are taken "as-is" without the need for extra configuration. = ... bsdmake -f Makefile.generic MAKEFILE=Makefile.generic = ... gmake -f Makefile.generic Example: dyncall libraries should compile fine on most platforms: BSDmake: $ bsdmake -f Makefile.generic GNUmake: $ MAKEFILE=Makefile.generic make -f Makefile.generic The tests need sometimes special attention to additional 'usual' libraries such as math and dynamic linker run-time libs. $ LDFLAGS="-lm -ldl" make -f Makefile.generic Configure Mode -------------- Usage: mkdir cd ..//configure2 [--prefix=] make make install [DESTDIR=] The configure script 'configure2' writes 'Makefile' files that include 'Makefile.generic' and setup variables such as VPATH, {SRC,BLD}{TOP,DIR}. Two build types are supported: In-source and out-of-Sosurce. in-source builds: Makefile's are created in parallel to the Makefile.generic files. out-of-source builds: the configure script is executed from a (possible empty) build directory. The source directory tree is duplicated into that directory. Useful Variables ---------------- For libraries: CC, CFLAGS, CPPFLAGS For tests: CXX, LDFLAGS MAKE_CMD - The make tool (including -f flag) to run sub-directories. SRCTOP - Source top-level directory (defaults to relative top). BLDTOP - Build top-level directory (defaults to SRCTOP). SRCDIR - Source directory (defaults to '.'). BLDDIR - Build directory (defaults to SRCDIR). e.g. Makefile.generic in source-tree: SRCTOP ?= ../../../ # relative path to source-top BLDTOP ?= ${SRCTOP} # defaults for in-source builds SRCDIR ?= . # relative path to current directory BLDDIR ?= ${BLDDIR} # relative path to current directory Include Directories ------------------- Use -I${SRCTOP}/... to refer to other include directories. Link Directories ---------------- Use -L${BLDTOP}/... to refer to other build directories. Plaform Notes: -------------- Linux: - all: ok. make -f Makefile.generic all - tests: need 'm' and 'dl' libs. ( cd tests ; LDFLAGS="-lm -ldl" make -f Makefile.generic ) - see batch script: buildsys/scripts/batch-build-linux.sh Minix: No dynload support. No '-fPIC' is allowed. - dynload: unsupport, no dynamic linker present in Minix 3. - dyn{call,callback}: ok, without '-fPIC'! ( cd dyncall ; CFLAGS= make -f Makefile.generic dyncall dyncallback ) - tests: ok ( cd test ; make -f Makefile.generic all-dyncall all-dyncallback ) - see batch script: buildsys/scripts/batch-build-minix.sh NetBSD/FreeBSD: - all: ok. make -f Makefile.generic all - tests: need math lib: ( cd tests ; LDFLAGS="-lm" make -f Makefile.generic ) OpenBSD: - all: ok. make -f Makefile.generic all - tests: *.cpp implicit rule not set, therefore only c tests work: ( cd tests ; LDFLAGS="-lm" make -f Makefile.generic all-c ) - install: ok. Haiku Alpha 2: - dynlaod: unsupport, no elf.h header found. - dyn{call,callback}: ok. make -f Makefile.generic dyncall dyncallback - tests: ok ( cd test ; make -f Makefile.generic all-dyncall all-dyncallback ) Build notes related to dyncall: ------------------------------- CFLAGS Use '-fPIC' for at least 64-bit systems and when you want the code to be included as a shared library or module image. LDFLAGS Use '-lm' for test/suite - it uses pow function. Use '-ldl' for dynload examples such as test/nm and test/resolve_self on Linux. Feature: -------- configure --prefix= -> Makefile DESTDIR=variable make -f Makefile.generic DESTDIR= Todo: ----- - integrate with sun's make: - sun's make: CXX does not exist.. no rule for *.cpp files but *.cc. - TARGET_ARCH is predefined with -i386 on x86 and TARGET_MACH is predefined with -i86pc nqp-2013.12.1/3rdparty/dyncall/README.MacOSX000066400000000000000000000011521225523575400177770ustar00rootroot00000000000000The build system supports universal binaries (including static libraries). In addition, the desired SDK can be choosen. Configure switches related to Mac OS X: Operating System: --target-macosx (auto-detect) SDK: --with-macosxsdk= (auto-detect) Architecture: --target-universal (default) --target-x86 --target-x64 --target-ppc32 Tool: --tool-gcc (default) --tool-llvm-gcc Configure and Build for host platform: ./configure make sudo make install Compile for Mac OS X 10.4u: configure --target-macosx --with-macosxsdk=10.4u --target-ppc32 nqp-2013.12.1/3rdparty/dyncall/README.Minix000066400000000000000000000023371225523575400177770ustar00rootroot00000000000000DynCall on Minix 3 ================== Status: ------- - Compiles under GNU tool-chain on Minix 3.1.8 using script for Makefile.generic. - dyncall: tests run ok. - dyncallback: minor bugs on dyncallback (some cases fail) - dynload: unsupported due to missing dynamic linker. - Integration of ACK tool-chain is in progress.. Build script for gcc (using Makefile.generic): ---------------------------------------------- $ sh buildsys/scripts/batch-build-minix.sh Notes ----- As Minix has no dynamic linker, the default '-fPIC' CFLAGS need to be cleared, which does the batch-build script setting CFLAGs for dyncall and dyncallback explicitly. Compiling via Makefile.generic and gcc: --------------------------------------- cd dyncall ; CC=gcc CXX=g++ make -f Makefile.generic CFLAGS= cd dyncallback ; CC=gcc CXX=g++ make -f Makefile.generic CFLAGS= cd test ; CC=gcc CXX=g++ make -f Makefile.generic all-no-dynload CFLAGS= Minix facts: ------------ - posix make - ACK (Amsterdam Compiler Kit) compiler for C, Modula-2 and Pascal using own Assembly format - ACK Assembler: if very first character is '#' - C preprocessor is run.. - Minix 32-bit: - ACK 32-bit compiler: long long is not supported - Minix 16-bit: not yet reviewed... nqp-2013.12.1/3rdparty/dyncall/README.NDS000066400000000000000000000012401225523575400173270ustar00rootroot00000000000000Build instructions for Nintendo DS using devkitPro and NMake under Windows. ================================================== To build the library, you have to configure it first. Since the NDS build uses devkitPro and NMake, assure to have them in your %PATH%. To configure the library, call one of the following, depending if you want to use the processor in ARM or THUMB mode: configure.bat /tool-gcc /target-nds-arm configure.bat /tool-gcc /target-nds-thumb Note that the /tool-gcc flag is needed, because we're using devkitARM (via devkitPro) which is based on the GCC toolchain. The /target-nds-* flags don't imply this. Then, call: nmake /F Nmakefile nqp-2013.12.1/3rdparty/dyncall/README.PSP000066400000000000000000000003741225523575400173540ustar00rootroot00000000000000cross-compile for PSP using PSP-SDK =================================== configure: ./configure --prefix= --target-psp .\configure.bat /prefix /target-psp build: make -f Makefile.psp install: make -f Makefile.psp install nqp-2013.12.1/3rdparty/dyncall/README.Solaris000066400000000000000000000035221225523575400203240ustar00rootroot00000000000000Notes on DynCall and Solaris ============================ Current Status of Solaris Architectures: i386 : ok. AMD64 : builds fine. could not execute test on my solaris vm. SPARC : no dyncallback support. SPARC64 : bugs in dyncall (see BUGS), no dyncallback support. Supported Compilers: SunPro C/C++ compiler and GCC. Supported Build-Systems: Makefile.embedded and CMake. Details ======= It has been ported and tested for x86 and sparc32/64 on Solaris 10/X86 using the SunPro compiler suite and sun's make. It cross-builds for amd64 just fine, but the tests could not be executed so far. We use 'Makefile.embedded' for sun make (and GNU and BSD as well) and zero configuration. Build with SUN make and compilers from sun -------------------------------------- $ make -f Makefile.embedded sun $ (cd test; make -f Makefile.embedded sun) Compile for 64-bit ------------------ $ make -f Makefile.embedded sun-64bit $ (cd test; make -f Makefile.embedded sun-64bit) Build with GNU C compiler ------------------------- $ make -f Makefile.embedded sun-gcc $ (cd test; make -f Makefile.embedded sun-gcc) Build with Sun make and gcc for sparc64 --------------------------------------- $ make -f Makefile.embedded sun-gcc-64bit $ (cd test; make -f Makefile.embedded sun-gcc-64bit) NOTE: There are still issues with the sparc64 port on Solaris. Build with CMake, Sun make and SunPro for sparc64 ------------------------------------------------- $ cmake -DCMAKE_C_FLAGS=-m64 -DCMAKE_ASM_FLAGS=-m64 -DCMAKE_CXX_FLAGS=-m64 . $ make Installation ------------ $ make -f Makefile.embedded PREFIX= install Tested Platforms ---------------- x86/amd64: using Solaris 10 using SunPro Tools sparc 32/64 bit: SunOS 5.1 using SunPro and GCC on a Sun Fire V440 via developer account (thanks to gwdg.de!) nqp-2013.12.1/3rdparty/dyncall/README.Windows000066400000000000000000000012121225523575400203340ustar00rootroot00000000000000Build using buildsys/nmake and MSVC: 32-bit: .\configure.bat /target-x86 nmake /fNmakefile 64-bit: .\configure.bat /target-x64 nmake /fNmakefile Build using buildsys/gmake and MinGW: 32-bit: .\configure.bat /target-x86 /tool-gcc make 64-bit: .\configure.bat /target-x64 /tool-gcc make Build using CMake and Nmake: Put the appropriate tool-chain in path (32 or 64-bit version of MSVC), then: cmake -G "NMake Makefiles" ${DYNCALL_SOURCE_DIR} nmake Build using CMake and Visual Studio: 32-bit: cmake . open DynCall.sln BROKEN: Rules to assemble MASM files are still missing. nqp-2013.12.1/3rdparty/dyncall/README.embedded000066400000000000000000000055711225523575400204470ustar00rootroot00000000000000Makefile.embedded - hybrid DynCall makefiles for GNU, BSD and SUN make. =============================================================================== Brief overview -------------- This is one of the latest build systems designed for DynCall. It was designed for being embeddable in bigger 'make' based systems. It uses a very simple structure and it does not require any 'configure' phase. Instead the user can specify the CFLAGS and LDFLAGS by himself. For a couple of platforms, the make system supports phony targets of popular operating-systems such as 'bsd'. Building the library: --------------------- $ make -f Makefile.embedded Building the tests: ------------------- $ cd test ; make -f Makefile.embedded Installation: ------------- $ make -f Makefile.embedded PREFIX=/usr/local install Installation with support for DESTDIR: -------------------------------------- $ make -f Makefile.embedded DESTDIR=/tmp/staging PREFIX=/usr/local install Available variants: ------------------- bsd Free/Net/Open/DragonFly/Mir BSD linux Linux osx Mac OS X osx-universal Mac OS X universal binaries (i386,x86_64 and ppc) sun SunOS and Sun Pro compiler sun-64bit SunOS and Sun Pro compiler for sparc64(? amd64) sun-gcc SunOS and GCC compiler sun-gcc-64bit SunOS and GCC compiler for sparc64 (? amd64) Tweaking the build: ------------------- $ VAR1= VAR2= .. make -f Makefile.embedded Adding a variant ---------------- Currently we deal with two files to specify a custom target. The top-level Makefile.embedded controls for building the libraries. Useful variables are AR, CC, CFLAGS and ASFLAGS. The test/Makefile.embedded file controls for building the tests. The tests currently involve sometimes C++ and some platforms need to link with the math library. Others need the dynamic linker. Useful variables are CXX, CC, CCC (Sun), CFLAGS, CCFLAGS (Sun), CXXFLAGS andLDFLAGS. Background ----------- During the preparation for the public release of the R package 'rdyncall' I was looking for a way to get DynCall integrated into an existing Make system such as offered by R for build R packages. It was inspired by the make files of Lua which are damn simple and don't need a configure but a user that knows the target platform name. The source package can be configured automatically during compilation and does not require explicit configuration anymore using "*.S" files that are Assembly files which are preprocessed by the C Preprocessor. This feature is available by GCC and SunPro compilers. Limitations ----------- Mac OS X universal static libraries require to use 'libtool -static -o libname.a obj1.o obj2.o ...' instead of 'ar cru libname.a obj1.o obj2.o'. We use predefined variables AR and ARFLAGS. The variant osx-universal uses AR=libtool. nqp-2013.12.1/3rdparty/dyncall/README.iOS000066400000000000000000000015741225523575400174070ustar00rootroot00000000000000DynCall for apple's iOS platforms (iPod touch, iPhone, iPad) Environment Setup for Cross-Compilation using iPhone SDK: $ source buildsys/scripts/setenv-sdk-ios.sh Package Configuration $ ./configure --target-iphoneos --with-iphonesdk=3.2 Building $ make Details: Useful configure switches: --target-iphoneos --with-iphoensdk= (tested with 2.0 up to 4.0) --tool-gcc (default) --tool-llvm-gcc --target-arm32-arm --target-arm32-thumb --target-universal Supported Tool-chains gcc and llvm-gcc Supported SDKs SDKs starting with 2.0 up to 4.0 have been tested. Bugs No armv7 support. Building with Makefile.generic .. $ source buildsys/scripts/setenv-sdk-ios.sh $ source buildsys/scripts/setenv-cross-ios.sh make -f Makefile.generic ... uses armv6 and sdk 3.2 as default, can be changed in 'setenv-cross-ios.sh'. nqp-2013.12.1/3rdparty/dyncall/README.iPhoneOS000066400000000000000000000016011225523575400203700ustar00rootroot00000000000000DynCall for apple's iPhoneOS platforms (iPod touch, iPhone, iPad) Environment Setup for Cross-Compilation using iPhone SDK: $ source buildsys/scripts/setenv-sdk-ios.sh Package Configuration $ ./configure --target-iphoneos --with-iphonesdk=3.2 Building $ make Details: Useful configure switches: --target-iphoneos --with-iphoensdk= (tested with 2.0 up to 4.0) --tool-gcc (default) --tool-llvm-gcc --target-arm32-arm --target-arm32-thumb --target-universal Supported Tool-chains gcc and llvm-gcc Supported SDKs SDKs starting with 2.0 up to 4.0 have been tested. Bugs No armv7 support. Building with Makefile.generic .. $ source buildsys/scripts/setenv-sdk-ios.sh $ source buildsys/scripts/setenv-cross-ios.sh make -f Makefile.generic ... uses armv6 and sdk 3.2 as default, can be changed in 'setenv-cross-ios.sh'. nqp-2013.12.1/3rdparty/dyncall/README.txt000066400000000000000000000016311225523575400175260ustar00rootroot00000000000000The DynCall Project Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. See doc/manual.pdf and http://dyncall.org for detailed information. nqp-2013.12.1/3rdparty/dyncall/ToDo000066400000000000000000000102141225523575400166150ustar00rootroot00000000000000build-system: ------------- - cxx or cpp, overlay on OpenBSD/make for cpp rule? - add dependencies to Makefile.{generic|embedded} - CPPFLAGS ? - out-of-source building - cmake bites with buildsys/bsdmake and buildsys/gmake cmake generates Makefile files which have lower prio than {GNU|BSD}makefile's. buildsys/gmake fails if no top-level configure file is found with a message to cmake users. buildsys/bsdmake silently builds without configure file and no cmake-based build files is used at all. workaround: make -f Makefile - cmake mac os x universal binary builds with *.S does not build multiple architectures portasm: -------- - add solaris support for x64 dyncall: -------- - support for 'long double' - check if dcMode can be implemented in dcCallVM_XXX.c files directly.. - port x64: split callvm into a sysv and a win64, both available at run-time - port ppc64 - support for return values: aggregate return values - support for argument values: structures, half-precision, vector types, long double - varargs for x64, mips dynload: -------- - bug: test/nm crashes on qemu mips linux o32 debian etch - test/resolve_self crashes/asserts on windows and bsds - rename SymsInit to InitSyms and similar for cleanup function to reflect naming in dyncall - get rid of Dl_info and friends (_GNU_SOURCE) in dynload/dynload_syms_elf.c for implementation of dlSymsNameFromValue(..) dyncallback: ------------ - callback_plain's return value not correct anymore on NDS (maybe just broken testcode?) - add MIPS callbacks - finish PPC32 callbacks - add Plan9 support urgent issues: -------------- - add SPARC/SPARC64 calling conventions to doc's callconv-appendix !!! - finish dyncallback doc, finish dynload doc, add both to troff doc - Haiku/gmake build doesn't build dynload due to the fact, that elf.h is not found on default installations (one has to install the system headers) * add to doc - Solaris/gmake build doesn't build dynload and tests anymore (maybe not even dyncallback) - test arm32/ATPCS/THUMB (and then change Status in doc Appendix) - look over code and fix TODO or @@@ marks - consider moving bindings into dyncall/ such that releases include it in the future * or, alternatively, pack them separately and put them on the website, for releases - add note to documentation, that bindings are svn-only ATM - add pcc-support to doc - check why the iyonix, etc. platforms have been taken out of 'configure' - rename configure to configure.sh (so we would have .sh, .rc and .bat in the future) - not sure, but configure(.sh) --tool-xxx might overwrite --asm-xxx, in some cases nice to have: ------------- - enhance manual with a couple of examples (e.g. calling MessageBoxA on windows, etc.) - update: microsoft visual c++ build files - integrate all test suites in solution file - rename iPhoneOS to iOS (mostly done) - maybe rename DC__Arch_PowerPC to ...PPC32 for coherency reasons (...PPC64)? - consistency: on x64 platforms: make both ABIs available ('win64','sysv') for all x64 OS ports - microsoft build enhancement: autodetect assembly via C preprocessor (like with .S gcc files) - enhancement: state-machine error reporting (stack overflow and invalid mode)? (e.g. dcError() ) - test/thunk: some platforms do not allow for allocation of executable code on heap and stack -- currently this test will crash, maybe we should collect information which platforms allow and which not. bugs: ----- - vararg function calls don't work for PPC32 System V ABI - callbacks don't work for PPC32 System V ABI - vararg function calls don't work for ARM THUMB mode (Daniel's new interface for modesetting for varag args should be used); adapt test/ellipsis missing implementations (descending priority): ---------------------------------------------- - ppc64 - itanium - 68k, 88k, 6502, etc. - alpha - sh - cell - blackfin - z80 - hppa - vax - atmel avr - propeller - amd29k - arc - seaforth available hardware for outstanding ports: ----------------------------------------- - 68k: Tassilo's old Palm m100 (MC68EZ328 (16MHz)) - sh4: Tassilo's Dreamcast - mips R5900: Daniel's PS2 - mips (?): Daniel's router - sigmatel stmp3550b: Daniel's iPod Nano - spekul's sparc, sparc64 nqp-2013.12.1/3rdparty/dyncall/autovar/000077500000000000000000000000001225523575400175105ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/autovar/LICENSE.txt000066400000000000000000000013651225523575400213400ustar00rootroot00000000000000Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. nqp-2013.12.1/3rdparty/dyncall/autovar/README.txt000066400000000000000000000012741225523575400212120ustar00rootroot00000000000000autovar -- a small macro auto-detection library the following gives the list of variables available. for each variable, a separate header file is used. OS: Operating System ARCH: Architecture CC: C Compiler ABI: Application Binary Interface OSFAMILY: OS Roots the following gives the tree of variables OS: Win32 Win64 Darwin IOS MacOSX Linux FreeBSD OpenBSD NetBSD DragonFlyBSD SunOS Cygwin MinGW NDS PSP BeOS Plan9 VMS Minix Unknown ARCH: X86 X64 IA64 PPC PPC64 MIPS64 MIPS ARM THUMB SH SPARC64 SPARC ABI: PE Mach ELF ELF32 ELF64 OSFAMILY: Windows Unix CC: INTEL MSVC GNU WATCOM PCC SUN nqp-2013.12.1/3rdparty/dyncall/autovar/autovar_ABI.h000066400000000000000000000024541225523575400220220ustar00rootroot00000000000000/* Package: dyncall Library: autovar File: autovar/autovar_ABI.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_ABI_H #define AUTOVAR_ABI_H #include "autovar_OS.h" #if defined(OS_Win32) || defined(OS_Win64) || defined(OS_Cygwin) || defined(OS_MinGW) #define ABI_PE #elif defined(OS_Darwin) #define ABI_Mach #else #define ABI_ELF # if defined(__LP64__) || defined(_LP64) # define ABI_ELF64 # else # define ABI_ELF32 # endif #endif #endif /* AUTOVAR_ABI_H */ nqp-2013.12.1/3rdparty/dyncall/autovar/autovar_ARCH.h000066400000000000000000000040241225523575400221370ustar00rootroot00000000000000/* Package: dyncall Library: autovar File: autovar/autovar_ARCH.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_ARCH_H #define AUTOVAR_ARCH_H /* Check architecture. */ #if defined(_M_IX86) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__386__) || defined(__i386) # define ARCH_X86 #elif defined(_M_X64_) || defined(_M_AMD64) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) # define ARCH_X64 #elif defined(_M_IA64) || defined(__ia64__) # define ARCH_IA64 #elif defined(_M_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__ppc__) || defined(__power__) # define ARCH_PPC #elif defined(__ppc64__) || defined(_ARCH_PPC64) || defined(__power64__) # define ARCH_PPC64 #elif defined(__mips64__) # define ARCH_MIPS64 #elif defined(_M_MRX000) || defined(__mips__) # define ARCH_MIPS #elif defined(__arm__) # define ARCH_ARM # if defined(__thumb__) # define ARCH_THUMB # endif #elif defined(__sh__) # define ARCH_SH #elif defined(__sparcv9) || ( defined(__sparc) && defined(__arch64__) ) # define ARCH_SPARC64 #elif defined(__sparc) # define ARCH_SPARC #endif #endif /* AUTOVAR_ARCH_H */ nqp-2013.12.1/3rdparty/dyncall/autovar/autovar_CC.h000066400000000000000000000026111225523575400217070ustar00rootroot00000000000000/* Package: dyncall Library: autovar File: autovar/autovar_CC.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_CC_H #define AUTOVAR_CC_H /* Compiler specific defines. Do not change the order, because */ /* some of the compilers define flags for compatible ones, too. */ #if defined(__INTEL_COMPILER) #define CC_INTEL #elif defined(_MSC_VER) #define CC_MSVC #elif defined(__GNUC__) #define CC_GNU #elif defined(__WATCOMC__) #define CC_WATCOM #elif defined(__PCC__) #define CC_PCC #elif defined(__SUNPRO_C) #define CC_SUN #endif #endif /* AUTOVAR_CC_H */ nqp-2013.12.1/3rdparty/dyncall/autovar/autovar_OS.h000066400000000000000000000043551225523575400217520ustar00rootroot00000000000000/* Package: dyncall Library: autovar File: autovar/autovar_OS.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_OS_H #define AUTOVAR_OS_H #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) # define OS_Win64 #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__WINDOWS__) || defined(_WINDOWS) # define OS_Win32 #elif defined(__APPLE__) || defined(__Darwin__) # define OS_Darwin # if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) # define OS_IOS # else /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */ # define OS_MacOSX # endif #elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__) # define OS_Linux #elif defined(__FreeBSD__) # define OS_FreeBSD #elif defined(__OpenBSD__) # define OS_OpenBSD #elif defined(__NetBSD__) # define OS_NetBSD #elif defined(__DragonFly__) # define OS_DragonFlyBSD #elif defined(__sun__) || defined(__sun) || defined(sun) # define OS_SunOS #elif defined(__CYGWIN__) # define OS_Cygwin #elif defined(__MINGW__) # define OS_MinGW #elif defined(__nds__) # define OS_NDS #elif defined(__psp__) || defined(PSP) # define OS_PSP #elif defined(__HAIKU__) || defined(__BEOS__) # define OS_BeOS #elif defined(Plan9) || defined(__Plan9__) # define OS_Plan9 #elif defined(__vms) # define OS_VMS #elif defined(__minix) # define OS_Minix #else # define OS_Unknown #endif #endif /* AUTOVAR_OS */ nqp-2013.12.1/3rdparty/dyncall/autovar/autovar_OSFAMILY.h000066400000000000000000000023371225523575400226520ustar00rootroot00000000000000/* Package: dyncall Library: autovar File: autovar/autovar_OSFAMILY.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_OSFAMILY_H #define AUTOVAR_OSFAMILY_H #include "autovar_OS.h" #if defined(OS_Win32) || defined(OS_Win64) #define OSFAMILY_Windows #elif defined(OS_NDS) || defined(OS_PSP) #define OSFAMILY_GameConsole #else #define OSFAMILY_Unix #endif #endif /* AUTOVAR_OSFAMILY_H */ nqp-2013.12.1/3rdparty/dyncall/buildsys/000077500000000000000000000000001225523575400176655ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/000077500000000000000000000000001225523575400212735ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/README.txt000066400000000000000000000057351225523575400230030ustar00rootroot00000000000000dyncall bsdmake build system manual Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. configuration: Prior to running "make" the library, one should run "configure" first. This will create the file 'ConfigVars' defining some variables identifying the system to build the library for. BUILD_OS - "{Free,Net,Open,DragonFly}BSD","SunOS","Darwin" BUILD_ARCH - "X86","PPC32","X64" BUILD_TOOL - "GCC","PCC" BUILD_ASM default: as on x86 and x64 arch: nasm, as site configuration: file 'SiteVars' overrides 'ConfigVars' targets: all - build dirs and targets clean - clean up targets and objects distclean - cleans targets, objects and auto-generated files build settings: ASM - specifies assembler; defaults to as@@@ project settings: TOP points relative to source root DIRS directories to sub-process for targets depending on subdirs APP name of application (w/o suffix of prefix) - will be built if set DLL name of dynamic library (w/o suffix of prefix) - will be built if set LIBRARY name of static library (w/o suffix of prefix) - will be built if set UNITS specifies the units to link MODS specifies modules to link (deprecated - use UNITS instead) LDLIBS link libraries LDFLAGS link flags changes from daniel: - added UNITS variable that deprecates MODS - added .S.o implied rule urgent issues from daniel: - no TARGET_ARCH variable in implied build rules needed to make universal binaries work, and also helpful for gcc cross-compilation and target fine-tuning in general. - handle arch "universal" (for darwin) .. means: TARGET_ARCH = -arch i386 -arch ppc -arch x86_64 [ -arch ppc64 ] - no CPPFLAGS variable in implied build rules one place for all pre-processor issues (regardless of C, C++, Objective-C...) - force -fPIC in general for x64 low-prio issues (wishlist) from daniel: - cross-compilation through overloading CC,CXX,... is this possible on bsdmake? - sync with gmake variable names rename APP -> TARGET_APP DLL -> TARGET_DLL LIBRARY -> TARGET_LIB - separate build directories - not an issue, but helpful: introduce BSDMAKE_TOP to allow bsdmake to life externally - see GMAKE_TOP variable for example nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/common.bsdmake000066400000000000000000000035061225523575400241170ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # common.bsdmake # --- phony targets ------------------------------------------------------------ .PHONY: build autos clean dirs distclean depend $(DIRS) build: dirs autos $(TARGETS) CLEAN_FILES=$(TARGETS) $(OBJS) clean: dirs .SILENT echo Cleaning $(.CURDIR)... rm -f $(CLEAN_FILES) || true AUTO_FILES=$(AUTOS) $(AUTO_DIRS) distclean: clean .SILENT echo Cleaning auto-generated files in $(.CURDIR)... rm -f $(AUTOS) $(AUTO_DIRS) || true # --- auto generated ----------------------------------------------------------- autos: $(AUTOS) # --- handling sub directories ------------------------------------------------- .if defined(DIRS) dirs: $(DIRS) $(DIRS): .SILENT echo Handling sub-directory $(.TARGET)... cd $(.TARGET) && $(MAKE) -f BSDmakefile $(.MAKEFLAGS) $(.TARGETS) .else dirs: .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/epilog.bsdmake000066400000000000000000000030631225523575400241040ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # epilog.bsdmake .if defined(BUILD_TOOL) && $(BUILD_TOOL) == gcc . include "$(TOP)/buildsys/bsdmake/gcc.bsdmake" .endif .if defined(BUILD_TOOL) && $(BUILD_TOOL) == pcc . include "$(TOP)/buildsys/bsdmake/pcc.bsdmake" .endif .include "$(TOP)/buildsys/bsdmake/unix.bsdmake" .if defined(BUILD_OS) && $(BUILD_OS) == darwin . include "$(TOP)/buildsys/bsdmake/osx.bsdmake" .endif .include "$(TOP)/buildsys/bsdmake/targets.bsdmake" .include "$(TOP)/buildsys/bsdmake/common.bsdmake" .include "$(TOP)/buildsys/bsdmake/implied.bsdmake" nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/gcc.bsdmake000066400000000000000000000027521225523575400233650ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # gcc.bsdmake # REVISION # 2009/03/23 # dadler: cross-compilation support through externally specified variables CC ?= gcc CXX ?= g++ AR ?= ar AS ?= as LD ?= g++ # to link in standard libs automatically .if $(BUILD_CONFIG) == "debug" CFLAGS += -ggdb3 .endif .if $(BUILD_ARCH) == "arm32_thumb" ASFLAGS += -mthumb -mthumb-interwork CFLAGS += -mthumb -mthumb-interwork CXXFLAGS += -mthumb -mthumb-interwork LDFLAGS += -mthumb -mthumb-interwork .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/implied.bsdmake000066400000000000000000000040501225523575400242450ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # implied.bsdmake # REVISION # 2009/03/23 # dadler: Added preprocessor assembly rules for .S files. # 2011/05/04 # dadler: We switch from *.cpp -> *.cc. Added .cc suffix and rule. .SUFFIXES: .SUFFIXES: .o .c .cpp .s .S .pdf .tex .cc .c.o: .SILENT echo .c.o: Compiling $(.IMPSRC)... $(CC) $(CPPFLAGS) $(CFLAGS) -I$(TOP)/dyncall -I$(TOP)/dyncallback $(TARGET_ARCH) -c $(.IMPSRC) -o $(.TARGET) .cpp.o: .SILENT echo .cpp.o: Compiling $(.IMPSRC)... $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(TOP)/dyncall -I$(TOP)/dyncallback $(TARGET_ARCH) -c $(.IMPSRC) -o $(.TARGET) .cc.o: .SILENT echo .cc.o: Compiling $(.IMPSRC)... $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(TOP)/dyncall -I$(TOP)/dyncallback $(TARGET_ARCH) -c $(.IMPSRC) -o $(.TARGET) .s.o: .SILENT echo .s.o: Compiling $(.IMPSRC)... $(AS) $(ASFLAGS) -o $(.TARGET) $(.IMPSRC) .S.o: .SILENT echo .s.o: Compiling $(.IMPSRC)... $(CC) $(CPPFLAGS) $(CFLAGS) $(TARGET_MACH) -c $(.IMPSRC) -o $(.TARGET) .tex.pdf: .SILENT echo .tex.pdf: Creating $(.TARGET)... pdflatex $(.IMPSRC) nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/osx.bsdmake000066400000000000000000000031251225523575400234350ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # osx.bsdmake # REVISION # 2009/03/23 dadler # * overload LINK_LIB_CMD (from unix) to use darwin's "libtool" # * added "universal build support" DLL_SUFFIX = .dylib as_FLAGS = LINK_DLL_CMD = $(CXX) -o $(.TARGET) -dynamiclib $(LDFLAGS) $(.ALLSRC) $(LIBS) #LINK_DLL_CMD = $(LD) -o $(.TARGET) -dylib $(LDFLAGS) $(.ALLSRC) $(LIBS) LINK_LIB_CMD = /usr/bin/libtool -static -o $(.TARGET) $(.ALLSRC) #LINK_LIB_CMD = ar -r $(.TARGET) $(.ALLSRC) .if $(BUILD_ARCH) == "universal" TARGET_ARCH = -arch i386 -arch ppc -arch x86_64 TARGET_MACH = $(TARGET_ARCH) .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/pcc.bsdmake000066400000000000000000000022361225523575400233730ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # pcc.bsdmake # REVISION # 2010/02/09 # dadler: initial support CC ?= pcc .if $(BUILD_CONFIG) == "debug" CFLAGS += -g .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/prolog.bsdmake000066400000000000000000000034121225523575400241250ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # prolog.bsdmake # Standard 'build all' target. .PHONY: all all: build # Include config rules. .if exists($(TOP)/ConfigVars) . include "$(TOP)/ConfigVars" .endif BUILD_HOST ?= $(CONFIG_HOST) BUILD_OS ?= $(CONFIG_OS) BUILD_ARCH ?= $(CONFIG_ARCH) BUILD_TOOL ?= $(CONFIG_TOOL) BUILD_ASM ?= $(CONFIG_ASM) BUILD_CONFIG ?= $(CONFIG_CONFIG) # Check if library has been 'configured' properly. If not, tell the user and abort. .if !defined(BUILD_OS) || !defined(BUILD_ARCH) || !defined(BUILD_TOOL) config: $(TOP)/ConfigVars $(TOP)/ConfigVars: .SILENT echo "Library not configured! Run ./configure from the library's root directory first!" false .else config: .endif # Local config. .if exists($(TOP)/SiteVars) . include "$(TOP)/SiteVars" .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/targets.bsdmake000066400000000000000000000035771225523575400243100ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # targets.bsdmake # REVISION # 2009/03/23 # dadler: Added UNITS variable, makes MODS deprecated # Create a list of .o files to make. OBJS_ != echo $(UNITS) | sed s/[[:\>:]]/$(OBJ_SUFFIX)/g OBJS += $(OBJS_) # Deprecated: OBJS2_ != echo $(MODS) | sed s/[[:\>:]]/$(OBJ_SUFFIX)/g OBJS += $(OBJS2_) # applications .if defined(APP) APP_FILE = $(APP_PREFIX)$(APP)$(APP_SUFFIX) TARGETS += $(APP_FILE) $(APP_FILE): $(OBJS) .SILENT echo Linking $(.TARGET)... $(LINK_APP_CMD) .endif # dynamic libraries .if defined(DLL) DLL_FILE = $(DLL_PREFIX)$(DLL)$(DLL_SUFFIX) TARGETS += $(DLL_FILE) $(DLL_FILE): $(OBJS) .SILENT echo Linking $(.TARGET)... $(LINK_DLL_CMD) .endif # library .if defined(LIBRARY) LIB_FILE = $(LIB_PREFIX)$(LIBRARY)$(LIB_SUFFIX) TARGETS += $(LIB_FILE) $(LIB_FILE): $(OBJS) .SILENT echo Creating archive $(.TARGET)... $(LINK_LIB_CMD) .endif nqp-2013.12.1/3rdparty/dyncall/buildsys/bsdmake/unix.bsdmake000066400000000000000000000033101225523575400236030ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # dyncall bsdmake build system # unix.bsdmake # Set default unix *fixes if unspecified. OBJ_SUFFIX ?= .o LIB_PREFIX ?= lib LIB_SUFFIX ?= _s.a APP_PREFIX ?= APP_SUFFIX ?= DLL_PREFIX ?= lib DLL_SUFFIX ?= .so # Assembler flags. as_FLAGS ?= --defsym BUILD_OS_$(BUILD_OS)=1 --defsym BUILD_ARCH_$(BUILD_ARCH)=1 nasm_FLAGS ?= -D BUILD_OS_$(BUILD_OS)=1 -D BUILD_ARCH_$(BUILD_ARCH)=1 LINK_LIB_CMD = $(AR) $(ARFLAGS) $(.TARGET) $(.ALLSRC) LINK_DLL_CMD = $(CXX) -o $(.TARGET) -shared $(LDFLAGS) $(.ALLSRC) $(LIBS) LINK_APP_CMD = $(CXX) -o $(.TARGET) $(LDFLAGS) $(.ALLSRC) $(LIBS) #LINK_DLL_CMD = $(LD) -o $(.TARGET) -shared $(LDFLAGS) $(.ALLSRC) $(LIBS) #LINK_APP_CMD = $(LD) -o $(.TARGET) $(LDFLAGS) $(.ALLSRC) $(LIBS) nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/000077500000000000000000000000001225523575400207455ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/Modules/000077500000000000000000000000001225523575400223555ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/Modules/FindDynCall.cmake000066400000000000000000000030311225523575400255030ustar00rootroot00000000000000# - Try to find dyncall library # # The following variables will be defined: # # DYNCALL_FOUND # DYNCALL_INCLUDE_DIRS # DYNCALL_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/CMakeLists.txt # Description: CMake Module to find DynCall library # License: # # Copyright (c) 2010,2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNCALL_INCLUDE_DIR NAMES dyncall.h) find_library(DYNCALL_LIBRARY dyncall_s) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynCall DEFAULT_MSG DYNCALL_LIBRARY DYNCALL_INCLUDE_DIR) if(DYNCALL_FOUND) set(DYNCALL_INCLUDE_DIRS ${DYNCALL_INCLUDE_DIR}) set(DYNCALL_LIBRARIES ${DYNCALL_LIBRARY}) endif(DYNCALL_FOUND) mark_as_advanced(DYNCALL_INCLUDE_DIR DYNCALL_LIBRARY) nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/Modules/FindDynCallback.cmake000066400000000000000000000031521225523575400263300ustar00rootroot00000000000000# - Try to find DynLoad library # # The following variables will be defined: # # DYNCALLBACK_FOUND # DYNCALLBACK_INCLUDE_DIRS # DYNCALLBACK_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/FindDynLoad.cmake # Description: CMake Module to find dynload library # License: # # Copyright (c) 2010,2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNCALLBACK_INCLUDE_DIR NAMES dyncall_callback.h) find_library(DYNCALLBACK_LIBRARY dyncallback_s) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynCallback DEFAULT_MSG DYNCALLBACK_LIBRARY DYNCALLBACK_INCLUDE_DIR) if(DYNCALLBACK_FOUND) set(DYNCALLBACK_INCLUDE_DIRS ${DYNCALLBACK_INCLUDE_DIR}) set(DYNCALLBACK_LIBRARIES ${DYNCALLBACK_LIBRARY}) endif(DYNCALLBACK_FOUND) mark_as_advanced(DYNCALLBACK_INCLUDE_DIR DYNCALLBACK_LIBRARY) nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/Modules/FindDynLoad.cmake000066400000000000000000000031231225523575400255110ustar00rootroot00000000000000# - Try to find dynload library # # The following variables will be defined: # # DYNLOAD_FOUND # DYNLOAD_INCLUDE_DIRS # DYNLOAD_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/FindDynLoad.cmake # Description: CMake Module to find dynload library # License: # # Copyright (c) 2010-2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNLOAD_INCLUDE_DIR NAMES dynload.h) find_library(DYNLOAD_LIBRARY dynload_s) mark_as_advanced(DYNLOAD_INCLUDE_DIR DYNLOAD_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynLoad DEFAULT_MSG DYNLOAD_LIBRARY DYNLOAD_INCLUDE_DIR) if(DYNLOAD_FOUND) set(DYNLOAD_INCLUDE_DIRS ${DYNLOAD_INCLUDE_DIR}) set(DYNLOAD_LIBRARIES ${DYNLOAD_LIBRARY}) endif(DYNLOAD_FOUND) mark_as_advanced(DYNLOAD_INCLUDE_DIR DYNLOAD_LIBRARY) nqp-2013.12.1/3rdparty/dyncall/buildsys/cmake/Modules/UseLATEX.cmake000066400000000000000000001010261225523575400247110ustar00rootroot00000000000000# File: UseLATEX.cmake # CMAKE commands to actually use the LaTeX compiler # Version: 1.7.2 # Author: Kenneth Moreland (kmorel at sandia dot gov) # # Copyright 2004 Sandia Corporation. # Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive # license for use of this work by or on behalf of the # U.S. Government. Redistribution and use in source and binary forms, with # or without modification, are permitted provided that this Notice and any # statement of authorship are reproduced on all copies. # # The following MACROS are defined: # # ADD_LATEX_DOCUMENT( # [BIBFILES ] # [INPUTS ] # [IMAGE_DIRS] # [IMAGES] # [CONFIGURE] # [DEPENDS] # [USE_INDEX] [USE_GLOSSARY] # [DEFAULT_PDF] [MANGLE_TARGET_NAMES]) # Adds targets that compile . The latex output is placed # in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is # not set. The latex program is picky about where files are located, # so all input files are copied from the source directory to the # output directory. This includes the target tex file, any tex file # listed with the INPUTS option, the bibliography files listed with # the BIBFILES option, and any .cls, .bst, and .clo files found in # the current source directory. Images found in the IMAGE_DIRS # directories or listed by IMAGES are also copied to the output # directory and coverted to an appropriate format if necessary. Any # tex files also listed with the CONFIGURE option are also processed # with the CMake CONFIGURE_FILE command (with the @ONLY flag. Any # file listed in CONFIGURE but not the target tex file or listed with # INPUTS has no effect. DEPENDS can be used to specify generated files # that are needed to compile the latex target. # # The following targets are made: # dvi: Makes .dvi # pdf: Makes .pdf using pdflatex. # safepdf: Makes .pdf using ps2pdf. If using the default # program arguments, this will ensure all fonts are # embedded and no lossy compression has been performed # on images. # ps: Makes .ps # html: Makes .html # auxclean: Deletes .aux. This is sometimes necessary # if a LaTeX error occurs and writes a bad aux file. # # The dvi target is added to the ALL. That is, it will be the target # built by default. If the DEFAULT_PDF argument is given, then the # pdf target will be the default instead of dvi. # # If the argument MANGLE_TARGET_NAMES is given, then each of the # target names above will be mangled with the name. This # is to make the targets unique if ADD_LATEX_DOCUMENT is called for # multiple documents. If the argument USE_INDEX is given, then # commands to build an index are made. If the argument USE_GLOSSARY # is given, then commands to build a glossary are made. # # History: # # 1.7.2 Use ps2pdf to convert eps to pdf to get around the problem with # ImageMagick dropping the bounding box (thanks to Lukasz Lis). # # 1.7.1 Fixed some dependency issues. # # 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulo). # # 1.6.1 Ported the makeglossaries command to CMake and embedded the port # into UseLATEX.cmake. # # 1.6.0 Allow the use of the makeglossaries command. Thanks to Oystein # S. Haaland for the patch. # # 1.5.0 Allow any type of file in the INPUTS lists, not just tex file # (suggested by Eric Noulard). As a consequence, the ability to # specify tex files without the .tex extension is removed. The removed # function is of dubious value anyway. # # When copying input files, skip over any file that exists in the # binary directory but does not exist in the source directory with the # assumption that these files were added by some other mechanism. I # find this useful when creating large documents with multiple # chapters that I want to build separately (for speed) as I work on # them. I use the same boilerplate as the starting point for all # and just copy it with different configurations. This was what the # separate ADD_LATEX_DOCUMENT method was supposed to originally be for. # Since its external use is pretty much deprecated, I removed that # documentation. # # 1.4.1 Copy .sty files along with the other class and package files. # # 1.4.0 Added a MANGLE_TARGET_NAMES option that will mangle the target names. # # Fixed problem with copying bib files that became apparent with # CMake 2.4. # # 1.3.0 Added a LATEX_OUTPUT_PATH variable that allows you or the user to # specify where the built latex documents to go. This is especially # handy if you want to do in-source builds. # # Removed the ADD_LATEX_IMAGES macro and absorbed the functionality # into ADD_LATEX_DOCUMENT. The old interface was always kind of # clunky anyway since you had to specify the image directory in both # places. It also made supporting LATEX_OUTPUT_PATH problematic. # # Added support for jpeg files. # # 1.2.0 Changed the configuration options yet again. Removed the NO_CONFIGURE # Replaced it with a CONFIGURE option that lists input files for which # configure should be run. # # The pdf target no longer depends on the dvi target. This allows you # to build latex documents that require pdflatex. Also added an option # to make the pdf target the default one. # # 1.1.1 Added the NO_CONFIGURE option. The @ character can be used when # specifying table column separators. If two or more are used, then # will incorrectly substitute them. # # 1.1.0 Added ability include multiple bib files. Added ability to do copy # sub-tex files for multipart tex files. # # 1.0.0 If both ps and pdf type images exist, just copy the one that # matches the current render mode. Replaced a bunch of STRING # commands with GET_FILENAME_COMPONENT commands that were made to do # the desired function. # # 0.4.0 First version posted to CMake Wiki. # ############################################################################# # Find the location of myself while originally executing. If you do this # inside of a macro, it will recode where the macro was invoked. ############################################################################# SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE} CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE ) ############################################################################# # Generic helper macros ############################################################################# # Helpful list macros. MACRO(LATEX_CAR var) SET(${var} ${ARGV1}) ENDMACRO(LATEX_CAR) MACRO(LATEX_CDR var junk) SET(${var} ${ARGN}) ENDMACRO(LATEX_CDR) MACRO(LATEX_LIST_CONTAINS var value) SET(${var}) FOREACH (value2 ${ARGN}) IF (${value} STREQUAL ${value2}) SET(${var} TRUE) ENDIF (${value} STREQUAL ${value2}) ENDFOREACH (value2) ENDMACRO(LATEX_LIST_CONTAINS) # Parse macro arguments. MACRO(LATEX_PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option}) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) IF (is_arg_name) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name) LATEX_LIST_CONTAINS(is_option ${arg} ${option_names}) IF (is_option) SET(${prefix}_${arg} TRUE) ELSE (is_option) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option) ENDIF (is_arg_name) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(LATEX_PARSE_ARGUMENTS) # Match the contents of a file to a regular expression. MACRO(LATEX_FILE_MATCH variable filename regexp default) # The FILE STRINGS command would be a bit better, but it's not supported on # older versions of CMake. FILE(READ ${filename} file_contents) STRING(REGEX MATCHALL "${regexp}" ${variable} ${file_contents} ) IF (NOT ${variable}) SET(${variable} "${default}") ENDIF (NOT ${variable}) ENDMACRO(LATEX_FILE_MATCH) ############################################################################# # Macros that perform processing during a LaTeX build. ############################################################################# MACRO(LATEX_MAKEGLOSSARIES) MESSAGE("**************************** In makeglossaries") IF (NOT LATEX_TARGET) MESSAGE(SEND_ERROR "Need to define LATEX_TARGET") ENDIF (NOT LATEX_TARGET) IF (NOT MAKEINDEX_COMPILER) MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER") ENDIF (NOT MAKEINDEX_COMPILER) SET(aux_file ${LATEX_TARGET}.aux) IF (NOT EXISTS ${aux_file}) MESSAGE(SEND_ERROR "${aux_file} does not exist. Run latex on your target file.") ENDIF (NOT EXISTS ${aux_file}) LATEX_FILE_MATCH(newglossary_lines ${aux_file} "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "@newglossary{main}{glg}{gls}{glo}" ) LATEX_FILE_MATCH(istfile_line ${aux_file} "@istfilename[ \t]*{([^}]*)}" "@istfilename{${LATEX_TARGET}.ist}" ) STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1" istfile ${istfile_line} ) FOREACH(newglossary ${newglossary_lines}) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "\\1" glossary_name ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\2" glossary_log ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\3" glossary_out ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\4" glossary_in ${newglossary} ) MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}") EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in} ) ENDFOREACH(newglossary) ENDMACRO(LATEX_MAKEGLOSSARIES) ############################################################################# # Helper macros for establishing LaTeX build. ############################################################################# MACRO(LATEX_NEEDIT VAR NAME) IF (NOT ${VAR}) MESSAGE(SEND_ERROR "I need the ${NAME} command.") ENDIF(NOT ${VAR}) ENDMACRO(LATEX_NEEDIT) MACRO(LATEX_WANTIT VAR NAME) IF (NOT ${VAR}) MESSAGE(STATUS "I could not find the ${NAME} command.") ENDIF(NOT ${VAR}) ENDMACRO(LATEX_WANTIT) MACRO(LATEX_SETUP_VARIABLES) SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}" CACHE PATH "If non empty, specifies the location to place LaTeX output." ) FIND_PACKAGE(LATEX) MARK_AS_ADVANCED(CLEAR LATEX_COMPILER PDFLATEX_COMPILER BIBTEX_COMPILER MAKEINDEX_COMPILER DVIPS_CONVERTER PS2PDF_CONVERTER LATEX2HTML_CONVERTER ) LATEX_NEEDIT(LATEX_COMPILER latex) LATEX_WANTIT(PDFLATEX_COMPILER pdflatex) LATEX_NEEDIT(BIBTEX_COMPILER bibtex) LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex) LATEX_WANTIT(DVIPS_CONVERTER dvips) LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf) LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html) SET(LATEX_COMPILER_FLAGS "-interaction=nonstopmode" CACHE STRING "Flags passed to latex.") SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS} CACHE STRING "Flags passed to pdflatex.") SET(BIBTEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to bibtex.") SET(MAKEINDEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeindex.") SET(MAKEGLOSSARIES_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeglossaries.") SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter" CACHE STRING "Flags passed to dvips.") SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode" CACHE STRING "Flags passed to ps2pdf.") SET(LATEX2HTML_CONVERTER_FLAGS "" CACHE STRING "Flags passed to latex2html.") MARK_AS_ADVANCED( LATEX_COMPILER_FLAGS PDFLATEX_COMPILER_FLAGS BIBTEX_COMPILER_FLAGS MAKEINDEX_COMPILER_FLAGS MAKEGLOSSARIES_COMPILER_FLAGS DVIPS_CONVERTER_FLAGS PS2PDF_CONVERTER_FLAGS LATEX2HTML_CONVERTER_FLAGS ) SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS) SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS) SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS) SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS) FIND_PROGRAM(IMAGEMAGICK_CONVERT convert DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)." ) IF (NOT IMAGEMAGICK_CONVERT) MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.") ENDIF (NOT IMAGEMAGICK_CONVERT) OPTION(LATEX_SMALL_IMAGES "If on, the raster images will be converted to 1/6 the original size. This is because papers usually require 600 dpi images whereas most monitors only require at most 96 dpi. Thus, smaller images make smaller files for web distributation and can make it faster to read dvi files." OFF) IF (LATEX_SMALL_IMAGES) SET(LATEX_RASTER_SCALE 16) SET(LATEX_OPPOSITE_RASTER_SCALE 100) ELSE (LATEX_SMALL_IMAGES) SET(LATEX_RASTER_SCALE 100) SET(LATEX_OPPOSITE_RASTER_SCALE 16) ENDIF (LATEX_SMALL_IMAGES) # Just holds extensions for known image types. They should all be lower case. SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps) SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS) SET(LATEX_DVI_IMAGE_EXTENSIONS ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}) SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf) SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg) SET(LATEX_PDF_IMAGE_EXTENSIONS ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) SET(LATEX_IMAGE_EXTENSIONS ${LATEX_DVI_IMAGE_EXTENSIONS} ${LATEX_PDF_IMAGE_EXTENSIONS}) ENDMACRO(LATEX_SETUP_VARIABLES) MACRO(LATEX_GET_OUTPUT_PATH var) SET(${var}) IF (LATEX_OUTPUT_PATH) IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") SET(${var} "${LATEX_OUTPUT_PATH}") ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") ELSE (LATEX_OUTPUT_PATH) IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") SET(${var} "${CMAKE_CURRENT_BINARY_DIR}") ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") ENDIF (LATEX_OUTPUT_PATH) ENDMACRO(LATEX_GET_OUTPUT_PATH) MACRO(LATEX_ADD_CONVERT_COMMAND output_path input_path output_extension input_extension flags) SET (converter ${IMAGEMAGICK_CONVERT}) SET (convert_flags "") # ImageMagick has broken eps to pdf conversion # use ps2pdf instead IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") IF (PS2PDF_CONVERTER) SET (converter ${PS2PDF_CONVERTER}) SET (convert_flags "-dEPSCrop ${flags}") ELSE (PS2PDF_CONVERTER) MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.") ENDIF (PS2PDF_CONVERTER) ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") SET (convert_flags ${flags}) ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") ADD_CUSTOM_COMMAND(OUTPUT ${output_path} COMMAND ${converter} ARGS ${convert_flags} ${input_path} ${output_path} DEPENDS ${input_path} ) ENDMACRO(LATEX_ADD_CONVERT_COMMAND) # Makes custom commands to convert a file to a particular type. MACRO(LATEX_CONVERT_IMAGE output_files input_file output_extension convert_flags output_extensions other_files) SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) LATEX_GET_OUTPUT_PATH(output_dir) GET_FILENAME_COMPONENT(extension "${input_file}" EXT) STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file "${input_file}") LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions}) IF (is_type) IF (convert_flags) LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) ELSE (convert_flags) # As a shortcut, we can just copy the file. ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file} DEPENDS ${input_dir}/${input_file} ) SET(${output_files} ${${output_files}} ${output_dir}/${input_file}) ENDIF (convert_flags) ELSE (is_type) SET(do_convert TRUE) # Check to see if there is another input file of the appropriate type. FOREACH(valid_extension ${output_extensions}) STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file "${input_file}") LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files}) IF (has_native_file) SET(do_convert FALSE) ENDIF (has_native_file) ENDFOREACH(valid_extension) # If we still need to convert, do it. IF (do_convert) LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) ENDIF (do_convert) ENDIF (is_type) ENDMACRO(LATEX_CONVERT_IMAGE) # Adds custom commands to process the given files for dvi and pdf builds. # Adds the output files to the given variables (does not replace). MACRO(LATEX_PROCESS_IMAGES dvi_outputs pdf_outputs) LATEX_GET_OUTPUT_PATH(output_dir) FOREACH(file ${ARGN}) IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") GET_FILENAME_COMPONENT(extension "${file}" EXT) SET(convert_flags) # Check to see if we need to downsample the image. LATEX_LIST_CONTAINS(is_raster extension ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) IF (LATEX_SMALL_IMAGES) IF (is_raster) SET(convert_flags -resize ${LATEX_RASTER_SCALE}%) ENDIF (is_raster) ENDIF (LATEX_SMALL_IMAGES) # Make sure the output directory exists. GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH) MAKE_DIRECTORY("${path}") # Do conversions for dvi. LATEX_CONVERT_IMAGE(${dvi_outputs} "${file}" .eps "${convert_flags}" "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") # Do conversions for pdf. IF (is_raster) LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .png "${convert_flags}" "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") ELSE (is_raster) LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .pdf "${convert_flags}" "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") ENDIF (is_raster) ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") MESSAGE("Could not find file \"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"") ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") ENDFOREACH(file) ENDMACRO(LATEX_PROCESS_IMAGES) MACRO(ADD_LATEX_IMAGES) MESSAGE("The ADD_LATEX_IMAGES macro is deprecated. Image directories are specified with LATEX_ADD_DOCUMENT.") ENDMACRO(ADD_LATEX_IMAGES) MACRO(LATEX_COPY_GLOBBED_FILES pattern dest) FILE(GLOB file_list ${pattern}) FOREACH(in_file ${file_list}) GET_FILENAME_COMPONENT(out_file ${in_file} NAME) CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY) ENDFOREACH(in_file) ENDMACRO(LATEX_COPY_GLOBBED_FILES) MACRO(LATEX_COPY_INPUT_FILE file) LATEX_GET_OUTPUT_PATH(output_dir) IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) GET_FILENAME_COMPONENT(path ${file} PATH) FILE(MAKE_DIRECTORY ${output_dir}/${path}) LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE}) IF (use_config) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} @ONLY ) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS ${CMAKE_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) ELSE (use_config) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) ENDIF (use_config) ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) IF (EXISTS ${output_dir}/${file}) # Special case: output exists but input does not. Assume that it was # created elsewhere and skip the input file copy. ELSE (EXISTS ${output_dir}/${file}) MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") ENDIF (EXISTS ${output_dir}/${file}) ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) ENDMACRO(LATEX_COPY_INPUT_FILE) ############################################################################# # Commands provided by the UseLATEX.cmake "package" ############################################################################# MACRO(LATEX_USAGE command message) MESSAGE(SEND_ERROR "${message}\nUsage: ${command}(\n [BIBFILES ...]\n [INPUTS ...]\n [IMAGE_DIRS ...]\n [IMAGES \n [CONFIGURE ...]\n [DEPENDS ...]\n [USE_INDEX] [USE_GLOSSARY] [DEFAULT_PDF] [MANGLE_TARGET_NAMES])" ) ENDMACRO(LATEX_USAGE command message) # Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the # variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and # LATEX_INPUTS. MACRO(PARSE_ADD_LATEX_ARGUMENTS command) LATEX_PARSE_ARGUMENTS( LATEX "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS" "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;DEFAULT_PDF;MANGLE_TARGET_NAMES" ${ARGN} ) # The first argument is the target latex file. IF (LATEX_DEFAULT_ARGS) LATEX_CAR(LATEX_MAIN_INPUT ${LATEX_DEFAULT_ARGS}) LATEX_CDR(LATEX_DEFAULT_ARGS ${LATEX_DEFAULT_ARGS}) GET_FILENAME_COMPONENT(LATEX_TARGET ${LATEX_MAIN_INPUT} NAME_WE) ELSE (LATEX_DEFAULT_ARGS) LATEX_USAGE(${command} "No tex file target given to ${command}.") ENDIF (LATEX_DEFAULT_ARGS) IF (LATEX_DEFAULT_ARGS) LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}") ENDIF (LATEX_DEFAULT_ARGS) # Backward compatibility between 1.6.0 and 1.6.1. IF (LATEX_USE_GLOSSARIES) SET(LATEX_USE_GLOSSARY TRUE) ENDIF (LATEX_USE_GLOSSARIES) ENDMACRO(PARSE_ADD_LATEX_ARGUMENTS) MACRO(ADD_LATEX_TARGETS) LATEX_GET_OUTPUT_PATH(output_dir) PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV}) # Set up target names. IF (LATEX_MANGLE_TARGET_NAMES) SET(dvi_target ${LATEX_TARGET}_dvi) SET(pdf_target ${LATEX_TARGET}_pdf) SET(ps_target ${LATEX_TARGET}_ps) SET(safepdf_target ${LATEX_TARGET}_safepdf) SET(html_target ${LATEX_TARGET}_html) SET(auxclean_target ${LATEX_TARGET}_auxclean) ELSE (LATEX_MANGLE_TARGET_NAMES) SET(dvi_target dvi) SET(pdf_target pdf) SET(ps_target ps) SET(safepdf_target safepdf) SET(html_target html) SET(auxclean_target auxclean) ENDIF (LATEX_MANGLE_TARGET_NAMES) # For each directory in LATEX_IMAGE_DIRS, glob all the image files and # place them in LATEX_IMAGES. FOREACH(dir ${LATEX_IMAGE_DIRS}) FOREACH(extension ${LATEX_IMAGE_EXTENSIONS}) FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) FOREACH(file ${files}) GET_FILENAME_COMPONENT(filename ${file} NAME) SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename}) ENDFOREACH(file) ENDFOREACH(extension) ENDFOREACH(dir) SET(dvi_images) SET(pdf_images) LATEX_PROCESS_IMAGES(dvi_images pdf_images ${LATEX_IMAGES}) SET(make_dvi_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_pdf_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images}) SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images}) FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input}) SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input}) ENDFOREACH(input) IF (LATEX_BIBFILES) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) FOREACH (bibfile ${LATEX_BIBFILES}) SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile}) SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile}) ENDFOREACH (bibfile ${LATEX_BIBFILES}) ENDIF (LATEX_BIBFILES) IF (LATEX_USE_INDEX) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) ENDIF (LATEX_USE_INDEX) IF (LATEX_USE_GLOSSARY) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${CMAKE_COMMAND} -D LATEX_BUILD_COMMAND=makeglossaries -D LATEX_TARGET=${LATEX_TARGET} -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} -P ${LATEX_USE_LATEX_LOCATION} ) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${CMAKE_COMMAND} -D LATEX_BUILD_COMMAND=makeglossaries -D LATEX_TARGET=${LATEX_TARGET} -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} -P ${LATEX_USE_LATEX_LOCATION} ) ENDIF (LATEX_USE_GLOSSARY) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) # Add commands and targets for building dvi outputs. ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi COMMAND ${make_dvi_command} DEPENDS ${make_dvi_depends} ) IF (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${dvi_target} DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ELSE (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${dvi_target} ALL DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ENDIF (LATEX_DEFAULT_PDF) # Add commands and targets for building pdf outputs (with pdflatex). IF (PDFLATEX_COMPILER) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf COMMAND ${make_pdf_command} DEPENDS ${make_pdf_depends} ) IF (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${pdf_target} ALL DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) ELSE (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${pdf_target} DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) ENDIF (LATEX_DEFAULT_PDF) ENDIF (PDFLATEX_COMPILER) IF (DVIPS_CONVERTER) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ADD_CUSTOM_TARGET(${ps_target} DEPENDS ${output_dir}/${LATEX_TARGET}.ps) IF (PS2PDF_CONVERTER) # Since both the pdf and safepdf targets have the same output, we # cannot properly do the dependencies for both. When selecting safepdf, # simply force a recompile every time. ADD_CUSTOM_TARGET(${safepdf_target} ${CMAKE_COMMAND} -E chdir ${output_dir} ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf ) ADD_DEPENDENCIES(${safepdf_target} ${ps_target}) ENDIF (PS2PDF_CONVERTER) ENDIF (DVIPS_CONVERTER) IF (LATEX2HTML_CONVERTER) ADD_CUSTOM_TARGET(${html_target} ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT} ) ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) ENDIF (LATEX2HTML_CONVERTER) ADD_CUSTOM_TARGET(${auxclean_target} ${CMAKE_COMMAND} -E remove ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.idx ${output_dir}/${LATEX_TARGET}.ind ) ENDMACRO(ADD_LATEX_TARGETS) MACRO(ADD_LATEX_DOCUMENT) LATEX_GET_OUTPUT_PATH(output_dir) IF (output_dir) PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV}) LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT}) FOREACH (bib_file ${LATEX_BIBFILES}) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} COPYONLY) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${bib_file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ) ENDFOREACH (bib_file) FOREACH (input ${LATEX_INPUTS}) LATEX_COPY_INPUT_FILE(${input}) ENDFOREACH(input) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir}) ADD_LATEX_TARGETS(${ARGV}) ENDIF (output_dir) ENDMACRO(ADD_LATEX_DOCUMENT) ############################################################################# # Actually do stuff ############################################################################# IF (LATEX_BUILD_COMMAND) SET(command_handled) IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) LATEX_MAKEGLOSSARIES() SET(command_handled TRUE) ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) IF (NOT command_handled) MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") ENDIF (NOT command_handled) ELSE (LATEX_BUILD_COMMAND) # Must be part of the actual configure (included from CMakeLists.txt). LATEX_SETUP_VARIABLES() ENDIF (LATEX_BUILD_COMMAND) nqp-2013.12.1/3rdparty/dyncall/buildsys/dynmake/000077500000000000000000000000001225523575400213155ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/dynmake/Makefile.base.M000066400000000000000000000035021225523575400240610ustar00rootroot00000000000000#include "../../dyncall/dyncall_macros.h" #if defined(DC_WINDOWS) && defined(MAKE_CMD_nmake) /* Abstractions */ #define _(X) $(X) /* Standard variables */ #define _L(X) X.lib #define _O(X) X.obj #define TARGET @ #define PREREQS ** /* Makefile internal vars for platform abstraction */ MAKEFLAGS_USER = /NOLOGO MAKEFLAG_FILE = /f MAKE_DEFAULT_FILE = dynMakefile SHELL_COMMAND_SEPARATOR = && AR = lib ARFLAGS_USER = /NOLOGO ARFLAGS = ARFLAG_OUT_PREFIX = /OUT: CFLAGS_USER = /nologo /I..\dyncall /I..\dyncallback CFLAGS = _(CFLAGS) _(CFLAGS_USER) LDFLAGS_USER = /nologo /L..\dyncall /L..\dyncallback LDFLAGS = _(LDFLAGS) _(LDFLAGS_USER) LDFLAG_IN_PREFIX = LDFLAG_OUT_PREFIX = /OUT: ASFLAGS_USER = /nologo AFLAGS = _(AFLAGS) _(ASFLAGS_USER) /* Set AFLAGS (without 'S'), which is the standard nmake predefined macro for MASM */ ASFLAGS = _(AFLAGS) RM = del .SUFFIXES : .S .S.obj: cl /nologo /EP $< > $*.asm _(AS) _(ASFLAGS) /c $*.asm del $*.asm #else /* Abstractions */ #define _(X) ${X} /* Standard variables */ #define _L(X) lib##X.a #define _O(X) X.o #define TARGET @ #if defined(MAKE_CMD_gmake) || (defined(DC__OS_Linux) && !defined(MAKE_CMD_bsdmake)) || (defined(DC__OS_Darwin) && !defined(MAKE_CMD_bsdmake)) || (defined(DC__OS_SunOS) && !defined(MAKE_CMD_bsdmake)) # define PREREQS ^ #else # define PREREQS > #endif /* Makefile internal vars for platform abstraction */ MAKEFLAGS_USER = MAKEFLAG_FILE = -f MAKE_DEFAULT_FILE = dynMakefile SHELL_COMMAND_SEPARATOR = ; ARFLAG_OUT_PREFIX = CFLAGS_USER = -I ../dyncall -I ../dyncallback CFLAGS += _(CFLAGS_USER) LDFLAGS_USER = -L../../dyncall -L../../dyncallback LDFLAGS += _(LDFLAGS_USER) LDFLAG_IN_PREFIX = -l LDFLAG_OUT_PREFIX = -o ASFLAGS_USER = RM = rm -f #endif nqp-2013.12.1/3rdparty/dyncall/buildsys/dynmake/dynmake.bat000066400000000000000000000001401225523575400234300ustar00rootroot00000000000000cl /nologo /DMAKE_CMD_%~n2 /EP Makefile.M 1> Makefile.dynmake %2 /NOLOGO /f Makefile.dynmake %1 nqp-2013.12.1/3rdparty/dyncall/buildsys/dynmake/dynmake.sh000066400000000000000000000002711225523575400233010ustar00rootroot00000000000000#!/bin/sh #cpp -D MAKE_CMD_$2 -P Makefile.M | sed "s/^ */ /" > Makefile.dynmake gcc -D MAKE_CMD_$2 -E -P -x c Makefile.M | sed "s/^ */ /" > Makefile.dynmake $2 -f Makefile.dynmake $1 nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/000077500000000000000000000000001225523575400207515ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/doc/000077500000000000000000000000001225523575400215165ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/doc/GNUmakefile000066400000000000000000000021051225523575400235660ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../../.. TARGET_PDF = gmake-manual.pdf include $(TOP)/MakeRules nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/doc/gmake-manual.tex000066400000000000000000000172771225523575400246150ustar00rootroot00000000000000%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \documentclass{article} \newcommand{\var}[1]{{\tt #1}} \newcommand{\val}[1]{"{\tt #1}"} \newcommand{\file}[1]{{\tt #1}} \begin{document} \title{buildsys/gmake} \author{Daniel Adler} \maketitle \section{Usage} \subsection{Configuring the project} Before building a project, one has to configure the project. \begin{verbatim} ./configure .\configure.bat \end{verbatim} The configure script creates a top-level \file{ConfigVars} that specifies a list of \var{CONIFG\_*} variables. Here's a sample \file{ConfigVars} file: \begin{verbatim} CONFIG_OS=windows CONFIG_ARCH=x86 CONFIG_TOOL=gcc BUILD_ASM=as INSTALL_DIR=/usr/local \end{verbatim} \subsection{Building the project} Type {\tt gmake} or {\tt make}\footnote{some platforms use a different Make tool which is accessible as {\tt make} from the command-line. Platforms that need to use {\tt gmake} are: Solaris and all BSD platforms.} on the shell. \subsection{Phony targets} \begin{tabular}{ll} Target & Description \\ \hline \val{default} & Default rule, depends on build \\ \val{dirs} & Traverse sub-directories \\ \val{build} & Build project, depends on dirs \\ \val{install} & Install project, depends on build and dirs \\ \val{clean} & Clean project, depends on dirs \\ \end{tabular} \subsection{Project directory setup} Write up a \file{GNUmakefile} file in some project folder. Specify the relative path to the top-level project directory which contains the \file{buildsys} folder using the \var{TOP} variable. Your project settings are embedded between two includes, namely the prolog and the epilog files. \begin{verbatim} # Sample GNUmakefile for buildsys/gmake TOP = ../.. include $(TOP)/buildsys/gmake/prolog.gmake # ... project directory settings goes here ... include $(TOP)/buildsys/gmake/epilog.gmake \end{verbatim} \pagebreak \section{Configuration variables} \subsection{BUILD\_OS} Specifies the target operating system or embedded run-time platform: \begin{tabular}{ll} Value & Description \\ \hline \val{windows} & Microsoft Windows \\ \val{macosx} & Mac OS X \\ \val{iphoneos}& iPhone OS \\ \val{linux} & Linux \\ \val{sunos} & SunOS \\ \val{freebsd} & FreeBSD \\ \val{openbsd} & OpenBSD \\ \val{netbsd} & NetBSD \\ \val{psp} & Playstation Portable \\ \val{nds} & Nintendo DS \\ \end{tabular} \subsection{BUILD\_ARCH} Specifies the processor architecture: \begin{tabular}{ll} Value & Description \\ \hline \val{x86} & X86 32-bit Architecture \\ \val{x64} & X86 64-bit Architecture \\ \val{ppc32} & PowerPC 32-bit Architecture \\ \val{arm32} & ARM32 Architecture \\ \val{mips32} & MIPS 32-bit Architecture \\ \end{tabular} \subsection{BUILD\_TOOL} Specifies the build tool chain: \begin{tabular}{ll} Value & Description \\ \hline \val{gcc} & GNU Compiler Collection \\ \val{msvc} & Microsoft Visual C++ (windows) \\ \val{pspsdk} & Playstation Portable SDK \\ \val{llvm_gcc} & LLVM with GCC Front-end \\ \end{tabular} \subsection{BUILD\_ASM} Specifies the assembler tool: \begin{tabular}{ll} Value & Description \\ \hline \val{as} & GNU Assembler \\ \val{nasm} & NASM Assembler (x86/x64) \\ \val{ml} & Micrsoft Macro Assembler (x86/x64)\\ \end{tabular} \subsection{Others} \begin{tabular}{ll} Variable name & Description \\ \hline \var{BUILD\_CONFIG} & Build configuration ("release", "debug") \\ \var{INSTALL\_PREFIX} & Installation prefix directory \\ \end{tabular} \section{Predefined variables} \begin{tabular}{ll} Variable name & Description \\ \hline \var{GMAKE\_TOP} & Relative path to folder \file{buildsys/gmake} \\ \var{BUILD\_DIR} & Build directory (e.g. "out-$<$os$>$-$<$arch$>$-$<$tool$>$-$<$config$>$")\\ \hline & OS-specific \\ \hline \var{APP\_SUFFIX} & Application suffix \\ \var{LIB\_SUFFIX} & Static library suffix \\ \var{DLL\_SUFFIX} & Dynamic linked library suffix \\ \hline & Tool-specific \\ \hline \var{LIB\_PREFIX} & Static library prefix \\ \var{OBJ\_SUFFIX} & Object file suffix \\ \end{tabular} All suffixes should include the "." (dot) . \section{Project variables} \begin{tabular}{ll} Variable name & Description \\ \hline \var{TOP} & Relative path to top directory \\ \var{DIRS} & Sub-project directory names \\ \var{UNITS} & List of units to link for target \\ \hline & targets \\ \hline \var{TARGET\_APP} & Build application name \\ \var{TARGET\_LIB} & Build static library name \\ \var{TARGET\_DLL} & Build dynamic library name \\ \var{TARGET\_PDF} & Build PDF manual (sources in latex) \\ \hline & build related \\ \hline \var{ASFLAGS} & Assembler flags \\ \var{CPPFLAGS} & C Preprocessor flags \\ \var{CFLAGS} & C Compiler flags \\ \var{CXXFLAGS} & C++ Compiler flags \\ \var{LINK} & Application linker: \val{c}, \val{c++} or empty (default linker)\\ \var{LINK\_PATHS} & List of library paths \\ \var{LINK\_LIBS} & List of library names \\ \var{CXX\_EXCEPTIONS} & If set to \val{1}, use C++ Exceptions \\ \var{CXX\_RTTI} & If set to \val{1}, use C++ Run-time Type Information \\ \hline & installation related \\ \hline \var{INSTALL\_APP} & If set to \val{1}, install executable to bin install-directory \\ \var{INSTALL\_LIB} & If set to \val{1}, install library to lib install-directory \\ \var{INSTALL\_HEADERS} & List of header files to copy to include install-directory \\ \end{tabular} \pagebreak \section{Inclusion order} \begin{enumerate} \item \file{prolog.gmake} \begin{itemize} \item Set \var{GMAKE\_TOP} variable \item Define \val{default} rule \item Include \file{ConfigVars} \item Define build value variables (\var{BUILD\_*\_*} variables) \item Define \var{BUILD\_DIR} variable and a mkdir rule. \end{itemize} \item \file{epilog.gmake} \begin{itemize} \item Include \file{os/\$(\var{BUILD\_OS}).gmake} \item If \var{BUILD\_ASM\_nasm} is defined then include \file{tool/nasm.gmake} \item Include \file{tool/latex.gmake} \item Include \file{targets.gmake} \end{itemize} \end{enumerate} The os-specific gmake files will typically include \file{tool/\$(\var{BUILD\_TOOL}).gmake} file. The tool-specific gmake file will typically include configuration specific files driven by the \var{BUILD\_CONFIG} define. Other more-specific platforms such as psp and nds might preclude and append additional information depending on platform and tool quirks. \section{OS notes} \begin{description} \item [windows] gcc and msvc tool-chain support \item [psp] gcc only \end{description} \end{document} nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/epilog.gmake000066400000000000000000000025411225523575400232400ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// ifndef BUILD_OS BUILD_OS=generic endif -include $(GMAKE_TOP)/os/$(BUILD_OS).gmake ifdef BUILD_ASM_nasm include $(GMAKE_TOP)/tool/nasm.gmake endif include $(GMAKE_TOP)/tool/latex.gmake include $(GMAKE_TOP)/tool/man.gmake ifndef BUILD_TOOL_pspsdk include $(GMAKE_TOP)/targets.gmake endif build: $(AUTOS) $(DIRS) $(BUILD_DIR) $(TARGETS) $(EXTRA_DIRS) nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/install.gmake000066400000000000000000000053751225523575400234370ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # --- install ----------------------------------------------------------------- # deprecated: ifdef INCLUDES $(warn deprecated: INCLUDES, use HEADERS ) HEADERS ?= $(INCLUDES) endif ifdef INSTALL_INCLUDES $(warn deprecated: INSTALL_INCLUDES, use INSTALL_HEADERS ) INSTALL_HEADERS ?= $(INSTALL_INCLUDES) endif INSTALL_PARTS = install-app install-dll install-lib install-includes install-man3 .PHONY: install $(INSTALL_PARTS) $(INSTALL_PARTS): build install: $(INSTALL_PARTS) ifdef INSTALL_PREFIX INSTALL_BINDIR ?= $(DESTDIR)$(INSTALL_PREFIX)/bin INSTALL_LIBDIR ?= $(DESTDIR)$(INSTALL_PREFIX)/lib INSTALL_INCDIR ?= $(DESTDIR)$(INSTALL_PREFIX)/include INSTALL_MANDIR ?= $(DESTDIR)$(INSTALL_PREFIX)/share/man INSTALL_MAN3DIR ?= $(INSTALL_MANDIR)/man3 $(INSTALL_PREFIX): mkdir -p $(INSTALL_PREFIX) $(INSTALL_BINDIR): mkdir -p $(INSTALL_BINDIR) $(INSTALL_LIBDIR): mkdir -p $(INSTALL_LIBDIR) $(INSTALL_INCDIR): mkdir -p $(INSTALL_INCDIR) $(INSTALL_MANDIR): mkdir -p $(INSTALL_MANDIR) $(INSTALL_MAN3DIR): mkdir -p $(INSTALL_MAN3DIR) endif ifdef INSTALL_ALL INSTALL_LIB ?= 1 INSTALL_APP ?= 1 INSTALL_DLL ?= 1 INSTALL_HEADERS ?= 1 endif ifdef INSTALL_LIB ifdef LIB_FILE install-lib: $(INSTALL_LIBDIR) install -m 644 $(LIB_FILE) $(INSTALL_LIBDIR) endif endif ifdef INSTALL_APP ifdef APP_FILE install-app: $(APP_FILE) $(INSTALL_BINDIR) install $(APP_FILE) $(INSTALL_BINDIR) endif endif ifdef INSTALL_DLL ifdef DLL_FILE install-dll: $(DLL_FILE) $(INSTALL_BINDIR) install -m 644 $(DLL_FILE) $(INSTALL_BINDIR) endif endif ifdef INSTALL_HEADERS install-includes: $(INSTALL_HEADERS) $(INSTALL_INCDIR) install -m 644 $(INSTALL_HEADERS) $(INSTALL_INCDIR) endif ifdef INSTALL_MAN3 install-man3: $(INSTALL_MAN3) $(INSTALL_MAN3DIR) install -m 644 $(INSTALL_MAN3) $(INSTALL_MAN3DIR) endif nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/000077500000000000000000000000001225523575400213725ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/beos.gmake000066400000000000000000000020741225523575400233330ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/cygwin.gmake000066400000000000000000000020451225523575400237010ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// include $(GMAKE_TOP)/os/windows.gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/darwin.gmake000066400000000000000000000027621225523575400236730ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_PREFIX=lib DLL_SUFFIX=.dylib # darwin libtool only, not macports/gnu libtool LIBTOOL_STATIC=/usr/bin/libtool -static -o $@ $^ ifdef BUILD_ARCH_universal TARGET_ARCH?=-arch i386 -arch ppc -arch x86_64 endif ifdef BUILD_ARCH_ppc32 TARGET_ARCH?=-arch ppc endif ifdef BUILD_ARCH_x86 TARGET_ARCH?=-arch i386 endif ifdef BUILD_ARCH_x64 TARGET_ARCH?=-arch x86_64 endif # Make sure TARGET_MACH variable equals TARGET_ARCH TARGET_MACH?=$(TARGET_ARCH) include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/dragonfly.gmake000066400000000000000000000020741225523575400243700ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/freebsd.gmake000066400000000000000000000020741225523575400240150ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/generic.gmake000066400000000000000000000020551225523575400240160ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/iphoneos.gmake000066400000000000000000000033521225523575400242270ustar00rootroot00000000000000# # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # IPHONE SDK 3 supports 2.0, 3.0, 3.1 and 3.2 # IPHONE SDK 4 supports 3.2 and 4.0 CONFIG_IPHONESDK_VERSION ?= 3.2 IPHONESDK_VERSION ?= $(CONFIG_IPHONESDK_VERSION) IPHONESDK_VERSION_MAJOR = $(shell echo $(IPHONESDK_VERSION) | sed 's/^\([0-9]*\).*/\1/') ifeq ("$(IPHONESDK_VERSION_MAJOR)","2") CC = gcc-4.0 CXX = g++-4.0 IPHONESDK_ARCHS += -arch armv6 endif ifeq ("$(IPHONESDK_VERSION_MAJOR)","3") IPHONESDK_ARCHS += -arch armv6 # @@@ TODO: # IPHONESDK_ARCHS += -arch armv6 -mthumb # IPHONESDK_ARCHS += -arch armv7 # IPHONESDK_ARCHS += -arch armv7 -mno-thumb endif ifeq ("$(IPHONESDK_VERSION_MAJOR)","4") IPHONESDK_ARCHS += -arch armv6 # @@@ TODO: # IPHONESDK_ARCHS += -arch armv7 -mno-thumb endif TARGET_ARCH += -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${IPHONESDK_VERSION}.sdk TARGET_ARCH += ${IPHONESDK_ARCHS} include $(GMAKE_TOP)/os/darwin.gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/linux.gmake000066400000000000000000000020741225523575400235420ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/macosx.gmake000066400000000000000000000025771225523575400237050ustar00rootroot00000000000000# # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ifdef BUILD_ARCH_universal TARGET_ARCH?=-arch i386 -arch ppc -arch x86_64 endif ifdef BUILD_ARCH_ppc32 TARGET_ARCH?=-arch ppc endif ifdef BUILD_ARCH_x86 TARGET_ARCH?=-arch i386 endif ifdef BUILD_ARCH_x64 TARGET_ARCH?=-arch x86_64 endif ifdef CONFIG_MACOSXSDK_VERSION MACOSXSDK_VERSION ?= ${CONFIG_MACOSXSDK_VERSION} endif ifdef MACOSXSDK_VERSION ifeq ("${MACOSXSDK_VERSION}","10.4u") CC = gcc-4.0 CXX = g++-4.0 endif TARGET_ARCH+= -isysroot /Developer/SDKs/MacOSX${MACOSXSDK_VERSION}.sdk endif include $(GMAKE_TOP)/os/darwin.gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/msys.gmake000066400000000000000000000020451225523575400233740ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// include $(GMAKE_TOP)/os/windows.gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/nds.gmake000066400000000000000000000020741225523575400231670ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/netbsd.gmake000066400000000000000000000020741225523575400236620ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/openbsd.gmake000066400000000000000000000020741225523575400240350ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/psp.gmake000066400000000000000000000021621225523575400232030ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// ifdef BUILD_TOOL_pspsdk include $(GMAKE_TOP)/tool/pspsdk.gmake else include $(GMAKE_TOP)/tool/psp-gcc.gmake endif nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/sunos.gmake000066400000000000000000000020741225523575400235520ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// DLL_SUFFIX=.so include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/os/windows.gmake000066400000000000000000000023001225523575400240650ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// APP_SUFFIX=.exe DLL_SUFFIX=.dll ifdef TARGET_DLL ifdef DLL_IMPORTLIB LIB_FILE = $(BUILD_DIR)/$(LIB_PREFIX)$(TARGET_DLL)$(LIB_SUFFIX) endif endif include $(GMAKE_TOP)/tool/$(BUILD_TOOL).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/prolog.gmake000066400000000000000000000041031225523575400232570ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// GMAKE_TOP ?= $(TOP)/buildsys/gmake # default rule .PHONY: default build default: build # config settings ifeq ($(wildcard $(TOP)/ConfigVars),) $(error File 'ConfigVars' not found at top directory. Run 'configure' - or, if you use CMake, run 'make -f Makefile' please.) else include $(TOP)/ConfigVars endif # project settings #-include $(TOP)/ProjectVars # setup BUILD_* from CONFIG_* variables BUILD_HOST ?= $(CONFIG_HOST) BUILD_OS ?= $(CONFIG_OS) BUILD_ARCH ?= $(CONFIG_ARCH) BUILD_TOOL ?= $(CONFIG_TOOL) BUILD_ASM ?= $(CONFIG_ASM) BUILD_CONFIG ?= $(CONFIG_CONFIG) # setup INSTALL_* from CONFIG_* variables INSTALL_PREFIX ?= $(CONFIG_PREFIX) ifdef CONFIG_BUILDPREFIX BUILD_DIR ?= $(CONFIG_BUILDPREFIX) else BUILD_DIR ?= build_out/$(BUILD_HOST)_$(BUILD_ARCH)_$(BUILD_TOOL)_$(BUILD_CONFIG) endif # setup BUILD__ conditional variables BUILD_HOST_$(BUILD_HOST)=1 BUILD_OS_$(BUILD_OS)=1 BUILD_ARCH_$(BUILD_ARCH)=1 BUILD_TOOL_$(BUILD_TOOL)=1 BUILD_ASM_$(BUILD_ASM)=1 BUILD_CONFIG_$(BUILD_CONFIG)=1 # setup build directory $(BUILD_DIR): mkdir -p $(BUILD_DIR) nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/targets.gmake000066400000000000000000000057561225523575400234450ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # --- autos ------------------------------------------------------------------- # # auto-generated files are generated first. # ifdef AUTOS TARGETS += $(AUTOS) endif # --- objects ----------------------------------------------------------------- OBJ_SUFFIX ?= .o OBJS += $(foreach X,$(UNITS),$(BUILD_DIR)/$X$(OBJ_SUFFIX)) # --- build application ------------------------------------------------------- ifdef TARGET_APP APP_FILE = $(BUILD_DIR)/$(TARGET_APP)$(APP_SUFFIX) TARGETS += $(APP_FILE) $(APP_FILE): $(OBJS) build-target: $(BUILD_DIR) endif # --- dynamic libraries ------------------------------------------------------- ifdef TARGET_DLL DLL_FILE = $(BUILD_DIR)/$(DLL_PREFIX)$(TARGET_DLL)$(DLL_SUFFIX) TARGETS += $(DLL_FILE) $(DLL_FILE): $(OBJS) build-target: $(BUILD_DIR) endif # --- static library ---------------------------------------------------------- ifdef TARGET_LIB LIB_NAME = $(LIB_PREFIX)$(TARGET_LIB)_s$(LIB_SUFFIX) LIB_FILE = $(BUILD_DIR)/$(LIB_NAME) TARGETS += $(LIB_FILE) $(LIB_FILE): $(OBJS) build-target: $(BUILD_DIR) endif # --- test -------------------------------------------------------------------- ifdef TEST_DIRS .PHONY: test test-dirs $(TEST_DIRS) test-dirs: $(TEST_DIRS) $(TEST_DIRS): $(MAKE_COMMAND) -C $@ $(MAKECMDGOALS) test: test-dirs endif # --- sub-directories --------------------------------------------------------- .PHONY: dirs extra-dirs $(DIRS) $(EXTRA_DIRS) dirs: $(DIRS) ifdef DIRS $(DIRS): $(MAKE_COMMAND) -C $@ $(MAKECMDGOALS) endif extra-dirs: $(EXTRA_DIRS) ifdef EXTRA_DIRS $(EXTRA_DIRS): $(MAKE_COMMAND) -C $@ $(MAKECMDGOALS) endif # --- clean ------------------------------------------------------------------- .PHONY: clean clean: dirs extra-dirs $(RM) $(OBJS) $(TARGETS) # auto-dependency: add OBJS:.o=.d to list of $(RM) args. # --- install ----------------------------------------------------------------- include $(GMAKE_TOP)/install.gmake # --- all -------------------------------------------------------------------- .PHONY: all all: build nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/000077500000000000000000000000001225523575400217265ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/dm.gmake000066400000000000000000000025601225523575400233370ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// CC = dmc CXX = dmc OBJ_SUFFIX = .obj LIB_SUFFIX = .lib # --- compile C --------------------------------------------------------------- $(BUILD_DIR)/%.obj: %.c $(CC) -c $< $(CPPFLAGS) $(CFLAGS) -o $@ # --- build static library ---------------------------------------------------- $(BUILD_DIR)/%.lib: lib -c $@ $^ include $(GMAKE_TOP)/tool/$(BUILD_ASM).gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/gcc.gmake000066400000000000000000000117341225523575400234760ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #////////////////////////////////////////////////////////////////////////////// # GNU Make Buildsystem # GNU Compiler Collection configuration #////////////////////////////////////////////////////////////////////////////// CC = gcc CXX ?= g++ AR ?= ar AS ?= as LD ?= ld OBJ_SUFFIX = .o LIB_PREFIX = lib LIB_SUFFIX = .a # --- build configuration ----------------------------------------------------- include $(GMAKE_TOP)/tool/gcc_$(BUILD_CONFIG).gmake ifdef BUILD_ARCH_arm32_thumb ASFLAGS += -mthumb -mthumb-interwork CFLAGS += -mthumb -mthumb-interwork CXXFLAGS += -mthumb -mthumb-interwork LDFLAGS += -mthumb -mthumb-interwork endif # --- Assemble ---------------------------------------------------------------- # FIXME: # Windows filenames are case-insensitive, ie %.s and %.S match the same files. # Additionally, mingw32-make 3.81 (which ships with older versions of # Strawberry Perl) is subtly different from gmake 3.82 (which ships with newer # ones). # # Putting the %.s rule after the %.S rule and using $(COMPILE.S) for both # .s and .S files (which should be ok - see dyncall/README-Developer.txt) # was the only combination I could get to work. $(BUILD_DIR)/%.o: %.S $(COMPILE.S) $(OUTPUT_OPTION) $< $(BUILD_DIR)/%.o: %.s $(COMPILE.S) $(OUTPUT_OPTION) $< # auto-dependency: disabled, due to problems when including *.d files, see targets.gmake for details # $(CC) -MM -MT $@ $(CPPFLAGS) $< > $(BUILD_DIR)/$*.d # ---Compile flags ------------------------------------------------------------ ifndef COMPILE_PIC ifndef TARGET_APP ifdef BUILD_ARCH_x64 COMPILE_PIC = 1 endif endif endif ifeq ("$(COMPILE_PIC)","1") CXXFLAGS += -fPIC CFLAGS += -fPIC endif # --- C++ Compiler flags ------------------------------------------------------ ifeq ("$(CXX_EXCEPTIONS)","0") CXXFLAGS += -fno-exceptions endif ifeq ("$(CXX_RTTI)","0") CXXFLAGS += -fno-rtti endif # --- Compile C --------------------------------------------------------------- $(BUILD_DIR)/%.o: %.c $(COMPILE.c) $< $(OUTPUT_OPTION) # $(CC) -MM -MT $@ $(CPPFLAGS) $(CFLAGS) $< > $(BUILD_DIR)/$*.d # --- Compile C++ ------------------------------------------------------------- $(BUILD_DIR)/%.o: %.cpp $(COMPILE.cpp) $< $(OUTPUT_OPTION) $(BUILD_DIR)/%.o: %.cc $(COMPILE.cpp) $< $(OUTPUT_OPTION) # $(CXX) -MM -MT $@ $(CPPFLAGS) $(CXXFLAGS) $< > $(BUILD_DIR)/$*.d # --- static library ---------------------------------------------------------- LIBTOOL_STATIC ?= $(AR) -rcs $@ $^ SLASH ?= / $(BUILD_DIR)/%.a: $(RM) $(BUILD_DIR)$(SLASH)$(*F).a $(LIBTOOL_STATIC) # --- dynamic library --------------------------------------------------------- ifdef LINK_DIRS LDFLAGS +=$(foreach X,$(LINK_DIRS),-L$X) endif ifdef LINK_LIBS LDLIBS +=$(foreach X,$(LINK_LIBS),-l$X) endif # --- Build executable -------------------------------------------------------- LINK ?= "c" LINKCMD ?= $(CC) ifeq ("$(LINK)","c++") LINKCMD=$(CXX) endif ifeq ("$(LINK)","c") LINKCMD=$(CC) endif # --- Build dynamic library --------------------------------------------------- DLL_SUFFIX ?= .so ifdef BUILD_OS_windows ifdef DLL_IMPORTLIB TARGETS += $(LIB_FILE) $(BUILD_DIR)/lib%.a $(BUILD_DIR)/%.dll: $(LINKCMD) -shared $^ -Wl,--out-implib,$(BUILD_DIR)/lib$(*F).a $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) else $(BUILD_DIR)/%.dll: $(LINKCMD) -shared $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) endif endif $(BUILD_DIR)/%.so: $(LINKCMD) -shared $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) $(BUILD_DIR)/lib%.dylib: $(LINKCMD) -dynamiclib $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) # --- cross compile ----------------------------------------------------------- ifdef BUILD_HOST_cygwin ifdef BUILD_OS_windows TARGET_ARCH += -mno-cygwin endif endif # --- last rule --------------------------------------------------------------- $(BUILD_DIR)/%$(APP_SUFFIX): $(LINKCMD) $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) # --- Dependencies ------------------------------------------------------------ # -include $(OBJS:.o=.d) nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/gcc_debug.gmake000066400000000000000000000020621225523575400246360ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// CFLAGS += -g CXXFLAGS += -g #ASFLAGS += --gstabs nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/gcc_release.gmake000066400000000000000000000020361225523575400251710ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// CFLAGS += -O3 CXXFLAGS += -O3 nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/latex.gmake000066400000000000000000000021651225523575400240550ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// .PHONY: force ifdef TARGET_PDF TARGETS += $(TARGET_PDF) $(TARGET_PDF): force endif %.pdf: %.tex pdflatex -quiet $< nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/llvm_gcc.gmake000066400000000000000000000020441225523575400245220ustar00rootroot00000000000000# Package: dyncall/buildsys/gmake # File: tool/llvm-gcc.gmake # Description: llvm-gcc toolchain support from xcode 3.2 # License: # # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # CC = llvm-gcc CXX = llvm-g++ include $(GMAKE_TOP)/tool/gcc.gmake nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/man.gmake000066400000000000000000000020271225523575400235100ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// %.gz: % gzip -c $< >$@ nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/ml.gmake000066400000000000000000000022351225523575400233460ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// AS ?= ml # --- assemble to coff -------------------------------------------------------- $(BUILD_DIR)/%.obj: %.asm ml /nologo /c /coff $(ASFLAGS) /Fo$@ $< nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/msvc.gmake000066400000000000000000000056131225523575400237110ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #////////////////////////////////////////////////////////////////////////////// # GNU Make Buildsystem # Microsoft Visual C++ #////////////////////////////////////////////////////////////////////////////// OBJ_SUFFIX = .obj LIB_SUFFIX = .lib ifdef BUILD_ARCH_x64 AS = ml64 else AS = ml endif # --- build configuration ----------------------------------------------------- include $(GMAKE_TOP)/tool/msvc_$(BUILD_CONFIG).gmake # --- assemble to coff -------------------------------------------------------- $(BUILD_DIR)/%.obj: %.asm $(AS) /nologo /c $(ASFLAGS) /Fo$@ $< # --- C++ Compiler flags ------------------------------------------------------ ifeq ("$(CXX_EXCEPTIONS)","0") CXXFLAGS += /EHs-c- else CXXFLAGS += /EHsc endif ifeq ("$(CXX_RTTI)","0") CXXFLAGS += /GR- endif # --- compile C --------------------------------------------------------------- $(BUILD_DIR)/%.obj: %.c cl $< /nologo /c $(CPPFLAGS) $(CFLAGS) /Fo$@ # --- compile C++ ------------------------------------------------------------- $(BUILD_DIR)/%.obj: %.cpp cl $< /nologo /c $(CPPFLAGS) $(CXXFLAGS) /Fo$@ $(BUILD_DIR)/%.obj: %.cc cl $< /nologo /c $(CPPFLAGS) $(CXXFLAGS) /Fo$@ # --- Link flags -------------------------------------------------------------- LDFLAGS += $(foreach X,$(LINK_DIRS),/LIBPATH:$X) LDFLAGS += $(foreach X,$(LINK_LIBS),$X.lib) # --- build static library ---------------------------------------------------- $(BUILD_DIR)/%.lib: lib /OUT:$@ /NOLOGO $(LDFLAGS) $(LDLIBS) $^ # --- build dynamic linked library -------------------------------------------- $(BUILD_DIR)/%.dll: link /OUT:$@ /NOLOGO /DLL $(LDFLAGS) $(LDLIBS) $^ # link /OUT:$@ /NOLOGO /MACHINE:X86 /DLL $(LDFLAGS) $(LDLIBS) $^ # --- build executable -------------------------------------------------------- $(BUILD_DIR)/%.exe: link /OUT:$@ /NOLOGO $(LDFLAGS) $(LDLIBS) $^ # link /OUT:$@ /NOLOGO /MACHINE:x86 $(LDFLAGS) $(LDLIBS) $^ nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/msvc_debug.gmake000066400000000000000000000020561225523575400250550ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// CFLAGS += /Zi CXXFLAGS += /Zi ASFLAGS += /Zi nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/msvc_release.gmake000066400000000000000000000020361225523575400254050ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// CFLAGS += /Ox CXXFLAGS += /Ox nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/nasm.gmake000066400000000000000000000025171225523575400236770ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// ifdef BUILD_OS_windows ifdef BUILD_ARCH_x86 NASMFLAGS=-f win32 endif ifdef BUILD_ARCH_x64 NASMFLAGS=-f win64 endif else ifdef BUILD_ARCH_x86 NASMFLAGS=-f elf endif ifdef BUILD_ARCH_x64 NASMFLAGS=-f elf64 endif endif NASMFLAGS+=-DBUILD_OS_$(BUILD_OS)=1 -DBUILD_ARCH_$(BUILD_ARCH)=1 $(BUILD_DIR)/%.o: %.nasm nasm $(NASMFLAGS) $< -o $@ nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/pcc.gmake000066400000000000000000000104651225523575400235070ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #////////////////////////////////////////////////////////////////////////////// # GNU Make Buildsystem # Portable C Compiler configuration #////////////////////////////////////////////////////////////////////////////// CC = pcc OBJ_SUFFIX = .o LIB_PREFIX = lib LIB_SUFFIX = .a # --- build configuration ----------------------------------------------------- ifdef BUILD_CONFIG_debug CFLAGS += -g endif ifdef BUILD_CONFIG_release CFLAGS += -O3 endif # --- architecture specifics ------------------------------------------------- ifdef BUILD_ARCH_arm32_thumb ASFLAGS += -mthumb -mthumb-interwork CFLAGS += -mthumb -mthumb-interwork CXXFLAGS += -mthumb -mthumb-interwork LDFLAGS += -mthumb -mthumb-interwork endif # --- Assemble ---------------------------------------------------------------- ifdef BUILD_OS_darwin else #ASFLAGS += --defsym BUILD_OS_$(BUILD_OS)=1 --defsym BUILD_ARCH_$(BUILD_ARCH)=1 endif $(BUILD_DIR)/%.o: %.s $(COMPILE.s) $(OUTPUT_OPTION) $< $(BUILD_DIR)/%.o: %.S $(COMPILE.S) $(OUTPUT_OPTION) $< # ---Compile flags ------------------------------------------------------------ ifndef COMPILE_PIC ifndef TARGET_APP ifdef BUILD_ARCH_x64 COMPILE_PIC = 1 endif endif endif ifeq ("$(COMPILE_PIC)","1") CXXFLAGS += -fPIC CFLAGS += -fPIC endif # --- C++ Compiler flags ------------------------------------------------------ ifeq ("$(CXX_EXCEPTIONS)","0") CXXFLAGS += -fno-exceptions endif ifeq ("$(CXX_RTTI)","0") CXXFLAGS += -fno-rtti endif # --- Compile C --------------------------------------------------------------- $(BUILD_DIR)/%.o: %.c $(COMPILE.c) $< $(OUTPUT_OPTION) # --- Compile C++ ------------------------------------------------------------- $(BUILD_DIR)/%.o: %.cpp $(COMPILE.cpp) $< $(OUTPUT_OPTION) $(BUILD_DIR)/%.o: %.cc $(COMPILE.cpp) $< $(OUTPUT_OPTION) # --- static library ---------------------------------------------------------- LIBTOOL_STATIC ?= $(RM) $@ ; $(AR) -cr $@ $^ $(BUILD_DIR)/%.a: $(LIBTOOL_STATIC) # --- dynamic library --------------------------------------------------------- ifdef LINK_DIRS LDFLAGS +=$(foreach X,$(LINK_DIRS),-L$X) endif ifdef LINK_LIBS LDLIBS +=$(foreach X,$(LINK_LIBS),-l$X) endif # --- Build executable -------------------------------------------------------- LINK ?= "c" LINKCMD ?= $(CC) ifeq ("$(LINK)","c++") LINKCMD=$(CXX) endif ifeq ("$(LINK)","c") LINKCMD=$(CC) endif # --- Build dynamic library --------------------------------------------------- DLL_SUFFIX ?= .so ifdef BUILD_OS_windows ifdef DLL_IMPORTLIB TARGETS += $(LIB_FILE) $(BUILD_DIR)/lib%.a $(BUILD_DIR)/%.dll: $(LINKCMD) -shared $^ -Wl,--out-implib,$(BUILD_DIR)/lib$(*F).a $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) else $(BUILD_DIR)/%.dll: $(LINKCMD) -shared $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) endif endif $(BUILD_DIR)/%.so: $(LINKCMD) -shared $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) $(BUILD_DIR)/lib%.dylib: $(LINKCMD) -dynamiclib $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) # --- cross compile ----------------------------------------------------------- ifdef BUILD_HOST_cygwin ifdef BUILD_OS_windows TARGET_ARCH += -mno-cygwin endif endif # --- last rule --------------------------------------------------------------- $(BUILD_DIR)/%$(APP_SUFFIX): $(LINKCMD) $^ $(LDFLAGS) $(TARGET_ARCH) $(LDLIBS) $(OUTPUT_OPTION) nqp-2013.12.1/3rdparty/dyncall/buildsys/gmake/tool/pspsdk.gmake000066400000000000000000000046611225523575400242470ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # # adapter Makefile to PSP-SDK's psp/sdk/lib/build.mak Makefile # # psp/ucom module directory INSTALL_BINDIR = $(TOP)/build_psp_$(BUILD_CONFIG)/bootstrap/bootstrap # target ucom module (prx) ifdef TARGET_MOD PRX_EXPORTS = ucom_psp_module_exports.o PRX_EXPORTS_TEMPLATE = $(TOP)/psp/ucom_psp_module_exports.c $(PRX_EXPORTS): $(PRX_EXPORTS_TEMPLATE) $(COMPILE.c) $< -DUCOM_MODULE_NAME=$(TARGET_MOD) $(OUTPUT_OPTION) TARGET_DLL=$(TARGET_MOD) endif # target dll (prx) ifdef TARGET_DLL TARGET = $(TARGET_DLL) DLL_FILE = $(FINAL_TARGET) BUILD_PRX=1 MAKE_USE_PSPSDK=1 endif # target app (elf) ifdef TARGET_APP TARGET = $(TARGET_APP) APP_FILE = $(FINAL_TARGET) MAKE_USE_PSPSDK=1 endif # target lib ifdef TARGET_LIB LIB_FILE = lib$(TARGET_LIB).a TARGET_LIB := $(LIB_FILE) MAKE_USE_PSPSDK=1 endif # psp-sdk ifdef MAKE_USE_PSPSDK OBJS = $(foreach X,$(UNITS) $(MODS),$X.o) build: all ifdef AUTOS EXTRA_TARGETS = $(AUTOS) endif ifdef LINK_DIRS LDFLAGS = $(foreach X,$(LINK_DIRS),-L$X) endif ifdef LINK_LIBS LIBS = $(foreach X,$(LINK_LIBS),-l$X) endif include $(GMAKE_TOP)/tool/gcc_$(BUILD_CONFIG).gmake PSPSDK=$(shell psp-config --pspsdk-path) include $(PSPSDK)/lib/build.mak ifdef INSTALL_PREFIX ifdef INSTALL_MOD INSTALL_MODDIR ?= $(INSTALL_PREFIX)/bin/ucom $(INSTALL_MODDIR): mkdir -p $(INSTALL_MODDIR) install: cp $(FINAL_TARGET) $(INSTALL_MODDIR) endif endif else # use traditional stuff include $(GMAKE_TOP)/targets.gmake endif nqp-2013.12.1/3rdparty/dyncall/buildsys/lua/000077500000000000000000000000001225523575400204465ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/lua/README.txt000066400000000000000000000001311225523575400221370ustar00rootroot00000000000000This helper folder is used to bootstrap lua on platforms where there is no lua at all. nqp-2013.12.1/3rdparty/dyncall/buildsys/lua/bootstrap.sh000066400000000000000000000006311225523575400230170ustar00rootroot00000000000000#!/bin/sh if [ -z "${DL}" ]; then DL=wget fi case `uname -s` in Darwin) LPLAF=macosx ;; Linux) LPLAF=linux ;; FreeBSD) LPLAF=freebsd ;; SunOS) LPLAF=solaris ;; AIX) LPLAF=aix ;; DragonFly) LPLAF=bsd ;; *BSD) LPLAF=bsd ;; *) LPLAF=posix ;; esac DL="${DL}" make -f `dirname $0`/Makefile lua-5.1.4 (cd lua-5.1.4; make ${LPLAF}) nqp-2013.12.1/3rdparty/dyncall/buildsys/lua/cleanup.sh000066400000000000000000000001051225523575400224250ustar00rootroot00000000000000#!/bin/sh if [ -d lua-5.1.4 ]; then (cd lua-5.1.4;make clean) fi nqp-2013.12.1/3rdparty/dyncall/buildsys/lua/setenv.sh000066400000000000000000000000551225523575400223060ustar00rootroot00000000000000# PATH=$PWD/lua-5.1.4/src:$PATH export PATH nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/000077500000000000000000000000001225523575400202745ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/app.mk000066400000000000000000000023331225523575400214060ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # Set Plan9's mk variables. TARG = ${APPLICATION} OFILES = `{echo $UNITS | sed 's/ |$/.$O /g'} LIB = $LIBS # Add some targets to create a local copy of the bin, named as desired. all:V: $TARG $TARG: $O.out cp $O.out $TARG nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/dirs.mk000066400000000000000000000022111225523575400215620ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// all: dirs dirs:VQ: $DIRS for (i in $DIRS) @{ echo Handling sub-directory $i... cd $i && rfork && rm /env/DIRS && $MK -f mkfile $MKFLAGS } nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/epilog.mk000066400000000000000000000026201225523575400221040ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # If we have subdirectories, handle them. <|if(! ~ x$DIRS x) { cat $TOP/buildsys/mk/dirs.mk }; echo # If we have a library to build, include lib.mk, if it is an application, # include app.mk, etc.. <|if(! ~ x$LIBRARY x) { cat $TOP/buildsys/mk/lib.mk /sys/src/cmd/mklib }; echo <|if(! ~ x$APPLICATION x) { cat $TOP/buildsys/mk/app.mk /sys/src/cmd/mkone }; echo # Overrides. <$TOP/buildsys/mk/pcc.mk nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/lib.mk000066400000000000000000000021301225523575400213670ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # Set Plan9's mk variables. LIB = lib${LIBRARY}_s.a$O OFILES = `{echo $UNITS | sed 's/ |$/.$O /g'} nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/pcc.mk000066400000000000000000000070451225523575400214000ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #@@@ add stuff for crosscompiling here. CC = pcc LD = pcc #@@@.if $(BUILD_CONFIG) == "debug" #@@@ add -g option or similar #@@@.endif CPPFLAGS = -D__Plan9__ -D__${objtype}__ CFLAGS = -D__Plan9__ -D__${objtype}__ -I$TOP/dyncall -I$TOP/dyncallback -c #CXXFLAGS = $CXXFLAGS -D__Plan9__ #ASFLAGS = -D__Plan9__ # JUST TEMPORARY AS LONG AS I'M WORKING ON IT - Plan9's sed doesn't support sed comments # /^$/d # Remove empty lines. # /^#.*/d # Remove comments. # s/^\.(globl|intel_syntax|file|section).*// # Remove some GAS directives. # s/(.*):/TEXT \1(SB), $0/g # Reformat function names. # s/%//g # Remove % register prefixes. # /^[ ]+/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ # Convert everything to uppercase. # s/([A-Z]+)[ ]*E(..)[, ]*E(..)/\1L \3, \2/ # Convert 32bit instructions with 2 register operands. # s/([A-Z]+)[ ]*E(..)[, ]*([0-9]+)/\1L $\3, \2/ # Convert 32bit instructions with register and constant as # s/([A-Z]+)[ ]*E(..)[, ]*\[E(..)\+([0-9]+)\]/\1L \4(\3), \2/ # Convert 32bit instructions with register and address as # s/([A-Z]+)[ ]*E(..)[, ]*\[E(..)\]/\1L 0(\3), \2/ # Convert 32bit instructions with register and address as # s/(CALL)[ ]*E(..)[ ]*$/\1 \2/ # Convert CALL instructions. # s/(CALL)[ ]*\[E(..)\+([0-9]+)\]/\1 \3(\2)/ # Convert CALL instructions with addressing mode. # s/([A-Z]+)[ ]*E(..)[ ]*$/\1L \2/ # Convert 32bit instructions with register operand. # s/([A-Z]+)[ ]*\[E(..)\+([0-9]+)\]/\1L \3(\2)/ # Convert 32bit instructions with address operand. # s/([A-Z]+)[ ]*\[E(..)\]/\1L 0(\2)/ # Convert 32bit instructions with address operand. # s/(REP)[ ]*(MOV)SB[ ]*$/\1; \2B SI, DI/ # Convert repeater prefix stuff. # s/(REP)[ ]*(MOV)SD[ ]*$/\1; \2L SI, DI/ # Convert repeater prefix stuff. # Step to transform .S into object files. %.$O: %.S cp $prereq $prereq.c pcc -E $CPPFLAGS $prereq.c > $stem.s # replace with cpp? pcc requires .c suffix rm $prereq.c $AS $AFLAGS $stem.s rm $stem.s nqp-2013.12.1/3rdparty/dyncall/buildsys/mk/prolog.mk000066400000000000000000000024061225523575400221310ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # 'all' is always our default target. all: , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # common nmake rules # common.nmake # #/////////////////////////////////////////////////// build: dirs $(TARGETS) dirs: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile && cd .. # !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $** && cd .. !ENDIF clean: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $@ && cd .. !ENDIF !IF (DEFINED(TARGETS) && "$(TARGETS)" != "") || (DEFINED(OBJS) && "$(OBJS)" != "") echo Cleaning $(MAKEDIR) ... del $(TARGETS) *.exp *.lib $(OBJS) # del $(TARGETS) $(TARGETS:.exe=.lib) $(TARGETS:.dll=.lib) $(TARGETS:.exe=.exp) $(TARGETS:.dll=.exp) $(OBJS) !ENDIF distclean: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $@ && cd .. !ENDIF !IF DEFINED(AUTOS) && "$(AUTOS)" != "" echo Cleaning auto-generated files in $(MAKEDIR) ... del $(AUTOS) !ENDIF !IF (DEFINED(TARGETS) && "$(TARGETS)" != "") || (DEFINED(OBJS) && "$(OBJS)" != "") echo Cleaning $(MAKEDIR) ... del $(TARGETS) *.exp *.lib $(OBJS) # del $(TARGETS) $(TARGETS:.exe=.lib) $(TARGETS:.dll=.lib) $(TARGETS:.exe=.exp) $(TARGETS:.dll=.exp) $(OBJS) !ENDIF nqp-2013.12.1/3rdparty/dyncall/buildsys/nmake/epilog.nmake000066400000000000000000000022411225523575400232530ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake rules # epilog.nmake # #/////////////////////////////////////////////////// !INCLUDE common.nmake nqp-2013.12.1/3rdparty/dyncall/buildsys/nmake/prolog.nmake000066400000000000000000000041761225523575400233070ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake rules # prolog.nmake # #/////////////////////////////////////////////////// .SILENT: # Default "build all" target. all: configure build # Check if library has been 'configured' properly. If not, tell the user and abort. !IF !DEFINED(CONFIG_OS) || !DEFINED(CONFIG_ARCH) configure: $(TOP)\ConfigVars $(TOP)\ConfigVars: echo "Library not configured properly! Run configure.bat from the library's root directory first!" !ELSE configure: !ENDIF # Include config rules. !IF EXISTS($(TOP)\ConfigVars) ! INCLUDE $(TOP)\ConfigVars !ENDIF # Include site rules. !IF EXISTS($(TOP)\SiteVars) ! INCLUDE $(TOP)\SiteVars !ENDIF # set BUILD_* from CONFIG_* variables !IF !DEFINED(BUILD_HOST) BUILD_HOST = $(CONFIG_HOST) !ENDIF !IF !DEFINED(BUILD_OS) BUILD_OS = $(CONFIG_OS) !ENDIF !IF !DEFINED(BUILD_ARCH) BUILD_ARCH = $(CONFIG_ARCH) !ENDIF !IF !DEFINED(BUILD_TOOL) BUILD_TOOL = $(CONFIG_TOOL) !ENDIF !IF !DEFINED(BUILD_ASM) BUILD_ASM = $(CONFIG_ASM) !ENDIF !IF !DEFINED(BUILD_CONFIG) BUILD_CONFIG = $(CONFIG_CONFIG) !ENDIF !IF "$(BUILD_TOOL)" != "" ! INCLUDE tool_$(BUILD_TOOL).nmake !ENDIF nqp-2013.12.1/3rdparty/dyncall/buildsys/nmake/tool_gcc.nmake000066400000000000000000000047221225523575400235730ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # GCC nmake rules # tool_gcc.nmake # #/////////////////////////////////////////////////// CC =arm-eabi-gcc CXX =arm-eabi-g++ AR =arm-eabi-ar AS =arm-eabi-as LD =arm-eabi-g++#arm-eabi-ld OCP =arm-eabi-objcopy !IF "$(BUILD_ARCH)" == "arm32_thumb" ASFLAGS = -g -mthumb -mthumb-interwork CFLAGS = -g -Wall -O2 -I$(TOP)\dyncall -I$(TOP)\dyncallback -fomit-frame-pointer -ffast-math -fno-strict-aliasing -mthumb -mthumb-interwork CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions LDFLAGS = -g -mno-fpu -mthumb -mthumb-interwork ARFLAGS = !ELSE IF "$(BUILD_ARCH)" == "arm32_arm" ASFLAGS = -g CFLAGS = -g -Wall -O2 -I$(TOP)\dyncall -I$(TOP)\dyncallback -fomit-frame-pointer -ffast-math -fno-strict-aliasing CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions LDFLAGS = -g -mno-fpu ARFLAGS = !ENDIF !IF "$(BUILD_OS)" == "nds" CFLAGS = $(CFLAGS) -DARM9 -mcpu=arm9tdmi -mtune=arm9tdmi -D__nds__ -I"$(DEVKITPRO_PATH)/libnds/include" CXXFLAGS = $(CXXFLAGS) -D__nds__ -I"$(DEVKITPRO_PATH)/libnds/include" LDFLAGS = $(LDFLAGS) -specs=ds_arm9.specs !ENDIF .SUFFIXES: .SUFFIXES: .o .so .a .arm9 .nds .pdf .c .cpp .S .tex .cc .S.o: echo .S.o: Assembling $< ... $(CC) $(ASFLAGS) $(CFLAGS) -o $@ -c $< .c.o: echo .c.o: Compiling $< ... $(CC) $(CFLAGS) -o $@ -c $< .cpp.o: echo .cpp.o: Compiling $< ... $(CXX) $(CXXFLAGS) -o $@ -c $< .cc.o: echo .cc.o: Compiling $< ... $(CXX) $(CXXFLAGS) -o $@ -c $< .tex.pdf: pdflatex $< nqp-2013.12.1/3rdparty/dyncall/buildsys/nmake/tool_msvc.nmake000066400000000000000000000034751225523575400240130ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # MSVC nmake rules # tool_MSVC.nmake # #/////////////////////////////////////////////////// CC =cl CXX =cl AR =lib !IF "$(BUILD_ARCH)" == "x64" AS =ml64 !ELSE IF "$(BUILD_ARCH)" == "x86" AS =ml !ENDIF LD =link ASFLAGS = /c /nologo CFLAGS = /EHsc /GR- /GS- /Ox /c /nologo /I$(TOP)\dyncall /I$(TOP)\dyncallback CXXFLAGS = $(CFLAGS) LDFLAGS = /OPT:REF /OPT:ICF /NOLOGO ARFLAGS = /NOLOGO .SUFFIXES: .SUFFIXES: .obj .exe .dll .lib .pdf .c .cpp .asm .tex .cc .asm.obj: echo .asm.obj: Assembling $< ... $(AS) $(ASFLAGS) /Fo$@ $< .c.obj: echo .c.obj: Compiling $< ... $(CC) $(CFLAGS) /Fo$@ $< .cpp.obj: echo .cpp.obj: Compiling $< ... $(CXX) $(CXXFLAGS) /Fo$@ $< .cc.obj: echo .cc.obj: Compiling $< ... $(CXX) $(CXXFLAGS) /Fo$@ $< .tex.pdf: pdflatex $< nqp-2013.12.1/3rdparty/dyncall/buildsys/scripts/000077500000000000000000000000001225523575400213545ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/scripts/batch-build-linux.sh000066400000000000000000000003741225523575400252270ustar00rootroot00000000000000# Build libraries. make -f Makefile.generc clean all # Build tests: dynload tests need '-ldl'. ( cd test ; make -f Makefile.generic clean ) ( cd test ; LDFLAGS=-ldl make -f Makefile.generic all-dynload ) ( cd test ; make -f Makefile.generic all ) nqp-2013.12.1/3rdparty/dyncall/buildsys/scripts/batch-build-minix.sh000066400000000000000000000010641225523575400252110ustar00rootroot00000000000000# DynCall build script using Makefile.generic on Minix 3.1.8 # ---------------------------------------------------------- # build dyncall, clear CFLAGS (so that '-fPIC' removed, coz not supported) ( cd dyncall ; CC=gcc make -f Makefile.generic clean all CFLAGS= ) # build dyncallback, clear CFLAGS and set explicit link to dyncall include. ( cd dyncallback ; CC=gcc make -f Makefile.generic clean all CFLAGS=-I../dyncall ) # build tests, skip dynload tests. ( cd test ; CC=gcc CFLAGS= CXX=g++ make -f Makefile.generic clean all-dyncall all-dyncallback ) nqp-2013.12.1/3rdparty/dyncall/buildsys/scripts/setenv-cross-ios.sh000066400000000000000000000003331225523575400251320ustar00rootroot00000000000000 IOS_ARCH="armv6" IOS_SDK_VERSION="4.3" export TARGET_MACH="-arch ${IOS_ARCH}" export TARGET_ARCH="-arch ${IOS_ARCH} -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${IOS_SDK_VERSION}.sdk" nqp-2013.12.1/3rdparty/dyncall/buildsys/scripts/setenv-sdk-ios.sh000066400000000000000000000001301225523575400245550ustar00rootroot00000000000000#!/bin/sh export PATH=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH} nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/000077500000000000000000000000001225523575400206245ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/dyncall/000077500000000000000000000000001225523575400222525ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/dyncall/dyncall.vcproj000066400000000000000000000112361225523575400251300ustar00rootroot00000000000000 nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/test_plain/000077500000000000000000000000001225523575400227665ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj000066400000000000000000000075651225523575400263720ustar00rootroot00000000000000 nqp-2013.12.1/3rdparty/dyncall/buildsys/vs2005/vs2005.sln000066400000000000000000000027101225523575400223010ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dyncall", "dyncall\dyncall.vcproj", "{DF67B85F-C8F8-4FB1-A701-867A9C835ABA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_plain", "test_plain\test_plain.vcproj", "{65E1A63C-079D-4F72-8307-E070A499D2EA}" ProjectSection(ProjectDependencies) = postProject {DF67B85F-C8F8-4FB1-A701-867A9C835ABA} = {DF67B85F-C8F8-4FB1-A701-867A9C835ABA} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Debug|Win32.ActiveCfg = Debug|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Debug|Win32.Build.0 = Debug|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Release|Win32.ActiveCfg = Release|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Release|Win32.Build.0 = Release|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Debug|Win32.ActiveCfg = Debug|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Debug|Win32.Build.0 = Debug|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Release|Win32.ActiveCfg = Release|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal nqp-2013.12.1/3rdparty/dyncall/conf-nds.bat000066400000000000000000000027671225523575400202420ustar00rootroot00000000000000@ECHO OFF REM /////////////////////////////////////////////////////////////////////////// REM REM Copyright (c) 2007-2009 Daniel Adler , REM Tassilo Philipp REM REM Permission to use, copy, modify, and distribute this software for any REM purpose with or without fee is hereby granted, provided that the above REM copyright notice and this permission notice appear in all copies. REM REM THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES REM WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF REM MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR REM ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES REM WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN REM ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF REM OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. REM REM /////////////////////////////////////////////////////////////////////////// REM We need at least 2 characters in the path. IF [%DEVKITPRO:~0,1%]==[%DEVKITPRO%] ( GOTO END_ABORT ) REM Extract devkitPro path. IF [%DEVKITPRO:~0,1%]==[/] ( ECHO DEVKITPRO_PATH=%DEVKITPRO:~1,1%:%DEVKITPRO:~2%#>>ConfigVars ) ELSE IF [%DEVKITPRO:~1,1%]==[:] ( ECHO DEVKITPRO_PATH=%DEVKITPRO%#>>ConfigVars ) ELSE ( GOTO END_ABORT ) GOTO END :END_ABORT ECHO ERROR: Environment variable DEVKITPRO must be set to absolute devkitPro path. DEL ConfigVars :END nqp-2013.12.1/3rdparty/dyncall/config-solaris000066400000000000000000000000761225523575400206740ustar00rootroot00000000000000LDFLAGS=-lm export LDFLAGS # using SunPro: CXX=CC export CXX nqp-2013.12.1/3rdparty/dyncall/configure000066400000000000000000000300771225523575400177420ustar00rootroot00000000000000#!/bin/sh #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # --- configure settings ------------------------------------------------------ PACKAGE=dyncall CONFIG_PREFIX=/usr/local # --- output error message ---------------------------------------------------- error() { echo "error: $*" exit 1 } # --- output warning message -------------------------------------------------- warning() { echo "warning: $*" } # --- output info message ----------------------------------------------------- info() { echo "$*" } # --- print usage ------------------------------------------------------------- usage() { echo "$PACKAGE configuration shell-script" echo "Usage:" echo " configure [ options ]" echo echo "Options:" echo " --help" echo " -h print this page" echo echo " --prefix= set installation prefix (GNU make only)" echo " --prefix-bd= set build directory prefix (GNU make only)" echo echo " --target-x86 build for x86 architecture platform" echo " --target-x64 build for x64 architecture platform" echo " --target-ppc32 build for ppc32 architecture platform" echo " --target-psp build for Playstation Portable platform (PSPSDK)" echo " --target-arm-arm build for ARM architecture platform (ARM mode)" echo " --target-arm-thumb build for ARM architecture platform (THUMB mode)" echo " --target-nds-arm build for Nintendo DS platform (devkitPro, ARM mode)" echo " --target-nds-thumb build for Nintendo DS platform (devkitPro, THUMB mode)" echo " --target-cygwin build for Cygwin platform" echo " --target-windows build for Windows platform (useful for Cygwin)" echo " --target-macosx build for Mac OS X platform" echo " --target-iphoneos build for iPhone OS platform" echo " --target-universal build universal binaries (for Mac OS X/Darwin)" echo echo " --tool-gcc use GNU Compiler Collection" echo " --tool-pcc use Portable C Compiler" echo " --tool-msvc use Microsoft Visual C++" echo " --tool-pspsdk use PSP SDK tool-chain" echo " --tool-llvm-gcc use LLVM-GCC C/C++ compilers" echo echo " --with-iphonesdk=" echo " with iPhone SDK version (2.0-4.0)" echo " --with-macosxsdk=" echo " with Mac OS X SDK version (10.4u, 10.5, 10.6)" echo echo " --asm-as use GNU Assembler" echo " --asm-nasm use NASM Assembler" echo " --asm-ml use Microsoft Macro Assembler" echo echo " --config-release build release version (default)" echo " --config-debug build debug version" echo exit 0 } # --- guess operating system ------------------------------------------------- CONFIG_OS="" guess_os() { OS=`uname -s` if [ "$OS" = "WindowsNT" ]; then CONFIG_OS="windows" elif [ "$OS" = "Darwin" ]; then CONFIG_OS="darwin" elif [ "$OS" = "CYGWIN_NT-5.0" ] || [ "$OS" = "CYGWIN_NT-5.1" ] || [ "$OS" = "CYGWIN_NT-5.2" ] || [ "$OS" = "CYGWIN_NT-6.0" ] || [ "$OS" = "CYGWIN_NT-6.1" ] || [ "$OS" = "CYGWIN_NT-6.1-WOW64" ]; then CONFIG_OS="cygwin" elif [ "$OS" = "MINGW32_NT-5.0" ] || [ "$OS" = "MINGW32_NT-5.1" ] || [ "$OS" = "MINGW32_NT-5.2" ]; then CONFIG_OS="msys" elif [ "$OS" = "Linux" ]; then CONFIG_OS="linux" elif [ "$OS" = "SunOS" ]; then CONFIG_OS="sunos" elif [ "$OS" = "OpenBSD" ]; then CONFIG_OS="openbsd" elif [ "$OS" = "FreeBSD" ] || [ "$OS" = "GNU/kFreeBSD" ]; then CONFIG_OS="freebsd" elif [ "$OS" = "NetBSD" ]; then CONFIG_OS="netbsd" elif [ "$OS" = "DragonFly" ]; then CONFIG_OS="dragonfly" elif [ "$OS" = "Haiku" ]; then CONFIG_OS="beos" elif [ "$OS" = "Minix" ]; then CONFIG_OS="minix" fi info "guess operating system $CONFIG_OS" } # --- guess architecture ----------------------------------------------------- guess_arch() { # OS Specifics if [ "$OS" = "SunOS" ]; then ARCH=`uname -p` if [ "$ARCH" = "sparc" ]; then if [ "`isainfo -n`" = "sparcv9" ]; then CONFIG_ARCH="sparc64" else CONFIG_ARCH="sparc" fi elif [ "$ARCH" = "i386" ] || [ "$ARCH" = "i86pc" ]; then if [ "`isainfo -n`" = "amd64" ]; then CONFIG_ARCH="x64" else CONFIG_ARCH="x86" fi fi elif [ "$OS" = "Darwin" ]; then # Mac OS X and iPhone OS config: PROCESSOR=`uname -p` if [ "$PROCESSOR" = "arm" ]; then # iPhone OS CONFIG_ARCH="arm" elif [ "$PROCESSOR" = "i386" ]; then # On OS X 10.6 (Darwin 10) the default architecture is now x86_64 # Still, BSD 'uname' and 'machine' reveals only that it is of arch i386 # We switch to x86_64 if it is darwin 10. OS_VERSION=`uname -r` OS_VERSION_MAJOR=`echo $OS_VERSION | sed 's/^\([0-9]*\).*/\1/'` if [ "$OS_VERSION_MAJOR" = "10" ] || [ "$OS_VERSION_MAJOR" = "11" ]; then CONFIG_ARCH="x64" else CONFIG_ARCH="x86" fi elif [ "$PROCESSOR" = "powerpc" ]; then CONFIG_ARCH="ppc32" fi else ARCH=`uname -m` if [ "$ARCH" = "Power Macintosh" ] || [ "$ARCH" = "ppc" ] || [ "$ARCH" = "macppc" ] || [ "$ARCH" = "powerpc" ]; then CONFIG_ARCH="ppc32" elif [ "$ARCH" = "ppc64" ]; then CONFIG_ARCH="ppc64" elif [ "$ARCH" = "x86" ] || [ "$ARCH" = "i386" ] || [ "$ARCH" = "i486" ] || [ "$ARCH" = "i586" ] || [ "$ARCH" = "i686" ] || [ "$ARCH" = "i86pc" ]; then CONFIG_ARCH="x86" elif [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "x64" ]; then CONFIG_ARCH="x64" elif [ "$ARCH" = "acorn32" ] || [ "$ARCH" = "cats" ] || [ "$ARCH" = "shark" ] || [ "$ARCH" = "armv7l" ] || [ "$ARCH" = "armv5tejl" ]; then CONFIG_ARCH="arm32_arm" elif [ "$ARCH" = "BePC" ]; then CONFIG_ARCH="x86" elif [ "$ARCH" = "mips" ]; then CONFIG_ARCH="mips32" elif [ "$ARCH" = "mipsel" ] || [ "$ARCH" = "pmax" ]; then CONFIG_ARCH="mips32el" elif [ "$ARCH" = "loongson" ]; then CONFIG_ARCH="mips64el" elif [ "$ARCH" = "sparc64" ]; then CONFIG_ARCH="sparc" elif [ "$ARCH" = "ia64" ]; then CONFIG_ARCH="ia64" fi fi info "guess arch $CONFIG_ARCH" } # --- guess tool chain ------------------------------------------------------- CONFIG_TOOL="" guess_tool() { CONFIG_TOOL="gcc" info "guess tool $CONFIG_TOOL" } # --- guess assembler -------------------------------------------------------- CONFIG_ASM="" guess_asm() { if [ "$CONFIG_TOOL" = "gcc" ] || [ "$CONFIG_TOOL" = "llvm_gcc" ]; then CONFIG_ASM="as" elif [ "$CONFIG_TOOL" = "msvc" ]; then CONFIG_ASM="ml" fi info "guess assembler $CONFIG_ASM" } # --- process arguments ------------------------------------------------------ args() { while [ 0 -lt $# ]; do OPT=$1 shift 1 case $OPT in --help|-h) usage ;; --prefix=*) CONFIG_PREFIX=`echo $OPT | cut -c 10-` ;; --prefix-bd=*) CONFIG_BUILDPREFIX=`echo $OPT | cut -c 13-` ;; --with-iphonesdk=*) CONFIG_IPHONESDK_VERSION=`echo $OPT | cut -c 18-` ;; --with-macosxsdk=*) CONFIG_MACOSXSDK_VERSION=`echo $OPT | cut -c 18-` ;; --target-universal) CONFIG_ARCH=universal ;; --target-x86) CONFIG_ARCH=x86 ;; --target-x64) CONFIG_ARCH=x64 ;; --target-ppc32) CONFIG_ARCH=ppc32 ;; --target-psp) CONFIG_OS=psp CONFIG_ARCH=mips32 CONFIG_TOOL=gcc ;; --target-arm-arm) CONFIG_ARCH=arm32_arm ;; --target-arm-thumb) CONFIG_ARCH=arm32_thumb ;; --target-nds-arm) CONFIG_OS=nds CONFIG_ARCH=arm32_arm CONFIG_TOOL=gcc ;; --target-nds-thumb) CONFIG_OS=nds CONFIG_ARCH=arm32_thumb CONFIG_TOOL=gcc ;; --target-cygwin) CONFIG_OS=cygwin ;; --target-windows) CONFIG_OS=windows ;; --target-iphoneos) CONFIG_OS=iphoneos CONFIG_ARCH=arm32_arm CONFIG_TOOL=gcc ;; --target-macosx) CONFIG_OS=macosx CONFIG_TOOL=gcc ;; --tool-gcc) CONFIG_TOOL=gcc CONFIG_ASM=gcc ;; --tool-pcc) CONFIG_TOOL=pcc CONFIG_ASM=gcc ;; --tool-msvc) CONFIG_TOOL=msvc CONFIG_ASM=ml CONFIG_OS=windows ;; --tool-pspsdk) CONFIG_OS=psp CONFIG_ARCH=mips32 CONFIG_TOOL=pspsdk CONFIG_ASM=as CONFIG_PREFIX=`psp-config -P` ;; --tool-llvm-gcc) CONFIG_TOOL=llvm_gcc ;; --asm-as) CONFIG_ASM=as ;; --asm-nasm) CONFIG_ASM=nasm ;; --asm-ml) CONFIG_ASM=ml ;; --config-release) CONFIG_CONFIG=release ;; --config-debug) CONFIG_CONFIG=debug ;; *) warning "unknown option $OPT" ;; esac done } # --- guess variables -------------------------------------------------------- guess() { if [ -z "$CONFIG_OS" ]; then guess_os if [ -z "$CONFIG_OS" ]; then error "unsupported operating system $OS" fi fi if [ -z "$CONFIG_ARCH" ]; then guess_arch if [ -z "$CONFIG_ARCH" ]; then error "unsupported architecture $ARCH" fi fi if [ -z "$CONFIG_TOOL" ]; then guess_tool if [ -z "$CONFIG_TOOL" ]; then error "no tool" fi fi if [ -z "$CONFIG_ASM" ]; then guess_asm if [ -z "$CONFIG_ASM" ]; then error " no assembler tool" fi fi if [ -z "$CONFIG_CONFIG" ]; then CONFIG_CONFIG=release fi } # --- set default variables -------------------------------------------------- set_defaults() { CONFIG_HOST="$CONFIG_OS" } # --- derive variables ------------------------------------------------------- derive_vars() { BUILD_HOST="$CONFIG_HOST" if [ "$CONFIG_HOST" != "$CONFIG_OS" ]; then BUILD_HOST="${CONFIG_HOST}_${CONFIG_OS}" fi } # --- write ConfigVars files ------------------------------------------------ output() { echo "#auto-generated by $PACKAGE/configure" >$1 echo "CONFIG_PACKAGE=$PACKAGE" >>$1 echo "CONFIG_HOST=$CONFIG_HOST" >>$1 echo "CONFIG_OS=$CONFIG_OS" >>$1 echo "CONFIG_ARCH=$CONFIG_ARCH" >>$1 echo "CONFIG_TOOL=$CONFIG_TOOL" >>$1 echo "CONFIG_ASM=$CONFIG_ASM" >>$1 echo "CONFIG_CONFIG=$CONFIG_CONFIG" >>$1 echo "CONFIG_PREFIX=$CONFIG_PREFIX" >>$1 if [ $CONFIG_BUILDPREFIX ]; then echo "CONFIG_BUILDPREFIX=$CONFIG_BUILDPREFIX" >>$1 fi if [ $CONFIG_IPHONESDK_VERSION ]; then echo "CONFIG_IPHONESDK_VERSION=$CONFIG_IPHONESDK_VERSION" >>$1 fi if [ $CONFIG_MACOSXSDK_VERSION ]; then echo "CONFIG_MACOSXSDK_VERSION=$CONFIG_MACOSXSDK_VERSION" >>$1 fi echo "" >>$1 } # --- configure -------------------------------------------------------------- run_configure() { OLD=$PWD DIR=$1 shift 1 cd $DIR sh configure $* cd $OLD } # --- main ------------------------------------------------------------------- main() { args $* info "* configure package $PACKAGE" guess set_defaults derive_vars output ConfigVars } main $* nqp-2013.12.1/3rdparty/dyncall/configure.bat000066400000000000000000000113501225523575400205000ustar00rootroot00000000000000@ECHO OFF REM /////////////////////////////////////////////////////////////////////////// REM REM Copyright (c) 2007-2009 Daniel Adler , REM Tassilo Philipp REM REM Permission to use, copy, modify, and distribute this software for any REM purpose with or without fee is hereby granted, provided that the above REM copyright notice and this permission notice appear in all copies. REM REM THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES REM WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF REM MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR REM ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES REM WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN REM ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF REM OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. REM REM /////////////////////////////////////////////////////////////////////////// SETLOCAL REM Set default values. SET PACKAGE=dyncall SET CONFIG_HOST=windows SET CONFIG_OS=windows SET CONFIG_ARCH=x86 SET CONFIG_TOOL=msvc SET CONFIG_ASM=ml SET CONFIG_CONFIG=release REM Scan arguments. :MAIN_LOOP REM Help. IF [%1]==[] ( GOTO DONE ) ELSE IF [%1]==[/?] ( ECHO. ECHO.dyncall configuration shell-script ECHO.Usage: ECHO. configure.bat [ options ] ECHO. ECHO.Options: ECHO. /? print this page ECHO. ECHO. /prefix PATH set installation prefix ^(GNU make only^) ECHO. /prefix-bd PATH set build directory prefix ^(GNU make only^) ECHO. ^(only for use with gmake^) ECHO. ECHO. /target-x86 build for x86 architecture ^(default^) ECHO. /target-x64 build for x64 architecture ECHO. /target-psp build for PlayStation Portable ^(homebrew SDK^) ECHO. /target-nds-arm build for Nintendo DS ^(devkitPro, ARM mode^) ECHO. /target-nds-thumb build for Nintendo DS ^(devkitPro, THUMB mode^) ECHO. ECHO. /tool-msvc use Microsoft Visual C++ compiler ^(default^) ECHO. /tool-gcc use GNU Compiler Collection ECHO. ECHO. /asm-ml use Microsoft Macro Assembler ^(default^) ECHO. /asm-as use the GNU Assembler ECHO. /asm-nasm use NASM Assembler ECHO. ECHO. /config-release build release version ^(default^) ECHO. /config-debug build debug version GOTO:EOF ) ELSE IF [%1]==[/prefix] ( SET CONFIG_PREFIX=%2 SHIFT ) ELSE IF [%1]==[/prefix-bd] ( SET CONFIG_BUILDPREFIX=%2 SHIFT ) ELSE IF [%1]==[/target-x86] ( SET CONFIG_ARCH=x86 ) ELSE IF [%1]==[/target-x64] ( SET CONFIG_ARCH=x64 ) ELSE IF [%1]==[/target-psp] ( SET CONFIG_ARCH=mips32 SET CONFIG_OS=psp ) ELSE IF [%1]==[/target-nds-arm] ( SET CONFIG_ARCH=arm32_arm SET CONFIG_OS=nds ) ELSE IF [%1]==[/target-nds-thumb] ( SET CONFIG_ARCH=arm32_thumb SET CONFIG_OS=nds ) ELSE IF [%1]==[/tool-gcc] ( SET CONFIG_TOOL=gcc SET CONFIG_ASM=as ) ELSE IF [%1]==[/tool-msvc] ( SET CONFIG_TOOL=msvc SET CONFIG_ASM=ml ) ELSE IF [%1]==[/asm-as] ( SET CONFIG_ASM=as ) ELSE IF [%1]==[/asm-nasm] ( SET CONFIG_ASM=nasm ) ELSE IF [%1]==[/asm-ml] ( SET CONFIG_ASM=ml ) ELSE IF [%1]==[/config-release] ( SET CONFIG_CONFIG=release ) ELSE IF [%1]==[/config-debug] ( SET CONFIG_CONFIG=debug ) ELSE ( ECHO Unknown parameter '%1'. GOTO DONE ) SHIFT GOTO MAIN_LOOP :DONE IF [%CONFIG_PREFIX%]==[] ( SET CONFIG_PREFIX=%CD%\install_%CONFIG_OS%_%CONFIG_ARCH%_%CONFIG_TOOL%_%CONFIG_CONFIG% ) IF [%CONFIG_BUILDPREFIX%]==[] ( SET CONFIG_BUILDPREFIX=%CD%\build_out\%CONFIG_OS%_%CONFIG_ARCH%_%CONFIG_TOOL%_%CONFIG_CONFIG% ) ECHO # auto-generated by configure.bat >ConfigVars ECHO CONFIG_PACKAGE=%PACKAGE%#>>ConfigVars ECHO CONFIG_HOST=%CONFIG_HOST%#>>ConfigVars ECHO CONFIG_OS=%CONFIG_OS%#>>ConfigVars ECHO CONFIG_ARCH=%CONFIG_ARCH%#>>ConfigVars ECHO CONFIG_TOOL=%CONFIG_TOOL%#>>ConfigVars ECHO CONFIG_ASM=%CONFIG_ASM%#>>ConfigVars ECHO CONFIG_CONFIG=%CONFIG_CONFIG%#>>ConfigVars ECHO CONFIG_PREFIX=%CONFIG_PREFIX%#>>ConfigVars ECHO CONFIG_BUILDPREFIX=%CONFIG_BUILDPREFIX%#>>ConfigVars ECHO RM=del#>>ConfigVars ECHO SLASH=\\#>>ConfigVars ECHO Writing following configuration to ConfigVars: ECHO. ECHO Host OS: %CONFIG_HOST% ECHO Target OS: %CONFIG_OS% ECHO Target Architecture: %CONFIG_ARCH% ECHO Compiler: %CONFIG_TOOL% ECHO Assembler: %CONFIG_ASM% ECHO Build configuration: %CONFIG_CONFIG% ECHO Install prefix: %CONFIG_PREFIX% ECHO Build prefix: %CONFIG_BUILDPREFIX% REM We have to transform some pathes for the nds/devkitPro build. IF [%CONFIG_OS%]==[nds] ( REM Check if DEVKITPRO is set. IF [%DEVKITPRO%]==[] ( ECHO ERROR: Environment variable DEVKITPRO must be set to absolute devkitPro path. ) ELSE ( conf-nds.bat ) ) nqp-2013.12.1/3rdparty/dyncall/configure2000066400000000000000000000064321225523575400200220ustar00rootroot00000000000000#!/bin/sh # Shell script 'configure2' for dyncall/Makefile.generic # Copyright (C) 2011 Daniel Adler BUILD=`uname` HOST="${BUILD}" BLDTOP="$PWD" SRCTOP=`dirname $PWD/$0` PrintUsage() { head -n 3 $0 | grep "^# " cat < --host= -o --os= -a --arch= os := Linux, (Open|Free|Net|DragonFly)BSD, Windows, Darwin, iOS, MacOSX, Sun, Haiku, BeOS arch := x86, x64, arm, ppc, mips or "" EOF exit 2 } ProcessArgs() { while [ 0 -lt $# ]; do X=$1 shift 1 # Shell common: case $X in --help|-h) PrintUsage ;; # GNU Compatibility: --prefix=*) PREFIX=`echo $X | cut -c 10-` addVar PREFIX $PREFIX ;; --host=*) HOST=`echo $X | cut -c 8-` ;; # Generic Compatibility: --os=*) OS=`echo $X | cut -c 6-` ;; --arch=*) ARCH=`echo $X | cut -c 8-` ;; # Concrete Support: --with-iphonesdk=*) IOSSDK_VERSION=`echo $X | cut -c 18-` TARGET_MACH="-arch armv6" ;; --with-macosxsdk=*) MACOSXSDK_VERSION=`echo $X | cut -c 18-` ;; --target-universal) TARGET_UNIVERSAL=1 ;; *=*) ;; esac done } access() { $* } new_makefile() { FILE=$1 echo "# auto-generated by $0" >$FILE } append_makefile() { echo $* >>$FILE } #vars="" addVar() { NAME=$1 shift 1 VALUE=$* append_makefile "$NAME+=$*" # vars="$NAME='$*' $var" } ConfigureByHost() { case ${HOST} in Linux) addVar CFLAGS "-fPIC" addVar LDFLAGS "-lm -ldl" ;; *BSD|DragonFly*) addVar CFLAGS "-fPIC" addVar LDFLAGS "-lm" ;; Minix) addVar CFLAGS "" targets="dyncall dyncallback" ;; Darwin|MacOSX) addVar CFLAGS "-fPIC" addVar TARGET_ARCH "-arch i386 -arch x86_64 -arch ppc" addVar TARGET_MACH "-arch i386 -arch x86_64 -arch ppc" addVar MKLIB "libtool -static -o" ;; IOS|iPhoneOS|iOS) addVar CFLAGS "-fPIC" addVar TARGET_ARCH "-arch armv6" addVar TARGET_MACH "-arch armv6" ;; esac } ConfigureByArch() { case ${ARCH} in x64) addVar CFLAGS "-fPIC" ;; sparc64) addVar CFLAGS "-m64" addVar ASFLAGS "-m64" addVar CXXFLAGS "-m64" addVar CCFLAGS "-m64" ;; esac } DumpVars() { echo '#!/bin/sh' >./make.sh echo "$vars make -f Makefile.generic \$*" >>./make.sh chmod +x ./make.sh echo "# run ./make.sh to build" } make_dir() { access mkdir -p $1 } MakeBuildTree() { FILES=`( cd $SRCTOP ; find . -name "Makefile.generic" )` for FILE in $FILES ; do SRCFILE="$SRCTOP/$FILE" BLDFILE="$BLDTOP/$FILE" SRCDIR=`dirname $SRCFILE` BLDDIR=`dirname $BLDFILE` make_dir "$BLDDIR" new_makefile $BLDDIR/Makefile append_makefile "SRCTOP = $SRCTOP" append_makefile "BLDTOP = $BLDTOP" append_makefile "SRCDIR = $SRCDIR" append_makefile "BLDDIR = $BLDDIR" append_makefile "VPATH = $SRCDIR" append_makefile "include $BLDTOP/Makefile.config" append_makefile "include $SRCDIR/Makefile.generic" done } WriteConfig() { new_makefile $BLDTOP/Makefile.config } ProcessArgs $* MakeBuildTree WriteConfig ConfigureByHost nqp-2013.12.1/3rdparty/dyncall/dynMakefile000066400000000000000000000003101225523575400201740ustar00rootroot00000000000000all: ./buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) nqp-2013.12.1/3rdparty/dyncall/dyncall/000077500000000000000000000000001225523575400174555ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/dyncall/BSDmakefile000066400000000000000000000026521225523575400215130ustar00rootroot00000000000000# Package: dyncall # File: dyncall/BSDmakefile # Description: dyncall library BSD make makefile # License: # # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # TOP = .. .include "$(TOP)/buildsys/bsdmake/prolog.bsdmake" # Overrides. LIBRARY = dyncall # Gather needed modules to build. UNITS += dyncall_vector UNITS += dyncall_struct UNITS += dyncall_api UNITS += dyncall_callf UNITS += dyncall_call UNITS += dyncall_callvm UNITS += dyncall_callvm_base .if $(BUILD_ARCH) == x64 # @@@ should be moved to BSDmake in general (for x64 platforms) CFLAGS += -fPIC CXXFLAGS += -fPIC .endif .include "$(TOP)/buildsys/bsdmake/epilog.bsdmake" nqp-2013.12.1/3rdparty/dyncall/dyncall/CMakeLists.txt000066400000000000000000000027161225523575400222230ustar00rootroot00000000000000# Package: dyncall # File: dyncall/CMakeLists.txt # Description: DynCall library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # if(MSVC) if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(ASM_SRC dyncall_call_x86_generic_masm.asm) else() set(ASM_SRC dyncall_call_x64_generic_masm.asm) endif() else() set(ASM_SRC dyncall_call.S) endif() add_library(dyncall_s STATIC ${ASM_SRC} dyncall_vector.c dyncall_struct.c dyncall_api.c dyncall_callvm.c dyncall_callvm_base.c dyncall_callf.c ) install(TARGETS dyncall_s ARCHIVE DESTINATION lib ) install(FILES dyncall_macros.h dyncall_config.h dyncall_types.h dyncall.h dyncall_signature.h dyncall_value.h dyncall_callf.h DESTINATION include ) nqp-2013.12.1/3rdparty/dyncall/dyncall/DynCallConfig.cmake000066400000000000000000000001321225523575400231270ustar00rootroot00000000000000set(DYNCALL_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dyncall) set(DYNCALL_LIBRARIES dyncall_s) nqp-2013.12.1/3rdparty/dyncall/dyncall/GNUmakefile000066400000000000000000000034701225523575400215330ustar00rootroot00000000000000# Package: dyncall # File: dyncall/GNUmakefile # Description: dyncall library buildsys/gmake GNUmakefile # License: # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # TOP ?= .. GMAKE_TOP ?= $(TOP)/buildsys/gmake include $(GMAKE_TOP)/prolog.gmake TARGET_LIB = dyncall INSTALL_HEADERS = \ dyncall_macros.h \ dyncall_config.h \ dyncall_types.h \ dyncall.h \ dyncall_signature.h \ dyncall_value.h \ dyncall_callf.h \ dyncall_alloc.h INSTALL_LIB = 1 INSTALL_MAN3 = dyncall.3.gz UNITS = dyncall_vector dyncall_api dyncall_callvm dyncall_callvm_base dyncall_struct # @@@ disable dyncall_callf for pcc support temporarly ifndef BUILD_TOOL_pcc UNITS += dyncall_callf endif ifndef BUILD_TOOL_msvc UNITS += dyncall_call else ifdef BUILD_ARCH_x86 ifdef BUILD_ASM_nasm UNITS += dyncall_call_x86_nasm else UNITS += dyncall_call_x86_generic_masm endif endif ifdef BUILD_ARCH_x64 ifdef BUILD_ASM_nasm UNITS += dyncall_call_x64_nasm else UNITS += dyncall_call_x64_generic_masm endif endif endif include $(GMAKE_TOP)/epilog.gmake nqp-2013.12.1/3rdparty/dyncall/dyncall/Makefile.M000066400000000000000000000004741225523575400213150ustar00rootroot00000000000000#include "../buildsys/dynmake/Makefile.base.M" all: _L(dyncall_s) _L(dyncall_s): _O(dyncall_vector) _O(dyncall_api) _O(dyncall_callvm) _O(dyncall_callvm_base) _O(dyncall_call) _O(dyncall_callf) _O(dyncall_struct) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dyncall_s) nqp-2013.12.1/3rdparty/dyncall/dyncall/Makefile.embedded000066400000000000000000000016401225523575400226460ustar00rootroot00000000000000MAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} TARGET = libdyncall_s.a OBJS = dyncall_vector.o dyncall_api.o dyncall_callvm.o dyncall_callvm_base.o dyncall_call.o dyncall_callf.o dyncall_struct.o HEADERS = dyncall_macros.h dyncall_config.h dyncall_types.h dyncall.h dyncall_signature.h dyncall_value.h dyncall_callf.h dyncall_alloc.h all: ${TARGET} libdyncall_s.a: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib mkdir -p ${DESTDIR}${PREFIX}/man/man3 gzip -c dyncall.3 >${DESTDIR}${PREFIX}/man/man3/dyncall.3.gz .PHONY: all clean install osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="/usr/bin/libtool" ARFLAGS="-static -o" ${MAKE_CMD} all nqp-2013.12.1/3rdparty/dyncall/dyncall/Makefile.generic000066400000000000000000000015031225523575400225270ustar00rootroot00000000000000SRCDIR ?= . BLDDIR ?= ${SRCDIR} LIBNAME = dyncall OBJS = dyncall_vector.o dyncall_api.o dyncall_callvm.o dyncall_callvm_base.o dyncall_call.o dyncall_callf.o dyncall_struct.o HEADERS = dyncall_macros.h dyncall_config.h dyncall_types.h dyncall.h dyncall_signature.h dyncall_value.h dyncall_callf.h dyncall_alloc.h LIB = lib${LIBNAME}_s.a all: ${LIB} .PHONY: all clean install RM ?= rm -f AR ?= ar MKLIB ?= ${AR} rcs MKDIR ?= mkdir INSTALL ?= install -p ${LIB}: ${OBJS} ${MKLIB} ${LIB} ${OBJS} clean: ${RM} ${OBJS} ${LIB} DESTDIR ?= /usr/local INSTALL_TOP ?= ${DESTDIR} INSTALL_INC ?= ${INSTALL_TOP}/include INSTALL_LIB ?= ${INSTALL_TOP}/lib install: ${MKDIR} -p ${INSTALL_INC} cd ${SRCDIR} ; ${INSTALL} ${HEADERS} ${INSTALL_INC} ${MKDIR} -p ${INSTALL_LIB} cd ${BLDDIR} ; ${INSTALL} ${LIB} ${INSTALL_LIB} nqp-2013.12.1/3rdparty/dyncall/dyncall/Makefile.psp000066400000000000000000000037701225523575400217250ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TARGET_LIB = libdyncall_s.a OBJS = \ dyncall.o \ dyncall_vector.o \ dyncall_callf.o \ dyncall_callvm_mips_eabi.o \ dyncall_mips_eabi.o HEADERS = \ dyncall_macros.h \ dyncall_config.h \ dyncall_types.h \ dyncall_signature.h \ dyncall_value.h \ dyncall_callf.h \ dyncall.h PSPSDK = $(shell psp-config --pspsdk-path) include $(PSPSDK)/lib/build.mak # pspsdk make fix # # As pspsdk sets AS=psp-gcc, dyncall_mips_eabi.s would be assembled to executable using psp-gcc, the '-c' option is missing. # workarounds: # 1. modify ASFLAGS += -c ( psp-gcc assembles into object format ) # 2. redefine AS = psp-as ( $(COMPILE.s) is defined as $(AS) $(ASFLAGS) $(TARGET_ARCH) ) # 3. rename dyncall_mips_eabi.s to dyncall_mips_eabi.S ( $(COMPILE.S) uses '-c' ) # ASFLAGS += -c # installation # .PHONY: install INSTALL_PREFIX = $(shell psp-config --psp-prefix) install: all mkdir -p $(INSTALL_PREFIX)/include $(INSTALL_PREFIX)/lib cp $(HEADERS) $(INSTALL_PREFIX)/include cp libdyncall_s.a $(INSTALL_PREFIX)/lib nqp-2013.12.1/3rdparty/dyncall/dyncall/Nmakefile000066400000000000000000000037741225523575400213060ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdyncall_s.lib #libdyncall.lib libdyncall.dll OBJS = dyncall_call_$(BUILD_ARCH)_generic_masm.obj dyncall_vector.obj dyncall_vector.obj dyncall_callvm.obj dyncall_callvm_base.obj dyncall_api.obj dyncall_callf.obj dyncall_struct.obj libdyncall_s.lib: $(OBJS) echo Creating library $@ ... $(AR) $(ARFLAGS) /OUT:"$@" $(OBJS) > nul libdyncall.dll libdyncall.lib: $(OBJS) echo Creating shared/import library $@ ... $(LD) /DLL $(LDFLAGS) $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdyncall_s.a OBJS = dyncall_call.o dyncall_vector.o dyncall_vector.o dyncall_callvm.o dyncall_callvm_base.o dyncall_api.o dyncall_callf.o libdyncall_s.a: $(OBJS) echo Creating library $@ ... $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake nqp-2013.12.1/3rdparty/dyncall/dyncall/README-Developer.txt000066400000000000000000000021641225523575400231010ustar00rootroot00000000000000Build with GCC Tool-Chain: One assembly front-end *.S source file for all supported architectures: Usage: gcc -c dyncall_call.S -o dyncall_call.o Advantages: - works fine with universal binary builds (fat binaries), e.g.: gcc -arch i386 -arch ppc -arch x86_64 -c dyncall_call.S -o dyncall_call.o Details: Simplified assembly file compilation via using a gigantic C Preprocessor switch include. source file "dyncall_call.S" selects the appropriate GAS/Apple assembly file "dyncall_call__.[sS]". archs so far: arm32_thumb .s arm32_arm .s mips .s ppc32 .s x64 .s x86 .S [ uses C macros ] asmtools: gas - standard GNU assembler apple - apple's assembler (based on GNU but is significantly different in syntax) masm - Microsoft assembler x86 and x64 nasm - Netwide assembler for x86 and x64 NOTE: .S is used for preprocessing assembly files using gcc .s is used directly with as advantages: - one way to build the kernel: gcc -c dyncall_call.S -o dyncall_call.o - we can build now universal binaries nqp-2013.12.1/3rdparty/dyncall/dyncall/README.txt000066400000000000000000000021541225523575400211550ustar00rootroot00000000000000Library Design Overview: 1. Call Kernel 2. Utilities (memory and static sized vectors) 3. Call State Machine 4. Application Programming Interface 5. extension: high-level formatted C API (ellipsis style) 1. Call Kernel Assembly Implementation: gcc front-end: dyncall_call.S uses the C preprocessor will include the apropriate assembly source architecture/tool specific sources: dyncall_call__.[s|asm] 2. Utilities (memory and static sized vectors) 2.1 Memory Management C Interface: dyncall_alloc.h 2.2 Static-sized Vector C Interface: dyncall_vector.h C Implementation: dyncall_vector.c 3. Call State Machine C Implementation: Top-level: dynall_callvm.c Sub-levels: dyncall_callvm_.c 4. Application Programming Interface C Header: Top-level: dyncall.h Sub-level headers: dyncall_macros.h dyncall_config.h dyncall_types.h C Implementation: dyncall_api.c 5. Extension: High-level C API (ellipsis style) C Header: Top-level: dyncall_callf.h Sub-level headers: dyncall_value.h dyncall_signature.h C Implementation: dyncall_callf.c nqp-2013.12.1/3rdparty/dyncall/dyncall/TODO000066400000000000000000000010461225523575400201460ustar00rootroot00000000000000- implement structure passing for all calling conventinos and platforms - make sure that struct support for ellipsis calls are not forgotten (copy everything by value) - merge arm32_thumb_{gas/apple} and include thumb support for portasm - check dyncall_call_x64_traditional_cpp.S / try-sync with win64 masm - remove dyncall_call_x86_apple.s - x64 port cleanup: all x64 calling conventions on all platforms - remove dyncall_call_x86_masm.asm dyncall_call_x64_masm.asm - x64 verification: return values are passed via RAX and RDX, and XMM0 and XMM1. nqp-2013.12.1/3rdparty/dyncall/dyncall/dynMakefile000066400000000000000000000003161225523575400216300ustar00rootroot00000000000000all: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall.3000066400000000000000000000135731225523575400212000ustar00rootroot00000000000000.\" Copyright (c) 2007,2008 Daniel Adler , .\" Tassilo Philipp .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .Dd $Mdocdate$ .Dt dyncall 3 .Os .Sh NAME .Nm dyncall .Nd encapsulation of architecture-, OS- and compiler-specific function call semantics .Sh SYNOPSIS .In dyncall.h .Ft DCCallVM * .Fn dcNewCallVM "DCsize size" .Ft void .Fn dcFree "DCCallVM * vm" .Ft void .Fn dcMode "DCCallVM * vm" "DCint mode" .Ft void .Fn dcReset "DCCallVM * vm" .Ft void .Fn dcArgBool "DCCallVM * vm" "DCbool arg" .Ft void .Fn dcArgChar "DCCallVM * vm" "DCchar arg" .Ft void .Fn dcArgShort "DCCallVM * vm" "DCshort arg" .Ft void .Fn dcArgInt "DCCallVM * vm" "DCint arg" .Ft void .Fn dcArgLong "DCCallVM * vm" "DClong arg" .Ft void .Fn dcArgLongLong "DCCallVM * vm" "DClonglong arg" .Ft void .Fn dcArgFloat "DCCallVM * vm" "DCfloat arg" .Ft void .Fn dcArgDouble "DCCallVM * vm" "DCdouble arg" .Ft void .Fn dcArgPointer "DCCallVM * vm" "DCpointer arg" .Ft DCvoid .Fn dcCallVoid "DCCallVM * vm" "DCpointer funcptr" .Ft DCbool .Fn dcCallBool "DCCallVM * vm" "DCpointer funcptr" .Ft DCchar .Fn dcCallChar "DCCallVM * vm" "DCpointer funcptr" .Ft DCshort .Fn dcCallShort "DCCallVM * vm" "DCpointer funcptr" .Ft DCint .Fn dcCallInt "DCCallVM * vm" "DCpointer funcptr" .Ft DClong .Fn dcCallLong "DCCallVM * vm" "DCpointer funcptr" .Ft DClonglong .Fn dcCallLongLong "DCCallVM * vm" "DCpointer funcptr" .Ft DCfloat .Fn dcCallFloat "DCCallVM * vm" "DCpointer funcptr" .Ft DCdouble .Fn dcCallDouble "DCCallVM * vm" "DCpointer funcptr" .Ft DCpointer .Fn dcCallPointer "DCCallVM * vm" "DCpointer funcptr" .Ft void .Fn dcCallF "DCCallVM * vm" "DCValue * result" "DCpointer funcptr" "const DCsigchar * signature" "..." .Ft void .Fn dcVCallF "DCCallVM * vm" "DCValue * result" "DCpointer funcptr" "const DCsigchar * signature" "va_list args" .Sh DESCRIPTION The .Nm library encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual "bind argument parameters from left to right and then call" interface allowing programmers to call C functions in a completely dynamic manner. .Pp In other words, instead of calling a function directly, the .Nm library provides a mechanism to push the function parameters manually and to issue the call afterwards. .Pp Since the idea behind this concept is similar to call dispatching mechanisms of virtual machines, the object that can be dynamically loaded with arguments, and then used to actually invoke the call, is called CallVM. It is possible to change the calling convention used by the CallVM at run-time. Due to the fact that nearly every platform comes with one or more calling conventions, the .Nm library project intends to be an open-source approach to the variety of compiler-specific binary interfaces, platform specific subtleties, and so on... .Pp .Fn dcNewCallVM creates a new CallVM object, where .Ar size specifies the size of the internal stack that will be allocated and used to bind the arguments to. Use .Fn dcFree to destroy the CallVM object. .Pp .Fn dcMode sets the calling convention to use. See the header file for a list of available modes. Note that some mode/platform combinations don't make any sense (e.g. using a PowerPC calling convention on a MIPS platform). .Pp .Fn dcReset resets the internal stack of arguments and prepares it for the selected mode. This function should be called after setting the call mode (using dcMode), but prior to binding arguments to the CallVM. Use it when reusing a CallVM, too, as arguments don't get flushed automatically after a function call invocation. .Pp .Fn dcArgBool , .Fn dcArgChar , .Fn dcArgShort , .Fn dcArgInt , .Fn dcArgLong , .Fn dcArgLongLong , .Fn dcArgFloat , .Fn dcArgDouble and .Fn dcArgPointer are used to bind arguments of the named types to the CallVM object. Binding is done in .Em "left to right" order. .Pp .Fn dcCallVoid , .Fn dcCallBool , .Fn dcCallChar , .Fn dcCallShort , .Fn dcCallInt , .Fn dcCallLong , .Fn dcCallLongLong , .Fn dcCallFloat , .Fn dcCallDouble and .Fn dcCallPointer call the function with the bound arguments and returning the named type, where .Ar funcptr is a pointer to the function to call. After the invocation of the function call, the argument values are still bound to the CallVM and a second call using the same arguments can be issued. Call .Fn reset to clear the internal argument stack. .Pp .Fn dcCallF and .Fn dcVCallF can be used to issue a printf-style function call, using a signature string encoding the argument types and return type. The return value will be stored in .Ar result . For information about the signature format, refer to the .Nm manual in PDF format. .Sh EXAMPLE Let's say, we want to make a call to the function: .Bd -literal double sqrt(double x); .Ed .Pp Using the .Nm library, this function would be called as follows: .Bd -literal double r; DCCallVM* vm = dcNewCallVM(4096); dcMode(vm, DC_CALL_C_DEFAULT); dcReset(vm); dcArgDouble(vm, 4.2373); r = dcCallDouble(vm, (DCpointer)&sqrt); dcFree(vm); .Ed .Sh SEE ALSO The .Nm manual (available in PDF format) for a way more detailed documentation of this library. .Sh AUTHORS .An "Daniel Adler" Aq dadler@uni-goettingen.de .An "Tassilo Philipp" Aq tphilipp@potion-studios.com nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall.h000066400000000000000000000121231225523575400212530ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall.h Description: public header for library dyncall License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall C API REVISION 2007/12/11 initial */ #ifndef DYNCALL_H #define DYNCALL_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCCallVM_ DCCallVM; typedef struct DCstruct_ DCstruct; /* Supported Calling Convention Modes */ #define DC_CALL_C_DEFAULT 0 #define DC_CALL_C_ELLIPSIS 100 #define DC_CALL_C_ELLIPSIS_VARARGS 101 #define DC_CALL_C_X86_CDECL 1 #define DC_CALL_C_X86_WIN32_STD 2 #define DC_CALL_C_X86_WIN32_FAST_MS 3 #define DC_CALL_C_X86_WIN32_FAST_GNU 4 #define DC_CALL_C_X86_WIN32_THIS_MS 5 #define DC_CALL_C_X86_WIN32_THIS_GNU 6 #define DC_CALL_C_X64_WIN64 7 #define DC_CALL_C_X64_SYSV 8 #define DC_CALL_C_PPC32_DARWIN 9 #define DC_CALL_C_PPC32_OSX 9 /* alias for DC_CALL_C_PPC32_DARWIN */ #define DC_CALL_C_ARM_ARM_EABI 10 #define DC_CALL_C_ARM_THUMB_EABI 11 #define DC_CALL_C_MIPS32_EABI 12 #define DC_CALL_C_MIPS32_PSPSDK DC_CALL_C_MIPS_EABI /* deprecated. */ #define DC_CALL_C_PPC32_SYSV 13 #define DC_CALL_C_PPC32_LINUX 13 /* alias for DC_CALL_C_PPC32_SYSV */ #define DC_CALL_C_ARM_ARM 14 #define DC_CALL_C_ARM_THUMB 15 #define DC_CALL_C_MIPS32_O32 16 #define DC_CALL_C_MIPS64_N32 17 #define DC_CALL_C_MIPS64_N64 18 #define DC_CALL_C_X86_PLAN9 19 #define DC_CALL_C_SPARC32 20 #define DC_CALL_C_SPARC64 21 #define DC_CALL_SYS_DEFAULT 200 #define DC_CALL_SYS_X86_INT80H_LINUX 201 #define DC_CALL_SYS_X86_INT80H_BSD 202 /* Error codes. */ #define DC_ERROR_NONE 0 #define DC_ERROR_UNSUPPORTED_MODE -1 DC_API DCCallVM* dcNewCallVM (DCsize size); DC_API void dcFree (DCCallVM* vm); DC_API void dcReset (DCCallVM* vm); DC_API void dcMode (DCCallVM* vm, DCint mode); DC_API void dcArgBool (DCCallVM* vm, DCbool value); DC_API void dcArgChar (DCCallVM* vm, DCchar value); DC_API void dcArgShort (DCCallVM* vm, DCshort value); DC_API void dcArgInt (DCCallVM* vm, DCint value); DC_API void dcArgLong (DCCallVM* vm, DClong value); DC_API void dcArgLongLong (DCCallVM* vm, DClonglong value); DC_API void dcArgFloat (DCCallVM* vm, DCfloat value); DC_API void dcArgDouble (DCCallVM* vm, DCdouble value); DC_API void dcArgPointer (DCCallVM* vm, DCpointer value); DC_API void dcArgStruct (DCCallVM* vm, DCstruct* s, DCpointer value); DC_API void dcCallVoid (DCCallVM* vm, DCpointer funcptr); DC_API DCbool dcCallBool (DCCallVM* vm, DCpointer funcptr); DC_API DCchar dcCallChar (DCCallVM* vm, DCpointer funcptr); DC_API DCshort dcCallShort (DCCallVM* vm, DCpointer funcptr); DC_API DCint dcCallInt (DCCallVM* vm, DCpointer funcptr); DC_API DClong dcCallLong (DCCallVM* vm, DCpointer funcptr); DC_API DClonglong dcCallLongLong (DCCallVM* vm, DCpointer funcptr); DC_API DCfloat dcCallFloat (DCCallVM* vm, DCpointer funcptr); DC_API DCdouble dcCallDouble (DCCallVM* vm, DCpointer funcptr); DC_API DCpointer dcCallPointer (DCCallVM* vm, DCpointer funcptr); DC_API void dcCallStruct (DCCallVM* vm, DCpointer funcptr, DCstruct* s, DCpointer returnValue); DC_API DCint dcGetError (DCCallVM* vm); #define DEFAULT_ALIGNMENT 0 DC_API DCstruct* dcNewStruct (DCsize fieldCount, DCint alignment); DC_API void dcStructField (DCstruct* s, DCint type, DCint alignment, DCsize arrayLength); DC_API void dcSubStruct (DCstruct* s, DCsize fieldCount, DCint alignment, DCsize arrayLength); /* Each dcNewStruct or dcSubStruct call must be paired with a dcCloseStruct. */ DC_API void dcCloseStruct (DCstruct* s); DC_API DCsize dcStructSize (DCstruct* s); DC_API DCsize dcStructAlignment(DCstruct* s); DC_API void dcFreeStruct (DCstruct* s); DC_API DCstruct* dcDefineStruct (const char* signature); #ifdef __cplusplus } #endif #endif /* DYNCALL_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_alloc.h000066400000000000000000000023021225523575400224230ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_alloc.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ALLOC_H #define DYNCALL_ALLOC_H #ifndef dcAllocMem #include #define dcAllocMem malloc #endif #ifndef dcFreeMem #define dcFreeMem free #endif #endif /* DYNCALL_ALLOC_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_api.c000066400000000000000000000072471225523575400221120ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_api.c Description: C interface to call vm License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "dyncall_callvm.h" #include "dyncall_alloc.h" void dcReset(DCCallVM* vm) { vm->mVTpointer->reset(vm); } void dcFree(DCCallVM* vm) { vm->mVTpointer->free(vm); } void dcMode(DCCallVM* vm,DCint mode) { vm->mVTpointer->mode(vm,mode); /* dcReset(vm); -- in order to support ellipsis calls, we need to allow * a dcMode(callvm, DC_CALL_C_ELLIPSIS_VARARGS) */ } void dcArgBool(DCCallVM* vm,DCbool x) { vm->mVTpointer->argBool(vm, x); } void dcArgChar(DCCallVM* vm,DCchar x) { vm->mVTpointer->argChar(vm, x); } void dcArgShort(DCCallVM* vm,DCshort x) { vm->mVTpointer->argShort(vm, x); } void dcArgInt(DCCallVM* vm,DCint x) { vm->mVTpointer->argInt(vm, x); } void dcArgLong(DCCallVM* vm,DClong x) { vm->mVTpointer->argLong(vm, x); } void dcArgLongLong(DCCallVM* vm, DClonglong x) { vm->mVTpointer->argLongLong(vm, x); } void dcArgFloat(DCCallVM* vm, DCfloat x) { vm->mVTpointer->argFloat(vm, x); } void dcArgDouble(DCCallVM* vm, DCdouble x) { vm->mVTpointer->argDouble(vm, x); } void dcArgPointer(DCCallVM* vm, DCpointer x) { vm->mVTpointer->argPointer(vm, x); } void dcArgStruct(DCCallVM* vm, DCstruct* s, DCpointer x) { vm->mVTpointer->argStruct(vm, s, x); } void dcCallVoid(DCCallVM* vm, DCpointer funcptr) { vm->mVTpointer->callVoid(vm, funcptr); } DCchar dcCallChar(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callChar(vm, funcptr); } DCbool dcCallBool(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callBool(vm, funcptr); } DCshort dcCallShort(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callShort(vm, funcptr); } DCint dcCallInt(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callInt(vm, funcptr); } DClong dcCallLong(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callLong(vm, funcptr); } DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callLongLong(vm, funcptr); } DCfloat dcCallFloat(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callFloat(vm, funcptr); } DCdouble dcCallDouble(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callDouble(vm, funcptr); } DCpointer dcCallPointer(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callPointer(vm, funcptr); } void dcCallStruct(DCCallVM* vm, DCpointer funcptr, DCstruct* s, DCpointer x) { vm->mVTpointer->callStruct(vm, funcptr, s, x); } DCint dcGetError(DCCallVM *vm) { return vm->mError; } const char* dcGetErrorString(int mode) { switch(mode) { case DC_ERROR_NONE: return "none"; case DC_ERROR_UNSUPPORTED_MODE: return "unsupported mode"; default: return "(unknown mode id)"; } } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call.S000066400000000000000000000042231225523575400222230ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call.S Description: assembly call kernel, auto-selected by gcc / Plan9 build system License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_macros.h" /* Plan9 */ #if defined(DC__OS_Plan9) # if defined(DC__Arch_Intel_x86) # include "dyncall_call_x86_8a.s" # else # error Unsupported Architecture on Plan9. # endif #elif defined(DC__C_MSVC) # if defined(DC__OS_Win32) # include "dyncall_call_x86_generic_masm.asm" # elif defined(DC__OS_Win64) # include "dyncall_call_x64_generic_masm.asm" # endif #else # if defined(DC__Arch_Intel_x86) # include "dyncall_call_x86.S" # elif defined(DC__Arch_AMD64) # include "dyncall_call_x64-att.S" # elif defined(DC__Arch_ARM_ARM) # include "dyncall_call_arm32_arm.S" # elif defined(DC__Arch_ARM_THUMB) # if defined(DC__OS_Darwin) # include "dyncall_call_arm32_thumb_apple.s" # else # include "dyncall_call_arm32_thumb_gas.s" # endif # elif defined(DC__Arch_PowerPC) # include "dyncall_call_ppc32.S" # elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # include "dyncall_call_mips_gas.S" # elif defined(DC__Arch_Sparcv9) # include "dyncall_call_sparc64.S" # elif defined(DC__Arch_Sparc) # include "dyncall_call_sparc.S" # else # error Unsupported Architecture. # endif #endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.S000066400000000000000000000060441225523575400240710ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm.S Description: Call Kernel for ARM 32-bit ARM Architecture License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-arm.S" /* ============================================================================ DynCall Call Kernel for ARM 32-bit ARM Architecture ---------------------------------------------------------------------------- C Interface: dcCall_arm32_arm(DCpointer target, DCpointer argv, DCsize size); This Call Kernel works across multiple OS. It has been tested on Nintendo DS, Linux and Darwin(iOS). */ .text .code 32 /* ARM mode */ GLOBAL_C(dcCall_arm32_arm) ENTRY_C(dcCall_arm32_arm) /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ mov r12, r13 /* Stack ptr (r13) -> temporary (r12). */ stmdb r13!, {r4-r12, r14} /* Permanent registers and stack pointer (now in r12), etc... -> save area on stack (except counter). */ mov r11, r12 /* Set frame ptr. */ /* Call. */ mov r4, r0 /* r4 = 'fptr' (1st argument is passed in r0). */ mov r5, r1 /* r5 = 'args' (2nd argument is passed in r1). */ mov r6, r2 /* r6 = 'size' (3rd argument is passed in r2). */ ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ subs r6, r6, #16 /* Size of remaining arguments. */ ble call /* Jump to call if no more arguments. */ sub r13, r13, r6 /* Set stack pointer to top of stack. */ and r9, r6, #7 /* Align stack on 8 byte boundaries. */ sub r13, r13, r9 mov r8, r13 /* Temp. destination pointer. */ mov r9, #0 /* Init byte counter. */ pushArgs: ldrb r7, [r5, r9] /* Load a byte into r7. */ strb r7, [r8, r9] /* Push byte onto stack. */ add r9, r9, #1 /* Increment byte counter. */ cmp r9, r6 bne pushArgs call: /* 'blx %r4' workaround for ARMv4t: */ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx r4 /* Call (ARM/THUMB), available for ARMv4t. */ /* Epilog. */ ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (ignore temporary (r12), restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.h000066400000000000000000000026621225523575400241200ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit ARM32 family interface (ARM mode) REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALL_ARM32_ARM_H #define DYNCALL_CALL_ARM32_ARM_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** arm32 arm mode calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_arm32_arm(DCpointer target, DCpointer stackdata, DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM32_ARM_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb.h000066400000000000000000000032761225523575400244620ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit ARM32 family interface (THUMB mode) REVISION 2008/08/12 initial */ #ifndef DYNCALL_CALL_ARM32_THUMB_H #define DYNCALL_CALL_ARM32_THUMB_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** arm32 thumb mode calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_arm32_thumb(DCpointer target, DCpointer stackdata, DCsize size); /* Internally used to avoid compiler overwriting r0 and r1 in call stub */ DClong dcCall_arm32_thumb_word (DCpointer target, DCpointer stackdata, DCsize size); DClonglong dcCall_arm32_thumb_dword(DCpointer target, DCpointer stackdata, DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM32_THUMB_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_apple.s000066400000000000000000000063241225523575400256530ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb_apple.s Description: ARM Thumb call kernel implementation for apple assembler. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 16 /* THUMB mode */ .globl _dcCall_arm32_thumb /* Main dyncall call. */ .thumb_func _dcCall_arm32_thumb: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ push {r4-r7, r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ mov r7, r13 /* Set frame ptr. */ /* Call. */ mov r4, r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ /* Disable 'thumb' address forcing... */ /* mov r0, #1 */ /* Assure that LSB is set to 1 (THUMB call). - Not Required and not useful for interworking calls */ /* orr r4, r0 */ mov r5, r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ mov r6, r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ cmp r6, #16 /* Jump to call if no more than 4 arguments. */ ble call sub r6, #16 /* Size of remaining arguments. */ mov r0, r13 /* Set stack pointer to top of stack. */ sub r0, r0, r6 lsr r0, #3 /* Align stack on 8 byte boundaries. */ lsl r0, #3 mov r13, r0 add r1, #16 /* Let r1 point to remaining arguments. */ mov r2, #0 /* Init byte counter to 0. */ .thumb_func pushArgs: ldrb r3, [r1, r2] /* Load a byte into r3. */ strb r3, [r0, r2] /* Push byte onto stack. */ add r2, r2, #1 /* Increment byte counter. */ cmp r2, r6 bne pushArgs .thumb_func call: ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t in THUMB: */ mov r6, r15 /* Load PC+2 instructions from here */ add r6, #5 /* Increment by 2 instructions (Address of 'Epilog') and set bit 0 (THUMB) */ mov r14, r6 /* Store in link register. */ bx r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ /* Epilog. */ mov r13, r7 /* Reset stack ptr. */ pop {r4-r7, r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ /* Internally used to avoid compiler overwriting r0 and r1 in call stub */ .globl _dcCall_arm32_thumb_word .thumb_func _dcCall_arm32_thumb_word: b dcCall_arm32_thumb .globl _dcCall_arm32_thumb_dword .thumb_func _dcCall_arm32_thumb_dword: b dcCall_arm32_thumb nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s000066400000000000000000000063751225523575400253320ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb_gas.s Description: ARM Thumb call kernel implementation for GNU assembler. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 16 /* THUMB mode */ .globl dcCall_arm32_thumb /* Main dyncall call. */ .thumb_func dcCall_arm32_thumb: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ push {%r4-%r7, %r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ mov %r7, %r13 /* Set frame ptr. */ /* Call. */ mov %r4, %r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ /* Disable 'thumb' address forcing... */ /* mov %r0, #1 */ /* Assure that LSB is set to 1 (THUMB call). - Not Required and not useful for interworking calls */ /* orr %r4, %r0 */ mov %r5, %r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ mov %r6, %r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ cmp %r6, #16 /* Jump to call if no more than 4 arguments. */ ble call sub %r6, #16 /* Size of remaining arguments. */ mov %r0, %r13 /* Set stack pointer to top of stack. */ sub %r0, %r0, %r6 lsr %r0, #3 /* Align stack on 8 byte boundaries. */ lsl %r0, #3 mov %r13, %r0 add %r1, #16 /* Let r1 point to remaining arguments. */ mov %r2, #0 /* Init byte counter to 0. */ .thumb_func pushArgs: ldrb %r3, [%r1, %r2] /* Load a byte into r3. */ strb %r3, [%r0, %r2] /* Push byte onto stack. */ add %r2, %r2, #1 /* Increment byte counter. */ cmp %r2, %r6 bne pushArgs .thumb_func call: ldmia %r5!, {%r0-%r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t in THUMB: */ mov %r6, %r15 /* Load PC+2 instructions from here */ add %r6, #5 /* Increment by 2 instructions (Address of 'Epilog') and set bit 0 (THUMB) */ mov %r14, %r6 /* Store in link register. */ bx %r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ /* Epilog. */ mov %r13, %r7 /* Reset stack ptr. */ pop {%r4-%r7, %r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ /* Internally used to avoid compiler overwriting r0 and r1 in call stub */ .globl dcCall_arm32_thumb_word .thumb_func dcCall_arm32_thumb_word: b dcCall_arm32_thumb .globl dcCall_arm32_thumb_dword .thumb_func dcCall_arm32_thumb_dword: b dcCall_arm32_thumb nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips.h000066400000000000000000000027361225523575400233070ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips.h Description: mips call-kernel C interfaces. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall MIPS call kernel C interface for all ABIs REVISION 2010/06/03 initial */ #ifndef DYNCALL_CALL_MIPS_H #define DYNCALL_CALL_MIPS_H /* supported abi-specific call kernels: */ #include "dyncall_call_mips_o32.h" #include "dyncall_call_mips_eabi.h" #include "dyncall_call_mips_n64.h" #include "dyncall_call_mips_n32.h" typedef void (*dcCall_mips_common) (DCpointer target, DCpointer regdata_abispecific, DCsize stacksize, DCpointer stackdata); #endif /* DYNCALL_CALL_MIPS_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_eabi.h000066400000000000000000000032051225523575400242570ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_eabi.h Description: mips "eabi" abi call kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_EABI_H #define DYNCALL_CALL_MIPS_EABI_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* Call-kernel register data: Details: Two register content buffers for the corresponding register types integer and float are filled from CallVM code and then later at call-kernel loaded into the registers. */ struct DCRegData_mips_eabi { DCint mIntData[8]; DCfloat mSingleData[8]; }; /* Call kernel. */ void dcCall_mips_eabi(DCpointer target, struct DCRegData_mips_eabi* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_EABI_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_eabi_gas.s000066400000000000000000000044751225523575400251360ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_eabi_gas.s Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /*////////////////////////////////////////////////////////////////////// dyncall_call_mips_eabi_gas.s MIPS 32bit family of processors. 2008-01-03 //////////////////////////////////////////////////////////////////////*/ .text .globl dcCall_mips_eabi dcCall_mips_eabi: /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ addiu $sp,$sp,-16 sw $16,8($sp) sw $31,4($sp) sw $fp,0($sp) move $fp,$sp move $2, $0 add $2, 8 neg $2 and $sp, $2 add $6, 7 and $6, $2 move $12,$4 /* target function */ move $13,$5 /* register data */ move $16,$6 /* stack size */ sub $sp,$sp,$16 /* allocate stack frame */ /* copy stack data */ .next: beq $6,$0, .skip nop addiu $6,$6, -4 lw $2, 0($7) sw $2, 0($sp) addiu $7,$7, 4 addiu $sp,$sp, 4 j .next nop .skip: sub $sp,$sp,$16 /* load integer parameter registers */ lw $4 , 0($13) lw $5 , 4($13) lw $6 , 8($13) lw $7 ,12($13) lw $8 ,16($13) lw $9 ,20($13) lw $10,24($13) lw $11,28($13) /* load single-precise floating pointer parameter registers */ lwc1 $f12, 32($13) lwc1 $f13, 36($13) lwc1 $f14, 40($13) lwc1 $f15, 44($13) lwc1 $f16, 48($13) lwc1 $f17, 52($13) lwc1 $f18, 56($13) lwc1 $f19, 60($13) jal $12 nop /* add $sp,$sp,$16 */ move $sp,$fp lw $16,8($sp) lw $31,4($sp) lw $fp,0($sp) addiu $sp,$sp,16 j $31 nop nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_gas.S000066400000000000000000000024231225523575400241050ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_gas.S Description: auto-select (via gnu c preprocessor) mips abi call kernel License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(DC__ABI_MIPS_O32) #include "dyncall_call_mips_o32_gas.s" #elif defined(DC__ABI_MIPS_N64) #include "dyncall_call_mips_n64_gas.s" #elif defined(DC__ABI_MIPS_N32) #include "dyncall_call_mips_n32_gas.s" #else #include "dyncall_call_mips_eabi_gas.s" #endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_n32.h000066400000000000000000000040761225523575400237700ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n32.h Description: mips "n32" ABI call-kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_N32_H #define DYNCALL_CALL_MIPS_N32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* two register-files for integer (promoted to 64-bit) and float (not promoted!) are used. arguments are transfered in a free slot on the corresponding register file. the other register-file will be skipped by one. float arguments are either loaded from single or double - a auto-conversion into double and then loaded as double precision turned out to fail for several tests. therefore a union for storage of float or double is used instead. a bitmask (mUseDouble) records which type is used and will be interpreted in the call-kernel. */ struct DCRegData_mips_n32 { DClonglong mIntData[8]; union { DCfloat f; DCdouble d; } mFloatData[8]; DClonglong mUseDouble; /* bitmask: lower 8 bits specifies to use float or double from union array. */ }; void dcCall_mips_n32(DCpointer target, struct DCRegData_mips_n32* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_N64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_n32_gas.s000066400000000000000000000073651225523575400246410ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n32_gas.s Description: mips "n32" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .section .mdebug.abiN32 .previous .abicalls .text .align 2 .globl dcCall_mips_n32 .ent dcCall_mips_n32 dcCall_mips_n32: /* Stack-frame prolog */ .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */ .mask 0xd0000000,-8 .fmask 0x00000000,0 subu $sp,$sp,64 sd $31,48($sp) /* save return address register (ra) */ sd $30,40($sp) /* save frame pointer register (fp) */ sd $28,32($sp) /* save global pointer register (gp) */ move $fp,$sp /* arguments: */ /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ /* allocate argument stack space */ subu $sp, $sp, $6 /* copy stack data */ /* n64 abi call assumptions: - stack data is 16-byte aligned. - no extra-storage for arguments passed via registers. */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip nop daddiu $6, $6, -8 ld $2, 0($12) sd $2, 0($14) daddiu $12,$12, 8 daddiu $14,$14, 8 b .next .skip: move $25, $4 /* load registers */ /* locals: */ /* $13 = register data */ /* $14 = useDouble flags */ move $13, $5 ld $14, 128($13) /* load integer parameter registers */ ld $4 , 0($13) ld $5 , 8($13) ld $6 ,16($13) ld $7 ,24($13) ld $8 ,32($13) ld $9 ,40($13) ld $10,48($13) ld $11,56($13) /* load float-or-double floating pointer parameter registers a 64-bit bitmask given at byte offset 128 of regdata indicates if loading a float (bit cleared) or double (bit set), starting at bit position 0 in bitmask. */ .t0: and $15, $14, 1 bgtz $15, .d0 .f0: l.s $f12, 64($13) j .t1 .d0: l.d $f12, 64($13) .t1: and $15, $14, 2 bgtz $15, .d1 .f1: l.s $f13, 72($13) j .t2 .d1: l.d $f13, 72($13) .t2: and $15, $14, 4 bgtz $15, .d2 .f2: l.s $f14, 80($13) j .t3 .d2: l.d $f14, 80($13) .t3: and $15, $14, 8 bgtz $15, .d3 .f3: l.s $f15, 88($13) j .t4 .d3: l.d $f15, 88($13) .t4: and $15, $14, 16 bgtz $15, .d4 .f4: l.s $f16, 96($13) j .t5 .d4: l.d $f16, 96($13) .t5: and $15, $14, 32 bgtz $15, .d5 .f5: l.s $f17,104($13) j .t6 .d5: l.d $f17,104($13) .t6: and $15, $14, 64 bgtz $15, .d6 .f6: l.s $f18,112($13) j .t7 .d6: l.d $f18,112($13) .t7: and $15, $14, 128 bgtz $15, .d7 .f7: l.s $f19,120($13) j .fregend .d7: l.d $f19,120($13) .fregend: /* jump-and-link to register $25 */ jal $31, $25 /* no nop according to gcc assembly output */ /* Stack-frame epilog */ move $sp,$fp ld $31,48($sp) /* restore ra register */ ld $fp,40($sp) /* restore fp register */ ld $28,32($sp) /* restore gp register */ daddu $sp,$sp,64 j $31 .end dcCall_mips_n64 .size dcCall_mips_n64, .-dcCall_mips_n64 nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_n64.h000066400000000000000000000040761225523575400237750ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n64.h Description: mips "n64" ABI call-kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_N64_H #define DYNCALL_CALL_MIPS_N64_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* two register-files for integer (promoted to 64-bit) and float (not promoted!) are used. arguments are transfered in a free slot on the corresponding register file. the other register-file will be skipped by one. float arguments are either loaded from single or double - a auto-conversion into double and then loaded as double precision turned out to fail for several tests. therefore a union for storage of float or double is used instead. a bitmask (mUseDouble) records which type is used and will be interpreted in the call-kernel. */ struct DCRegData_mips_n64 { DClonglong mIntData[8]; union { DCfloat f; DCdouble d; } mFloatData[8]; DClonglong mUseDouble; /* bitmask: lower 8 bits specifies to use float or double from union array. */ }; void dcCall_mips_n64(DCpointer target, struct DCRegData_mips_n64* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_N64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_n64_gas.s000066400000000000000000000073661225523575400246470ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n64_gas.s Description: mips "n64" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .section .mdebug.abi64 .previous .abicalls .text .align 2 .globl dcCall_mips_n64 .ent dcCall_mips_n64 dcCall_mips_n64: /* Stack-frame prolog */ .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */ .mask 0xd0000000,-8 .fmask 0x00000000,0 dsubu $sp,$sp,64 sd $31,48($sp) /* save return address register (ra) */ sd $30,40($sp) /* save frame pointer register (fp) */ sd $28,32($sp) /* save global pointer register (gp) */ move $fp,$sp /* arguments: */ /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ /* allocate argument stack space */ dsubu $sp, $sp, $6 /* copy stack data */ /* n64 abi call assumptions: - stack data is 16-byte aligned. - no extra-storage for arguments passed via registers. */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip nop daddiu $6, $6, -8 ld $2, 0($12) sd $2, 0($14) daddiu $12,$12, 8 daddiu $14,$14, 8 b .next .skip: move $25, $4 /* load registers */ /* locals: */ /* $13 = register data */ /* $14 = useDouble flags */ move $13, $5 ld $14, 128($13) /* load integer parameter registers */ ld $4 , 0($13) ld $5 , 8($13) ld $6 ,16($13) ld $7 ,24($13) ld $8 ,32($13) ld $9 ,40($13) ld $10,48($13) ld $11,56($13) /* load float-or-double floating pointer parameter registers a 64-bit bitmask given at byte offset 128 of regdata indicates if loading a float (bit cleared) or double (bit set), starting at bit position 0 in bitmask. */ .t0: and $15, $14, 1 bgtz $15, .d0 .f0: l.s $f12, 64($13) j .t1 .d0: l.d $f12, 64($13) .t1: and $15, $14, 2 bgtz $15, .d1 .f1: l.s $f13, 72($13) j .t2 .d1: l.d $f13, 72($13) .t2: and $15, $14, 4 bgtz $15, .d2 .f2: l.s $f14, 80($13) j .t3 .d2: l.d $f14, 80($13) .t3: and $15, $14, 8 bgtz $15, .d3 .f3: l.s $f15, 88($13) j .t4 .d3: l.d $f15, 88($13) .t4: and $15, $14, 16 bgtz $15, .d4 .f4: l.s $f16, 96($13) j .t5 .d4: l.d $f16, 96($13) .t5: and $15, $14, 32 bgtz $15, .d5 .f5: l.s $f17,104($13) j .t6 .d5: l.d $f17,104($13) .t6: and $15, $14, 64 bgtz $15, .d6 .f6: l.s $f18,112($13) j .t7 .d6: l.d $f18,112($13) .t7: and $15, $14, 128 bgtz $15, .d7 .f7: l.s $f19,120($13) j .fregend .d7: l.d $f19,120($13) .fregend: /* jump-and-link to register $25 */ jal $31, $25 /* no nop according to gcc assembly output */ /* Stack-frame epilog */ move $sp,$fp ld $31,48($sp) /* restore ra register */ ld $fp,40($sp) /* restore fp register */ ld $28,32($sp) /* restore gp register */ daddu $sp,$sp,64 j $31 .end dcCall_mips_n64 .size dcCall_mips_n64, .-dcCall_mips_n64 nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_o32.h000066400000000000000000000035571225523575400237740ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_o32.h Description: mips "o32" abi call kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_O32_H #define DYNCALL_CALL_MIPS_O32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* Call-kernel register data: Details: The structure holds the argument data for transfering float/double arguments via registers as well. The call-kernel implements loads two doubles, which involves four 32-bit floating pointer registers. Float arguments map as following: float argument 0 is at floats[1] and float argument 1 is at floats[3] of DCRegData_mips_o32 union. */ typedef union DCRegData_mips_o32_ { double doubles[2]; float floats [4]; /* float 0 is at index 1 and float 1 is at index 3 */ } DCRegData_mips_o32; /* Call kernel. */ void dcCall_mips_o32(DCpointer target, DCRegData_mips_o32* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_O32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_mips_o32_gas.s000066400000000000000000000056121225523575400246330ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_o32_gas.s Description: mips "o32" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .section .mdebug.abi32 .previous .abicalls .text .align 2 .globl dcCall_mips_o32 .ent dcCall_mips_o32 .type dcCall_mips_o32, @function dcCall_mips_o32: .frame $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */ .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-40 sw $31,36($sp) sw $fp,32($sp) move $fp,$sp .cprestore 16 sw $4,40($fp) sw $5,44($fp) sw $6,48($fp) sw $7,52($fp) /* $4 target function */ /* $5 register data */ /* $6 stack size (min 16-byte aligned to 8-bytes already) */ /* $7 stack data */ /* increment stack */ sub $sp, $sp, $6 /* copy stack data */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip nop addiu $6, $6, -4 lw $2, 0($12) nop sw $2, 0($14) nop addiu $12,$12, 4 addiu $14,$14, 4 j .next nop .skip: /* load two double-precision floating-point argument registers ($f12, $f14) */ #if defined(__MIPSEL__) lwc1 $f12, 0($5) /* float arg 0 */ nop lwc1 $f13, 4($5) nop lwc1 $f14, 8($5) /* float arg 1 */ nop lwc1 $f15,12($5) nop #else lwc1 $f12, 4($5) /* float arg 0 */ nop lwc1 $f13, 0($5) nop lwc1 $f14, 12($5) /* float arg 1 */ nop lwc1 $f15, 8($5) nop #endif /* prepare call */ /* $12 stack data */ /* $25 target function */ move $12, $7 move $25, $4 /* load first four integer arguments ($4-$7) */ lw $4, 0($12) nop lw $5, 4($12) nop lw $6, 8($12) nop lw $7,12($12) nop /* call target function */ jalr $25 nop lw $28,16($fp) /* restore global pointer */ move $sp,$fp /* restore stack pointer */ lw $31,36($sp) /* restore return address */ lw $fp,32($sp) /* restore frame pointer */ addiu $sp,$sp,40 /* end stack frame */ j $31 /* return */ nop .set macro .set reorder .end dcCall_mips_o32 .ident "handwritten" nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_ppc32.S000066400000000000000000000145431225523575400232400ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc32.S Description: Call Kernel for PowerPC 32-bit Architecture License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" /* Call Kernel Implementations for PowerPC. Supported Calling Conventions: sysv, darwin */ .machine ppc .text /* ============================================================================ DynCall Call Kernels for PPC32 Architecture ------------------------------------------------------------------------- C Interface: struct DCRegData { int i[8]; double d[13]; }; dcCall_ppc32_XXX(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata); Where XXX is one of the following Calling Conventions: darwin, sysv ChangeLog: 2011-04-03: Using portasm. 2009-01-09: Added Support for System V ABI. 2007-11-28: Initial Support for Darwin. */ /*--------------------------------------------------------------------------- Call Kernel for ppc32 Darwin Input: r3 : target address ptr r4 : register data ptr (8 x GPR 32 bytes, 13 x FPR 64 bytes) r5 : stack data size r6 : stack data ptr Details: - Stack frames are always aligned on 16 byte - The GPR3 .. GPR10 are loaded - The FPR1 .. FPR13 are loaded - No support for Vector Parameters so far. - Parameter Area (min. 32 Bytes) - Linkage Area (24 Bytes) */ .align 2 GLOBAL_C(dcCall_ppc32_darwin) ENTRY_C(dcCall_ppc32_darwin) mflr r0 /* r0 = return address */ stw r0,8(r1) /* store return address in caller link-area */ /* compute aligned stack-size */ /* add link area and align to 16 byte border */ addi r0,r5,24+15 /* r0 = stacksize + link area */ rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */ /* r0 = r0 and -15 */ neg r2,r0 /* r2 = -stacksize */ stwux r1,r1,r2 /* r1 = r1 - stacksize */ /* copy stack data */ subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */ addi r7,r1,20 /* r7 = 4 bytes before target stack parameter-block */ srwi r5,r5,2 /* r5 = size in words */ cmpi cr0,r5,0 /* if stacksize != 0 .. */ beq cr0,.done mtctr r5 /* copy loop */ .next: lwzu r0, 4(r6) stwu r0, 4(r7) bdnz .next .done: mr r12, r3 /* r12 = target function */ mtctr r12 /* control register = target function */ mr r2, r4 /* r2 = reg data */ /* load 8 integer registers */ lwz r3 , 0(r2) lwz r4 , 4(r2) lwz r5 , 8(r2) lwz r6 ,12(r2) lwz r7 ,16(r2) lwz r8 ,20(r2) lwz r9 ,24(r2) lwz r10,28(r2) /* load 13 float registers */ lfd f1 ,32(r2) lfd f2 ,40(r2) lfd f3 ,48(r2) lfd f4 ,56(r2) lfd f5 ,64(r2) lfd f6 ,72(r2) lfd f7 ,80(r2) lfd f8 ,88(r2) lfd f9 ,96(r2) lfd f10,104(r2) lfd f11,112(r2) lfd f12,120(r2) lfd f13,128(r2) /* branch */ bctrl /* epilog */ lwz r1, 0(r1) /* restore stack */ lwz r0, 8(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr /* store */ /* ---------------------------------------------------------------------------- Call Kernel for ppc32 System Input: r3 : target address ptr r4 : register data ptr (8 x GPR 32 bytes, 8 x FPR 64 bytes) r5 : stack data size r6 : stack data ptr Details: - Stack frames are always aligned on 16 byte - Reserve GPR2 (System register) - The GPR3 .. GPR10 are loaded - The FPR1 .. FPR8 are loaded - No support for Vector Parameters so far. Frame structure: on entry, parent frame layout: offset 4: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) after frame initialization: stack size = ( (8+15) + stacksize ) & -(16) ... locals and register spills 8: parameter list area 4: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) */ .align 2 GLOBAL_C(dcCall_ppc32_sysv) ENTRY_C(dcCall_ppc32_sysv) /* prolog */ /* save link register */ mflr r0 stw r0,4(r1) /* allocate stack frame */ /* add 8 bytes (back link and return address) and align to 16 boundary */ /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address */ addi r0,r5,8+15 srwi r0,r0,4 slwi r0,r0,4 /* r0 = r0 and -15 */ /* rlwinm %r0,%r0,0,0,27 */ /* r0 = -stacksize */ neg r0,r0 /* r1 = r1 - stacksize */ stwux r1,r1,r0 /* copy stack parameters */ /* copy stack data */ subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */ /* 4 bytes before target stack parameter-block */ addi r7,r1,4 /* r7 = r1 + 8 offset - 4 displacement */ srwi r5,r5,2 /* r5 = size in words */ cmpi cr0,r5,0 /* if stacksize != 0 .. */ beq cr0,sysv_done mtctr r5 /* copy loop */ sysv_next: lwzu r0, 4(r6) stwu r0, 4(r7) bdnz sysv_next sysv_done: /* this call support using ctr branch register */ mr r12, r3 mr r11 , r4 /* load integer registers from integer data */ lwz r3 , 0(r11) lwz r4 , 4(r11) lwz r5 , 8(r11) lwz r6 ,12(r11) lwz r7 ,16(r11) lwz r8 ,20(r11) lwz r9 ,24(r11) lwz r10,28(r11) /* load float (double precision) registers from double data */ lfd f1 ,32(r11) lfd f2 ,40(r11) lfd f3 ,48(r11) lfd f4 ,56(r11) lfd f5 ,64(r11) lfd f6 ,72(r11) lfd f7 ,80(r11) lfd f8 ,88(r11) /* used for ellipsis calls */ creqv 6,6,6 /* branch with this call support */ mtctr r12 bctrl /* epilog */ lwz r1, 0(r1) /* restore stack */ lwz r0, 4(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr /* return */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_ppc32.h000066400000000000000000000031301225523575400232530ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc32.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_PPC32_H #define DYNCALL_PPC32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif struct DCRegData_ppc32_ { DCint mIntData[8]; DCdouble mFloatData[13]; }; /* ** PowerPC 32-bit calling convention call ** ** - hybrid return-type call (bool ... pointer) ** */ /* Darwin ABI */ void dcCall_ppc32_darwin (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata); /* System V (Linux) ABI */ void dcCall_ppc32_sysv (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_PPC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_sparc.S000066400000000000000000000124161225523575400234160ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc.S Description: Call kernel for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* --------------------------------------------------------------------------- call kernel for sparc 32-bit ---------------------------- tested on linux/debian [gcc54.fsffrance.org - thanx to the farm!] new C Interface: void dcCall_sparc (DCCallVM* callvm, DCpointer target); %i0 %1 we need to do that, due to the special property of sparc, its 'register windows' that propagate input registers.. otherwise, we would have a 'void' return-value layer which results in failure to propagate back return values. instead of implementing 'dummy'-C return-values, we call directly. in sparc, this is simply a leaf-function layer using %o3. old C Interface: void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); %i0 , %i1 , %i2 Input: i0 callvm i1 target old Input: i0 target i1 size i2 data Description: We need to raise a dynamic stack frame. Therefore we need to compute the stack size in the context of the caller as a leaf note (using o3 in addition). Then we raise the frame. sparc: - big endian sparc V8: - integer/pointer: 32 32-bit integers. - float: 8 quad precision, 16 double precision, 32 single precision. sparc V9: - integer/pointer: 32 64-bit integers. plan9: - completely different scheme - similar to mips/plan9. - registers are named r0 .. r31 r1 stack pointer r2 static base register .. to be continued.. Stack Layout 32-Bit Model: - sp+92 seventh argument - sp+68 first argument - sp+64 - 16 registers save area (in/local). XX: should be 8 byte aligned (min stack frame size is 96). ... 92: on stack argument 6 88: input argument 5 spill ... 68: input argument 0 spill 64: struct/union pointer return value 0: 16 registers save area Stack Layout 64-Bit Model: XX: should be 16 byte aligned (min stack frame size is 172). 168: on stack argument 6 136: input argument 0 spill 128: struct/union poiner return value 0: 16 registers save area Register Usage: %sp or %o6: stack pointer, always 8 (or 16?)-byte aligned. %fp or %i6: frame pointer. %i0 and %o0: integer and pointer return values. %i7 and %o7: return address. (caller puts return address to %o7, callee uses %i7) %f0 and %f1: return value (float). %i0..%i5: input argument registers %o0..%o5: output argument registers %g0: always zero, writes to it have no effect. Register Mappings: r0-7 -> globals r8-15 -> outs r16-r23 -> locals r24-r31 -> ins */ #if defined __arch64__ #define REGSIZE 8 #error invalid arch #else #define REGSIZE 4 #endif #define ALIGN 16 CALLVM_size = 12 CALLVM_dataoff = 16 .global dcCall_sparc dcCall_sparc: /* Basic Prolog: supports up to 6 arguments. */ /* new C interface */ /* o0-1: callvm,target */ or %o0, %g0, %o3 /* %o3: callvm */ or %o1, %g0, %o0 /* %o0: target */ ld [%o3+CALLVM_size], %o1 /* %o1: size */ add %o3, CALLVM_dataoff, %o2 /* %o2: data */ /*o0-2:target,size,data*/ /*leaf functions: may use the first six output registers.*/ /*o3-5:free to use */ /* Compute a matiching stack size (approximate): o3 = align(92+o1,16) */ add %o1, (16+1+6)*REGSIZE+ALIGN-1, %o3 and %o3, -ALIGN, %o3 neg %o3 /* Prolog. */ save %sp, %o3, %sp /* min stack size (16+1+6)*sizeof(ptr)=92 paddded to 8-byte alignment => min frame size of 96 bytes. */ /* Load output registers. */ ld [%i2 ],%o0 ld [%i2+REGSIZE*1 ],%o1 ld [%i2+REGSIZE*2 ],%o2 ld [%i2+REGSIZE*3 ],%o3 ld [%i2+REGSIZE*4 ],%o4 ld [%i2+REGSIZE*5 ],%o5 /* Copy on stack? */ sub %i1, REGSIZE*6, %i1 /* i1 = decrement copy size by 6 regs (=6 regs x 4 bytes = 24 bytes total). */ cmp %i1, 0 ble .do_call nop /* Copy loop: */ add %i2, REGSIZE*6, %i2 /* i2 = address of 7th word of args buffer. */ or %g0, %g0, %l0 /* l0 = offset initialized to 0. */ add %sp, (16+1+6)*REGSIZE, %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */ .next: ld [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */ st %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */ add %l0, REGSIZE, %l0 /* Increment offset. */ sub %i1, REGSIZE, %i1 /* Decrement copy size. */ cmp %i1, 0 bgt .next nop .do_call: call %i0 /* Call target. */ nop jmpl %i7 + 8, %g0 /* Return from proc. */ nop nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_sparc.h000066400000000000000000000022021225523575400234330ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc.h Description: License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_SPARC_H #define DYNCALL_CALL_SPARC_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_SPARC_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_sparc64.S000066400000000000000000000202201225523575400235600ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc64.S Description: Call kernel for sparc64 v9 ABI. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* --------------------------------------------------------------------------- call kernel for sparc64 v9 abi tested on sparc64/linux/debian [gcc54.fsffrance.org - thanx to the farm!] new C Interface: void dcCall_sparc (DCCallVM* callvm, DCpointer target); %i0 %1 see dyncall_call_sparc.S for details. old C Interface: void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); %i0 , %i1 , %i2 Input: i0 target i1 size i2 data */ #define REGSIZE 8 #define BIAS 2047 #define ALIGN 16 #define IREGS 6 #define FREGS 16 #define SREGS 16 #define IBASE 0 #define FBASE (IREGS*8) #define SHEAD ((16+6)*8) #define DHEAD ((IREGS+FREGS)*8)+SREGS*4 CALLVM_singleUseFlags = 28 CALLVM_size = 40 CALLVM_dataoff = 48 .global dcCall_sparc64 dcCall_sparc64: /* Basic Prolog: supports up to 6 arguments. */ /* new C interface */ /* o0-1: callvm,target */ or %o0, %g0, %o3 /* %o3: callvm */ or %o1, %g0, %o0 /* %o0: target */ ldx [%o3+CALLVM_size], %o1 /* %o1: size */ add %o3, CALLVM_dataoff, %o2 /* %o2: data */ ld [%o3+CALLVM_singleUseFlags], %o4 /* %o4: flags */ /*leaf functions: may use the first six output registers.*/ /*o0-2:target,size,data*/ /*o3-5:free to use */ /* Arguments: */ /* %o0 = ptr to target. */ /* %o1 = size of data. */ /* %o2 = data pointer. */ /* %o4 = use flags. */ /* Compute a matching stack size (approximate): o3 = align(o1+136,16) */ add %o1, SHEAD+ALIGN-1, %o3 and %o3, -ALIGN, %o3 neg %o3 /* Prolog. */ save %sp, %o3, %sp /* Arguments: */ /* %i0 = ptr to target. */ /* %i1 = size of data. */ /* %i2 = data pointer. */ /* %i3 = stack size. */ /* Load output registers. */ ldx [%i2+IBASE+REGSIZE*0 ],%o0 ldx [%i2+IBASE+REGSIZE*1 ],%o1 ldx [%i2+IBASE+REGSIZE*2 ],%o2 ldx [%i2+IBASE+REGSIZE*3 ],%o3 ldx [%i2+IBASE+REGSIZE*4 ],%o4 ldx [%i2+IBASE+REGSIZE*5 ],%o5 /* Load double-precision float registers. */ ldd [%i2+FBASE+REGSIZE*0 ],%f0 ldd [%i2+FBASE+REGSIZE*1 ],%f2 ldd [%i2+FBASE+REGSIZE*2 ],%f4 ldd [%i2+FBASE+REGSIZE*3 ],%f6 ldd [%i2+FBASE+REGSIZE*4 ],%f8 ldd [%i2+FBASE+REGSIZE*5 ],%f10 ldd [%i2+FBASE+REGSIZE*6 ],%f12 ldd [%i2+FBASE+REGSIZE*7 ],%f14 ldd [%i2+FBASE+REGSIZE*8 ],%f16 ldd [%i2+FBASE+REGSIZE*9 ],%f18 ldd [%i2+FBASE+REGSIZE*10],%f20 ldd [%i2+FBASE+REGSIZE*11],%f22 ldd [%i2+FBASE+REGSIZE*12],%f24 ldd [%i2+FBASE+REGSIZE*13],%f26 ldd [%i2+FBASE+REGSIZE*14],%f28 ldd [%i2+FBASE+REGSIZE*15],%f30 /* load single-precision float registers */ or %g0, 1, %l0 .f0: andcc %i4, %l0, %g0 beq .f1 nop ld [%i2+FBASE+REGSIZE*16+4*0 ], %f1 .f1: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f2 nop ld [%i2+FBASE+REGSIZE*16+4*1 ], %f3 .f2: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f3 nop ld [%i2+FBASE+REGSIZE*16+4*2 ], %f5 .f3: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f4 nop ld [%i2+FBASE+REGSIZE*16+4*3 ], %f7 .f4: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f5 nop ld [%i2+FBASE+REGSIZE*16+4*4 ], %f9 .f5: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f6 nop ld [%i2+FBASE+REGSIZE*16+4*5 ], %f11 .f6: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f7 nop ld [%i2+FBASE+REGSIZE*16+4*6 ], %f13 .f7: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f8 nop ld [%i2+FBASE+REGSIZE*16+4*7 ], %f15 .f8: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f9 nop ld [%i2+FBASE+REGSIZE*16+4*8 ], %f17 .f9: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f10 nop ld [%i2+FBASE+REGSIZE*16+4*9 ], %f19 .f10: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f11 nop ld [%i2+FBASE+REGSIZE*16+4*10], %f21 .f11: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f12 nop ld [%i2+FBASE+REGSIZE*16+4*11], %f23 .f12: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f13 nop ld [%i2+FBASE+REGSIZE*16+4*12], %f25 .f13: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f14 nop ld [%i2+FBASE+REGSIZE*16+4*13], %f27 .f14: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f15 nop ld [%i2+FBASE+REGSIZE*16+4*14], %f29 .f15: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f_end nop ld [%i2+FBASE+REGSIZE*16+4*15], %f31 .f_end: /* Skip Register Data, do we nee to copy on stack at all? */ sub %i1, DHEAD, %i1 /* skip data header. */ cmp %i1, 0 ble .do_call nop /* Copy loop: */ add %i2, DHEAD, %i2 /* i2 = skip data header. */ or %g0, %g0, %l0 /* l0 = offset initialized to 0. */ add %sp, BIAS+SHEAD, %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */ .next: ldx [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */ stx %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */ add %l0, REGSIZE, %l0 /* Increment offset. */ sub %i1, REGSIZE, %i1 /* Decrement copy size. */ cmp %i1, 0 bgt .next nop .do_call: call %i0 /* Call target. */ nop or %o0, %g0, %i0 or %o1, %g0, %i1 or %o2, %g0, %i2 or %o3, %g0, %i3 return %i7 + 8 nop /* or %o0, %g0, %i0 jmpl %i7 + 8, %g0 nop restore ret */ /* Changes from v8: - fundamental data types - (un)signed int: 8,16,32,64 - float: 32,64,128 - float: IEEE 754 compilant 32 32-bit float registers f0,f1,..,f31 32 64-bit float registers f0,f2,..,f62 16 128-bit float registers f0,f4,..,f60 Description: We need to raise up a dynamic stack frame. Therefore we need to compute the stack size. We do this first, in the context of the caller as a leaf function (using o3 as scratch for addition). Then we raise the frame, ending up in o0-o3 is then i0-i3. Stack Layout: BIAS = 2047 BIAS+XX: should be 16 byte aligned. ... 136: argument overflow area 128: 1 extended word for struct/union poiner return value BIAS+ 0: 16 extended words for registers (in/local) save area [register window] Function Argument Passing: - integer %o0..%o5 (caller view). - floating-point %f0 .. %f15 - continuous memory starting at %sp+BIAS+136 (caller view). Register Usage: %fp0..%fp31 : floating-point arguments. %sp or %o6 : stack pointer, always 8 (or 16?)-byte aligned. %fp or %i6 : frame pointer. %i0 and %o0 : integer and pointer return values. %i7 and %o7 : return address. (caller puts return address to %o7, callee uses %i7) %fp0 and %fp1: return value (float). %i0..%i5 : input argument registers %o0..%o5 : output argument registers %g0 : always zero, writes to it have no effect. Register Mappings: r0-7 -> globals r8-15 -> outs r16-r23 -> locals r24-r31 -> ins Integer Register Overview Table: ID Class Name Description ------------------------------------------------------------------------------ 0 globals g0 always zero, writes to it have no effect 1 g1 2 g2 3 g3 4 g4 5 g5 6 g6 7 g7 8 out o0 [int/ptr] arg 0 and return 9 o1 arg 1 10 o2 arg 2 11 o3 arg 3 12 o4 arg 4 13 o5 arg 5 14 o6 stack pointer 15 o7 16 local l0 scratch 17 l1 18 l2 19 l3 20 l4 21 l5 22 l6 23 l7 24 in i0 [int/pt] arg 0 and return 25 i1 26 i2 27 i3 28 i4 29 i5 30 i6 frame pointer 31 i7 */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_sparc64.h000066400000000000000000000022141225523575400236100ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc64.h Description: License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_SPARC64_H #define DYNCALL_CALL_SPARC64_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_sparc64 (DCpointer target, DCsize size, DCpointer data); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_SPARC64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x64-att.S000066400000000000000000000110311225523575400235050ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64-att.S Description: All x64 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64-att.S" BEGIN_ASM /*--------------------------------------------------------------------------- Call Kernel for x64 System V Input: RDI : size of arguments to be passed via stack RSI : pointer to arguments to be passed via the stack RDX : pointer to arguments of integral/pointer type to be passed via registers RCX : pointer to arguments of floating point type to be passed via registers R8 : target function pointer Notes: RSP+8: is always 16-byte aligned (32-byte align if __m256 is used) */ GLOBAL(dcCall_x64_sysv) BEGIN_PROC(dcCall_x64_sysv) PUSH(RBP) /* Pseudo-prolog - preserve RBP. */ PUSH(RBX) /* Preserve RBX and store pointer to function in it. */ MOV(RSP,RBP) /* Store stack pointer in RBP. */ MOV(R8 ,RBX) MOVSD(QWORD(RCX,0) ,XMM0) /* Copy first 8 floats to XMM0-XMM7. */ MOVSD(QWORD(RCX,8) ,XMM1) MOVSD(QWORD(RCX,16),XMM2) MOVSD(QWORD(RCX,24),XMM3) MOVSD(QWORD(RCX,32),XMM4) MOVSD(QWORD(RCX,40),XMM5) MOVSD(QWORD(RCX,48),XMM6) MOVSD(QWORD(RCX,56),XMM7) ADD(LIT(31),RDI) /* Align stack to 32-byte. */ AND(LIT(-32),RDI) ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */ SUB(RDI,RSP) /* Setup stack frame by subtracting the size of arguments. */ MOV(RDI,RCX) /* Store number of bytes to copy to stack in RCX (for rep movsb). */ MOV(RSP,RDI) /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ REP(MOVSB) /* copy bytes (@@@ should be optimized). */ MOV(QWORD(RDX,0),RDI) /* copy first six int/pointer arguments to RDI, RSI, RDX, RCX, R8, R9. */ MOV(QWORD(RDX,8),RSI) MOV(QWORD(RDX,24),RCX) MOV(QWORD(RDX,32),R8) MOV(QWORD(RDX,40),R9) MOV(QWORD(RDX,16),RDX) /* Set RDX last to not overwrite it to soon. */ MOVB(LIT(8),AL) /* Put upper bound of number of used xmm registers in AL. */ CALL_REG(RBX) /* Call function. */ MOV(RBP,RSP) /* Restore stack pointer. */ POP(RBX) /* Restore RBX. */ POP(RBP) /* Pseudo-epilog. */ RET() END_PROC(dcCALl_x64_sysv) /*--------------------------------------------------------------------------- Call Kernel for x64 Win64 Input: RCX : size of arguments to be passed via stack RDX : pointer to arguments to be passed via the stack R8 : pointer to arguments of integral/pointer type to be passed via registers R9 : target function pointer */ GLOBAL(dcCall_x64_win64) BEGIN_PROC(dcCall_x64_win64) PUSH(RBP) /* Pseudo-prolog - preserve RBP. */ PUSH(RSI) /* Preserve RSI and RDI. */ PUSH(RDI) MOV(RSP,RBP) /* Store stack pointer in RBP. */ ADD(LIT(15),RCX) /* Align stack size to 16 bytes. */ AND(LIT(-16),RCX) SUB(RCX,RSP) /* Setup stack frame by subtracting the size of the arguments. */ MOV(RDX, RSI) /* Let RSI point to the arguments. */ MOV(RSP, RDI) /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ MOV(R9, RAX) /* Put function address in RAX. */ REP(MOVSB) /* @@@ should be optimized (e.g. movq) */ MOV(QWORD(R8,0),RCX) /* Copy first four arguments to RCX, RDX, R9, R8 ( and XMM0-XMM3. ) */ MOV(QWORD(R8,8),RDX) MOV(QWORD(R8,24),R9) MOV(QWORD(R8,16),R8) MOVD(RCX, XMM0) MOVD(RDX, XMM1) MOVD(R8, XMM2) MOVD(R9, XMM3) PUSH(R9) /* Push first four arguments onto the stack preserve area. */ PUSH(R8) PUSH(RDX) PUSH(RCX) CALL_REG(RAX) /* Invoke function. */ MOV(RBP, RSP) /* Restore stack pointer (such that we can pop the preserved vALues). */ POP(RDI) /* Restore RSI and RDI. */ POP(RSI) POP(RBP) /* Pseudo-epilog. */ RET() END_PROC(dcCall_x64_win64) END_ASM nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x64.S000066400000000000000000000111231225523575400227210ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64.S Description: All x64 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64.S" BEGIN_ASM /*--------------------------------------------------------------------------- Call Kernel for x64 System V Input: RDI : size of arguments to be passed via stack RSI : pointer to arguments to be passed via the stack RDX : pointer to arguments of integral/pointer type to be passed via registers RCX : pointer to arguments of floating point type to be passed via registers R8 : target function pointer */ GLOBAL(dcCall_x64_sysv) BEGIN_PROC(dcCall_x64_sysv) push RBP /* Pseudo-prolog - preserve RBP. */ push RBX /* Preserve RBX and store pointer to function in it. */ mov RBP, RSP /* Store stack pointer in RBP. */ mov RBX, R8 movsd XMM0, qword ptr[RCX ] /* Copy first 8 floats to XMM0-XMM7 (this makes RCX free to use). */ movsd XMM1, qword ptr[RCX+ 8] movsd XMM2, qword ptr[RCX+16] movsd XMM3, qword ptr[RCX+24] movsd XMM4, qword ptr[RCX+32] movsd XMM5, qword ptr[RCX+40] movsd XMM6, qword ptr[RCX+48] movsd XMM7, qword ptr[RCX+56] sub RSP, RDI /* Setup stack frame by subtracting the size of the arguments. */ mov RAX, RDI /* Align stack. */ add RAX, 8 and RAX, 15 sub RSP, RAX mov RCX, RDI /* Store number of bytes to copy to stack in RCX (for rep movsb). */ mov RDI, RSP /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ rep movsb /* @@@ should be optimized (e.g. movq) */ mov RDI, qword ptr[RDX ] /* Copy first six int/pointer arguments to RDI, RSI, RDX, RCX, R8, R9. */ mov RSI, qword ptr[RDX+ 8] mov RCX, qword ptr[RDX+24] mov R8, qword ptr[RDX+32] mov R9, qword ptr[RDX+40] mov RDX, qword ptr[RDX+16] /* Set RDX last to not overwrite it to soon. */ mov AL, 8 /* Put upper bound of number of used xmm registers in AL. */ call RBX /* Invoke function. */ mov RSP, RBP /* Restore stack pointer (such that we can pop the preserved vALues). */ pop RBX /* Restore RBX. */ pop RBP /* Pseudo-epilog. */ ret END_PROC(dcCALl_x64_sysv) /*--------------------------------------------------------------------------- Call Kernel for x64 Win64 Input: RCX : size of arguments to be passed via stack RDX : pointer to arguments to be passed via the stack R8 : pointer to arguments of integral/pointer type to be passed via registers R9 : target function pointer */ GLOBAL(dcCall_x64_win64) BEGIN_PROC(dcCall_x64_win64) push RBP /* Pseudo-prolog - preserve RBP. */ push RSI /* Preserve RSI and RDI. */ push RDI /* and RSP, -16 /* Align frame to 16 bytes. */ mov RBP, RSP /* Store stack pointer in RBP. */ add RCX, 15 /* Align stack size to 16 bytes. */ and RCX, -16 sub RSP, RCX /* Setup stack frame by subtracting the size of the arguments. */ mov RSI, RDX /* Let RSI point to the arguments. */ mov RDI, RSP /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ mov RAX, R9 /* Put function address in RAX. */ rep movsb /* @@@ should be optimized (e.g. movq) */ mov RCX, qword ptr[R8 ] /* Copy first four arguments to RCX, RDX, R8, R9 and XMM0-XMM3. */ mov RDX, qword ptr[R8+ 8] mov R9, qword ptr[R8+24] /* Set R9 first to not overwrite R8 too soon. */ mov R8, qword ptr[R8+16] movd XMM0, RCX movd XMM1, RDX movd XMM2, R8 movd XMM3, R9 push R9 /* Push first four arguments onto the stack preserve area. */ push R8 push RDX push RCX call RAX /* Invoke function. */ mov RSP, RBP /* Restore stack pointer (such that we can pop the preserved vALues). */ pop RDI /* Restore RSI and RDI. */ pop RSI pop RBP /* Pseudo-epilog. */ ret END_PROC(dcCall_x64_win64) END_ASM nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x64.h000066400000000000000000000027711225523575400227570ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall x64 REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALL_X64_H #define DYNCALL_CALL_X64_H #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif /* ** x64 SystemV calling convention ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_x64_sysv(DCsize stacksize, DCpointer stackdata, DCpointer regdata_i, DCpointer regdata_f, DCpointer target); void dcCall_x64_win64(DCsize stacksize, DCpointer stackdata, DCpointer regdata, DCpointer target); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_X64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x64_generic_masm.asm000066400000000000000000000021771225523575400260210ustar00rootroot00000000000000.CODE dcCall_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP push RBX mov RBP,RSP mov RBX,R8 movsd XMM0,qword ptr [RCX+0] movsd XMM1,qword ptr [RCX+8] movsd XMM2,qword ptr [RCX+16] movsd XMM3,qword ptr [RCX+24] movsd XMM4,qword ptr [RCX+32] movsd XMM5,qword ptr [RCX+40] movsd XMM6,qword ptr [RCX+48] movsd XMM7,qword ptr [RCX+56] add RDI,31 and RDI,-32 add RDI,8 sub RSP,RDI mov RCX,RDI mov RDI,RSP rep movsb mov RDI,qword ptr [RDX+0] mov RSI,qword ptr [RDX+8] mov RCX,qword ptr [RDX+24] mov R8,qword ptr [RDX+32] mov R9,qword ptr [RDX+40] mov RDX,qword ptr [RDX+16] mov AL,8 call RBX mov RSP,RBP pop RBX pop RBP ret dcCALl_x64_sysv ENDP dcCall_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP push RSI push RDI mov RBP,RSP add RCX,15 and RCX,-16 sub RSP,RCX mov RSI,RDX mov RDI,RSP mov RAX,R9 rep movsb mov RCX,qword ptr [R8+0] mov RDX,qword ptr [R8+8] mov R9,qword ptr [R8+24] mov R8,qword ptr [R8+16] movd XMM0,RCX movd XMM1,RDX movd XMM2,R8 movd XMM3,R9 push R9 push R8 push RDX push RCX call RAX mov RSP,RBP pop RDI pop RSI pop RBP ret dcCall_x64_win64 ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x86.S000066400000000000000000000151161225523575400227330ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86.S Description: All - except Plan9 - x86 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x86.S" BEGIN_ASM /* ============================================================================ DynCall Call Kernels for X86 Architecture ---------------------------------------------------------------------------- C Interface: dcCall_x86_XXX(void* target, void* args, size_t size); ddCall_x86_sys_XXX(int_ptr target, void* args, size_t size); Where XXX is one of calling-conventions, cdecl, win32_msthis, win32_std, win32_fastcall. Parameter Stack layout: size := EBP + 16 args := EBP + 12 target := EBP + 8 NOTES: - epilog restore ESP serves callee cleanup - 16 byte alignment (to be compatible with darwin). */ /*--- default / cdecl -------------------------------------------------------- Details: - caller clean-up */ GLOBAL(dcCall_x86_cdecl) BEGIN_PROC(dcCall_x86_cdecl) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved registers. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = arg buffer ptr */ MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ ANDL(LIT(-16),ECX) MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ SUBL(ECX,ESP) /* allocate stack size */ MOVL(ESP,EDI) /* EDI = stack ptr */ /* work around for rep movsd (not supported by SunPro) SHRL(LIT(2),ECX) REP(MOVSD) */ REP(MOVSB) CALL_DWORD(EBP,8) ADDL(DWORD(EBP,16),ESP) POP(EDI) POP(ESI) MOVL(EBP,ESP) POP(EBP) RET() END_PROC(dcCall_x86_cdecl) /* ---- C++ this calls (microsoft) ------------------------------------------ Details: - this pointer is in ECX */ GLOBAL(dcCall_x86_win32_msthis) BEGIN_PROC(dcCall_x86_win32_msthis) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ MOVL(DWORD(ESI,0),EAX) /* EAX = this pointer. */ ADDL(LIT(4),ESI) /* increment args pointer by thisptr. */ SUBL(LIT(4),ECX) /* decrement size by sizeof(thisptr). */ SUBL(ECX,ESP) /* allocate argument-block on stack. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) /* copy arguments. */ MOVL(EAX,ECX) /* ECX = this pointer. */ CALL_DWORD(EBP,8) /* call function. */ POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_msthis) /*---- win32 stdcall --------------------------------------------------------- Details: - callee cleans up stack */ GLOBAL(dcCall_x86_win32_std) BEGIN_PROC(dcCall_x86_win32_std) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save ESI, EDI. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ SUBL(ECX,ESP) /* allocate size bytes on stack. */ MOVL(ESP,EDI) /* EDI = copy destination stack. */ REP(MOVSB) /* copy BYTEs. */ CALL_DWORD(EBP,8) /* call target. */ POP(EDI) /* restore EDI, ESI. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_std) /*---- win32 fastcall (GNU/Microsoft) ---------------------------------------- Details: - callee cleans up stack - first two integer (up to 32bits) are passed in ECX and EDX */ GLOBAL(dcCall_x86_win32_fast) BEGIN_PROC(dcCall_x86_win32_fast) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = copy source args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ MOVL(DWORD(ESI,0),EAX) /* EAX = first argument. */ MOVL(DWORD(ESI,4),EDX) /* EDX = second argument. */ ADDL(LIT(8),ESI) /* skip registers. */ SUBL(LIT(8),ECX) MOVL(ECX,DWORD(EBP,16)) /* save stack alloc size. */ SUBL(ECX,ESP) /* allocate stack. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) /* copy BYTEs. */ MOVL(EAX,ECX) /* ECX = first argument. */ CALL_DWORD(EBP,8) /* call target. */ POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_fast) /*--- syscall int80 linux --------------------------------------------------- Details: - all arguments are passed via registers */ GLOBAL(dcCall_x86_sys_int80h_linux) BEGIN_PROC(dcCall_x86_sys_int80h_linux) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(EBX) /* save preserved. */ PUSH(ESI) PUSH(EDI) MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ MOVL(DWORD(EAX,4),ECX) MOVL(DWORD(EAX,8),EDX) MOVL(DWORD(EAX,12),ESI) MOVL(DWORD(EAX,16),EDI) MOVL(DWORD(EBP,8),EAX) /* EAX = syscall id. */ INT(LIT(HEX(80))) POP(EDI) /* restore preserved. */ POP(ESI) POP(EBX) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_sys_int80h_linux) /*--- syscall int80 bsd ----------------------------------------------------- Details: - all arguments are passed via stack */ GLOBAL(dcCall_x86_sys_int80h_bsd) BEGIN_PROC(dcCall_x86_sys_int80h_bsd) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ SUBL(ECX,ESP) /* allocate stack space. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) MOVL(DWORD(EBP,8),EAX) /* load system call id. */ CALL(_do_int) POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() _do_int: INT(LIT(HEX(80))) RET() END_PROC(dcCall_x86_sys_int80h_bsd) END_ASM nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x86.h000066400000000000000000000040321225523575400227530ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit Intel x86 family interface REVISION 2007/12/10 initial */ #ifndef DYNCALL_CALL_X86_H #define DYNCALL_CALL_X86_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** x86 calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ #if defined(DC__OS_Plan9) /* No support for other cconvs on Plan9 and vice-versa. */ void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size); #else void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_sys_int80h_linux (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_sys_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size); #endif #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_X86_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x86_8a.s000066400000000000000000000111421225523575400233560ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86_8a.s Description: All x86 abi call kernel implementations in Plan9's assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* 64 bit integer return value calls require caller to create space for return value, and pass a pointer to it as 1st argument. This main function handles all cases (32 and 64 bit integers, as well as floats and doubles), however, it has to be called through the 2 corresponding functions at the end of this file. In order to keep things simple, we basically put the pointer to the return value in EDX and call the other assembler code, above. If EDX is not null, then the code below will push it to the stack as first argument. */ call_main: /* Since all registers except SP are scratch, and we have a variable argument size depending on the function to call, we have to find a way to store and restore SP. The idea is to replace the return address with a custom one on the stack, and to put some logic there, jumping back to the real return address. This allows us, to put the SP somewhere next to the fake return address on the stack, so that we can get it back with a fixed offset (relative to the program counter, in our case). The only real issue with this approach would be a non-executable stack. However, Plan9 doesn't support w^x at the time of writing. */ /* On the stack at this point: RETADDR 0(SP) FUNPTR 4(SP) ARGS 8(SP) SIZE 12(SP) */ MOVL SP, BP /* base pointer for convenience */ PUSHL SP /* save stack pointer */ MOVL 8(BP), SI /* SI = pointer on args */ MOVL 12(BP), CX /* CX = size of args */ SUBL $16, SP /* Make some room for our SP-refetch logic */ MOVL SP, BX /* Copy address to new, executable stack space to BX */ /* This part fills our executable stack space with instructions. We need to get the program counter, first, with a little hack. */ MOVL $0x000003e8, 0(SP) /* Copy 'call (cur ip+8)' */ MOVL $0x00000000, 4(SP) /* '00' for call address, rest is garbage */ MOVL $0x5a909090, 8(SP) /* 'nop, nop, nop, pop edx' to get eip+5 in edx */ MOVL $0xc30b628b,12(SP) /* Restore stack ptr and return: 'mov [edx+11] to esp, ret' */ SUBL CX, SP /* allocate 'size' bytes on stack for args */ MOVL SP, DI /* DI = stack args */ SHRL $2, SP /* Align stack. */ SHLL $2, SP /* " " */ /* I didn't figure out how to use MOVSB with the 8a syntax. The following can probably be written in a better way. */ JMP copy_loop_cmp copy_loop: MOVL 0(SI), AX /* Copy args. */ MOVL AX, 0(DI) SUBL $4, CX ADDL $4, SI ADDL $4, DI copy_loop_cmp: CMPL CX, $0 JGT copy_loop /* Check if we need to push a pointer to long long that might be used as container for 64-bit return values. */ CMPL DX, $0 JEQ call_ffi PUSHL DX /* Now we try to fake a call, meaning setting up our fake return address, and then jumping to the FFI call. This should call the function, but the return will jump into our stack space we reserved above. */ call_ffi: PUSHL BX MOVL 4(BP), BX JMP BX /* Note that there is no return here, b/c the return is in the asm code above, that has been generated on the fly. */ /* Main call for 32 bit integer return values and floating point arguments. See call_main for explanation. */ TEXT dcCall_x86_plan9(SB), $0 MOVL $0, DX JMP call_main /* Call for 64 bit integer return values. See call_main for explanation. */ TEXT dcCall_x86_plan9_ll(SB), $0 MOVL 16(SP), DX /* Copy pointer to variable for return value. */ JMP call_main nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x86_generic_masm.asm000066400000000000000000000042631225523575400260230ustar00rootroot00000000000000.386 .MODEL FLAT .CODE _dcCall_x86_cdecl PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] add ECX,15 and ECX,-16 mov dword ptr [EBP+16],ECX sub ESP,ECX mov EDI,ESP rep movsb call dword ptr [EBP+8] add ESP,dword ptr [EBP+16] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_cdecl ENDP _dcCall_x86_win32_msthis PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] mov EAX,dword ptr [ESI+0] add ESI,4 sub ECX,4 sub ESP,ECX mov EDI,ESP rep movsb mov ECX,EAX call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_msthis ENDP _dcCall_x86_win32_std PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] sub ESP,ECX mov EDI,ESP rep movsb call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_std ENDP _dcCall_x86_win32_fast PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] mov EAX,dword ptr [ESI+0] mov EDX,dword ptr [ESI+4] add ESI,8 sub ECX,8 mov dword ptr [EBP+16],ECX sub ESP,ECX mov EDI,ESP rep movsb mov ECX,EAX call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_fast ENDP _dcCall_x86_sys_int80h_linux PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push EBX push ESI push EDI mov EAX,dword ptr [EBP+12] mov EBX,dword ptr [EAX+0] mov ECX,dword ptr [EAX+4] mov EDX,dword ptr [EAX+8] mov ESI,dword ptr [EAX+12] mov EDI,dword ptr [EAX+16] mov EAX,dword ptr [EBP+8] int 80h pop EDI pop ESI pop EBX mov ESP,EBP pop EBP ret _dcCall_x86_sys_int80h_linux ENDP _dcCall_x86_sys_int80h_bsd PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] sub ESP,ECX mov EDI,ESP rep movsb mov EAX,dword ptr [EBP+8] call _do_int pop EDI pop ESI mov ESP,EBP pop EBP ret _do_int: int 80h ret _dcCall_x86_sys_int80h_bsd ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_call_x86_nasm.asm000066400000000000000000000136501225523575400243300ustar00rootroot00000000000000;////////////////////////////////////////////////////////////////////////////// ; ; Copyright (c) 2007,2009 Daniel Adler , ; Tassilo Philipp ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ;////////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////// ; ; dyncall_call_x86_nasm.nasm ; ; X86 Calls for nasm assembler ; ;/////////////////////////////////////////////////////////////////////// BITS 32 section .text ;/////////////////////////////////////////////////////////////////////// ; CSYM macro ;/////////////////////////////////////////////////////////////////////// %ifdef BUILD_OS_windows %macro EXPORT_C 1 global _%1 _%1: %endmacro %else %macro EXPORT_C 1 global %1 %1: %endmacro %endif ; ----------------------------------------------------------------------------- ; Calling Convention x86 standard C ; - all arguments are on the stack ; - caller cleans up stack ; ; C proto ; dcCallC(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_cdecl push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 ; result ebp+20 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size sub esp, ecx ; cdecl call: allocate 'size' bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments call [ebp+8] ; call function add esp, [ebp+16] ; cdecl call: cleanup stack pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 microsoft thiscall ; - thispointer is in ECX, rest is on the stack ; - callee cleans up stack ; ; C proto ; dcCallThisMS(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_msthis push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size mov eax, [esi] ; eax = this pointer add esi, 4 ; increment args pointer by thisptr sub ecx, 4 ; decrement size by sizeof(thisptr) sub esp, ecx ; allocate argument-block on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments mov ecx, eax ; ecx = this pointer call [ebp+8] ; call function (thiscall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 win32 stdcall ; - all arguments are passed by stack ; - callee cleans up stack ; ; C proto ; dcCallStd(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_std push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size sub esp, ecx ; stdcall: allocate 'size'-8 bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments call [ebp+8] ; call function (stdcall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 win32 fastcall ; - first two integer (up to 32bits) are passed in ECX and EDX ; - others are passed on the stack ; - callee cleans up stack ; ; C proto ; dcCallFast(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_fast push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size mov eax, [esi] ; eax = first argument mov edx, [esi+4] ; edx = second argument add esi, 8 ; increment source pointer sub ecx, 8 ; decrement size by 8 sub esp, ecx ; fastcall: allocate 'size'-8 bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments mov ecx, eax ; ecx = first argument call [ebp+8] ; call function (fastcall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; Stack markings for ELF/GNU to specify no executable stack */ %ifidn __OUTPUT_FORMAT__,elf section .note.GNU-stack noalloc noexec nowrite progbits %endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callf.c000066400000000000000000000107511225523575400224140ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callf.c Description: formatted call C interface (extension module) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callf.h" void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args) { const DCsigchar* ptr = signature; DCsigchar ch; dcReset(vm); while ( (ch=*ptr++) != '\0' && ch != DC_SIGCHAR_ENDARG) { switch(ch) { case DC_SIGCHAR_BOOL: dcArgBool (vm, (DCbool) va_arg( args, DCint ) ); break; case DC_SIGCHAR_CHAR: dcArgChar (vm, (DCchar) va_arg( args, DCint ) ); break; case DC_SIGCHAR_UCHAR: dcArgChar (vm, (DCchar) (DCuchar) va_arg( args, DCint ) ); break; case DC_SIGCHAR_SHORT: dcArgShort (vm, (DCshort) va_arg( args, DCint ) ); break; case DC_SIGCHAR_USHORT: dcArgShort (vm, (DCshort) (DCushort) va_arg( args, DCint ) ); break; case DC_SIGCHAR_INT: dcArgInt (vm, (DCint) va_arg( args, DCint ) ); break; case DC_SIGCHAR_UINT: dcArgInt (vm, (DCint) (DCuint) va_arg( args, DCint ) ); break; case DC_SIGCHAR_LONG: dcArgLong (vm, (DClong) va_arg( args, DClong ) ); break; case DC_SIGCHAR_ULONG: dcArgLong (vm, (DCulong) va_arg( args, DClong ) ); break; case DC_SIGCHAR_LONGLONG: dcArgLongLong (vm, (DClonglong) va_arg( args, DClonglong ) ); break; case DC_SIGCHAR_ULONGLONG: dcArgLongLong (vm, (DCulonglong) va_arg( args, DClonglong ) ); break; case DC_SIGCHAR_FLOAT: dcArgFloat (vm, (DCfloat) va_arg( args, DCdouble ) ); break; case DC_SIGCHAR_DOUBLE: dcArgDouble (vm, (DCdouble) va_arg( args, DCdouble ) ); break; case DC_SIGCHAR_POINTER: dcArgPointer (vm, (DCpointer) va_arg( args, DCpointer ) ); break; case DC_SIGCHAR_STRING: dcArgPointer (vm, (DCpointer) va_arg( args, DCpointer ) ); break; } } switch(*ptr) { case DC_SIGCHAR_VOID: dcCallVoid (vm,funcptr); break; case DC_SIGCHAR_BOOL: result->B = dcCallBool (vm,funcptr); break; case DC_SIGCHAR_CHAR: result->c = dcCallChar (vm,funcptr); break; case DC_SIGCHAR_UCHAR: result->C = (DCuchar) dcCallChar (vm,funcptr); break; case DC_SIGCHAR_SHORT: result->s = dcCallShort (vm,funcptr); break; case DC_SIGCHAR_USHORT: result->S = dcCallShort (vm,funcptr); break; case DC_SIGCHAR_INT: result->i = dcCallInt (vm,funcptr); break; case DC_SIGCHAR_UINT: result->I = dcCallInt (vm,funcptr); break; case DC_SIGCHAR_LONG: result->j = dcCallLong (vm,funcptr); break; case DC_SIGCHAR_ULONG: result->J = dcCallLong (vm,funcptr); break; case DC_SIGCHAR_LONGLONG: result->l = dcCallLongLong (vm,funcptr); break; case DC_SIGCHAR_ULONGLONG: result->L = dcCallLongLong (vm,funcptr); break; case DC_SIGCHAR_FLOAT: result->f = dcCallFloat (vm,funcptr); break; case DC_SIGCHAR_DOUBLE: result->d = dcCallDouble (vm,funcptr); break; case DC_SIGCHAR_POINTER: result->p = dcCallPointer (vm,funcptr); break; case DC_SIGCHAR_STRING: result->Z = dcCallPointer (vm,funcptr); break; } } void dcCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...) { va_list va; va_start(va, signature); dcVCallF(vm,result,funcptr,signature,va); va_end(va); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callf.h000066400000000000000000000027331225523575400224220ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callf.h Description: formatted call interface to dyncall License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall formatted calls C API REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLF_H #define DYNCALL_CALLF_H /* dyncall formatted calls */ #include "dyncall.h" #include "dyncall_signature.h" #include "dyncall_value.h" #include void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...); void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args); #endif /* DYNCALL_CALLF_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm.c000066400000000000000000000040501225523575400226040ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm.c Description: auto-select default callvm (includes other C sources). License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_macros.h" #if defined(DC__Arch_Intel_x86) # include "dyncall_callvm_x86.c" #elif defined(DC__Arch_AMD64) # include "dyncall_callvm_x64.c" #elif defined(DC__Arch_PowerPC) # include "dyncall_callvm_ppc32.c" #elif defined(DC__Arch_PPC64) # include "dyncall_callvm_ppc64.c" #elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # if defined(DC__ABI_MIPS_EABI) # include "dyncall_callvm_mips_eabi.c" # elif defined(DC__ABI_MIPS_O32) # include "dyncall_callvm_mips_o32.c" # elif defined(DC__ABI_MIPS_N64) # include "dyncall_callvm_mips_n64.c" # elif defined(DC__ABI_MIPS_N32) # include "dyncall_callvm_mips_n32.c" # else # error Unknown MIPS ABI. # endif /* DC__Arch_MIPS || DC__Arch_MIPS64 */ #elif defined(DC__Arch_ARM_ARM) # include "dyncall_callvm_arm32_arm.c" #elif defined(DC__Arch_ARM_THUMB) # include "dyncall_callvm_arm32_thumb.c" #elif defined(DC__Arch_Sparc) # include "dyncall_callvm_sparc.c" #elif defined(DC__Arch_Sparcv9) # include "dyncall_callvm_sparc64.c" #else # error unsupported platform #endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm.h000066400000000000000000000075121225523575400226170ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm.h Description: Common call vm binary interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_H #define DYNCALL_CALLVM_H #include "dyncall.h" /* --- callvm virtual function table --------------------------------------- */ /* NOTE: if something changes in DCCallVM_, update offset marks in dyncall_call_sparc.S */ typedef struct DCCallVM_vt_ DCCallVM_vt; struct DCCallVM_ { DCCallVM_vt* mVTpointer; DCint mError; }; struct DCCallVM_vt_ { void (*free) (DCCallVM* vm); void (*reset) (DCCallVM* vm); void (*mode) (DCCallVM* vm,DCint mode); void (*argBool) (DCCallVM* vm,DCbool B); void (*argChar) (DCCallVM* vm,DCchar c); void (*argShort) (DCCallVM* vm,DCshort s); void (*argInt) (DCCallVM* vm,DCint i); void (*argLong) (DCCallVM* vm,DClong l); void (*argLongLong) (DCCallVM* vm,DClonglong L); void (*argFloat) (DCCallVM* vm,DCfloat f); void (*argDouble) (DCCallVM* vm,DCdouble d); void (*argPointer) (DCCallVM* vm,DCpointer p); void (*argStruct) (DCCallVM* vm,DCstruct* s, DCpointer p); void (*callVoid) (DCCallVM* vm,DCpointer funcptr); DCbool (*callBool) (DCCallVM* vm,DCpointer funcptr); DCchar (*callChar) (DCCallVM* vm,DCpointer funcptr); DCshort (*callShort) (DCCallVM* vm,DCpointer funcptr); DCint (*callInt) (DCCallVM* vm,DCpointer funcptr); DClong (*callLong) (DCCallVM* vm,DCpointer funcptr); DClonglong (*callLongLong) (DCCallVM* vm,DCpointer funcptr); DCfloat (*callFloat) (DCCallVM* vm,DCpointer funcptr); DCdouble (*callDouble) (DCCallVM* vm,DCpointer funcptr); DCpointer (*callPointer) (DCCallVM* vm,DCpointer funcptr); void (*callStruct) (DCCallVM* vm,DCpointer funcptr,DCstruct* s, DCpointer returnValue); }; typedef DCvoid (DCvoidvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCbool (DCboolvmfunc) (DCCallVM* vn,DCpointer funcptr); typedef DCchar (DCcharvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCshort (DCshortvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCint (DCintvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DClong (DClongvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DClonglong (DClonglongvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCfloat (DCfloatvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCdouble (DCdoublevmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCpointer (DCpointervmfunc) (DCCallVM* vm,DCpointer funcptr); /* Common base functions for CallVM implementations. */ void dc_callvm_base_init(DCCallVM *pInstance, DCCallVM_vt* pVTable); #endif /* DYNCALL_CALLVM_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.c000066400000000000000000000160501225523575400244520ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_arm.c Description: ARM 32-bit "arm" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armcall REVISION 2007/12/11 initial */ #include "dyncall_callvm_arm32_arm.h" #include "dyncall_alloc.h" static void dc_callvm_mode_arm32_arm(DCCallVM* in_self,DCint mode); static DCCallVM* dc_callvm_new_arm32_arm(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)dcAllocMem(sizeof(DCCallVM_arm32_arm)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_arm32_arm(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_arm32_arm(DCCallVM* in_self) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecReset(&self->mVecHead); } static void dc_callvm_argInt_arm32_arm(DCCallVM* in_self, DCint x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } static void dc_callvm_argBool_arm32_arm(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_arm32_arm(in_self, (DCint)x); } static void dc_callvm_argChar_arm32_arm(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argShort_arm32_arm(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argLong_arm32_arm(DCCallVM* in_self, DClong x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argLongLong_arm32_arm(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argLongLong_arm32_arm_eabi(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_arm32_arm(DCCallVM* in_self, DCfloat x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_arm32_arm(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argDouble_arm32_arm_eabi(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_arm32_arm(DCCallVM* in_self, DCpointer x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } /* Call. */ void dc_callvm_call_arm32_arm(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcCall_arm32_arm(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DCCallVM_vt gVT_arm32_arm = { &dc_callvm_free_arm32_arm , &dc_callvm_reset_arm32_arm , &dc_callvm_mode_arm32_arm , &dc_callvm_argBool_arm32_arm , &dc_callvm_argChar_arm32_arm , &dc_callvm_argShort_arm32_arm , &dc_callvm_argInt_arm32_arm , &dc_callvm_argLong_arm32_arm , &dc_callvm_argLongLong_arm32_arm , &dc_callvm_argFloat_arm32_arm , &dc_callvm_argDouble_arm32_arm , &dc_callvm_argPointer_arm32_arm , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_arm , (DCboolvmfunc*) &dc_callvm_call_arm32_arm , (DCcharvmfunc*) &dc_callvm_call_arm32_arm , (DCshortvmfunc*) &dc_callvm_call_arm32_arm , (DCintvmfunc*) &dc_callvm_call_arm32_arm , (DClongvmfunc*) &dc_callvm_call_arm32_arm , (DClonglongvmfunc*) &dc_callvm_call_arm32_arm , (DCfloatvmfunc*) &dc_callvm_call_arm32_arm , (DCdoublevmfunc*) &dc_callvm_call_arm32_arm , (DCpointervmfunc*) &dc_callvm_call_arm32_arm , NULL /* callStruct */ }; DCCallVM_vt gVT_arm32_arm_eabi = { &dc_callvm_free_arm32_arm , &dc_callvm_reset_arm32_arm , &dc_callvm_mode_arm32_arm , &dc_callvm_argBool_arm32_arm , &dc_callvm_argChar_arm32_arm , &dc_callvm_argShort_arm32_arm , &dc_callvm_argInt_arm32_arm , &dc_callvm_argLong_arm32_arm , &dc_callvm_argLongLong_arm32_arm_eabi , &dc_callvm_argFloat_arm32_arm , &dc_callvm_argDouble_arm32_arm_eabi , &dc_callvm_argPointer_arm32_arm , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_arm , (DCboolvmfunc*) &dc_callvm_call_arm32_arm , (DCcharvmfunc*) &dc_callvm_call_arm32_arm , (DCshortvmfunc*) &dc_callvm_call_arm32_arm , (DCintvmfunc*) &dc_callvm_call_arm32_arm , (DClongvmfunc*) &dc_callvm_call_arm32_arm , (DClonglongvmfunc*) &dc_callvm_call_arm32_arm , (DCfloatvmfunc*) &dc_callvm_call_arm32_arm , (DCdoublevmfunc*) &dc_callvm_call_arm32_arm , (DCpointervmfunc*) &dc_callvm_call_arm32_arm , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_arm32_arm(DCsize size) { /* Check OS if we need EABI as default. */ #if defined(DC__ABI_ARM_EABI) return dc_callvm_new_arm32_arm(&gVT_arm32_arm_eabi, size); #else return dc_callvm_new_arm32_arm(&gVT_arm32_arm, size); #endif } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_arm32_arm(size); } static void dc_callvm_mode_arm32_arm(DCCallVM* in_self,DCint mode) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*) in_self; DCCallVM_vt* vt; switch(mode) { /* Check OS if we need EABI as default. */ case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #if defined(DC__ABI_ARM_EABI) case DC_CALL_C_DEFAULT: vt = &gVT_arm32_arm_eabi; break; #else case DC_CALL_C_DEFAULT: vt = &gVT_arm32_arm; break; #endif case DC_CALL_C_ARM_ARM: vt = &gVT_arm32_arm; break; case DC_CALL_C_ARM_ARM_EABI: vt = &gVT_arm32_arm_eabi; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.h000066400000000000000000000027151225523575400244620ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_arm.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armcall REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLVM_ARM32_ARM_H #define DYNCALL_CALLVM_ARM32_ARM_H #include "dyncall_call_arm32_arm.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; DCpointer mpCallFunc; DCVecHead mVecHead; } DCCallVM_arm32_arm; DCCallVM* dcNewCallVM_arm32_arm(DCsize size); #endif /* DYNCALL_CALLVM_ARM32_ARM_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.c000066400000000000000000000174371225523575400250240ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_thumb.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armthumbcall REVISION 2007/12/11 initial */ #include "dyncall_callvm_arm32_thumb.h" #include "dyncall_alloc.h" static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self,DCint mode); static DCCallVM* dc_callvm_new_arm32_thumb(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)dcAllocMem(sizeof(DCCallVM_arm32_thumb)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_arm32_thumb(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_arm32_thumb(DCCallVM* in_self) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecReset(&self->mVecHead); } static void dc_callvm_argInt_arm32_thumb(DCCallVM* in_self, DCint x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } static void dc_callvm_argBool_arm32_thumb(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_arm32_thumb(in_self, (DCint)x); } static void dc_callvm_argChar_arm32_thumb(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argShort_arm32_thumb(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argLong_arm32_thumb(DCCallVM* in_self, DClong x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argLongLong_arm32_thumb(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argLongLong_arm32_thumb_eabi(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_arm32_thumb(DCCallVM* in_self, DCfloat x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_arm32_thumb(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argDouble_arm32_thumb_eabi(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_arm32_thumb(DCCallVM* in_self, DCpointer x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } /* Call. */ void dc_callvm_call_arm32_thumb(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcCall_arm32_thumb(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DClong dc_callvm_call_arm32_thumb_word(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; return dcCall_arm32_thumb_word(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DClonglong dc_callvm_call_arm32_thumb_dword(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; return dcCall_arm32_thumb_dword(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DCCallVM_vt gVT_arm32_thumb = { &dc_callvm_free_arm32_thumb , &dc_callvm_reset_arm32_thumb , &dc_callvm_mode_arm32_thumb , &dc_callvm_argBool_arm32_thumb , &dc_callvm_argChar_arm32_thumb , &dc_callvm_argShort_arm32_thumb , &dc_callvm_argInt_arm32_thumb , &dc_callvm_argLong_arm32_thumb , &dc_callvm_argLongLong_arm32_thumb , &dc_callvm_argFloat_arm32_thumb , &dc_callvm_argDouble_arm32_thumb , &dc_callvm_argPointer_arm32_thumb , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCintvmfunc*) &dc_callvm_call_arm32_thumb_word , (DClongvmfunc*) &dc_callvm_call_arm32_thumb_word , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb_dword , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb_dword , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb_word , NULL /* callStruct */ }; DCCallVM_vt gVT_arm32_thumb_eabi = { &dc_callvm_free_arm32_thumb , &dc_callvm_reset_arm32_thumb , &dc_callvm_mode_arm32_thumb , &dc_callvm_argBool_arm32_thumb , &dc_callvm_argChar_arm32_thumb , &dc_callvm_argShort_arm32_thumb , &dc_callvm_argInt_arm32_thumb , &dc_callvm_argLong_arm32_thumb , &dc_callvm_argLongLong_arm32_thumb_eabi , &dc_callvm_argFloat_arm32_thumb , &dc_callvm_argDouble_arm32_thumb_eabi , &dc_callvm_argPointer_arm32_thumb , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCintvmfunc*) &dc_callvm_call_arm32_thumb_word , (DClongvmfunc*) &dc_callvm_call_arm32_thumb_word , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb_dword , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb_word , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb_dword , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb_word , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_arm32_thumb(DCsize size) { /* Check OS if we need EABI as default. */ #if defined(DC__ABI_ARM_EABI) return dc_callvm_new_arm32_thumb(&gVT_arm32_thumb_eabi, size); #else return dc_callvm_new_arm32_thumb(&gVT_arm32_thumb, size); #endif } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_arm32_thumb(size); } static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self,DCint mode) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*) in_self; DCCallVM_vt* vt; switch(mode) { /* Check OS if we need EABI as default. */ case DC_CALL_C_ELLIPSIS: #if defined(DC__ABI_ARM_EABI) case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb_eabi; break; #else case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb; break; #endif case DC_CALL_C_ARM_THUMB: vt = &gVT_arm32_thumb; break; case DC_CALL_C_ARM_THUMB_EABI: vt = &gVT_arm32_thumb_eabi; break; default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.h000066400000000000000000000027401225523575400250200ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_thumb.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armthumbcall REVISION 2008/08/12 initial */ #ifndef DYNCALL_CALLVM_ARM32_THUMB_H #define DYNCALL_CALLVM_ARM32_THUMB_H #include "dyncall_call_arm32_thumb.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; DCpointer mpCallFunc; DCVecHead mVecHead; } DCCallVM_arm32_thumb; DCCallVM* dcNewCallVM_arm32_thumb(DCsize size); #endif /* DYNCALL_CALLVM_ARM32_THUMB_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_base.c000066400000000000000000000022511225523575400235770ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_base.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm.h" void dc_callvm_base_init(DCCallVM* pInstance, DCCallVM_vt* pVTable) { pInstance->mVTpointer = pVTable; pInstance->mError = DC_ERROR_NONE; } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips.c000066400000000000000000000024341225523575400236400ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(__GNUC__) #if defined(DC__ABI_MIPS_O32) #include "dyncall_callvm_mips_o32.c" #elif defined(DC__ABI_MIPS_N64) #include "dyncall_callvm_mips_n64.c" #elif defined(DC__ABI_MIPS_N32) #include "dyncall_callvm_mips_n32.c" #else #include "dyncall_callvm_mips_eabi.c" #endif #endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips.h000066400000000000000000000022701225523575400236430ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_H #define DYNCALL_CALLVM_MIPS_H /* Suported ABIs: */ #include "dyncall_callvm_mips_o32.h" #include "dyncall_callvm_mips_eabi.h" #include "dyncall_callvm_mips_n64.h" #endif /* DYNCALL_CALLVM_MIPS_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.c000066400000000000000000000126301225523575400246170ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_eabi.c Description: Implementation of Call VM for mips "eabi" abi. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_mips_eabi.h" #include "dyncall_alloc.h" static void dc_callvm_reset_mips_eabi(DCCallVM* in_self) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; self->mSingleRegs = 0; } static DCCallVM* dc_callvm_new_mips_eabi(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)dcAllocMem(sizeof(DCCallVM_mips_eabi)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_eabi( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_eabi(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_mode_mips_eabi(DCCallVM* in_self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_MIPS32_EABI: break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } } /* arg int -- fillup integer register file OR push on stack */ static void dc_callvm_argInt_mips_eabi(DCCallVM* in_self, DCint i) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; else dcVecAppend(&self->mVecHead, &i, sizeof(DCint)); } static void dc_callvm_argPointer_mips_eabi(DCCallVM* in_self, DCpointer x) { dc_callvm_argInt_mips_eabi(in_self, * (DCint*) &x ); } static void dc_callvm_argBool_mips_eabi(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argChar_mips_eabi(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argShort_mips_eabi(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argLong_mips_eabi(DCCallVM* in_self, DClong x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argLongLong_mips_eabi(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; if (self->mIntRegs < 7) { DCint* p = (DCint*) &Lv; /* skip odd register (align 64 bit) */ self->mIntRegs += self->mIntRegs & 1; self->mRegData.mIntData[self->mIntRegs++] = p[0]; self->mRegData.mIntData[self->mIntRegs++] = p[1]; } else { self->mIntRegs = 8; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } } static void dc_callvm_argFloat_mips_eabi(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; if (self->mSingleRegs < 8) { self->mRegData.mSingleData[self->mSingleRegs++] = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); } } static void dc_callvm_argDouble_mips_eabi(DCCallVM* in_self, DCdouble x) { DClonglong* p = (DClonglong*) &x; dc_callvm_argLongLong_mips_eabi(in_self, *p); } /* Call. */ void dc_callvm_call_mips_eabi(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; dcCall_mips_eabi(target, &self->mRegData, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } DCCallVM_vt gVT_mips_eabi = { &dc_callvm_free_mips_eabi , &dc_callvm_reset_mips_eabi , &dc_callvm_mode_mips_eabi , &dc_callvm_argBool_mips_eabi , &dc_callvm_argChar_mips_eabi , &dc_callvm_argShort_mips_eabi , &dc_callvm_argInt_mips_eabi , &dc_callvm_argLong_mips_eabi , &dc_callvm_argLongLong_mips_eabi , &dc_callvm_argFloat_mips_eabi , &dc_callvm_argDouble_mips_eabi , &dc_callvm_argPointer_mips_eabi , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_eabi , (DCboolvmfunc*) &dc_callvm_call_mips_eabi , (DCcharvmfunc*) &dc_callvm_call_mips_eabi , (DCshortvmfunc*) &dc_callvm_call_mips_eabi , (DCintvmfunc*) &dc_callvm_call_mips_eabi , (DClongvmfunc*) &dc_callvm_call_mips_eabi , (DClonglongvmfunc*) &dc_callvm_call_mips_eabi , (DCfloatvmfunc*) &dc_callvm_call_mips_eabi , (DCdoublevmfunc*) &dc_callvm_call_mips_eabi , (DCpointervmfunc*) &dc_callvm_call_mips_eabi , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_mips_eabi(DCsize size) { return dc_callvm_new_mips_eabi(&gVT_mips_eabi, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_eabi(size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.h000066400000000000000000000027731225523575400246330ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_eabi.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit MIPS family of processors SUPPORTED CALLING CONVENTIONS eabi REVISION 2008/01/03 initial */ #ifndef DYNCALL_CALLVM_MIPS_EABI_H #define DYNCALL_CALLVM_MIPS_EABI_H #include "dyncall_call_mips_eabi.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; int mIntRegs; int mSingleRegs; struct DCRegData_mips_eabi mRegData; DCVecHead mVecHead; } DCCallVM_mips_eabi; DCCallVM* dcNewCallVM_mips_eabi(DCsize size); #endif /* DYNCALL_CALLVM_MIPS_EABI_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n32.c000066400000000000000000000172051225523575400243240ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n32.c Description: mips "n32" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 64bit MIPS family of processors SUPPORTED CALLING CONVENTIONS n32 REVISION 2010/05/30 initial in contrast to o32, there is no space reserved for parameters passed over registers. more registers are used and registers are always used. stack is always 16-byte aligned at entry (call to call-kernel automatically aligns argument stack. integer and float register-file is interleaved either taking one slot up skipping the other. */ #include "dyncall_callvm_mips_n32.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_n32(DCCallVM* in_self) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; dcVecReset(&self->mVecHead); self->mRegCount = 0; self->mRegData.mUseDouble = 0LL; } static DCCallVM* dc_callvm_new_mips_n32(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)dcAllocMem(sizeof(DCCallVM_mips_n32)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_n32( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_n32(DCCallVM* in_self) { dcFreeMem(in_self); } /* pass arguments : - promote to 64-bit integer. - fill up integers and float - left-to-right otherwise go over stack. */ /* arg int -- fillup 64-bit integer register file OR push on stack */ static void dc_callvm_argLongLong_mips_n32(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; /* fillup integer register file */ if (self->mRegCount < 8) self->mRegData.mIntData[self->mRegCount++] = Lv; else dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } static void dc_callvm_argInt_mips_n32(DCCallVM* in_self, DCint i) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong) i ); } static void dc_callvm_argPointer_mips_n32(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_mips_n32(in_self, * (DClonglong*) &x ); } static void dc_callvm_argBool_mips_n32(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argChar_mips_n32(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argShort_mips_n32(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argLong_mips_n32(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argDouble_mips_n32(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; if (self->mRegCount < 8) { self->mRegData.mUseDouble |= 1<<( self->mRegCount ); self->mRegData.mFloatData[self->mRegCount++].d = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } } static void dc_callvm_argFloat_mips_n32(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; if (self->mRegCount < 8) { /*self->mRegData.mFloatData[self->mRegCount++].d = (DCdouble) x;*/ self->mRegData.mFloatData[self->mRegCount++].f = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); dcVecSkip(&self->mVecHead, sizeof(DCfloat) ); } } /* Ellipsis calls: - float is promoted to double (due to ANSI C). - double is passed via integer register-file (due to MIPS ABI). */ static void dc_callvm_argDouble_mips_n32_ellipsis(DCCallVM* in_self, DCdouble x) { dc_callvm_argLongLong_mips_n32(in_self, * ( (DClonglong*) &x ) ); } static void dc_callvm_argFloat_mips_n32_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_mips_n32_ellipsis(in_self, (DCdouble) x ); } /* Call. */ void dc_callvm_call_mips_n32(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_n32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } /* Forward Declaration. */ static void dc_callvm_mode_mips_n32(DCCallVM* in_self,DCint mode); DCCallVM_vt gVT_mips_n32 = { &dc_callvm_free_mips_n32 , &dc_callvm_reset_mips_n32 , &dc_callvm_mode_mips_n32 , &dc_callvm_argBool_mips_n32 , &dc_callvm_argChar_mips_n32 , &dc_callvm_argShort_mips_n32 , &dc_callvm_argInt_mips_n32 , &dc_callvm_argLong_mips_n32 , &dc_callvm_argLongLong_mips_n32 , &dc_callvm_argFloat_mips_n32 , &dc_callvm_argDouble_mips_n32 , &dc_callvm_argPointer_mips_n32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n32 , (DCboolvmfunc*) &dc_callvm_call_mips_n32 , (DCcharvmfunc*) &dc_callvm_call_mips_n32 , (DCshortvmfunc*) &dc_callvm_call_mips_n32 , (DCintvmfunc*) &dc_callvm_call_mips_n32 , (DClongvmfunc*) &dc_callvm_call_mips_n32 , (DClonglongvmfunc*) &dc_callvm_call_mips_n32 , (DCfloatvmfunc*) &dc_callvm_call_mips_n32 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 , NULL /* callStruct */ }; DCCallVM_vt gVT_mips_n32_ellipsis = { &dc_callvm_free_mips_n32 , &dc_callvm_reset_mips_n32 , &dc_callvm_mode_mips_n32 , &dc_callvm_argBool_mips_n32 , &dc_callvm_argChar_mips_n32 , &dc_callvm_argShort_mips_n32 , &dc_callvm_argInt_mips_n32 , &dc_callvm_argLong_mips_n32 , &dc_callvm_argLongLong_mips_n32 , &dc_callvm_argFloat_mips_n32_ellipsis , &dc_callvm_argDouble_mips_n32_ellipsis , &dc_callvm_argPointer_mips_n32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n32 , (DCboolvmfunc*) &dc_callvm_call_mips_n32 , (DCcharvmfunc*) &dc_callvm_call_mips_n32 , (DCshortvmfunc*) &dc_callvm_call_mips_n32 , (DCintvmfunc*) &dc_callvm_call_mips_n32 , (DClongvmfunc*) &dc_callvm_call_mips_n32 , (DClonglongvmfunc*) &dc_callvm_call_mips_n32 , (DCfloatvmfunc*) &dc_callvm_call_mips_n32 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 , NULL /* callStruct */ }; static void dc_callvm_mode_mips_n32(DCCallVM* self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: self->mVTpointer = &gVT_mips_n32; break; case DC_CALL_C_ELLIPSIS: self->mVTpointer = &gVT_mips_n32_ellipsis; break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } DCCallVM* dcNewCallVM_mips_n32(DCsize size) { return dc_callvm_new_mips_n32(&gVT_mips_n32, size); } DCCallVM* dcNewCallVM_mips_n32_ellipsis(DCsize size) { return dc_callvm_new_mips_n32(&gVT_mips_n32_ellipsis, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_n32(size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.c000066400000000000000000000172051225523575400243310ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n64.c Description: mips "n64" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 64bit MIPS family of processors SUPPORTED CALLING CONVENTIONS n64 REVISION 2010/05/30 initial in contrast to o32, there is no space reserved for parameters passed over registers. more registers are used and registers are always used. stack is always 16-byte aligned at entry (call to call-kernel automatically aligns argument stack. integer and float register-file is interleaved either taking one slot up skipping the other. */ #include "dyncall_callvm_mips_n64.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_n64(DCCallVM* in_self) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; dcVecReset(&self->mVecHead); self->mRegCount = 0; self->mRegData.mUseDouble = 0LL; } static DCCallVM* dc_callvm_new_mips_n64(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)dcAllocMem(sizeof(DCCallVM_mips_n64)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_n64( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_n64(DCCallVM* in_self) { dcFreeMem(in_self); } /* pass arguments : - promote to 64-bit integer. - fill up integers and float - left-to-right otherwise go over stack. */ /* arg int -- fillup 64-bit integer register file OR push on stack */ static void dc_callvm_argLongLong_mips_n64(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; /* fillup integer register file */ if (self->mRegCount < 8) self->mRegData.mIntData[self->mRegCount++] = Lv; else dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } static void dc_callvm_argInt_mips_n64(DCCallVM* in_self, DCint i) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong) i ); } static void dc_callvm_argPointer_mips_n64(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_mips_n64(in_self, * (DClonglong*) &x ); } static void dc_callvm_argBool_mips_n64(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argChar_mips_n64(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argShort_mips_n64(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argLong_mips_n64(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argDouble_mips_n64(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; if (self->mRegCount < 8) { self->mRegData.mUseDouble |= 1<<( self->mRegCount ); self->mRegData.mFloatData[self->mRegCount++].d = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } } static void dc_callvm_argFloat_mips_n64(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; if (self->mRegCount < 8) { /*self->mRegData.mFloatData[self->mRegCount++].d = (DCdouble) x;*/ self->mRegData.mFloatData[self->mRegCount++].f = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); dcVecSkip(&self->mVecHead, sizeof(DCfloat) ); } } /* Ellipsis calls: - float is promoted to double (due to ANSI C). - double is passed via integer register-file (due to MIPS ABI). */ static void dc_callvm_argDouble_mips_n64_ellipsis(DCCallVM* in_self, DCdouble x) { dc_callvm_argLongLong_mips_n64(in_self, * ( (DClonglong*) &x ) ); } static void dc_callvm_argFloat_mips_n64_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_mips_n64_ellipsis(in_self, (DCdouble) x ); } /* Call. */ void dc_callvm_call_mips_n64(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_n64(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } /* Forward Declaration. */ static void dc_callvm_mode_mips_n64(DCCallVM* in_self,DCint mode); DCCallVM_vt gVT_mips_n64 = { &dc_callvm_free_mips_n64 , &dc_callvm_reset_mips_n64 , &dc_callvm_mode_mips_n64 , &dc_callvm_argBool_mips_n64 , &dc_callvm_argChar_mips_n64 , &dc_callvm_argShort_mips_n64 , &dc_callvm_argInt_mips_n64 , &dc_callvm_argLong_mips_n64 , &dc_callvm_argLongLong_mips_n64 , &dc_callvm_argFloat_mips_n64 , &dc_callvm_argDouble_mips_n64 , &dc_callvm_argPointer_mips_n64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n64 , (DCboolvmfunc*) &dc_callvm_call_mips_n64 , (DCcharvmfunc*) &dc_callvm_call_mips_n64 , (DCshortvmfunc*) &dc_callvm_call_mips_n64 , (DCintvmfunc*) &dc_callvm_call_mips_n64 , (DClongvmfunc*) &dc_callvm_call_mips_n64 , (DClonglongvmfunc*) &dc_callvm_call_mips_n64 , (DCfloatvmfunc*) &dc_callvm_call_mips_n64 , (DCdoublevmfunc*) &dc_callvm_call_mips_n64 , (DCpointervmfunc*) &dc_callvm_call_mips_n64 , NULL /* callStruct */ }; DCCallVM_vt gVT_mips_n64_ellipsis = { &dc_callvm_free_mips_n64 , &dc_callvm_reset_mips_n64 , &dc_callvm_mode_mips_n64 , &dc_callvm_argBool_mips_n64 , &dc_callvm_argChar_mips_n64 , &dc_callvm_argShort_mips_n64 , &dc_callvm_argInt_mips_n64 , &dc_callvm_argLong_mips_n64 , &dc_callvm_argLongLong_mips_n64 , &dc_callvm_argFloat_mips_n64_ellipsis , &dc_callvm_argDouble_mips_n64_ellipsis , &dc_callvm_argPointer_mips_n64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n64 , (DCboolvmfunc*) &dc_callvm_call_mips_n64 , (DCcharvmfunc*) &dc_callvm_call_mips_n64 , (DCshortvmfunc*) &dc_callvm_call_mips_n64 , (DCintvmfunc*) &dc_callvm_call_mips_n64 , (DClongvmfunc*) &dc_callvm_call_mips_n64 , (DClonglongvmfunc*) &dc_callvm_call_mips_n64 , (DCfloatvmfunc*) &dc_callvm_call_mips_n64 , (DCdoublevmfunc*) &dc_callvm_call_mips_n64 , (DCpointervmfunc*) &dc_callvm_call_mips_n64 , NULL /* callStruct */ }; static void dc_callvm_mode_mips_n64(DCCallVM* self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: self->mVTpointer = &gVT_mips_n64; break; case DC_CALL_C_ELLIPSIS: self->mVTpointer = &gVT_mips_n64_ellipsis; break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } DCCallVM* dcNewCallVM_mips_n64(DCsize size) { return dc_callvm_new_mips_n64(&gVT_mips_n64, size); } DCCallVM* dcNewCallVM_mips_n64_ellipsis(DCsize size) { return dc_callvm_new_mips_n64(&gVT_mips_n64_ellipsis, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_n64(size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.h000066400000000000000000000026761225523575400243440ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n64.h Description: mips "n64" ABI callvm C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_N64_H #define DYNCALL_CALLVM_MIPS_N64_H #include "dyncall_call_mips_n64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" #ifdef __cplusplus extern "C" { #endif typedef struct { DCCallVM mInterface; int mRegCount; struct DCRegData_mips_n64 mRegData; DCVecHead mVecHead; } DCCallVM_mips_n64; DCCallVM* dcNewCallVM_mips_n64(DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALLVM_MIPS_N64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.c000066400000000000000000000146741225523575400243340ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_o32.c Description: mips "o32" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for mips o32 abi REVISION 2010/06/03 initial NOTES: we need an argument counter for supporting floating point arguments correctly. first two (if any) double/float arguments are mapped via a common structure -- code must take care to write the right float argument indices which differs on C and Assembly-side depending on endianness. (therefore both sources have two variants 'mipseb' and 'mipsel'.) (only for the first two float/double arguments) see float/double handling although, the abi does not expect usage of floats if first argument is not floating point, the call kernel can be used universal for all cases. */ #include "dyncall_callvm_mips_o32.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_o32(DCCallVM* in_self) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecReset(&self->mVecHead); self->mArgCount = 0; } static DCCallVM* dc_callvm_new_mips_o32(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_o32( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_o32(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_mode_mips_o32(DCCallVM* self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_MIPS32_O32: break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* arg int -- fillup integer register file OR push on stack */ static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecAppend(&self->mVecHead, &i, sizeof(DCint)); self->mArgCount++; } static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x) { dc_callvm_argInt_mips_o32(in_self, * (DCint*) &x ); } static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argChar_mips_o32(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argShort_mips_o32(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argLong_mips_o32(DCCallVM* in_self, DClong x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); self->mArgCount += 1; } static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); if (self->mArgCount < 2) { /* call kernel mips: lwc1 $f12, 4($5) <--- byte offset 4 lwc1 $f13, 0($5) lwc1 $f14, 12($5) <--- byte offset 12 lwc1 $f15, 8($5) mipsel: lwc1 $f12, 0($5) <--- byte offset 4 lwc1 $f13, 4($5) lwc1 $f14, 8($5) <--- byte offset 12 lwc1 $f15, 12($5) */ #if defined(__MIPSEL__) /* index 0 and 2 */ self->mRegData.floats[self->mArgCount*2] = x; #else /* index 1 and 3 */ self->mRegData.floats[self->mArgCount*2+1] = x; #endif } self->mArgCount++; } static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); if (self->mArgCount < 2) self->mRegData.doubles[self->mArgCount] = x; self->mArgCount++; } /* Call. */ void dc_callvm_call_mips_o32(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } DCCallVM_vt gVT_mips_o32 = { &dc_callvm_free_mips_o32 , &dc_callvm_reset_mips_o32 , &dc_callvm_mode_mips_o32 , &dc_callvm_argBool_mips_o32 , &dc_callvm_argChar_mips_o32 , &dc_callvm_argShort_mips_o32 , &dc_callvm_argInt_mips_o32 , &dc_callvm_argLong_mips_o32 , &dc_callvm_argLongLong_mips_o32 , &dc_callvm_argFloat_mips_o32 , &dc_callvm_argDouble_mips_o32 , &dc_callvm_argPointer_mips_o32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_o32 , (DCboolvmfunc*) &dc_callvm_call_mips_o32 , (DCcharvmfunc*) &dc_callvm_call_mips_o32 , (DCshortvmfunc*) &dc_callvm_call_mips_o32 , (DCintvmfunc*) &dc_callvm_call_mips_o32 , (DClongvmfunc*) &dc_callvm_call_mips_o32 , (DClonglongvmfunc*) &dc_callvm_call_mips_o32 , (DCfloatvmfunc*) &dc_callvm_call_mips_o32 , (DCdoublevmfunc*) &dc_callvm_call_mips_o32 , (DCpointervmfunc*) &dc_callvm_call_mips_o32 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_mips_o32(DCsize size) { return dc_callvm_new_mips_o32(&gVT_mips_o32, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_o32(size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.h000066400000000000000000000026231225523575400243300ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_o32.h Description: mips "o32" ABI callvm C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_O32_H #define DYNCALL_CALLVM_MIPS_O32_H #include "dyncall_call_mips_o32.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; int mArgCount; DCRegData_mips_o32 mRegData; DCVecHead mVecHead; } DCCallVM_mips_o32; DCCallVM* dcNewCallVM_mips_o32(DCsize size); #endif /* DYNCALL_CALLVM_MIPS_O32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.c000066400000000000000000000243671225523575400236300ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc32.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for ppc32 architectures SUPPORTED CALLING CONVENTIONS ppc32/osx ppc32/linux (sysv abi) REVISION 2007/12/11 initial support for Darwin ABI 2009/01/09 added System V ABI support */ #include "dyncall_callvm_ppc32.h" #include "dyncall_call_ppc32.h" #include "dyncall_alloc.h" #include "dyncall_macros.h" #include "dyncall_types.h" #include "dyncall_utils.h" /* Support for Mac OS X (Darwin) and Systen V ABI for Power PC 32-bit */ #if defined(DC__OS_Darwin) #define DC__ABI_Darwin #elif defined(DC__OS_Linux) || defined(DC__OS_FreeBSD) || defined(DC__OS_OpenBSD) || defined(DC__OS_NetBSD) || defined(DC__OS_DragonFlyBSD) || defined(DC__OS_SunOS) #define DC__ABI_SysV #else #error Unsupported OS for ppc32 architecture. #endif static void dc_callvm_free_ppc32(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_ppc32(DCCallVM* in_self) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; self->mFloatRegs = 0; } /* OS X/Darwin: fillup integer register file AND push on stack (for ellipsis) */ static void dc_callvm_argInt_ppc32_darwin(DCCallVM* in_self, DCint i) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; /* AND push onto stack */ dcVecAppend(&self->mVecHead,&i,sizeof(DCint)); } static void dc_callvm_argInt_ppc32_sysv(DCCallVM* in_self, DCint i) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; /* OR push onto stack */ else dcVecAppend(&self->mVecHead,&i,sizeof(DCint)); } /** floating-point **/ /* double*/ static void dc_callvm_argDouble_ppc32_darwin(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = d; /* skip two integer register file entries */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0]; if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1]; } /* push on stack */ dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble)); } #if 0 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 8) { self->mRegData.mFloatData[self->mFloatRegs++] = d; /* skip two integer register file entries */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0]; if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1]; } /* push on stack */ dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble)); } #endif static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 8) self->mRegData.mFloatData[self->mFloatRegs++] = d; else /* OR push data on stack */ { /* align stack to 8 byte boundary */ dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL ); /* AND push data */ dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble)); } } /* Floating-point */ /* darwin: * - skip one integer register file entry (write in - for ellipsis calls) * sysv: * - */ static void dc_callvm_argFloat_ppc32_darwin(DCCallVM* in_self, DCfloat f) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f); } /* AND skip one integer register file entry (write in - for ellipsis calls) */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = *( (DCint*) &f ); /* AND push on stack */ dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat)); } static void dc_callvm_argFloat_ppc32_sysv(DCCallVM* in_self, DCfloat f) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* Put as float register (casted to double) */ if (self->mFloatRegs < 8) self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f); else /* OR put float on stack */ dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat)); } /* long long integer */ static void dc_callvm_argLongLong_ppc32_darwin(DCCallVM* in_self, DClonglong L) { DCint* p = (DCint*) &L; dcArgInt(in_self, p[0]); dcArgInt(in_self, p[1]); } static void dc_callvm_argLongLong_ppc32_sysv(DCCallVM* in_self, DClonglong L) { DCint* p = (DCint*) &L; DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 7) { /* next free integer register is even (r0, r2, r3) ? */ /* if not, skip one integer */ if (self->mIntRegs & 1) self->mIntRegs++; self->mRegData.mIntData[self->mIntRegs++] = p[0]; self->mRegData.mIntData[self->mIntRegs++] = p[1]; } /* OR push onto stack */ else { /* in case, mIntRegs == 7, set it to 8 */ self->mIntRegs = 8; /* align stack to 8 byte boundary */ dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7 ) & (-8UL) ); /* push data */ dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong)); } } static void dc_callvm_argBool_ppc32(DCCallVM* in_self, DCbool x) { /* promote to integer */ dcArgInt(in_self, (x == 0) ? DC_FALSE : DC_TRUE ); } static void dc_callvm_argChar_ppc32(DCCallVM* in_self, DCchar ch) { /* promote to integer */ dcArgInt(in_self, (DCint) ch ); } static void dc_callvm_argShort_ppc32(DCCallVM* in_self, DCshort s) { /* promote to integer */ dcArgInt(in_self, (DCint) s ); } static void dc_callvm_argLong_ppc32(DCCallVM* in_self, DClong l) { /* promote to integer */ dcArgInt(in_self, (DCint) l ); } static void dc_callvm_argPointer_ppc32(DCCallVM* in_self, DCpointer p) { /* promote to integer */ dcArgInt(in_self, *(DCint*) &p ); } void dc_callvm_call_ppc32_darwin(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; dcCall_ppc32_darwin( target, &self->mRegData, DC_MAX(dcVecSize(&self->mVecHead), 8*4), dcVecData(&self->mVecHead) ); } void dc_callvm_call_ppc32_sysv(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self; dcCall_ppc32_sysv( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead)); } void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_ppc32_darwin = { &dc_callvm_free_ppc32 , &dc_callvm_reset_ppc32 , &dc_callvm_mode_ppc32 , &dc_callvm_argBool_ppc32 , &dc_callvm_argChar_ppc32 , &dc_callvm_argShort_ppc32 , &dc_callvm_argInt_ppc32_darwin , &dc_callvm_argLong_ppc32 , &dc_callvm_argLongLong_ppc32_darwin , &dc_callvm_argFloat_ppc32_darwin , &dc_callvm_argDouble_ppc32_darwin , &dc_callvm_argPointer_ppc32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc32_darwin , (DCboolvmfunc*) &dc_callvm_call_ppc32_darwin , (DCcharvmfunc*) &dc_callvm_call_ppc32_darwin , (DCshortvmfunc*) &dc_callvm_call_ppc32_darwin , (DCintvmfunc*) &dc_callvm_call_ppc32_darwin , (DClongvmfunc*) &dc_callvm_call_ppc32_darwin , (DClonglongvmfunc*) &dc_callvm_call_ppc32_darwin , (DCfloatvmfunc*) &dc_callvm_call_ppc32_darwin , (DCdoublevmfunc*) &dc_callvm_call_ppc32_darwin , (DCpointervmfunc*) &dc_callvm_call_ppc32_darwin , NULL /* callStruct */ }; DCCallVM_vt gVT_ppc32_sysv = { &dc_callvm_free_ppc32 , &dc_callvm_reset_ppc32 , &dc_callvm_mode_ppc32 , &dc_callvm_argBool_ppc32 , &dc_callvm_argChar_ppc32 , &dc_callvm_argShort_ppc32 , &dc_callvm_argInt_ppc32_sysv , &dc_callvm_argLong_ppc32 , &dc_callvm_argLongLong_ppc32_sysv , &dc_callvm_argFloat_ppc32_sysv , &dc_callvm_argDouble_ppc32_sysv , &dc_callvm_argPointer_ppc32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc32_sysv , (DCboolvmfunc*) &dc_callvm_call_ppc32_sysv , (DCcharvmfunc*) &dc_callvm_call_ppc32_sysv , (DCshortvmfunc*) &dc_callvm_call_ppc32_sysv , (DCintvmfunc*) &dc_callvm_call_ppc32_sysv , (DClongvmfunc*) &dc_callvm_call_ppc32_sysv , (DClonglongvmfunc*) &dc_callvm_call_ppc32_sysv , (DCfloatvmfunc*) &dc_callvm_call_ppc32_sysv , (DCdoublevmfunc*) &dc_callvm_call_ppc32_sysv , (DCpointervmfunc*) &dc_callvm_call_ppc32_sysv , NULL /* callStruct */ }; void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode) { DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_PPC32_OSX: #if defined(DC__ABI_Darwin) case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #endif vt = &gVT_ppc32_darwin; break; case DC_CALL_C_PPC32_SYSV: #if defined(DC__ABI_SysV) case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #endif vt = &gVT_ppc32_sysv; break; default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } dc_callvm_base_init(&self->mInterface, vt); } DCCallVM* dcNewCallVM(DCsize size) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)dcAllocMem(sizeof(DCCallVM_ppc32)+size); dcVecInit(&self->mVecHead, size); self->mIntRegs = 0; self->mFloatRegs = 0; dc_callvm_mode_ppc32( (DCCallVM*) self, DC_CALL_C_DEFAULT ); return (DCCallVM*)self; } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.h000066400000000000000000000030431225523575400236210ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc32.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_PPC32_H #define DYNCALL_CALLVM_PPC32_H /* dyncall callvm for 32bit ppc architectures SUPPORTED CALLING CONVENTIONS standard and ... (ellipsis) calls REVISION 2007/12/11 initial */ #include "dyncall_call_ppc32.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_ppc32_ DCCallVM_ppc32; struct DCCallVM_ppc32_ { DCCallVM mInterface; int mIntRegs; int mFloatRegs; struct DCRegData_ppc32_ mRegData; DCVecHead mVecHead; }; DCCallVM* dcNewCallVM_ppc32(DCsize size); #endif /* DYNCALL_CALLVM_PPC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_sparc.c000066400000000000000000000115571225523575400240060ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc.c Description: Call VM for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_sparc.h" #include "dyncall_call_sparc.h" #include "dyncall_utils.h" #include "dyncall_alloc.h" #define DEFAULT_STACK_ALIGN 16 /* Construtor. */ /* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */ static DCCallVM* dc_callvm_new_sparc(DCCallVM_vt* vt, DCsize size) { DCCallVM_sparc* self = (DCCallVM_sparc*) dcAllocMem(sizeof(DCCallVM_sparc)+DC_MAX(size,sizeof(void*)*(6+1))); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead,size); return (DCCallVM*)self; } /* Destructor. */ static void dc_callvm_free_sparc(DCCallVM* in_self) { dcFreeMem(in_self); } /* Reset argument buffer. */ static void dc_callvm_reset_sparc(DCCallVM* in_self) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecReset(&self->mVecHead); } /* Load integer 32-bit. */ static void dc_callvm_argInt_sparc(DCCallVM* in_self, DCint x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } /* we propagate Bool,Char,Short to Int. */ static void dc_callvm_argBool_sparc(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } static void dc_callvm_argChar_sparc(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } static void dc_callvm_argShort_sparc(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } /* handle others Pointer, Long, LongLong, Float and Double as-is. */ static void dc_callvm_argPointer_sparc(DCCallVM* in_self, DCpointer x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } static void dc_callvm_argLong_sparc(DCCallVM* in_self, DClong x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClong)); } static void dc_callvm_argLongLong_sparc(DCCallVM* in_self, DClonglong x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_sparc(DCCallVM* in_self, DCfloat x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_sparc(DCCallVM* in_self, DCdouble x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } /* mode: only a single mode available currently. */ static void dc_callvm_mode_sparc(DCCallVM* in_self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_SPARC32: break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* we call directly with 'RTYPE dcCall(DCCallVM* in_self, DCpointer target)' */ #if 0 /* call: delegate to default call kernel */ static void dc_callvm_call_sparc(DCCallVM* in_self, DCpointer target) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcCall_sparc(target, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } #endif /* CallVM virtual table. */ DCCallVM_vt gVT_sparc = { &dc_callvm_free_sparc, &dc_callvm_reset_sparc, &dc_callvm_mode_sparc, &dc_callvm_argBool_sparc, &dc_callvm_argChar_sparc, &dc_callvm_argShort_sparc, &dc_callvm_argInt_sparc, &dc_callvm_argLong_sparc, &dc_callvm_argLongLong_sparc, &dc_callvm_argFloat_sparc, &dc_callvm_argDouble_sparc, &dc_callvm_argPointer_sparc, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc, (DCboolvmfunc*) &dcCall_sparc, (DCcharvmfunc*) &dcCall_sparc, (DCshortvmfunc*) &dcCall_sparc, (DCintvmfunc*) &dcCall_sparc, (DClongvmfunc*) &dcCall_sparc, (DClonglongvmfunc*) &dcCall_sparc, (DCfloatvmfunc*) &dcCall_sparc, (DCdoublevmfunc*) &dcCall_sparc, (DCpointervmfunc*) &dcCall_sparc, NULL /* callStruct */ }; /* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_sparc(&gVT_sparc,size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_sparc.h000066400000000000000000000025761225523575400240140ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc.h Description: Call VM for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_SPARC_H #define DYNCALL_CALLVM_SPARC_H #include "dyncall_callvm.h" #include "dyncall_vector.h" /* NOTE: if something changes here, update offset marks in dyncall_call_sparc.S */ typedef struct DCCallVM_sparc_ DCCallVM_sparc; struct DCCallVM_sparc_ { DCCallVM mInterface; /* 8 bytes (vtable,errorid) */ DCVecHead mVecHead; /* 8 bytes (max,size) */ }; DCCallVM* dcNewCallVM_sparc(DCsize size); #endif /* DYNCALL_CALLVM_SPARC_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.c000066400000000000000000000175401225523575400241560ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc64.c Description: Call VM for sparc64 64-bit processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_sparc64.h" #include "dyncall_call_sparc64.h" #include "dyncall_utils.h" #include "dyncall_alloc.h" #define IREGS 6 #define FREGS 16 #define SREGS 16 #define DHEAD (IREGS+FREGS)*8+SREGS*4 /* Reset argument buffer. */ static void dc_callvm_reset_sparc64(DCCallVM* in_self) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcVecResize(&self->mVecHead,DHEAD); self->mIntRegs = 0; self->mFloatRegs = 0; self->mSingleRegs = 0; self->mUseSingleFlags = 0; } /* Construtor. */ /* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */ static DCCallVM* dc_callvm_new_sparc64(DCCallVM_vt* vt, DCsize size) { DCCallVM_sparc64* self = (DCCallVM_sparc64*) dcAllocMem(sizeof(DCCallVM_sparc64)+DHEAD+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead,DHEAD+size); dc_callvm_reset_sparc64(&self->mInterface); return (DCCallVM*)self; } /* Destructor. */ static void dc_callvm_free_sparc64(DCCallVM* in_self) { dcFreeMem(in_self); } /* all integers are promoted to 64-bit. */ static void dc_callvm_argLongLong_sparc64(DCCallVM* in_self, DClonglong x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; if (self->mIntRegs < IREGS) { * ( (DClonglong*) ( dcVecAt(&self->mVecHead, (self->mIntRegs++)*8) ) ) = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } if (self->mFloatRegs < FREGS) self->mFloatRegs++; if (self->mSingleRegs < SREGS) self->mSingleRegs++; } static void dc_callvm_argLong_sparc64 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argInt_sparc64 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argBool_sparc64 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argChar_sparc64 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argShort_sparc64 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argPointer_sparc64(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argDouble_sparc64(DCCallVM* in_self, DCdouble x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; if (self->mFloatRegs < FREGS) { * ((double*)dcVecAt(&self->mVecHead,(IREGS+(self->mFloatRegs++))*8)) = x; if (self->mSingleRegs < SREGS) self->mSingleRegs++; } if (self->mIntRegs < IREGS) { self->mIntRegs++; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } } static void dc_callvm_argDouble_sparc64_ellipsis(DCCallVM* in_self, DCdouble x) { union { long long l; double d; } u; u.d = x; dc_callvm_argLongLong_sparc64(in_self, u.l); } static void dc_callvm_argFloat_sparc64_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_sparc64_ellipsis(in_self, (DCdouble) x); } static void dc_callvm_argFloat_sparc64(DCCallVM* in_self, DCfloat x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; double y = (DCdouble) x; if (self->mSingleRegs < SREGS) { self->mUseSingleFlags |= 1<mSingleRegs; * ((float*)dcVecAt(&self->mVecHead,(IREGS+FREGS)*8 + (self->mSingleRegs++)*4)) = x; if (self->mFloatRegs < FREGS) self->mFloatRegs++; } if (self->mIntRegs < IREGS) { self->mIntRegs++; } else { union { DCdouble d; DClonglong l; DCfloat f[2]; } u; u.f[1] = x; dcVecAppend(&self->mVecHead, &u.l, sizeof(DClonglong)); } } #if 0 /* call: delegate to default call kernel */ static void dc_callvm_call_sparc64(DCCallVM* in_self, DCpointer target) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcCall_sparc64(target, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } #endif static void dc_callvm_mode_sparc64(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_sparc64_ellipsis = { &dc_callvm_free_sparc64, &dc_callvm_reset_sparc64, &dc_callvm_mode_sparc64, &dc_callvm_argBool_sparc64, &dc_callvm_argChar_sparc64, &dc_callvm_argShort_sparc64, &dc_callvm_argInt_sparc64, &dc_callvm_argLong_sparc64, &dc_callvm_argLongLong_sparc64, &dc_callvm_argFloat_sparc64_ellipsis, &dc_callvm_argDouble_sparc64_ellipsis, &dc_callvm_argPointer_sparc64, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc64, (DCboolvmfunc*) &dcCall_sparc64, (DCcharvmfunc*) &dcCall_sparc64, (DCshortvmfunc*) &dcCall_sparc64, (DCintvmfunc*) &dcCall_sparc64, (DClongvmfunc*) &dcCall_sparc64, (DClonglongvmfunc*) &dcCall_sparc64, (DCfloatvmfunc*) &dcCall_sparc64, (DCdoublevmfunc*) &dcCall_sparc64, (DCpointervmfunc*) &dcCall_sparc64, NULL /* callStruct */ }; /* CallVM virtual table. */ DCCallVM_vt gVT_sparc64 = { &dc_callvm_free_sparc64, &dc_callvm_reset_sparc64, &dc_callvm_mode_sparc64, &dc_callvm_argBool_sparc64, &dc_callvm_argChar_sparc64, &dc_callvm_argShort_sparc64, &dc_callvm_argInt_sparc64, &dc_callvm_argLong_sparc64, &dc_callvm_argLongLong_sparc64, &dc_callvm_argFloat_sparc64, &dc_callvm_argDouble_sparc64, &dc_callvm_argPointer_sparc64, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc64, (DCboolvmfunc*) &dcCall_sparc64, (DCcharvmfunc*) &dcCall_sparc64, (DCshortvmfunc*) &dcCall_sparc64, (DCintvmfunc*) &dcCall_sparc64, (DClongvmfunc*) &dcCall_sparc64, (DClonglongvmfunc*) &dcCall_sparc64, (DCfloatvmfunc*) &dcCall_sparc64, (DCdoublevmfunc*) &dcCall_sparc64, (DCpointervmfunc*) &dcCall_sparc64, NULL /* callStruct */ }; /* mode: only a single mode available currently. */ static void dc_callvm_mode_sparc64(DCCallVM* in_self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_SPARC64: in_self->mVTpointer = &gVT_sparc64; break; case DC_CALL_C_ELLIPSIS_VARARGS: in_self->mVTpointer = &gVT_sparc64_ellipsis; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_sparc64(&gVT_sparc64,size); } #if 0 /* Load integer 32-bit. */ static void dc_callvm_argInt_sparc64(DCCallVM* in_self, DCint x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } /* we propagate Bool,Char,Short,Int to LongLong. */ static void dc_callvm_argBool_sparc64(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } static void dc_callvm_argChar_sparc64(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } static void dc_callvm_argShort_sparc64(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } #endif nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.h000066400000000000000000000027151225523575400241610ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc64.h Description: Call VM for sparc64 processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_SPARC_H #define DYNCALL_CALLVM_SPARC_H #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_sparc64_ DCCallVM_sparc64; struct DCCallVM_sparc64_ { DCCallVM mInterface; /* 12:8 -> 16 */ int mIntRegs; /* 16 */ int mFloatRegs; /* 20 */ int mSingleRegs; /* 24 */ unsigned int mUseSingleFlags; /* 32 */ DCVecHead mVecHead; /* 36:16, 32 */ /* 40 */ }; DCCallVM* dcNewCallVM_sparc64(DCsize size); #endif /* DYNCALL_CALLVM_SPARC64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_x64.c000066400000000000000000000135021225523575400233070ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x64.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* MS Windows x64 calling convention, AMD64 SystemV ABI. */ #include "dyncall_callvm_x64.h" #include "dyncall_alloc.h" #include "dyncall_struct.h" static DCCallVM* dc_callvm_new_x64(DCCallVM_vt* vt, DCsize size) { DCCallVM_x64* self = (DCCallVM_x64*)dcAllocMem(sizeof(DCCallVM_x64)+size); dc_callvm_base_init(&self->mInterface, vt); /* Since we store register parameters in DCCallVM_x64 directly, adjust the stack size. */ size -= sizeof(DCRegData_x64); size = size < 0 ? 0 : size; self->mRegCount.i = self->mRegCount.f = 0; dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_x64(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_x64(DCCallVM* in_self) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; dcVecReset(&self->mVecHead); self->mRegCount.i = self->mRegCount.f = 0; } static void dc_callvm_mode_x64(DCCallVM* self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } static void dc_callvm_argLongLong_x64(DCCallVM* in_self, DClonglong x) { /* A long long always has 64 bits on the supported x64 platforms (lp64 on unix and llp64 on windows). */ DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.i < numIntRegs) self->mRegData.i[self->mRegCount.i++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argBool_x64(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_x64(in_self, (DClonglong)x); } static void dc_callvm_argChar_x64(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argShort_x64(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argInt_x64(DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argLong_x64(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argFloat_x64(DCCallVM* in_self, DCfloat x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; /* Although not promoted to doubles, floats are stored with 64bits in this API.*/ union { DCdouble d; DCfloat f; } f; f.f = x; if(self->mRegCount.f < numFloatRegs) *(DCfloat*)&self->mRegData.f[self->mRegCount.f++] = x; else dcVecAppend(&self->mVecHead, &f.f, sizeof(DCdouble)); } static void dc_callvm_argDouble_x64(DCCallVM* in_self, DCdouble x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.f < numFloatRegs) self->mRegData.f[self->mRegCount.f++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_x64(DCCallVM* in_self, DCpointer x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.i < numIntRegs) *(DCpointer*)&self->mRegData.i[self->mRegCount.i++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } static void dc_callvm_argStruct_x64(DCCallVM* in_self, DCstruct* s, DCpointer x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; dcVecAppend(&self->mVecHead, x, s->size); /*printf("dc_callvm_argStruct_x64 size = %d\n", (int)s->size);@@@*/ if (s->size <= 64) dcArgStructUnroll(in_self, s, x); /*else@@@*/ /* dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer));@@@*/ } /* Call. */ void dc_callvm_call_x64(DCCallVM* in_self, DCpointer target) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; #if defined(DC_UNIX) dcCall_x64_sysv( #else dcCall_x64_win64( #endif dcVecSize(&self->mVecHead), /* Size of stack data. */ dcVecData(&self->mVecHead), /* Pointer to stack arguments. */ self->mRegData.i, /* Pointer to register arguments (ints on SysV). */ #if defined(DC_UNIX) self->mRegData.f, /* Pointer to floating point register arguments. */ #endif target ); } DCCallVM_vt gVT_x64 = { &dc_callvm_free_x64 , &dc_callvm_reset_x64 , &dc_callvm_mode_x64 , &dc_callvm_argBool_x64 , &dc_callvm_argChar_x64 , &dc_callvm_argShort_x64 , &dc_callvm_argInt_x64 , &dc_callvm_argLong_x64 , &dc_callvm_argLongLong_x64 , &dc_callvm_argFloat_x64 , &dc_callvm_argDouble_x64 , &dc_callvm_argPointer_x64 , &dc_callvm_argStruct_x64 , (DCvoidvmfunc*) &dc_callvm_call_x64 , (DCboolvmfunc*) &dc_callvm_call_x64 , (DCcharvmfunc*) &dc_callvm_call_x64 , (DCshortvmfunc*) &dc_callvm_call_x64 , (DCintvmfunc*) &dc_callvm_call_x64 , (DClongvmfunc*) &dc_callvm_call_x64 , (DClonglongvmfunc*) &dc_callvm_call_x64 , (DCfloatvmfunc*) &dc_callvm_call_x64 , (DCdoublevmfunc*) &dc_callvm_call_x64 , (DCpointervmfunc*) &dc_callvm_call_x64 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x64(DCsize size) { return dc_callvm_new_x64(&gVT_x64, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_x64(size); } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_x64.h000066400000000000000000000050371225523575400233200ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x64.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for x64 architecture SUPPORTED CALLING CONVENTIONS MS Windows x64 calling convention, AMD64 SystemV ABI REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLVM_X64_H #define DYNCALL_CALLVM_X64_H #include "dyncall_macros.h" #include "dyncall_call_x64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" #if defined(DC_WINDOWS) typedef long long int64; /* llp64 */ #define numIntRegs 4 #define numFloatRegs 4 #define DCRegCount_x64 DCRegCount_x64_u #define DCRegData_x64 DCRegData_x64_u #elif defined(DC_UNIX) typedef long int64; /* lp64 */ #define numIntRegs 6 #define numFloatRegs 8 #define DCRegCount_x64 DCRegCount_x64_s #define DCRegData_x64 DCRegData_x64_s #else #error Unsupported OS. #endif typedef union { int i; int f; } DCRegCount_x64_u; typedef struct { int i; int f; } DCRegCount_x64_s; typedef union { int64 i[numIntRegs ]; double f[numFloatRegs]; } DCRegData_x64_u; typedef struct { int64 i[numIntRegs ]; double f[numFloatRegs]; } DCRegData_x64_s; typedef struct { DCCallVM mInterface; /* This CallVM interface. */ DCpointer mpCallFunc; /* Function to call. */ DCRegCount_x64 mRegCount; /* Number of int/sse registers used for parameter passing. */ DCRegData_x64 mRegData; /* Parameters to be passed via registers. */ DCVecHead mVecHead; /* Parameters to be pushed onto stack. */ } DCCallVM_x64; DCCallVM* dcNewCallVM_x64(DCsize size); #endif /* DYNCALL_CALLVM_X64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_x86.c000066400000000000000000000462541225523575400233250ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x86.c Description: Call VM for x86 architecture implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_x86.h" #include "dyncall_alloc.h" void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode); /* call vm allocator */ static DCCallVM* dc_callvm_new_x86(DCCallVM_vt* vt, DCsize size) { DCCallVM_x86* self = (DCCallVM_x86*) dcAllocMem( sizeof(DCCallVM_x86)+size ); dc_callvm_base_init(&self->mInterface, vt); self->mIntRegs = 0; dcVecInit(&self->mVecHead, size); return (DCCallVM*) self; } /* call vm destructor */ static void dc_callvm_free_x86(DCCallVM* in_self) { dcFreeMem(in_self); } /* reset */ static void dc_callvm_reset_x86(DCCallVM* in_self) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; } /* arg (bool,char,short,long auto-promoted) to int */ static void dc_callvm_argInt_x86(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promoted to int */ static void dc_callvm_argBool_x86(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg char - promoted to int */ static void dc_callvm_argChar_x86(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg short - promoted to int */ static void dc_callvm_argShort_x86(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg long - promoted to int */ static void dc_callvm_argLong_x86(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg long long */ static void dc_callvm_argLongLong_x86(DCCallVM* in_self, DClonglong x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong) ); } /* arg float */ static void dc_callvm_argFloat_x86(DCCallVM* in_self, DCfloat x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); } /* arg double */ static void dc_callvm_argDouble_x86(DCCallVM* in_self, DCdouble x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } /* arg pointer */ static void dc_callvm_argPointer_x86(DCCallVM* in_self, DCpointer x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer) ); } /* Plan9 specific calling convention. */ #if defined(DC__OS_Plan9) /* call 'plan9' */ void dc_callvm_call_x86_plan9(DCCallVM* in_self, DCpointer target) { /* Calls with 32-bit return values have it returned via EAX, so we don't */ /* need to do anything special here. */ DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_plan9(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DClonglong dc_callvm_call_x86_plan9_ll(DCCallVM* in_self, DCpointer target) { /* Call for 64 bit integer return values is a bit different, call a */ /* different assembler stub that stores the return value in a variable */ /* for us, and return the latter. */ DClonglong ret; DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_plan9_ll(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead), &ret ); return ret; } DCCallVM_vt gVT_x86_plan9 = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_plan9 , (DCboolvmfunc*) &dc_callvm_call_x86_plan9 , (DCcharvmfunc*) &dc_callvm_call_x86_plan9 , (DCshortvmfunc*) &dc_callvm_call_x86_plan9 , (DCintvmfunc*) &dc_callvm_call_x86_plan9 , (DClongvmfunc*) &dc_callvm_call_x86_plan9 , (DClonglongvmfunc*) &dc_callvm_call_x86_plan9_ll , (DCfloatvmfunc*) &dc_callvm_call_x86_plan9 , (DCdoublevmfunc*) &dc_callvm_call_x86_plan9 , (DCpointervmfunc*) &dc_callvm_call_x86_plan9 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_plan9(DCsize size) { return dc_callvm_new_x86( &gVT_x86_plan9, size ); } #else /* call 'cdecl' */ void dc_callvm_call_x86_cdecl(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_cdecl( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } DCCallVM_vt gVT_x86_cdecl = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_cdecl , (DCboolvmfunc*) &dc_callvm_call_x86_cdecl , (DCcharvmfunc*) &dc_callvm_call_x86_cdecl , (DCshortvmfunc*) &dc_callvm_call_x86_cdecl , (DCintvmfunc*) &dc_callvm_call_x86_cdecl , (DClongvmfunc*) &dc_callvm_call_x86_cdecl , (DClonglongvmfunc*) &dc_callvm_call_x86_cdecl , (DCfloatvmfunc*) &dc_callvm_call_x86_cdecl , (DCdoublevmfunc*) &dc_callvm_call_x86_cdecl , (DCpointervmfunc*) &dc_callvm_call_x86_cdecl , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_cdecl(DCsize size) { return dc_callvm_new_x86( &gVT_x86_cdecl, size ); } /* --- stdcall -------------------------------------------------------------- */ /* call win32/std */ void dc_callvm_call_x86_win32_std(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_std( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* win32/std vtable */ DCCallVM_vt gVT_x86_win32_std = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_std , (DCboolvmfunc*) &dc_callvm_call_x86_win32_std , (DCcharvmfunc*) &dc_callvm_call_x86_win32_std , (DCshortvmfunc*) &dc_callvm_call_x86_win32_std , (DCintvmfunc*) &dc_callvm_call_x86_win32_std , (DClongvmfunc*) &dc_callvm_call_x86_win32_std , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_std , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_std , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_std , (DCpointervmfunc*) &dc_callvm_call_x86_win32_std , NULL /* callStruct */ }; /* win32/std callvm allocator */ DCCallVM* dcNewCallVM_x86_win32_std(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_std, size ); } /* --- fastcall common (ms/gnu) -------------------------------------------- */ /* call win32 ms fast */ static void dc_callvm_call_x86_win32_fast(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_fast( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* reset - always resize to 8 bytes (stores ECX and EDX) */ static void dc_callvm_reset_x86_win32_fast(DCCallVM* in_self) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecResize(&self->mVecHead, sizeof(DCint) * 2 ); self->mIntRegs = 0; } /* --- fastcall ms --------------------------------------------------------- */ /* arg int - probably hold in ECX and EDX */ static void dc_callvm_argInt_x86_win32_fast_ms(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; if (self->mIntRegs < 2) { *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x; ++( self->mIntRegs ); } else dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promote to int */ static void dc_callvm_argBool_x86_win32_fast_ms(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg char - promote to int */ static void dc_callvm_argChar_x86_win32_fast_ms(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg short - promote to int */ static void dc_callvm_argShort_x86_win32_fast_ms(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg long - promote to int */ static void dc_callvm_argLong_x86_win32_fast_ms(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg pointer - promote to int */ static void dc_callvm_argPointer_x86_win32_fast_ms(DCCallVM* in_self, DCpointer x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* win32/fast vt */ DCCallVM_vt gVT_x86_win32_fast_ms = { &dc_callvm_free_x86 , &dc_callvm_reset_x86_win32_fast , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86_win32_fast_ms , &dc_callvm_argChar_x86_win32_fast_ms , &dc_callvm_argShort_x86_win32_fast_ms , &dc_callvm_argInt_x86_win32_fast_ms , &dc_callvm_argLong_x86_win32_fast_ms , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86_win32_fast_ms , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_win32_fast_ms(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_fast_ms, size ); } /* --- gnu fastcall -------------------------------------------------------- */ /* arg int - probably hold in ECX and EDX */ static void dc_callvm_argInt_x86_win32_fast_gnu(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; if (self->mIntRegs < 2) { *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x; ++( self->mIntRegs ); } else dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promote to int */ static void dc_callvm_argBool_x86_win32_fast_gnu(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg char - promote to int */ static void dc_callvm_argChar_x86_win32_fast_gnu(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg short - promote to int */ static void dc_callvm_argShort_x86_win32_fast_gnu(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg long - promote to int */ static void dc_callvm_argLong_x86_win32_fast_gnu(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg pointer - promote to int */ static void dc_callvm_argPointer_x86_win32_fast_gnu(DCCallVM* in_self, DCpointer x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg long long - skip registers and push on stack */ static void dc_callvm_argLongLong_x86_win32_fast_gnu(DCCallVM* in_self, DClonglong x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; self->mIntRegs = 2; dc_callvm_argLongLong_x86(in_self,x); } /* win32/fast/gnu vt */ DCCallVM_vt gVT_x86_win32_fast_gnu = { &dc_callvm_free_x86 , &dc_callvm_reset_x86_win32_fast , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86_win32_fast_gnu , &dc_callvm_argChar_x86_win32_fast_gnu , &dc_callvm_argShort_x86_win32_fast_gnu , &dc_callvm_argInt_x86_win32_fast_gnu , &dc_callvm_argLong_x86_win32_fast_gnu , &dc_callvm_argLongLong_x86_win32_fast_gnu , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86_win32_fast_gnu , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_win32_fast_gnu(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_fast_gnu, size ); } /* --- this ms ------------------------------------------------------------- */ /* call win32/this/ms */ void dc_callvm_call_x86_win32_this_ms(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_msthis( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* win32/this/ms vt */ DCCallVM_vt gVT_x86_win32_this_ms = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCboolvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCcharvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCshortvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCintvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DClongvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCpointervmfunc*) &dc_callvm_call_x86_win32_this_ms , NULL /* callStruct */ }; /* --- syscall ------------------------------------------------------------- */ /* call syscall */ void dc_callvm_call_x86_sys_int80h_linux(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_sys_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } void dc_callvm_call_x86_sys_int80h_bsd(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_sys_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } DCCallVM_vt gVT_x86_sys_int80h_linux = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_linux , NULL /* callStruct */ }; DCCallVM_vt gVT_x86_sys_int80h_bsd = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , NULL /* callStruct */ }; /* win32/this/ms callvm allocator */ DCCallVM* dcNewCallVM_x86_win32_this_ms(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_this_ms, size ); } #endif /* mode */ void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: case DC_CALL_C_DEFAULT: #if defined(DC__OS_Plan9) /* Plan9 has its own calling convention (and no support for foreign ones). */ case DC_CALL_C_X86_PLAN9: vt = &gVT_x86_plan9; break; #else case DC_CALL_C_X86_CDECL: vt = &gVT_x86_cdecl; break; case DC_CALL_C_X86_WIN32_STD: vt = &gVT_x86_win32_std; break; case DC_CALL_C_X86_WIN32_FAST_MS: vt = &gVT_x86_win32_fast_ms; break; case DC_CALL_C_X86_WIN32_THIS_MS: vt = &gVT_x86_win32_this_ms; break; case DC_CALL_C_X86_WIN32_FAST_GNU: vt = &gVT_x86_win32_fast_gnu; break; case DC_CALL_C_X86_WIN32_THIS_GNU: vt = &gVT_x86_cdecl; break; case DC_CALL_SYS_DEFAULT: # if defined DC_UNIX # if defined DC__OS_Linux vt = &gVT_x86_sys_int80h_linux; break; # else vt = &gVT_x86_sys_int80h_bsd; break; # endif # else self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; # endif case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break; case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_sys_int80h_bsd; break; #endif default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } /* new */ DCCallVM* dcNewCallVM(DCsize size) { #if defined(DC__OS_Plan9) return dcNewCallVM_x86_plan9(size); #else return dcNewCallVM_x86_cdecl(size); #endif } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_callvm_x86.h000066400000000000000000000040011225523575400233120ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x86.h Description: Call virtual machine for x86 architecture header License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_X86_H #define DYNCALL_CALLVM_X86_H /* dyncall callvm for 32bit X86 architectures Copyright 2007 Daniel Adler. SUPPORTED CALLING CONVENTIONS cdecl,stdcall,fastcall,thiscall,msthiscall REVISION 2007/12/10 initial */ #include "dyncall_call_x86.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_x86_ DCCallVM_x86; struct DCCallVM_x86_ { DCCallVM mInterface; DCpointer mpCallFunc; int mIntRegs; /* used by fastcall implementation */ DCVecHead mVecHead; }; /* Plan9 has no support for OS foreign calling conventions at the time, and vice-versa. */ #if defined(DC__OS_Plan9) DCCallVM* dcNewCallVM_x86_plan9(DCsize size); #else DCCallVM* dcNewCallVM_x86_cdecl(DCsize size); DCCallVM* dcNewCallVM_x86_win32_std(DCsize size); DCCallVM* dcNewCallVM_x86_win32_fast_ms(DCsize size); DCCallVM* dcNewCallVM_x86_win32_fast_gnu(DCsize size); DCCallVM* dcNewCallVM_x86_win32_this_ms(DCsize size); #endif #endif /* DYNCALL_CALLVM_X86_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_config.h000066400000000000000000000024171225523575400226050ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_config.h Description: Macro configuration file for non-standard C types License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall type configuration REVISION 2007/12/11 initial */ #ifndef DYNCALL_CONFIG_H #define DYNCALL_CONFIG_H #include "dyncall_macros.h" #define DC_BOOL int #define DC_LONG_LONG long long #define DC_POINTER void* #endif /* DYNCALL_CONFIG_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_macros.h000066400000000000000000000147411225523575400226270ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_macros.h Description: Platform detection macros License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall macros Platform detection, specific defines and configuration. The purpose of this file is to provide coherent platform and compiler specific defines. So instead of defines like WIN32, _OpenBSD_ or __GNUC__, one should use DC__OS_Win32, DC__OS_OpenBSD or DC__C_GNU, respectively. REVISION 2007/12/11 initial */ #ifndef DYNCALL_MACROS_H #define DYNCALL_MACROS_H /* Platform specific defines. */ /* MS Windows XP x64/Vista64 or later. */ #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) #define DC__OS_Win64 /* MS Windows NT/95/98/ME/2000/XP/Vista32. */ #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__WINDOWS__) || defined(_WINDOWS) #define DC__OS_Win32 /* All the OS' based on Darwin OS (MacOS X, OpenDarwin). Note that '__APPLE__' may be defined for classic MacOS, too. */ /* __MACOSX__ is not defined in gcc assembler mode (switch: -S) */ /* @@@ TODO: Check for Classic OS */ #elif defined(__APPLE__) || defined(__Darwin__) # define DC__OS_Darwin # if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) # define DC__OS_IPhone # else /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */ # define DC__OS_MacOSX # endif /* The most popular open source Unix-like OS - Linux. */ #elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__) #define DC__OS_Linux /* The most powerful open source Unix-like OS - FreeBSD. */ #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #define DC__OS_FreeBSD /* The most secure open source Unix-like OS - OpenBSD. */ #elif defined(__OpenBSD__) #define DC__OS_OpenBSD /* The most portable open source Unix-like OS - NetBSD. */ #elif defined(__NetBSD__) #define DC__OS_NetBSD /* The FreeBSD fork having heavy clusterization in mind - DragonFlyBSD. */ #elif defined(__DragonFly__) #define DC__OS_DragonFlyBSD /* Sun's Unix-like OS - SunOS / Solaris. */ #elif defined(__sun__) || defined(__sun) || defined(sun) #define DC__OS_SunOS /* The "Linux-like environment for Windows" - Cygwin. */ #elif defined(__CYGWIN__) #define DC__OS_Cygwin /* The "Minimalist GNU for Windows" - MinGW. */ #elif defined(__MINGW__)/*@@@*/ #define DC__OS_MinGW /* The Nintendo DS (homebrew) using devkitpro. */ #elif defined(__nds__) #define DC__OS_NDS /* The PlayStation Portable (homebrew) SDK. */ #elif defined(__psp__) || defined(PSP) #define DC__OS_PSP /* Haiku (BeOS alike). */ #elif defined(__HAIKU__) #define DC__OS_BeOS /* The Unix successor - Plan9 from Bell Labs */ #elif defined(Plan9) || defined(__Plan9__) #define DC__OS_Plan9 /* Digital's Unix-like OS - VMS */ #elif defined(__vms) #define DC__OS_VMS #elif defined(__minix) #define DC__OS_Minix #else #error Unsupported OS. #endif /* Compiler specific defines. Do not change the order, because */ /* some of the compilers define flags for compatible ones, too. */ /* Intel's C/C++ compiler. */ #if defined(__INTEL_COMPILER) #define DC__C_Intel /* MS C/C++ compiler. */ #elif defined(_MSC_VER) #define DC__C_MSVC /* The GNU Compiler Collection - GCC. */ #elif defined(__GNUC__) #define DC__C_GNU /* Watcom compiler. */ #elif defined(__WATCOMC__) #define DC__C_WATCOM /* Portable C Compiler. */ #elif defined(__PCC__) #define DC__C_PCC /* Sun Pro C. */ #elif defined(__SUNPRO_C) #define DC__C_SUNPRO /* Undetected C Compiler. */ #else #define DC__C_UNKNOWN #endif /* Architecture. */ /* Check architecture. */ #if defined(_M_IX86) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__386__) || defined(__i386) # define DC__Arch_Intel_x86 #elif defined(_M_X64_) || defined(_M_AMD64) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) # define DC__Arch_AMD64 #elif defined(_M_IA64) || defined(__ia64__) # define DC__Arch_Itanium #elif defined(_M_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__ppc__) || defined(__power__) # define DC__Arch_PowerPC #elif defined(__ppc64__) || defined(_ARCH_PPC64) || defined(__power64__) # define DC__Arch_PPC64 #elif defined(__mips64__) # define DC__Arch_MIPS64 #elif defined(_M_MRX000) || defined(__mips__) || defined(__mips) || defined(_mips) # define DC__Arch_MIPS #elif defined(__arm__) && !defined(__thumb__) # define DC__Arch_ARM_ARM #elif defined(__arm__) && defined(__thumb__) # define DC__Arch_ARM_THUMB #elif defined(__sh__) # define DC__Arch_SuperH #elif defined(__sparcv9) || defined(__sparc64__) || ( defined(__sparc) && defined(__arch64__) ) /* this could be needed on Linux/GNU sparc64 in the future: || ( defined(__sparc) && defined(__arch64__) ) */ # define DC__Arch_Sparcv9 #elif defined(__sparc) # define DC__Arch_Sparc #endif /* Rough OS classification. */ #if defined(DC__OS_Win32) || defined(DC__OS_Win64) # define DC_WINDOWS #elif defined(DC__OS_NDS) || defined(DC__OS_PSP) # define DC_OTHER #else # define DC_UNIX #endif /* Misc machine-dependent quirks. */ #if defined(DC__Arch_ARM_ARM) || defined(DC__Arch_ARM_THUMB) # if defined(__ARM_EABI__) || defined(DC__OS_NDS) # define DC__ABI_ARM_EABI # elif defined(__APCS_32__) # define DC__ABI_ARM_APCS32 # endif #endif /* ARM */ #if defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # if defined(_ABIO32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2) # define DC__ABI_MIPS_O32 # elif defined(_ABIN32) # define DC__ABI_MIPS_N32 # elif defined(_ABI64) # define DC__ABI_MIPS_N64 # else # define DC__ABI_MIPS_EABI # endif #endif /* MIPS */ /* Internal macro/tag. */ #if !defined(DC_API) #define DC_API #endif #endif /* DYNCALL_MACROS_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_signature.h000066400000000000000000000041721225523575400233410ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_signature.h Description: Type and calling-convention signature character defines License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall signature characters REVISION 2007/12/11 initial */ #ifndef DYNCALL_SIGNATURE_H #define DYNCALL_SIGNATURE_H typedef char DCsigchar; #define DC_SIGCHAR_VOID 'v' #define DC_SIGCHAR_BOOL 'B' #define DC_SIGCHAR_CHAR 'c' #define DC_SIGCHAR_UCHAR 'C' #define DC_SIGCHAR_SHORT 's' #define DC_SIGCHAR_USHORT 'S' #define DC_SIGCHAR_INT 'i' #define DC_SIGCHAR_UINT 'I' #define DC_SIGCHAR_LONG 'j' #define DC_SIGCHAR_ULONG 'J' #define DC_SIGCHAR_LONGLONG 'l' #define DC_SIGCHAR_ULONGLONG 'L' #define DC_SIGCHAR_FLOAT 'f' #define DC_SIGCHAR_DOUBLE 'd' #define DC_SIGCHAR_POINTER 'p' #define DC_SIGCHAR_STRING 'Z' #define DC_SIGCHAR_STRUCT 'T' #define DC_SIGCHAR_ENDARG ')' /* also works for end struct */ /* callback signatures */ #define DC_SIGCHAR_CC_PREFIX '_' #define DC_SIGCHAR_CC_ELLIPSIS 'e' #define DC_SIGCHAR_CC_STDCALL 's' #define DC_SIGCHAR_CC_FASTCALL_GNU 'f' #define DC_SIGCHAR_CC_FASTCALL_MS 'F' #define DC_SIGCHAR_CC_THISCALL_MS '+' #endif /* DYNCALL_SIGNATURE_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_struct.c000066400000000000000000000147011225523575400226560ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_struct.c Description: C interface to compute struct size License: Copyright (c) 2010-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "dyncall_signature.h" #include "dyncall_struct.h" #include "dyncall_alloc.h" #include #include DCstruct* dcNewStruct(DCsize fieldCount, DCint alignment) { DCstruct* s = (DCstruct*)dcAllocMem(sizeof(DCstruct)); s->pCurrentStruct = s; s->pLastStruct = NULL; s->nextField = 0; s->fieldCount = fieldCount; s->alignment = alignment; s->size = 0; s->pFields = (DCfield*)dcAllocMem(fieldCount * sizeof(DCfield)); return s; } void dcStructField(DCstruct* s, DCint type, DCint alignment, DCsize arrayLength) { DCfield *f; if (type == DC_SIGCHAR_STRING) { assert(!"Use dcSubStruct instead !!!"); return; } assert(s && s->pCurrentStruct); assert(s->pCurrentStruct->nextField <= (DCint)s->pCurrentStruct->fieldCount - 1); f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++); f->type = type; f->alignment = alignment; f->arrayLength = arrayLength; f->pSubStruct = NULL; switch (type) { case DC_SIGCHAR_BOOL: f->size = sizeof(DCbool); break; case DC_SIGCHAR_CHAR: case DC_SIGCHAR_UCHAR: f->size = sizeof(DCchar); break; case DC_SIGCHAR_SHORT: case DC_SIGCHAR_USHORT: f->size = sizeof(DCshort); break; case DC_SIGCHAR_INT: case DC_SIGCHAR_UINT: f->size = sizeof(DCint); break; case DC_SIGCHAR_LONG: case DC_SIGCHAR_ULONG: f->size = sizeof(DClong); break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: f->size = sizeof(DClonglong); break; case DC_SIGCHAR_FLOAT: f->size = sizeof(DCfloat); break; case DC_SIGCHAR_DOUBLE: f->size = sizeof(DCdouble); break; case DC_SIGCHAR_POINTER: case DC_SIGCHAR_STRING: f->size = sizeof(DCpointer); break; default: assert(0); } } void dcSubStruct(DCstruct* s, DCsize fieldCount, DCint alignment, DCsize arrayLength) { DCfield *f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++); f->type = DC_SIGCHAR_STRUCT; f->arrayLength = arrayLength; f->alignment = alignment; f->pSubStruct = dcNewStruct(fieldCount, alignment); f->pSubStruct->pLastStruct = s->pCurrentStruct; s->pCurrentStruct = f->pSubStruct; } static void dcAlign(DCsize *size, DCsize alignment) { DCsize mod = (*size) % alignment; if (mod) { DCsize rest = alignment - mod; (*size) += rest; } } static void dcComputeStructSize(DCstruct* s) { DCsize i; assert(s); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; DCsize fieldAlignment; if (f->type == DC_SIGCHAR_STRUCT) { dcComputeStructSize(f->pSubStruct); f->size = f->pSubStruct->size; fieldAlignment = f->pSubStruct->alignment; } else { fieldAlignment = f->size; } if (!f->alignment) f->alignment = fieldAlignment; if (f->alignment > s->alignment) s->alignment = f->alignment; f->size *= f->arrayLength; /*printf("FIELD %d, size = %d, alignment = %d\n", (int)i, (int)f->size, (int)f->alignment);@@@*/ } for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; dcAlign(&s->size, f->alignment); s->size += f->size; } dcAlign(&s->size, s->alignment); /*printf("STRUCT size = %d, alignment = %d\n", (int)s->size, (int)s->alignment);@@@*/ } void dcCloseStruct(DCstruct* s) { assert(s); assert(s->pCurrentStruct); assert(s->pCurrentStruct->nextField == s->pCurrentStruct->fieldCount); if (!s->pCurrentStruct->pLastStruct) { dcComputeStructSize(s->pCurrentStruct); } s->pCurrentStruct = s->pCurrentStruct->pLastStruct; } void dcFreeStruct(DCstruct* s) { DCsize i; assert(s); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; if (f->type == DC_SIGCHAR_STRUCT) dcFreeStruct(f->pSubStruct); } free(s->pFields); free(s); } DCsize dcStructSize(DCstruct* s) { assert(!s->pCurrentStruct && "Struct was not closed"); return s->size; } void dcArgStructUnroll(DCCallVM* vm, DCstruct* s, DCpointer value) { DCsize i; /*printf("UNROLLING STRUCT !\n");@@@*/ assert(s && value); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; DCpointer p = (char*)value + f->offset; switch(f->type) { case DC_SIGCHAR_STRUCT: dcArgStruct(vm, f->pSubStruct, p); break; case DC_SIGCHAR_BOOL: dcArgBool (vm, *(DCbool*)p); break; case DC_SIGCHAR_CHAR: case DC_SIGCHAR_UCHAR: dcArgChar (vm, *(DCchar*)p); break; case DC_SIGCHAR_SHORT: case DC_SIGCHAR_USHORT: dcArgShort (vm, *(DCshort*)p); break; case DC_SIGCHAR_INT: case DC_SIGCHAR_UINT: dcArgInt (vm, *(DCint*)p); break; case DC_SIGCHAR_LONG: case DC_SIGCHAR_ULONG: dcArgLong (vm, *(DCulong*)p); break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: dcArgLongLong (vm, *(DCulonglong*)p); break; case DC_SIGCHAR_FLOAT: dcArgFloat (vm, *(DCfloat*)p); break; case DC_SIGCHAR_DOUBLE: dcArgDouble (vm, *(DCdouble*)p); break; case DC_SIGCHAR_POINTER: case DC_SIGCHAR_STRING: dcArgPointer (vm, *(DCpointer**)p); break; default: assert(0); } } } static DCint readInt(const char** ptr) { return strtol(*ptr, (char**)ptr, 10);/*@@@ enough*/ } DCstruct* dcDefineStruct(const char* signature) { DCstruct* s; const char* ptr = signature; DCint fieldCount = readInt(&ptr); s = dcNewStruct(fieldCount, DEFAULT_ALIGNMENT); while (*ptr) { char type = *(ptr++); if (type == DC_SIGCHAR_STRUCT) { /*dcSubStruct( @@@*/ } else { dcStructField(s, type, DEFAULT_ALIGNMENT, readInt(&ptr)); } } dcCloseStruct(s); return s; } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_struct.h000066400000000000000000000031731225523575400226640ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_struct.h Description: C interface to compute struct size License: Copyright (c) 2010-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall struct metadata structures REVISION 2007/12/11 initial */ #ifndef DYNCALL_STRUCT_H #define DYNCALL_STRUCT_H #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCfield_ { DCsize offset, size, alignment, arrayLength; DCint type; DCstruct* pSubStruct; } DCfield; struct DCstruct_ { DCfield *pFields; DCsize size, alignment, fieldCount; /* struct building uses a state machine. */ DCint nextField; /* == -1 if struct is closed */ DCstruct *pCurrentStruct, *pLastStruct; /* == this, unless we're in a sub struct */ }; /* Helper. */ void dcArgStructUnroll(DCCallVM* vm, DCstruct* s, DCpointer value); #ifdef __cplusplus } #endif #endif /* DYNCALL_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_types.h000066400000000000000000000035201225523575400225000ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_types.h Description: Typedefs License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall argument- and return-types REVISION 2007/12/11 initial */ #ifndef DYNCALL_TYPES_H #define DYNCALL_TYPES_H #include #include "dyncall_config.h" #ifdef __cplusplus extern "C" { #endif typedef void DCvoid; typedef DC_BOOL DCbool; typedef char DCchar; typedef unsigned char DCuchar; typedef short DCshort; typedef unsigned short DCushort; typedef int DCint; typedef unsigned int DCuint; typedef long DClong; typedef unsigned long DCulong; typedef DC_LONG_LONG DClonglong; typedef unsigned DC_LONG_LONG DCulonglong; typedef float DCfloat; typedef double DCdouble; typedef DC_POINTER DCpointer; typedef const char* DCstring; typedef size_t DCsize; #define DC_TRUE 1 #define DC_FALSE 0 #ifdef __cplusplus } #endif #endif /* DYNCALL_TYPES_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_utils.h000066400000000000000000000022511225523575400224740ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_utils.h Description: Type and calling-convention signature character defines License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_UTILS_H #define DYNCALL_UTILS_H /* C portable macros. */ #ifndef DC_MAX #define DC_MAX(a,b) ((a)>=(b))?(a):(b) #endif #endif /* DYNCALL_UTILS_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_value.h000066400000000000000000000031521225523575400224510ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_value.h Description: Value variant type License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall value variant a value variant union-type that carries all supported dyncall types. REVISION 2007/12/11 initial */ #ifndef DYNCALL_VALUE_H #define DYNCALL_VALUE_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif typedef union DCValue_ DCValue; union DCValue_ { DCbool B; DCchar c; DCuchar C; DCshort s; DCushort S; DCint i; DCuint I; DClong j; DCulong J; DClonglong l; DCulonglong L; DCfloat f; DCdouble d; DCpointer p; DCstring Z; }; #ifdef __cplusplus } #endif #endif /* DYNCALL_VALUE_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_vector.c000066400000000000000000000036241225523575400226360ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_vector.c Description: Simple dynamic vector container type implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_vector.h" #include void dcVecAppend(DCVecHead* pHead, const void* pData, size_t size) { size_t newSize = pHead->mSize + size; if(newSize <= pHead->mTotal) { void* dst = (DCchar*)dcVecData(pHead) + pHead->mSize; switch (size) { case 1: *(DCchar *)dst = *(const DCchar *)pData; break; case 2: *(DCshort *)dst = *(const DCshort *)pData; break; case 4: *(DCint *)dst = *(const DCint *)pData; break; case 8: *(DCint *)( ( (char*)dst )+4) = *(const DCint *)( ( (char*)pData )+4); *(DCint *)dst = *(const DCint *)pData; break; /* On sparc 32-bit, this one crashes if ptrs are not aligned. case 8: *(DClonglong*)dst = *(const DClonglong*)pData; break; */ default: memcpy(dst, pData, size); /* for all the rest. */ } pHead->mSize = newSize; } /*else @@@ warning? error?*/ } nqp-2013.12.1/3rdparty/dyncall/dyncall/dyncall_vector.h000066400000000000000000000033471225523575400226450ustar00rootroot00000000000000/* Package: dyncall Library: dyncall File: dyncall/dyncall_vector.h Description: Simple dynamic vector container type header License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DC_VECTOR_H #define DC_VECTOR_H #include "dyncall_types.h" typedef struct { DCsize mTotal; DCsize mSize; } DCVecHead; #define DC_SIZEOF_DCVector(size) (sizeof(DCVecHead)+size) #define dcVecInit(p,size) (p)->mTotal=size;(p)->mSize=0 #define dcVecReset(p) (p)->mSize=0 #define dcVecResize(p,size) (p)->mSize=(size) #define dcVecSkip(p,size) (p)->mSize+=(size) #define dcVecData(p) ( (unsigned char*) (((DCVecHead*)(p))+1) ) #define dcVecAt(p,index) ( dcVecData(p)+index ) #define dcVecSize(p) ( (p)->mSize ) /* #include #define dcVecAppend(p,s,n) memcpy( dcVecData(p)+p->mSize, s, n );p->mSize+=n */ void dcVecAppend(DCVecHead* pHead, const void* source, size_t length); #endif /* DC_VECTOR_H */ nqp-2013.12.1/3rdparty/dyncall/dyncall/gen-masm.sh000066400000000000000000000002611225523575400215140ustar00rootroot00000000000000gcc -E -P -DGEN_MASM dyncall_call_x86.S | unix2dos >dyncall_call_x86_generic_masm.asm gcc -E -P -DGEN_MASM dyncall_call_x64-att.S | unix2dos >dyncall_call_x64_generic_masm.asm nqp-2013.12.1/3rdparty/dyncall/dyncall/mkfile000066400000000000000000000023051225523575400206470ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = .. <$TOP/buildsys/mk/prolog.mk LIBRARY = dyncall UNITS = $UNITS dyncall_vector dyncall_api dyncall_callf dyncall_call dyncall_callvm dyncall_callvm_base dyncall_struct <$TOP/buildsys/mk/epilog.mk nqp-2013.12.1/3rdparty/dyncall/dyncallback/000077500000000000000000000000001225523575400202765ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/dyncallback/BSDmakefile000066400000000000000000000031341225523575400223300ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # dyncallback bsdmake makefile # BSDmakefile # #/////////////////////////////////////////////////// TOP = .. .include "$(TOP)/buildsys/bsdmake/prolog.bsdmake" # Overrides. LIBRARY = dyncallback # Gather needed modules to build. UNITS += dyncall_thunk UNITS += dyncall_alloc_wx UNITS += dyncall_args UNITS += dyncall_callback UNITS += dyncall_callback_arch .if $(BUILD_ARCH) == x64 # @@@ should be moved to BSDmake in general (for x64 platforms) CFLAGS += -fPIC CXXFLAGS += -fPIC .endif .include "$(TOP)/buildsys/bsdmake/epilog.bsdmake" nqp-2013.12.1/3rdparty/dyncall/dyncallback/CMakeLists.txt000066400000000000000000000030611225523575400230360ustar00rootroot00000000000000# Package: dyncall # File: dyncallback/CMakeLists.txt # Description: DynCallback library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # include_directories(${PROJECT_SOURCE_DIR}/dyncall) if(MSVC) if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(ASM_SRC dyncall_callback_x86_masm.asm) else() set(ASM_SRC dyncall_callback_x64_masm.asm) endif() else() set(ASM_SRC dyncall_callback_arch.S) endif() add_library(dyncallback_s STATIC ${ASM_SRC} dyncall_thunk.c dyncall_alloc_wx.c dyncall_args.c dyncall_callback.c ) install(TARGETS dyncallback_s ARCHIVE DESTINATION lib ) install(FILES dyncall_thunk.h dyncall_thunk_x86.h dyncall_thunk_ppc32.h dyncall_thunk_x64.h dyncall_thunk_arm32_arm.h dyncall_thunk_arm32_thumb.h dyncall_alloc_wx.h dyncall_args.h dyncall_callback.h DESTINATION include ) nqp-2013.12.1/3rdparty/dyncall/dyncallback/DynCallbackConfig.cmake000066400000000000000000000001511225523575400245720ustar00rootroot00000000000000set(DYNCALLBACK_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dyncallback) set(DYNCALLBACK_LIBRARIES dyncallback_s) nqp-2013.12.1/3rdparty/dyncall/dyncallback/GNUmakefile000066400000000000000000000040631225523575400223530ustar00rootroot00000000000000# Package: dyncall # File: dyncallback/GNUmakefile # Description: dyncallback library buildsys/gmake GNUmakefile # License: # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # TOP ?= .. GMAKE_TOP ?= $(TOP)/buildsys/gmake include $(GMAKE_TOP)/prolog.gmake TARGET_LIB = dyncallback INSTALL_LIB = 1 # uses some dyncall headers - no other dependencies. CPPFLAGS += -I$(TOP)/dyncall # component: thunks INSTALL_HEADERS += \ dyncall_thunk.h \ dyncall_thunk_x86.h \ dyncall_thunk_ppc32.h \ dyncall_thunk_x64.h \ dyncall_thunk_arm32_arm.h \ dyncall_thunk_arm32_thumb.h UNITS += dyncall_thunk # component: write-and-executable memory allocation # INSTALL_HEADERS += dyncall_alloc_wx.h UNITS += dyncall_alloc_wx # component: unmarshall arguments at callee-site INSTALL_HEADERS += dyncall_args.h UNITS += dyncall_args # architecture: callback INSTALL_HEADERS += dyncall_callback.h UNITS += dyncall_callback ifdef BUILD_TOOL_gcc UNITS += dyncall_callback_arch endif ifdef BUILD_TOOL_llvm_gcc UNITS += dyncall_callback_arch endif ifdef BUILD_TOOL_pcc UNITS += dyncall_callback_arch endif ifdef BUILD_TOOL_msvc ifdef BUILD_ARCH_x86 UNITS += dyncall_callback_x86_masm endif ifdef BUILD_ARCH_x64 UNITS += dyncall_callback_x64_masm endif endif include $(GMAKE_TOP)/epilog.gmake nqp-2013.12.1/3rdparty/dyncall/dyncallback/Makefile.M000066400000000000000000000004711225523575400221330ustar00rootroot00000000000000#include "../buildsys/dynmake/Makefile.base.M" all: _L(dyncallback_s) _L(dyncallback_s): _O(dyncall_thunk) _O(dyncall_alloc_wx) _O(dyncall_args) _O(dyncall_callback) _O(dyncall_callback_arch) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dyncallback_s) nqp-2013.12.1/3rdparty/dyncall/dyncallback/Makefile.embedded000066400000000000000000000007421225523575400234710ustar00rootroot00000000000000TARGET = libdyncallback_s.a OBJS = dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_arch.o dyncall_thunk.o CFLAGS += -I../dyncall HEADERS = dyncall_callback.h dyncall_args.h all: ${TARGET} ${TARGET}: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib .PHONY: all clean install nqp-2013.12.1/3rdparty/dyncall/dyncallback/Makefile.generic000066400000000000000000000016001225523575400233460ustar00rootroot00000000000000SRCTOP ?= .. SRCDIR ?= . BLDDIR ?= ${SRCDIR} LIBNAME = dyncallback OBJS = dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_arch.o dyncall_thunk.o HEADERS = dyncall_thunk.h dyncall_thunk_x86.h dyncall_thunk_ppc32.h dyncall_thunk_x64.h dyncall_thunk_arm32_arm.h dyncall_thunk_arm32_thumb.h dyncall_args.h dyncall_callback.h CFLAGS += -I${SRCTOP}/dyncall LIB = lib${LIBNAME}_s.a all: ${LIB} .PHONY: all clean install RM ?= rm -f AR ?= ar MKLIB ?= ${AR} rcs MKDIR ?= mkdir INSTALL ?= install -p ${LIB}: ${OBJS} ${MKLIB} ${LIB} ${OBJS} clean: ${RM} ${OBJS} ${LIB} DESTDIR ?= /usr/local INSTALL_TOP ?= ${DESTDIR} INSTALL_INC ?= ${INSTALL_TOP}/include INSTALL_LIB ?= ${INSTALL_TOP}/lib install: ${MKDIR} -p ${INSTALL_INC} cd ${SRCDIR} ; ${INSTALL} ${HEADERS} ${INSTALL_INC} ${MKDIR} -p ${INSTALL_LIB} cd ${BLDDIR} ; ${INSTALL} ${LIB} ${INSTALL_LIB} nqp-2013.12.1/3rdparty/dyncall/dyncallback/Nmakefile000066400000000000000000000044511225523575400221200ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdyncallback_s.lib #libdyncallback.lib libdyncallback.dll OBJS = dyncall_thunk.obj dyncall_alloc_wx.obj dyncall_args.obj dyncall_callback.obj dyncall_callback_arch_$(BUILD_ARCH)_masm.obj libdyncallback_s.lib: $(OBJS) echo Creating library $@ ... $(AR) $(ARFLAGS) /OUT:"$@" $(OBJS) > nul libdyncallback.dll libdyncallback.lib: $(OBJS) echo Creating shared/import library $@ ... $(LD) /DLL $(LDFLAGS) $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdyncallback_s.a OBJS = dyncall_thunk.o dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_$(BUILD_ARCH)_gas.o libdyncallback_s.a: $(OBJS) echo Creating library $@ ... $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ELSE TARGETS = libdyncallback_s.a #OBJS = dyncall_thunk.obj dyncall_alloc_wx.obj dyncall_args.obj dyncall_callback.obj dyncall_callback_$(BUILD_ARCH).obj libdyncallback_s.a:# $(OBJS) echo Not building dyncallback: There is no dyncallback support on this platform. # echo Creating library $@ ... # $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake nqp-2013.12.1/3rdparty/dyncall/dyncallback/README.txt000066400000000000000000000001331225523575400217710ustar00rootroot00000000000000components: - alloc_wx - thunk BUGS call back failures for x64 apple: lppffldplfffddd)i nqp-2013.12.1/3rdparty/dyncall/dyncallback/TODO000066400000000000000000000002721225523575400207670ustar00rootroot00000000000000URGENT: - discuss character literal return value specifiers (e.g. cmp %al, 'i'), we might wanna use just an int for the size - nds thumb support - psp mips support - ppc32 sysv support nqp-2013.12.1/3rdparty/dyncall/dyncallback/dynMakefile000066400000000000000000000003161225523575400224510ustar00rootroot00000000000000all: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_alloc_wx.c000066400000000000000000000023671225523575400237700ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx.c Description: Allocate write/executable memory - Implementation back-end selector (mmap or win32) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC_WINDOWS) #include "dyncall_alloc_wx_win32.c" #elif defined(DC_UNIX) #include "dyncall_alloc_wx_mmap.c" #else #include "dyncall_alloc_wx_malloc.c" #endif nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_alloc_wx.h000066400000000000000000000024611225523575400237700ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx.h Description: Allocate write/executable memory - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ALLOC_WX_HPP #define DYNCALL_ALLOC_WX_HPP #include "../dyncall/dyncall_types.h" typedef int DCerror; #ifdef __cplusplus extern "C" { #endif DCerror dcAllocWX(DCsize size, void** p); void dcFreeWX (void* p, DCsize size); #ifdef __cplusplus } #endif #endif // DYNCALL_ALLOC_WX_HPP nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_malloc.c000066400000000000000000000023171225523575400253120ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_malloc.c Description: Allocate write/executable memory - Fallback implementation based License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include int dcAllocWX(size_t size, void** pp) { *pp = malloc(size); return 0; } void dcFreeWX(void* p, size_t size) { free(p); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_mmap.c000066400000000000000000000025331225523575400247750ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_mmap.c Description: Allocate write/executable memory - Implementation for posix License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include #include int dcAllocWX(size_t size, void** pp) { void* p = mmap(0, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if (p == ( (void*)-1 ) ) return -1; *pp = p; return 0; } void dcFreeWX(void* p, size_t size) { munmap(p, size); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_win32.c000066400000000000000000000025571225523575400250130ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_win32.c Description: Allocate write/executable memory - Implementation for win32 platform License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include #include int dcAllocWX(size_t size, void** ptr) { LPVOID p = VirtualAlloc(0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (p == NULL) return -1; *ptr = p; return 0; } void dcFreeWX(void* p, size_t size) { BOOL b = VirtualFree( p, 0, MEM_RELEASE); assert(b); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args.c000066400000000000000000000030071225523575400231040ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args.c Description: Callback's Arguments VM - Implementation back-end selector License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__Arch_Intel_x86) #include "dyncall_args_x86.c" #elif defined (DC__Arch_AMD64) #include "dyncall_args_x64.c" #elif defined (DC__Arch_PowerPC) #include "dyncall_args_ppc32.c" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_args_arm32_arm.c" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_args_arm32_thumb.c" #elif defined (DC__Arch_Sparc) #include "dyncall_args_sparc32.c" #elif defined (DC__Arch_Sparcv9) #include "dyncall_args_sparc64.c" #endif nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args.h000066400000000000000000000036751225523575400231240ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args.h Description: Callback's Arguments VM - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ARGS_H #define DYNCALL_ARGS_H /* * dyncall args C API * * dyncall args provides serialized access to arguments of a function call. * related concepts: callback * */ #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCArgs DCArgs; DC_API DCbool dcbArgBool (DCArgs*); DC_API DCchar dcbArgChar (DCArgs*); DC_API DCshort dcbArgShort (DCArgs*); DC_API DCint dcbArgInt (DCArgs*); DC_API DClong dcbArgLong (DCArgs*); DC_API DClonglong dcbArgLongLong (DCArgs*); DC_API DCuchar dcbArgUChar (DCArgs*); DC_API DCushort dcbArgUShort (DCArgs*); DC_API DCuint dcbArgUInt (DCArgs*); DC_API DCulong dcbArgULong (DCArgs*); DC_API DCulonglong dcbArgULongLong(DCArgs*); DC_API DCfloat dcbArgFloat (DCArgs*); DC_API DCdouble dcbArgDouble (DCArgs*); DC_API DCpointer dcbArgPointer (DCArgs*); #ifdef __cplusplus } #endif #endif /* DYNCALL_ARGS_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.c000066400000000000000000000066211225523575400247540ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_arm.c Description: Callback's Arguments VM - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_arm32_arm.h" static void arm_align_64(DCArgs* args) { /* Look at signature to see if current calling convention needs alignment */ /* or not (e.g. EABI has different alignment). If nothing specified, fall */ /* back to default behaviour for this platform. */ /* @@@ check signature string */ int sig = #if defined(DC__ABI_ARM_EABI) 0; /* EABI */ #else 1; /* ATPCS */ #endif if(sig == 0) { if(args->reg_count < 4) args->reg_count = (args->reg_count+1)&~1; if(args->reg_count >= 4 && (int)args->stack_ptr & 4) ++args->stack_ptr; } } static void* arm_word(DCArgs* args) { if(args->reg_count < 4) return &args->reg_data[args->reg_count++]; else return (void*)args->stack_ptr++; } static DCdouble arm_double(DCArgs* args) { union { DCdouble d; DClong l[2]; } d; arm_align_64(args); d.l[0] = *(DClong*)arm_word(args); d.l[1] = *(DClong*)arm_word(args); return d.d; } static DClonglong arm_longlong(DCArgs* args) { union { DClonglong ll; DClong l[2]; } ll; arm_align_64(args); ll.l[0] = *(DClong*)arm_word(args); ll.l[1] = *(DClong*)arm_word(args); return ll.ll; } // ---------------------------------------------------------------------------- // C API implementation: // base operations: DClonglong dcbArgLongLong (DCArgs* p) { return arm_longlong(p); } DClong dcbArgLong (DCArgs* p) { return *(DClong*)arm_word(p); } DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgLong(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgLong(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgLong(p); } DCbool dcbArgBool (DCArgs* p) { return (dcbArgLong(p) == 0) ? 0 : 1; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong)dcbArgLongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLong(p); } DCdouble dcbArgDouble (DCArgs* p) { return arm_double(p); } DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) arm_word(p); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.h000066400000000000000000000024061225523575400247560ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_arm.h Description: Callback's Arguments VM - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_ARM32_ARM_H #define DYNCALLBACK_ARGS_ARM32_ARM_H #include "dyncall_args.h" struct DCArgs { /* Don't change order! */ long reg_data[4]; int reg_count; long* stack_ptr; }; #endif /* DYNCALLBACK_ARGS_ARM32_ARM_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.c000066400000000000000000000022101225523575400253020ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_thumb.c Description: Callback's Arguments VM - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_arm32_thumb.h" #include "dyncall_args_arm32_arm.c" /* Uses same code as ARM mode. */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.h000066400000000000000000000023251225523575400253160ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_thumb.h Description: Callback's Arguments VM - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_ARM32_THUMB_H #define DYNCALLBACK_ARGS_ARM32_THUMB_H #include "dyncall_args_arm32_arm.h" /* Uses same code as ARM mode. */ #endif /* DYNCALLBACK_ARGS_ARM32_THUMB_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_ppc32.c000066400000000000000000000054471225523575400241250ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc32.c Description: Callback's Arguments VM - Implementation for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_ppc32.h" DCint dcbArgInt (DCArgs* p) { DCint value; if (p->ireg_count < 8) value = p->ireg_data[p->ireg_count++]; else value = *( (int*) p->stackptr ); p->stackptr += sizeof(int); return value; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCulonglong dcbArgULongLong (DCArgs* p) { DCulonglong value; value = ( (DCulonglong) dcbArgUInt(p) ) << 16UL; value |= dcbArgUInt(p); return value; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { DCdouble result; if (p->ireg_count < 7) { p->ireg_count+=2; } else if (p->ireg_count == 7) { p->ireg_count = 8; } if (p->freg_count < 13) { result = p->freg_data[p->freg_count++]; } else { result = * ( (double*) p->stackptr ); } p->stackptr += sizeof(double); return result; } DCfloat dcbArgFloat (DCArgs* p) { DCfloat result; if (p->ireg_count < 8) p->ireg_count++; if (p->freg_count < 13) { result = (DCfloat) p->freg_data[p->freg_count++]; } else { result = * ( (float*) p->stackptr ); } p->stackptr += sizeof(float); return result; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_ppc32.h000066400000000000000000000024141225523575400241210ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc32.h Description: Callback's Arguments VM - Header for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_PPC32_H #define DYNCALLBACK_ARGS_PPC32_H #include "dyncall_args.h" struct DCArgs { int ireg_data[8]; double freg_data[13]; unsigned char* stackptr; int ireg_count; int freg_count; }; #endif /* DYNCALLBACK_ARGS_PPC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_sparc32.c000066400000000000000000000037621225523575400244510ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc32.c Description: Callback's Arguments VM - Implementation for sparc32 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_sparc32.h" DCint dcbArgInt (DCArgs* p) { return 0; } DCuint dcbArgUInt (DCArgs* p) { return 0; } DCulonglong dcbArgULongLong (DCArgs* p) { return 0; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { return 0.0; } DCfloat dcbArgFloat (DCArgs* p) { return 0.0f; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_sparc32.h000066400000000000000000000022571225523575400244540ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc32.h Description: Callback's Arguments VM - Header for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_SPARC32_H #define DYNCALLBACK_ARGS_SPARC32_H #include "dyncall_args.h" struct DCArgs { int dummy; }; #endif /* DYNCALLBACK_ARGS_SPARC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_sparc64.c000066400000000000000000000037621225523575400244560ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc64.c Description: Callback's Arguments VM - Implementation for sparc64 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_sparc64.h" DCint dcbArgInt (DCArgs* p) { return 0; } DCuint dcbArgUInt (DCArgs* p) { return 0; } DCulonglong dcbArgULongLong (DCArgs* p) { return 0; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { return 0.0; } DCfloat dcbArgFloat (DCArgs* p) { return 0.0f; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_sparc64.h000066400000000000000000000022711225523575400244550ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc64.h Description: Callback's Arguments VM - Header for sparc32 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_SPARC64_H #define DYNCALLBACK_ARGS_SPARC64_H #include "dyncall_args.h" struct DCArgs { int dummy; }; #endif /* DYNCALLBACK_ARGS_SPARC64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_x64.c000066400000000000000000000051061225523575400236070ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x64.c Description: Callback's Arguments VM - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_x64.h" static int64* arg_i64(DCArgs* args) { if (args->reg_count.i < numIntRegs) return &args->reg_data.i[args->reg_count.i++]; else return args->stack_ptr++; } static double* arg_f64(DCArgs* args) { if (args->reg_count.f < numFloatRegs) return &args->reg_data.f[args->reg_count.f++]; else { return (double*)args->stack_ptr++; } } // ---------------------------------------------------------------------------- // C API implementation: // base operations: DClonglong dcbArgLongLong (DCArgs* p) { return *arg_i64(p); } DCint dcbArgInt (DCArgs* p) { return (int) dcbArgLongLong(p); } DClong dcbArgLong (DCArgs* p) { return (long) dcbArgLongLong(p); } DCchar dcbArgChar (DCArgs* p) { return (char) dcbArgLongLong(p); } DCshort dcbArgShort (DCArgs* p) { return (short) dcbArgLongLong(p); } DCbool dcbArgBool (DCArgs* p) { return (dcbArgInt(p) == 0) ? 0 : 1; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLongLong(p); } DCdouble dcbArgDouble (DCArgs* p) { return *arg_f64(p); } DCfloat dcbArgFloat (DCArgs* p) { return *(float*)arg_f64(p); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_x64.h000066400000000000000000000026231225523575400236150ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x64.h Description: Callback's Arguments VM - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_X64_H #define DYNCALLBACK_ARGS_X64_H #include "dyncall_args.h" #include "../dyncall/dyncall_callvm_x64.h" /* reuse structures */ struct DCArgs { /* state */ int64* stack_ptr; DCRegCount_x64 reg_count; /* @@@ win64 version should maybe force alignment to 8 in order to be secure */ /* reg data */ DCRegData_x64_s reg_data; }; #endif /* DYNCALLBACK_ARGS_X64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_x86.c000066400000000000000000000074011225523575400236130ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x86.c Description: Callback's Arguments VM - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_x86.h" /* ---------------------------------------------------------------------------- */ /* C API implementation: */ /* base operations */ DCint dcbArgInt (DCArgs* p) { return p->vt->i32(p); } DClonglong dcbArgLongLong(DCArgs* p) { return p->vt->i64(p); } DCfloat dcbArgFloat (DCArgs* p) { return p->vt->f32(p); } DCdouble dcbArgDouble (DCArgs* p) { return p->vt->f64(p); } /* promote to integer: bool, char, short, long and pointer */ DCbool dcbArgBool (DCArgs* p) { return ( dcbArgInt(p) == 0 ) ? 0 : 1; } DCchar dcbArgChar (DCArgs* p) { return (char) dcbArgInt(p); } DCshort dcbArgShort (DCArgs* p) { return (short) dcbArgInt(p); } DClong dcbArgLong (DCArgs* p) { return (long) dcbArgInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgInt(p); } /* unsigned types */ DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } /* ---------------------------------------------------------------------------- */ /* virtual tables: */ /* cdecl calling convention */ static int default_i32(DCArgs* args) { return *args->stack_ptr++; } static long long default_i64(DCArgs* args) { long long result = * (long long*) args->stack_ptr; args->stack_ptr += 2; return result; } static float default_f32(DCArgs* args) { float result = * ( (float*) args->stack_ptr ); args->stack_ptr++; return result; } static double default_f64(DCArgs* args) { double result = * ( (double*) args->stack_ptr ); args->stack_ptr += 2; return result; } DCArgsVT dcArgsVT_default = { default_i32, default_i64, default_f32, default_f64 }; /* thiscall (microsoft) calling convention */ static int this_i32(DCArgs* args) { if(args->fast_data[0]) { /* ecx register = this pointer */ int thisArg = args->fast_data[0]; args->fast_data[0] = 0; return thisArg; } return *args->stack_ptr++; } DCArgsVT dcArgsVT_this_ms = { this_i32, default_i64, default_f32, default_f64 }; /* fastcall (microsoft) calling convention */ static int fast_i32(DCArgs* args) { if(args->fast_count < 2) return args->fast_data[args->fast_count++]; else return default_i32(args); } DCArgsVT dcArgsVT_fast_ms = { fast_i32, default_i64, default_f32, default_f64 }; /* fastcall (gnu) calling convention */ static long long fast_gnu_i64(DCArgs* args) { args->fast_count += 2; return default_i64(args); } DCArgsVT dcArgsVT_fast_gnu = { fast_i32, fast_gnu_i64, default_f32, default_f64 }; nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_args_x86.h000066400000000000000000000030511225523575400236150ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x86.h Description: Callback's Arguments VM - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ARGS_X86_H_ #define DYNCALL_ARGS_X86_H_ #include "dyncall_args.h" typedef struct { DCint (*i32)(DCArgs*); DClonglong (*i64)(DCArgs*); DCfloat (*f32)(DCArgs*); DCdouble (*f64)(DCArgs*); } DCArgsVT; extern DCArgsVT dcArgsVT_default; extern DCArgsVT dcArgsVT_this_ms; extern DCArgsVT dcArgsVT_fast_ms; extern DCArgsVT dcArgsVT_fast_gnu; struct DCArgs { /* callmode */ DCArgsVT* vt; /* state */ int* stack_ptr; /* fast data / 'this-ptr' info */ int fast_data[2]; int fast_count; }; #endif /* DYNCALL_ARGS_X86_H_ */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback.c000066400000000000000000000030301225523575400237000ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback.c Description: Callback - Implementation back-end selector License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__Arch_Intel_x86) #include "dyncall_callback_x86.c" #elif defined (DC__Arch_AMD64) #include "dyncall_callback_x64.c" #elif defined (DC__Arch_PowerPC) #include "dyncall_callback_ppc32.c" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_callback_arm32_arm.c" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_callback_arm32_thumb.c" #elif defined (DC__Arch_Sparc) #include "dyncall_callback_sparc32.c" #elif defined (DC__Arch_Sparcv9) #include "dyncall_callback_sparc64.c" #endif nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback.h000066400000000000000000000031401225523575400237070ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback.h Description: Callback - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_H #define DYNCALL_CALLBACK_H #include "dyncall_args.h" #include "dyncall_signature.h" #include "dyncall_value.h" typedef struct DCCallback DCCallback; typedef char (DCCallbackHandler)(DCCallback* pcb, DCArgs* args, DCValue* result, void* userdata); #ifdef __cplusplus extern "C" { #endif DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* funcptr, void* userdata); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata); void dcbFreeCallback(DCCallback* pcb); #ifdef __cplusplus } #endif #endif // DYNCALL_CALLBACK_H nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arch.S000066400000000000000000000041551225523575400246660ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arch.S Description: Callback Thunk - Implementation Back-end selector License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__C_MSVC) # if defined(DC__OS_Win32) # include "dyncall_callback_x86_masm.asm" # elif defined(DC__OS_Win64) # include "dyncall_callback_x64_masm.asm" # endif #else # if defined(DC__Arch_Intel_x86) # include "dyncall_callback_arch_x86.S" # elif defined(DC__Arch_AMD64) # include "dyncall_callback_arch_x64.S" # else # if defined(DC__OS_Darwin) # if defined(DC__Arch_PowerPC) # include "dyncall_callback_ppc32_apple.s" # elif defined(DC__Arch_ARM_ARM) # include "dyncall_callback_arm32_arm_apple.s" # endif # else /* other than Darwin.. */ # if defined(DC__Arch_PowerPC) # include "dyncall_callback_ppc32.S" # elif defined(DC__Arch_ARM_ARM) # include "dyncall_callback_arm32_arm_gas.s" # elif defined(DC__Arch_ARM_THUMB) # include "dyncall_callback_arm32_thumb_gas.s" # elif defined(DC__Arch_Sparc) # include "dyncall_callback_sparc32.s" # elif defined(DC__Arch_Sparcv9) # include "dyncall_callback_sparc64.s" # endif # endif # endif #endif nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arch_x64.S000066400000000000000000000122501225523575400253620ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arch_x64.S Description: Callback Thunk entry for x64 (portasm version) License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64-att.S" /* structure sizes */ SET(DCThunk_size,24) SET(DCArgs_size_win64,80) SET(DCArgs_size_sysv,128) SET(DCValue_size,8) /* frame local variable offsets relative to %rbp*/ SET(FRAME_arg0_win64,48) SET(FRAME_arg0_sysv,16) SET(FRAME_return,8) SET(FRAME_parent,0) SET(FRAME_DCArgs_sysv,-128) SET(FRAME_DCValue_sysv,-136) SET(FRAME_DCArgs_win64,-80) SET(FRAME_DCValue_win64,-80) /* struct DCCallback */ SET(CTX_thunk,0) SET(CTX_handler,24) SET(CTX_userdata,32) SET(DCCallback_size,40) /* character constants */ #define ASCII_f 102 #define ASCII_d 100 GLOBAL(dcCallback_x64_sysv) BEGIN_PROC(dcCallback_x64_sysv) PUSH(RBP) MOV(RSP,RBP) /* initialize DCArgs */ /* float parameters (8 registers spill to DCArgs) */ SUB(LIT(8*8),RSP) MOVSD(XMM7, QWORD(RSP,8*7)) /* struct offset 120: float parameter 7 */ MOVSD(XMM6, QWORD(RSP,8*6)) /* struct offset 112: float parameter 6 */ MOVSD(XMM5, QWORD(RSP,8*5)) /* struct offset 104: float parameter 5 */ MOVSD(XMM4, QWORD(RSP,8*4)) /* struct offset 96: float parameter 4 */ MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 88: float parameter 3 */ MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 80: float parameter 2 */ MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 72: float parameter 1 */ MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 64: float parameter 0 */ /* integer parameters (6 registers spill to DCArgs) */ PUSH(R9) /* struct offset 56: parameter 5 */ PUSH(R8) /* struct offset 48: parameter 4 */ PUSH(RCX) /* struct offset 40: parameter 3 */ PUSH(RDX) /* struct offset 32: parameter 2 */ PUSH(RSI) /* struct offset 24: parameter 1 */ PUSH(RDI) /* struct offset 16: parameter 0 */ /* register counts for integer/pointer and float regs */ PUSH(LIT(0)) /* struct offset 12: fcount */ /* struct offset 8: icount */ LEA(QWORD(RBP,FRAME_arg0_sysv),RDX) /* struct offset 0: stack pointer */ PUSH(RDX) MOV(RSP,RSI) /* arg 1 RSI : DCArgs* */ /* initialize DCValue */ PUSH(LIT(0)) /* struct offset 0: return value (max long long) */ /* call handler( *ctx, *args, *value, *userdata) */ MOV(RAX,RDI) /* arg 0 RDI : DCCallback* (RAX) */ MOV(QWORD(RDI,CTX_userdata),RCX) /* arg 3 RCX : userdata* */ MOV(RSP,RDX) /* arg 2 RDX : DCValue* */ PUSH(LIT(0)) /* align to 16 bytes */ CALL_REG(QWORD(RAX,CTX_handler)) /* pass return type via registers */ /* distinguish two basic classes 'integer' and 'float' */ MOVB(AL,DL) MOV(QWORD(RBP,FRAME_DCValue_sysv),RAX) CMP(LIT(ASCII_f),DL) JE(LOCAL(return_f64)) CMP(LIT(ASCII_d),DL) JNE(LOCAL(return_i64)) LOCAL(return_f64): MOVD(RAX,XMM0) LOCAL(return_i64): MOV(RBP,RSP) POP(RBP) RET() END_PROC(dcCallback_x64_sysv) GLOBAL(dcCallback_x64_win64) BEGIN_PROC(dcCallback_x64_win64) PUSH(RBP) MOV(RSP,RBP) /* initialize DCArgs */ /* float parameters (4 registers spill to DCArgs) */ SUB(LIT(4*8),RSP) MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 72: float parameter 3 */ MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 64: float parameter 2 */ MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 56: float parameter 1 */ MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 48: float parameter 0 */ /* integer parameters (4 registers spill to DCArgs) */ PUSH(R9) /* struct offset 40: parameter 3 */ PUSH(R8) /* struct offset 32: parameter 2 */ PUSH(RDX) /* struct offset 24: parameter 1 */ PUSH(RCX) /* struct offset 16: parameter 0 */ /* register counts for integer/pointer and float regs */ PUSH(LIT(0)) /* struct offset 12: fcount */ /* struct offset 8: icount */ LEA(QWORD(RBP,FRAME_arg0_win64),RDX) /* struct offset 0: stack pointer */ PUSH(RDX) MOV(RSP,RDX) /* arg 1 RDX : DCArgs* */ /* initialize DCValue */ // PUSHQ(LIT(0)) /* struct offset 0: return value (max long long) */ /* call handler( *ctx, *args, *value, *userdata) */ MOV(RAX,RCX) /* arg 0 RCX : DCCallback* (RAX) */ MOV(QWORD(RAX,CTX_userdata),R9) /* arg 3 R9 : userdata* */ MOV(RSP,R8) /* arg 2 R8 : DCValue* */ SUB(LIT(4*8),RSP) /* make room for spill area and call */ CALL_REG(QWORD(RAX,CTX_handler)) MOV(QWORD(RBP,FRAME_DCValue_win64),RAX) MOVD(RAX,XMM0) MOV(RBP,RSP) POP(RBP) RET() END_PROC(dcCallback_x64_win64) END_ASM nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arch_x64_masm.asm000066400000000000000000000032411225523575400267550ustar00rootroot00000000000000.CODE DCThunk_size = 24 DCArgs_size_win64 = 80 DCArgs_size_sysv = 128 DCValue_size = 8 FRAME_arg0_win64 = 48 FRAME_arg0_sysv = 16 FRAME_return = 8 FRAME_parent = 0 FRAME_DCArgs_sysv = -128 FRAME_DCValue_sysv = -136 FRAME_DCArgs_win64 = -80 FRAME_DCValue_win64 = -80 CTX_thunk = 0 CTX_handler = 24 CTX_userdata = 32 DCCallback_size = 40 dcCallback_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP mov RBP,RSP sub RSP,8*8 movsd qword ptr [RSP+8*7],XMM7 movsd qword ptr [RSP+8*6],XMM6 movsd qword ptr [RSP+8*5],XMM5 movsd qword ptr [RSP+8*4],XMM4 movsd qword ptr [RSP+8*3],XMM3 movsd qword ptr [RSP+8*2],XMM2 movsd qword ptr [RSP+8*1],XMM1 movsd qword ptr [RSP+8*0],XMM0 push R9 push R8 push RCX push RDX push RSI push RDI push 0 lea RDX,qword ptr [RBP+FRAME_arg0_sysv] push RDX mov RSI,RSP push 0 mov RDI,RAX mov RCX,qword ptr [RDI+CTX_userdata] mov RDX,RSP push 0 call qword ptr [RAX+CTX_handler] mov DL,AL mov RAX,qword ptr [RBP+FRAME_DCValue_sysv] cmp DL,102 je return_f64 cmp DL,100 jne return_i64 return_f64: movd XMM0,RAX return_i64: mov RSP,RBP pop RBP ret dcCallback_x64_sysv ENDP dcCallback_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP mov RBP,RSP sub RSP,4*8 movsd qword ptr [RSP+8*3],XMM3 movsd qword ptr [RSP+8*2],XMM2 movsd qword ptr [RSP+8*1],XMM1 movsd qword ptr [RSP+8*0],XMM0 push R9 push R8 push RDX push RCX push 0 lea RDX,qword ptr [RBP+FRAME_arg0_win64] push RDX mov RDX,RSP mov RCX,RAX mov R9,qword ptr [RAX+CTX_userdata] mov R8,RSP sub RSP,4*8 call qword ptr [RAX+CTX_handler] mov RAX,qword ptr [RBP+FRAME_DCValue_win64] movd XMM0,RAX mov RSP,RBP pop RBP ret dcCallback_x64_win64 ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arch_x86.S000066400000000000000000000061661225523575400253770ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arch_x86.S Description: Callback Thunk entry for x86 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x86.S" BEGIN_ASM DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 #define ASCII_L 76 #define ASCII_l 108 #define ASCII_d 100 #define ASCII_f 102 #define ASCII_i 105 #define ASCII_v 118 GLOBAL(dcCallbackThunkEntry) BEGIN_PROC(dcCallbackThunkEntry) PUSH(EBP) MOVL(ESP,EBP) /* local variable frame_CTX) */ PUSH(EAX) /* EAX = CTX* */ /* initialize DCArgs */ PUSH(LIT(0)) /* fast_count */ PUSH(EDX) /* fast_data[1] */ PUSH(ECX) /* fast_data[0] */ LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */ PUSH(ECX) /* stack-ptr */ PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */ MOVL(ESP,ECX) /* ECX = DCArgs* */ /* initialize DCvalue */ PUSH(LIT(0)) PUSH(LIT(0)) MOVL(ESP,EDX) /* EDX = DCValue* */ ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */ /* call handler(context) */ PUSH(DWORD(EAX,CTX_userdata)) /* userdata */ PUSH(EDX) /* DCValue* */ PUSH(ECX) /* DCargs* */ PUSH(EAX) /* DCCallback* */ CALL_DWORD(EAX,CTX_phandler) /* cleanup stack */ MOVL(EBP,ESP) /* reset esp to frame */ POP(ECX) /* skip parent frame */ POP(ECX) /* pop return address */ MOVL(DWORD(EBP,frame_CTX),EDX) ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */ PUSH(ECX) /* push back return address */ LEA(DWORD(EBP,frame_DCValue), EDX) MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */ /* handle return value */ CMP(LIT(ASCII_v),AL) JE(LOCAL(return_void)) CMP(LIT(ASCII_d),AL) JE(LOCAL(return_f64)) CMP(LIT(ASCII_f),AL) JE(LOCAL(return_f32)) CMP(LIT(ASCII_l),AL) JE(LOCAL(return_i64)) CMP(LIT(ASCII_L),AL) JE(LOCAL(return_i64)) /* All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case*/ LOCAL(return_i32): MOVL(DWORD(EDX,0),EAX) RET() LOCAL(return_i64): MOVL(DWORD(EDX,0),EAX) MOVL(DWORD(EDX,4),EDX) RET() LOCAL(return_f32): FLDS(DWORD(EDX,0)) RET() LOCAL(return_f64): FLDL(QWORD(EDX,0)) LOCAL(return_void): RET() END_PROC(dcCallbackThunkEntry) END_ASM nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arch_x86_masm.asm000066400000000000000000000022401225523575400267570ustar00rootroot00000000000000.386 .MODEL FLAT .CODE DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 _dcCallbackThunkEntry PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push EAX push 0 push EDX push ECX lea ECX,dword ptr [EBP+frame_arg0] push ECX push dword ptr [EAX+CTX_pargsvt] mov ECX,ESP push 0 push 0 mov EDX,ESP and ESP,-16 push dword ptr [EAX+CTX_userdata] push EDX push ECX push EAX call dword ptr [EAX+CTX_phandler] mov ESP,EBP pop ECX pop ECX mov EDX,dword ptr [EBP+frame_CTX] add ESP,dword ptr [EDX+CTX_stack_cleanup] push ECX lea EDX,dword ptr [EBP+frame_DCValue] mov EBP,dword ptr [EBP+0] cmp AL,118 je return_void cmp AL,100 je return_f64 cmp AL,102 je return_f32 cmp AL,108 je return_i64 cmp AL,76 je return_i64 return_i32: mov EAX,dword ptr [EDX+0] ret return_i64: mov EAX,dword ptr [EDX+0] mov EDX,dword ptr [EDX+4] ret return_f32: fld dword ptr [EDX+0] ret return_f64: fld qword ptr [EDX+0] return_void: ret _dcCallbackThunkEntry ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.c000066400000000000000000000034001225523575400255440ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm.c Description: Callback - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_arm32_arm.h" #include "dyncall_args_arm32_arm.h" #include "dyncall_alloc_wx.h" #include "dyncall_signature.h" extern void dcCallbackThunkEntry(); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { pcb->handler = handler; pcb->userdata = userdata; } DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**)&pcb); if(err || !pcb) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.h000066400000000000000000000025711225523575400255610ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm.h Description: Callback - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_ARM32_ARM_H_ #define DYNCALL_CALLBACK_ARM32_ARM_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_arm32_arm.h" struct DCCallback { DCThunk thunk; // offset 0 DCCallbackHandler* handler; // offset 12 void* userdata; // offset 16 }; #endif /* DYNCALL_CALLBACK_ARM32_ARM_H_ */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s000066400000000000000000000054621225523575400267570ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm_apple.s Description: Callback Thunk - Implementation for ARM32 (ARM mode) for Apple's as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 32 /* ARM mode */ .globl _dcCallbackThunkEntry /* sizes */ .set DCThunk_size , 8 .set DCArgs_size , 24 .set DCValue_size , 8 /* struct DCCallback offsets and size */ .set CTX_thunk , 0 .set CTX_handler , 12 .set CTX_userdata , 16 .set DCCallback_size, 20 /* Called by thunk - thunk stores pointer to DCCallback in r12 */ _dcCallbackThunkEntry: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ stmdb r13, {r4-r11, r13, r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ mov r11, r13 /* Set frame pointer. */ sub r13, r13, #40 /* Adjust stack pointer. */ /* Grab arguments. */ mov r4, #0 stmdb r13!, {r0-r4, r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */ /* Prepare callback handler call. */ mov r0, r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ mov r1, r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ sub r13, r13, #DCValue_size /* Make room for return value. */ mov r2, r13 /* Parameter 2 (r2) = results pointer. */ ldr r3, [r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ /* Call. */ ldr r4, [r12, #CTX_handler] /* Load callback handler pointer into r4. */ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx r4 /* Call. */ /* Return value. */ ldmia r13, {r0, r1} /* Load return value in r0 and r1. */ /* Epilog. */ ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s000066400000000000000000000055041225523575400264250ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm_gas.s Description: Callback Thunk - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 32 /* ARM mode */ .globl dcCallbackThunkEntry /* sizes */ .set DCThunk_size , 8 .set DCArgs_size , 24 .set DCValue_size , 8 /* struct DCCallback offsets and size */ .set CTX_thunk , 0 .set CTX_handler , 12 .set CTX_userdata , 16 .set DCCallback_size, 20 /* Called by thunk - thunk stores pointer to DCCallback in r12 */ dcCallbackThunkEntry: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ stmdb %r13, {%r4-%r11, %r13, %r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ mov %r11, %r13 /* Set frame pointer. */ sub %r13, %r13, #40 /* Adjust stack pointer. */ /* Grab arguments. */ mov %r4, #0 stmdb %r13!, {%r0-%r4, %r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */ /* Prepare callback handler call. */ mov %r0, %r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ mov %r1, %r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ sub %r13, %r13, #DCValue_size /* Make room for return value. */ mov %r2, %r13 /* Parameter 2 (r2) = results pointer. */ ldr %r3, [%r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ /* Call. */ ldr %r4, [%r12, #CTX_handler] /* Load callback handler pointer into r4. */ mov %r14, %r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx %r4 /* Call. */ /* Return value. */ ldmia %r13, {%r0, %r1} /* Load return value in r0 and r1. */ /* Epilog. */ ldmdb %r11, {%r4-%r11, %r13, %r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.c000066400000000000000000000022051225523575400261060ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb.c Description: Callback - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_arm32_thumb.h" #include "dyncall_callback_arm32_arm.c" /* Uses same code as ARM mode. */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.h000066400000000000000000000023221225523575400261130ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb.h Description: Callback - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_ARM32_THUMB_H_ #define DYNCALL_CALLBACK_ARM32_THUMB_H_ #include "dyncall_callback_arm32_arm.h" /* Uses same code as ARM mode. */ #endif /* DYNCALL_CALLBACK_ARM32_THUMB_H_ */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_gas.s000066400000000000000000000025771225523575400267740ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb_gas.s Description: Callback Thunk - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* We can use the ARM mode callback code here, because the thunk switches */ /* into ARM mode, the parameters passed use the same registers/stack spase */ /* as the ARM mode, and the bx instruction switches back to THUMB mode, if */ /* the function to be called has a "THUMB function address" (=address+1). */ .include "dyncall_callback_arm32_arm_gas.s" nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.S000066400000000000000000000022651225523575400247000ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.S Description: Callback Thunk - Implementation for PowerPC 32-bit on Darwin/Apple's as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" .machine ppc .text .align 2 GLOBAL_C(dcCallbackThunkEntry) ENTRY_C(dcCallbackThunkEntry) blr /* return */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.c000066400000000000000000000033741225523575400247220ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.c Description: Callback - Implementation Header for ppc32 (TODO: not implemented yet) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_ppc32.h" #include "dyncall_alloc_wx.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; pcb->handler = handler; pcb->userdata = userdata; } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.h000066400000000000000000000027051225523575400247240ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.h Description: Callback - Header for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_PPC32_H #define DYNCALL_CALLBACK_PPC32_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_ppc32.h" struct DCCallback { DCThunk thunk; /* offset 0, size 40 */ DCCallbackHandler* handler; /* offset 40, size 4 */ size_t stack_cleanup; /* offset 44, size 4 */ void* userdata; /* offset 48, size 4 */ }; #endif /* DYNCALL_CALLBACK_PPC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32_apple.s000066400000000000000000000116551225523575400261240ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32_apple.s Description: Callback Thunk - Implementation for PowerPC 32-bit on Darwin/Apple's as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .machine ppc .text .align 2 /* Callback Thunk Entry code for Apple Mac OS X PowerPC 32-bit. */ /* Stack Frame Layout: 206 DCValue ( ) 56 DCArgs (32+104+4+8 = 150) 24 Parameter area ( 4*8 = 32 ) 0 Linkage area ( 24 ) */ /* Constants. */ INT_REGS = 8 FLOAT_REGS = 13 SIZEOF_INT = 4 SIZEOF_DOUBLE = 8 /* Linkage area. */ LINK_SP = 0 LINK_CR = 4 LINK_LR = 8 LINK_OFFSET = 0 LINK_SIZE = 24 /* Parameter area. */ PAR_OFFSET = LINK_SIZE PAR_SIZE = 32 /* local struct DCArgs */ ARGS_OFFSET = (PAR_OFFSET+PAR_SIZE) ARGS_SIZE = (SIZEOF_INT*INT_REGS)+(SIZEOF_DOUBLE*FLOAT_REGS) /* = 136 */ /* local struct DCValue */ RESULT_OFFSET = (ARGS_OFFSET+ARGS_SIZE) RESULT_SIZE = 16 /* additional locals (reg 30/31) */ LOCALS_OFFSET = (RESULT_OFFSET+RESULT_SIZE) LOCALS_SIZE = 2*SIZEOF_INT /* total */ FRAME_SIZE = ( (LOCALS_OFFSET+LOCALS_SIZE)+15 & (-16) ) /* struct DCCallback */ DCB_THUNK = 0 DCB_HANDLER = 24 DCB_STACKCLEAN = 28 DCB_USERDATA = 32 /* struct DCArgs */ DCA_IARRAY = 0 DCA_FARRAY = SIZEOF_INT*INT_REGS DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS DCA_ICOUNT = DCA_SP + 4 DCA_FCOUNT = DCA_ICOUNT + 4 /* struct DCValue */ DCV_INT = 0 DCV_FLOAT = 0 DCV_DOUBLE = 0 DCV_LONG_HI32 = 0 DCV_LONG_LO32 = 4 DCV_SIZE = 8 iregfile = ARGS_OFFSET+DCA_IARRAY fregfile = ARGS_OFFSET+DCA_FARRAY save_sp = ARGS_OFFSET+DCA_SP icount = ARGS_OFFSET+DCA_ICOUNT fcount = ARGS_OFFSET+DCA_FCOUNT .globl _dcCallbackThunkEntry /* Thunk entry: R2 = DCCallback* */ _dcCallbackThunkEntry: mflr r0 stw r0, 8(r1) /* store return address */ /* stmw r30, -8(r1) */ /* store preserved registers (r30/r31) */ addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ stw r3, iregfile+0*4(r1) /* spill 8 integer parameter registers */ stw r4, iregfile+1*4(r1) stw r5, iregfile+2*4(r1) stw r6, iregfile+3*4(r1) stw r7, iregfile+4*4(r1) stw r8, iregfile+5*4(r1) stw r9, iregfile+6*4(r1) stw r10,iregfile+7*4(r1) stfd f1, fregfile+ 0*8(r1) /* spill 13 float parameter registers */ stfd f2, fregfile+ 1*8(r1) stfd f3, fregfile+ 2*8(r1) stfd f4, fregfile+ 3*8(r1) stfd f5, fregfile+ 4*8(r1) stfd f6, fregfile+ 5*8(r1) stfd f7, fregfile+ 6*8(r1) stfd f8, fregfile+ 7*8(r1) stfd f9, fregfile+ 8*8(r1) stfd f10,fregfile+ 9*8(r1) stfd f11,fregfile+10*8(r1) stfd f12,fregfile+11*8(r1) stfd f13,fregfile+12*8(r1) /* initialize struct DCCallback */ stw r12,save_sp(r1) /* init stack pointer */ xor r0, r0, r0 /* init register counters */ stw r0, icount(r1) stw r0, fcount(r1) /* invoke callback handler */ mr r3, r2 /* arg 1: DCCallback* pcb */ addi r4, r1, ARGS_OFFSET /* arg 2: DCArgs* args */ addi r5, r1, RESULT_OFFSET /* arg 3: DCValue* result */ lwz r6, DCB_USERDATA(r2) /* arg 4: void* userdata */ /* branch-and-link to DCCallback.handler */ lwz r12, DCB_HANDLER(r2) mtctr r12 bctrl addi r0, r1, RESULT_OFFSET /* r0 = DCValue* */ /* switch on base result type */ cmpi cr0, r3, 'B beq .i32 cmpi cr0, r3, 'i beq .i32 cmpi cr0, r3, 'l beq .i64 cmpi cr0, r3, 'f beq .f32 cmpi cr0, r3, 'd beq .f64 cmpi cr0, r3, 'p beq .i32 .void: /* ignore result (void call) */ b .end .i32: /* result is integer <= 32-bit result */ lwz r3, RESULT_OFFSET + DCV_INT(r1) b .end .f32: /* result is C float result */ lfs f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .f64: lfd f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .i64: /* result is C double result */ lwz r3, RESULT_OFFSET + DCV_LONG_HI32(r1) lwz r4, RESULT_OFFSET + DCV_LONG_LO32(r1) b .end .end: lwz r1, 0(r1) /* restore stack pointer */ /* lmw r30, -8(r1) */ /* restore preserved registers */ lwz r0, 8(r1) /* load link register with return address */ mtlr r0 blr /* branch back to link register */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.c000066400000000000000000000032461225523575400252460ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.c Description: Callback - Implementation for sparc32 (TODO: not implemented yet) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_sparc32.h" #include "dyncall_alloc_wx.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.h000066400000000000000000000027211225523575400252500ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.h Description: Callback - Header for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_SPARC32_H #define DYNCALL_CALLBACK_SPARC32_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_sparc32.h" struct DCCallback { DCThunk thunk; /* offset 0, size ?? */ DCCallbackHandler* handler; /* offset ??, size 4 */ size_t stack_cleanup; /* offset ??, size 4 */ void* userdata; /* offset ??, size 4 */ }; #endif /* DYNCALL_CALLBACK_SPARC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.s000066400000000000000000000021711225523575400252620ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.s Description: Callback Thunk - Implementation for Sparc 32-bit License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .globl dcCallbackThunkEntry dcCallbackThunkEntry: jmpl %i7 + 8, %g0 /* Return from proc. */ nop nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.c000066400000000000000000000032461225523575400252530ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc64.c Description: Callback - Implementation for sparc64 (TODO: not implemented yet) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_sparc32.h" #include "dyncall_alloc_wx.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.s000066400000000000000000000021711225523575400252670ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc64.s Description: Callback Thunk - Implementation for Sparc 64-bit License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .globl dcCallbackThunkEntry dcCallbackThunkEntry: jmpl %i7 + 8, %g0 /* Return from proc. */ nop nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64.c000066400000000000000000000035251225523575400244120ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64.c Description: Callback - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_x64.h" #include "dyncall_args_x64.h" #include "dyncall_alloc_wx.h" /* Callback symbol. */ extern void dcCallback_x64_sysv(); extern void dcCallback_x64_win64(); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { pcb->handler = handler; pcb->userdata = userdata; } DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; #if defined (DC__OS_Win64) dcbInitThunk(&pcb->thunk, dcCallback_x64_win64); #else dcbInitThunk(&pcb->thunk, dcCallback_x64_sysv); #endif dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64.h000066400000000000000000000025271225523575400244200ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64.h Description: Callback - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_X64_H_ #define DYNCALL_CALLBACK_X64_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_x64.h" struct DCCallback { DCThunk thunk; // offset 0, size 24 DCCallbackHandler* handler; // offset 24 void* userdata; // offset 32 }; #endif /* DYNCALL_CALLBACK_X64_H_ */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64_apple.s000066400000000000000000000064321225523575400256130ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64_apple.s Description: Callback Thunk - Implementation for x64 (Apple as assembly) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .intel_syntax .text /* sizes */ .set DCThunk_size , 24 .set DCArgs_size , 128 .set DCValue_size , 8 /* frame local variable offsets relative to %rbp*/ .set FRAME_arg0 , 16 .set FRAME_return , 8 .set FRAME_parent , 0 .set FRAME_DCArgs ,-128 .set FRAME_DCValue ,-136 /* struct DCCallback */ .set CTX_thunk , 0 .set CTX_handler , 24 .set CTX_userdata , 32 .set DCCallback_size , 40 .globl _dcCallbackThunkEntry _dcCallbackThunkEntry: pushq %rbp movq %rbp, %rsp // initialize DCArgs // float parameters (8 registers spill to DCArgs) sub %rsp, 8*8 movq [%rsp+8*7], %xmm7 # struct offset 120: float parameter 7 movq [%rsp+8*6], %xmm6 # struct offset 112: float parameter 6 movq [%rsp+8*5], %xmm5 # struct offset 104: float parameter 5 movq [%rsp+8*4], %xmm4 # struct offset 96: float parameter 4 movq [%rsp+8*3], %xmm3 # struct offset 88: float parameter 3 movq [%rsp+8*2], %xmm2 # struct offset 80: float parameter 2 movq [%rsp+8*1], %xmm1 # struct offset 72: float parameter 1 movq [%rsp+8*0], %xmm0 # struct offset 64: float parameter 0 // integer parameters (6 registers spill to DCArgs) pushq %r9 # struct offset 56: parameter 5 pushq %r8 # struct offset 48: parameter 4 pushq %rcx # struct offset 40: parameter 3 pushq %rdx # struct offset 32: parameter 2 pushq %rsi # struct offset 24: parameter 1 pushq %rdi # struct offset 16: parameter 0 // register counts for integer/pointer and float regs # struct offset 12: fcount pushq 0 # struct offset 8: icount lea %rdx, [%rbp+FRAME_arg0] # struct offset 0: stack pointer pushq %rdx mov %rsi, %rsp # parameter 1 (RSI) = DCArgs* // initialize DCValue pushq 0 # structo offset 0: return value (max long long) // call handler( *ctx, *args, *value, *userdata) mov %rdi, %rax # parameter 0 (RDI) = DCCallback* (RAX) mov %rcx, [%rdi+CTX_userdata] # arg3 = userdata* mov %rdx, %rsp # arg2 (RDX) = DCValue* pushq 0 # align to 16 bytes call [%rax+CTX_handler] // pass return type via registers // distinguish two basic classes 'integer' and 'float' mov %dl, %al movq %rax, [%rbp+FRAME_DCValue] ASCII_f = 102 ASCII_d = 100 cmpb %dl, ASCII_f je .float cmpb %dl, ASCII_d jne .return .float: movd %xmm0, %rax .return: mov %rsp, %rbp pop %rbp ret nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64_gas.s000066400000000000000000000064661225523575400252730ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64_gas.s Description: Callback Thunk - Implementation for x64 (GNU as assembler) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .intel_syntax .text .globl dcCallbackThunkEntry /* sizes */ .set DCThunk_size , 24 .set DCArgs_size , 128 .set DCValue_size , 8 /* frame local variable offsets relative to %rbp*/ .set FRAME_arg0 , 16 .set FRAME_return , 8 .set FRAME_parent , 0 .set FRAME_DCArgs ,-128 .set FRAME_DCValue ,-136 /* struct DCCallback */ .set CTX_thunk , 0 .set CTX_handler , 24 .set CTX_userdata , 32 .set DCCallback_size , 40 dcCallbackThunkEntry: pushq %rbp movq %rbp, %rsp // initialize DCArgs // float parameters (8 registers spill to DCArgs) sub %rsp, 8*8 movq [%rsp+8*7], %xmm7 # struct offset 120: float parameter 7 movq [%rsp+8*6], %xmm6 # struct offset 112: float parameter 6 movq [%rsp+8*5], %xmm5 # struct offset 104: float parameter 5 movq [%rsp+8*4], %xmm4 # struct offset 96: float parameter 4 movq [%rsp+8*3], %xmm3 # struct offset 88: float parameter 3 movq [%rsp+8*2], %xmm2 # struct offset 80: float parameter 2 movq [%rsp+8*1], %xmm1 # struct offset 72: float parameter 1 movq [%rsp+8*0], %xmm0 # struct offset 64: float parameter 0 // fill integer parameters (6 registers spill to DCArgs) pushq %r9 # struct offset 56: parameter 5 pushq %r8 # struct offset 48: parameter 4 pushq %rcx # struct offset 40: parameter 3 pushq %rdx # struct offset 32: parameter 2 pushq %rsi # struct offset 24: parameter 1 pushq %rdi # struct offset 16: parameter 0 // fill register counts for integer/pointer and float regs pushq 0 # struct offset 12: fcount # struct offset 8: icount // fill argument stack pointer lea %rdx, [%rbp+FRAME_arg0] pushq %rdx # struct offset 0: stack pointer mov %rsi, %rsp # arg1 (RSI) = DCArgs* // initialize DCValue: pushq 0 # structo offset 0: return value (max long long) // call handler( *ctx, *args, *value, *userdata) mov %rdi, %rax # arg0 (RDI) = DCCallback* (RAX) mov %rcx, [%rdi+CTX_userdata] # arg3 = userdata* mov %rdx, %rsp # arg2 (RDX) = DCValue* pushq 0 # align to 16 bytes call [%rax+CTX_handler] // pass return type via registers // distinguish two basic classes 'integer' and 'float' mov %dl, %al movq %rax, [%rbp+FRAME_DCValue] cmp %dl, 'f' je .float cmp %dl, 'd' je .float .int: jmp .return .float: movd %xmm0, %rax .return: mov %rsp, %rbp pop %rbp ret nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64_gas_w64.s000066400000000000000000000056611225523575400257670ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64_gas_w64.s Description: Callback Thunk - Implementation for x64 (GNU as assembler) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .intel_syntax .text .globl dcCallbackThunkEntry /* sizes */ .set DCThunk_size , 24 .set DCArgs_size , 80 /* 128 */ .set DCValue_size , 8 /* frame local variable offsets relative to %rbp*/ .set FRAME_arg0 , 48 /* 16 */ .set FRAME_return , 8 .set FRAME_parent , 0 .set FRAME_DCArgs , -80 /* -128 */ .set FRAME_DCValue , -80 /* -136 */ /* struct DCCallback */ .set CTX_thunk , 0 .set CTX_handler , 24 .set CTX_userdata , 32 .set DCCallback_size , 40 dcCallbackThunkEntry: pushq %rbp movq %rbp, %rsp // initialize DCArgs // float parameters (4 registers spill to DCArgs) sub %rsp, 4*8 movq [%rsp+8*3], %xmm3 # struct offset 72: float parameter 3 movq [%rsp+8*2], %xmm2 # struct offset 64: float parameter 2 movq [%rsp+8*1], %xmm1 # struct offset 56: float parameter 1 movq [%rsp+8*0], %xmm0 # struct offset 48: float parameter 0 // fill integer parameters (4 registers spill to DCArgs) pushq %r9 # struct offset 40: int parameter 3 pushq %r8 # struct offset 32: int parameter 2 pushq %rdx # struct offset 24: int parameter 1 pushq %rcx # struct offset 16: int parameter 0 // fill register counts for integer/pointer and float regs pushq 0 # struct offset 8: register count // fill argument stack pointer lea %rdx, [%rbp+FRAME_arg0] pushq %rdx # struct offset 0: stack pointer mov %rdx, %rsp # arg1 (RDX) = DCArgs* // initialize DCValue: // pushq 0 # structo offset 0: return value (max long long) // call handler( *ctx, *args, *value, *userdata) mov %rcx, %rax # arg0 (RCX) = DCCallback* (RAX) mov %r9, [%rax+CTX_userdata] # arg3 (R9) = userdata* mov %r8, %rsp # arg2 (RDX) = DCValue* sub %rsp, 4*8 # make foom for spill area and call call [%rax+CTX_handler] // pass return type via registers // distinguish two basic classes 'integer' and 'float' movq %rax, [%rbp+FRAME_DCValue] movd %xmm0, %rax mov %rsp, %rbp pop %rbp ret nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x64_masm.asm000066400000000000000000000066251225523575400257710ustar00rootroot00000000000000;////////////////////////////////////////////////////////////////////////////// ; ; Copyright (c) 2007-2009 Daniel Adler , ; Tassilo Philipp ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ;////////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////// ; ; Package: dyncall ; Library: dyncallback ; File: dyncallback/dyncall_callback_x64_masm.asm ; Description: Callback Thunk - MASM implementation for x64 ; ;/////////////////////////////////////////////////////////////////////// .CODE ; sizes DCThunk_size = 24 DCArgs_size = 80 DCValue_size = 8 ; frame local variable offsets relative to rbp FRAME_arg0 = 48 FRAME_DCArgs = -80 FRAME_DCValue = -80 ; struct DCCallback CTX_thunk = 0 CTX_handler = 24 CTX_userdata = 32 DCCallback_size = 40 dcCallbackThunkEntry PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE ; prolog push rbp mov rbp, rsp ; initialize DCArgs ; float parameters (4 registers spill to DCArgs) sub rsp, 4*8 movq qword ptr[rsp+8*3], xmm3 ; struct offset 72: float parameter 3 movq qword ptr[rsp+8*2], xmm2 ; struct offset 64: float parameter 2 movq qword ptr[rsp+8*1], xmm1 ; struct offset 56: float parameter 1 movq qword ptr[rsp+8*0], xmm0 ; struct offset 48: float parameter 0 ; integer parameters (4 registers spill to DCArgs) push r9 ; struct offset 40: int parameter 3 push r8 ; struct offset 32: int parameter 2 push rdx ; struct offset 24: int parameter 1 push rcx ; struct offset 16: int parameter 0 push 0 ; struct offset 8: register count lea rdx, [rbp+FRAME_arg0] ; struct offset 0: stack pointer push rdx mov rdx, rsp ; parameter 1 (RDX) = DCArgs* ;push 0 ; @@@ needed??? (don't think so - already aligned)... @@@ align to 16 bytes and provide long long for return value DCValue ; call handler( *ctx, *args, *value, *userdata) mov rcx, rax ; parameter 0 (RCX) = DCCallback* (RAX) mov r9, [rax+CTX_userdata] ; parameter 3 (R9) : void* userdata mov r8, rsp ; parameter 2 (R8) : DCValue* value ; make room for spill area and call sub rsp, 4*8 call qword ptr[rax+CTX_handler] ; Always put return value in rax and xmm0 (so we get ints and floats covered) mov rax, [rbp+FRAME_DCValue] movd xmm0, rax ; epilog mov rsp, rbp pop rbp ret dcCallbackThunkEntry ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x86.c000066400000000000000000000137751225523575400244260ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86.c Description: Callback - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_x86.h" #include "dyncall_args_x86.h" #include "dyncall_alloc_wx.h" #include "dyncall_signature.h" /* * assembly thunk entry for callbacks */ extern void dcCallbackThunkEntry(); /* compute stacksize for callee cleanup calling conventions: * * stdcall,fastcall_ms,fastcall_gnu */ static int dcbCleanupSize_x86_cdecl(const char* signature) { return 0; } static int dcbCleanupSize_x86_std(const char* signature) { const char* ptr = signature; int size = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_this_ms(const char* signature) { const char* ptr = signature; int size = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_fast_ms(const char* signature) { const char* ptr = signature; int size = 0; int regs = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: if (regs < 2) regs++; else size += 4; break; case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: size += 8; break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_fast_gnu(const char* signature) { const char* ptr = signature; char ch; int size = 0; int regs = 0; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: size += 8; break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: regs = 2; size += 8; break; default: if (regs < 2) regs++; else size += 4; break; } } return size; } void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; int mode; pcb->handler = handler; pcb->userdata = userdata; ptr = signature; ch = *ptr; /* x86 hints: */ mode = DC_CALL_C_X86_CDECL; if(ch == DC_SIGCHAR_CC_PREFIX) { ptr++; ch = *ptr++; switch(ch) { case DC_SIGCHAR_CC_STDCALL: mode = DC_CALL_C_X86_WIN32_STD; break; case DC_SIGCHAR_CC_THISCALL_MS: mode = DC_CALL_C_X86_WIN32_THIS_MS; break; case DC_SIGCHAR_CC_FASTCALL_GNU: mode = DC_CALL_C_X86_WIN32_FAST_GNU; break; case DC_SIGCHAR_CC_FASTCALL_MS: mode = DC_CALL_C_X86_WIN32_FAST_MS; break; } } /* x86 configuration: */ switch(mode) { case DC_CALL_C_X86_CDECL: pcb->args_vt = &dcArgsVT_default; pcb->stack_cleanup = dcbCleanupSize_x86_cdecl(ptr); break; case DC_CALL_C_X86_WIN32_STD: pcb->args_vt = &dcArgsVT_default; pcb->stack_cleanup = dcbCleanupSize_x86_std(ptr); break; case DC_CALL_C_X86_WIN32_THIS_MS: pcb->args_vt = &dcArgsVT_this_ms; pcb->stack_cleanup = dcbCleanupSize_x86_this_ms(ptr); break; case DC_CALL_C_X86_WIN32_FAST_MS: pcb->args_vt = &dcArgsVT_fast_ms; pcb->stack_cleanup = dcbCleanupSize_x86_fast_ms(ptr); break; case DC_CALL_C_X86_WIN32_FAST_GNU: pcb->args_vt = &dcArgsVT_fast_gnu; pcb->stack_cleanup = dcbCleanupSize_x86_fast_gnu(ptr); break; } } /* * callback constructor */ DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } /* * free */ void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x86.h000066400000000000000000000033061225523575400244200ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86.h Description: Callback - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_X86_H_ #define DYNCALL_CALLBACK_X86_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_x86.h" struct DCCallback { DCThunk thunk; /* offset 0, size 16 */ DCCallbackHandler* handler; /* offset 16 */ DCArgsVT* args_vt; /* offset 20 */ size_t stack_cleanup; /* offset 24 */ void* userdata; /* offset 28 */ }; int dcCleanupSize_x86_cdecl (const char* args_signature); int dcCleanupSize_x86_std (const char* args_signature); int dcCleanupSize_x86_fast_ms (const char* args_signature); int dcCleanupSize_x86_fast_gnu(const char* args_signature); #endif /* DYNCALL_CALLBACK_X86_H_ */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x86_apple.s000066400000000000000000000057221225523575400256200ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86_apple.s Description: Callback Thunk - Implementation for x86 on Darwin/Apple's as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .file "dyncall_callback_x86_apple.s" .intel_syntax .globl _dcCallbackThunkEntry DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 ASCII_L = 76 ASCII_l = 108 ASCII_d = 100 ASCII_f = 102 ASCII_i = 105 ASCII_v = 118 _dcCallbackThunkEntry: push %ebp mov %ebp, %esp // local variable frame_CTX push %eax # EAX = CTX* // initialize DCArgs push 0 # fast_count push %edx # fast_data[1] push %ecx # fast_data[0] lea %ecx, [%ebp+frame_arg0] # compute arg stack address push %ecx # stack_ptr push [%eax+CTX_pargsvt] # virtual table* mov %ecx, %esp # ECX = DCArgs* // initialze DCValue push 0 push 0 mov %edx, %esp # EDX = DCValue* // align 16 bytes add esp, 15 /* align size to 16 byte */ and esp, -16 // call handler push [%eax+CTX_userdata] # userdata push %edx # DCValue* push %ecx # DCArgs* push %eax # DCCallback* call [%eax+CTX_phandler] // cleanup stack mov %esp, %ebp # reset esp to frame pop %ecx # skip parent frame pop %ecx # pop return-address mov %edx, [%ebp+frame_CTX] add %esp, [%edx+CTX_stack_cleanup] # cleanup stack push %ecx # push back return address lea %edx, [%ebp+frame_DCValue] mov %ebp, [%ebp] # EBP = parent frame // handle return value cmp %al, ASCII_v je .return_void cmp %al, ASCII_d je .return_f64 cmp %al, ASCII_f je .return_f32 cmp %al, ASCII_l je .return_i64 cmp %al, ASCII_L je .return_i64_ // All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case .return_i32: mov %eax, [%edx] ret .return_i64: .return_i64_: mov %eax, [%edx] mov %edx, [%edx+4] ret .return_f32: fld dword ptr [%edx] ret .return_f64: fld qword ptr [%edx] ret .return_void: ret nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x86_gas.S000066400000000000000000000056731225523575400252360ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86_gas.S Description: Callback Thunk - Implementation for x86 in GNU as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .intel_syntax .text #include "../dyncall/dyncall_macros.h" #if defined(DC__OS_Win32) || defined(DC__OS_Cygwin) || defined(DC__OS_MinGW) || defined(DC__OS_Minix) #define CSYM(X) _##X #else #define CSYM(X) X #endif .globl CSYM(dcCallbackThunkEntry) DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 CSYM(dcCallbackThunkEntry): push %ebp mov %ebp, %esp # local variable frame_CTX push %eax # EAX = CTX* # initialize DCArgs push 0 # fast_count push %edx # fast_data[1] push %ecx # fast_data[0] lea %ecx, [%ebp+frame_arg0] # compute arg stack address push %ecx # stack_ptr push [%eax+CTX_pargsvt] # virtual table* mov %ecx, %esp # ECX = DCArgs* # initialze DCValue push 0 push 0 mov %edx, %esp # EDX = DCValue* # call handler (context) push [%eax+CTX_userdata] # userdata push %edx # DCValue* push %ecx # DCArgs* push %eax # DCCallback* call [%eax+CTX_phandler] # cleanup stack mov %esp, %ebp # reset esp to frame pop %ecx # skip parent frame pop %ecx # pop return-address mov %edx, [%ebp+frame_CTX] add %esp, [%edx+CTX_stack_cleanup] # cleanup stack push %ecx # push back return address lea %edx, [%ebp+frame_DCValue] mov %ebp, [%ebp] # EBP = parent frame # handle return value cmp %al, 'v' je .return_void cmp %al, 'd' je .return_f64 cmp %al, 'f' je .return_f32 cmp %al, 'l' je .return_i64 cmp %al, 'L' je .return_i64_ # All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case) .return_i32: mov %eax, [%edx] ret .return_i64: .return_i64_: mov %eax, [%edx] mov %edx, [%edx+4] ret .return_f32: fld dword ptr [%edx] ret .return_f64: fld qword ptr [%edx] ret .return_void: ret nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_callback_x86_masm.asm000066400000000000000000000067221225523575400257730ustar00rootroot00000000000000;////////////////////////////////////////////////////////////////////////////// ; ; Copyright (c) 2007-2009 Daniel Adler , ; Tassilo Philipp ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ;////////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////// ; ; Package: dyncall ; Library: dyncallback ; File: dyncallback/dyncall_callback_x86_msvc.asm ; Description: Callback Thunk - MASM implementation for x86 ; ;/////////////////////////////////////////////////////////////////////// .386 .MODEL FLAT .CODE DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 _dcCallbackThunkEntry PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp ; local variable frame_CTX push eax ; EAX = CTX* ; initialize DCArgs push 0 ; fast_count push edx ; fast_data[1] push ecx ; fast_data[0] lea ecx, [ebp+frame_arg0] ; compute arg stack address push ecx ; stack_ptr push [eax+CTX_pargsvt] ; virtual table* mov ecx, esp ; ECX = DCArgs* ; initialze DCValue push 0 push 0 mov edx, esp ; EDX = DCValue* ; call handler (context push [eax+CTX_userdata] ; userdata push edx ; DCValue* push ecx ; DCArgs* push eax ; DCCallback* call dword ptr[eax+CTX_phandler] ; cleanup stack mov esp, ebp ; reset esp to frame pop ecx ; skip parent frame pop ecx ; load return address mov edx, [ebp+frame_CTX] add esp, [edx+CTX_stack_cleanup] ; cleanup stack push ecx ; push back return address lea edx, [ebp+frame_DCValue] mov ebp, [ebp] ; EBP = parent frame ; handle return value cmp al, 'v' je return_void cmp al, 'd' je return_f64 cmp al, 'f' je return_f32 cmp al, 'l' je return_i64 cmp al, 'L' je return_i64 ; All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case return_i32: mov eax, [edx] ret return_i64: mov eax, [edx] mov edx, [edx+4] ret return_f32: fld dword ptr [edx] ret return_f64: fld qword ptr [edx] ret return_void: ret _dcCallbackThunkEntry ENDP END nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk.c000066400000000000000000000027611225523575400233070ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk.c Description: Thunk - Implementation Back-end selection License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" #if defined(DC__Arch_Intel_x86) # include "dyncall_thunk_x86.c" #elif defined(DC__Arch_AMD64) # include "dyncall_thunk_x64.c" #elif defined(DC__Arch_PowerPC) # include "dyncall_thunk_ppc32.c" #elif defined(DC__Arch_ARM_ARM) #include "dyncall_thunk_arm32_arm.c" #elif defined(DC__Arch_ARM_THUMB) #include "dyncall_thunk_arm32_thumb.c" #elif defined(DC__Arch_Sparc) #include "dyncall_thunk_sparc32.c" #elif defined(DC__Arch_Sparcv9) #include "dyncall_thunk_sparc64.c" #endif nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk.h000066400000000000000000000045141225523575400233120ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk.h Description: Thunk - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_H #define DYNCALL_THUNK_H /** ** dyncall thunks ** ** thunks are small-size hybrid code/data objects, created at run-time to ** be used as function pointers with associated data and entry functions. ** ** The header contains code, that does load its address into a designated scratch ** register and will jump to a thunk function. ** ** Thunk entry procedures are compiled functions, that are called as a result of ** a thunk function. ** There is one thunk entry currently for supporting callbacks. ** ** Thunk context register ( ::= an available scratch register in the calling convention): ** ** x86: eax ** x64: rax ** ppc: r2 ** **/ #include "../dyncall/dyncall_macros.h" typedef struct DCThunk_ DCThunk; #ifdef __cplusplus extern "C" { #endif void dcbInitThunk(DCThunk* p, void (*entry)()); #if defined(DC__Arch_Intel_x86) #include "dyncall_thunk_x86.h" #elif defined (DC__Arch_AMD64) #include "dyncall_thunk_x64.h" #elif defined (DC__Arch_PowerPC) #include "dyncall_thunk_ppc32.h" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_thunk_arm32_arm.h" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_thunk_arm32_thumb.h" #elif defined (DC__Arch_Sparc) #include "dyncall_thunk_sparc32.h" #elif defined (DC__Arch_Sparcv9) #include "dyncall_thunk_sparc64.h" #endif #ifdef __cplusplus } #endif #endif /* DYNCALL_THUNK_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.c000066400000000000000000000033301225523575400251430ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_arm.c Description: Thunk - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* # ARM32 (ARM mode) thunk code: .code 32 sub %r12, %r15, #8 ldr %r15, [%r15, #-4] */ /* This code loads 'entry+8' into r15. The -4 is needed, because r15 as */ /* program counter points to the current instruction+8, but the pointer */ /* to the code to execute follows the ldr instruction directly. Add 8 to */ /* entry for similar reasons. NOTE: Latter seems to be implicit with */ /* latest update of arm-eabi tools. */ p->code[0] = 0xe24fc008UL; /* sub %r12, %r15, #8 */ p->code[1] = 0xe51ff004UL; /* ldr %r15, [%r15, #-4] */ p->entry = entry/*+8*/; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.h000066400000000000000000000023261225523575400251540ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_arm.h Description: Thunk - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_ARM32_ARM_H #define DYNCALL_THUNK_ARM32_ARM_H struct DCThunk_ { unsigned int code[2]; void (*entry)(); }; #define DCTHUNK_ARM32_ARM_SIZE 12 #endif /* DYNCALL_THUNK_ARM32_ARM_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c000066400000000000000000000022451225523575400255070ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_thumb.c Description: Thunk - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk_arm32_arm.c" /* Since we can mix ARM and THUMB */ /* assembly, reuse the ARM mode code */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h000066400000000000000000000023421225523575400255120ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_thumb.h Description: Thunk - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_ARM32_THUMB_H #define DYNCALL_THUNK_ARM32_THUMB_H #include "dyncall_thunk_arm32_arm.h" /* Uses same code as ARM mode. */ #define DCTHUNK_ARM32_THUMB_SIZE 12 #endif /* DYNCALL_THUNK_ARM32_THUMB_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.c000066400000000000000000000033571225523575400243200ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc32.c Description: Thunk - Implementation for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" unsigned short hi16(unsigned int x) { return ( (unsigned short) (((unsigned int)x)>>16UL) ); } unsigned short lo16(unsigned int x) { return ( (unsigned short) ((unsigned int)x) ); } void dcbInitThunk(DCThunk* p, void (*entry)()) { /* ppc32 thunk code: lis r2 , HI16(p) ori r2 , r2, LO16(p) lwz r12, 20(r2) mtctr r12 bctr */ p->code_load_hi = 0x3c40U; /* lis r2, HI16(p) */ p->addr_self_hi = hi16(p); p->code_load_lo = 0x6042U; /* ori r2, r2, LO16(p) */ p->addr_self_lo = lo16(p); p->code_jump[0] = 0x81820014U; /* lwz r12, 20(r2) */ p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[2] = 0x4e800420U; /* bctr */ p->addr_entry = entry; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.h000066400000000000000000000025751225523575400243260ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc32.h Description: Thunk - Header for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_PPC32_H #define DYNCALL_THUNK_PPC32_H struct DCThunk_ { unsigned short code_load_hi, addr_self_hi; /* offset: 0 */ unsigned short code_load_lo, addr_self_lo; /* offset: 4 */ unsigned int code_jump[3]; /* offset: 8 */ void (*addr_entry)(); /* offset: 20 */ }; #define DCTHUNK_SIZE_PPC32 24 #endif // DYNCALL_THUNK_PPC32_H nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.c000066400000000000000000000021461225523575400246410ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc32.c Description: Thunk - Implementation for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* not yet implemented */ } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.h000066400000000000000000000022751225523575400246510ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc32.h Description: Thunk - Header for sparc32 - not yet implemented License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_SPARC32_H #define DYNCALL_THUNK_SPARC32_H struct DCThunk_ { int x[4]; /* dummy */ }; #define DCTHUNK_SIZE_SPARC32 32 #endif /* DYNCALL_THUNK_SPARC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.c000066400000000000000000000021461225523575400246460ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc64.c Description: Thunk - Implementation for sparc64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* not yet implemented */ } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.h000066400000000000000000000022751225523575400246560ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc64.h Description: Thunk - Header for sparc64 - not yet implemented License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_SPARC64_H #define DYNCALL_THUNK_SPARC64_H struct DCThunk_ { int x[4]; /* dummy */ }; #define DCTHUNK_SIZE_SPARC64 32 #endif /* DYNCALL_THUNK_SPARC32_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_x64.c000066400000000000000000000026501225523575400240050ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x64.c Description: Thunk - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* # x64 thunk code: .intel_syntax thunk: lea rax, (rip) # copy RIP (=p?) to RAX and use address in jmp [rax+16] # 'entry' (stored at RIP+16) for jump nop nop nop entry: .resq 1 */ p->code[0] = 0xfffffffff9058d48ULL; p->code[1] = 0x9090900000000325ULL; p->entry = entry; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_x64.h000066400000000000000000000022521225523575400240100ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x64.h Description: Thunk - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_X64_H #define DYNCALL_THUNK_X64_H struct DCThunk_ { unsigned long long code[2]; void (*entry)(); }; #define DCTHUNK_X64_SIZE 24 #endif /* DYNCALL_THUNK_X64_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_x86.c000066400000000000000000000025261225523575400240130ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x86.c Description: Thunk - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* x86 thunk code: nop nop nop mov %eax, p jmp [%eax+12] nop */ p->code_load = 0xb8909090UL; /* nop;nop;nop;mov %eax, ... */ p->addr_self = p; p->code_jump = 0x900C60ffUL; /* jmp [%eax+12] ; nop */ p->addr_entry = entry; } nqp-2013.12.1/3rdparty/dyncall/dyncallback/dyncall_thunk_x86.h000066400000000000000000000023441225523575400240160ustar00rootroot00000000000000/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x86.h Description: Thunk - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_X86_H #define DYNCALL_THUNK_X86_H struct DCThunk_ { unsigned int code_load; void* addr_self; unsigned int code_jump; void (*addr_entry)(); }; #define DCTHUNK_X86_SIZE 16 #endif /* DYNCALL_THUNK_X86_H */ nqp-2013.12.1/3rdparty/dyncall/dyncallback/gen-masm.sh000066400000000000000000000003011225523575400223300ustar00rootroot00000000000000gcc -E -P -DGEN_MASM dyncall_callback_arch_x86.S | unix2dos >dyncall_callback_arch_x86_masm.asm gcc -E -P -DGEN_MASM dyncall_callback_arch_x64.S | unix2dos >dyncall_callback_arch_x64_masm.asm nqp-2013.12.1/3rdparty/dyncall/dynload/000077500000000000000000000000001225523575400174615ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/dynload/BSDmakefile000066400000000000000000000030511225523575400215110ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # library dynload bsdmake makefile # Copyright 2007-2011 Tassilo Philipp # BSDmakefile # #/////////////////////////////////////////////////// # # REVISIONS # 2009/03/23 dadler # * updated to use dynload and dynload_syms modules TOP = .. .include "$(TOP)/buildsys/bsdmake/prolog.bsdmake" # Overrides. LIBRARY = dynload # Modules to build. UNITS += dynload dynload_syms .if $(BUILD_ARCH) == x64 CFLAGS += -fPIC CXXFLAGS += -fPIC .endif .include "$(TOP)/buildsys/bsdmake/epilog.bsdmake" nqp-2013.12.1/3rdparty/dyncall/dynload/CMakeLists.txt000066400000000000000000000020211225523575400222140ustar00rootroot00000000000000# Package: dyncall # File: dynload/CMakeLists.txt # Description: DynLoad library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # add_library(dynload_s STATIC dynload.c dynload_syms.c) install(TARGETS dynload_s ARCHIVE DESTINATION lib) install(FILES dynload.h DESTINATION include) nqp-2013.12.1/3rdparty/dyncall/dynload/DynLoadConfig.cmake000066400000000000000000000001321225523575400231370ustar00rootroot00000000000000set(DYNLOAD_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dynload) set(DYNLOAD_LIBRARIES dynload_s) nqp-2013.12.1/3rdparty/dyncall/dynload/GNUmakefile000066400000000000000000000022411225523575400215320ustar00rootroot00000000000000# Package: dynload # File: dynload/GNUmakefile # Description: dynload library buildsys/gmake Makefile # License: # # Copyright (c) 2007,2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # TOP ?= .. GMAKE_TOP ?= $(TOP)/buildsys/gmake include $(GMAKE_TOP)/prolog.gmake TARGET_LIB = dynload UNITS = dynload dynload_syms INSTALL_HEADERS = dynload.h INSTALL_LIB = 1 include $(GMAKE_TOP)/epilog.gmake nqp-2013.12.1/3rdparty/dyncall/dynload/Makefile.M000066400000000000000000000003431225523575400213140ustar00rootroot00000000000000#include "../buildsys/dynmake/Makefile.base.M" all: _L(dynload_s) _L(dynload_s): _O(dynload) _O(dynload_syms) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dynload_s) nqp-2013.12.1/3rdparty/dyncall/dynload/Makefile.embedded000066400000000000000000000013671225523575400226600ustar00rootroot00000000000000MAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f Makefile.embedded TARGET = libdynload_s.a OBJS = dynload.o dynload_syms.o HEADERS = dynload.h all: ${TARGET} libdynload_s.a: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib .PHONY: all clean install osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="libtool" ARFLAGS="-static -o" ${MAKE_CMD} all sun-64bit: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all sun-gcc: CC=gcc CFLAGS="${CFLAGS} -fPIC" ${MAKE_CMD} all nqp-2013.12.1/3rdparty/dyncall/dynload/Makefile.generic000066400000000000000000000011761225523575400225410ustar00rootroot00000000000000SRCTOP ?= .. SRCDIR ?= . BLDDIR ?= ${SRCDIR} LIBNAME = dynload OBJS = dynload.o dynload_syms.o HEADERS = dynload.h LIB = lib${LIBNAME}_s.a all: ${LIB} .PHONY: all clean install RM ?= rm -f AR ?= ar MKLIB ?= ${AR} rcs MKDIR ?= mkdir INSTALL ?= install -p ${LIB}: ${OBJS} ${MKLIB} ${LIB} ${OBJS} clean: ${RM} ${OBJS} ${LIB} DESTDIR ?= /usr/local INSTALL_TOP ?= ${DESTDIR} INSTALL_INC ?= ${INSTALL_TOP}/include INSTALL_LIB ?= ${INSTALL_TOP}/lib install: ${MKDIR} -p ${INSTALL_INC} cd ${SRCDIR} ; ${INSTALL} ${HEADERS} ${INSTALL_INC} ${MKDIR} -p ${INSTALL_LIB} cd ${BLDDIR} ; ${INSTALL} ${LIB} ${INSTALL_LIB} nqp-2013.12.1/3rdparty/dyncall/dynload/Nmakefile000066400000000000000000000032471225523575400213050ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdynload_s.lib OBJS = dynload.obj dynload_syms.obj $(TARGETS): $(OBJS) echo Creating library $@ ... lib $(ARFLAGS) /OUT:"$@" $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdynload_s.a OBJS = dynload_unix.o $(TARGETS):# $(OBJS) echo Not building dynload: There is no dynload support on this platform. # echo Creating library $@ ... # $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake nqp-2013.12.1/3rdparty/dyncall/dynload/README.txt000066400000000000000000000056351225523575400211700ustar00rootroot00000000000000dynload / abstraction to run-time shared library services: - loading/unloading into the current process - symbol lookup - enumerating symbol tables - elf: support for DT_GNU_HASH Todo: - a.out format - support for different kind of symbols (exports,imports,sections,constants...) Notes on windows pe format: File Extension: dll Implementation: 1. Access to internals The handle returned by LoadLibrary() is a pointer to the PE header (which is a DOS header). Notes on elf: File Extension: so Variants: Two core classes are defined Elf 32- and 64-bit. Only one model is compiled in the library (the current run-time format). Dynamic symbol table: Symbol table layout: 1. Index 0 in any symbol table is used to represent undefined symbols. As such, the first entry in a symbol table (index 0) is always completely zeroed (type STT_NOTYPE), and is not used. 2. If the file contains any local symbols, the second entry (index 1) the symbol table will be a STT_FILE symbol giving the name of the file. 3. Section symbols. 4. Register symbols. 5. Global symbols that have been reduced to local scope via a mapfile. 6. For each input file that supplied local symbols, a STT_FILE symbol giving the name of the input file is put in the symbol table, followed by the symbols in question. 7. The global symbols immediately follow the local symbols in the symbol table. Local and global symbols are always kept separate in this manner, and cannot be mixed together. Dynamic symbol table handling seem to be different among platforms. Due to System V ABI, one get access to the dynamic symbol table through the DT_HASH entry in "DYNAMIC" Program Header. It does not work on x86 on a x86_64 linux 2.6 machine. A closer look to the binaries in /usr/lib32 revealed, there are differences: differences - elf32 has 21 sections - elf64 has (21 + 2) sections ".hash" ".eh_frame_hdr" - elf64 has ".rela.*" while elf32 has ".rel.*" in common: - both have a ".gnu.hash" section the ".gnu.hash" Idea: "GNU hash" method ([3]) Symbol Versioning: OS supported prelinking: linux has prelink irix has quickstart solaris has crle sparc uses STT_REGISTER: STT_REGISTER is The Sparc architecture has a concept known as a "register symbol". These symbols are used to validate symbol/register usage, and can also be used to initialize global registers. Other architectures don't use these. References: [1] Levin, R. John: Linkers & Loader [2] System V ABI [3] The cost of elf symbol hashing: http://blogs.sun.com/ali/entry/the_cost_of_elf_symbol [4] GNU Hash ELF Section: http://blogs.sun.com/ali/entry/gnu_hash_elf_sections [5] http://refspecs.freestandards.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/symversion.html [6] elf: http://greek0.net/elf.html [7] System V ABI Application Binary Interface - Draft 17 - December 2003 (SCO) : http://sco.com/developers/gabi/latest/contents.html nqp-2013.12.1/3rdparty/dyncall/dynload/TODO000066400000000000000000000017471225523575400201620ustar00rootroot00000000000000- RTLD_LAZY in darwin, why not in unix? - Failed On Open Solaris 11: In file included from dynload_syms.c:28: dynload_syms_elf.c:56: error: syntax error before "Elf_Dyn" dynload_syms_elf.c:56: warning: data definition has no type or storage class dynload_syms_elf.c: In function `dlSymsInit': dynload_syms_elf.c:155: error: `pDyn' undeclared (first use in this function) dynload_syms_elf.c:155: error: (Each undeclared identifier is reported only once dynload_syms_elf.c:155: error: for each function it appears in.) dynload_syms_elf.c:155: error: syntax error before ')' token dynload_syms_elf.c:160: error: `DT_NULL' undeclared (first use in this function) dynload_syms_elf.c:163: error: `DT_STRTAB' undeclared (first use in this function) dynload_syms_elf.c:164: error: `DT_SYMTAB' undeclared (first use in this function) dynload_syms_elf.c:165: error: `DT_HASH' undeclared (first use in this function) make: *** [dynload_syms.o] Error 1 DONE: - remove dependencies dyncall_{alloc,macros}.h nqp-2013.12.1/3rdparty/dyncall/dynload/dynMakefile000066400000000000000000000003161225523575400216340ustar00rootroot00000000000000all: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) nqp-2013.12.1/3rdparty/dyncall/dynload/dynload.c000066400000000000000000000024301225523575400212560ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload.c Description: Auto-include delegate to windows/posix-based dynamic linker. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OSFAMILY.h" #if defined(OSFAMILY_Windows) # include "dynload_windows.c" #elif defined(OSFAMILY_Unix) # include "../autovar/autovar_OS.h" # if defined(OS_Darwin) # include "dynload_darwin.c" # else # include "dynload_unix.c" # endif #endif nqp-2013.12.1/3rdparty/dyncall/dynload/dynload.h000066400000000000000000000036011225523575400212640ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload.h Description: public header for library dynload License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNLOAD_H #define DYNLOAD_H #ifdef __cplusplus extern "C" { #endif #ifndef DL_API #define DL_API #endif /* --- public api ---------------------------------------------------------- */ /* shared library loading and explicit symbol resolving */ typedef struct DLLib_ DLLib; DL_API DLLib* dlLoadLibrary(const char* libpath); DL_API void dlFreeLibrary(DLLib* pLib); DL_API void* dlFindSymbol(DLLib* pLib, const char* pSymbolName); /* symbol table enumeration - only for symbol lookup, not resolve */ typedef struct DLSyms_ DLSyms; DL_API DLSyms* dlSymsInit (const char* libPath); DL_API void dlSymsCleanup(DLSyms* pSyms); DL_API int dlSymsCount (DLSyms* pSyms); DL_API const char* dlSymsName (DLSyms* pSyms, int index); DL_API const char* dlSymsNameFromValue(DLSyms* pSyms, void* value); /* symbol must be loaded */ #ifdef __cplusplus } #endif #endif /* DYNLOAD_H */ nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_alloc.h000066400000000000000000000022631225523575400224410ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_alloc.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DL_ALLOC_H #define DL_ALLOC_H #ifndef dlAllocMem #include #define dlAllocMem malloc #endif #ifndef dlFreeMem #define dlFreeMem free #endif #endif /* DL_ALLOC_H */ nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_darwin.c000066400000000000000000000042461225523575400226310ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_darwin.c Description: dynload module for .dylib (mach-o darwin/OS X) files License: Copyright (c) 2007-2011 Olivier Chafik Minor bug-fix modifications by Daniel Adler. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_darwin.c dynload module for .dylib (mach-o darwin/OS X) files */ #include "dynload.h" #include "dynload_alloc.h" #include #include struct DLLib_ { char* libPath; void* handle; }; DLLib* dlLoadLibrary(const char* libPath) { void* handle; size_t len; DLLib* lib; handle = dlopen(libPath, RTLD_LAZY); if (!handle) return NULL; lib = (DLLib*)dlAllocMem(sizeof(DLLib)); lib->handle = handle; /* libPath might be null (self reference on image) [Daniel] */ if (libPath != NULL) { len = strlen(libPath); lib->libPath = (char*)dlAllocMem(len + 1); strcpy(lib->libPath, libPath); lib->libPath[len] = '\0'; } else { lib->libPath = NULL; } return lib; } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return dlsym(libHandle && libHandle->handle ? libHandle->handle : RTLD_DEFAULT, symbol); } void dlFreeLibrary(DLLib* libHandle) { if (!libHandle) return; dlclose(libHandle->handle); if (libHandle->libPath) dlFreeMem(libHandle->libPath); dlFreeMem(libHandle); } nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_syms.c000066400000000000000000000023001225523575400223250ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_syms.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dynload.h" #include "../autovar/autovar_ABI.h" #if defined(ABI_PE) #include "dynload_syms_pe.c" #elif defined(ABI_Mach) #include "dynload_syms_mach-o.c" #elif defined(ABI_ELF) #include "dynload_syms_elf.c" #else void dummy() { } #endif nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_syms_elf.c000066400000000000000000000120671225523575400231660ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_syms_elf.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp , Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OS.h" /* dynamic symbol resolver for elf */ #include "dynload.h" #if defined(OS_OpenBSD) # include # include #elif defined(OS_SunOS) # include #elif defined(OS_BeOS) # include #else # include #endif #if defined(__GLIBC__) # define _GNU_SOURCE # define __USE_GNU #endif /* defined(__GLIBC__) */ #include "dynload_alloc.h" #include #include #include #include #include #include #include #include #include /* run-time configuration 64/32 */ #if defined(OS_OpenBSD) #else # include "../autovar/autovar_ABI.h" # ifdef ABI_ELF64 typedef Elf64_Ehdr Elf_Ehdr; typedef Elf64_Phdr Elf_Phdr; typedef Elf64_Shdr Elf_Shdr; typedef Elf64_Sym Elf_Sym; # ifndef OS_SunOS typedef Elf64_Dyn Elf_Dyn; # endif typedef Elf64_Sxword Elf_tag; typedef Elf64_Addr Elf_Addr; # else # if defined(OS_BeOS) typedef struct Elf32_Ehdr Elf_Ehdr; typedef struct Elf32_Phdr Elf_Phdr; typedef struct Elf32_Shdr Elf_Shdr; typedef struct Elf32_Sym Elf_Sym; typedef struct Elf32_Dyn Elf_Dyn; typedef Elf32_Sword Elf_tag; typedef Elf32_Addr Elf_Addr; # else typedef Elf32_Ehdr Elf_Ehdr; typedef Elf32_Phdr Elf_Phdr; typedef Elf32_Shdr Elf_Shdr; typedef Elf32_Sym Elf_Sym; # ifndef OS_SunOS typedef Elf32_Dyn Elf_Dyn; # endif typedef Elf32_Sword Elf_tag; typedef Elf32_Addr Elf_Addr; # endif # endif #endif struct DLSyms_ { const char* pStrTab; Elf_Sym* pSymTab; size_t strTabSize; size_t nSymbols; Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */ int file; /* fd of lib */ size_t fileSize; /* filesize of open lib */ }; DLSyms* dlSymsInit(const char* libPath) { unsigned char* pMem; void* pSectionContent; int i; struct stat st; Elf_Shdr* pS; DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms)); memset(pSyms, 0, sizeof(DLSyms)); pSyms->file = open(libPath, O_RDONLY); stat(libPath, &st); pSyms->fileSize = st.st_size; pSyms->pElf_Ehdr = (Elf_Ehdr*) mmap((void*) NULL, pSyms->fileSize, PROT_READ, MAP_SHARED, pSyms->file, 0); #ifdef ABI_ELF32 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32); #else assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64); #endif assert(pSyms->pElf_Ehdr->e_phoff > 0); assert(pSyms->pElf_Ehdr->e_shoff > 0); pMem = (unsigned char*)pSyms->pElf_Ehdr; /* traverse section headers */ pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff ); /* skip section 0 which is always zero due to the Elf standard. */ for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++) { Elf_Shdr* pSection = &pS[i]; pSectionContent = ((char*)pMem) + pSection->sh_offset; switch (pSection->sh_type) { case SHT_DYNSYM: if (!pSyms->pSymTab) { pSyms->pSymTab = (Elf_Sym*)pSectionContent; pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize; } break; case SHT_STRTAB: // Do not trust pSyms->pElf_Ehdr->e_shstrndx! if (!pSyms->pStrTab) { pSyms->pStrTab = (const char*)pSectionContent; pSyms->strTabSize = pSection->sh_size; } break; } if (pSyms->pSymTab && pSyms->pStrTab) break; } return pSyms; } void dlSymsCleanup(DLSyms* pSyms) { munmap( (void*) pSyms->pElf_Ehdr, pSyms->fileSize); close(pSyms->file); dlFreeMem(pSyms); } int dlSymsCount(DLSyms* pSyms) { if (!pSyms) return 0; return pSyms->nSymbols; } const char* dlSymsName(DLSyms* pSyms, int index) { int str_index; if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols) return NULL; str_index = pSyms->pSymTab[index].st_name; if (str_index < 0 || str_index >= pSyms->strTabSize) return NULL; return &pSyms->pStrTab[str_index]; } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { Dl_info info; return (dladdr(value, &info) && (value == info.dli_saddr)) ? info.dli_sname : NULL; } nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_syms_mach-o.c000066400000000000000000000073061225523575400235640ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_syms_mach-o.c Description: License: Copyright (c) 2007-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynamic symbol resolver for Mach-O */ #include "dynload.h" #include "dynload_alloc.h" #include #include #include #include #if defined(ARCH_X64) #define MACH_HEADER_TYPE mach_header_64 #define SEGMENT_COMMAND segment_command_64 #define NLIST_TYPE nlist_64 #else #define MACH_HEADER_TYPE mach_header #define SEGMENT_COMMAND segment_command #define NLIST_TYPE nlist #endif struct DLLib_ { char* libPath; void* handle; }; struct DLSyms_ { const char* pStringTable; const struct NLIST_TYPE* pSymbolTable; uint32_t symbolCount; }; DLSyms* dlSymsInit(const char* libPath) { DLSyms* pSyms = NULL; uint32_t iImage, nImages; for (iImage = 0, nImages = _dyld_image_count(); iImage < nImages; iImage++) { const char* name = _dyld_get_image_name(iImage); if (name && !strcmp(name, libPath)) { const struct MACH_HEADER_TYPE* pHeader = (const struct MACH_HEADER_TYPE*) _dyld_get_image_header(iImage); const char* pBase = ((const char*)pHeader); if (pHeader->filetype != MH_DYLIB) return NULL; if (pHeader->flags & MH_SPLIT_SEGS) return NULL; if (pHeader) { uint32_t iCmd, nCmds = pHeader->ncmds; const struct load_command* cmd = (const struct load_command*)(pBase + sizeof(struct MACH_HEADER_TYPE)); for (iCmd = 0; iCmd < nCmds; iCmd++) { if (cmd->cmd == LC_SYMTAB) { const struct symtab_command* scmd = (const struct symtab_command*)cmd; pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); pSyms->symbolCount = scmd->nsyms; pSyms->pStringTable = pBase + scmd->stroff; pSyms->pSymbolTable = (struct NLIST_TYPE*)(pBase + scmd->symoff); return pSyms; } cmd = (const struct load_command*)(((char*)cmd) + cmd->cmdsize); } } break; } } return NULL; } void dlSymsCleanup(DLSyms* pSyms) { if (!pSyms) return; dlFreeMem(pSyms); } int dlSymsCount(DLSyms* pSyms) { if (!pSyms) return 0; return pSyms->symbolCount; } static const struct NLIST_TYPE* get_nlist(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl; if (!pSyms) return NULL; nl = pSyms->pSymbolTable + index; if (nl->n_un.n_strx <= 1) return NULL; // would be empty string anyway //TODO skip more symbols based on nl->n_desc and nl->n_type ? return nl; } const char* dlSymsName(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl = get_nlist(pSyms, index); if (!nl) return NULL; return pSyms->pStringTable + nl->n_un.n_strx; } void* dlSymsValue(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl = get_nlist(pSyms, index); if (!nl) return NULL; return (void*) (ptrdiff_t) (nl->n_value); } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { Dl_info info; if (!dladdr(value, &info) || (value != info.dli_saddr)) return NULL; return info.dli_sname; } nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_syms_pe.c000066400000000000000000000055411225523575400230230ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_syms_pe.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dynload.h" #include "dynload_alloc.h" #include struct DLLib_ { IMAGE_DOS_HEADER dos_header; }; struct DLSyms_ { DLLib* pLib; const char* pBase; const DWORD* pNames; const DWORD* pFuncs; const unsigned short* pOrds; size_t count; }; DLSyms* dlSymsInit(const char* libPath) { DLLib* pLib = dlLoadLibrary(libPath); DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms)); const char* base = (const char*) pLib; IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*) base; IMAGE_NT_HEADERS* pNTHeader = (IMAGE_NT_HEADERS*) ( base + pDOSHeader->e_lfanew ); IMAGE_DATA_DIRECTORY* pExportsDataDir = &pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; IMAGE_EXPORT_DIRECTORY* pExports = (IMAGE_EXPORT_DIRECTORY*) (base + pExportsDataDir->VirtualAddress); pSyms->pBase = base; pSyms->pNames = (DWORD*)(base + pExports->AddressOfNames); pSyms->pFuncs = (DWORD*)(base + pExports->AddressOfFunctions); pSyms->pOrds = (unsigned short*)(base + pExports->AddressOfNameOrdinals); pSyms->count = (size_t)pExports->NumberOfNames; pSyms->pLib = pLib; return pSyms; } void dlSymsCleanup(DLSyms* pSyms) { dlFreeLibrary(pSyms->pLib); dlFreeMem(pSyms); } int dlSymsCount(DLSyms* pSyms) { return (int)pSyms->count; } const char* dlSymsName(DLSyms* pSyms, int index) { return (const char*)((const char*)pSyms->pBase + pSyms->pNames[index]); } void* dlSymsValue(DLSyms* pSyms, int index) { return (void*)(pSyms->pBase + pSyms->pFuncs[pSyms->pOrds[index]]); } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { int i, c=dlSymsCount(pSyms); for(i=0; i, Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_unix.c dynload module for .so (unix) and .dylib (mach-o darwin/OS X) files */ #include "dynload.h" #include DLLib* dlLoadLibrary(const char* libPath) { return (DLLib*)dlopen(libPath,RTLD_NOW); } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return dlsym((void*)libHandle, symbol); } void dlFreeLibrary(DLLib* libHandle) { dlclose((void*)libHandle); } nqp-2013.12.1/3rdparty/dyncall/dynload/dynload_windows.c000066400000000000000000000030101225523575400230230ustar00rootroot00000000000000/* Package: dyncall Library: dynload File: dynload/dynload_windows.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_windows.c dynload module for .dll files */ #include "dynload.h" #include DLLib* dlLoadLibrary(const char* libPath) { if (libPath != NULL) { return (DLLib*) LoadLibraryA(libPath); /*return (DLLib*) LoadLibraryA(libPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);*/ } else { return (DLLib*) GetModuleHandle(NULL); } } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return (void*) GetProcAddress( (HINSTANCE)libHandle, symbol); } void dlFreeLibrary(DLLib* libHandle) { FreeLibrary( (HINSTANCE)libHandle ); } nqp-2013.12.1/3rdparty/dyncall/mkfile000066400000000000000000000022571225523575400172270ustar00rootroot00000000000000#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = . <$TOP/buildsys/mk/prolog.mk # directories: DIRS = dyncall AUTOS = ConfigVars #.PHONY: test doc test:V: cd $target; $MK doc:V: cd $target; $MK <$TOP/buildsys/mk/epilog.mk nqp-2013.12.1/3rdparty/dyncall/portasm/000077500000000000000000000000001225523575400175145ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/dyncall/portasm/README.txt000066400000000000000000000014711225523575400212150ustar00rootroot00000000000000portasm - a toolkit for writing portable generic assembler sources ------------------------------------------------------------------ Copyright (C) 2011 Daniel Adler . Licensed under BSD two-clause license. Requirements ------------ - C Preprocessor Supported Architectures and Tool-chains: ---------------------------------------- - x86: gas, apple as, masm - x64: gas, apple as, masm - ppc: gas, apple as - arm: gas, apple as Usage: ------ Implement assembler sources in *.S files which use C preprocessor. #include portasm-.S at front In order to generate MASM files for X86 and X64, run 'gen-masm.sh ' script which reads .S and outputs .masm file. Common Macros: -------------- BEGIN_ASM END_ASM BEGIN_PROC(name) END_PROC(name) GLOBAL(name) HEX(value) nqp-2013.12.1/3rdparty/dyncall/portasm/gen-masm.sh000066400000000000000000000000551225523575400215540ustar00rootroot00000000000000#!/bin/sh gcc -E -P -DGEN_MASM $1.S >$1.asm nqp-2013.12.1/3rdparty/dyncall/portasm/portasm-arm.S000066400000000000000000000022111225523575400220760ustar00rootroot00000000000000/* Package: dyncall Library: portasm File: portasm/portasm-arm.S Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define BEGIN_ASM .text #include "../autovar/autovar_OS.h" #if defined(OS_Darwin) #define GLOBAL_C(X) .globl _##X #define ENTRY_C(X) _##X: #else #define GLOBAL_C(X) .globl X #define ENTRY_C(X) X: #endif nqp-2013.12.1/3rdparty/dyncall/portasm/portasm-ppc.S000066400000000000000000000037501225523575400221120ustar00rootroot00000000000000/* Package: dyncall Library: portasm File: portasm/portasm-ppc.S Description: Portable Assembler Macros for ppc License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OS.h" #if defined(OS_Darwin) #define GLOBAL_C(X) .globl _##X #define ENTRY_C(X) _##X: #else #define GLOBAL_C(X) .globl X #define ENTRY_C(X) X: #define r0 0 #define r1 1 #define r2 2 #define r3 3 #define r4 4 #define r5 5 #define r6 6 #define r7 7 #define r8 8 #define r9 9 #define r10 10 #define r11 11 #define r12 12 #define r13 13 #define r14 14 #define r15 15 #define r16 16 #define r17 17 #define r18 18 #define r19 19 #define r20 20 #define r21 21 #define r22 22 #define r23 23 #define r24 24 #define r25 25 #define r26 26 #define r27 27 #define r28 28 #define r29 29 #define r30 30 #define r31 31 #define f0 0 #define f1 1 #define f2 2 #define f3 3 #define f4 4 #define f5 5 #define f6 6 #define f7 7 #define f8 8 #define f9 9 #define f10 10 #define f11 11 #define f12 12 #define f13 13 #define f14 14 #define f15 15 #define f16 16 #define f17 17 #define f18 18 #define f19 19 #define f20 20 #define f21 21 #define f22 22 #define f23 23 #define f24 24 #define f25 25 #define f26 26 #define f27 27 #define f28 28 #define f29 29 #define f30 30 #define f31 31 #endif nqp-2013.12.1/3rdparty/dyncall/portasm/portasm-x64-att.S000066400000000000000000000100061225523575400225270ustar00rootroot00000000000000/* Package: dyncall Library: portasm File: portasm/portasm-x64-att.S Description: Portable Assembler Macros for X64 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Common macros. */ #define XCONCAT(A,B) A##B #if defined(GEN_MASM) /* MASM syntax. */ .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) X ENDP # define PUSH(R) push R # define POP(R) pop R # define MOV(S,D) mov D,S # define MOVB(S,D) mov D,S # define MOVL(S,D) mov D,S # define ADDL(S,D) add D,S # define ANDL(S,D) and D,S # define SUBL(S,D) sub D,S # define SHRL(S,D) shr D,S # define MOVQ(S,D) movq D,S # define ADD(S,D) add D,S # define AND(S,D) and D,S # define SUB(S,D) sub D,S # define SHR(S,D) shr D,S # define MOVD(S,D) movd D,S # define RET() ret # define CALL_DWORD(R,OFF) call DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD(S,D) movsd D,S # define MOVSDX(S,D) movsdx D,S # define DWORD(R,OFF) dword ptr [R+OFF] # define QWORD(R,OFF) qword ptr [R+OFF] # define LIT(X) X # define INT(X) int X # define HEX(X) XCONCAT(X,h) # define CALL(X) call X # define CALL_REG(X) call X # define LEA(S,D) lea D,S # define SET(K,V) K = V # define JE(X) je X # define JNE(X) jne X # define CMP(A,B) cmp B,A # define LOCAL(X) X #else /* GNU/SunPro Assembler AT&T Syntax */ .text # define BEGIN_ASM # define END_ASM # include "../autovar/autovar_OS.h" # if defined (OS_Darwin) # define CSYM(X) _##X # else # define CSYM(X) X # endif # define RAX %rax # define RBX %rbx # define RCX %rcx # define RDX %rdx # define RSI %rsi # define RDI %rdi # define RBP %rbp # define RSP %rsp # define R8 %r8 # define R9 %r9 # define R10 %r10 # define R11 %r11 # define R12 %r12 # define R13 %r13 # define R14 %r14 # define R15 %r15 # define XMM0 %xmm0 # define XMM1 %xmm1 # define XMM2 %xmm2 # define XMM3 %xmm3 # define XMM4 %xmm4 # define XMM5 %xmm5 # define XMM6 %xmm6 # define XMM7 %xmm7 # define AL %al # define AH %ah # define BL %bl # define BH %bh # define CL %cl # define CH %ch # define DL %dl # define DH %dh # define GLOBAL(X) .globl CSYM(X) # define BEGIN_PROC(X) CSYM(X): # define END_PROC(X) # define PUSH(R) pushq R # define POP(R) popq R # define MOV(S,D) movq S,D # define MOVB(S,D) movb S,D # define MOVL(S,D) movl S,D # define ADDL(S,D) addl S,D # define ANDL(S,D) andl S,D # define SUBL(S,D) subl S,D # define SHRL(S,D) shrl S,D # define MOVQ(S,D) movq S,D # define ADD(S,D) addq S,D # define AND(S,D) andq S,D # define SUB(S,D) subq S,D # define SHR(S,D) shrq S,D # define MOVD(S,D) movd S,D # define RET() ret # define CALL_DWORD(R,OFF) call *DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD(S,D) movsd S,D # define DWORD(R,OFF) OFF(R) # define QWORD(R,OFF) OFF(R) # define LIT(X) $X # define INT(X) int X # define HEX(X) XCONCAT(0x,X) # define CALL(X) call X # define CALL_REG(X) call *X # define LEA(A,B) lea A,B # define CMP(A,B) cmp A,B # define CMPB(A,B) cmpb A,B # define JE(X) je X # define JNE(X) jne X # define FLDS(X) flds X # define FLDL(X) fldl X # define SET(K,V) .set K,V # define LOCAL(X) .X #endif nqp-2013.12.1/3rdparty/dyncall/portasm/portasm-x86.S000066400000000000000000000065761225523575400217660ustar00rootroot00000000000000/* Package: dyncall Library: portasm File: portasm/portasm-x86.S Description: Portable Assembler Macros for x86 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Common macros. */ #define XCONCAT(A,B) A##B /* MASM syntax. */ #if defined(GEN_MASM) .386 .MODEL FLAT .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) _##X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) _##X ENDP # define PUSH(R) push R # define POP(R) pop R # define MOVL(S,D) mov D,S # define ADDL(S,D) add D,S # define ANDL(S,D) and D,S # define SUBL(S,D) sub D,S # define SHRL(S,D) shr D,S # define RET() ret # define CALL_DWORD(R,OFF) call DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD movsd # define DWORD(R,OFF) dword ptr [R+OFF] # define QWORD(R,OFF) qword ptr [R+OFF] # define LIT(X) X # define INT(X) int X # define HEX(X) XCONCAT(X,h) # define CALL(X) call X # define LEA(S,D) lea D,S # define ADD(S,D) add D,S # define CMP(S,D) cmp D,S # define JE(T) je T # define FLDS(OP) fld OP # define FLDL(OP) fld OP # define LOCAL(NAME) NAME #else /* GNU/SunPro Assembler AT&T Syntax */ .text # define BEGIN_ASM # define END_ASM # include "../autovar/autovar_OS.h" # if defined(OS_Win32) || defined(OS_Cygwin) || defined(OS_MinGW) || defined(OS_Darwin) || defined(OS_Minix) # define CSYM(X) _##X # else # define CSYM(X) X # endif /* Systems that work without '%' prefix: MinGW,Apple */ # define EAX %eax # define EBX %ebx # define ECX %ecx # define EDX %edx # define ESI %esi # define EDI %edi # define EBP %ebp # define ESP %esp # define AL %al # define AH %ah # define BL %bl # define BH %bh # define CL %cl # define CH %ch # define DL %dl # define DH %dh # define GLOBAL(X) .globl CSYM(X) # define BEGIN_PROC(X) CSYM(X): # define END_PROC(X) # define PUSH(R) pushl R # define POP(R) popl R # define MOVL(S,D) movl S,D # define ADDL(S,D) addl S,D # define ANDL(S,D) andl S,D # define SUBL(S,D) subl S,D # define SHRL(S,D) shrl S,D # define RET() ret # define CALL_DWORD(R,OFF) call *DWORD(R,OFF) # define REP(X) rep; X # define MOVSB movsb # define MOVSW movsw # define MOVSD movsd # define DWORD(R,OFF) OFF(R) # define QWORD(R,OFF) OFF(R) # include "../autovar/autovar_CC.h" # if defined CC_SUN # define LIT(X) $X # else # define LIT(X) XCONCAT($,X) # endif # define INT(X) int X # define HEX(X) XCONCAT(0x,X) # define CALL(X) call X # define LEA(A,B) lea A,B # define CMP(A,B) cmp A,B # define JE(X) je X # define FLDS(X) flds X # define FLDL(X) fldl X # define ADD(A,B) add A,B # define LOCAL(X) .X #endif nqp-2013.12.1/3rdparty/jline/000077500000000000000000000000001225523575400155025ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/jline/LICENSE.txt000066400000000000000000000027211225523575400173270ustar00rootroot00000000000000Copyright (c) 2002-2006, Marc Prud'hommeaux All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nqp-2013.12.1/3rdparty/jline/jline-1.0.jar000066400000000000000000002620571225523575400176110ustar00rootroot00000000000000PK > META-INF/PK  >~"META-INF/MANIFEST.MFRn0 ?,|j K[>ĉ4@^6H_ߥ*MC/p|c0NGqtmOd_J:7 zRɪ d$,GK BōN_Iq>#45-Gn< ϩ{f@\hkc1SaU2JGt<{*)J`wvj8Too3 z[t~gOG/_gjڳv/I?rFɎf}N[rw"h[8 6s@nǶQ4r!YYPeǵPK >jline/PK  >Bȶ> jline/ANSIBuffer$ANSICodes.classTSEY܄ 6&]H 5l.,"8,,fpvDͪxTiUVy՛7˯{Wcq_ |Ӌ^tខ/בӊp X7aa`<[|m_L!.OO 3G5k\Bٞ](MYYXғ)Ҝ=UcXRi\2mtC_HW LŲJ_d:eEJ_P#,n~*R`.h[pq8.sVFM \foDύոO3XuZ[+n8xAjNؐLD&k̗EH;S}74=ٔQjB2 57#ZnV<+ٛΎ39D5 :v8{d PtN"n1sx ]mW%׃(x@_; Jkm1!tv~DA(+q"RW1k|Rq2wTGd.ֳ#$º;ݐзk2'A6.ʠ9q{b#G![]~Gqج2SyuŬ 7"NzY گ#پm_i5YBVwWF=rCa/8bv _b"p _Q1*k1#q+1|F<o׉o[o;bry1I ~|ƟB(8xmZ6 o&:&26 ?]$S4va<M*w1AXU NC0^+8َ`VE@' OĢaO$y~Jf}1Ns jline/ANSIBuffer.class[wUM3IhH/(i PTKh VI2MS8 ~,|⃰4eZ>{O1/g9{߾}ׯHp-=`1bnvU %ST[ey͸Y%^{Te٪AIs*4{ږc*V%'(Ό1Lyou73ꍏI6zDbewCpk8F%Nl@$#iWs|H:H8]4!=cv qgc:m$P5 "H@ɠ㱿Au=,ȧQs}$ &v&;|| b*ȬJ:kP?Gt6.k|5qWZC>(3ڟ/":'9+G+G+Gʋht"zԱuR ^;0M/^ƹ5&M61*H3^/^t+Ö#L[(x5ܠxF\_<;E:\^Nnѽulk9_!?#%HHېJIR 霔4$!͵!HI$6R~ z)逄t GJ$%1@RAto #X_1v4-=}u B;.>]sxSol_cR|gw%۸,k)\;0OY*=7gCzPK  >_R 7jline/ArgumentCompletor$AbstractArgumentDelimiter.classUSUȒHI HhHC"Z(MB[v,a!$tq>g|m2 :0v|;X=w7lSp{w_ЎI/¸̇+ aR54c_x|XPஂ|EKO,kfAXL0륌ocwD13SFA*uΓ%*f4be0ejk̕55M5Y(f"J:I z`3Q\[V>c[7tgې{.E{Fr\-1wdt/eh;MhjyLIM2d%)W8FY*ҩ9"8-#?P鄡K6. "_(dTVTPM lߪ3Jv޲ ^䤆* )jbW ^СAT DZOaU: VS@0iS1*2Ȫб"eVT"`z0 g+XW0 U_:^3DV]oaBZPƗd|LũV߉Zj o /}4J$)䟗'C=0a9ou@D#z`ij1D5h԰QdJ'k@?Ԁ iƓV@Wl,&$ϋMnKM]l]Z]46Bwz@Uک qfҁJ1 m?BW8oz7C_kr{ߺPndy6&Cf#tV$"$I4p.kWG=H;Y C0gm}ұ@. C ߐ>AC/l1N'_/]4 K67KMs=4;?#c~A =Ac' chf~&N YX,9։ ;<!boBo 9:0L}֌qoQ3\S#٦WRU}ul#e/[_,۶\I!&QFH(B,nS=#.dM ցFHT . .ڸJ4;1a0ӯ:|9%eIPMHCj[Nmv;vmzYbBQym8ٸK6;d% 1^j䥚g{PK  >#W~/jline/ArgumentCompletor$ArgumentDelimiter.classP;n@}!@\"4\!tthwp)8BY'BL17ix:0xx"VN`@&]"Rk63Z˖&yO#,Z9#u/'I9+OŮ4:WLI;bCxȵ&tWly!{?ַjK`Hҭ /=^-BNA8Y ! PK  >kP**jline/ArgumentCompletor$ArgumentList.classSKkQdt>ҤVd;PB ҍI:SLĥ;BD\(tB?%s3M\̹{w;:Pµ4B6E6&$$,F{v@Quzj(6nR[U ZNx@ܴ@:LA^Tz۰ƪkmolUkRdխ;z!! h[q]/7V˦VJIeoI<xoAY5^!B48*BRŲ U8KU1;O^PTݎ 3k^ۯw9?2CȠdR1`HWGvz:G$նz $=j&Or5uTi;q=xSOs ͜"fB7sz=Y;9t) Y3-&F Y1!=IĤ|t:ɐ pVœ%Ge|/)! Jr}vP %0 P6sgBvC:qzGr1>iztίcgȜF8zto9qv_}w"c zxDNȮ"(Bd4TdAH<Ⱦ." \RPK  >?M9jline/ArgumentCompletor$WhitespaceArgumentDelimiter.classRAOA]J-RZĆN%&MKMIͮvvpQ2Y$rp޼f~y 7.VPqmlpW4it> xg]UG-@fLh_~͒wڡ`l |GxB^yGB:oߐ=$#ؽ :6(#,dKYSaֱc97PK  >//$jline/ArgumentCompletor.classWw\Uy޹sӆI&8M2H(Z(iS"2Ln̄;ЂU, U[vjp-q\\~wLBFKWz>ۏϹg߽`1#B&fe(q]s:BDrXGVԽ2db+:PaAG8"9*bx9&E!Y>Ʒt\K÷eGd'5<*3~a<aPQ-Ͳ=al.sY/k5пβB~l4K<0PH옮!~R>S_(vJCKVo1VȸH[gs,B Ěa 7XeޮЛpRW nO;%rb|i*_d2`kCvV#Ƒ?ViDjѽOvDToLSGn@isHtXe?b5,7R\rq,QĆ4j9iL eB\`)UpJ:c:஖ـ6@)Ok׊N9%- |ŗ < = >lhخV($+۾Xʃ M' c^-u ÃbMVjmUJrǝҒnPɵ<ݫyߒY.s';NyjCZLב(2̥jٕV\^5KrkvU2I^‚Y.( y顙#Oy_ӺeʵJk R1~fE)GdSgIwsF|tKFicojqJ~uwwaGnl'TƍɁ8R EkC:Y_K߃&Woho`;]]nșh!0k,uiBv!'Y?u* y`s0munj[\iE7}t d*J~~q}A<Ḿ >4Пm~i1p \x"w9 d>::{W0+c lM\l>a-H#7-Rn>+9^=Ɔzx-$6JUw:<]:ܤT9J}u(~t8ح| 1M*jҍ#^ao,!!Nީ4漉C) q"!ƵPK  >&x*+jline/CandidateCycleCompletionHandler.classR[kA&f6jSwL /A1Xh$o!N̄݉`}*=3iT>̹~; 9{*xE/#*f 7RKjDjq6*r5tM0_e:+]3q+?R%f2UJ?P\PMAmUFF3$c3+Uvz/4d 0D5rNM!( GwS1u~bx/R{qkæ露=Ĉ mʹtVdva6m<24x̓{h%$}K= CHT"Mے9^:8$+>DdmC<"MׄBP\/"ðg*SkPn3϶q PK  >0K s*jline/CandidateListCompletionHandler.classW |e;ͤGڄnIK)ml 4@DC m (2L-eg6x\QSZ$KQPE[7{$mo߼}<ꃏhVsøqaqCbWa|MY-a|Xf|$L2,rP'UDvб'#Y8w; O[ψR|6a^E'!<BNL yxPI<0N.H%c|^ "EqK:ʓb˂+!<%J&:OqK欛H6o;[ޤN2L#HY:_!OlDZ mIMةMQQמ4SmrJ+Rh=xZ"p[ &ZUAk{-ݙ2=Ir;츙jf\`j@VtxXr,w}r9䴧lUpP<hQr줵2{dZʺzF$pz r3Txۓ?یErps1F)mKIQlƱ3}}y5g[iq-bM96zD$h0S&mjI+.0yULx eoJS_pr; ^Y,tjji/>؋J)accƴNIxC'fRF^]8 ["]FrP*hJ6{ԥ"@`Cqq|arl D-#a{"E㘥-H`Aq [b-@~ЩyNCNDž8hW73unY]@*(.1^xm^qL#H=3 jDk4e]cǼT?聗c&Vǵ6jKŰ+ȗyQ\yKN8u$t7!4NrNlucXt/Wa 0e]XÊ͡crn,i (T0x(94m"aeɚ6l&ܭPvӖ1êaHfpݐ#ynC$N$Z4r(HNda,->FU^öD}2 = & _/fm,&I6gDpp\<DZOx/3 *U<\jqR%=yW&Sh2}I,/A,_!-"i>в&- S%}c-$, hD卸0'^.)'`4x!O? ѹwNugXZ4Ɂ@x _Xίc&5Nve@yf+9F酘PŨǙ5Pձ =ZG|*$o Ii(ձq}w66}A4W71.*]#xcObvqlg"HNm8>,Sfz5PK  >Y/jline/CandidateListCompletionHandler.propertiesK,.IMNKLI,I-Rp)$(T*g&edd+hT*)ir`խ&o/JRҺ\\PK  >, -jline/ClassNameCompletor.classW |Uf36i6M6-RZ(ibn =HI2i&lvZVNJP ZPp4-ڂhEOo}=Ǐox @\̒Q[%&v|XwhGxS*Gy1 Q%Dw3q G'eT^§K'~< 𐌹E>Wx8/1|YF#Xc<<^ èƘ퀌z\q`TO) iP! _-p#{%<'c)vK:?7o- /o3;3h[lHY/U:gZ~Jk*.r=\Q ͚OwWEj1$̞ꋄA,!rŜvJ.I4Xۀ3*PVE{BV?03 Cwh6qmn^ f|j6RgC - 9ڜLՅ2t/ςӍ8YIc ۳vZmG2I6 u fgr[sF9-\CbjfHi69H:-M-Tp:"wMH W -gnv1fùa =Z+Ƃ;N~;T`r,môB0a*x?Rp^2&&'xJPΌ+UL+X 9NŦUp#v*x?%= 2#: ~W$\/K Rk*5cSSWV09X ڙr])vbW=IE\o;g $z2׼Τ? o,| VUw?%KqL_*njO.PR?83Oخ)T*JES $H+DךFNtoEYBQ rE"*D"B3'àH;`e;i"Nգ0?T0hnŬHmJXU,e4Ebi - pG82fnWP Y@oda17ɤ۵j7NFTT8 EI}m٢zߦ 槟rumI= M)D*I__AsIKo/Bfͭ3'm+"zxSidBVx M!UMj;of;hv/0&JukE}ye$l"'V1H6L+ 9 ;G/ NS S&QUtVk SkNj$^߯fDJS--Ց֢k9rlIH4(B kE.r^lմf*з*"mk?APyf7cZIO*ԉQ40OZ).zznQ.ud]ZM8Ty~HQB%i9e|/pWgyv9 +Jm sw$O`PVÌgQ*ۏ0cQCa̪De9YlQx$;0HHۇ0O=ܑ.};cs ǼЉiD4Uq2CА45 i4¾CX qN#@7z^W5uc5V`IAD} hE߃(?~rϵ鍁p ģa 6<}w4rwcqg?@4Jai 2y(4gp0K%lFpIFƱP-kwtbZxu~!쯈Wr^tAE7r^h \($CldOZTW-}uGR8^:Y؎sDZ h,QB\oPB*zI hgbq֊f+qXNq)D.6a U܄^q{qxI^\%%G1$^5MlsB0=襸!>ʗaQcq!DAHD FP~#H`‚6%k8L򮆗s8Yi>xvq3JWihҢ7/;e~ceShe._oGGhnyþ#ЫA}U~JEgui8yRQg@!aQw=NI":|oS+PCcu-r@'PK  >Sjline/CompletionHandler.class]M @ _:g!z8R Awdؑvx(qZх t ajOgÎ Iۼ7\DIJ^62ѥ]R>;?z^oHywW*?.f0l 1*?>I[am( 4xm oPK  >+jline/Completor.class;o>}NvvvF܂ԒTF5 IJDļt̼tkOPiIfOfq'#Wp~iQr[fP3Ā"=RF̼T}0#X6FF&`dad`f`X$PK  >#9N jline/ConsoleOperations.classeo#E7) G;ʑPz`$ƛ]'s{ G ~A娢7 B !ɍ$Ro_ zljG&zLP vflaf (rZ2- [P],,X6#gV_2+Ur2Y~2JHQ&Aw"KI%lzRNh4h\UHOn*ue5iyzp3)v;Fp5]oExc2 =8B,$ݤ f|9Ö +uq?rn;tUO\9Fé I1~G2_&SAƱt7A Z)RqkiZ@_fF55:,:&ա*B ZMU;\[%-ޤ[.cauT/{f FA G1ԴK L5%}zᵋ|U[I=S3sZ*1B{ӘGyb@GtJ&ܬMkۂFݤ`VVެh[(F2r"FhW3-?A{_fUzWdV[iԋut>WȕaZ3F\!vR#K`Na:NJ؛KrWlqB |8|Q[ࣙ{U>8x~xDOOe> > L೙0 [IX2Cp<8#.1g>0(<<O2_|!|p| ew1 epy91"<|s ^`.Ë̻+azx7 773||;w᪙{y/"~ZsT,?ԿLV7ޯ}PK  >J4/mjline/ConsoleReader.classͼy|TE8^BN0IH0 " I ę ]]ADx"JETvovUoU7oL&'uWWWWUWU>&)c\|_+Dp~ ?9+| W'o^.Nuox T\;\Oq!?Nwcy!@F*N4g38 g;9.c>s8wqyFB*.r]0ـ\?R*.r ]j_k]PDş8h| us #%VƷ;M.(]Tp-T5wTw:NrNw{%v>O*:i*z#^*bRW4N=8@w!u xj]?L{=I4!xg9j>O |˄JkT{}joRoSRSRS*>T|Jgs*$_Q5 I=Nm<S/ڙS#?TH\]PBu]ASL9 gЩH@DM$Q#Y)L`,xS~/"C ðƻ]"SdQ3[uN4HM1J]b8c 8*ƻD@07 ʥ",6īm rALbT(@G(M̤wٚ(v1Cűԭ^ϥvQFqZ|MGPra!͒KL[D+G%Uԥ)Wq<M,D&N 4:@[&N$'XnV zڃK=^Za: R+z{&zڛ&-M:-Ͽq,GXiji[| xi k`0@liT : ޹퍭^D/*[VYxeUIeY-4[Z?mt`uލ[q"_]W{[[=[ 6O`5^[{^?ZRQvAΠk{;VDa6$Ar֖v:S^Zgav+~yKELoRy{GgK Y̷Js !?sRkljÈ2Ж$8=3W%+ O64,ajX@k H(c[\Lb0Xv[|Z[xcpy{wwC'8J}T)2qafG[\=،PR=u3Sj t'y{ۃW4 襵"Um:1_uBmrCLQhZ5^O\7CZX)]9Cj`1C*0 ''LE+ߺD㵰U@K:D=xȼzky4ݰwm3R1_ױTVnl݌yvBg-R,q.G=g6j[$dJ&oβ9[ - #EȉKr+Whz bZ $PH=!'u7 a`s)MQpR4ɐ`ҹb-MH{:,e{r4$|Ȼ73JNԂZ3<ZѮ53tt juf.@]J3Y^Z tD1Z}P&d@c<q|7 a4S{DlKD˃6vC[d WDy< WNيk5t%7:+F]~{7r\+e%5 A< p @ ,kxRš@ķև=nbyah8F˰+R1!a v4QR2U԰ǣ"IKٙYJsKjh~JC]ȟ AzXjA7%^jRmK-t *uHlwt5n% )VlkP, Z;ȱdzH 4|'p*)1Rc<BF6}b .Hir5[L5b{c)d1-!%% "YjsنlzġK 77di>2&y*{$AqOtƔ E20k᪱5U.C 5C8C+ߐ]@CEq>"FGEϒfjO:ҷNׅ{ rx(ZAzIQhU*#}MkgtI:< ޒV$jt ,>VChW|eH{zwLy>RslQM5,xb*Ռ r4F~84̉1jdݖV;?t.>9B|2y0"]|%F#$a mWhz ]:Jڷ:-IĚv<.|BL5e;)ſH~u)o?:O:pgw3寴Qq%`܍-v6GtHf S;EWTš,D8 )q;uERFr,BUi)H8‡܊?'[IDv-$0ZK*?mOĈ{$OVQhq t%q+l'+H%%BIٝDͩ U2t>Ef;oln2ue$7%HNX/eE+#Qɀ#q:kg;/J u¢F?ziʺsː-+#lyhה-]Yݪ*\Aܢ򊊕F]]\R[OfemiMYY6N[f6%\[WRSz~Ej.(ք+ "WVQVgVWrF䚲e%u+mٓxmLP%e&x'f+D%ya6tQA+!j̭+[ F`>c"Nd+&Y8;b0ڲ~5 7&]6 ncj^ukYZRkJ+S^vB9`ȏ)T%skte2r4iV.ghXAl&SE^WyŠxF"Ĕq>&J?dBWř 4[:dr#Y|3vo3e[lZ!Ian"<@D3(ۖO'9uyi~+eIٻȯFA bFGKp0S"+J23uu~֧Ss-W59,%~g#1 e8rVkVgA8D_:tkA3_zdVeɘ9Xw5t Ttr=%b17ѬbH{L$&E΄Z#:pJ N3=h53#wBYe#WNj/ꭴF|<''}_jB!E|ʴL(Ԇ*& \_]}V`sQ<mn,A/'ȗ?dc$ty'IF&rmfVSf eB5t+e XwcA@z/Fd3ۙ)P=c׏F\nE`(SIZk fTs- /at1,oq!}~ 4OԵD-uˆkox~#aa)C͠ 4 b@['-π"Vʵ.lLJ } - +p=@@˩ط2 9j\ hH-Q'ihl(HWqFIv3/WI1:3=a\`Xdu[/> ǝ8P=t`/)%t%QʶQqR*RiX)/,byk;|uE>eX1ږ ݌hdCTEZyߔ oϙj4Uc!ǺoBoc2ݔGHfMDd0ac%0 2J2V. 3"x|(?8ʏ3r_ٿs޲Szvl/c &G2%s%[O~}kp/[#5Y|eդMΣQč p"Na~,Z ׁc8e+qik#1l=8 l#0Y;%q4qwn>p- e [Iɩ)}zap/Bz7Iάٙ]#B~eη\c0$;lЬuhr6g8C~ 테I=r՚$ޚ$ޘDA\c:Nms02bdQ-pw>hdepqXr:=<4|'c{pP{;u{`;')p=pLaJ MK E=PW4C9=pfLmz:CAQ zʝ:=pK3A9RPP{`Ud=P:2{PG }P, Z쁺¸ݰ$#n/,إЕ:4S.,vC|zaYō0g'3ʱD,F GEhqp*L3`6P破 a4І8l@2@#9[q @!)xֳ</K k% {3|Tel|Z)![a$;3%M|Pq|ea85]0bq%vˣq%D.akZ&68暶M3*3nR+dŰ[ &Yf'F#c[ZSc,lk?6eUfS(6!Ilƶ`S(dMl9x9XsI=pr"x@WF_s-X͈H0b_,ZMH} Ffp:F,tw@=fdn5k&κ|hӥDHc'gFNJ#IНl)_6l-̫zST4dk4R.taK6j$aﻈ$T'h£23yMpzfY;@CZLlny'S;/ynK4L7|)y<*gQм@J>vњ#3 2؅(/t)u9LgW,vkb'8]^p>.ٍv\|նu[,maKipۃ*iE%L#FYs?;mҟbI/3:I r"QPj6f(iGIs$Vo0)'TuCvfHO>6q3b3ox`&G;mџX v/}A{a4{J>E쇓C=u1ؓdʁ;s>eqœe!hg>)ɈAįHۿe1l~ "mCx 8"F:=?ɓXx7yk{u#cm6$NWo:<HY!)Oy=NC2xJxjbX-@E0R(J8',tf8C:C/Cە 2 .M۩+kWng$rȍ܉d{*>OgSwëb*گ-D59'J3]z`:pH{`|qk+c⢖Bi;lI6byNz^8lY 馺VH8ca.4tHwx~N|*vq0-b@Ŀ#Tc4ſnPǿawo=lLLw@Z^|.7ݻ ÿ1F=cXMrci*n V.'n۸Re\Dr1Uޗcwi =p>*@ܼ. N@H[xJ/\Ana֎fUJ!2+WSeV)8YMY[wQ^3-7L붘nx*ɓab-W`SHα ~ auJ#Y`jQY94^|`߉.< oЍ ![Q*[̉{`[n.0HU2`|^[nq?=AEOeC0{tq> {WP̾{8x O~C6 s\5\WlEݨtTx|| 5τ_p,b6cxVsjZDv&E|:`xǰx;ٓ|{\!~ 9Uɫ-Fkq/O3|x(^+[|x7y'o_f-_'~gSP0TFNe ߠL<~2g+9q|,*EJ_+~_l)gʹB~r ߮\oR(7[/.~T󻔧n ~._*?>OA5WG1VG"z \]ϟPOԭyfz7I_Q>z﨏ԧґxu+9W9Egct]ΔתXj ;$*ƚj{\dU9Sof7Tpt.BPʿ8Ϥd6NN׮lÑ?vd? ο1po%x3^ɷ|3GX|bOvձ7DӠ]Kf( =>Z&2)YջT_p#  "5Qaե" '44Av!fPf# R%*ɐ(R Yp1FtCmnK)Em7f>n@+V)vQy̓нnPN߁[zgB%_vvnS*w-?;{nJu= CPH5jO݅ HbRԀvy0PPp2eVvV- a.a}Gd.LP {>^O(pqGa4D y![LbL _L1fb(sa(yb,ZTBb1pREb9#Vd`b5 XRqecJacϣ$`̄V"W˸w@ {WЛ!)Nx2Q7o8cEY7Ia ^JҔF%ߤ`Mݸ? :@ 0TakSa8 B)2d2=U4J2p{[:xdxZۉf>܈z K녽}| $\ RrW21'0:&Y͋ ]&Ëyb+N0/QM^' )@A@e>JnxD1֝ T q97Yb;7xߌJ_R'#Fq7{'v[~% f9Gɡ: ƤCAFه(ŴzGʃe:*218ꜨZČ?Aްpd ( u ^G(EQ19:4R5h`qMRHxLi0֙z@5/t_萡Z*Hnx r{ؤISnx2xxΫ-MKN.|CSq6av;m;ÙX3G%!hycS|&QJ>i0LK6p.t:VVmd4 ,})MBWRM4 8d`Pٯ7 n- -?y|#P0JqY+ZkuPf6գwH@g2)cYLD{CTzQIyR?QG1/Y<JNˇdiLgج^xfSmp)SAWf@r ~v7~bݭtw9E-D^ӭKS"WvSq?"7l{hq$OZr,PӔ06;M#r{E%V_&<of5giFBe/:tޢNs|P΅d$|R0XJ-B/Vre IСNSVJ\4ZF? M< J΁v^aq 2 1Ϥ>p!ha=ߊ:~PU0&ݠFHuiʋ LU^"u74 +oR*:C)Va'UB>^uHϦzLhC6rw|&c%70c.w?N|HZ~(8h8~DF8٪T'Slrk-8WF7r"FW$i++o3We(XYh i*JݦכxN~#(AOpZ;Y 7Ly&@ AH5ƪC Òi0R` kN ~uWG[G`7 1㇑g,Ƀ9|0ՏY)Xs+MS+i=[v5!v :9Z_>-ZWWC~.-LlRa&($uP.RQuRC[ԕpJͦb 'hl70p-?r sQfQ‘l{ (?5?\Nڈ RfHW[p|g "9ɲ(˲SH ZڤӅpqSAQ]e&)R8ݩŌr."g Dg5 5v^z,Q6Z!7lF7E;!wU|QotNSˠ%Vبs颞u&Taz2hy.cՋaz ,Q/eRիh )`a?;1j)bhFFe1RgZ-/Č:~ӉMNlV[:6Y1w7˯#pN5(Q_%!ol'LR6: b1ƢcIts_Wם#^lxaB:nTc~ή 42qGpC3XkFs'-㳈m~s?Y/#g9,6.𦷆O<+Zuʠz,xx-[lSމ > '1cOa,W?6+tAKirQv373HZhr{QHC_~9`P1!tBJI eU{$ ӵ6<)Rkhfbɰ)}dؿcU &)}eV3wCOC}8b~FT)I e? ZRD`cݑ!22coqg<(1G<$8`#2I0ΑTG;lG:dPg82LH81 69F1qv=pG.vsc o:c:Kr`Ɏ,QȆ;xG̅* z4znĬ"+Kaғp5,]~zt'f9V2G'c0xy֙ [ɏ =l*> >3*_c:*aG 3!DsƓ qHn'W-+ꃟo smVqԃXi6b)>IX:[f*7'#L1pc~tkaնTC? §fa@~GޝDC_ymWz;2YPERʖ8: 1LqбPXs]0ϱr1ħIη04jX}J r.qd _qo>̍(qIүGcb\Fĺ3ш dl4!#!W @Lg dl4!W$"dR4!{߽!s1Mȃ1SgP7jࣶ5?Ca!/;&0~pGcY ]p/S;!w *se3kx<)f;Ώ/76c ^L06!YQ8:Yh(&!YQ8bR+=i!*9C1tɚ0<ڠdPǗ/#790љ!Pjk5sZ*k3HːhՇh Lrkx:ߢj| /Jy1mk뻙0$b>-eVˊ%>w"Oܑōa@.̅ [7jline/ConsoleReaderInputStream$ConsoleEnumeration.classT]O`~޵[]l1NVa5j2ѐLLoKג~?;o$x?xNiiԛsX G QA*C qHާ>kr"]h{dmC g!'5TeG$Ec O!|J$^Gr$LxPK  >rBRZF;jline/ConsoleReaderInputStream$ConsoleLineInputStream.classTKoQ. L-ڇZ* hBԔ)\at_qią[[.ܜ|7or(r.fMMƀUWpMV5⁴2.]Ǔu|Wn}ιUԋ9^C@T.E;S麔 fC35/ /Sە몉~vkvp>(ja8|wC$=y2(v#Xk.U:Cr?tc7(ݠ.;Li$,+fb7MaDML`t2:&`]A&ϝP8^E-WߓFxtf'}k- -;XIt)S6X?^ F,EX2I5I8krzH=CYy %zXl461k'unNvО ԧԫb[8K"Q*bf)ZH#YG,rHA;,>tf*(WQ.jIC^Pk[!}$f2ψsxYv4Donp_T \ %{T31 PK  >^&5[$jline/ConsoleReaderInputStream.classTn@=cǡ%iiizoj Z)RA+p嬋/> xHE$>Bn4–<9gwFOk0i - 젡ᡁxSxO1Cx-3m!x0!C)k;r}ɝٟl Cl#Ow2M3n 'EgKP>ẓ"+iۧ<8ޱs*P:􀇑p%w 7zIr.}49^2~8+. ',jline/ConsoleRunner.classWy|%{̥@BM-Cl[PL*.MHje0i^IJ6mzM#q JNgj;V-[;of73[?'ЁiiGC 2xN8OCT_ H|QŽހ7M Sf pE[Uw߮~ xߡ*ŏְЄ; CKN?c"ly+=!FOj؉OOkxQ1Qc++Q×0J_'o⒂i:2+l*i[ݎuR))+f\'cޤ@9avL{cs7gޠYxf撳mtL޸%M5'V3k5}I;DZNZK#{IY щAM{QƓJP`N>r<fX^s͜L7O;,;yac @z;y,4VHe f<2ZIgRYKCŷՎ^[/I(e1^J`[JDU*Usa֥wى)Rs';ܸP]*e:.*kȟ~G*F}%u\:儎8FI^!f'CAA,X :+:,ɲGEP𤎫;.irt0tie)q'm:>eGJTzj}@@DKt<4/?#<xe U":F1x\`Et1U@z]ҡm:~sHZD/+j_|˥-[ݏ_ ~w:~?ʂFBij?1r֊{:?+o:Eheh!ye 63ϣJ愓LR҄njm|~A4,fL*7#wپ(+a$.E4ǵDMs˶.xRD=ʏ/K993Xš]Sd) N6{ i39`ĀZpnTzxo!vx8Hev(Xs$"U)_EF'(Uw_Z\_Spr)2$EY|SP~KB7+=rk@_t{/VKOt)zR~ӭMKWZ'M8E+`wahI(ׂ:«iPc;fQ_6C>jXê\y4 ]!hcM,v汞v7yNCiiMqs %c xMQa[ƪY$v[PGkqO$:H ÏG|E.C_d"v{t')TT`)"f"ڏij-.sL/t*f{)f`LR'DDUܗj!JD{a#BsE &3"v`&~G' ;F_5y6dיvm%䴆娝\$ ?YVmE7 ܬг4@mE֩)Ep>DDwph>:ÑGr4ƳVc='"k ; 06a*}Q!>;Ɖ? I Vtp.k!\<T1:)sf"5`E_(PK  >v&` jline/FileNameCompletor.classuU]sU~&-EAӆ X5C( R* dnf%27:t 1(3ÅxɭmK09{{~<{NpIz{5$tX|цbv@[8ˆqH,FUָ=&#bw쨆gpL 5MNN {bx_*Ψ8+AaW`DgBBr-Y:F5V-Xq5Mgl`%3l3gawX IHћ3ys1+SϮL DZ`; 0Ihl7KWB,ip*5wyHqhVJv ,ֹ2SϬ%oժУ8qze6*$;ې:Kڬ.4)Ѳ"j3r$Wwٮ y̭yEKA~Os 7&FL"r:JTuLa|vgiuCf%g.bTt8.=Lxox*j:cPGpsA:>:.I|/$}BwQܥfb@"c ŬV DSOVG*p] g[YSE&[`s55M3HdGbfm!MNBKAȞ:7EI)Wv؞q4\R#ClBlR\*62}-jl7I}-,V2~0"Ñ*5R2%Rgl䳹7Y>I~yC8n j%rMH?p҂9*ElGVRtXV!2d.4yِ q&]rʏP9֑#} [hݐu /!SD!&訣Sr15zb_!%Du.4bېWⳫA3:/>tW įhG +5lL:™F/<$OۅY׋N׏xxl>ױ?a'~n6$*(^BIa }~*`Ŀ'G;r:a+(5wY[N~79w ^BaBDńd߾3ƘL{WAnJFeiKrY.+GvG54#'Ew^{ i :Xma`2t}.T|pΞ>{c<9amgIPif}eR]%M("U|KqA&*O!"4 tF#3!NK8B$™1bc+3"DλPK  >Gίjline/History.classVklW=cؓ:~&y4wI08vtۓw4m>)PՂ%@$Y U$$$B_A|3V{wsz@~mf<P-ngd QqO09yRu|@\E|J/&|E>V|U 9۲qV /|ex5p 2̉2Pk:.hЧ\>>a)S;!N3:1.7֙aA[6/dRZr2NWCugQ 79PazvG4gV:LF$&Ogϒ.:}N)+CȄ 3Lfr:~ 9;?lIg% =wmkPd*54Vʈhhi:@,]]oҼdHIWžĄ))*83me&{LrO$34mӴRŘt.1#HrS}Wt=rL^~\Cm4SPPB\̐H@Zn8XHpMdi۪ήHzڻ$ !E̸i'[)3nOܐ"¨g} ?>UT5~"xk$.uv#o+Z0Ág:>ٔb g (&&t{\0q n5 M|]~c? &\w&E襱aKR.øBjM B)t嚑-L\”Moyo℉SX`,e4q 018&?kK~.)&ޖ}Ox/KӘ2QiBĄd1nIW[){<jj_VX(֩_Kq)%C^/Mb.[AYwJI8Aʅbyle.Z+X#8#^3ml:MCiTΦ x+TU x3{f;ߪ$'s{=&q'No<TΣ2" 2ˈ%8_ vy1mtՄz4_0WLl7-řKgU|n"jJ21 ƣVc5#b# RvaF : ?ã*pk(K8ijI-NZ%z.bAź|HjPĆYD.tҗ]`m1 +KBOP Q !"QE?KI9OW?,☿*^,#ZE"OƓ $*6/#y1A+>g_ XEM1TIpT dh(߂,+KL߰uG߆[)<-#z7>jline/jline32.dll[ pTow,EƊZV2d7 ,+b~)ƗK?q-mjug40tS5P+XfVT:ۥaFFN{]v!U8ܙs=9{}ȊAfE4¥ܫEzQkZ{qg_,.!JNKDsźg8fW25r%O!t _;ԣP !W' 7'*?adGЄ:Ò><_oĭ F:#h:$ lukk@(]υ4;q|[&*XH5ɺ]C^Pƕ}I.˥vɾ÷'[U*SLqW谶=*^ !.1aOyZgnsAI[?5ݩlbָ40),_E>8S?>ߎԔߑO+)2ȶLO~A(2ܞq`UiM,CL٠J %E@ <fئpPRB($#)Aii=d2ymhm>>qplEzh髄0J cҥ3r=/;RI_4`g\%m{.ϓT ; d?ՐdlɓcN'ߝ="\Pjt|'ƭ@if~xvg;v9*FL,];i«g#xn/>Wœ,! mHOisRS4.2`Pbtܿ7i|HؠcR_ԣ#vB}R'(H)&MOU|āόTɑJr<5OgZ|ff $w`2<*]&] 3 G~8X|hk6HZ^DZ=)F&ֽ8 R ;v<~%,O 7rV(53CQSÎ8BvbА8x{N%Jc@M[o?OPۨJm.bKGeeI+}5KW-i%+[W5/YzJ ~],^}w[R[^{y탵>Zgj}{nݡֽ_gK7KxC[%{'^8-i]eS8 [tVrM(JdN&aQ,Wupv\>Wq rx/4wv)ƚ%k?39xd:cCȣ3.1,ǢxPEoHa1ׄj&8}.VB0bF`-<_c1@˅ Wү >ê>9H"Zb9ݙS2.qt_VNB)hrER *z-D /,%{Ls<1-|g/)= YaJpsX]LdF0Sj9v(A1NΌ{F4Ǡ_Ϡg~AA0 ČЏ3tA0f~Ae{JΜu|Eu.[q T8> ) hgka/˜C><5ȴ[̑y#sRY>tĠe`{tnjK $A?Ơ3t׌ЧtAAodf~A`iF ~}/ϓmlYdce zlsl-쟅琍/,SPV.WȶoRvg/?g;Dh $}s#eEʿAؔrX~`Q)6Yt3JU߷hRJJY?X.(Y 5`id>%i;$ r(V%SFZ?0w"z}t` +r0jflf$veuSvYm4.7AG7|u9V== Y<_>s܀[s'vIXKh&hfKEj7“wwŻQ2@9_1KD5K0mm5~߶bo\WB`W2[>c+Z5kLA*⺁`'(@-|-c4xM+`XG|W4RaƎc[D6E1]qI [X<Pe1֐- AA2aEohPípwG:׮0+ }:W=bD+֭ ̀~G;8u{V@퉄ňdzCHdVH) >C0b*s]H PeՏHJK +impRЍN1!L * |oŬk}ڣ ghG#C>c|wHk Ob,"p6Vc1Z} !VxtP-'Xjline/jline64.dll `TE0\% ao0h#A h7m@أ$$ $veQЄNgufFgx" jB,܂F[-,-םګ9uԩSni :BU%d+avxz ދwpV٥e*OOrkqQEEh]z kY1}uye{LRR|*cw2^yfƂ=;] ni-w'uxf,+.z0Rr,~5`\'aM @k?3hk]chB, :燙@ѭ IANլ#dЧ^))wg\ ZP7=8f4v Qn1IwImyXzH0eO"4=Ja Fj$θL4% \gc+Ą`]}^(T4>TWgUx1e X`A6,a/Vֶ@^P>HJ9T^_FFpF pPb̌B94~JN drVGʼnx.dh j{D~rdKnr>HPݯZF/R|: tY0,dQ=:, IAamZU6/:{2hehr33dZ8~$d?[flL|OC7T}/F>'oȆQij쯶A&GWP(H#kHOK:^=L r8H^merZV%\e8 .v0@L>?_Zlc:Sgۑcsv}AWy FT7{Bc 0OT7&#?"uB% n6GP%f.##`> YD/YʆD[Me%T} Gi QgQcZjȭTg?} AiHa&J5* .TNˆ?DDZU@Ф޵$X:P5++{p ܝy9s<#(;$8=Տ')s19 Y2Ny;(6dhӉ2f2y?*m5bdu7P1tKf{2HUB U @.a0*3}uX-,yVHO%طj(cmM\ [S | o&?o2}*?ۿ `zChzc+W]ak QJF]8[̗k.;vqauUC+cF:Fζk/uTN< )>`DȻvՉbi6r:tѴa,67};&>A3Ld s2 S]U, 4ӛ};V-99{"+ш((S/]A5S8;#Bx05tv\'gS-M`+]t6\Rt-U,kGiԤL98 +n1 cp-v~~೎G ܸk;FўNKowʘɑ&[Q2yO2ݴY(if־rJO a!|I>0H9< } @0L %CN6 Wh fP4p!K^+..`Ș\ 3oZيne{_XSnA>CEwϊWP3-1!5:֘ #& fB"E G*RIya_d9&~BV~"qaXIg t"de)RKH2r_{17mLj5CR;oE2qƳ1] f]./=I /KoK%?]);h]_lt{rs}ʼn oB 3 <{; "Ê`_TR 8 ,qzW_Ǔ5{V~YoSFqlQo6;|Q:a4t,Uv N# oX !P\%;".etIۿ֜ƖO6ßAAMbjJwS=wRJ(MHV'=´Ia@Ff@廼pL/Qc!.'Mj/6X<\ OX[4t.jFH}3s?maЈ!\AIoڢC^?Y5md!WݲȄ9lu]`Uqң4* o@IWhUOb4wlM" oʇ}5Y#rR/ڿuo@؅ֽ! M5wjFd),}B{Cy&;@I hq}dn'Ϋ?"N1WSYGzsb :fxx%1L\IO@0yO"ʜi/tqod-zґ=Cx=iMӑ=܈C& tA"(R#Uz`w_a>ÄR؁S|Z@'v3[÷[;ÕR-W9tP<}cfߐ LG }ÿ|M6o\[ 7R-WOGydj1o`vE]*Fn`;R-UaL K.G Q .B(Gw-' tjӨ|Q-?MChbE,CtA(.2, mQ2U)/4$l i LQE=T3EM /j2؏F SAW0}`K&eZ+E)ʗWݰympMna9#CP.@'xu?^(3|?jV>[Q|arX|)_'e:G}vӠ.LtOHO9[RLp Z9~/xԃDYGS{yMC]ډۥ4گq(_x*{QqI~TwCWbd,24 Q ewa b NiP?T](L1ލ;{ G.$c^ȠH:MRƨxu]=,h0 ^J*RG mt:>i(2W=gC3 %>*o@j©VPPT|T+U-:`KW-xr3jJӜlٛ09TW1/kfp(\Y]&G7d$<. Aq'#.h:*CkQ|ӨBL5N `r*25tYy.uÁ Fl3j-N;e.*ȸx,77R2 Z\bqKaf݅|ړIt?n5;5YG ]h.ہ.P4jkjP!U֍`HSL[iHoeHۂH#6#L"'jytl%G$O:pM*bs0~:](~}Nn<'c 86ݼpQ獷RX>|8=\R76bclә۴1*~rWsFӺuTG:Ɗά=sS0Mjt8'a?~A{NC/9\ ,Z 4:?5\X !8CoӌRaffS&΃#2FpmP6"ҏ__I8 ʑXޯ5/[BGTdԎϻM񌉵vM|J=/W}bn>|ĥk^5\[lERaDWOl7vf `nJ9S 7EQ?Fuٚ{kTSnUPYd[j2T]C-DC$W h$7Q Le\nvGGGda_R fҮwv6`6S>Rޟ4Ԡygy:{@z<ۧ( &{ԋ.4w0CPytuo !!oAų?jZ'Ih0@ c^#h $d !}T D4I~ w |u(xP~{ ~=X/b@kīvg /jlx+xƠ :~HN1E.*҃@ҌagTƋjYqL?SmtBD!X(oҝęP }iYj8kp=;Lu.{N{ poS.N'#` EX$<66 Xbú-@Jv\$ōj<n4Y?II͙GMRk3iC !\S@Q0g<>-~KF9Prb^_&ȟnS%s \O ,f;B^/G34!@{XŒgCh&O!Ĺ^79:*4O}5hfJ9PiwKaGfaY_[v&% {&S)hJU~v :P1ݗ|ӫ@ [{Szӣ~{}k IikЉ:=m» Nd!2%Bu[҄%RJjpqpB&36N5jDYs\D撓a&^-A+WGaN !KR܂l ʻgٚ|s~w:&Gk{@aGKh by/|yHW1eհXt(J"}"}?`Au )ې\~Kmzx$|]7?;}@Mz֬Q 蕱Ќs;NQ ?n(AyG9g=nsSPYqkn-;_]jlz=Z22=:~P|/>NwfVͯz-YSOǑZS5cL[j-+GB *VU7rM48"&pt*Tz\=(ˆOU: `WE@,,e})MC׎t. OPsW` mx ;WnFkjMy}-R%0tGk1ʣcP0K@_5ؿYO'YV9jz(?G͔y4Y=;~֣ CТhYna3ae[8$c70 .ᆖ f);{Y"e y@À^*A/SnkP\t KK ˆ_.c{LBe)#Ȯ>W]\x^@>mۥ\u5܍Lhlb𴹲FP'7PZXb*`N3* Bϖ"qd ziTWVJڶh|4«k1|Џ4ж#W1Ә@WIbx)叐%p̫#UbO Ƣ([^6 {d.bDŽJ7nStsk(МMG%,^vY-3% efa[e)>G?|- |nMFqf!{}23}?2;~ІW[_m.e0Ϝ񙦺b2 7{QjU'\M7vP5M/Za2nI6+Z4LT#OlʐWnNm4;D=xj,O^.^k2 tUq4=i^GVN#eUc TbBM-~3l -kF(k;#voG=SZrp/v@sKᤇ"zG',eJ5")9 .zPbr[U;R5chO O, $xK2̓Daqx!&֕yp޷k*͝պZ{f6T â)گE1^L~$&{ D y H|0J ,q*¯S~/L}1M}FxDP_/ DB܍'e  f&  t%">HO۽TeAe;hJjћ~wx9| |=*01׾f[O/0 GoWi #]ݙuV肨{b5;VuJ+eTJhGO`j'}7n'}ԓ34-M:cX;P(~H:ݼ6Cl8֞A[;mq˞ ?Lڇk:BT`7Ueo!sV"yi'^Xӱ19Iz50Ќ Eu=E]Mu]M1>}Sݻ^#MhZ,CW.RW^LbQzϓ:: ѡA>^FOtzcq蔛A'8kOՓB<;f&೷|3Avwbl74- Ud} B`~ڑ̿̏Fs̏ꁲQcP60?zV0%̯-oc~TCq̏0%`mo%號mtSuH'?00?m({5Lap_VP ôT#Ȋ׮rytxkAȇLrN;EPgzFve|t*03L+vմ2> N)@Qc[ Ewn(%xU@o!~H51 wݸ+)!zχ򫖃(1-.9!Cuoq |D흝bNPݿhTU%P,A`r? ]J+()ȹq^ |uY j,yF!㠲0&2mMyr~+IvUmžBЁKUv#Onw_ku|Uf`U6*ICg&p1%a]Tp Tֵ7a(!#_dQZi7emԂ|#}O+t$&]ʗkRUC>.zs&=ΐ;b9FY$|yj!^*揭A/WM]U=_ 1:Luf>^<'}UiiC&uoA62i,q+7 b^3zR6xSЛ"YQOO ja_b0ȉCL`R9GT4 PIZ](.$iU B:zH$sq=&(un im.qnmp9ɐch\r lZf4ʇ\қ\i7Ս\yĴD|G=+ΎvӃ NE*p2.Cae@E+(3A(Q38IW6UfIq5x 7D3y"Eҗ-6GRB" k"k3tɬU.3 czmזءA _Z[k_B~ "A([cjo@YL+ !ü&E:Wyӓ!d@Sf:8ea?Gs l \o/SQjF W kRW?RmI5L[T /ߤւ./;Taѵ,-ЃliTGtʡ]O`.*2L@)Qe(ÜG_~ ϫ=II*D_2( oAۻ&5vܫ$SvS\ ms)_;Pa2)Oc <ЛkQhG3HU:<; v"p`[[BSX0 y_Z&wO|ҀGȰ"z[qE17cSw5.)kf#BT8.tY|P]IM!tijTz}5X2ʩAI:¼OaZ$:JPdĬ|vӖe@W##d"![38;{첁!dJ\V64Cܮ @I^*qdPbuUyEmάLA>G|!IW7S):<7ˬ7rS[r FsF/OoK˜Z2.ӻ6EÄ F\˓;޳jK.?q]V]Wq r+AY !um%,4Feث~h/?U3)URS %Ht[tR5yz!%ϙG3JNh7Pj[xK84s )ad|9^"(:;w> gsܻ9/XM5wPy!&giI騟|[~tۭ=.Є 0A'ɕOɊKX^9.vʲ̳:;ؔԹP]G_7o91%2!Ӛ+kH) K'6 sf4kW EGyI4DZd|>'le.iެ0MR$/75/ԻC JN~?7dt9ih!}@nm`e)` )CɅiaŶ^ըQ⮒4uhl,4k4"K5=8O~J(.;X%0FJLXQe .cfiflvߝh͓mP>CΗ\Yڻ7T'?9qJ` 詧i=@A=Ogb6iٺvtr? , t4k$ۮx-fe":K-W*KaI =@5 ={0+$o4Q{S1%E8[&n$edyGԅhsw עzR`"Mg*Ʉ:5(#btc;-t)WM[}Cn̥ WwD%7)Ũ1gVB!Rr 3ұ,wqilk&Bvt׾)214^hCLM Gk2?u .ї8Y2mX]@*Ŏ1(6{=_u :ьk@f츛F&IȘ}p@$Ҷ %&0 kGp6c>Ps]JYnC@]9"?G>hگHq9jgK;?iK  )p(hUUmPZVG\_ ?rtҲk CFN>*H$f|8:}NQ- ]v3ψbI7c^R՚g%+/~<h`ߣX%CYm?_pw"wK+r>>?sw wp_pwan wpݙ-nwWqwwSw)wM㮍pqqݝm܍#{wpw1w8wqS~3M2sw"wq}}s}'KM/࿛ӹol t9:ON'wU,vWWv))/gIbrTz$ųr]gb4js qLϳ;cf^1.)^a-*/+.*+EE%nkċ{yh+E%Vmͱ//[)򬶖U|wXzL|~m-EZ"+RUURE˭4Ϙ >_FRh= urqr94QVm-v/_TZ"y*X+nL,+*/VOArCI"i dJ SB" #:wT.Z+[˱14ryUYĚvuqJbҔYZH" 4Q^WTpG"JiIMU^ F,^Ww7뼙R=#tlkCÍpfbTQ@]Tj|_ϕe=.\K.QZ,W%VyD@ܙr]c8\.*`zdVUYEN%4 =rO,9gʕD ?홾h)T 鮢j^-J ų8VɃ'Ub%ʝƂV7zɽ2`CqY˯H=kf3OȚ}Í6GM甩ig̜5{y7r-,,ZT\^lU{EiUsڻ&?iib_F_o|jЄ?W3aW od(2g\|xD-_jjyw>~6<#}엏O淿{rz?W:;:}̏g:Ϛn?}Bx ˗O8*k|Y wuI,G= ֤T%i+aY*1`HՠMi}S@G^)C%-S\^䑸IU maX7։a]P~5օ`y,Cfs]*yC!BK*%ʫ$X2`:-׾c.C2Pb  nd'@ 0DD#>I|A~Zr5G3Id$H_?yIڝj*i jDiσH~;OD'}lAgwL>fY}uJYN\x,2 z*F ]^lg>YCBr*R@R]Lrd 2T^D&ZzFzrrWXMr(orm~vhPdnUh"l!)#`!Y ", "R|3)&ˁ,RJܤO* ޓ_ Y I9dzW,}8B#@λ @\CnXBP`F!;UYcyVC{}r=k?g44`љ>k|gwBxgO_zkww5gEQjO|5iyY{͟[,fLUɢI?6 G z<~LOOPUyx G,$@1Qq#K ɍ3=T= i00i, 1MJN12.ڻ\,L)<S;i7<a$Őq$if\clUL!τg⑬'b 158 aJ_,OHzC!ﱽ ēbP.ki.viN'}>cM7ܫ <#Y W I'=#~y"4}/wv, t;\ՑI|-t$2|2\L!Kd`gJ{VBx%R*B¶A Ё>Hk#IxøptK7hILmfh" C!}(3:v`{JkFO O43u> ۝Qr6$ =Y}IP_"1y߇'-fG/23sPVa 6~8ʛqF!fJx^)2~2G@_YƆjx6O:NG4/CM8ҿd;?{?n+BUgWq9ɫ3!q 8'|2vL qnd~겾OәnjMjL@=8.ȏtU,I$ @x!+x~7ow4f#1K&[U1cw6=vy-<\d4B*[ ;^"L?Z w@H29`cOqd ݁0vBk2|&!Fy? @lch+qg <`f4ot%yOA]|I2 1?W'Ƙ0>H͋ \&<;0=娸~FD{W1yd#r}ɠ>˽I^/wcZZC)|џZ }d>q^ ` 0C% )s\8FdBL!'˚D-I$SX@y n_'hTd&YG>CHԬ\; /ԙHy/=H'H6\  Я \pLUHy )I$Uw~:o$\=kaOZοHuCl Fjz70{14b;̫,q KruzQfV$-^qPĉ=IEUb$]!Φ'B&7WCs%7^ZwBNRh 7A30uS]VYN Sa.`C-&j1 %wH?yDMeV0'^x9!ZT&_!VX-.(|7geuQr,I,HfUXÉaUndGp;,$ {A rN șG~WV)-̮ÓI<\?T,(]Eΐܞn%tE1C!'e87EpI`բ{2jJ <]<$?/D7;x=M"TNUXǯCMVvIK=P)iEjU0VdUYTGj/z : Bφ"90=yςVJrh ;k(uf!mgWJMO[ӰK34Q16+'*q!arTu7̀]g3A~p!䬨D;KX.HNye;(Hj&6[0SO<6xfC]g kI<@a7hEB\N9/\-B/G.[R*@_*җK!mnzoa^<9N<}xSx8<Fl)ap{ [yx^?ëpp߿s pAE+8 収zNfN }/w>x֏E58r:`{Jy֋o(x3޿}+YǞOr]ا(B.Yz|ޫyk"w[Rrܵq7Mn_]#w%=0s=w;{ w۹]pt/s}s5ܭn)wK[]wӹ/ݘa޽1GsjM˟5+|ǿV~3k'r0A g|K w$CEVi,Dcr\K)=Exނ[xWÓO9oAWKs̢ffc{|8}K8.# dnLo_Fru%烻qfSti|Bܨ8Nhn۬]cbBWYf6jXmm mNQkz)AF@{ /[;yC=[[=T EUarEh7oL;Py ކ>`'CfwqlAq+39N"|a06s[C:>ʁ?rA1^#c2bn>G/@T/'mqu>`rY̘>0_%3>{ ~5paBh}J&qu'K"v\3B+ {iSb.Fs`/!&xXW&ؠxYS/iDu8 ?<+"^V},B2s".Nq`ݏw1!BUPiB/q- oh6mo`;Ya!>8<_ކL+[-bup*1Ya_c ~KЏ 5871yԷ_a|A?C:y}U$aK?U hq|(ϵ\8Xc F_1cc-U LC4c]1闢Mfp W=\z.!~JB Uff52~9`&qJǦ7x35l5wgE@q5>-c+{_Bm蛜{}أgF:dՙP5> iWs?c 1!wp8 ^{}1P14&б+bO|7"aA qHxv_ 1M^< [${\w}-ޡ |ǐxHɿ$WR+ƊzL ׋EDydDFe\dFfe^%ّ=& 5#h3L53l3L۰vۦ]eK;JBirN݉;Jqn=﮹wuwnBTXEJWqT)Veʩ2UArT[uTWT_;j] TӼ{q/饼 /=zCjGG?PK  >grQ jline/keybindings-mac.propertiesTn0}W\/Mvm)MIt*dV;MRs}9 v.d& VPn"!7HVܽ̂0;=<-*r)A\3+|*Hk@9XiJ͟ZHWLru cz7 ]mμ1񻍐=hrN`Hv ͮB{;:KFj}i U%3VsVxg}4t ӵ6mݔˬK;:`2euM 9'p>U_IMs>q%>hBg-Wo*$`Rb c*iTtJYuEiy$nǎf%fgw4 /e5Ha پei0\z eQ?MaS8$Dy+g^ YJoa^,PYp 5YxMSjiyG0p2&K lpfzCL4wJftb,n#梜+36|ΫXNQL,ׅ }R'RȄͷo7uOہ:a>>HőCbP.9PK  >yjline/keybindings.propertiesTn0}W\MAW()NULbjbG)wB B1{ιnBB gE>J]($ 񚻯9 ZO/|J3LD2P %= (+"̂_-˃ ot]z[vBm $kYb:&}}?zLjcF! XY]K0hcWq6X~=^ R?7#7ޞlt]dtb'[~NܠG4 JJ/,y1K80 4cl(#g ohHc:oH݊Ԁ+5F$QҨ TyᐕV,EYN Op]xOP>_p0: `LVA$ a8oԇ.i0\zmMR?Oґ+F'^vDʲը^<[ cb\x`5-XU 5O5CpºW&xx4֢PF8;ΩM3U>1 I%(>l _n23|x3u.0E[kzY#nM '6۽'u.>pTJ$R:Kr {x+ 0: EԂ-T27np lw᱅TVjZWJ;`: =j~4󾴠ݹ>.u- PK  >,sIjline/MultiCompletor.class}TKoUx|'v&/0 >q&.u!.KnRԪjbOI'W-+ ){Ć @!@+, 'Z{N={9;gWPU i ؏>UˇFB)EGY8F ~\Hc|f,T,\H֦@fMX}ȋ~ӏf;f5lxC5-ח֗r@Mչ4>Ǻ7Ajk#؎X71_)֦\3.V6W\,_>rTyݍuHG~ؤXRpxY:XlMU{XX{><ݪ{qt/s*%/F6>ŬpIGm cD`poګh>J"lL] mTqWއW'a!KVεZ\n߹2yN ;0&݃7jdnaAn1qb eP?(rJ.жT>b<p|&0F8-]d _ } ;Hj=Q:]T% <7W& Ve7kJ L4(|v/n-/^1}3DY:Rt6?7͚͑#K e)ͧR,e˱&Gۚ vY>h1&ieQƸ=qv*φvYN*V.i23k?PK  >`7jline/NullCompletor.classmPN@=SŊ *`a?~Z2f:ܸ2qQ)jD7yν' S%8vqP4W ^P%sd,&:& q-~3,{2t"?ɔ%%L hy VKjq1ʌT~ S3IO-Bhe:MhE<9744~d:%"QAx6\Ȑ)38&@:EM)W/`v]X6v( pD_&jline/SimpleCompletor$NoOpFilter.classKAǿ{]^fj^*"4{EC WleoOֳz X̗ٙϯw\dPqPs`ZFW zϐmwK-:` -(ʔpUi2=) k"a 7Z V|:T;NJzy=LhBs@Z$>O?rOq=zzjN18B@(™ @*+Kcl d(-Ftc1RӠW~e5,$lrg/`Iy$ߐ'[? (y+fOKGBՔo%l%L97nѩb,=; PK  >9i1jline/SimpleCompletor$SimpleCompletorFilter.classuNA @ hZ@D< /XK,[֭l|؊ TaLfCfm./2daRYe"Iq)J3aIsT4Xv2pغO[{NჍ1l#-˒KnsZΟ9.ASpꩃ ]uh<{PK  >$ jline/SimpleCompletor.classWUfgw;iBڴ]b݄`i-di"-ltκ3K  R(D4i HԷ ܝl6'{9{ǝ}zyJø;q_1|QǗH~_N_M _[pLe}1<"7 \ O&[NmO%w1<-IyFH+}YKY bZ$z;t':^Ґ Y`dEW9xYC5U*}]I&rżϹCùs*teN Y,u*S'ܲU@t܃?\fw-.h:〆H75u25jsSr%f=dяVP_nUu56wM Ń_Gew`hYiW[cfɵ" b&37`BVяskLfvI ԧz5lOENe`w|ەTHnE' *'\n Hl,QbsI]LycbTGטQ[[_昻SOCv:YMvߔ4liP>hCRIeoX8%NׯB3`MDG huՖKE ׉r40{{RKZxM>`UP +l\C}m.ՑA@jJC+ܥt^Wrh hBIܩ:͘v8ڞ4 6\d 3mUEpZ ;`{*"KU/g <-w&+);oovWgJ,Gpy50Ŗ߇zFb?B؁ \*V鲜WkcFOF™Y^F{9&N6n¸P͸zWRH6p#eu`:=ʈ/-YDҝє چ^;ë鮀o[0e%DA΢fg1&Μ@A 쭳:DZ\G8ߠ~+% %=f[H'X5Z?cd7lGH,Z{# ;NYaM{:;V㝧͡=Ļn_->}^K/7ҖVZԃQs^K\mw7fmena w+>]f+72gk[?H7~9$CmJ6| dth8Ymh֫'uq'p,6bhIXlջzfyqWxRlia=UC3OnȱƐz8"HXM,Np.*r叼mL˙9긘WBrOSȫ!'aZ1 Жb)hI%j!Μƅz/KԨ3aLzXZAQy1&3w)-=M n)c >;G[2I2#`/ ;Xa1qkâ[=xT>0=p i<y}94),**R01v1%EΰOΰBgQȉI>Ag#?OqF[[R#l\Kfzˀq]?%n.BLr2X\j-RHc#~:!ce?_׈:yW:jdTfj$ŀCsBjz8PK  >g jline/Terminal.classVw,kyrB ؆41"86qF3bf,-taRvZ_=JN}N'zTO73&899~}~{V,kV2HAV3AvqA vi (XAӶjF* c,<%W?l2W Բn6ЁظSHA8{9d12u*nA1Uswj35 D j@AJ:[:q0+x#Qw?#bE#R:iϵFHCC:eYhXnR_Wb!>"uVYt|OXɅP ܘsRQ} &@ثuMKg:>WAx/HT P`p/o NhۜE 5Xws8l@˺dQI!5`1Ư$O oqLo14\EQo5c,"{U=_eV/ v`e@`?ž.~,a&0A!n{8Tj?HIZ&zjline/UnixTerminal$1.classmRJ@=SƦh]EXwQAĉL\ pQP1ܹsrw@s6, LjQY7넅I S - Cٽ%B_Ju"q7&|y! K_/[B7y' <r->9]y B)U'F\G #{ox꼱}牫H~p=#MB˦A(Xv0 Cfɝyz~*m-?"-~{~)Oxpk<#1IigՆy2о5Įy9PĹǚeTD\Bp\.!WYTM4Q<&zBb+Q%Nfb +'2@X||PK  >2/a7jline/UnixTerminal$ReplayPrefixOneCharInputStream.classT[oEov6\JcHR٤5i.6i4!4/lq6k;/"E BK;g~EByB;ՄJڳ3ߞ;ߜٿw Qэ1a\'e8\x*ēIOxFóBhǨ?'yC0L~A4!MlTV"Vxjyu*Ev kЕb]v!rr>G9aey(L!k;H=;o9 NeSc'+q%/YȲi++]VB2Vr}5Dżum9{c5mH0R#d*? ]+̒(+p,: YL vCkޞȈb.8zchqazpux?{dV;_.4_1mɑV %3Ћpx@?ӟp f  5gBf" T%.vZy;S1C1gY˘a` o[lɐxbKUUl;{?xP>nwB4S\ߟ. (~?_?Fu=U^5-W$0Ϧ?2w@@_yI M-s "`njo05o!L?gBc{N ?6zaz]>!#LǸ@`>UcuMMd_HNSf||%հxrw6ljL)f Uߛwm/Pp aSÑ";cй03tїW1A2h)fYrc(&dVܬ[=[6WFMmqеTփ+}:GZ V:oCQ$7mH5۶ov? /-\M#.Q/PK  >3s0jline/UnixTerminal.classX X\u/0 $d+!Y%clKOfkQĩ&u*Mm%q֛n67MӦMܤM4Iɗ47a@#Ǖ{=r^P|8/pqR_֋A{/||I⟼EigN&hWuM7dw ?oӇJ|Qn|Wio!?>y}~ ҏd?OEkKAS*GS\TCeq MyJTA!_ҩ 5U$_b YPrM뽪BS4QJ)Jfڢ(Vof[|j;"NMhV^˫6LO5Fx(LZ}VM(Ѩo #{L_~էP&PEF.-Rh=mw0MuNKXoV3͛:#SsdڻZ4wF;ZO6"vom)}ݧ읇(FC",kc CPtf1c Bxl6)Y^vVam*'֝ /$&Caň7e: D(JH3 rq!y>bFQs߈OPd!Mq)X}ZȞF3jZGrw(c#BQ'ٞJN3b1C, Φ,>ac2cQvY&SE Ǘ č&#Eg3|@5CcEM– cV< k<6DW_ZWq#a i3n%Cƌlk١cFگ9e&䄑B<c6˲0^D_rr2$z)ƨw̰Zղ 5nySqqaq3$xEe˪7qchTVB:qPc("vM('sf+c̸i OPY!seC3Iks(ZIZ l$<5⢡MM菹'<,y,_H۰Q{8MdajX/2_Wkd7)B|H8)SBJ]b@xEA{%5#v:PÃ84vGetp::[O1ocAW]kwΪ~YKj]} Ƭ|'r'\ξ!wM"R.ˠ\OjxNQN6 ӥ.t~#誠[zϷQsO u~%HQqTZw:P7ASWQv\UBbCڍ}j/hVpRTΪFWMQLDQWaڹVh%缔qyeWU/+z{Ʋ?G,5\>r}>KiNTKw ^)>u.u2#N@C>axu%{$t0קYkjX&~[ fYnfKȧɗuY%PΠT-eida, %K,r,Ͽ!KNU==l7yzƤ{x8Cl93͟8j2PK  > q!jline/UnsupportedTerminal$1.class}T]S@=ۖƖX("VMCෂUbBY2a$_} ?oQPL=sw(щ| զ&38iL`Rm8xz[nc.Czqs;\1V6\!yIs(<ŐZ$DC'Fy!SpB\dP~naYzS_]jSHհi!Ea:wr8}Ȩjline/UnsupportedTerminal.classUSElrpq!Hk!b+*JKmTZP*t!rٻtFqFÌvor|wҐZ޾{}m?my\b XrƵ >|egpA7^-KƚuwjJ C~)=-ƶҗ*C8``8)}Y?jxBCr%&Cͧ/>fHTvK{!HɟE`h 2꺯WG)vȰXV0spWȣZDPn919@tu}Ańz93'Bj;R?굔k\ÈtjTPoDV8R 01094e$* ]vTԭP+: Lx n7UM.;_w*{< =Mr>h66M䞍]l⾋Ŗ- .baIwY0 SW'>w_ʘ0^gO󠚍#݆4I#$Si}eSJ~#-)m$'n'eDuPH볔kr ;@^H/pM.@@B?8Yt?ry`.l ~OJ#{ϑ;jaxҶ*=Gvw.O[ArN F™n% AJְz]p|g/e̡H%ܵT0#iH Ba߳}3E'Y_`2b<zPK  >j  jline/windowsbindings.propertiesTO@~_1==n_.U 1Ͳ6[9PZ<#/f3_78l)sw.yq,LX3 y2ω\Ă' sT2{qU/T" `fy:8-Vfm5 i3xIwǨbHXM!V:;2 ^*X SO  H&”YNߴQS璁4ؿvwCQ(MbnY s+& +C)h@TA;30Ai빁6$:7/2,)BfZB9R @/eDd:pc0 FOãf">0"~WKq g &dh5gpcM5ģ$i Wf5j8-8A8 q0T <7s#F ׌)d; \=!I)uɞ3Zf|N.!8dxV vix\%̸XXSRnˤTeq;݄]4e.Jc?rcMv`jline/WindowsTerminal$1.classuQ]K0=igdZG?e /Eڪ?ޔ"M͹$'o/@Y+ѳУſ2& 峴;ܤ>cn} !)Z>P9T]69$>#1<|FѢ@?xB1aPK  >c):jline/WindowsTerminal$ReplayPrefixOneCharInputStream.classTSUN~6B(Z5,[D%MCyqIn`;a7nxQ^!aQ}Rg7/:::qxM>~{;HrG0چ 2<+gØsaLx^ ^0FFu%0e+7U B[J婛eA)BxᬔWH:{V(reOXkU뚕d)Vu,A焕pnvV$91N M؎]dc=3#.T֖`-sVrUDłusyƌ#R"`GxU* \-0َU8`YiIB8Hh,BDr ndEl+0v..Lsrϟ`ۘ. ϻ/+m{R>@?^330xE'p f Anӧ]Zf: ={{4UG赝kV{\MR\:d7R10li k`F[Q6)#{2$ެXRzq=J? {pJ]y%-<>]=_ LuΪkGdU&I9>λi[ s ߻8C1+[)2 EO1l#Ej6s!yh2N8o )PK  > m7Sjline/WindowsTerminal.classX |[u[ғXc;rI 1CB!'"eMg%d$$[n-Ж++ i R62mǺ1(]ZO,+߻s9|sӿc ;|5gxރ |+52<#7݃%1S!ˍ^*O4%d3 {[ % 5R oP"M=h\h\Z.qGBt28(kuK&>=RnR5pK[.S$uԫŕ*Zd&k4YA\A@ydlF٤4٬xհ6J4lҨdۮn٩\)XkL§{ƈy*7`|b2ݗNqǍd[,J)AE30 {%t8>Mi@ۡPfZp =@__}aUգх%] V%,Cxz[zZZU_O-9t80HvPb`y@WOK5u:Zz{) 7xP6Y;DT{1 1}PW>(ݖD4{B=-C<#KBYGdבy/?%&+I#VL xX8>5AT8D Q.Jh#{l$ H'13nl?jƣ~#9nño |zpH 2gmEn]o>(MN+IQw:3fDڌͼD)$a#ٯW&"ؑpTp)|lNEPsLޢ6b:1j:rЫRyhGCPibjHM V,]9dciz^+#ie lWPds-pW: p|`8\mNp*2ch L(鉤9H2zjqd4G;d8y4, 8earkfX$whWXMF2E G a rTæ5$&iܾdneʪGdz2;lPj,H8KTD"VNu*7S-}A^u/ZaC&Ǎ .,?LTj 09APj\0=x -`iL-@> OҭjQuw. p$bر w̺1Eva'I b@<םHw$&Q{DyɈ"u$OF@&tٍk~S- km٤n.Mrj 7rvҬ:~ -I:>+,D^q&WOkr.xG±Kj/󩴴0>U .[NӦ~(?u| }V&M:t|wQ@KE_Vw .TgTSz =cZa-S?U~*hRt.Mu 1GXu*J l4 TG})Ch,K^2<ʬH5&FQy'/YFtzePgpLqy>=2c/)MtAš . Y^|\Qe1:JL9NϩNfl:M6ĄLT2_@]ej$J9*<¢ 뗼6Tڠ-JI֓dT9N{ l||7nh8o^U*{N@wpgQ;uG;b*ڍT$iNN 4K2A39`qʢIXF&ӌDD-X=,pr6-8>3ƍx:B|WY pĪmm OLqVխo+F27ttb͛^PGw8DCT8W*)dK_c .5mjmyɤlXk!* ȀW!ܦwFb3F(8eC+Ld >Ρ[:MO RX_G2 {7'ήO廢k;4+H}shU=wpت^9`,&}M&o?{y492XP* ZΠm.iC -ypze ":))⣽/,Jr'-|^ʱFX'*U: *jH/:|E61ل'e3%~|\l+xnJuj2#}k[y\#~ifEXƫ_)N j'cqxo(}G3o*/TizVߊ0yfw0`y3Y3?YkIB.ⴟҳ/0,[YR7/|K*&ϨTGշU>1iϭ +;򺦼˦N9S)>孛rMOQ3_dNf:Pv2S/S0* 5rn>Op/A|Xr=n!|B¸?A>_-w(*c_xHPLuU\~75(=(?Gi+gQr:u)N3YǖRSR۠|AY;2۳Nf|؈9' QH`n|0n[yyOYǣy8 6^/Ճ(^Ob@H_*ZG o7TAs݌jƯvyq>Jw&.LE$U!Zɱ۶, -Kq9xÊ e Z+X|,6v`cYefOL+h9>?аy9YLgC Mu^<蜃c9 jNpQg>R-i"5="}GN`WPK >META-INF/maven/PK >META-INF/maven/jline/PK >META-INF/maven/jline/jline/PK  >vp4"META-INF/maven/jline/jline/pom.xmlX_o6aHt {`t-ɬyOV&%)1d쎓)䐈R< GȞȢ9'.'lȖf![YrR1eDRLٹ}EHJڒ6EwF)d0b-[8pʔU.YJQ>:8=~1~9~r nAu֞8S1aD4 NkCr^< r3tߌ[4ؔiWskHfB!e)SI&.ߢq.*^ٯF 8G.S~s '^ȖЂi\TNf}NA%ytYxθ^'RXyZG=Ё 2LZobx1CvE.kc ËxC/BZD|Լpu2Ѝq44uvt:r N; Y=C Q2,ڶ_ N \)ΓV.Cٲ>eGLQq~N co ."Fm-={p|uq3ܜ0+7i \(Eua2Z11mgРsk?%+%x9uѭʠmTw QKmt 1O6F(%Cj pŐ @=KJw齙X6ڏu%UO,*t՜bI.TC "KԶْ΃SثVXm%逩])&9zvݑ 5Ox薅A [yQIe:egxXr{zer,msg,ݔ}@$>X}b#ԖMF=V[jO-Q gW ܎#6t~R6#יQ7>e(o $RObzT7vyB/g[֟CD&5 u]Psz(܏U> K/ցK%;+nTKlQG=n";x9ci#O"z_c;vw 3jSKV{mqJ-_^R%fxZ?/E y<۩N˶GߔiqzzHҙ4?G}=T@D?>cxƓX=w+Kx7PK  >GxX])META-INF/maven/jline/jline/pom.propertiesSvOK-J,IMQHTM,KR)MUp,(R04R00226Tpv Q0204*K-*ϳ53J//-LKJ,*LKL. PK > AMETA-INF/PK  >~"'META-INF/MANIFEST.MFPK >Ajline/PK  >Bȶ> Ajline/ANSIBuffer$ANSICodes.classPK  >f}1Ns djline/ANSIBuffer.classPK  >_R 7 jline/ArgumentCompletor$AbstractArgumentDelimiter.classPK  >#W~/Ijline/ArgumentCompletor$ArgumentDelimiter.classPK  >kP**pjline/ArgumentCompletor$ArgumentList.classPK  >?M9_jline/ArgumentCompletor$WhitespaceArgumentDelimiter.classPK  >//$[jline/ArgumentCompletor.classPK  >&x*+jline/CandidateCycleCompletionHandler.classPK  >0K s* jline/CandidateListCompletionHandler.classPK  >Y/*jline/CandidateListCompletionHandler.propertiesPK  >, -+jline/ClassNameCompletor.classPK  >S5jline/CompletionHandler.classPK  >+6jline/Completor.classPK  >#9N 7jline/ConsoleOperations.classPK  >J4/m<jline/ConsoleReader.classPK  > [7pjline/ConsoleReaderInputStream$ConsoleEnumeration.classPK  >rBRZF;sjline/ConsoleReaderInputStream$ConsoleLineInputStream.classPK  >^&5[$Nvjline/ConsoleReaderInputStream.classPK  >,xjline/ConsoleRunner.classPK  >,ǀjline/CursorBuffer.classPK  >v&` jline/FileNameCompletor.classPK  >Gίjline/History.classPK  >z7>jline/jline32.dllPK  >-'Xjline/jline64.dllPK  >grQ 1jline/keybindings-mac.propertiesPK  >yjline/keybindings.propertiesPK  >,sIjline/MultiCompletor.classPK  >`7jline/NullCompletor.classPK  >pD_&jline/SimpleCompletor$NoOpFilter.classPK  >9i1jline/SimpleCompletor$SimpleCompletorFilter.classPK  >$  jline/SimpleCompletor.classPK  >g @jline/Terminal.classPK  >&zjline/UnixTerminal$1.classPK  >2/a7jline/UnixTerminal$ReplayPrefixOneCharInputStream.classPK  >3s0jline/UnixTerminal.classPK  > q!-jline/UnsupportedTerminal$1.classPK  >8}Ȩ_0jline/UnsupportedTerminal.classPK  >j  /4jline/windowsbindings.propertiesPK  >v`A7jline/WindowsTerminal$1.classPK  >c):8jline/WindowsTerminal$ReplayPrefixOneCharInputStream.classPK  > m7S:=jline/WindowsTerminal.classPK >LMETA-INF/maven/PK >/LMETA-INF/maven/jline/PK >bLMETA-INF/maven/jline/jline/PK  >vp4"LMETA-INF/maven/jline/jline/pom.xmlPK  >GxX])TMETA-INF/maven/jline/jline/pom.propertiesPK11/Unqp-2013.12.1/3rdparty/jna/000077500000000000000000000000001225523575400151515ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/jna/ASL2.0000066400000000000000000000261361225523575400157430ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. nqp-2013.12.1/3rdparty/jna/LICENSE.ASL000066400000000000000000000006351225523575400166000ustar00rootroot00000000000000This copy of JNA is licensed under the Apache (Software) License, version 2.0 ("the License"). See the License for details about distribution rights, and the specific rights regarding derivate works. You may obtain a copy of the License at: http://www.apache.org/licenses/ A copy is also included in the downloadable source code package containing JNA, in file "ASL2.0", under the same directory as this file. nqp-2013.12.1/3rdparty/jna/jna.jar000066400000000000000000033723171225523575400164370ustar00rootroot00000000000000PK bB META-INF/PK bB4META-INF/MANIFEST.MFr0;hX'Hd2M&ێD-O+n~:k"339~bp)h`!*+ E+C//Q,5#9KջՏ xtEJ  5/SbQf+7A; 9#vvVv6FҢT̜TFIǜĜ̼tԼ<IJDF\Y%N7kڏUD? 1vQ;;39vpO:6 lx[[:>ֱP>W.Gב3-D`K"d(t^{i2 jd9QQd*.]ޗV즁,2a 1&{A}}`pt@Fۦ&F è#Yn%>\L$k0pG.9UFb|7.͙D HOڬ;Mw7DJV`ɼ̺C+Jǁ:B>G{pp_ak =RuZ1u{B**e_O:`+VtF )k£]s/?nE:E `*B5l%2tl}C$4j/PK bBn~i1com/sun/jna/CallbackProxy.classmn@ (I]*5NtB GR] ^@%ɇn/ZڄfkW#_Vӥ\$FvD.M)oLNr tjҥGiNɷulV4aT%)s(6p@jZP #8gOPK bBQ1com/sun/jna/CallbackReference$AttachOptions.classRn@=q65V(@x!EHU O. |4J.ss|u`hM-3QE65Ÿ́?TQS$n}7~ њ%YgŌ {͗ EDD/klыUPOxBBmp@=ŒbT>$+]Xxs3*p 8*m_` `h`8OpKړ\2Mu?PK bB#8com/sun/jna/CallbackReference$DefaultCallbackProxy.classX xTϛ&,010 ([@ !@I2y 8KvE؊ $D*EmѺnZ*K[[W =dL^H%o{?7{1մ#8@9oa1$G~|8PcR<ǃI GNܗ|<@)~S~t4?sOF/xs~ p~'^xIeW ?@5~('?"\7C)GF.VM@=v+pʁ<"R8|da5:a;dP\6C>rYQ>ȹBA Z(ԡ.]ǷG: Svh}ZUH wWEW%rf- 3X"\#UupQVvtE#=#3oHOeÁHg0M(05eۃyهץ\hѻ(oKep0@w|G{W_cM`tMޜУmZGHD8țhP~O ) @"謹<ƃ0bnJW]Z"qac4r.Ѻuݭ4Dƫ0e<--|J %Q= D!5.A0(X,DP)@L3ݭ dsL} ȥiL6t`8+"@$/gi3ᒅnPHBDg"9D-cL% #π&}ԦV0$%&3&ZTI${cL YZV( 2/wfܶ=)/q6= "X3P1b'2/`Ʉt$ؓm>-`Dg,$c~ʌazC9kQM%bږQ.(#sEKE=,[Y%#aJsr5,ecy\BCMV[U\K8T*AWANL*M!JSimx?'JgQ9e*͠ Φ*Cigz*'!JC UEQ+`X3-Uh1&OE|slgХbo# ԰\H7<\T0)/\R(͇TA94Wq*U<w`*U*&{*-%ėrծͩJT|>5f1bDxTԒeiL]@˳*[UiVgk AoSi5ի@kTZK* UjϮWY6 i}UHH£I^*m56BYiq:qe B8hJ8hJ[iJA.aS&|t NTF8teQޛw,NΕqC uSycDVFUԲe5) KB&ckh aB RfLwˁh?R0Mtyr҅#?3VVy]:ftnv(U_f\Yw4Mt$vy⪱7-f˙GӾžl\ KL6_[[5wNZ3dtZ{{|qH׉)\sD6b4.8uz!WK#]ppry g/OujN}dӽT Q n#LnSH/Lp?3QlU__Q]^mU!\85b;<ɴpgP#Űڶec=ƫS˨f$0^6thö́5u tuP7QX3~ȑm-s%Z(UOGVAs[l%GjZO{Lv:n +mɹ<&o_Y `li(7 3m[9E4+sQv>P,(?+ɯkI-~z v{A!(aX<.aX}i{\c@FN r]A8vAa(~} XdY(mur)e.)u(bPoL 0&)hJPaf}An9 !OVp b}^vm/(]V"nC}t;7QAwC{zh?@W4 ,Ca/]4i_z1:n޿C؆u؎ bvRqXB0F2L$4VLŽ" V`?H0(},+·ؚ>zozI\Q͟$戲g ̐K93 W:)#\x0 {fBeD|Nku+v5k b:c*fӚv]b0؅Rng3kl. 4z. ڏ5̵Y.dعcV4-CfYhwll^ <199ތ|9:>w-:ո0<wJ}oC3N` =(*ٴ@=vzߙN H?e* Qz;\M'q =kL Яq'^"x*j`%[v%brMG=>T+iҎ"V\gXv1,A!qx =D8M9^7^癎 z-bf|ϰ2Q?/:>WRt-E31nxySLg <#enLde># R?arBJ)T.п`! N7U`wf#Ҿ|KfD`sI.>Rϝ>{ULMC[WCQTo1qGyf Y|/CaJy1`Ϩ2W}rjxxSJM`i3ŲX}\Vzlty ϻ\ڱVZ%%C텣}P.Fka7grkl$CPA(L ł ;+9Xb͊!W(EZ)u7)eأLe W\8LqeV2?Rf'JVYxGmA lmC˓2( )%cMN wʊҕda|?$a> 3upC0n&{k3al4ąӈLN#bx2|ǁ2ȫa!^9{†ɣԛ F9 =4ɡ)GIkI& E)"Bk!yøȂv@Qy6d\*̃[j˔\Yeڔخ,E\ \WVI(kh@G>q%Ls2VQTn{Se/\%p'/딴Ԩ7[NaY؟_Ļ}'館;Ni2H^mޞ~Ժ|qszX֞簄γPK bB|? 9com/sun/jna/CallbackReference$NativeFunctionHandler.classVWW$0!E¢qiSE `L`- HQ$ya'nvѮ}sGszڞ7 dC^޻77vQI8"ߋp܋b~i>($ĹR ^@`IA^s^ɇ?*B|vSnϞIθ1N𨮄sF1g)%ʤN[>L^^UW}e=[ln5:Jǘ٧4:+9Q.R'EOh GtJ1R۽Ei1%>˒dzU9pDd)~Jí>lȄEpmpI2!U4ȑhpvwlŭ%%51kH4+REAau0Rk[;d#ˉ/"L490nP&s@ X(Дb;mT^mSq- zYx XY%ި6]ٯKN~^JQ-@‹2^kWfB@SyseԠVFvHxUY48׉J%89Y22|xKx٩B~8 ޕ >!jd|&JNNE`mqn^fMozrq ?tv+|'2}m1H*ԓ2HNô:Bk |MDw 6s(6t_HS4Vr+qnJ'MƒPva{B-j30$ݔ pw~<}n<dpyl'4]"!T8 ڑkZ\^1-"C^qC8M0%8#8+NxWi\'qS  *(VN)OlF{N=;yu6 ?*SICO9Pvv6 POdR|V?yȔ/0Y/eN?S)^/^AyH/|X{_=_҅ǕGtx |Y=GjW5nݦ|݇i n>ܮ>ܩs>ܥ|GoSkTM)?r)?TȔG*FU]h6JI%biՔLL&[kt%#H]ө]Sel$}]hn˚H`LlCeL%5)i)qes%O7ΰc%^ʟi&8?ˊwt&bEȻD,,%SL`ll Jye,6XCe,5Y2Cgh˥2V+*, I%3e Βc J'"TJg֯_k}ϽPŞ\-Wh8}Gpʉ**P4N;Y~8<%e]{atljnds#=:q\q&Xj}X~ud#)Fq/5b,(t ,m/D8} b(uAgcyu>q 6aN~o;ӑՙx&ZW$5)tm斧NY>V"xrY"q}[4P!5s{$6+nƬZiŊk/YlʍGQ ey}sM%2blfb)2Gnkcz#OƖ*ZhbɿjU~FxD*oOdžE?*3y 8AoIvxۡXְM}qXX*}WbJ_Yv_}n'j}kchm}>f/|P(i]dQ+\slދQ::s ڹOy<9<8a-6~ශ/"1K1p+ylT'I cz U&0q 3C'7w],k_ٍ0{=W)_C hZop>ps"47܋ҵ5X0>1vgvɛ٨&jWXF (C wO&l|l\zLlJ\w}_y5;APoYV2sLje[&y a!1r\_3\Sr5l=\Z 6%&~@=Ȩ%Kg}dѸ{10*[a‘G^x*דޏ@MN<Q4<&78%pbJ/ދaLk=`kIY螙݇9G}0]{*75|>4x:J{Zk*̀u >Nn- o bMKm-n%0}8řrP6 sq$ޏ7Mrͼjl!K$" e,ta'.4b7q9Evq5Q\KK?ٿDl꛸EqUCUMHs׏[@>@E)Kgg9OPx"f~<(b{9jgr/=e;10[j(bѕy+`^LjSp6 r!#pJ!%p !wW RG1F'C`n:nwl|Ga|pBZOmX}hhwbͽ7qZnx&nz4𼚲}:zG}z-էݏ;[qSFU݇)Gij|C܋>\KAiOfic{%)!x7\XE 6릫KHE;_>LSnÚDKΚ\C:S7y;rvrlfo!8w}W0JW.cHU4:%zŴ24/ӱIfl$dRO)7DJ"iP/;ɜÉX*h` y E.#cdlNLUV*匛QoHI-g`(1QbjAmF{+5s[!YN0[ApnTkuL2Y`: u2c߫"8fY)]GiUBt+wW2N * <;4`zq^Y׾ܔ vrz!m!ox 3 LӱPi:YDќE,F,NY3MV~YOqYdͷvZ1T7xYTo#.0ll1jsж*TxD*(?$=2JSN&Us1X8.m; Q8ZV$`R0 oagԃMD(JBR%b?voR/.8~]ud}+wd ɧY9 R xc ׋w:5`ق1֔Q! *!g 9A`aNqT+z^\ɝ4Sت0NSʎb6=qM'<8= ݊2" m*h &x*i÷ GP3t^ͤ if5O׋kɾ!we#isp ggӻ(`L͓P|nM0k~eא /aԖ5c]O*,1\v~2/פ4)pfa͌se +;F(t>|p3 Gxz܂[I: \K7Z&\1\O@5A ]Mt7c|y tٷKnrnp+S#`90|~0'.pXpNJe tx߂I[doAkvlchf 9i {pO76n8P[{m=Hrt{qtGѝ=h=]=8{{zpV.9AG =`:3g~ 5K4Mۓ\ov_RKY^Nѷ08}GṎ~džq\Ɲ(3dnL7mA)X/'ۦx,9 Obx1ti>z95GG]UB3MI=DC.'?8d0f)5^9#r'6Ǚ}{U^ ߻+w8(س|s>=zC8 KsCLC1)DOrNXF~. /Jc%j KMYD.gv?ve:׳3d9j~ 6ȝPK bB ּD+'com/sun/jna/CallbackResultContext.classN@ƿ-RAQѠxx!T8(ᾔMʖXhL<>qZ*lv3osXбc]{ Thpgb)x m ={Y킨K?ñ;2h,~2x F)57D0湨`8qhIg#]EN*yhzDiu%'~:ㄳ݆}E.pD}\W Nk&NϠit lbRԥqtԺ |33?? 2(XL qUe-$65ڞӑvC@d><Ք^:W/ u(:ʦM+VE/VTQm>Y<3_H֝ΑZYl\ZP̮ D_ 萑uM͎L9nw}yZǮpm %R`cE׳`T70-x]̱;X% 1&ScW,(!I SC|Wu3 QTf)2ڤEѥuθQ`SL#>Jۤ[Oޠ.g,jmp BՅrGMI'eY.; 2}sν܏ϷwǨ9a UmVm`H0;>^y0HJbPA4ArPog=RkGVRܤþP]| th%A̐0WR e=uhũ{⑧aҥih$ԮAQ]*_\:Swu`E9ll1{NlCZmZB6Ӳ1lԧևj:&c4~CBJT{v]vcs}{y:yqZH%8m`pVǨrq@ e~߀)E2_22[e "X%aqBIWbeH +YӑHPvy f^OJ&Z:s5gES~<'. ;/Y~ J[F4zq[C@ܱS3c7l%1+1byq΀*NbL4rӎ'TOXG㕓ߝi [3UXWKBFةejLJWA|;˘% ȓ`>&k[ECGSQ)YgsE9+ 5RHlV[n:OM12;]V/)řn2TS0/vU&V0{ ]W!G6T]:).T8!7쾸p8/ ;DvPnϳ%&Z1ц[dMؖcbs6}4)˳b:4z2oOTי\v/Z<ZBzݔj-/kq&>&`C8lM7q7Wp'c.:r&>=]QYRÆUb?2Ṷ5+JWh~) =uTf^irkX\@7nn)L > vqW'#7[9y9򴠉/vhxOnT2_)fY:REhOQ2_XZ=Pwr0*]2Vrj2<ԡG/D8pI`hB A VTh j*J*V+FV RA(4$hBSh ]+Z/h d]5\5\EýMxf /q ^04.^ #l<Ʀ0dݴӿzon5o͞ýZhdtNG Kbّeفw2,;Xڧڽ9t'MXi<_haB60J9Sʔw +}&K ،PK bB l9#com/sun/jna/FromNativeContext.class}QMK@}MzV0UR)ԃm\4dS_)(?J=Tda7oϯ8taSC ]z z ᒯdc KHugT:NoDL\dS>iiϤ[Vw2g8tE/Yp%b&J<(j[սfB)t431{Y$v,t}eTzQpڛM{de]Ubj5FƥؠZO.6jx&k+Dk G/~*o#WUPK bBMCU %com/sun/jna/FromNativeConverter.class;o>#nvNv.F\Ē̲TFW IJDļt}k\r:80u̳Q:͗OhZ,KֹSZٌ߮ HE}Z6_itI6E'L~ V%^ߠQ<]ToX.ԏx?O!!Us\$D\x^Cc 4a]@#%K.)K.y1E9"2AQvBR#3:a<`$ƈ;H1yi(*b+AWU5PK bB\'com/sun/jna/Function$PostCallRead.classm1 @Eh̚,q+V.B6pCIFb1 `T`,0!Qp:k*mB7Tw%ݤoX;_gCOJ~TUOv,i_\]f!0@7!h~[u0PK bB$W!Gcom/sun/jna/Function.class[ `T>L,/ I0 ,B2IX"0$,T&4 (Uۺu VP-ZDIBv_~ؿj{Qf2I^I޽s=ܳOu!?·6y'a-{ }xW_}>_zkL;F^)./O<&=`LC^lw?o ?MBÓ5)/?" >rO{yVA/}V>Wy`x%@;."3~:`T?? "05?M_<^~_ o񺏖VЄw>jwh ~:y>Z//GQy`/(&#?e_~Ȏ5?uv?#BGvTz)6l\Rϓepn+2(WU~ 2$S}Ve*O7aӭ*7pdžj&K_+n|i4#[sr)}Z4!?,JkMsbv6%b(ӄy B7CpZ"q1RXLg ) iq#nfHt}^W3-oO,@8[EW{kx1h djq:oз7 #G>>P}}W:~(ԅzRd',a:1=[G7hehnE7h%k7hO}.CNG!JE\k qv4|)pX[Ӻ^뺙owu_X'WȬULS7u33ӊI8"ZDΙ p~ &.p ,-Ȑذ ޥ gMWc0[tEZ ,EиBO<,mt6[aX.D1>EzYǑ=Ŏؔ\bu MBfg /֙?hh:yZeD:b-)O>GLf|mB39=nin$mG:DF@e$W`V~HNf +ѼBQA͏[j=^rnc!򐈦>]iL:iѕLZ.zy]=S%!6^e0U ⯣Hϱ!biPsLIuKmV[Lu,"~>q&+[ /&oPW|=ߚ[Q4k\͈~^tb5ĸxm .fYsM]4u]Oa,gr^&o2 &_>s} &W|S}I}T7wng.b#5-UfSe=&GW Ip{ik.ש^ ` NmZ#B+/YŽPX[39 ֭Tս[ug(Q8M+ qsP'(~5ZS={T;Czn_>loMޢ7q @u H/ ,l6D: #$oU+Q3  /t3$$і B4RolU[0 l6G6?.v [mͦzT=fo.&qt4}DM=vfo=zRZl"fl6Sj zi2>mk[&wpV?TԷzrq0nA b;䣟"3Aq!m\C.? UoJ%㤥VZE;@[mpEZϩBiNy@ ap P *U--vpHQab&]uwT Bj)vlI}WWoY V4[Z nxҽܖD7۷ GrHWB] )trrvkxQS=F_#ܯ`k/_5eX3MJŢ ciC #KJ:F˜%u9)1qC`*8AQ>DЍWnZH}*KRQEjo$);:J'%9h0ͽaYڱBjj0_(oP b@,@[>:,3$;UKfGU Ŷ!1s;&&IXy"8Lj8h(Ö2C(34veJ}4,t&oн2z)gJJ)o Eeao8@#zhdn b.;Ơ{IQAi)Ir0ef-{rQJ'.ݓr'Icc1K1Xò hk v sm jh&,sPx\`x8Ke(K1I5ͪ|{^((D(_2 w:8K!}ZbH-{ ǒZk˫a:[7fBG^fpΘoi.w&$e1Y )N)7@tj8AIh r,, H,%Vj?Pi>@93m58+{ҖFQ63SP .k9Лm'=Fur#4ꈸjfl2*aڐ!i-I04`++;i|md Fq#Z H Ϸ vRjhH؋[k].vG](`" l[X6,bIc~`=(PdAE5T4jCm-C]C P-TjMj8uLD]=};i5QܬP@ȣD4`uɣvgEԕ;fԙꦫIv l/\SLh.>~F v|;i|s5v-Nk"o}!]cE^'s?/}1 %tBd`}ʡ;ea k{ NSNN:hoͼ-5te̟#yk`3z/Ee o{vw|'?ws/F|/_}[Aw yHa` Q5Sq5PMWT wܫ+hj?j7R=6?^^]~ŕ?t?fXa 皋Gɞ=G]E㵝YCm)jPZp=HuO,YgϠtO\G,,SR>dNf<62G#U)S'"/&[,SaV&GhRGx  o[$HcE0@;o?A܂䖉 =tc_Bp7HK&Ʀӱr>Š<8v2p*E dTYj22#s]URPFx$>a`kYWADy:Y&0@wnn!a[~*=tbD"ގO(#h7 :»,h tgЇho](/K~l Qq8PޙA8v>d|]y42, Ƞ_,###{_Mg^[olJ7mnNXF!VYȷE 5I#}V]1w%O} WzjоLS⧇#q x'#cHT~ݚFgGlZN< >[z1">\oJ>\:V~ZY7}3ٙzASz"$&ye U_F/;|軷6_'#|SN.LLS{Dlp'e^9SɃ?=[}ޢ lP7yoQ1 O4EߧKIWIK7tH@@( =[%/(+7<ʠwWEl:rY|0FRUȳ)TMA_ėbRuV~'LrůuuU15WY**U:oT56TݭjN}3/Z^U+ԯJZSRbWUtuFWjvmUXFR6^ Yxi8sQkBc̤,AG<.jE4|, 24 T1$S;Ⱥd?WsGWU|UBO2IV=Q[|q]mԇbߢ)PvDWfҩŪoUCX3|]BV9Bx5j|ϧ1#Gڑb; / iAWCYIfkItR.:Beq)GTZۓB+u%ZmsJKS>TwgJW#Ssf`t籮\`1(d?t~2U3ҮO}6 ?o߰?=m~Ɣh±+7lSO:JTí1ЍP70u3 Wxu;RX쐢cZ*Df[#/JJnH$+ Ӭ0I}L%a#JxaZtF4eՇ? ߶^3ۓ\tpLY qӊ{}a^Ჿs˅ G}Hg#RkQͳQ@Txb۝La3S.&&[ar=Do-B?B~fToZWڥ0iAГT dr/.[񬣔 'c Ѧ>q6N:n:4Ҫ:;ENvs@F |/K,nzw-H#lv''@),/`1~y\?֋KB;]2n ^XbN:Y,-E+Y4aV}DV;\2 ,b)б7~ &UoѹJX*π>tqZ,Ms΀C!UT~] Y/Kx;9ac>R!`#YZz*J?1S:Xvb]I]I}I5i}4pl_7G) Taȅwֹ@ ]I$=t oҕa.<mRD&(rW3Sn=e3J7} GIHMY@ 4#Gx+ztMս++ѽЛ{WkɟZ#)"?_i{ ~u"m'eWθ~wZ\s$+Sima#2P7(OFom|Kw*} 'aM"|3DjUǀفh (^>PK bB> com/sun/jna/FunctionMapper.classU @7RЭ'K ] 'Xmݕmz=@!9 3z?}BذUZ%6unb,Vv"D%8*J^9؍Hukrʪ?^91oaÞ=# "0;$L{w}PK bB$5m>b*com/sun/jna/FunctionParameterContext.classRJ@=7GF(Jn\MӱNi'S\(X~%IKE9s9Ni$QD:l谙V =W U=wCAapr/mt)X!y* Z1 R`J%jnC׼!d{SC $ͳq}G="ej=dȓ:a8K7}E4: n\ۓ,tExŻ>!~ޏD žjRt8tS >5DkO^<RQz#q* ]tľBr[Ba0+^ 7`=KB3YҚi(!Ze%أ{{s=9w!}#Y$rPbU!ӑ/Pz :Zp1< 6kk'~ +::؝/8^G^A]cDix%Wk^ r] Bb"_hճ/Y aMNev*+h1/E) dz 5ES bbE۱4NqkèX sh `7oͲ-CO۞-yw׫83;Vv%cS󈘛8KAܳ 5#Y; +NE_cf)to_=]s'&gOٲ;3Y&֡˰ Abvoy^R#=okP(H%^Y6ojXdh]_5I('vVRt|E)JFDY4İ IX=N6H6t7k-Z$mc~v RҴMr5t3!1}KhmagQv˾{GWkyƣkF!=B3\.Tf-ǯr`Ss8%UJ%ҢůkӰ0شltߜ=[YS^:`:7Kf1=S{iK1gkF 0=~ڮn[T\kܰ!l;iXt/2%[bb@S,503 61ZP/ YiL^S!r]_!Nޣ_lG;{Ԛ[i$/Ć]R|k94;ŀUJC~a`vAנ""/h9㼁zlbm2Kopԥ^hC-m(p9~K?DF :>֡7"qUt(]qw ]F$٤z j6ت Cx_3-p@:UɪdPđTJyωqΥr-4e?@Խ_.P6+wi.Ȧڡ]&@/沷j-4-#к.Zu}։@K*QiN'RH1q&mm }Sk=ՃnX*;R o1K]N,,lM;8\oXXƷqb\r|6&[a+r\E.j  Iolv-c );al# S6_-&)|N5Й`5Qf| -qzGصݹ]žm1af9+2+zd߻nٍn9kQ:N|V,JyydSvQك.IշdYn1yt|O<5>a5|GS3 j8EçL}a"6{t-r?8m6P:N=`CO 9,kK/ڊҁJ`Ѣ*r:iGOPXJ*qyǞ_|E S8,<} pZR c ߪT#8*p߅\zۖ,X0nˉT{k5硖H!0(733Ǩ4۪^$2`mna3d=f9AĚoe+/CzWܵf[Ib㈎qV?Nh $fV  މA74 g sfoHc ò8O2, 91y4pvg 3R:˂]6x9U!;5L& ;/̐cdZrQ9湪fsW1mO\$4 w:P_o[ǨﶚuQY.dFEb^-PK bB*/com/sun/jna/Library$1.classmA 0Eh5Z Ľ ( OP[bI+x5CSt| B" bB|r4+_T͍ -0U*ϗ0VQ!@H/([cV&LeS}CvjS:PK bBgZ .com/sun/jna/Library$Handler$FunctionInfo.classRN@}BRRBZ T)pC*UB{(ʡ_S|TY*Umyg{;ϻ{OGxUZrvCp.31^ g4~ @_Kxm+f]Xޙfn*~OXp"-Oi1Ks.#C9X/U`[;Z~ HrG@OCjlcnABPsس~ 7o !*DYn^ycEO C=Ч>a 6#h(M2JrWPI<e9yj--x,WfcXE3s,bZ,ndLζ"Ldu{;~9jPK bB%n !com/sun/jna/Library$Handler.classX XT3)8:.8.12ҠQ#BD0B`j0:!m,]L&I+mƶ閠C\ FmڽM}OŚo`f~|lsߜJL+ʱW=Vao&pøO4d|DG^ |LZa~񐌇8`A>OxĊ MU7Tܲq ;>ī]%~ӫ%`li}iѕolh\W>W{$kpzJ!d4ߤ=;Uf(a8d_0ّP-٤r/ǣܪB8p 쌺3ytO\µq~UdKվMXѵPOoQ۽\5PwytP &Fݱ42qb]W{ )IVIڧi8o]f@""tTl΂C0f&RC8N E2CDk%5vSNlrmO&.H^|Hv=@ÐJ3l P8UEe2)ZۭEj-(LN3NO) ZGEj]..ApS VP8pBcz^Kԡb&VĐV<qf^O!0X;.OPՆ)hF 0f\ܰ6|_c/+D+^ev;DG1n]_Hd^!+ [eB/+7b E WO4_̟*](؆w(8&4 1YO]!|[MhTpSY~?(#^U'Yk W 2q)7# q7ɀ ۸_+$)ŭdeJfDA_$pm)] E7uڭ!+.O OPw5ѻ$9M-Njf {-~m HPm<@ JQ/c*%ڜ)J'PxtaS#roR>{%,Kemfv L#JaDq$ؓ}dI oQ;AUw1LYdʉZ5gjL 7%v 3&{s(14NXCZ,gxYU>WS 3XG_q)8dנ3eƀi'M.pN^P%"xS_kB1 dUHP3.qd467]tz|L[`ȯ%7$g|IW)LJ]ٞ`M&Ô"~Cm( #jo6z(Fѳ= ѷ iv78\8piC0 \4[zQaX2K2kepGMc!d,,Df`kEnq3!lZevaV"n3a1M͍npHyB `.BXtFNf{'̸؋;p<؇q?W~<l! a+#N-x`TEb$ܙfCMoԧquߤ:N]2e*ü 2"dL/< 3J j/z̥Qf`cq"#-q~sK#R9TqKU@Ĥe\!A. 0s e*]kGᰛ(FQ?a>E0\dX> 5SumiG_""8Vioa\3R-,[$" n>gQjlӖkjfZ.'nF]WEk7G&36= ,퇅\h /*vCbzֹ a}/RIJ.-b?} V<~E88JZ_07n# cHS $}~4 Eȧ9 $+^lx(-gC;˓A˨?3±+Qk1 1ä>j惙wcO ,ŴEyQ$Lc9]x%JKJ3Axމ"*MQF3X"UbZmaXp7V; 'rV`/~ħDq6qxfe/1Z݉gGVd8=PWʨ0\;ECvkpG}naZ1Q*Lϝ`Et@=3;ޭ[`:F8qZ=,Ҙ%a2Dz3\Y!z-]Yػ#7ʯL[岤U!n|T ǽ=ԡ& lPK bB-K%com/sun/jna/Memory$SharedMemory.classRmoP~.Kes8Rg)9Ì/#.AcY^F'4hGm?ps=ys??~4r2XAU =M&PM=H)lDOWV[]wh8uL==zi;úvUAY=bVZ?L}2;)ܮ982=[ѥ$$vQz8k LZB! I}Fe#'ׄlǝ8gS'C?cHسZVm_Lc`:'FxK2;泡z])㺂J bC* <{`qOA-PK bB]@mxf"com/sun/jna/Memory.classY xTd&e!d!l3AdDʢ, D&,A" Aŗ%Yش-hkE; X}i-ڪ]Zm+=7/q{}O8CԻ1o[ps.{?:98G1?g],N|A >uOυ9 ,K'r?.ׅv@q 䐝{"sqD "Tqae"EA, $sE1Kpen1T p#XdecQbNh8YXJwS\bi-H|@i){p ;,a8Cv5:"5 Z&bZLٔhmբʟB]V%P<{,VudDYAME6?ѤE/TB4}n0O%:V,iVChJx{6G:bpՊZ/HsjM@1ށ7iA$kQimiqlmaҊ@e8ڪ[ 5v9"HdĦ5q:lSWk0Ll :#1j9CJ EQJ2gNύմk̈́5:bml3釐njG6ZSVTBrU-'Aym5Y$vm[֠kHz.ٯ~ޟ$U`wަūp_Դ xh=#l ~@27n)jFfFz$CC)~eT˸N4i8{DVT%x<Vt~riH Ylђ ui8cIQTY9bxS݈ d̴$ 7a6g0' Jlݞ<0$=3ؚ>kL9&L6Xx\c+ҙ/A .7h%i-Ox$ST֮֨F$tPZw)&^"hVd#e4TTI :ZG654#ږYx0Brsq!u$bq_k,&#jطVFZLVsܧh~}"^ߪiV4!oZZZO5j8TX)l1WH׬gıJ5$=N}m qgn]0\M L cG !!|O^n5_T"Z HuNϪ*2c_E6-qE%;⤂@Xg+4`!~bj"It3f{ō,nbئUYUYUYUn RT`'W 1<=ثib*8Gb"Y1<TV 6)x)x/*x(TJf*x ;,7p7W;E"G/{_=*#f;E@K--`|l5NosA} c)*b/08Mb@"ߝ+SN-LoS5d$%tqYEӂgh g.i?ʣ,1_唣굤fu qͨ:,7?rꔲfǴĢ~ HfϞѰzQmt*mMjh3#BckHrEzWa9VZ(kA1+6N \N1&dB.BiCŨ}4JW ̑R;#4D'sU[vI 1m\.]NH)w j=(khOYb.OJEiA%O2aZM,jZ@L'x7= #;I !APy |wu}۰tFV}XvmtQh&;CjC,qp%RC+qĈlbǑ[HV1=>|mxE5p6R]Y؄:wiKFn6JYH^ QZN?ߐ6)&I[v"uFĔ _5v( +B5%#L3rzgqfR9MlLr4)Eoʷ\3כ` 0ЃrD3ml 3i},_O-pw;R` ܤ-w:Nfz #Ѫv[RӖ1IͦF'[9bG{Q4dĎ>-Wk;'5N& cX\8Pɇ)>z1 xKɔRq6qHq\sQ[9I:'-vl{ujV2UI>ARAYLC9? rH + RI^~~+/+,x7Ԥ/5KK(5KSoʈ+DAyqOF| -W?B/;J#[AkF?J? ~p[A-ݟi}9яʀ~+xDI'vD+}5>Ү;ôd_@J nR_NPugvgYCDAJ l+Z:0X7D ͣ#y4H^ $b+Ŷ?0VĝxqbRnY1BW><3ļDi0Sì20`Eos'X0# {,|bo`Q\GR@M|t,G7-y˚9Aw2’2GE!G-ٶc<I5¼}`~R7 >{zRֲ#[ M4&M.V:&nZ[;N#\x#z1R?l t(3GqP.1as*"N jtэETTGPK bBr(com/sun/jna/MethodParameterContext.classR[KAV7m[K˼=]7—uԕugA~Ttv(aΜ]Ι׷GJ@A.UTb# .C9ܰVXĒwpVjJn}iz#7!mtCiIq:½2cr]+8ϒ7 _ܧj4pkģvY!3QnsZfZ+&Р5bךPTWnv5Eayhy|mml7P[0D^(RH8EFi+{O`}Kybl`Y,xʀF$ VC)C5UN:SW< ra Df&TPK bB_6%com/sun/jna/MethodResultContext.classRJ@=S>oqg# n Zp56%M .?JQub;gν; `4BIGYG!3r_1[C~M{}3=Wl;XCj #z<<[:g]~tTYaК`m98F]KB˷P'dX$>v*ȕMߓF|0b 3L +!A)}qB_ پdՍo̝Q`#'8N\jidh0?:=G슢-ӄd)mv(iH)^.)(QF3 Oq @Ef^a^)r Un#u.Q`MƄDXVPK bBjcom/sun/jna/Native$1.class}SrA= dMz &QuxPhH2eZD?KHV~eP!>s 5,Fe`1z}M2F(6i2e`!+ɕC0DV*qܬEXbUؾCaJ,5W%GӝUjKUs_QϻY'U!^ U"fh+|Ň}"ŒWC73awI,oQ=Fs>#:M΢`q)fiA V}{l|h v=43UqP=<38l(j]eo6RBn&x*+)0!Z杔# ivE6L/\ڧ `b$ &e[6`ϜWT~x$ç_zgful[4RE_cPK bBucom/sun/jna/Native$3.class}T[S@I\Km)AT(3 |ai6& ?>{g|}Gg"j#={wsٳgxԉ2D3r11q!v.mzwZ;Mal軎Vq.즚a MĒX2|BHVM嘛4e,yn)ՠnQ`YN#V+BSӟTvM#(6 3ҳvp]?ܣc^11 ?!k+ކ8+>{cGyX7[g-ٝT ӒZ[NcA"J:ѥ=X1Sy2L׷N}7Lml2\0 kܴ]hϐcƱ^#'n5zt yFsY;w =SNcځX:-N=/Kd%i =BG(oC` By~5)@5BIWP d N>]TJXq!ۛEſO #>pWX2R!cx[14L,2 *dI88u , `7p*9"p.,1OnE*TLi`gX PK bB=JfEcom/sun/jna/Native$4.classuR[O@E. qU`!1)Hf4ˬݖLg<>_cId0~`Ĕ o?i)LQ\Ȅa#۵p3Y\ӤA$OPK bB,com/sun/jna/Native$5.classmRMo@}qpLjwj)!U !吪H6Ϊ`&_ "qv$Z{fgyow <^}lAmᑇ WRItܽ|,l$!T y#]/Ȃ {KyQD$b7r!_iO13 [/x,LEZ\C:w? [iYamhxyϖa>׉HJʮő˷*IpL':\P`OI  гi2o b>"!YV3E#Qxx8,\oe!Ը(̈́asڔMx:ѓGhJYL+;?~趰FyP5``o:%SC kpN)VN:i9|fg6mDAr^-zC[ME2^PK bBG com/sun/jna/Native$6.classmQN1}E\EQԣ^4^&&  OeiMvDxғ?2NWI;ә7^_qT]{4]g(]I-5C28x,ԢF"#EZ\ y"}tD `IW4ia7r./.q$LڈGhw)s_qyA%géQ8: 3.Zpa %[RU ?D< pd+Ed2z$g(P*&4<,w<]Ӧ%/gN6w,=4 gMlmֵ<60zjںe͌F0e{+kϴV>@J(2Mdh+|PK bBAcom/sun/jna/Native$AWT.class}TmSU~nܰٴi E&V[Vh%\M"?c%cg9;={{ss\ho9މᲁ(pk=~Z H#SauN1M-ґ5e蔻.#5-Yk6![e˓z~I* \Yb0GxS ?WpYUu]|Yq!^t4CpnêYYgCtbd03_DŗCIӔ[p|M$-! ~j m[Q vӴh+WJNn+R2: jb# &ncDuVXPU:vt=pҥ&C5Wfc~fW̜meOzjd9ՊJO YX"flc"u*vf'Lq,X]%Upħs& >39`;|ϑdO7/}Xuĩ@^N1y#_q@I_X#F1F7&Γ &%dgBДq&k} PK bBNCU com/sun/jna/Native$Buffers.classuPN@=#ւX6a1Q:2MCƍ&.?xb0gsνwLdcvuu3Τ9C2h=^0m G.e*pw}Nj>ȀAcWRJ=a; "eM!<@PK bB: HIcom/sun/jna/Native.class}y`Tۼ7 { T*$DC2@ɄEZuUqAEKERvq.jV.(9yLQ=sz}{I-^|/} "_M/ECkz2=^ǫ2o WNn [lg.=ޣ_>+=>(B/C| oj !i T|sz|'4WT37!5w8H0%3%,)C*Cz|Ґ&8Q.mHjRMF]fr)3MelS2ϐém)Gr! L9ʔM9XS3x%r"UNB"ɦ,t Qb*DŽJ 9ݔ $gpSa# 9 9ay=fӣ̐spI HGSKRxV^ⓗ(w9宠ҔW!jdXy):S^oH5y#Sn5M> ِV!o1~FMsJiʻ͔wSKSy;oL)w!|pv'5E#>쓏>zb?QS>f=|_')S5$3 'Ig~ )J2_yi^"3Ty)}ˆQkCLüJ-C[{LfߙuS@?"xoo#}| 6仦|ϐI& WSǦ@wCC|eS~jLQTcsS~Aϔ_+*ה{Ð`-;C4B@->ֈݰ SRz0M GHϨTS+MSjRTfʒϘ*;gyr dW W>|SniS2hc(ujةy& T5TM5TqOMQE(6U j*j:=3 \Ju8=#1q=f#U=;TsM5P>vxP>vUI*j^M*g֚jTj0"S5xS-6U݄r,T3=c)=zXa}~A N2>.) Ä*C2˚X@OOPm իXիC+[%u+*U6 n]`C`Z{sʹHwsΞH34ދ|UK[Y[ ͮXPT zֵZD% !|g Ot!|o{hUw;Q7TU/6j×tz׬Toj j8mnZzz; Lt7a8( 64W/^TV-j8)U/LdesUsKcʥj/H\TA4SG ΆDU]_~pUSX^ewu3:uբU낭0ZƺڊkjOPO$lsAV.N}=h++p V66">˫T.m^iIcU CY8P)CTyb$[VByeE:tU,^L5 j/.oTqPk#RTm$4&So"zTMh]._dj8e&^]hIEFB[^:pU!'PUey]]EyBKDž@ڥ+bpMQt"zK,EYN}4iȚ:9ԼbE +jWW6'Tbm]Ұ3 m6ڐgFU;kk乘nRFDN5HA{P)Kp[C3۱*XՎ5m`$hfL 3VjΙd.E6>NGz75kqyu""!PvJiг#|Um6zp%.ZV.'SB=J[{uHuwwe촇U%{M)X,X5ۙ|`cd];gTU.1%F# U;sA)DuFH]&+NK!89"Cc`+ r*ԌVoj!U12Zw [!&lPCe' IiF¶1E, WTLIfdŪ^t|E!bp2Ѥ/ w#;Uw۰Mlt*_; 0>XVtِ CL'j_i¬uu]1!)YaX@!k%F%C q75y/oBb$EZZ<&':lG-z\ݎ3@ňBn+5b!Z޹YL`h f(tc!nl }lfph.-'uuw*Z6ćR(EQ'sܐ]~gZ^~WpSoZ=_eds9.D@6eaZD{jlBw~5iL=P0ތᄺZ4{ؔiRN:0: ]G=Zok;XZف*>9Ò7rE7d4Y9BknibC4%&h;ʆkNmqPCVlI,mʉbz3'kي7%rЃ ޹^~RX7!UD[\+!t%286;)p }os*Pf醜iH$B4)CNO=/Գ )r`@k,{[v7.e:vt㠾L[isg$M_%Fx2 :Lz/ވґMAۈX 31FnBZgȳ ސ%&8K1hGmrmu}OoG.Yk;J?gsg0zr&&S1F{#!؄ |'پΠuvΖW6& V:b듀B}06ۥToA%5j1< <Ԏ)"(eM ɮ3&0@<8W-j'#oh;HP衽ay5p5mqq  SDV֡55`$em;POSԟo/`g$ra{+3 ǝZ\7F9 ϻ@ftqхI,%%;{K%hqԠvJp3Ѥɓa1~M!EquKP&s0P2 +67 \+iO/圤 ۊVnr0JvƗ5w0X@c mB"@~; yr~93pz"qw5rDC~ewesCT$!8rO ;p{ H|gIh"y0VGUQR ){(%=p2|ifZѺZf۸+" ĶQ$m?6yM썻CEЦnLqPatMogkTv#cYqyfuX{ i!b!P \5к6Sހ91 CHLƠEeYũYQb  꽠v? ";Av0 *Y{*.V]}h&$`wB2cAOj!HDoCEOr#Ȉ%BI(6}~]eW+-TvBz)7JD|u^zqSW%uU ֯I q5ЩH(B^(^C?hVzN̲[DUi[ABg{}b jW$aZ t0C[k4jj0,<5{vêp%.K2unc'lmu K5@pFKlM.&SyCpfld0e'݆ wc\|^(7:= isǪ0EX 1Qp"pAHP.XQQCE6ųlm< g$92W{bWT[6Mk1k,ahjk,Y`ujpUUQ[ܗ6:OYnڂDxc[e&%u^- Q;Jzɋv=F_{P%W)( {b$êh#XS{CE65 prbU UQzb]zI$Pr>p+mHyC2'T\$W"##5p;Z}v026S!n=I4&M 5|Vz&L>=^8 .G̠|~`H`7&C[6 ${"Ŷ/S %3{Y<CKExŞa{-'Xe:>Y|ڀO2/l$j,>ϳ9\sW &%CmfujM>XP_2NW?'C= ׹:RgUAPdcht(=ݲY9ٖZu.lF ugbx}SK].-PYbuj;,q8b©Ke\]a+-uRW' uU! n´eAMR׫-Emű0;U{fL92Wi=nBM!b 1͖wXVomQJ~ j#A~n8}` .UV>!ɵ4T !_ #2?гV#3JA;ث44BKA[|3?6U}>⺺3lСQQl}u }ӵԝ$§rhNCG,?a h0d1Q`/u◩A:ýzRgG28 #^V)g~.}%:Sm׍d!O=, L\zIYVKϡڶY_1☘G=L]TҝnR|)uzN''`TC5RҲM3j(R`R\^-!Z>%D-N6c0㟬]pG3Fp=`ѾlGZK}J}'?ܡ/,ma0^]lvA@M}E6h5r7OPJRϣk-F7&{\t^1?>Ԯ7%}˛|p=tVĩ uACH`\}*{9z;Ak1ਡ6g_-Ã$< Xh2:%5vw7vZWE%-P0zdZ0,GwƠV:Th0hK89ex:wH&ЙGyхD1JS" y:B%CJ7O]<9^[7u#nE}#ra='TuffO-h UUl=4vuFRp'?(@ػ*Pl!gtSȼjÿ3 3&?B=1v!-Z'XT4n;^W$ʵߤI;FOZTNcuXt–'B/I\XZL@OCn["U u. Nh%AJdx?c.ɀPn˓GN?Rq7ԩgE G q:o 8DLq< !|%y D.vrw4E}SO^.{HbPGN<=c myhv~S{]h ".Kw)\X@'GE2Dn˛z@ڑ6fBa폶o}pz~ F`z+0oKvpF¨I:u ``VrNxf,9 *㜶IIRH^GF(xlQtT QT@-AԖ.m{4ҽxLFSH)(G1=Jޠ~L{2aͲ{mSꙚQLwYncI^8_YCTu}Ns,}0?u9At6o{.*aow0Q p-jBxQ;@$,z gt4\fg|hSNcN#,M,v])qNĠ]s6].*wڟ4:BM+*죌U=Sڤ'2>rXp+Q[ p~ca. FFgpts#/j&=L!Cr@Tpʡ>H2E玼\_/eՇBCZH:o&W]/ZNJj&R*Ћ`J. 2zFGUH8UQHW>Q|2EĹgeFq푅f,L􆾡J[Gɤ >2 ipbQ&ҧԿ>IOڗۍqzZo;KtpԵpwPo:.DVP't`S*A1vo KKsrjh*tz#{abuޙOzUڞjitST@gY Ej X\ݴhؗ>IuJ9?#qB%nBzt)LnȆD?R8 K6cG6c@.&~bwB7 ҕH.1]@{O G>{a\*)CogPi% wPn}<]?ܑݱx޲E՛BtPCdvSl}[d/6{TV8270ֱ{463ghJ30z:8k;uҤcDJNz'ɫ[jڧ:rzmn}ӱDU M\f Y)zDĮ2_|pI*?jU+-F/񆺜V;`/ڽWR4E]_R(t'N MڥɌ9W{xn4$ b^kң_JcG}e")ip)?68A3CCKvC_GlwcT 94"688U ڨw-~jϐ55v#T 'gE#Ţxg$x[uhc3 u>a QӆS`hseAmW"ۢ5۷ǶsڄÇث¡) j;WQ\1[ZcJ undz66Ve(l֗/Pc@-&0C>{C;p" c}`K/ٳ:}N#J_i>q'}I췘:װ;Wu,U* yCN;{[m]~Džmϟ*\0C,,]eel`tX)X\T9'G^t4x ѯETϥ Q Lj^/<[@E`Rs&H|>/Tx>+8Q19Un0ғ$] GN臕D,s X"  H2dM//D0vX)i= ŞA?x0|]J?8`"i|z0`7a|0#03h7X;@rA u$94_h |N(v)m8BL7{V06HA8#،CM֣Ry!J@e"HXd|W8pli>paJ^5y/@FKQnV 5섬=ݲr2s 2`Dɳ0b$-Qn]_"`̱+__1@dT }x1* ͅl6f*ɪl>b-NVwR-F~^.gOk1a]/ "! u0׏r~$4LG9[WL:fU, pVu5E55C:[X # [ q\D3f\cT##£1Yp7pW&܍=&f3XQq?} ;5&nt[T&$u /n jj+ʃ=0d7Lj@V\&| [DqSi?L Ee$_CqgnE&ۡ\ 96Tg|IqH3 d?aG׮QY;E\= zq쨒'oKF `Z]PHpE=|In8Q8Rm=Om JT҄gga2sl G?Uo&S rE[KrrZ6K99~e";hL N8=KDd)l\Ğޘ"|h$F(B弍zͯk}4+2ZQ_0)U_5jҥw&%h)z;[(*޷m+y* 8Ǣ.ڑs6FcQYCT/^BP^IU~5$j?Y;PSB0渣{ Aؤ)iB?SyMזv zd*{:4H:T>A6$PuN1v@Jmn,-ٷ5gAͰp^&Q1ST&̺Yx}vfm.f;[JwCCCi"G^r0[٘bg̦˦,Xz4riq,Ȉ8 iRJHDD*a^:StÅ@WU:6 ׳Yl.,r9t=CD},dOAt+ٗ_D}-t{݋r:k|!s c*k}Gin<óp-dA8j"<%\rM.ZMйӵ܏b^HRk(g3vu:Jrb}-k|FB\Ʊg0[i#5 oxx]'^dte{Do<1*7mΐ~ }'I3Jlc~ӺA@# Y!}p.@ 0,a?q+}]9ZmN;iXHxʎCA.2*ri%mK;6 )|%ZVHqV"BQ@ZOd{SѤ'?pe}ɓ͆Q*J쇶8<L/," ᎧA o||9#Iu4/%.8L{ . p+Бf8RsP\ B^f+Lꇵеlm> 3;qQ{ ܂nn8QVC֋+!sc>ؼNݿNΈw&YINv{2z8_KPjlU}pH˼̓yQq)&,N|%U.H6?_!<1ӵZD_f^J9.]0r35+U l?\`̫h̫uWo?\ R-е:3ֲ=>Ѷ?1_x%z{5p8f~ڎo%|+oMp&n`63{^wo6>}9]L񇙗?2n9x{\8kO|/O >v%%?ö6,{ϳ' }2-<oq^̧2W-#MQs9jy1zR2@` LoM 8ovsNe=NX;[n[V6pkP&Iٜm0:4̭|G  _Lez}hc5ϷpPc1LBf ئ!f?۞hD4#9 O?)b̦w ~Hs Gi~N}+dV?G!66\~UUw9z=+V}Hf_ oGwcaOgdi'иy򸅄JgmeYndTE&2#xƸ{=Ӂ2omo :ſeh)A# <ے ϕ$h{ c\JOI6{ӎy*LOF{_JV{VK櫴:7%Oĭ0ڽ [gٜ( 1Nxh7u1{=_{}*.P2[nHqT^6c3 +)JIRcol0 Ime(5xd8gsΌ?B3HQ]u-Xf? oԗ'Qo테lGAEDf<(ש="Eaxƈ7ax oe'0M|sa4v}UtOF됫1mg5:1̿)dHm~OXYO(C@oWaWc6T Uƻο'>y\⼭ė_ YPrX(4J 'KHH/\ Sri2-ې4v (RF-S{bQhP;-yy~%yl$Sgo8tuA"3w}R/-tgAtV6˔vY;ΎGS8R;2}ֳuf 2 KCH/ Hr41"ئx8ZDmKZT;4Vi+Frτfpv1'Yh6m"4[țAUv_qb1ήEmP]瘂[ X ~bvč,>͂("tE쇯z7ؽ.~:(Ip2r<cxS9/B*&R+rHYȇe1ՓVm}r4K'cV9[ chc0I&_ʮo ,8hO8Ac v21|EY,.%c ,+*vًN棚]K,E]0"ͮH6Ȱe`C5}'Ɨ)d9;YVmaYQX^(۽Ylx|ѲXkPd5d B- `\e=蕋|6M\2xO'#9:LO"76)XM )AlqBuhiq8LDՈdu/amrV= \8@Zyl&;X,]Qz;hz']n41t.jN|_CnsHd#lӱG'`~6 zt=y8]8Q>` s< qC^u☂bË fρ[N}ITF H8bFlN9m-FFR嵸ATnA^݊䧨oA!#*&Eg8qjg(X\yB2i~Q Dw>"6ח+?iN&fXBd=l h7+~IhË[m}!y?p;/b+T)0ͿqK@`r#O~V:pGZ>: s buϦ/~ ^݀㞪 ::b~`Ml';O1<0D*שQ&j`|w| =wW??ke>J P;k;m::Ʋ3ln#jGb3wMY:{e=:;ΖQ6EgP٣)P6CgCbV2o$1gX#%(,)C8B~sǰ@O`# /\d"q|? % ғ]{ y k x|~1c %]zt?IL;Uo!ugnl0Cݞ۞=n0[̌4 .y2q ,,E ;mPz2B(PS(U 5U)RSKMap:W6uܮ5S#XWUϪJxUUR;SB֪jUBE,Y:lZReݠDv:mS+CZŞTik/}"]d8$jJa9'G~H:GMnV__\GE ΃U7rUƨ^!1I˜ Ý4n=9h@֓cQ57NXQ&L(W>GZ)eMh%S|U(kfxJ3=9|ϣl z 23cʼP$H J|e0ye|bfNNJ@''Aȹ~q,<$vVDOJ4|w?;ar(;SmeY:/v;;YY6(<0#Zܜ\eyQMB;/f(qa͡kwt|f9iҚ 7gHԸ #E6!X! *ս\Onڼhm?V˶}wQ┙ m-3rsQFeܜZCzn&?=ey*SdW g 6ٹV$a&&''?3?kY.+NG1e}š;7 \˫WmXncrgXlg=cT wߋ?urZbS#kDžgGBԓK;s +zZ_W/񿩗+«^^7w՟bXmqzG\,.W|C} ~#>o0uS YO+Y&%2`$QbcmPoYX+za\x5"_@_'͂ qt])cN|Yp^' W]ąb2Jq-Ơ(6 F&AQhbb :1 I/W܁8LMzpG( fM1!Ljs"мӵ(ň@?dPp(J0>4D!9k !-MchA69]@:g9u0P4*# %PLpvrh7wT^j^א; {:84rɁS8 F'{5r~z f#OgSRM} %$޾_ԏDV~$&;nDD7_K%u΢ŤȓS)ݗqg:#6בq#<F{0$cqTXIS<ΓXdYXn&qP"f"w:;@-f@$'1l ɇzӿҹϓ^(_G@0\J{LOطyMFc Q hkDy\1N)Eii&qb>Za*'Y.mb4mËt;ml`1\i:6=粠G8Ϡ?7c.~#_ݎ~vVw?;S h{Ns[0&L`yC &yh, PiYzNK='6J' BQEK]4݂" oFq<ϋ4Mt@=c1:C,At| >xv:eSXXP,'ouBӓ:])Ni@i~_$tuVIGr?ƴ/ܪ$1&\&טYF1Sc|7ǏӔ팋9}c|q )sޔZo7Zq(tI?7qNo?:Cܩӻmnm{5z}sqs򒳃wԍ[^}쒽R/1twGM[-=QeҸNӇF;HL#F/`&ePmꍳbTEP< D AC,w$,;C΍ß`f9BF9K5纸&Ud!LR>>4f/߾?/?[GVߑcB:-\ ?} 8G<.hS<ōovC۳:#y= tr%{UzFkD?v˖:NFIljl ںh_?ܽV屇Xܟ:ؘ9v7j%хbߨdy1rr?n~(fw,bZ8.VAVWF ΄Y lr/[/f,|vLL<]6\}nɅ gx 1S+c ^Y*pV<\`a `1L`8Oxaͽvu)dI_sW90D(-HKIp31}U'PK bB GSR&I!com/sun/jna/NativeLibrary$1.classSn@=85MM\$M[P/Q+JCH iRw]<"> 1 `a9sƳ|`O1YxbE ,Xlca*:B;a,xI opBC>Fʓf;Vp(f:{+>w}:A=<}t `ȷ0YJޯ饡&Бu(xGtϫoЯܡG }Q\ d`*JK1jq9 `7U_l{%Zջs[!Qphc5,<`Z[$-#1F#O㲡4 07ݎe?PtójIι+<'f Z'ǪA33QіRbHWkǭj=:66 V(辑'5\dK+V9sGJ!h$4a1`Yʙ2@j:n2MeܺFr_~2~EnxcHsKt79!-TE#qtPK bBmP!com/sun/jna/NativeLibrary$2.class}T[OA[eYVQ"hDc oHğ&bhMg\;̷geۯ_vz`c% Ҹe>i- fPp&L8&J y![鬩PeԒ0?{z!@Ebը z:wˈ CǣH2^q|g*Wr[Td5ܼ]W4d .3524eH )\3k-hІ9R^QAF?ld0|ͽjTgװH\ظ&nڸ%!p"tc=Q\.}CZJzNEFLFK N%m 3 HmNњ"$ct텬03;ю7t /0"=FD֤t=QcqF5_kf-;m#3Gkc8s890~uڅq^@2I/$=PK bB$#Fcom/sun/jna/NativeLibrary.classZ `>d3@\ Bؼ+@"aM߶>>V+ *jV[kVk߹3ل@-̝;w=q?',~O#x\2iOc!W=ksYX|__/M~OeWT$\ſZl:+f;߰M?(^VA&ߒ-~[>/_X7?.`]ߓo.[ eG2o?x1p>>|a~?iA急Rl**ʰT+\LXrɲߢ,m)R,5X>"sr\r\y;S#L5OI,\F*TYXY/dde\kMKMTQ~UMUWj;T[?]/D?]jk KʹTġN,K͆K,KN1U9l@ӭ"[SU:U. JV EBZNZc,HhUu:O?øW-K=tD8K-LX_n:R Z)/ULYw_Vg*GFI.,,jȵE$RQzKp\,T ϱTR &-a"saj6["b 2wX{Uw?пłbf 9@G<C4%"&&m8bPTssiI4VZm`AnzjMMvWD#qLW26iiœcvSG"۠YD6Mk+㰅scL8Q0_d~eaCh/ѱfMtxej $FsK$YDtC{kTs[^?$# ':=m┚lOT JT7bz#YT#Lu%hǎF[q/Uc7F10h4Ǡ5t&i4w,#HVbcL3${”)S MXZ]5hC?ѸYp 8q'd7L{۝xS@^"gB驿vD[lrA/6.rTI-'"~/xMlP.? ֊h VW@Relku6>F<Tn4ՍIuB(O8V[V7[[MypO 'VMy ,0Vwp~`;]b$wt$m=iB[u 2m\"i0εս<PSk,/:ηՏ-6}&RmcCmk 8v`L@M>(M 57 5[T=4ȰBqwOlN9L9c CX^A̸xD( k:%}r#Ddu^QrY[2axVLB@0S{.jßٶQ;m <.$*$ܐXG[yposqk$}D[=V6aO v$"1uK Ľߖ~K]ʥ!i `HIVOE2zV33+!c:ME-*sz^OG KXyljwPmnMzQLr Sã>[R$`Ic&4,0Σ^6կl5$\:5mWmgyhmuaUz5@~|Imd~c$CͰ@l69Ԛ5cbPAWk lihӶlߩ7=Ow8@rHnU^6Rۢ?LgSVzV}VB`ە)ҫf'$'.z *YaF OIs|0=+?ˇV>9b6AT}fX'|./Vp k~G;`j▶[}l1m4|OluP;7ooy+#&n6 ˡǸ NE7(Q Jw oZ1< \j>*HK5$eIn|m@)ԧIـ^tm{7K#bMw\~)V@G}=22_dW ?Wb`}:_xyq>ot*meάtHe^P*?[papdIM~2aYU%lxʗT,Qs}%y: ZL/WM;q*F1NV+-uj_j|Ccz1!DoqtKD٤Q@M{}{pWϟO߿z4!f|5 "հP7y^\FuO̭Gr] |c64+20)|ٌ_$$z:.Ž  {; mqiHIG)*}OR}OPvǘfr4,n\\'hvzF%xꡣ;>0 )Fw<ax獜6VA x y3y9cQ&Sx?A!K ]Zѵ[(pVEuV[v}i  M8fy AgQ<|"05RvKw>Am4mc];Ljco7 <EEXV\[C%<2o iB3MAoHqлSbrm1g`)2sObLm1AkAy7;i&臊{̚nI’*hzzht1`6:Nq7p+-+o|v.ݐZZO;h.~Ct&Azޡ =O,ϺxtUvu6*23h>Cɼg{,E[^+5;:DPn=ރ;R[e9[9: \#<Ȼn-=ZIYr_eRRa6R\)l^jV'f*̾<BAsؾz+ nLw |-߀mNknp“NL`#5s!+8|3o)(CWTfSd'~J~u5 ږš"uk' ysQ(1r7tS['d zr">5"#nCMQpJ"V(F^N6Ϡ\I ~̳TC5|2-4LBv+\dx켴O°iri.NZT>`xl z\ w<FP4U|?,p'B@]CE} u d#S'*㓰BPz/8OBIT^.J6;@b eN "ˋѦ=fMܴ8 : ^b4{^%).p>HgIte.̳67=; z7)vK ^Њ0C}<L vCfs6a<84/cR8ב/.0m:Ct-t7_KDZ'Fy6\ԋ:a+7S`XJ霠->@!L\O#qN@OEqsMD3.ttk> `gXϭC<+ݯxq -KAKk坫Bd(B9/~]?h:ZaYZ7%Np ]4M(=i7 Ҟ3O:TlibMR/q88lXJnZ"TLu@K9+ġPNAՁoy vA;bmp0[M.q>$C;A_um׼d2)ꏡB _hy!˿P .`A?3Cj8NS!_IK#}stk !ȵ>NG9txQ;@u}Oy&QėN&/QRTUE=١KAyPpKcK:ASTj(Z(a M%eX.HkU]WF~2'1K:Y (y3\ᗂ D>.#Jx]6WWt֚z'n;%VQ Ka]d`*J:L4ЖiiLvkZj>e. !R 72ui}9{Ϥ,&Cլ K縃 -07-)MJrNg<nϨNΐuAZMi |\2+  wk?!,$S- 3:DSG>X-.Ҭu-YT\سxmǠ)2 {vѭ ۘv N§v# T4Fm,u\ 斮o:g$QpQs9 8锏sZIe VQ:T֜]\g0h4qሲ8ҔI^ǽPr=% N@j)JG+teaL]PBI!Pp(P=tO(k;L^/byYv,ZM7}-Ҋh&*UkiZG3zZi@6:]LuEU<Er-/y.â! q+suyk0oy'[T-ۨ }oC61BO<櫓 դd[t|_e:)GKfyT//E8%H]FS{O9PNȨa;18}rFA3Cɳ_NnU8&G9ຌ.P}h+]k |bHڋ]#!hm̭, "줙Tlu} lKECt_}}Uѱz8 4K3 NԭԠnKQV~UnF8v8 uPeÑdsmFyxJsy!lbbP93b=V g :0jCҳ.!9B<~C*4LJP ^Uss k*믦lpj2qp{j {e[IGA8MǨ0h {V=Ԣz6<]~HשYEz u:Բ P8M2'T%^~<^:P`$0k9my6LN*hv3릞9{hSr;y.Soy3z,qH<ƪרP37^C`tP>bvq K:? &,!/EO!vz7 Mߌ}t-+@K4L]kp/)hrb0vWzwke M-3TA燜.J\G$($TEDO}sriAe&[࣓QfPL76 |cF.xAÍ4Rq4`ia X4ZhL:c a|-@ 17vp,-x9;HkU|TmZx#%1x~@X@ kN.g; 4ssѿȁo@Lz*d=X/!I{Ц: k."K8r of ^$|`6)Dt5ZJŰ:(qi1iʨQI7 j,+xq60njFh-F3߆Xyњ:m>nE:%zi9ŷko3g_ŧtz"tYGq|I%i&uP"Iffq9|A/sBU[_~l(zT~ ՙPK bB NF[com/sun/jna/NativeLong.classmN@ƿOۭUPP$1$&ƨ)i,hI|,@ӵQ^f} 5Y8%(0dz3)CqЧyp0,wxLn닉e&|p %ƭiFhuE+'щٙ"j`m{ \1,x83ac݀ -V{* T1wc(,~ iGbg#[ݫx%Ӿm14i e2&_I`P]*)֐4IB8Co.. m]B 2 $VF@Ui dK7CzDž"-iPK bBu\'com/sun/jna/NativeMapped.classm@ϭR$GIlVł5M4^x(1%]ܳ8=^36j6gp/#׏ -#hԖe;"⠽3%y0f,ˑڥAZ O0ٻOh~W  wQ1jPK bBARMy 'com/sun/jna/NativeMappedConverter.classViSW=z\hf'1JTJ\&4=tcO}|$BbU~F?$1 6λ=˯ (2\ \=rш`/ FR0`#a|1A9ՕQ&FYZd˜ cJ0nq[:59vto*xK bΤ=Oꉌoى}]ؿ5a l.غJtz:֤ͥ8-'i]''1&$7L\޵yUܖ5ww.:ݤ)Zٛ6~}ئ5t{@,3 OvI&I\6GL$ F 9@ce6 UuZ^*x[;c 8 :j14Gv0w4M^fO$ŀ}g9). n\o1뜹irҾɶ͔n4 3^t~g!Yi˰vY,߼ Wg5#\QE1 PR@a]ݹ~1PLf߭Laع5s0,º/hFwUj֐\@a]8ۗsG%Cc9ضVTZ'Y-/7?/e<+X-[6I_T| _+ kQTBVWsA7zZmԝ}fxh JsG41y捌iMURQmyE`OkmSfR5ӵ,K7-#^0 覴%rc,W-6AS~VO6.2yy9̹hܩl,_MY/ByeBF?\>^Vd:m^6] hm^T[Vr:n__J6ie5 /ͩ% }(FQ!/J0s# G~org Ǟ!3:"G';3(P,z[bwpu'* M'hpxOC%gq׆i#PGP7|D"ID*Q=yc,6Ul̠bz/htwQ9l;ybXWo毱BT`[Ylf$3yB" _i@$5殚A}Mw/AY{ENcY=R\{/ y"-=Rvr*q28Dm,:v8u|B~ϒ@F** 2]PpR(!{\mU<CC|/ 0qNB|eUʤ7XWqCD.n\+aڕOլC.`wmMo15h1P"Dc<94j|;KqҪ$m19荄<Qż;h  (n PTB@o?PK bBT com/sun/jna/NativeString.classVkSW~6IX@-jZKDZ[۪x! x mq ML6ٛ|;ԙNs.1099y޳o7lǏA%uNM/QrQڎPh_!:ɁCǦCBbZEӞd'+opn3ydE_ S:q꜎㈇Twwǖ˛xqoOVl:XVܳ29)xinN],yZuݫ< m@t! Jzs6u8>UkPYn-x!@\wNo(ڽ!u [~*۰߰s7DZֻ8 M4Bi 9kǙLf̀[[c oHS>ZU]c%Fu8TB˳Bt :|S!mߣ=WԟxA_И}je4]E3 vp.`NÝ.~*!1%a9p~q/} ǃ _p</9~UG-=8#ӂx։0ωb+ ;?8/9^xB18^/"79z8x;r> 8>S␓&Ř,brfΙC 'g\< 0'+v`7}M PM&-Yų1X[VZ0u0g?jh! ~ >_cI@P/hB;mz} ' ~il6C~))5,bA_d3꠩"44 5;0q514 : ->5IZbC]$%6,c(*6oC ]MvKþHhMh (dmk`k{W^K2'L[K\o^b =SmZg\1$Z| l2m4Ce KguZ]k\t'S=c=>=nѢQ#-E5 T2E))ligIMQ-;n%[^4`"IGq ؠSN!P4zFd֒қGdnJF-&2ׯGetc題ŝT2z^#p|i3LLO:SZjkXO'ޚһ&Ν7r/,1u^-*KKE7#t'_e͑yFq-&3l{3db,4fTሜOsLhqjI_Ņ \ v[b,2(BVde +g*WaD Tgb"]ZF٧ uXFp^٬_L/_l4FIIEȵ]_d Bpђz_RIl2nXI{[LJj#穨o$LGaոIaSpaPXKO*iިQT6MaӥޖXbA,ZѥID\%Dn*t  ҙ3Ub8IFWc?x_lXV ,A*KY%nd2wLI#[9Al"$slRDVaE"rA}#rWfdQNv氣f~^)+8 a z}lg4һT]\Q9G9ئ6o\y?_jq*H|" |:.g.W3Lk4*K:5^Sy|C}7úY'ύSHrج{GyǷk#KG+!2~8~وz1>/ڗ9οC ::Ec|7YcsBw;Gԗn ]ZqZjf3e_V=nvjoLqBΟ{< wE_Sklux_3~Y,0lP< x{农2i+T0v^a;%O7aҞ}ڏIX;Cu Fj#p%2W-݇2"vN-ϑU5GNV'uARPQ2jp+؋RFM'hahF&".T:pH캙eW4d&QlD)R#JANEi8{@rpM 3F63尟yQcFa)f|Fw'HcOCIpq2aPgҪGȥ?QjJ=e$p!:eaZ@:5UG98$ťN4@do:?7.NIA=C-܉Ɠ9~sL4-pv9;yd<c/`?cS~Dڂu9sr{a%^TfkC8VaPV؆P45jHX=>OͶ sh|%eTī}שS&Vm:oޡ3]P?1SE5u MSr7)S+dKdxԥfߜ%qBE=A]6x6( ^zw9%6zl/G=YqY勝u)鐌 =j!`8Qs^!ޣ6pʣ %>6aH2yԕ&%DϽtY`,C&*LuTrGYizN:(WnǔL]Jbc qk7PK bBqOcom/sun/jna/Pointer$1.classmA 0Eh5Z Ľ (Oc-uM\x%Nѥ3|o^ R 7uۼts](9g{W_EaDZӡa]ѿ|I;fWK KÙ> gk;]$EɍЗ=ҡ6PK bB_ com/sun/jna/Pointer$Opaque.classXmsU~6m6 -o $ (RBbKєb-ݒ(UEQEq 82Qݴn{'_v9{=f? (ǰ1lbІO:p?;rb>bׁ/e U_G@AhYt*o>= rJ5D.9AAtv6W`Z0mʄjjvfXU:3+e1USdh̽"۫ 55%xFl1,mb S)?%0V&O"Irjd(djIAG"7f)V54E1aRa=#2EFhjPvng9aaa!lϙTMSirkeL\2 WkFjDX318>;rg _6ꉛBG(=Ga~9`*QOިE6qC0D+35Rb&--qڣ"!b>EonժUZ4Vejk~nȪ|EC3Ŏ(~G+ضΧ`Cz FREj鴓LiWcYVw{S떽b lAD oHCn&j]h ?C:P@=t]ǃ;D/7`;HqW\dSt>ǚP#p_Bnϸ7Pe#n=Pe>*_>HM:DŽJ %~AQ'(p$:܄W*&\Ip u q ^o׉\'p)5d Nʕ꯳-WZZ꯴ToRkR5RRK|Kꯉ4ޒ8'}C}g%N﫫I`PI|Іq^]@Vm-%Ю`TMA1 yKxG:^wg4_yKTyӧ˘rѷ+xOvI}LI {vtp#~\(H n-I0nƌD|h,}'7nITSE0*;S\|{U̻ C#Ow}n/.}o݀kxɊ"KFPsn[%m1nCǿPK bBwJ%Tcom/sun/jna/Pointer.class{{`EUfyBB"FM4 `B$tI6 1((|?(n( N=Om<')NNsr,'q߸'EN^+yu|C7=os'tC㿘=wC1|5PC75q*| \)|n5_xWLCmn(o[sk:ȅt?@N\s[.F'.CIBKc8 sk"Ɖp2d"'b."J=`p6!;ք(\9q &܋)\<\ɹ k!_c4N(tT&iZXAȔԪfaEu5EYAb!5ٔz, -,6*WF˕V:Z5rU-OUrP*'Ń`K#=!'9/1ښCjKy֨)\Il̶H2κP[GCڰԃ\kiYLLTDpa1dj@ѣL_T?V#-Sm ,C'+ЊVdz!lhkvp;ZBI5:7/#|+F0m^yv\>N@ -.bh 9dƦ4b.huЊri VXKJkBV VTrդ6XbUL KU=$WbrKHM5UViNWt45qB i@sp|Tn"[5s?rk/HgfH-E]\}ɵr@CQ HF7٫U\S=!-gNiOQJrzhR Q]m9QoOμ MM9WҬw[63$}$$ڛRp8SjʑX8$ediLNYcy؝C:)D.i fz!4+a#Q.O_njuY͚1:ƗMa5(LP}gh o2bfڃ-qă@NE5q줔>Vhrj/G9ldFԲCQBfR+N;a9'̙5H`t$YI%XK^hWNJob{z`G[Z3OiscŴѓ(Z'N~6ք]!3Ifi]hDS9$Nr9P/M\ߛXE\E\E\D̸YLzYje"0<)b?Fd)6SAt"$6`l בmK: ڠDWt442R8+8aXaA3:@0TJ 7*S\-}5S ެߛZq)煽F`"n&q3B9`SAm=T%?!Lq [Mq]wbwf^Xх/ yFAn)Y#&Ugx6USKΩ9d$9MqkFyeX/6x9x^mx&5,4fD]d+,g`u"xN1O<|:ْԮ {p=gܸf mR1wx[ģ q~B6]{&2N|s8En0]:}SϞ: 24W.@;W::Qi=,ӬzndA=vKG2)ʄ0'o\fBM6Z)GYwBűӦMC'k߳ac[N狋k>÷.-59& JnZ(Myb5:mbH .k `?.nhp+OOJ;j^Xc5b*Kf^tғ2G!z(hiHq:5]lk~ItD& Rar5u)ҕU/p:ߊҝ/+ Fma&s V㿢=_f`+ ooaP(XX.U PhkOF%/sn/P`81(!ZS+(={@/&-ðT.a)5ec` ?@9; $15૱-f<=mcB㪸"ǃ|eO*?n<&!p$ j acٖw`cr-1'Hw滯0<|_'˚G8_.s9lJ9e[46j#H74ƸxbO\yQ`yn5zuMY? 0@m`8x,42] wcԝprюѨFT]]͝J /1߅&#ndDGRlITzX낔 "΍{)8fl~[iKlIuhKIbpT>h2N9MثD7ʛAe^TfUDw{Ae^TUD>{UIR>EཪLOT"|iTًʡ{U}Pl_QMԕ1ٮMt/Yez U'N,3v!ݫS 0Wbu\~l38>^.ϼBVF=j:xs0^'X@9$L[6G3g|54B9g|5A RG0vʡ &‡~!'Qe:]P> JTO* ~>*KH߅E7Qe9 IT9TH!>;:qbʭAlg@\ la,Bd wHk#qݵtmdv୽ȷS9 ɔL˄ [xmWʄ|"Oe0q "Puiaa&qxJ2h2512b)^Y[Fw&AyI_K:a'x"OI<bT"Z%`I>e~D.\.ɇuL։<"O)|D'Id4 RLe.k;LүLasd,ӭ'ni> K4TaqbLJٞ8VG:Ǒ%Ne˄Vsxwi04G!ERo.){ f9Pk :1l Ƙym-0>cV'~ܫr-p%ctL0!w9u$ 0SL*-iQY&UǕ}ƫG^63Hm6-\Eݫ;tu} :a}ɺY#k%버(Y x[,tK. " ¦;"ӝ;e:oevZET \Fkge='=ÑHD;0@dB/\8"G,Zt]puIt(#'1ykoۏMҼKpiG2:۽GnW ~:h  ޔJȾ$fdQYƴx;'Vz{ԽeKu-tS[ݧ3RoR)K'HI VԥԵV"u:T׆չbB)$@Qa&uC91uVgTR77˓N;4V#Jj]馼 KðFl3OdbjEp{%% 0(rcU' ) Prae0+CTɋ:{o@yLIZ I+dP+=к{2ta4B {hmKfQb\۔RF@(Δɡ2KPr%]/$ݔT~t%׿A(I"8̋{p0o%m<ʖIK޿#iI=>{Jֽ9QTOΉtcrIrnI|_W7v8&q}}D}=A+#0bv;U#?ˑe[CK{4]E*vh*k9սb2M)ĭDX6K)5U(q:;8z.7)s{5d8aq*\ۡ6lѶpTRamYw&dRdp+Ta )/m0C9UNrhPV@@9NQVBH9 WΆu հE@R+A Ŵܐsp5͍C&OpיW|řW.TIsG1 ΁:[ ;$r rfiF (˗ө\=lP:n Ђ  Ҧ"E+#` n'c Z9RaQ-E6[d+IT)3wE l'uq l&DWe0f6)rp ,l;ln%Gd<"p_O'm6b#@ay"YuU=`w,4UU¯UXXjapl{#7 8%*o0n!ULke~t&me>ĒayuIޓbQb+1o 3@#La(ck誓_EЕ+z؉=,V\ `\PX7)7zxJ ^QnϕSӕu8\9P#{VYs xr?.U V6jA\y*[-إ<)[q8>l÷' )ܭ<#ep);DW<+āT j2vCdZdX郈\"#9'boJHNd!3qx<$8'ءx͂O/ =֖RE+ޟ{C2 NX}ʁէ*&y?oy?oľB.LVӔ`oXaT>U'p)\|7*Z /S Q'oy[x]RW#R~B?_Pى%._q&ZmHWﵭ+:mˣ]2١Xkcѻez5q[^lq^$`ծ ^rvjB:kZ=#d?0qQ|Gm6ߙ|;$b \/e x|MK׻25i{Aiz)yyxL,Íنzx&|mx;ڄ}o]ݑN/VCY](nbTmߵyG? AnkO`2]AoB1޳5Śk*ܫi ў'B8,/M&ӄ4iʃOi>bxWSV䊼n*CI\Ѩ]PKG)M&l*^}{4b޿]ok Ym@ܟ {![bqKaY+ILH¨TǷʕgWrii޸г9;͐)?>?dk Kj_x. kٵصA>\.$ڇ{9w??`qA=cE-mU;2d|&sƺ7pW y q/BM1cK00e<jꆥ$ e^0RZsBWtC$㉼@,i{ZmCݮp'5j%tn.a7UE,*A1TK c DvW}*QNe*jNel# Պ-f:B*uf.;a,3&Y鮉"QTnϊZU,mFVV+׋E^:JVKT$a IK[WjVn{xG8ʳ V Bi0d&fݪF]g7-C%fVԖt2'=1'#D,-LDp.E0Q${侓Zh Rͨ+5@Fs<KϙVLŢZ)fmWI ÖͲbqҟ y)qUtH0}xێ;C^Axȝ<쇺gySC[DJw[;g}sd >0G1k4=9뼋D/`c% M>Z aE ̐*!9g?3 -wޓOE0r}M۝`˙ǥG۝v`ZԾ_Ԯek !\}g?.8o2\T0KbBQ/UXyI4e *A+b4)2EM!Ȕhe2fzfe 1&9"Fi\aɸ!!ԤaNI(nhI͜j\;.A65˸g$log-#gd,nRic0&f0(i7L:):2iX+5K(3L} ;;/iI]I%䰖6YYLl153n {YGP1MCP$,-q_qJuw+Lb#E{[=&ܺgTLP`0e{{,EӺ6)Rfm"B֭lP2^cX*#Mnr+Cl:1D6Evć.]8x]'Qś,qD**Qф'iꐺ<2Q.nxwT}1@ŇHWάV}DX;n&+:~_+fY#9U|e|K|%&_)0볩-w%,^?52 2VL^Jj( Yp>+QKLݧt[eVoO id&I*1SX h01@#]尒Uԥ[iUt;U墐 T&lXrJ W'#2yM=?M_qg[>b'_!a#JYe6)ےјwҏa [^ކlG+Gy3<=:`󲯊SrJAB% C*Zx/=B S 9T- ā8Cu,f4EmIK![WjA) ID92G?si (FFлM~铀M ۨ`{-[nV??[k}ՌU:[d6l@PK bB**com/sun/jna/Structure$2$StructureSet.classUkOe~βL((eZ[-PխՂc;u;MgDM%*QcbjJS/ˊayys.w|@:4a$fFc8'e3 'd)< ,1L`S89 kfќ3m%杹[Sl#JW.Cp)2wr{k8EAضY+k2Iif [%tǷD &cN$4f-ۜ,͚Sl--Y'oO%KQ=ʒ3YiVzkq,]ތF0_<#"H]M<#Ƅ1xThޱ=òw[<{d}.55{{C1Q(4.^߂}4c˲%ܒ9\uV27r c 8X6W2VopM\sb(k+IlnrY&Uo v; B@SFv x%Kmn1y-3+1C97J I܂-Z]KP0 .&Y3OET t'4vz->.qi/f7c\DH KV,) Hn@jg #̾#&p@Hr+'L5&ޅ.@U+47} x8FhۨW(F2ocOBgoNҔ8ûi"ɯu-&ZFWk(>>[wa Q'=:FwO:ة2b*7yZ_ƶ,߫u~0}FZq75M'_ b2" ӬZi'4 } tt!C^eJ:n7'U-LsR[B =[[Zwlt7HO8H?W=UE DG8݇h r⚯JVkhoL&8tC] -QʕtA G3߅aENrCOˠSn<nL*s$+L com/sun/jna/Structure$3.classuPN1}]aQA@A {Y,m5oѓ?26DMμ_*X{mNQ| Ŗtb>b$*& #;8$ Pyx4:%suBrSX_PK bB"'com/sun/jna/Structure$ByReference.class;o>#nv6vNFҢT̜TFҢTIJDv.F\#nv6vNFҢT̜TFҢTIJDv.F\Vs+|Nx^w/ _ < wyrg'׿!"5FadxXѯP>sgk9YS2r]F&dOedLF>2rCFFe*#'ddEFFddUF[$a-dE9>Z+7݀푸 J(S;Aܫ>yp?A<>K<U4'7&9ɉ-Nls7O 7)nV/q#g%=x ˊ+Tد%bě-$(KH?ܘ~|>ۏH|Ʃw3~>_ϗnT$Q<4'ܨaNr$B ura %y\84I.5$ep dJd) [}FPts\h3qr%IBPdmm].Յz:g⎡q n 8Յ" .BFF&Yw<*|ֵYҴ@uH8nƁN+iHgY;\1/kG>%əI`{SN=!'ԊH0ףR,J旬bzՑ );dG*4aZaR #hbAbalzE];$񈺲7lQjwcMGu1o)qaQO!=`E$pr`Yu@ˣ(+.ؠ>SʋԶSؘ$%#YPDZ80-Fn- G*gppm* }U v P6 cK.tsh:5:Oؑ-ݮ$4zsINj @(lKw]XUmx$UHH˦e)_s~LdVd`-fG{5|*FjkT]Ll|jqWj6?.X޲Af?KRQa`sJjĕt`y&ŊIzR )fwrtsn!&="k7ح6)Կ%acߺ#5ܼC\̩>1`䤚Li#]0!sN{pT쾃pw>F>Vt7}pvjn؁:_<{e[y|dz0A2 01`| y3eRV"|v)d+,@eE4.!&^%\&^ŕ5|i40a;S. q٘+qhl|o_,7q5`쾅oaawt>ŌgԮLzr{0ӆռal og e8y'{mecvC;k>u?=‘`7mǼ>T(lHc=dcA;^TũE}W}X܏{*D}$, 6B,7X/ƺX? jTiK/D@v@x$A0[c@ r46\$pke>ncq<"' Y$ryd1(}T!g UQ%K9gP;1vARJǯ9*v,織V6QfBP%S'+Õ3pZf=oL'n VT0EK$5i.&~,/(@q/pE]k~,g%*F>5Âl,X13,MV\Z,+`/V `L+؋ܮ8kg[nϱ75sw@ @_ B[ڒA9 [^t0;mp ,L㝵[[C7̆%L,h[۲[S hyK3tdrf)Z KKdv[ڪ#0sXzk(23-\]`PӖMqtqsyg1Ta(HdҰ\̦5'`XbqsUg 3vN3+*ºAk \C *Z.;@2d;2H$=d*02FU |2Aܢc|21n65{tN:4y}B;4**Kz%[=h)ig=]䔛ݒ]Y_C0?(*ΡGy\Pь*ΠIE+TQ#7`h]ڼSddU '.duCwbJ^p>Z=aӶia[tvz޶]]#.vr,Dv7K/#KBf^6wRY⹞z*0FQ& $}Dxp).s9ȶ~",BToj q he\DJjQ, V"|`૸<9,rI$2-!О/ܪ u00 :|Z)W&*8D7]GHPH?66)$?hR;`ʧO, {uT* A:?nDՉ'"1PK bB4br'com/sun/jna/Structure$StructField.classSNA-R* j[U<[DZCB BƋ,x,hI4|(?l|>Y$npʎg[-u%]"%[ھOpM˫ʪhΖ ^bH;qexښpz%Ѳ'T\2LT7#l"*Cy+ۂ:6!ɪ'vk9Q |af*{5<llqaonrL7CmVU%\,"9';Z=OP)gaN:Vzk*Ѯ&p9 0KMǭqi"3&P,h+x) &1D\ڡ6krAyuHO3w n1AL?li0bLY H p$ B18ex 1$_!idF-cOkx  #Oȓ CP 1"JǣtH8@W=-t!ir\x / V QPK bB/i^?\com/sun/jna/Structure.class} `T7۷ټ$$!;& `S@%YB mm!HGVZamkk[Zۊ@~7۷ߒyf}3X4`0%ߧ|m=6~D#NNLStqDiL֟Qb&,Bl6s\z*ba.X?3>.+~=b"[0Eqh8Yc6GBn X-b#ע$'o-MMnX(jE!B5-ѹ !Z#-u/jYSmP pF I7$ u(" KOQ``]ő˜[(s֛x{^5M~dwX@lvIܨ⨴& DxUQn F4#9 !G`PۚJ˜X)+=ZOyt i]% @nIEX)܅{ӣNg"M-)EH%nƚiUnBIdS)F9[Lǣ(` :"4_*N#kЭYDŖCS0Lˆ6,VDI.a1:r|rUu(:بOѪ 7E=xV%hZO4b7CK~&c>CF }G#֌A↑GqE5FI4bG u>ߨHBAH#u' CnECb6#-uD4F(Wյ56P(*)qpwr؆1^R!3DJ;,Fwjq)8y|cL0qSB.Йc(ީ%2;TKR;cʯ7aCK\_]T ƽ,I 1JmzP.?Uȩ%ߤJf\bc:iU$qTH-) g7ͮ1gx6Gii `a)x6UGQiU.ԀE<"q%YaǢq87c\V|X9pYt8tT ilQOQRqS~<-c|\a DBBSbB FKcj%)583u*P:Bͣf7[ƍTM]{3SdS3=cF)MB ^5\׀(R@~Yk:#>x?+56$<IHȺ8F8JmG^NE69]X #[(kpIT2Y1CPeEmdq[]CM!R D)Ժ>k57hBzlTf @ G/PȽ%TBOtȈrXuXQOɍ(A %ו M$= 22w!Jh:NxNRKmq 9mnqTMɘx{J]YiCbN6Q2#ihǮ6gQJ05 av\AC6`cWvv 7R_j`NWُ &~3`{4X]ŮFzv$ _l`ײ ѺtRpoSv#im68DIGQTJ7]nmgw bπrrK _kQ_sKd3z>sѷNE$B8N~3B%/äI_S[շ.ۀj_kC lT i J2 ~&{`ϲX2`{tː29<5vOBi%eo2o4dosPO$V=e7O 'I|}e?]z _ːPC !r @j#(=peb{ QBkY6& C3sŠP ٟ 9Xa;Yoȡu]3p9xh[s3!ʹT9.iE}j|`>4QߖP+M;h4q,ѝ^#ljnF|͸,nX׌,Xma2l }b!⃼f 1?W;ʾ3x!$ّv6\p(2jf)'~=9`fA&Y1Q RYfȑUh9Ɛc帤ǚȮG0vG~7xX{O1n$+H. C.K >O22$+-dR:$ԁ ) 1$,G#"HEb!WU<[69r -Z=$uWg }8*qbj#"B&Ƚo FաXlN6J`8,YA3.p() VSh H!e_d*E"K '8Lyօ13[Qx >#|zAJ&| =yEi]q䷍r åae6FC6ɰ]yE?ʇq*ZMȖaAl8F$_sۺPڏ@xDk҄ͅfy.wۦ&[2V}lG@VC,nP_!373R(63:4iЎT͊S[9-\gQh^^Ge3H,o![i1L Qi+ FҦI56y>|%ѕi P^S#82l3+]^lK_—b[97FЋ"͡!U#:rg./3U[L74;ݐWɫC^^N^o䍆I~ϐ7Nd\ y)JA m_ cvtj$j%SE"p7`b" p$R5aV{{Gދzb~ rE}uƓ`]]gH EE|@>-fˇhr'蠔(߱-ܦ50d&&NhM"I+O[ZBPOS6d@$ed`2d [hM6V> f~6ywtr0``ɣ1=q=z]s#/in] iNw9w\ȳ{НD1!h*`'\$cގc^UN^KNW;ONѧJbE ̩]=ky7Xx0=om $]0Sg'[.RT.AL}}"ZRT<'Î?L$?KBOq8uOd#@[cL//l 5L';,њ@.DqukfvU?,d٦ٛ)o jG?RٷF[M&-l,n=%SRcR o ~Iy:52/x^̡Ik7XEM([ O6wxLTOʃ%̥_BѶ5)Wb9sN5V\5Ve^&BXA$1ޛDTi*1vܡ BQȗa ɱ-jį2ڷ1%Zb]~(Ul"ATrlb xv0U} w<_:/ϗ@| }L*vʯv_kױU~|ߤzݢ[m*ݡ;.vʷtʫ{>5jt!1}D 4=%lž~9AiARu02=ý FJpFLAkMZ%,?h<tEN-`5a_#j?P|f;j&\Q7$"?D$H> IKnD45mהۃ^DtJ()N^%e!` #jzceޓ,B21}z 7n0q&0A%t{l*T.b&w~-EgN7bu- L_uEy46B{=ȃǦGS80찥6dI V@OC ;>菈s d/ SddFE.@?ְSyhnɌg칸#?IAd#%L:d!RZ`W')iSŠe(AAt"~p 8 ᐃLi)5CHtAo,NCA_:lp4z>!IgH؜!K<3l(O" 9Cö`$gݵ2Q| 6E0ҕPL E %&P*c;?C+-2k¨9ØCOaTJA+^} \H!0X`0a+h!Blx\ϾlKJcn͢ ^&%ڨ}ucRHjȓ_99mtςҜ08hJal;L(Y^R";`\\vwr(;ȉDI$ ot3EYlq.V .W!jJ_I(NDiX|,$ 9^;r[4⑃#K1:16 3~%{E!'NAk[V{d,1:hf9+;2;`UXFV)LW2-eN Ǡk84UƶnbZu>#e锢>'Ip"Y>'ZKpɹ}O^?8@uºp;=u6=:>j97nn:`"W)mB.4+kVOCRB|&dJYPB5 x/P$a;3 \/MGm=jJAjT t0Sgc`f_[!E/Dwv1af)onlPZR;ejhJ˪݌vDvЩ@YX^ 90|-Qa.yjy<C?8Q┅tXMy!1U}=Sby b.?osr?*1b\!C`<2ͅM80)fiSк2r| R\b<2K֎CWhep.N *t jE$W'߯.p9WMʼZ\T"yׅ.>:d{5K]j.O; KZ-.Η^nre7luY-h.^D⋹ctA[÷A/~> {/8_ ~=o 1^w'nY>ti@VQ=2tƘ=ZR 2@6.#l71p E(0N@!q3]g]'S\'t<X1<[c.Yg%%9*rc=y ?Avzƭ;?)s?1isU.\vT*A߃6I`w?,,*<凡MehBc[//sE0%0f/rhc1z..썄IMT ?AcNhL'Hri!8"I ;e'A ȿ?Dl?Bl~~W0ڱ/6x1L#$%}`. ]HFQN鶘"A4\W+TpQ@W;71Nr'2]k.Dm&]YߗX]O湶CAyT1I1*(Z nj$ךR0BW$W [;iwwʈ@ۡ x{ ,VF^݊鬊U>2% /C3p?B3_ /Q|S?`6B=1O \×" tV( vŪUV+rC{T>zCQ\\Gniȉ:EQxw[8=`i>Nű JKTtn~L),wLp`1 +}:u-˭yf0 Y]0:L]/K/Q>RG$xo]69r9(G8aNT8{-$ OҗVBtehojJ }>ί@Ao)i֫ē%Gt->iWh+O$di`Òb&0]̂b6Ǻ~RSG;Un k*Ar$fh'e \nOu9NRBy>cX< hGs,8"DAxejkJїRVu-[T^%ޕe`˛~QvQ ִw=1A 3aXb-@XtZ5,XukJh YmӬ*GEhBQ4Ui!D @eNAGS4 HAȞ'?`(# ȯe??ZQ"DB=BֲVaβ/#0<2 e{U 5Rq{@Sx9ʭ_FEXݏf`]쇧f(>gf8ci*{Lz*Xr!fޖ)fg=,)%Li2oMlCBy`%R\ wk`vqq#Z+qy0Htr_mW X#4 ;-:S).S?cG3 yd$ed#_t~w>㰐rkh h{{]̓pIؚ6#F=Mtg<ϮEY{j^jO,{+bL2 a'0=k#S C\zJ?YtJvҁG~x K}*x8+y$137iL@T|&:!"@Zt0G|'Db*M$԰hP[dOHN:Է~\HN#F*p{]Q ףP]~jޫHu*n\MW!崧;`3 wm9uЛua}ȥ{= QBe;09/|j?J*BO* š冚Ee%4+2@$}AՊ_ߠz*2sa~[O+2}p5{Vx}pq;EGCgt_: f\4̨Tvj h]і.)$H¦S!ۛ^hWJ`~ǬJ'|yWrl>D#Kf y"J/c%% r4 vX^-Ob_9/q(_ʯiWB \@̅Lzɾ_ҋ(% a˥Α` Mr(l9#VYwbxUhxO_˱9PVqr (r&%+9-sj9mU,,d &Bv<,bv\vʥi,\>+٧r;*WsCs_r/uZe! x K~lW~dGnm|a EH 2y//r1W^%jb^l7-b,;NqP- yW/Ps 'Z`7P~:HUހ@0X.R̽;^*X,VKUVip,t(fo S'">v.Br+(;D:L~Ց| CJCR(<t@0VhoڷP;:-l ; h@Wo``*t{y|ތoa.97s3(m$ ؃o>Q%%^t0Դ%e#5CI<-y6u?3ѡdD#hE0\>L@h܋Fz<`1ÑY"J ƫ3SrAvZlɱ_"\ gGaQZ[MXEJb̅٥R3,EAhccYSY#vτWJVORX0 PgQ+=}a _@m /A|fbP-_eu8[ ߲ϙhP CH8 %sR-mO67>mTdZ0oY*!g GUFk﯄BQ_'{Juku! @v~NɏQȡ-?DǶG?{~(T `tƾ@TkEֵdڽ~9>f1c &^Dص|u8zynhf74:ګ"'}Gk(ߖk ;a|.,0a/q̲s̓ˤxr1eYg~2\TDSE0P̞8l{u)5aSө~_y9tUVH:hU.KR.8Nhq$ZBO.{d'KT= 1dvHd; )i5*;YvY20X,}bc]!Kȕ W MU= :5/jMhn_iZ+rX-Mt%Z> XXkBo%q}pIJֵv_Hk+KQL6@k2ry#2rEަ߶x}%,tܤpoǮ2m !KR+GO,HA+w\֧ZZ(v~I;HдQvl,ihY*|2ܜ~ ']fP2y;Y[[Ybu_U UXcf0) ι%<=a:Tuڻ~:lP{'lSiZmvJvEZ7͊<A+qT#6N;*Smh{=褗X~hVN'f3Ӝ7]Q1͌6nU-d#=/0AM/!h!Q'q"gaX¬VJb>jy"E@+EˮVв [2ֽ%c,ld?tuݑ6^)IJLH<7<ތz1ʃܑw Uy^'7r*8.rPA]'N8WxPvo0)e㩣noۿQ;MC+ DM:6hYWc~6nѦtO JxIoiCm|E=> ekղvv&{T[j{Ruigq][U|v6_-iuQ?y6_iEI E$VjaѨE5ZHܤ+vjQvC6l!,>WF- }KO[|Xg#v/_J,O[0_eIX:[=TZ! zQ nZuM6cstNG[( >YX- 3~?.FF0`թC3KT ]0Rvh)X`Ê:^`a(ٟhrf5Iv W~/]G7rd1<]N-Pա W=2t v@XWD Y/Dƿ2Kv) ."r]p ThL:X]knFf8W`$|\T&s QF'h4zrqq WYNV~MlRpiȵ̵>c /Qcn Hh43]N?.Or+/$7&Kva ۏlhbvҢ]N+>הuvviDwUdE/R̋n"1]ۃ $B{:avc4z,,֞РaP{>Y W?Q6axb{.V8wزk1b4hS& WgSΩviM&0N{ 87>oaN%g9#Xi6ct9Z{:cQc֗kxd,Tc2KD\>Ġ+ˬXμVDeɠ>./p>BN%>(pC-,YӬ=q;qj@?kMhşQfUcdf=߃GLVc6Ih'hxPS~TT}%ғͥJ҆+ WF$*a*DdDz#"y'Ad[JDdDS _KֹKҜ.3YW.YIwHc L}ao^1p?=-zڛ=O3H񣍽V106y U ^W ta FphcGj^á/Ve} ?_nv kiqR=?E@U2i =4kX w5pÙԴwK=ϥf J!v%⭗٭B=F=K6Sv>-ݣ4|[lʗrv 4\s-%C1 EyP3`jrBu&еv>RxƵ ^p-#.km^YЋ_/GV!_W`i*]j\ yPeXwmQ~V0]DU^EF % d:LM!kt~Mίſt&_?B7lbBp>Թhu+GAGշڿ;H}5ZJSb鱵SoS*QqՁUk\sk#T6A fj37dXdTXKe&4u,kS ZCH,}uOJjoTҗ}/b[:- Pߵ6ȑ 7^Ů)O`A+qCWj p(l}j)Y%^EO†+U^K${qUC&!էv:2iO} gB^ Kٰ<۸/d V^oS@]Aw8 3OPce4vM,s5UI4:*ޱCB1%W?IT}|P3@8/0L_~,ї~ u⸱&걛#}!Nل [ k,P"!1CsXz :?(Er(O26 l(WpKWob«էGoH;Ol>%X}j#قHHm#m-dd3%ق&&HdkAElH6$f$[mB6IΡuI.~Iwg]Zth!wd8W;v r7mzͭOͳI~۝^Kͷl8?w{l%g;'qIV#:[]Tz 6gҏ,´l#6)Y㊴i/'mo\3WN""dOIPnbaۛ1?sGl[]i0 6WkTعF+o0PK bBٞC&com/sun/jna/StructureReadContext.classRN@= X.5nHXbع˨55_i#qQ;4;s眤o/<(u,Xfȅ2lԲFuqeȜ:2 ~-{gV N]aKZ9#v sŵax ꝈZu,0Mb(ANo^Whi!/Q尮U_ɺceVFv+k?{Yص FFʖZZԫ!vu[!ˆp'0NI,V5/G0̮2|1 pOq,37>b~PK bB҈#com/sun/jna/ToNativeConverter.class;o>#nvNv.F|Ē̲TFg IJDļt}k\#nvvvvNv.FҢT̜TFʂTԢ"IJDF\<. PK bB9Ujcom/sun/jna/Union.classWW~xA A\vؘД hъI\v,j4^ޛ{6Ĥ- 1m6mi~/===+<eP{<~}{>|~1X2de =a*Sgsy^{vF읕~(0~T\ŋ*^s2LxYA>lS^HkJg-KM&twBd־D] J4[AqC BݩCAu4njAX+u}a=qHO.&=y7i=o@LZFzxQ&U:XW9^խ`*MІVC NW:v+-}Q I5cXN}l1,{v&5H39fJ(͎%"<7IK϶ ;ƙ : L7h-U<%Sz"[ų)5rn HC^&_//A){f)A^o收߄QSM)cti2]r&UPRݡd Z/+ 3`2GMï Yq*4yUyѰ ;lXtӛHcz+=H6&-Fa]Y3aځT]h o oI.NwbH1^$yF(pHg5<(DAbK`w?j?i014<ӁA"g U>!CZIER-mt#Sfz;yzf8eJ TVm*On}d-i6f+g,6  (#_;v:wdC:UIa=3^ S|Zs1ńJ]qn˳fphT^5i~[|T$ 3ӕɰu7BH9gIsGߒHNpR{q#vq܉Wwʻ)]$ґ&)ׂ>OІrm5ұ6BcTZ1Ϙ]覴 *'ۖ{]w+2BPRhmlE9Z(3PLO2x)ogd}PP1r9A' vG(:4YT Um@N%a4H;q;|Pv>a| ч~;.`?U24cSC4TqPŽWXn2jC9)菺AA.#ױͣ>"dˈnG@ujEWN="j1Ӱaom'hcw"=ծGEf@í&B S74Ƈ܎P3acG8>Jdxk\2;a#0\?u:~ƖuMW\ĊhŦkFS4 %{#{'s_`ϰI1c6^A ; X{$9lčD W#@گC+YWm3U8k#H2(WL o<y;S͢ JbɿȻv--[pɗJ/ӭ^wzwe+6ND]܃#w;];U*b(tGaA%D` ,ZhG( yW!C!! (^‘Oeʁ1akMsɣ̜)I|xmdH.Y>PK bBI'com/sun/jna/Version.classU PTdQ^+ѮU n&Q p-z*R|9<_64f-rϡ)r.e*:#7BIxK0¢)cqLsA0#QVi!;2p",~[&⚠lmvT0jԖ?z_PK bB/com/sun/jna/WString.classuS[OAmVj["(xP."MJ0-],uU?ƒ&Z&LQXJ-9}sIMwBஂ{aZD4f/af c &@iEj{s}}|쟿~ ,PWIEX-CWai`8^T\0 9=.{Qg 9CI  BwS?XwwbC>$baەnðטN͐rJ*>-xBIyWr`K)]4Agj=T,g4S ʕF,Z>/\%y!C̦"Ӧ[ЕC Mউ2n0UNh'2C?Dh(l}tPtS`N7@Gg+\KFyqʼPc18ZdP|ErN\6 P6LNWAPT@K:5kmfY#K?S_טh&uPgwҹljL@4A~Y"$&'{ Q.~ U!+0/ʟ%<&, oPK bB@db;com/sun/jna/WeakIdentityHashMap$IdentityWeakReference.classT[OA=ºhAnRPv[Y!16)@t`KjwkBOQD`|7m&>̙ow_l7R8c,&Ltᜉ󸠱6H`]@RLL ڦ4|KgYɍC/ܺEp< \v.UcT)Wy<_nlU,Wj.ɺ-0 qk?Ԫ+U}U P4ID[+Z!]:UMlN'L=jȪVmfFӺZY AQ8Xk]u 89-e`"&-10e-tH-@@6e:%u5c6FNȕtnC5tgdwt+,Pm~s,Z*5 gs1Ƈ`tZ8G2;v!g.;H~(!S$񌗟c/Kd0r1 Z rH?-'g9iDr{2/#iТAu Œdb; Gķ4Ix oHjQXj_m'ygHWp:JX^"l4?qPK bBFH%com/sun/jna/WeakIdentityHashMap.classWkWTU~p8 )!0(#fb& Ra88XZv5/҇Z+!bS~E93 `}9{}w?׿ m 7ЂIS41)+8HhpZ$IHkĤL28'1YiΪxxJ<-gTPges゜{^ bL^%,WTᖬפ$eoxSMcҳMc9n&M;j*{mLvŌTL)錙JCߤqƈ {"4#CFtʲ'$WegV,rHpC`e[ aϲ|KM_MMy.^|tTg\t*ؼQ :İxH>h2D<6{ELL@ 9}R>t|/Y)_2NRg=KDPA+n |7ghg;]mdN rVXiW`cbVe5z'Pq)[ ÃI% μb{;g|ҡ><OxޑyBa*ûvPE3@Bpjޙ?^*C]@.ͣl a?*pWZe O "F­(_7yXvv:\H1q@>]U9TvPhU w, YP/TEt iU_6k,Z QpwqV5XM2n u# ylhXFϵP-xGtf0̂ц~r8cx''"=t ;pWܵى%?OH>zԥ.U|sqPⰊ?Hrc|DBش2ph;ߖmp8a :2JQMwچr:SL<ץȯyte"͡aI&GבQW",7 |B6W5˽ 0%Foz)1{.^HD/kgzVfĞ)p=|\z,`RO驒bsH{ .ʬt <  ]Эt]XNWbbI|M)"Zi"]NQ9ZA㹵xa|oy]l{yaUc-ӵ(zʨI2xDPEaMlE\~1-{LӞvi[1mudey PK bBC/!com/sun/jna/ptr/ByReference.class}PMK@}ƤjmԶ)׊X)xܦ+niA^,(Q$y̛yov h0ulPm`;:: ک drƠڽ" +OhJy$|Iɣ\/8 IY9[ "xP3)XiKYlZ'WIyV٭`DFz =3|K*#ɲд?TPm4d2*e}B|@^(A}%VAq%k#QVUդ*y1r]PK bBɴ?Τ%com/sun/jna/ptr/ByteByReference.classMO@߅Ba **g zxFCQý5ؚRLO^`2ΔZ#ٙλ `e SLs6á 19::;I\ %0\s\uܹm(n2Vvn\;mRVzջZNեT$5-V@zoSzM1?p7m %-bIDzX)Pg,oE_W3yfIÝx(_ opN&XnW_}V4lDhe@|x,ClRfT0Ld@E{FR"Bb0yBN\O8#EcJVвL@#d̓1oo`ِE1ƥFe6v UPK bB'com/sun/jna/ptr/DoubleByReference.classMO@ߕZ@/ďA(!ƨ^qlMiMU &(li {yϯ;(q$1ϡbAz9iXf9$Vmy 1dP0ٰlq?\ ʼPdNt-ywguPv6+[9> Vn}5Y!dv|j jWxQmG.uB9~nK[Pp|2uhHKS1#5XױM[0 Ɛ*ƩSe{e3 r0F ! R "r)<8q:!F(^NL!iLUHavIH"ĤV0V!6ं̐:2[Yқ*mCj*˛܃3>[zxo*yZ!AbyhL-3PK bB]r&com/sun/jna/ptr/FloatByReference.classMK@mӦom]?,7ŃBD)"*ǺjJM$Mू?JIB"Λg|{if8P<:{ik%0p\uڻR}աײ;MwxjXizۮ]\(_-KZGӣ_%몠msIJPM^x=,L 6m Q&8[AEǪ5؀)`AɯfԒ;7P@ɬ2ǑͰ/7O[`fT-,A$v /`Pc`C  1ሔ-Wj>ߘa)NHR*F5K4&d-Oh4BO&<&sۦ9@>}Npٰe>qY U/PK bB|9 $com/sun/jna/ptr/IntByReference.class}N@@ia[XH4.4`1jWZS $.|x4;w=枙ϯАˠaIeVdXհaA=l;ar<dݲU{/;CtiZr1M[j6Ϟ[ˍx∔FMcӧY!^c”ƠunS[4mmL tdd(aC&tlcay S]N\; !g LJ8j\VPPr %z8䧀 NqvP썲tV L0$ ڙ6BR"Cb09B}Tv,P2uSSxe%A 4<hi P_C7'\&BY_PK bBt%com/sun/jna/ptr/LongByReference.classMo@GB!Je8)ɭU%UU[qw]C.Dʡ??ʌq@ٙg7C$tJcʦ&/u4t~t=7<HۭvWOɕ 9Wcl3;8?ܩ@7'<3 :=U@v3M0*/0qiɯ,s۔6p#gX0Q`Ӵ>^xc-Yx[jkY;% wP6NtmIݍ@>FMhAIvNHd-y)Xd%@lyֲ 9igB!&\!qT@rf+^wS7e{$ffs*P[Ʉ'^:/yGN3-Ip(Q_i&2QUPK bB+com/sun/jna/ptr/NativeLongByReference.classQoA ǭGkKZmڃڞG5АD߮k9M~(q9 =3Ϗ_p"!)!ew_pfG!ycWKsWi^riB.eV~鶜8Njg'lvWc  ݁j^;uU]bMI':o8>ar=ƪ\'qVuqx# a|Kpha֜F2F*PK bBǯR(com/sun/jna/ptr/PointerByReference.classNPíX/ܼ&; &b*ZSo. qP9TP]߯3ӏϷwX#b*d:/Ebmy{ aXe8ׂabոyUɊS3Uӵd_F;ɰR9Rem๥SDz=? &v2FzɡxSx՞%~ȴ^ϝ[G2{PajFBRt2O04P&|y$2o%Ye@~ D@@P(F3XT9@Qd1FJ0 :%!Qzo` ]XjScr>v.nU\x/Io#]^su 9`tוPK bBwF&com/sun/jna/ptr/ShortByReference.classMO@߅/PPQAFC{UJ5xă?e)MUbb;ow.)I1"8,PJaE yh;$7uĽS5Qέn6dknj-}xM+VkjT[U}t=Z+O9 u@ZѯHw_nQJPMnkS̎vZVґU9ְ†Ml؆!`QɯfԒƻrmW@(2c͠/7.[`f\MA$1#F_!^(A(iHq  S!ጔ$^c&'Ls*?(Φ_r=1Y%+hb&FG+?x2Ɉ7ِGsL Ae&rT/PK bBpO£#com/sun/jna/win32/DLLCallback.classMA PE%8hҠ-`Pd4Hh/}΁z?BX`BpWIr]J5jӴʴf> xi]".uA؈֙ϋJatFVF{iA|19MVyK?X3Co F~PK bBBXucom/sun/jna/win32/StdCall.class;o>#Nv6vvvFҢT̜TFĜIJDF\rm84mPpR"E&P`@6نmݸUGp 3Epd#.ϷI5iu}{x揿~{` k”E p+W0 *>PATz]E>n`V>UoitJ̅P(KSe.;e9ùUy%:;:w.!0/ٵTi,=u״NnyBVV5mkZ '+bJfXnAw%Ţy}IOUuFv8' t%Wf^ɨ+#T+U 3X/7Yv)uQrSӆ{.gcZ&~1&n51oeyqqlYm3V2bj,ϡh/d]Nr`7{,\6JMKUME⎄)a)O@+MdL"q=װO`F<&^`UZ< 7&RKa] ׻~iVˆÂn-Z]+ay U f+D嘘D×@_X$*owmr 8?[G`׿-0ٌvzE$lV9/iG}8d65fR4ص޽;+tO UH؇9IJ,tE=bΦip87n[U۴<=NtAVӠ=>WuNs/'m!0>*>mH"mA~Փyq|7+-<AW' ڍFZN-|]{Sڔ}I~]8F9NØ*Aރt !fbS$r/]!c[<#n+Z/~LƂ;?Ăc- N?;G >:H1 r$^iaw1Țqƃ$db d£?e'2pmG`;Ic3!8(\YJ4')}yjY"TG\_,;D}ZUof4Q3[Ҭ8-1.qF⬐8G/0L?ܜ_U5UbcxUL'PK bB #6com/sun/jna/win32/StdCallLibrary$StdCallCallback.class;o>#~vvnvv^FҢT̜TFĜ̤ĢJIJDv>F\&com/sun/jna/win32/StdCallLibrary.classQJ@=jkkAA}1 B!bkIIEAI)3svϼEM\P}q'ߥ=k q?uXEʄڟ=CnB9e7|ӗn߻?;v0pFcS0 4C:Ύg05#uDWk|W32O>@5 f$(p. (rkOPK bBGJd:*,com/sun/jna/win32/W32APIFunctionMapper.classTRA=l2qYQ#/ W$ A$ ,x_PUGg6QAe%>Lg}B c߅N\1,.K\!qA WpM$BFĴ΄uS $r|!75wcZ`T]7ku\s-s|ZO^F 2YB _YfrW̢9 Yu+ZqrfZ.חlTUvdU,Q֦:5ĖJ;nz\LMmJ]! .V I;<uR|癝w<{̳+v7gmZ$ۑwk-;vL{^5҄p=8K:KyY^@,['zZJkioirXo@/@sT]S)۞(xb AB`Wo z-F;7fbG$7 lDn݉IvgTU,.`VKcW߱FmDŽj| ؏0|jܴqah*5sF6 F^!A$]}c'BҘyi0l (B?8NAGsqH8*+#S D xkx8 ~|X]#4t4`XzK^8vG"saz&虠M Ib<7,F0J<5;Fp)_8קC#! SL@H,O{E+~F#m{c>%*){:PK bBP-'com/sun/jna/win32/W32APIOptions$1.classRN@=]BZhhi)JAH A*ْKTC?(U^yg9;Gc@2\̺x^Bse8xe xൃ*DjkIr7e/!#N@$ʜA;Z&PddD#?͵??Qzn6>{q"|hߢ< *CSmQqWf% Si,ߏD%,{X[u`nW x+´ "tELXGGXbmv nM Ŋ)|BPY6v"eez,̏gŅys@@9 ؇ʃsL xW`R!/pV\4G)q1~MC0^PK bBUD'com/sun/jna/win32/W32APIOptions$2.classN@;-!"QWR*$)!H ޘ-Y[>HPc?iw?hV1L,ZX*b+&ޛ(>+=Q>#Z$tG/SYq:'3  meEKV:^0rTC-+wnc x$N4`AeW&Ī"J{(wF" edb5ࢯ[ٛE3<|Cq m1$4:ξ"ن JX#s!ێ}[ny XS`l,@At2}]@Qy/P` ߠ$[-Rm i@5E*?PK bBs*com/sun/jna/win32/W32APITypeMapper$1.classT[OA=va[RQ [VPn 44@eaʣ?QDO&(7ӵK^fg9gf@hCGNØS'ƅ)#KÄI DV ْZgx T#b`⟻`5n`P.g*_`);vy\ԲX+Ne'Ib[ڡ[#Q:kU=w…30QhB!\]grUĩ9T+:ByGBo.5:xMz Ɛ1ZQdEȚ_  =狜 tS+}WT N!1!7-ka@*a}HVfß 3ԛC|uESUj<y0|=*5-:Z1g\;l,n)p=EknCtuuj$X:-H7Z'Ț4b1 bi-1%:2腸L}!|$D9n S[(SO"e~v:+q /^#$oC ЈPqWX0٦LFr?atP,ε%D&Q""L!#<=EA~d-%S#`dTu%etHPK bBLw*com/sun/jna/win32/W32APITypeMapper$2.classSmOP~:֭0DDqƔWas$KbʸBuS_W$MQ]1Зsys?H#Aw('c$ -HHeLeonrg' pqH.2 gh-l,s/i/%\Cʠ 5oYɚzI3xx4Q U& zULZ^.;qfm_܉i{nVkt6&|D8PmsVɴˆ:5{ES-PYH myT<ǴQAV P/SnhOԁUa9F'8fl0p1Ēhu)5|p M TM3 \Py6,ww.),Ot\FEziQPS?N"`W! |o(ѷwд9mIup ׽.%YC%7ecT2oa"H,-D6B7Ց>)hFF6`6v@iH`.A\g@#N/J]PK bBIYr(com/sun/jna/win32/W32APITypeMapper.classmoA Chim+Zڳ3iPkZ_-p֫;r?_w&PJ,`"dwvfg77?~~ G*"H)H! b k ~K n fX 0A+ٶ-nmeT|apNvOlhjnabV,&LmEi0DʦmT;uu43eWFڞkEg R5Rր$Х!Fc ÎuDZ n$ ,IZ5KM@fbN?Ϟ?b!J6WL>ICPB  grcY0ǔn vHS $ b ˀ!eui]!m > b }>w^R=LΠ}AX~)^lL2*#EMـU'!uPK bBcom/sun/jna/win32-x86/PK FB6E;_9z%com/sun/jna/win32-x86/jnidispatch.dll9z;_}|T"n5QCjkRc6D%5|,/ Jah% .z(R`+m"n" DjڻMlҰ`Ⱦ3sν{#Q|>?6̜ܽ9sf̙3眲[ iAGC7|kc'65wΟhIK=ewx]wIw3iIT|I?~{.3ft&Q0'taaH03 ˌPf0,¿|6rvh Tv "sѰemKKH7 {s5 vU.wR##:2$Curew3[.0*wϒ 5vC˳ r˯̥&ַRr5=ߒM/IQ٬ܝg}%Ekg茡ʝeJ.s =PE)v,&¿3!_g +eʡܙU>`W9 V_k|O! r/">=-SFChD$!̹xgYリH nT9 WZ=_]EL4/Sd*o#z [FeG hG[b.ª`.܊BԴؐ+UeúBřmʔtaxÿWɩ e T^q,;;Eă/., tz~efFVZ2=l`Ö7Ws6cHRiVl\o`RFUtfI "qt ,{mV<X;ĜeHOo/(QÕiř~Dǭ";XcE`؄⫢(P'"u6Y `z@P.f0r4&~? NZ+4rQ^,;,YP 73^/(5.V( ̤9H.yP#n.H@ A $GB'u12KoRԧf(5}Qd" +((+>o{>ڕgA2ՙ=ҀhT #M1x$ #I3ZD|Rʾ"(۹wod7weӘm%bW>rn@uZ@ \w-sz"&[e ͑/tsU!} sI{#lM| K,Qp>⬃2={T`"W}mskK6Zr워膍F'r@[sbM_ R D`L$E"3&>< L$gek"SC[`I2F,:KDIy j5@qU쓜&ƚ sH= Ih,P7.kfmS(Qp4reMO&*eBA YfcH+ <qY Gu (#JO>?L1~͑ޟ-f!G~nbh N쬳s1LH0XxZ%'j#al{ ^r2Q55F) Xo3bgC08~Nd2V>=n; &#nm܈m ZƯn#Y70Pqve6h=*@["ZZt?tۓ]E }ѝ?J|Ńn3=0]hWImp0 OP t(9q]9k|0}a}?#Xb_tІ,n5`5ZGaٰv7?r$/Q&rHߐ)jӰ7`.D~#$#}k V7 >]K޽춯}np<HR2_d0†eQnȤQ;0ON*xy197"hй=;L&dw0Ux,FȆ!uVqqV^2o7[/6oCB' 'R-Q" CJJtI'c~C;ցe^fvTo7zM(6p{ty%wcFs6wAnU&%#zr n1=퀺Y>e;̏)ټJ e*kRì2 M9 %w=fQQ>c8D oFfgC $s| vNkVZ77^|wGTo\۹f=Or4n\b:oOM0A7-LΙ8ob Z"\a+Goq^7ܸLeI>O0qH!7Sو?hRͮ{dɦţ5Gt#j=IZ BtR4;#f4е&y5';:d(Uo!wz.$/RZ}GD[GHo_6 $hN%M'kvNR d"8 z ]YA)HKfѬ(n@ :YD_q™NG)ԛyP9P9:Ҿ<٢ Pݳ-xjYXmxFn"ᙀB?ā @W9Ea`F& m%ȡ8H*5ְ'4PsEH53Ui OLcTxK5 -W8nVO}Ic~>%}`Ì5H >j',:\W a(@t)UjFU1)bbu|C|te"l +^D 9-V|Opz2ʵA߆n hRkaY#06Gxei0xX|c na)#۱U~\mBӱRm*9*9saCy.51Oڈ .Ck\K\j#ŋ.4Uŧ*`HT#JYE X$<䏮 QHXZtpxV(nEVϦxF7Q(G %"qGp8:S☉8>PIapؓ?m:YIqQ:)q#hD&/eŲ|gy($@Ȅ!k݀  Ǫ!qI5npx6=\?a(s[$p#fƀ5ӕc;ѥ}m|Yuy$@?Vh#a|0?p5/>G~ ?[K /+">Uʼ@jŕcA!aEθx"k P"Q>i pR "fϟ㗵<(2p,a 7 f9$oMq$R(x`dnw=bx_L5^? ME@"Ŵ"MA$f챘(?#d%5sx1TIRT~ 7P hHT.8 ^o7~4Q r NNSK)I^NOj#&r&$"*YPR.qsv "'u~iMz=[gPL: D&h?Bkl~ ,*Jz>N]Ci07GTFu0w(_ߌiPSTSv~PAU_8jw4Wn(_?FL=ʢh6]%6*%:ٷW6tڠCL0}%َ- |#E$O_fefE&ɛߖ/{%W=8n܂@秅 }:W3 hr U87:d# 0rhdZW<04kdZ24H_2xhdZ ǒAh,}0u~K2S&\Ђ}F7*+kI š%%Ԅ e\{l-WI\i|!r50y#A:DD*)Kk{] ;A25,Fx.÷$1k w3[Km[8vоۏ#ni/DLOWG\W"jf}kpӪI %RЧ_̲mjk|\(H6@8_g8JN_֑֭iRjJ!HE9J{*AXW++V?/0lݳ-a\/y:A' `gm"+i/& lNN*,b꿱s¾r,mS8`2ed`P/тedR]s<9(Pf}A򙒣;!QOT-8Hyr$rS[0 > ~ jK~kZ-9<'.q=nb¦/~D(O>2 +K_:9.9ʕGcp-?: L/+QJ(K9:=' =Y +$O|nd,zV+z)q䄕f<>kEĔKQ81E.DƉscdA <'Y:dͪrh_L$ӧZrW8`0(?̠."3*8\5{ĵ&ZK  jҢܺ&LOFtC9ӽ7bl"xBB8u+0MyE^UlE3:ʬo&5xWlХ5$F :Te8DZda]u;c]WdFcLiOQGdGqs;9k @<3W ̛wt XtѕGdQ abO=<[ *aF/:}m \q :v`|mn/2fhI$K$r_/[=sJD%bk">͓nd@P6,o=|!Eoneq-ꜭh*JE{Sl+*S轟\&M BKn6ّ{ҳjb 5ʂObP` Yӷ R3TETp lVUf3ҘS%ԛ&e>^~JJǗVEG=LXZ4H)AZxR Ed+V@!(8٢Zbf !D)\5AdIrqwz0]g~9 Y.2嚖y?b @ݪ0 \R` 96%,B7'T4q*cglk=_m`;#|u,Ұ] ޣVGJf<*>swb [V84D7Ў_(4" )rggC}[2pM,[#Bֶn/*sui/g^㟉yDIx!Z*qVBWWr+$Й(`ĵ'j5$2j/ ΀pA*L{ Pw(;yB[Uka5_â0`2WҬ -8U1ɺ3xPG(z3~)Hx,zuǒ0[_p՗1+_a`\6tW̅#x;y׀s%8(UNbz0Ѷng@<)M1'XY_j0ew4ĝPjT(j-+UJV)<Ԋ*0w]z"QHg|񡖬Q vb!;{sjzv-m`YBL7~om8N c@U661ۀn :Le8&E6G\cz 1g̨<{yq7'@d=ؿG;pkN+yX=-ҳI&0ۙ0)0I۩w^4Slۛa?9O4/ӿv{sb2&ݟ_p(H]kOv|$O=m/M ?!ۡN(Z~s zo}M2 x_Ac]I *T 69:B&~ѷycUY===}kTvd CNu7{ =+QOAΓ+ LY|6=;Hj][uZtQr(g:O#؂ÇD/F$oiW;on8{_Mnپ@+_zӦ/Dӧox{{݀vr~6=V|O[|s枅guaX5CJl$P0y=ĚA41?!F/ո0BRF놅Z!uG?zZgؼsQZUUX [ ?e~PGyZ6@?b,f?C:Z4Of7`3Lۋ(:aDԆ7C4b86u08)d>TMO"gs$ls(J$uЮGUDžEzi bvn^kԞ﷫t\beQtR.Lo7C*Q[:Ε*UX¾0{ L60?Pf30q"U? f_pGHRʆ8C;6o]OӾe}+ `rΣDh?/oKk٘k-(߂k=+3o1Zdw֎V{V<3T ݂;—A^yxn:A#$=wBAZJow?B-莻`n0𻡗3V#_Gsu"lg /hÂ[1KnUcOl )7(;oeƓ::-i16BҀϹ#ۊX]3崆7:}}a0fU#ݷ q8B;SA{ OI4Q#j]{[ő5>Y:VVsy) g56ǹcK+CPSCB!= U*a RAddhRaHTR(SFP)'IȚJ^ z$L'k_R9Fk,gkM1;gooI qrP:V#Hv.nӘw{uó(~휺1z~}{=s˹qr٪R'CמߍCR]ϖ.LC w&xZ0\]l }(VSgW;RE1mGw"Itܩmuθ#t;yl?AqjX@w=ֻ nMa#QRWE NVBa`]FH^FFO!aU#Rj̞W(#)%ko"җ5wǑ^7Xy7'b"{8XnǺndd+x~1PWHEoc|O_$D/p /~_%Y߽; E)p(qta8"qt\8~'!|CWu((_[W}-yJs[G3TIl`FM:aD%mL'4V}a!_`% `B_ֺDUb͂ [Ul`{>.IտI4X3taaFاhIl^ڿE_~z UI458vSZG[_ {M. 6OC֛ [E}{SH] M}H"9Tz[`7i9{&ilcz;`5عC՛ {P]D?B؞T*I}*dzaMk`/=F`'j Uo2lD؛^\rLE2 "m``+4N~ R&ޫ*ی+R%`#aR*IifZ¼ aq 3 6W!M`Eݚެ$5,= H[ClC^JʡD[/˦ ͢ewNp4-5ٳÿo,fcf~Ҽ afQšÇ|e ^} yxeL*x"1lsVe%܊VX;x"[Baձa"sjiPMo 9[S F}% 0 ;QFrV VAu6:BQBn LSdŕ (g],KG2vohw0xĻBpHٯ~Wt7 z?%>˶grNOcI=w8s?[y39@iYc98q2=!Eʷ_`_(ĚOU:|<̌ h,` jYF#8[R~:w jّ)r)n# wi= ۟ 4zrYA(GR"Sd!6JCsl uP@xvH;35멷 [(yl( :ඣ[zG17)qV]TYjKSU`&AmR52U/Sv MdGVX/;gA9K=U{iGd\d^R%V^S-mE9pH*~:h<{ ug{~n균0*4ސ9&&wx9c/HŁ妗ma'(;X]A)lrYiK`H%Wq#/H~{I1] $:" s;X;+ۧL.Z%Ss;koKC=kGP_D5#\t$2G@~>цv%QT+,I%#);we.9زRQ*9;eIDp#C 4t^L[ ;0K',)EM=Ȳ{bWb&{{yv)2^x(v* юUq}Gpn$X'ٌ Køf~sJȲ9l Juv1_9RsBS,Mb<ֶ9E,~HO ݎfXy3K>)tSToAvq˚ Wᶷ6o-HPİb[O^\۷XֱG0{ycKBIsEB 6/`8{O].ZBU~Nwp$< ܻ*a`х_txQ'!w~ILLӚUĜɷ~KV:qiGq4F $@-nσ_ݞ-D;!1 B4hT)E32t_ʌrُ4}hd񅟉U''HGKAL`ս. NB}- ]~nՍ BfoGN1a]Z>@w15]NJlt {#6 9|Z<=N ҩ |fVtoeAl xN7tqT{Q9zEo1Fb?$z_׀kDFr[&byƽ sy͛ !*3G}ӤS^|-)6Gyz %z?NTCUG˟=! uLpc}^Ϭ)Mߥ|c2oJl"\:sB0>Q;+7Pt**I'bׯ4щً4uݹvfyW5IN\ڿˍM~y%`>(L3ؔLR8<#Qڌ}Yii{%_Ã;Uh8 Pt"pAMʪjUw;'?Lk~ R5AFqNϐȹj s;oҽsܠ9VʿwŅ_aƻbo֗×Kep۞IH3#telnmAu43q?`Ir5Ii)$zV́N? K'$z_`]F+֖e|9>zk5+)kWoL*aEcзzCbmu~"^Wmn?cyyˋ;gHd)hz0kX,_&齔60Z$"W(2ѭzG$v(,z^:0E/7p̪Pݦ"9_.xNuad[Lvx"6q L Tξ i9[$$`H\3F:1O.z" Jcgчy>?.Ε Щ-b߫P`>Eg4AVQ @pI\O:X"&}HU.[fGc7[sD1h4"v- ;*wṃhi@crf[GzB矂T`.aOoG^!Ivȕ+xדx:.$sq:!L` v:»"u?4iPMeI9*+m7 EۑadR,~<]uŰ$w{a0ڐݯ%u%Xe[V}7jl|2u%_R*$yP)FyF,5,RE!Fezu+/h!-EcTCLB?R]fsk\c %̊,:(حQ‹H19 NwUSax'SM~Is]H"TzŠ#ye{e~v :T3-NZ ӠbqS!^TeFstr#[~=&>g`t.Fx۟;w!/MV/(_}v4i"U_((Ω;FZj^S5v*mWs]gHB*v^6vA~!e)vk$vMHoO˅6l';lcQy%]s nt4>nc3a9ll]O`}QDt6ƈcfX{SsdQ edvRMK.x͠:1o'yi#/ݡ.ftir3--|)?:8 kcpY%]\ 3h>s Y!. ʎ @X0?*z_Alx%0QtFF >\8-=! vs OJQ\4uu 6Aߦdi g!&cV$s0OwŴf~à_݊|E ¾Ao_Jt;Uꞎe;aa-mokNHD S ?~65'gժښi>':@W |`RGuCnE8b]sWfC`a s5㠱yrEmcY3<іM#}6F@+D*ƪUN`[syc8+ԣ1؍ws]V*?r>h[iQڲԔ&`0L2lU /1ڋOGMΧ4<4ڎVֵhѱ.ۿ ˣvi ND}Mk3[wl+& ڭwϯca:-Atx+}rq*Ͷ{Z2Z$]ؒ *Lu6f6 "6&-$vÏ8'҇638Z\O>@6I}U(uilv;~?5S͹{Eaw_óTh-~׽͞Ҥ9gZ`i6IgIX2R>8cd:UۡNh*r~G^y[Miq_ ZgV_>qnMnߊo V OiKj7R (4{TQA0_r,]qt}jd6W`J!ItIR@ãwl΍;oww- (omѱNȶK-|܆t!PkTYP>"E@cX>uxN|,6ICoHa!YZe9jDaټqGa@s-#Rsլ}@ߚ軚" _&:WOdsR-(7'|hI'{d엡}>OQRE'.֤Ly fsѕ4w,WQݓ]e) A ;;k:!iFuLA#V)$aB\=Q'+|sB]m ˖&MR+vM! =e}iћ)Ko#7JpۨrC'GuE{?>Hnyq WXiUOV& o~y@z GhGGЙ 8֐D+VIq _G-bSn~6\x^A/:An3,oމx5f9ױI\yaЄq\)dR[uoە{3DZJGgnU陵ЭNQѠqυվ_ iڙ%I? AD#&*M6_k$LzeV! ,20)]H!I>g\A![HbOr w^ {6_bm_ 2l\OY[\MucbEfLZǎe8jm_+me,%4i*FkbQNV,=l _n kI&L@|SX24J4}=h0T{*['J_ʻwJ~hWsNpGur#8ZP8Gs?0[^*Ks-|"CEv)HL& ZfBViuF2IMfз}5)~ [Yk+A1cǶCRw8&~~4FN8U"; P )aUӁ`cb湸Qo{-Nݜ;;;eN؝1N͈7rS{Fbv9pǠ)&=㿃 [f ߃ƕ;'Tލo'NQ~/Ӥr*v'8x0 qHMe& A+aƝ~X⾌~t-Twۥ`fOi I,r4 !1P?#Wx_|k4PZu>%~6|>Eb^e `^lkOTg-fJ"1;*҆ ̈9ʝ>5/DŽZZ6/1hQ,OvA1aUY券;1SmN^GuF \ߌ?1;t|0:&r^q33ggnM!;,!Oa1k~6Jrܿ‘2k֪us1`},j3<,fAڄ53'7|,.)S5Di|gpY4=D6r?Y#y L\ˣ곩u8$W2vvH͋a嘆=z!sz*: ̽D. 2;r;uࣦOL_b B-,~,bW|~_  Ƭ1` "DR(`DEAn‚4jD7b#:5 Ɔt`10EgrP7%xR~FR^ZV*:źM]*S~$P򒪪+՛[*h:H\w*f{RTh'|q4mOŌi4ɳ5N";obOCp;ك&V}d+_3MRd|!&I}S+#% &H>wď})ƈt  {96g܋<4שjl4V tB;8I4) |M1^ڤ,kR& c *xGHeюaoWu>/C|LB Rʥ3.חjԫڈ`jU9?&g8MgO"t={cqȈԩLfiSr(F'QX'hvqP*7'gz>t:$A05m,;*Wť[qC~!̧(uz.c `뾋>tT7濙$vl}Mjah//1Zc1Fr[GM1!9ix:W/+g_[y6fқ3c)C8wUӲxɹ24ȝ#/~rËHv4i6 ǜ}$\hqoh?ר7yms4S(#;Ȗ(^}5-wλ}x|MUR((ͬ mb9=qCacb#+1on 1OdQMfjrՆ7AL`1o|F)M~iGoNČ̍Ȝ9VԽL.OE"4ޢ=q*; ?J _ fY>Od nn77.B9Rv{K+Dž uwrmD|A.ȏьo0Ke]ߜ/zZsS6WxVG6/Oļh/otO:MV;y*ӀOA˽nwFz +갞IٻZB ` a\#iވ ͏'$}C*g̤wvyZ< ]/&P>y.f|F(E Xrkr; 6Kc9qZS`z~[ʺC=9Bim5Xc,Ht 8<{y-{~]\1G򇻘r#='Ƭ\`K/y-3t&Je"=zD`:0,yN 5c hJQtzTju3DDz"Zo.l_֍6׳~ m^U_9;+ws+ ސKfTy`E,u]u)g]#>(z| :$;*< "_w1ϐvŧQ!}30QezӱLǘ%q[e'G)tn(ʭhndnѧI#uk+vZ][l v MV{eQ.{)U0aa~\aY\` |AD3//<3 (Mj@'AH}^;vFmVMooh{DB;zL2cM,hh0#s F(XkcMq%0mNP&SKУ=ee&~ve˻<'AMA ['`n1K#`aAn/Ah_/6<% iT04 h[ ,-c3]pVb*]*8uF CnB3Z 2\nj)fk)޻P*2R'4Ll) EQ5?Z|9?9EA]"ݒȤ>AI=_/66%ۧa*+sӿϖZf~Bّe4ok^**7FDo$mqY0b@11jݨ iMd~Y&3m2$., %1MbLą{{uoթSNU:^m䌙#m~6d?мdo,y<&d6?k'&)k.P]/Ay|%x"ޓ > r~_LFh81zt/0_gKB@!g( r :fvet3zrwNVfl> jLg{GJTI טdV,1Mc }!~<QNaE6 ;cQiTuu78G.% \#J,L^,uɞ亭8p؞u cZ%@q?) O "x@R#,+$xsKmvkM"q}\hkMF#DxF#KlVeA4>{89J@L4@? '6< `X BGb+~!mI6 m;mG 1g:N qڭ TH*6V~x@i0`&=!ab,O,;-,{Cew+(Y CDz(DQ]M?w[0aj1.J ĝĕS`?}`#/hSew0C?ņ+k:$jμ|A4%Ew~ʟxTV gBD:rќAi[VsK|Fu_{_m_ҩa)*L-JI:LF @8P8m 6D͍{ #NyvGa(9a_68)eHO?eZ ɚ$WP=ِ+ĦIIxI]{rNd+BBo2h~jƾ[1?\m9w1hD3j/ Z73)íg PWLw }wI̗03DXz.P/|Ns%I[ѠZ]{+mCEt_]1><ed؁!^,K^+l~XkqzGq:0AW6@h[(5#ҸʐʽGr'a b-|44I `8qm$cK:~a)<^&9x,wa?/HCD tY!(Tlt%8~mF Ӆ+y)-3".CT; {2:yd.[V:c:EX>`47Tb󙠡%RD!|!Vs{K<O*сk u9j?ɡrwd?-gCɪ4NVRb*%(!›QLPIͪmJ 6j=I/ t3!Vnzk,0.бX ٦z. 5$Jp3E6Pp-P[~z`햘ƶqY'jA,9DsCyxTirģz!@;Fub hUKpPh:L?f,k۝h ER1՝uzTy}fЧ`}zB68usq44SֶGi/YIaek9J6<-u~w.!]R!W3^%YΦaBh/J;* Uznv+n [ 8IumI rhj!fء#v)J}8;nMYr$KOP\mFX%k(+o:N?IkrޝƆIrUhC̉s0~r.߄,ǻ͸ Xv^._7m4dMd!- G.0t<1EtL1S][r1k>?6wO>!5_ij3k˗רC=dOo x"U r\3?х-h}JвVdpIM@H~5:{`z C߉XS Ps`!XԩAQF.m03KV'mSeoWNaj=/h[{2i6էhz$5 HBkQW BY!o h}ۜ ucNuƒBSS]/H$ kOr )[zی[5)ϑ{)xM,g$+~U2T@15WnG3s_y| 6Dr+v;Q=[m;mkSsn[R3 D!W  ¥N /'Ikq|'\ӹq/TVe}4A.+:0X.뚚mJ.K;.?][ց͸nu"AӨ^fue=$'@KxLo6 V1}ߕA RR#锒AᦁQa5$2}oJ/cY*cqIbr.wkqvxqdG +P26 zeaPc}T*5 n{FpmQSsڼ-طrۧ/ d}s1&a](xqBwR'q\}fl~](~2u;8OX$qc翼:.=osQ 6,jr4$0rv? KZjQ%ҁxN L 8Y L|06еt%?yP^c&VY .8Eǽ&dx/RV_. ?9 (ۖFb^Y ve(A`#Dkܻ32>r,с@j \%懯,sj|pXdb2޵ uMH@_i|kQ Jj8xz 4u xJsUV|T, *h $ P֗_9 j}{) aƮNmk45"|]"iAxu9AZ 5..0'h!a2tp:zzIA'ENI #Sb=BXHO9΃k­|⬐[ρԂ[YS6;Z>Q R7rnv-6@O^vJQ &eN]tQ+G=.5+4 hǙ-<֔X??8E_430x73j|i!S=4E( hLq1=5XP-9+GUR4U2ELJsNL$rFP>MhQ \ѹRs[܏S͵C"N& ;ѵdśC``4Oۓ31]yȼ9ZSß`[bc5#PlsmRh8=`%{ܶC]gW\0tyKP`Yާ~ĒJd|C{NʷZI`>]+qЄߜpg?᰸0e?:3JVa\y}ukz*, \f_Я.lʿ)r͏܃')]&Hs7~cħѧs9gUb wU'Z*ߖJP m}c\L';t LZ/J$)+>sDX z*lG1'rUn6ߏ =<_ }PqʊtQ/V0r_a*G9%dn[Wq~5V o} ~5p.mi%`yj3Wdj㱳o }<Pt0 ЏR@~E6 wB 7Zc E)g} OO٢EPkv Ĺ 4O3o!-9K+ +O {AX"D0&ߖqewG *g5zwZah}}?A9V Y;=IEOw(3+4T DnԞc:egW)8Td] u?rWW%޺M-kKpoHhE 6Aضyg=)ip 8T;_EA,rڎ߸U42eKYQ1IvsW,ʜm%)0uN͠ ㊣T_κDXؙ8::;Wqb- [sU* !6;E5*LPT!QW$)͟|r8Kd8Y%) ff)>k+]TCCfWK0kFy2s*Xͨ\hPY.tJXMxKgOCA+trt(g50ꍨxpU]ysqmkĠ~#GxLoA(WU:j9~̯B F<4CeXրA$&-!6&;[&"x yQ,t'kQ ahf 6TӉ-_2Ā#Ī1Cf -̻~3M4zbl +G[{dsxѴ !9=tϖ\?\g0viy=zLwU FU6qYä K2]\eȯ8sȯKn!Z֏v+&bЊMB"` Y I@?/!RYFT.'d gLT6_ZLG\IL* +cu̒uGo|pQ@0? e;˺5V /'9QծQ͗rqd`xke2m`UlLJi[qUH1oFPQ-r@Z=֢VE XR{ѣl? b_Nu/[}6,q,JI4H{o?$5[v52E=ypHmyoA-MW˨{=S$jSK hLM@ƴX?'@JX$'v=мg`gFߢ|;5ٌe>ܓpd>-Yc9tN%> ]UNm$uNk%m96Ŭ8){.s u,hAjM2r\7z`x$0 '-72#~/]]a{45^ KtZ J96܄3*4yT^:`8 *< ,oC櫸:U&ZQC I-AT"UvU;v!De*ZzqPDw_T>>z+ w&o"pJ. @X\Iy<>yQ_{22ތS4/Zn^hyVQ!שiAcxqrO}i\{?QFD;Y6DOdo\l0^YxEg:ad:y:[шk=.;Zԯs& ̠@(%x.As0Zg.$(g}:^$ :n-.JJ24Fvuot^*r*-gӬpDspކ.rIb .Z8p[pΦ 2w.< utA`$R3NLo92nƙ@=zkj2XOY(} ǤRJ[-cSwf6q.誛q&Obz^-ߌ2.z4C EZWmg?ĤnIgx0;7NHhT !Q05p\Mmm3%Zu`2I*"8KT\mɣ&"z7fڲw=p}4Pm"His+8R[#DLJ QQŵ!.[u1(24mCPFi<~ T o[!4l ߲{κn7 !MmK憊5PL)Uɪ8\QpR'HUۨ 4B[,{j^ :/B5EE֧XVJz:?%l˳3+}zG#?c )NGi\g=DtD%ekuAi`_w=gvi1W%tݫ#7V@b%nP~xZ(4.0[R5G^pDh?`"^dcdTXGPv/V?ܣa4k^Gmt}aH|ka(QYzHhaa);Zͧ"ܛw8Ʊ/kӻh,6L۔4E>CWW-ezC<9WBr}_q} R1H z@+(ެG?Ĺ&4_pM Ҿ: h(V-|X2a(MS)-G[%5:=C_~ GR^іe;ϣPhRJ2 <_(C)?O{?܍īf^OJ~g ²;ȹ@F?\@cy{[BS;Gm]ebYjG|ˌBZ5s2{2!K]0t@%[q5JPHi˦L V֯ -h%ПvW-`ހ D8Ȣ-2I\6d^f c d2޶d yn [(@Cf9#ז"4TQF|BjZĩt & 4]ZDоQ q@*5cշ^ kөi 7A6>xƝ5OȬ]'l@꓍֣=arKTɲBԣƒR*h#]w3GSB3df рχ ݉y~N:_q&Nҟw5c\zl]az҄2+~ك:AI$oY4~H]!8e^|I=dgC45F.Tb ,&Z]GڴVHoȳ eťa½] ~WW{0i=UoC\_'kj9(Փ)3PhS9EIL ^gVlTJ.3Fp=/7o`3i-֏lVn`lsfv|sI >#iQ v WabKTY|t,n-۵m-6o=W43o&/jxlcMz[Mmt;MVEϦCB`rXބ#8i2H%`AL -HeC^JK bYNȈk3TḐe> À!^gr=πT%  b 법[It9ݲ~o:X>c[A$,iU^U\#׮>;ؾv߂y6/5dY^dN/ x3H+z:lMWz~p0PS}_G' >4v6^PԆ@d(*ڶ#4ۂ@qDWtַzLg2?+B3 iAjrϼ@-RIy.Ry:y+Ao8v|2DutȠr gmi)z;0E^1!bdǠyi>YsqM1 S43xHӹwQwަPEVKLVQT2udFRzzǞl8G۲d᝾ul?PtS rwP`j ߧ" lKWسqP083% jpy!$K Pa<7w6_ŠMKt^Jc)(і. u8WtPz@Q}v$7&7c(GdQq[ԤyFvó32{ZNXf#Mp_?oucjòWCq d'׬fv~(a0GX}YO&l"y즍u$]Ȑ^N}ݡ}h?SϖEliŽ0-i*e Zal.;^z ?ҀF\P ɖ@ "!iuJ{BͶNn[|X3j*mƌLPM=G[{ܙ!GsNm #W-,!|_ӏa6&qrp5litM(EsTlrM?fq=%D]5@q4 T3/ٞcQ$}omB&|X|G< uoGXr)'6<'?[߆T83|_W7tJcYvB7݋~A | .ñawAz'``JS6wrU+6.4ϛ¸( raO|.n[ ` {`a/mogEU8bR;j8Pd>C Bz_d+0Ý2vm+XA(4UP>S=<&j*t-ZY=[F(P#|E&jrTxNОl g@ʏRvuvH(̃Rh_QA~$԰&n dqsWD/oT9E@菔bYLLC\7 Λ|(M+[ROI.c7];2w~Rxo\/$w {U J]'DpD]MM< ~UDp n %k傻Jp_g7Wp -}]p+JpE[-Bp_Mԥwxs-+fk`KC|px`1̯=`6nW>ٞHr~K|fC~fK?O?V>7 )rC1,^}r 6ӧ?~ ~8бe5%0çOm^DF>j0P;Lsخ/f v7pj[V| P3CӿnrB(#>Mzb>McX;vm3.k?-cT sc@IA:0~D9@O9EXŮNgL7J7]ga VD}s~/mH9KľOf}#+p0),sP*k1_47qR()@ ӫɂzX-~{[oB8)4@4>Ep hv׶W`"P\(T'=#/\ 6os%c?8.tD1`!w5GPK;Ż}4@~cFWK:忓(^x`^f@ ^x`^f@a|`^0H ݯ&p\ ͜55Fi,--.UKMEBcYY2cr|n y$<{JAvѲ))qJ9&cXd.4fSŹc_/aL-*.UJ9&sQk/7)C ~QiZ]boF9+Ԃ삩 "Sʪc $>s "UTj)^V03+ur9/XJS"bBcaqjevNd$emRlQ2?רLBKͦy4&"OO HH7 )O' $S2ԈHn2Y{13sXFd*ˌ&s ,.VfA~i)C W)@Qxe \RR\ E9`qG >_Fr 2+I4VLʥPA@T<bd{Y.-^ 4hBE_E0/7?.g@MeL82=^0>kb,^*eEe٥K'J;@w=@}<(S'>B\y*v{7t yمFBg5[sVN[2KWSn_4 \"@DKr @m2MBg#.tS\2a"#$/+(^ )5B7e,1ހI^iqC0FlZe@xEM.[*a=| h]r~iyq҃DoS}HߛL!$^së<}뇫n4P٠!&SPn_R!2c)l/5wk7!!OGe2RMm?&T$ԷV BЭmykYx&f&Fa\ ?Zm pfͦAҤxT]~%һFW& {jyQ nL#t/1sPWLJz]5v0l4'F3r}l_޷V6Bl_+)΂hHc(%*>cO#+Aӧ'o܁312׳u˯WY([Zl.w}ѝgěD[E> gD+OCכ9oK޼QKD۴伞rNuKTyys{:s&ZE+z'm ,A2}z*HtHyq~.+(6b#)(.Z&=)hSi9y L V ^^S򋧰`>띅KZ]śJ;bwO :;JśJ;bwOLCwLPxK_{3H4]G{#]lvIdUC?Qޥ~&YpP^WJEygLn^=< b-ӃB , 얊|PPB(. eE# `Xtc!CB}Y~p em’"c?wholqT,4k&4$xO1+btGd\$RJD//$ɂSh$#g2´")F*=Ǔ"2(Mv)Dj<켼2GQsBr.Ruvz*qk Pgp{x/'`'o'", BȦQ /$n16x < L o"Ok^><8 ޸yt/T_ {Lח{K ɒRc |fWbbg`H)GFs"wMEf_YKK|(^Q ~{D %^x(V>8=ds-sv AIAjF/isobàT\y-3 o?}n(Q4QX0FsʙVd4/s}œez{nLb}lS_}{-uca}𤡌гx9}Qz= z@^FMBy={=-Dq(,@ɷ 4QC\,5C -d iL Q*嗚sF\N`; 2GssKeeX2hEQ"eIќ[ Y+ˍe1>wr`?qčwV,DH()"f:7\PF2O9}qٳRfe.NN75s.9)(e v xP~DpCgE/., `Zpt_+<#oL1_"ipџҕ ы-MlP&$DP'aW&!;8'%c[S WV!cDrSs+#'=c_poR =@"!'^ Xq2zuԤQE}KU}y'>/[|frO~eC[osg[>K׸7_y~WO*~77tg?+!27q sHu+*'OEV~Zu7'g%?MZ+Q[XwO,!5 ;0kO >u*6qGC`+ 2T (b2,TcpyA *3*@ll]*s +Ԉ Յ E ^[`k%P : ZP>@, dP#@ E j u+cNmp.!v#FK0rL(xsҏ%G^32>Bv\ wG4@Ч 0S7QAZ/ 0s Qdx0FBbPJH@6:W\]x !vqu P;'wK=#!pz X`xK_ni| 0bT [kw퓐43KqQ:2w 1+0 "CaA5DF@r3IFA5%r+#Jr;ITd< |L $2L~LCIђHEI %GK$S4DI N-$4Nf$!$dyаCa,!d)ɁH2G OȢ+%er"cq,ud= B*l$O*“l"vHQ~n~YI)g܂.]V fcNxɢ>/9ŅE)^̦/,3-5}a7ecߡ}F¦GqVAN1qBZuHyF#j_t.ZCKqzcS>D_;wu>DFȦ>*=Q" U}jFjrcΊ2sh]4CB nbOt/F?!Z' <݀.yROx?찧ylm} cl-j 犛3/lJ;b_%]xiKYj'QeP /4loTy{OFLӃ?!a` HꟜg*c?Je@phtyྪzqƊOGLKMRbKK>bH,u RHl@ !6?bˠ ;Bq)ǔw1%~H$ӵW>=@ϸ1(e"B?շ~o@z#epcA H\,~WHȧoSVD`y`I|'L5L# 9o x|Fk`|F>k`|F~ o$dA 98,!w˯/K>yK\5^ P5iN& `@F^`?!m%$-@׌ n)xMpkcZA.70LXV1_dcdL]0Hؒ$;ddzqia6Y"^j4/-3ɽ`KKE3!RxOw20TuЇ٦峲  z朗mxΘT\X]{$gGw4,yZ40@NYEd?x+ADᒍU8 Yn.0#b1$# ^YP6N3Lie@-.WD?]c.PmҽG/o Iy>f[̵ccZb[bPdxAww\Rqǩ#_Do }/*M-VM>.bRwhgjjsڱ3EZ<굨D5*:$zuѻխӽ ߭_ZWؘ蘇cy9fg1cN]! 򸎸SM|?⿌*l %%JL!~TwqMǚ5Co /|Q%;ÇDDTG0k, H{ѦwD-ݣ=;ET'_?3<626%Wc=hc0T3|dm74nJ..3nQ\Yq]:J- '|peH xuPmWorM}Fy@N\<^n o o rDS?m6G{@{P7 {#gEfEGω2裐7u2VCWf x4bUDcDkQ}T']ّOG~ySTv#tN_@i%Ǥ, uJ;$v\lz Ol?D͌[9.4~R/OMp§ (%b;Uճkԝa8t͇45Kix}&"*bvڈW"ތ8T,<"\~MGxCmGEHx0"?beē@[#vF)=_M}@k>}Z^^E5H]ّFG>Tg"F~'@ȳQwEG%FeD-ZUB[QNF }O觢C[?ԼF_ եu% tm}^תׂX-vZńLHLy̕ulV}?L0CgY`qq-Bmk>RܵDPߑNk' _&Hp$5ZnuzzENC-p45) y^&/4G5g4'³s^VV]YGLH0FE<Z/##8q-bv6Z 5eڏ_kOk"oVy_HK䳑320jB2ò'3jWWwDkG/~4:OџG> H}N ]BEnhܯtVx>Moԛ=?^A34fṱ1bug<Sl1cjc+"ءNCo`Xslgcߊ AG툽;0IkR FCl7Cp03\3p{_Ց4CEE%'303 **jvDn[+&hL6&h/.&\5ɚ`n&MF}{MUͼHILWuuwuuuUu~9G9Ӝ<*gչǹu0q> #]7NQ233 3dT(ȸ8c_uKJ_dș2c22gffg.ɬ\9sG2gviЈ73?6w/cdX6/Y\fr/YX޴|a FY'Y󬋬+euNϭWZ;I֗i5$'LJHIJ[}Kބ'\p{С`N$$'NI&:'&>1ֶҶsӶwmƤ`I4e\]吏L{&xka1!cjF\-#-cf܌e~F=o\8͉%%FHI*iZrqrU|[ꔍ);G>򷔷R-ߧ5#킴1OM'woF6Xn|`1| P2X?%8&)<&&HvBОSHa {}}}۾mIsRKR;R>^WӒդN;JڨtXU  ǕOATv{'ted:`8 t92A왳2Kkg^y]槙8!_A?3-+yO%6e>S@_- a] !y+& #uBG%&>86ul0Y ?ǤW^K<)f~}QSzRJy*%fw~3+SoH} ɯ5 Ci|}f(闤">Ց 6w_8:+;O8O9vƁdgeXqk}0Ve6f^8K( F.+,C-Z| a|Rk&HHJXP 2{C9!6m!Xu lWںm&&MMJX<[nOmC Iqɩ SKu1܌3iOM711%1=1|<%YTX6qm4 8[-ae QB%ږ~f J < yI 掅" b,gRVR6̌I@oO%FI }//S_CaLH]<:9?%erpʊm)w@qc:!u!!Hx^ZYִk>lڛi_@nk ߋ&8G(q8:np<s3֙)w"C y"Մ7aVJq9:v9IɎ=2{)c{z~߰C4r,c)@;Ή5UB_AT#=7v~Vu,tvs\w"gy>'PZ֙֋ 4,"rj{}~!DWۯ8NQ7*H=R'ƥ&O qԟVA4m7HԛRoK7@\q7E3Odb1Y̖pK%e 6Y=2ߒo), _eԀMkA7[[vZZ.tYX\sF =mr8̈^Sg-[^ioX;sW𖭊dBJ{~##&H$`g&X8$qeĊĚ:X!rߜ=q'!8x%%3knsf@,o+|*XlM6۶úmb[̿kll7nݶlێYT^l;m;c{?}e#IrdJ2''E$E&EA$35iF%V%s O*bgOz1Igހ8󃤏avDd%ٔlNOHLJN lK'; |拙/g&J*`kucֽ֝֋]jzF-M>ZXH]IL۽)Cy ʔkRܘr ;R)a ~ٔS^53)oS>O*eb7p{=hX'̀xfa ^b_i_^kݾڝ]+ hc?nk,z.R#aF%x {#a~͝D{ #CF-=>3ô׉y)t[|p@i<&QZw9f@ ۀQyyӈ9O / S׹[*ݮJbݣr6? h9 ]K fsqȽA5O$m=E<4hG,ѣYY0kýtMUHNh N%bA{˛ݍɋ<q hVЮՐen@ #~N>Kflkj\AQu-5Uq?"8UɁNmCj[ƒ7`N[[lhVX۰ho ?z[n.)?sc]nozYUdgnN~6ys!BjYYUh R3LTH@r~9P<sdF᚝?+kvYE , Ա%J̄l"/wqْH IvS;]pqK^ً J9 CU8 ot ~TW0rW[Mn~#-A\؍ ׬ٮs d-)XHV_Cf^!ye*hr7I&iNmJ?N*Os;7Wߟ'kʚ # GsDT Հ~X@ zpUD.nna٫gh;SA&q+V׹ZokU[  V\ޑ@핂a|b Dax bOo}3m~{'~ILoT7:T2{0yO?r iWFAz\_F|0zt%QlqIq Ʒ4Ƿ4s{Zf_(61.k5 uu[žBdֆJ|YH_ ͏hs& ;dZFnWcKԈsU%}ԉii"HW1Qs.k$.ʪ[=6Cqh T8TZSHL]TOi&҅HeU.`K B~'BF=+٫yE9P0dY7InѰt 臿aEԆ&ͦ2 GZ£[7@ !y W2H6`‚ť"pI~>I E6";1Rb9YfChp\Nqa?p~ % ,[Hx|[3DH$P0Nb'a'9!0[CF`j~QvdDq쬢R2M#y%Es,̞C""9N$azV|y$Ꚋ*[**+9)!*xC*N3T:!˸:#LXp0,_3բ C:~.yr j9a$^kVpҞKv |꨷TS.#V&tI@vC_r'/oE_976|m a=j)邪͍skanj9RXԖCԬpb3v}\:@ĭICidO#}Y6޵ХX,Qn []K(f5- ~EuX}XI"#5\d ۥ:j#"Sy؂O渍pEhWhAZ1 ?c">"}ᴆT#=W iUPXܙ[PWzQvU#ՋNmMMݦ"DuGt+Py.9;Ugy/>һT灈WK?N0$vec,DxMtR񤩗b!`ֹk<97@I*ʔD<>~xJ?h d-huAAW;[ds1.GRyo F,?@ dIz>pU=pu aej7\g*!bVŚŃ *)yPE*p uu7A.5a܁W0v. øAwwl%Hno øG 0 w/ 0^DƋ佒!_4**0M2 Anjk+@Dԙ h6^ jPOuS ¾U[is;/՗UזCZd # >JCIJ?=%$|D:_䪭x( B[ ⸶WMH<%$BC z:r}[,}PladAFdpp/s"|/kPj# `s^NK#J/B{(>1#9.6#l8_ i8r5xU*UUގ==Eh6ȏY_E5^D/Ͼ!v(h.] ?'0qX =?ЛqBHFWgI@@0v&V@zUL.xu_GF6o6_C-** 4zr/4aZڔN _Wcر8^x8-nKve ŭ{~.wEmcv(߆/s.a;~;l! ܁8u1hKSyNt)<";w/M6Q,M];UK( U ( UY{*ܨ-M &]T~2gR|*_g؀8R 4zq :Ō󯪇9] 3© " 5+|y6릅Е%@ 8a`?1䗯^顾2Sh`Nޑ_R@B t*W/꧂ET*xhQsUWQAa|:"AEK`0@#pBPBz9)PShoݕ {j &T;/DJF*? A9+`bi'lzO e!p)WB?.)~]>G iwT%]Q{yGUB?M jFV\J+>=JGfrs=DixZP$l PCsD9 ⵌǻ}3Z8_s~ET0 }YsE<%:曡x_< ھsWGnpDv,YY-}&hyFRW$Ld#S+4[K(G![]%* d "#py2΅?r~xDvIsFwbJG-kAbFa8qHn'mZZj6V5aMJF'R z*@`~+EFmf&L"4# A:]Uj!ѺG{z:~kݮZ 4 ^19te bqu6% n2`H 0 Md#>B1 F21$3 $ /Tk9xHŧ XPCOIr#31G 0~bwo9]hI||^ b= g? j hRh#IN/?un|ղr wLASkj~-U?09wQr;>$b}(oyY⍅kFqVs}gmC3{킺cy+nXX߻F^> cz0M03 %~ LFIJ-ʆ*4$E{0'y>x o9f繈r;<KOC'&ehB0THbO9w$8Sb֣ju yr x*8dj y7L垝.b O"uXCEu5@IءہCP?;5?LD,B~'#O 2 /.Wa7pŕ"0\.flee5)k P)j[0SoDXCw UeN~1fm:mn9GsDWõ?RZc!}6p??fJ8R-5AVr_g92jZWeJ$wpN^ M=ǫ x/ | pFfi4 C/"syAG<TL LlFHe_2|DoW|5X*x>sh8Wx N=+>)O/!%&^1x NHCRo/*Ӂz51%a@Ӂ<$1ΣwƴEjLTQǠ~UVkk*UD'E%4TӈhU>+cTh$p"UIs D7ֵ"d>bO!Jx*L*46 9‚zwA0w|d!ԊӢQj9X}ڹbrЯrF%i2اSsdUY euxjgBdcC#4VLCgl@=R1fno½]z py]%^uu=&2RyNt+qjl^Q4V:Wҝcښ&GOc ǀ0,퐈'$4P P1@ _aBLy $V`)HĄS&: F@kǕ'KF#ZN#$y fnl@1FڌtJ9MKu(TxQ1i qCIzx (t|CHrr8(LA=Ãq7dO0 8s5{WBUr=yyb.* W9hm oebH.^B\⑸"@|ЄrH%!|k+]BGcC.( |D"m!j@ JT \OSY5F~3C[TބGlI0՞HQ|ڻQey ?B ڒipˡ7^r|*3+eKcd>{,>)U  pG퉍ʹ(TC(w/lŶbks 6pdCBKB:|~RN2E62)%.L ~?4P `8ӟo_y/eב ~}Z$a߅A6+?&? ] W 7ɒPaMU/ T"iZGjUx\&7J]9gB!Pa|@y CSi)I>*\վԮr!S(rѕȟ98_X0>5#?//]5\KCR1ѸJ8gS9(˚!Z/ Ix Ij0nHjq?. HZt$IPV*갊KsZ wB!o$vS`/Km>=ğ(<)/vXU5#ރxT1uBn &TwO%ťN1#EB>#Xõ$g%|,Fؘvsh1OISQ_ۂC͏7iu@?0Q 6fqè000n6@qMؼ{yߣdNB -+K]&X?NCK^8D7~Su7Q3~ jlРX!pkbH8Ho3tQQ1σH`}h}2}k0GtVU+֨hQZ& qtp@~^$0l6qt [`y ܇ƚ!|8߇HVר#{E%{N%{>tWmcP49P7R9)3yEA~s*@a-,4F<%(1`R[ p3Ag^AVV[6P#\Em&ֶtf#m[!*l!Q$>o/槁amUY6bڰ=td"B<܂ӵK j4տ^O?VQPꓑ![ ii"'Ea/Oc^*=yT'd鑰%RgpD@g x } qQ}MgO;E"k1KX5B^ %xjdl(ojWYG[AV&9Z֗i\r\@$UCi\K.hpj7)T*%15ժ}^UAor2JͷՋ̭Û*hpP;'F-^ ]ʘ$4Y5#W6j#P{Ip$sfJ!wktshV*`:]عF.|l:#8gh3Bl+NXZFPbRթ=^B/N^D1@\!3u>\y6 !VEuB dd?DVze K!τ P3J/xv=L'x"Ct(]1w %R\`^INdT'9w!xiA툀ޯ.1 B.;t!@) Fu5x3 &sz/?MХ[#MH8%u laS}9t>xdreP 37 }ZHFʰ=Mx@')M̫`*rջ10hG?O7oG*2<<CSM͵meLSǖoh̛ɢfY6%uAy>fUv i^U+1KxgK!$tL Lv YH^%7)I W|w ;5o.}羒] pGN "ҠW2 W2W2+xXYW2Aھź}"Ǽ:ĞĽ$cʤb}AQtEqB͝0 qmakՓ'cŀ͈j9`UJUUM|@Go= {g;B}YE38qN02a·`i`b&6ԼNmC׮-eaEc9awe'>4NRBC}4 (”tCaDŽa8b„12%0)~A)#< "Bt i &٧P$z06+8*bBfH]ygsL@왩 2a/)%NA11O6ir?#FMm{4WB>F4a)BXqEqҤ2w}i+h8B bU¾1}Gb&(_$=FH} +Fh!яC3w 'C ~bQM#;aԛS(0t\#zΛ lw^#.3t|Grg$ zx[rKaEt$I"m+o=O 8{tawfl^@_/<"Ϧb]d^Aw|v~ZkW4, ΰ$gL_mdÆᾊ8;M&=쥔wo߽+oֆa*__п[AZ?þG?$3x;)NH UiS&Hkpޚ<U*)qa#u@x;Ã8?zW&f[:q ({aGtGcvV#D8@JwvwL3Uh/s8t`T_0L7 F8cr#N|hj!K>&"A$9ړL؈$.3a1lG+nPs6ގwg $'kۯ`w*\IU 3au^Cj_> ׫pUZˆH_cJQ?4&RCL'@5]zL}I6zUi>٫bЧ j7zkikq@W$+*->8^A! j\|fy )[lzJ QT XOi&WqجqP"qUćkļ;Oo'Z剚ULf6g.Sa8MU|\@7pw dԴN +I AS`J j@|SsWõP?xD#_BGCn~+QUP^ZQ)*M'6{2[6676EQ-{:ßWd]j^_PQYi n5'[D桄}e;)m=/p2Snc](,)q^ݿM;[XbbA%Jm!Q8؈8vıa6Qr*Ɨ2AIɗc=Fd.yeI|3F|c!7)Fu=,gnvwh9 ,a{0j8.~u+\P,|s!k nbb5W 0J;0 |#V23ኅޛBغ^i¨ݟR>cZ9vPT앭7_P{sk7Γr[gKt n`k^f:B`kw4Q}YYtt.H蟴f>69L%lV/_Žl;#ARI~, ޷ Q!8|AoߖY^%t{OǟU8 Aj3JI 1׍\y.x^R{~%}WhPf3wfgag۔ذ8\,_ s]|ʴcNedlt.}<+3c Xʦ+UNzt%T]z [g!ݬWYjjF` S lSe Y5#[7OAhS^d?]Vml=LXQL %>Ns* f ,HxDbHOzIx'&bU~EgˁVx.3v_F,a?+a%w J0V^$ka㺙jY'xU*jQB{xYIbf w}[3&BI=@w){lPO`1טpDoP|cA}m @(ZVF5U$O6)Qdz,A,E J"bc/bGK/xo>UO!3qeB]`_c+YI^Wd)ӝ,WU ;A(8Ʌ%.[;[i$TzLfLf {M9okcAU*[iq-TueU+2x"Ȧb6/'Vd7-sܰٗ)#vBn8Y^ΥRm=Kayv6DZ8R}p u,ޮfXsqm8ŖKF쁅==Z UVs7K^Ϛ]w_wC٪pQT*(?(֍Xݟ vݶn6ʽwnޏJh}!߰%g)* `tW.C+,c:m,|enh Ja4'Br7]c&7~ΜNwˮݜ^c{snegLk6wC&ϝ lx(dwBnb/ma=P͹y9j:؟LDsPa^GdfZ7 lSDe})MRpS7>j 9i,Gy]K{ޭ},m(ߎE>f{JSrR+)9 lcӒe8_㊲g-; C5a֙ Yw {쳓!Om<6Cg ]Ga}y1}` J[;`LEVG`uУD[s 85+və'`mc.{[m9%rQu[tC )r<5c Fi v䥰\vr(~f 7UQu}NĽӬwvi)˃r0wI-]>\`' M]pz=cR-L`%4>tG͌Nђ+ bOIJ{qvC!ܙîֱEF+Vr7-tM(-r8;_36JܝW0kal̿3#jE*Uv`&*d5}}Ev6h'kd:B*`r6v[N8:z4|H>Qzi|,dxwu0,k9;j&M}cwAvL+; fz,Gt40÷R` R{6C{cz) sK%lSrft퀱RXDD5L ں{=̟*GѓCP=T`m%H-6WɅ?Х=&7R>pm=wX;\r%`_Y !MyxgkK+7LgNorTqz}C?"rYRR" )+˥09ߺ,ggrtgvl߹:qF) N(e9Du;٤S,0u7*/PB-q{"-ޣ*}^s}Des7;Q 6mTl&*9J:Vrߞd;?oC<řy͋W6Y%,rhpshrrfO5\ \|mc+giB:CO&a]w:Axmu-tWn13:cK-♹y;(V50yXz'Jg'>tjY.#jƙk`7c-kYc=|Z łU`>DZ,u(#`R6'ok/)G4ՖBt/Ymq *u[mkUFάQG? +=|_LObmݱ{c%NgR4e1+Bm}[49%# &Pê+G14zcYuż]JX< aG~dA;8+u[o[0}撢i{؆E(( <<[9=#򕞏:9BJ*NwvVr9lAN>5JijaJ)߃esg~ ԺYPDZ+c{άN{~|>?eyܴ{&"ȢKP^h-0x f̡~B"!n6Txox ܢtgغgB*KZF),'ƾR؃[8W]*M ѵ>p:W.ߠwcr}nlu]vh-NhjbKHW8XjR֜lX.R(o9U#u9#NJ%5<W4OJ^!}leOkƻޛ挍wvפ9VeJwKX{ ]?7[*6R֔"z `,\sKǍr|f:c7nVLeft2i#Yziva @, x*qفBف:1is Y dziB"j!NCn9{+2+PJoNtYպAtu-v˝ߚ6wDx`e*jiZU~X61- $y"? 5?xYW6S@NH0G6J-,YWoZ>_"A3K+NLU?:>Ht^A gDUC/Ro㴖98eC_|4 ^&B ;%J#8/}b^,MtJ*ɬՐ#ygoR,suhQ}tY@ 6 Pӊ-zb-^K}T5ZZ-Zo}g=sIBs{?_>kfccϞ3WCmLkɔχ?-Φew6_^gwtM*hty`&q9ǏZĹ8%N)%CA6]$R!˸=|a W^A#VFt8VtQԲ*ʸ9M ]6%h0Avq/c]|e!qMa5i gX]3)Ks~k?6?~zԡ禍[ͼ:#oZ}6s8sAgX#D'HOSy| F OH_32KC|j2DD.1rD>Nx :C|B{g^+ݪ+B:C%zL\@Es$)Ӆg~msBS[{t~p(TN[@xufLQ74&Ms!Ryz6M?V"13W\qe2.ECKi|.I u'uKifJüP}nS:_F"E<()&" u[hZ2J/!cU Wǚ[c5iڵEKjcU fSI*\mZb11%%-;wItIyъhɒ+ċݢ%b늒Y]S(9;hUmpu _hoA!֐Ψ[_@p?|y%ZҬ>ezC,  ˈ>ѰX~S/LHV(%X)::c*l)` W%!+p |Px`y3vK6.,ZTI-';4}EDHD~A"M׷ ]pIEPx)SH Yx&Dxۄ~s Rw=7Q}Khcb|;(NIW.TtKMZ-[E+:{=WHm]*RjX NP%*eF,^fQ6^*E?WjJ]fY*xSE0f%V1<,b:[c1M1߾Zs}t](:a`E[WJ[Ifݾzܶy{[!0 _L$"%jX|_R'LNpm!]V10;rETR݄A|7'!dپʳzk73ρ'zn{dypX-5sk;_,\G'!uU;bx$] :[&S2W%Dhw)(5b9sht3SHU X9~IIt樂;l-#-1`=xi|Ƅ= HqI2%ˤ$YDPL@Jҏ.7ND)n{$E#]NNJ731ͪM83 (xR`qgW`~fzs[rP0Mx`{=Mb#abRݨ&ZiY%)W+7]%ZժM&ׯ7n!|Z _Odz {Dq?|( I9y)$9ktk]4;"E$w)ŝY.X ,u)M+"e,V@< Up2<,# ,a8[FGdlr{!|B#Iu!wŽZ7&%VϢeu~׊yT9~(پBzi\"&-R0R`˥ a9[ၯ>5;{  kJ,ך$ڊUwKIqR¨1UjbՕII-.LS'3 r*wpws4(fh$Xmwҿk$l7tH$E:yy7EIIVܫ <0͔/!"lŃx'aX5!2.1lDŽUf̟-ßfr}J檬T*%*LIE*J@;7;HILu,n 4ϳxE+,,Er÷0.W)(\5AL#쀣Y2x`0t||eqeWſ9 fM΅;K ?$QU쀓X (d`QSI5l]JGIòU&JR[mr1lR&_KY-R{U;:%~>;ɴ28l#uan.R,S gufk;JI!"rcU.jwl.,g䰧pW縞R[ N`D duTZ#oCTY 8-ifO\@j\u |UZ.E,JBVG4<L4WeÏKqXr.p-,_C),r\,g ?C2u-4"֐ Gb JX xG$e$"\l(? ՑڑNRaV)pCI7200SE[ it* ND~"q.*#,gr.Q#,WM#{\rx9˹6,J%pMS*'8׀?qJw"]BmgB{€͙WrUQ8Ϟn^B UJ X]au=k7;mUN1,N!o.K)7I'GB dSX '+$x|Y%8"lT ~_{Vܧޫ>EZ[>';HajyVzX",ra|C?7\ pp‰|#xLs' 5ܭAjՒ.H9=eR}h߾7ͳFɶVPi4VmX1ڬ4*,R9R0R`yRKFHC3oDzr.p|:"pD,L"ޯ#P\1J/fHԡ}Ǐg l_bDBU&V[lU*Gs HOqszVJ=+za)V#RJ5>%{Jhrs 0G™*+bLŔb,v( (TT"Yͅ)pE7e7Hfy9_˾fJ&!+DBLі9* hㄸ[Rܭt(O? |l,_`9yƪt,.c9<\9,gY9V"S2F\1c!a )pX%NW銇IX;&Y𕣔X9A;Y!=Vk $.ܣQX TXv#'Qv+SX `pQj%YfnjS,ߔX8YUbp@%q J6)pъ4ٴ% av_b}J|YaKfX@+K, ,:f3 1R3!ypr NBDB5 ZBwX8X)6ӎx ,PW8]%ʘ\e&EjE۹QyjCKGEױZbqXXLt*u,$aNŧ|[ fY0;>"4Ox] T'.` ^aWs#Gjj*HBFWبM[WL}0*,Ske|WgC r.PޭUrK 'fy w~Ew{Z`̐ " ["vnyAxQ"$)%HDQ*r8\Xy̗W^OB*a[HQa`]@Ǝ`aYrB% K DžrH?M"! s8`D}2c.+[a0^.dќwNKƲQȶ<|m?W\gy{s'q`]|)x?/%5~\̓b!KVlm(j/rSrb* @) *cra\u ,ꋟ0r\ALOqZV\]|Ń$|/tݨ4la*nݷEP.ߡ&݁ᑺ7OT{x}' ݼ |*6#DQr1}a(/=kr((OAyrb<+;c@\2V.첺jYTNnMO}5t+aRMiFioDєN7}gŀ nԫuc/RǐPϪ=_6鈍 T ULUog5r@wZ~\q#Pʅ#{Esdj2~n tv&AI * Kݲ!6eC_@?6ph \;Z]mޖo28_z@ITh'jIhw>/~ -&H %jc$ر`z8] ]_-IxKsN׽$Ը`ܱvQڝE5 (kBeOԄ@ZzW5jUCYf3/ b?Xz%c4?N}[KKx3!g ?F@F4_Tkۗ~s8h0߾TO!H׷sTK+߬$%gxJo'K`) ysBX?ܛXEy#/|YWΠq:w]\n] '[pTO${xV{8,]IJvU5qgY.ϹxR#[S.HC7<0bgO*uw>](\_>[=5tT:@+6oZ%M6S+s xe*u7 _w|>~)錻:zIq*M-U\-)0e3:5Ks?.*OIg^3CHB#@GfsLj6 ަQa% UwcH7s#yl)1?#Zy6q~ x=;ߍtPT̕OZx\9rM&wߤ>R}UѲ 'G,${> pD.b ypyG%G@D%":"%"D$(+vJ$$>! T}WAx#7;EDc[{-v[MYܫ^+XO0 T6[?-JcR-$>!t2U'ɤ΂>U`zVOHML{L5ät"R|bNPB^dnUJ,89̞#sL(~E h+ìììØ>.7㽈nM'@Ϲ~n*̈ }LT"<1Cx"8YvFȎI n`>$ГT(;#geTNiqi3ZnrAR+Sq!3͂$x>㓙&ނdx3ڑe"+Mvj]IH‹;}n2,lHy䈋na6J)Z`9\A|RxSQmaJfH>MA\,[ex )n^rǣ~=oX9{sr@Y>CxLJ]^D %!7qRnm<lTbFau's~7%9={p#t%KG%b<ȍ#i?KEz {O ^ZC$!UNe(>(2`.,y,>!2yVEt|w"XóUk2XJ!*9*Td+;XA4tʣC$|/GȾIz$DJXNϛN4J i~1ZZ)J+O4qĔ֘]:Yb__1\ycS#۟R);wey06ݙ< jk%BJ;SY.qv6~Utms[svj4z>=$CܶKk-11k0x/-G`eF׹4JS8%ڠyΔ̎CI8Kfx[ f1Ӫ G|$ySoVX3%gt9RʑK7 %eAW W\(FSA0b9|\,g?5N`H4'!VW9]V0 _.tcj(#߃*0'i_ԇ)3) `(ǀX|(M"Kﰈ͟fR\ ı)-cOur 붙 iMA/G]*d9r.0r8<,?+&NXыJ@ d1%%%ذz"ρSf)p7͞wWw0Ko>c8w\R߀w'Ci8GiTgSռDQ[xҏY:A|ş$8K%;D ,AN\D98INf98͒axH"'" 2^#e]W- |K=$a oHe9N4Y\8R~Y΃'8Ki%~%s]ẙSjFbwKXW~U~S&D/v('𸊩yKŸG9U2|6f ACrfpŰD@$U%K- 6C.)7l]>,lb9DxVWigzgKD>-V.J貜]\b@8ǹҏsm|Zzp/BD!|MH:V|rv9x#˹.)1M,_Ȗo?3Y?g9˹MB0< sr$"C4QP9e+ɩV Y. nva*-ɗ9=…ZpƁ!ݗ//b˰}xS Dm#廒(7[ e 9ZaLệ$/^<33"l 3KY&B%Ӱ냐+mg us9xwx9۴% ~.%j ܭڰ8/d=_A3$>s$ߑ|WLb[xC)y]g^!g$e.F @nIYcʙt6>9nmmpG Æ6vj|݇TZ59)M?0O pДw=8'%;d!z3[V Xu0c(1i'ȥKKmRٗy-_2WQ=DoP X'쇔!<~$LM_u>mjrg CBRƵbjFB,* u+X3BBJBSv?{u5ÓGϼG3`Om}'?p'#xZR5s vܧP{f]/ cZ2|*p?'O 7+[Ery|$+=YȏVǪnؕbe69Mx”EZB˥ed Iw8S[1BRҵ<I$Pfx X,8E?a,9 jWCKyG~@OID7?CqH~g.& w#9-0ꆇ(g)C8gI?TGp*$GԮUM}|!~NƧ?Kt^Ƒϗʬ>MYؗv@^3Mv|xE>R[2?(ӿ<&B籽ZWW#H>ևj뫛gU;z]!/_}P0_ ν&|'WH<^*\P&0H%aSĩw.8J`GI0Ma tIS:&T4ݿDg [{vGśյK-x4޲F^\u 2:)t&fp,qGX{p,Z*d3bj?!̓l,;T~ouNOG ] {otKyauCmb bދN x9`x3<8{SIa3e6&X0Aa~JP0xan>O5 Oy# 𯎴NHi$N<=l ֩Gޜ3L;~ˉy61ۜS_:L 8 ~Na!f|Z:1;<鑈y)Mg911sl&Lݑv'^YJyNKL)6}ضZ^"+Lwb'y5g#f)c,$SfmNy}kb"g db:Sp0M>f&aSfN>Hse6i!l ϱ0%_n3A<s,5:ε%g3 Ya37ab1+m90F!͉/q!T n956HĉqCU6m;HyfN%&BwbzV׉90Oyͼ?e3yac/Q`:5Xc3wQfk|y f$w9}*֗6:%pF5Dl/a~@L13h<ՐÌ%a6_tZVNhtFs>[ ٷn_D_"r^oyݺ5~(ݏ%H');_#"ig6HAy36%]ocO%.O 7,w4HRmj5EֹEؾwT?Kc1l i~SJῡ|$_=jC,Rﹾ=t?izf:t!M㉖~I:Kl/1`;B7t*q~J>FIxx;Ӧ=z(5bZPأ iž iQ^7(Ua_0{y[_]!ex8/{UFf͞?k&?|9/1{0:?d[H3Z6~x{Z!~ti?/p V7{x1Z-Kk >ǎO[kigDeiu;۠ˍifF}뚬ǎC} uixPfrK-æƵ(_O5 `N_lccs B 8]O L}]F ~B_Ox!zBĬ'gohjkH>A}T}Cd1%ƿ#sJ 73iuЏg2ҍ^6^qgnLstw~'x;?NqZ;^OL-W1s觖foL-k3u-?V5IUZ\ z学?rϤMjYSXJ_ˣr-9klXHgcqG#ԯU0s͔i 6s91 8?m`^6sf^'a#MJlxb \b(yx(>#<|Tiox! ]M A+13w 5ǭoW[Ai/A+8RjN|O uk:.Ӭ$F4:"Hjʿs篖ٞkzӵZ; fhzJ@c9? i)O~z2_*4?צQ^{YR(G'uycXApϽwc}¯z[g>v! ?NMF?_s\H}?kl\K:'$XX*SFb9:',ɾ>֠~ |8iT?i?ġ sӖ!õn-~y{Ñ~3/ү5i^)3~O?,T'k?aƺxzǴooK:=< ?o30ia)GAvBD{:5=V{T{=~/ =rQzn1{GƣQo(xKsV:g^{?;|a\pBȚ#a3t8|xr|Zb8%Ãmf\> 5m:Eyfck:ѳvVNLD;d3{L'3f3f^ANZ1QZٙ|q[ܚsub c?wjj =_-Jwh3VtFo;S/ЭSc{ii{StY[ekL?ߙ.[^lZ}r7NڦG*߃ šV GЇգG:+udQ[joA.]4F-[z8gR-8Ŵ>p顔7vuaVD;N⾉x!a/ X?jk^8`}OzာXA֗~^< _ X-`&`}ՀOX-``"S^iz_3 ֳ^; k'OX{Ӏ/X7P^݁oDzA  c@g }ۀoX{a ŁwzG€;d0`p | X =?`À]^f ^wkY X}f g@ַ/X/ X_3 E^znӁr@#܀qo1{ދ{ѹxQ"\W=h[Tbh8 )F@Kym@֛g/X_怬 X?(ÁzWoW^,FbYnŻWؿWe/t>b';>^|[S^Œ~uN^|S^9(T>oH~(`ɀ֋Mx@ XX;Y2`}G8˵7 M[{y0 w';_X2 ;k;g[>o@w-Gֻֻ֯X/J~X7`@d{z@'`Y1`}W} Xfހ'ַ wXQ}[;֧_? {ַww ][ַv{ XY?td5o@{;w7no X_^_ze3nc ugJ޿qWO9а{Ni'A<39ެ`g4{|wJG+?|ff1;k8f 6̮|a' f'ݙ6|]CLSz>nݷH\9Gf19≜ÔLsr|EFn? /k_{m"3N})O4({!tZoXg$Gif\t-&1L$~ooI_9bMIz{ ]Lɩ '{ti\::+HgQ>_cfdI/ݓV^b^sl=903LWA'2F+hjITh>Maя)-uS:%6S_[WEP7f b8:3e1 G)Z3oO̩\Һ깍;~ vωS[]>󉩞9MTꝮ::jXrSέSSs51]$lY^WS_r-RTb65%bFʧw1?ϡ"~m6G<*P#}g꫺Yow$*eX==uִ~;]%D?Wt<3)w P?cXšdG}BBYJL[3[c>S3C)l ]?_Ukz' ؽ7f<0C p^y:0NƟ诼,DnVi||b;mbcn'3JJ}f4~sb=nG lubsySb'wVyRj۹ןב'P7''w|'+2:#z{'yTI{i},T8oϨ49'nL23E3SNLrφz{ 1ݼfja jbk[Ge-VAku໾kXh]kWu &Rѡ>JD1Ibgt]]s<m`sQT_nU] DKS9a4Y /)DM͍X5MhmUCM} }j MsD <5jXCR 3Eiď5Gb1aJ-ՉV#0c2Jf %=)\EEu͔3Z֭5/ihSc.Q@s}U<~ƥbqmUCR0g7V*E-k!J$RIIULu0qT!RY;;HØ! I}/@;Ta&PT(8ߦʺb򡺆ƟH&#hjF~ BZH!PXCTDt-36DbMk,/;s>ҶPi/uӵ}7m1ie DUCuϫVC3rUBTWD]kiڸ\5_Ec]Ys:(XT F 4|nSU0IZbMR#h8Zi}Fᰦ"ϸ%R7rɥ}nUSSS٘{v)h+?SC6"%6eJ&Ufl9/*YzhPhucCk9N#Ht]}z^Xn%~1`ݸQ } Z*XLҵ"5c5*&mي|ϺcsfK6 NMp\VhdWܨaYqC5xKC*/~Y8g^#P4/WП.{DȻ@ wjTJĤHΝ{JQ݇:9oC pXx(t9}TۢѳsXp΂#\|ĚEGyk.;bͳXM*H>K (WF4Q bh+FѧNt?<䚇>5g'VQBԏQbJxL1蔖zSU }Vi\V!Oɐ7ԏ}[TF*q]ADdUP_wNcI5GuXCK,+.I3j7-UӏeEeѳb ~ڬdoɄW*[F)fM.wWKg2ۊ}o,UcO?-UolT-hXXUc^|`ẽOL&z$FԳz[*[cZ.製f%*-u Q9*Ol`JMW+gBPL7bx+MTImmNzR]{HU^i<0Mg\zZw2xji~btIVuSzŒUK5f KJ<7EkTYGE͂7)/t@J 4m^V65̝acU\D/i Z<%㚋o5$JxZDlO46z~6)FdUuILWtLAdv~8i)jS/w`RzʐUSJRW؜B(VI.ooVM#M]\ź]=v_tYE˗KEwh6SiYdVRioRj2\D=9TpAiQyxM G[ub߇ #5sҼKko\[URBU3;B\5Ma-iTǥU:g4ntyJUMQ mME˖&ndXU+=KZ}վ+gG[T7k?nP[M }6ak]kh -2n_nNV!j6d:^uNacA:fs},Y벓;1hu[.7\uCƽYO)GƕR<ʩTq)mr- Yu8ɗP>^KkXiRjhiFgX`z'Mbs]k7X%IƖ_.欵hq)uS)yíxm:XI5uiycƷBFى&uƖyqԯꖍ55usXSתij*QYF*-U2V"(W`.T()?lٹKťKʋVDK,_8|YiY4EKY5(zUgqT6W󨊺lE.~li7βlg+>NU0Y~$uŋX\Ix^Y)jSi |[1J .ZE˃ G,Lue7Q)c8hHw>)QjO_GCh:PFtD4=5/1޲Vk!Szcxa]Rj 7єsԩe<))ci#KtICFjKXR/"^!`=yhwuEҎT, -͔ͦm,2Op3sS'5hx]_X]ZqI|g9S5s)74yT+7H6|R]ǻޛ|}Ijiʕuƪ,p*f=,ninjD]år:1PLvB (Z2R}M~5jR j]JHOc2m !F=97d5f\cjgGܩni 3V7$]\ Z6;meZ)]莿.:=Sq:2yӃCH~Ad\Pdz,{Xv4mgEZA30Di-q, 62 N\*?r?PK bBcom/sun/jna/darwin/PK UBd l$(com/sun/jna/darwin/libjnidispatch.jnilib} tTEL2Qf5E]B& "Ea ;\ګh*nTVAC !fAV.jd:cPb!$Uu;wA]ߜss{nwuWWWWWWWwm{wd3M&]^7s| s<]Mqmb߯߯߯߯?617%d|& '߸q#cFFB7w4J dZ-,-! 3݅SO S4J3da C3t~|dZ#F8߸q鳧N8n3bQka7pb@ɴ:xtOZ8YF2n&26шK4U;A$Hأ)\c{y0MOwy<8sf<x6a0GgL(w'ގFz#vxh {x[hM}tI+ńwGmygB\"N Pq fLT8S +Ʋ q<}ĩ3 ƻ' <m3[M7S}?cDYq\oIޔ7ߔbaGf4t7N־4 Zk*8|7' Xy6ċ+x{fŇuc Zؿ߯|ܚ?"1l٫߃jI Y8f"z!u+\ʿ㽔N)fge+x%9=? T *_F2/ժ=6rDzN1O3+jtB,6ite-O%eN+s}ݽYjgo?5jev(6(@Lwҕ^izLo'~%b<,(91V&BlqofV* 0O99 YݷZ*ikF.@l"ćgb2"K~n/+2ZLnd~]Ūb4yGhhX DC#um!B? |=C臢 :.F ^cvw='.8o_\7`LYT̻8Kg wR4F6mb*02VL)xc<1 hGwtk{\~?< Cy}Y07DbwQH2=@tt<~FGh/d$HID'P$H2/:IHƓIB០A(첲L}'DF91-Z k+iq_.foy^08rAҕʧRaHV)߈"1)8BFm$BP!~oJ 3٤!/,RAq+u很9xPo"qA +z혼Rba4 +bܓVGqšQE:1|+ umP)93 | i *vZߙ:OE׋v=ExQE͍j)vUCUBu-Zusk.OXam>V>#gyQ=\1U?c3 J.4mO xqǕ_r%Zy+.c7*~Xq_+x^r&R:FшⱳEb ~q$e)7Z]DoTWc5InZIzδ@19"+A%Ɂ>̺,\g"f)0<mb;o=O@o³WsP^ TcyҰKHE 3ji'D&2/ds. X4|i8.4ӱ%KS#>] Kzlד'o='dc  4QT%!CF7hyILc0":\$S&|+[m.:g"@Ny#w,bI 9;55(I)$ԋc/V`C-\Wės`q990mo|xO=yM1\$E\9Ȑ&/"}h|ǹPm| @SA `3 މC d^Lhե4υ0/jMh*(,yFm1K0)ɩdj5HPhD]sᙤn9衺dS&PT` t{ Csp6=I,\\HSPKx B~_ i3g;+A8N>ޫa@_r|$D::~UMR-޳G@qo(iG?>c~!_ !|nGOy`s+#AZn 5&UM~~\=L6|lW;UlűuCV ] p1Ҿ0%&0]RmuQP \5hV:&V(zWeofץsYj*z-`bıQYf0M?`p (8u֪wN~tWF*ԜBe<#T]+.!=vh@BzaĘ {Pt ύ1֎~,̖bP|O`bZ`tff,1pL]irWYrnNT!m ( Ɇ!=\^]^cM{=} &ʾޏ . 36cRa_#@㐦aoEB'HPV)ND93j>&{SraN~0 5jr]cJu^j ̓OM;kEh=aU-qY,&+љ'= 9䞍86 NV5ލPxWI=6*h*VL:o걪N-I3u@ϣH i(9'?Dt\TM/NaiebY>(sV-PHWCODW DzcM=3=1ŇȱY'O#`E%YT(Y|`.%:o? }:2 7o[o?ionOF~>`2n"9o\8Uw&].QGIPk$7 d]D/ŋ](Z-^9%*GyR9%v>j?LrzMa]h#=PrG@鐕J`m@W|r֛o`X;!_֦# x-"RD9fKiѕ"}-ShKm(qJpFMш`8ئW7`>0[a͘XP19 /;0m`#['p[YBt#xS{"ŜXZ#wck7 (Ec Ev|sg'7i'7iT~?l\<`Sw:X-Om$RQoS j'-: /Rt+pquڔdĖL (-%~(\kYYI?^Wx١9E;EGx@dL хP/tV!G&[ynm|u4Z&<-[#=$094Z&LSH%l +ї׎+ѷW P)RP`*S`*K<Ty JUy:֫TyTY6خxa@ ʻ)7Qx"_09?[)<«(\@RM)eĉ{OV@$cMa POsZ߂spx;(Db_؆kQIPGzreEv_p!Jv)CZSh.n0tGnj_ů9 QWU [M)Y]Q7Bv}ZWu|GPᐃm}kpd48n_h}CH ޅfPa*Z Mdq(!Ȃ"בd!|pyXuBνQ)ۼ~}ezKOm*9Xn_Ś@B Mܛ}5na.4,X%fHdؼ~?,hm' =هqVk#㰝x;YJ-ebUPeћdjlFv+LڰxPM#?|Y(Ѯ #OkYؒ,4KMNp<6~.Q! yY ၳ{=_pujEtsi^i}IdE5h&!s0{qn <+k9!XG8nAO!Y,+Ќ98=U2EHr.j"+x:fDʚN&3z4KĊ?Ѩ /Z8GU8oƒfHƢf 7văZy˻r2J YGgwn[^`3,%~LuaM]h?hOam z ¤{hx~HbvRWDH4:*LG[;?'GG RL 'ͮzL)s{~ʉ/Ԯʩ(^pIC=%_}Vg3~sF`~GSQlFO;c=X9Շ&VUTT%@M8pT=,0%Nij@,G*ZPCD÷cI5ƟMl"5zn`%=^H~<ʔ-Auw3R W/bK!ߕkMFߕ[_HGXvC,WJh=]Q2#&*~-e(#LW篏 09;j<Z?{o&8{c Lc$\AO tP#Z]fίP5>FW@h}QXqK.@Jɱ-WcHX5jFADK@޾bX_Ơӎ (hSlUc庎8 8ȘFt6MVSM;\_N5Z}qiXYˏ 6'ĸ2pT-TZ@Iθ/ԉY]cG5j.E$"1ď1gE[1"s|wDH1-!i8CO"αp"8p|Q!Q~Q8"11 #?UGlz _uMjd()7DgߌmKK8jv8ƕDELH G-Fcb;E slcH+D.kl1p"8WGX%R>!cU${E.uY֍xKE1 u8己p"; /pG08CwXp!x t.Q1oR'iZioFC"ȇK bYѐ" ľFb4^@* ?,h r& ,*r2A6țd" 0Av}C6%JޤiL$4~/ 'hZ\ rIhs:[Y1:r Mpyb,,bg1^s {7"Hv챊C2eUDƀ [@_ٹJCxy4P'/&`r2 ȣbGKK~E,~: ~ m`avtn#jnBv|:E vk62f.42l̜Il:O`WsbO5~5$?< jYd1Ԑiu:%;- tj:6y,"֊9.Y,/*dtSl(/6E'|]@Y`St/v}" l.e<" ߉U`KtqXyѡ75=)^0w|9y=oz/F$KX07,U}bs0WZfVemk#,6U`;^#`7 JK q쬉=?+=***̇7}y(aD,y|G]sЕaXƏ b}_GH]$c_SMhx! &P7R har*2苛pQ*rXJa [Ll-X)>sh+/,kn- xw9h߅A;gc' -%x~#K¯uOӘ`7apbot6 w )=CJ .1m/SU:k1xap81mtyQ终q/5pE8Ki6_Y`+h-6,0(|—QN|ZyR7(U#8ļV aw#~ H_SaȠCȈ*c?֏ ➴0{ݡ"3 EcOz8V+5Տ9+s%sd0WX򖹖2G*Y-"+еn[RnmSeryƜPv813U_WT*]_ƩkGQM )&))~>:9Fd=59I[KAO[L-LT MqMl2%?+uC_ɷeai0Cq(}ZFi\#]$:R'xQZsQB  F2G)iSq5~ȑ-J%g,;::DrD3\d:|hJҕ9yS@h"OgG,3K?fuJA:a LՖ6ęAP GubR$.  Cށn{hn=h1SZ|  Pg&8f}d}<[!3WO  N R`s%@r,.$j>MkKt tΜg߁ E iMn Σtf T\񍄵48۟ L8oc~"yYEC=Ӵv?y `B`(1FSnIvQ ^wzfN.T"t7:7{Mo*ҥcǸ\LKUSD긾4*<`C3yЭiCKh@(s$b?e i!E -?]ﴗBW@N=1(.깂#ù :kΙ6~)!EgȲ~V֛ƿmc`z#~hq #ev?5yE6өeϡk{/3v.jARߍ7VR{}n_.Gq q1Xޚzyob>;yyŕ cbgFfwP<,i]dI7}`TOt+{H' '.\C|II')+x7#bM":Dt}$ qq_SAY\MwBEⳚK#I~NBY$ kx}>EtG)OH:i'p;q* l~wƅ ;}+!8G=G̍?q@;SG*2ȱ,-v֟Niziqew劄6@b[сLw ңz%mvL~Ub"Y޴#k%ca[iƖ!Y9m[-YWDAEL3SXVkBC-h 5 M YERpt r%̲%>-h05b'0TчB|O%oD5{U^YSZe bߟq дBjjeQbf?H\,a%5Cؿ6+vwlI 3в]JlOlpAIV *E>}Zdn_(لV&7 y|/R "^4'y:+)?Lgo?9݃ϢjDA}` ֶ:5א \Uh|LaߵO-lVcD\z:5Yx'Zu]FA|UdyB84 ,g,ҒWc +?߭#̓3il@ײ~uxLDR{4)BhK2{{dé:S.;."eē=Zy($RHLAG18Hn9:J#T˩' {@уHrD_ȴ4G7RNkjr5f" Rt(1J͵1J†)\%רZWIytheXM!āJDIsUte~U[u' pRr\Й):$Z6}$Xf5)L =Fm)-Aղb" I%HYB#.839h, g;Qzڄ3K;$T+_BR:O~3JTHQN%!#tνm!%G1O10_6A!D.IOcH͐?/4񅐐=wQIXES%aA& $nnʙ[𰗋Eo>\@_Yܧ=~MTe?GSPJ`3%KWDdEIt qQiQn##:dA)a+„#8" 1ڃ'wJҡ IJs*!f 3 ;8/u%*N18C$iz* cܟ*?9E>%ŠGnҶ j:?$.~7n?XHy[`/q<^pMk'xA}pʊ-&̂/FNDAA"cYi?^pq9ɮUy&x@}lhIr+ǚ{cDA_:h"|+xxwWT?=#{iݪu"%`wmVu'M$A,)SMz޳㵥8"0ޟ0*!/RcА(SuTs s]]A[I!YU&zXj~g2:kTOx;XnP}藆|kDiMP䂘ILOb^o ׍%|nKf0,ߢۛ_n#L-aQn$K` D9,;|r{НpBͰBȭx NQ&Sł#sbܟ,/\Qd̺Ԥ]U0Qv}˪.z*kp_ Bx2~|\Z@OFTpki0{}N:EdO$E]O+lHJ&N-;KqP $΅DRce%azJ̌lVNi~{='d+vS'kQc@˦@>:eu ` %f^Kr`%~3$'P\<0%0Kڢ" }efXMN7rWD!7Nc;l_+( }zH,! @jMTQQ푛%oeIT,gY"~KA\eL+r3evҴ+PLsP66te D %iD9sX舓Cf6^9s%f4#2~]: "y+VsV7h߄ 3X.W*~bT¬PQ5F31u>T:N1O E Xf7%>f'-4۔ZbzN8m6TFu2(bƞ>M#Mxkg!9gKx#nDYV\: &S }[kZ*/БػDal!C4џ-z|PhV0;c]Kog3fO?|fa > 5)|B7rfrt/:e/l7_9Nf65nt3YoRrSϊ;u>$?$mdb$Yn_NӸ ʣEԗwOz}ZMN9IZ2-'C3'e&C_'τ\jq]MS⸳zN89紎Jaqu2jT& p8r 39 'lO肉 Zr"ea57^ޟ==V.H9߷bd1 u&I"zӝ{.&S<<(`o|: ;z^1agZCg^~P<(2srlL}_nL>\}F&wnWx30Ȣ4c@KR6fٖ]u$ԙ\[Ax2w8*>q,BUֆ89>ᩑMƞj\(p]<ϓ~ <0J5d=* 4/ߋg,u.g>`˽oc`>47I6:9 ,Ipp f9TANwm5jr_hHrWLOs$ONj澋G&%~3“BhsJ;6j,keXw +rdG72?g`9vfp![!nv5T~<ĩ,; ϑF3uQ'El 81O 1aevhQ#F%JK F{6T,!sgM hl,kװ9,Ł"72{7M}6 .9}\4g.P۳.rHl3$66Q1ю?]0"0t>$TS3Gؽz f3|W(HCfܦQ4BMI^.f>SNjGeQp6^G}j5wY\}8q#]6{Ǘ[ 98Bu= /}7YD Khv%^n ޾p~w6# C@i|ZFLltMLDu~3A Uyoݹ0*bc:Ҏ): TM~? 4Uξ[sqp8;o[Fi|V رO;οٱ닒Z/,y12M-_Ma 㳠s#=O?eQ;*^4nȇXxh<_ ]{ciJ[3,]j2vwk|ٖ`d[XBZ}=Ug;5ZؚHp|"JO.K })jfNvY]q5[w+(hDα(m~|=Ͷq?=R t_ 7rIX=Ow<-ҭz<7aѾދ7&ffB^;/fx8OӚaim<86^ߩlϬkI[ؙeX}Gwv65-gr]gwg򗝕+s5> ORF SVOK/,P>X]Ir&׎-Fzl[ 蹞PvPnmƵ-@a'.n?#'MQhGnVn\gb?8Ny|L ie&-a'|a`t灙3( OWA!ҀӤ*? _:aQ >7, V,aU*B׸ %XM\趋=_#Ml0zNKQ4>.\kvf7gY"Dn㥽@)lZ2Q>2]~ %v6r Gaw+yKcI2J'o< +M>o" Il-E'6X!ӅKoS2h%HbQ G@w L8nF!> <}^Ov%RR}:="ԗ:%`郬cmRZZӪ0wq0,e\&y/z:in=cOϣ9RYH0t#?k&lѿ?gl6[#[vԨC;#::0ҫe\9t,3XMhJw)sƩx'?]q_Bf"SJGi%2?CWe[״jVN`6eZhͶ?BadiJ$ GārK/iTۧu)Brke4j;9l/*u=Ce*Eu\HZS CeyZO]AuJ:nnVI"FML`jT^Q:2IȎ~(ʆY4>U!PYv2rC"lCuu\ z9˸0|Ct:T\Lׅ"jh\Sj@!Nk6^I$j8S%Ab5U V= RG[n^Jv2˦̲r{ ćÑvĂ?wg{ Zڡϵvi02 nw5 PukѤu0IBF.$GԮ8KQp~Cb5FɳZ ;m$FD'2-<m!ŗx7v=xDR`X@iFBygTG-@zLE(03i|0aF'9D׽XD?HYh:=@N>|(4_}B5t6ƞ2 &h ^ӣxK3?#s3JaY4o/̶*Veͫ͟;`ckdq c(M" w+Z[F؃3V5O괃O+5[V+''f`HYHhy`Io)\uj ZYQ5|0t^Lj. $UPN0lzpCUς˚u!?y5M{f\43AK?s=>8kr`sLvP*Q:v\ݳ& c2: %XiǻU.DPǾ'vzK,2},k1O%8i{i.SNxx>S6Q&Y}TrZ͊`D3\+7\mhZuyd$X?S 21vPH#:0?)ډp?cN\Sblyyi֘? '/D`_58 mMnkIzfQ]ܩnK F(t EMp]\ŬɾU<,WV+X{}prrȉqW-tïIݴ D1+9Pۏi+p9IxI5MtTV'.[wMi_s,TWa-GWwϚo#ckshU4nGj,JWS>-E}Teogu^ ML ~UZyKqƥG{ޢ8R{4UKvOY\Ũ uT[a ˰,^J% r$8-H*fbVU"oNLW}{bEd4{_£Ml!U*-ySDm\juR%B۔aI܎$WZBkx%IĂn͊TiW/КeQ:%MjעZc5un o!_n3r; ~7s,WͲA/s@ _r@"X";_篬0kXv>G9KyىIZN\)hDe&7 o6G@-iadSg.@CWpdO^U#moyyFk!t] 43߼hmחAC:Jx\N{FoE}(x_yRz&cWx|͒wiV3J<8p$y"-&H(K8iIw3m ]S:Wr_bVZF^@:~ k3a6iY}G%Uʫ>N/-هf2<1H&OK*L+MW\+v\ NF ڐ1y!Iڢyf'ѐ Jz6ӏY `V-$Z H%si5}jଅw"E@|-'Y)޼b)kA;4YT.z?#G=9_dƼ2A!Ȧ.MMVej ܯ&kvŹЫjx*cnI"hj 9#j< {!NOTn&sj38{XgveNXk%ghJ`F&VH(څCQFIAy֢7 ݧTkI=iY{|$ol j stYOA/EuX-sUI9u9iff3%o|lhkmJi,j$^ˀ,{Mg[@+y+*K+p߄\.;gP=}Y~Ҧ{x_9e4@*X ~1TF8 ('@%j5" &Fre*W QU 6/j.W+SZih E@$j3QibCk Y{SO!b;*:iV!u!BV6ΰ@Qi`CM6,]c$h0hlsMhJdv;ۯ$GЉ־K/p[.f$ZA!9;EUOycn]{hGXEV>% `~arìfmKJsyD[VJ( +Zl[^UE+I+W _^~?^>p1GJAB Oپc1y3Zd$TT* -i; 'Ăc{Z9a1$XZv+óiK{*]n$;Ģ>(Qoi<*kU\4݈IXa Jwj&q5V!)P0`/Hp[qF۔6P1G_Bt-e.7tU6n"{{ [\'->p ҝk%!iERmltrBi |ם>\E[ԕ2S}фH[jЍ \W"\!V$2 aI c_iAlMdj3g;4,l­|@PZ'p-pЗdADT2Sx@˛jѮȎ8%U _} /ޣA)J&UG8elk3)nc6Le ~nn#@6@F e)o<M@@r6r1R U'}>Pwgg'bo>@nQnQ>Zhl6zn5V"5EV5%DGd]"V)}^WPk2den_kH`$z _z,>tiR{rpnH_zK}Q١Q芦Yf?Iܮ8Q9<1ܞwEgrH!-җCڰ=$q -Psa5wїu;ǃ e$+1jC3!SDmhNُg5 uj:f6 ئЈY_}^LX+9q!P4TĢ( ꊟbW3>N'KwiGWnA5}5n]*Lcg@d2s.h 09v\@|Z9مws=M&UںKIlXTTiuP8,Nn6}h$iO!Iw-A<~KxN0+sONeza#㽜nFw49Nލr %ǮBXr*BCۆ#!cǀн<0Ϫm튣brǕJsЛ&nhe1W~]vhJ5:3s V(_},!p~`AGF?3uf`!*5쟊\t[6ĄȺjxlUG̞qIߪc$fnQ<@2] RKgύ`2PP7hK1^ 8ģK/ADz?L:<AIfL>u)Æ Oy3yL5iOQX86c ;%:3e wLOAB&ؐi&M?mPϣs&L*pO14xk)M1a{R©ӧ@{';'=:qݖ2yi{FʄI nO᤮Ξ:ѐ43)I^C{2 :}vȟx=~ Ϝ@7Ѝtd@5}xԙN7u#ѡ{@GUmwnu,A" d`5@IyɄFcAa%SE| (',3Ƃ>]έ3IZZ}D(gI+K逿y%C3=9QhͬpfrU SIyQI;W@fHRjш51G 5#SVVJ*4^9[\V^Ql}"#DT4:MӜ=|V (wUPR'I6בT&I:5BVVtV nR4gMBdž,큆Rje#u]jt7?V6Gx+*),&{[ΨX9F/2|gcb~sg&jݤ{uNkI️¢[YRHQ]u)^oa4Tw_C$bDc)õFxeM#H弶>dLMy1hu, E: Mxk KaCC.86BlǘfTWc!%O9(jh4&F3d ,)¹^9,p}\\RJ<9Kp]2S$JeUIeAьRoڒǁ$_'MVaBzNN-+<`&Z@o|eIU!J`,.8ЫAX?N)\e5䛠xa :_\Y5lV caUU!ͱ*j$9(%IX%ޚJX˛͑t1f7$C=9KD#;UTXu. Z]s?Ajʡeus&Tfqٓ'tp6f4zl1_&芢 з%M'$OIY(3SkWjX˅:/m# z쬼 Kq3AzyUWjmZUcq[:\J/6.)#dECf^Q6$-}XQɐLi蠴Aiz窴mi WyI#gT fg CFO/M=F6{T.1ؽ#s7ǒWxA0| kTE̒rs \>"5e/lAMAfT ;c7:@ 0BRG[,(9E@V(@@X CcsAQvhp]QQVYQ]#0~=:uZLW$oPDAZ1G2 ;"hHK5zhBaA2Hb?d F-|;YDZ7()BTzIe)b 9HsGi4AAKKaLhA {\NL-]`GI-lA# 11zdN~d VMf/ FQ(-SP0Ax"$&[-)i:UU;W* XU W)ʪiI6yr`9g10mD8:A8Hǐ-# >C44!#b cF@D@a12 Sfz][eF<i%b?ͬI%U=iJ_3VdxƖSS -%AIyªPX<%0'H2(}nXcWR=#L*/*6xυrǙ/䧳MExz4+2{p ' Jr<*R,@G e#K< t㥉"/H%yKcKTeIn&9lO%yp?~~.ISwI1$2FuH@Ivӄ*q{#w\bޭrO}%>2"cQ>"(LY _Ɲ Qq|q c`xpvF4eഗQe!u=QP7,!.~'!pg",/6p8OoGplG2$xpxԉp{X^'K e? ?TQ/mDG Cy7ǀY{>tY|8A1ipmvo!=rx~`pHxoMxV6 ܥ}L˄p e6Mm&}_[Dx!߈pPo",98\ IxE(WapBdڽtׂz@2_'P2᯼Bnݩ I۴&I^-~!4ZJR7^*IiQ&JŸv$o_y$]#ɀKTr =>@ Ÿ^odo⯔F 8X!C>ן#I7 4IZ W? oɕ-O=_*iP/ W .SŸٿS#I#?/T$ IR*įeTwF |fw_[ u-s!?_Wl =tXtA -_-I˅O&/YO~=ݒ4BkGHuZC_/K$)᯼ AB4 IzO?kO%)(%DO{URY/d<ŸS@EI+xf<%_7Iڢ WkKү}`7qx=?%g ?~[Nqx{}'W?C~ܛ=yޢ k$O8Qzyz.&-_e3]%_ o8^^S$iȰY:%co+I?^tAo{N|p~<*.6ޜ JiUI gMx1usFye7Ut$#1X j ;3zzI-5e|!w"0/S1\Թc,r#]ͷwɷvA7 ŨMQ}c|\Zt҂q:Bt q4!ytfNꚑ:nF.G\ V=O.l:K TFר,@=V5P!߳"S,JH#+)FG>bDj1b7UC.E jn YYYXЗ` ~kv5՜IL&,0}*ħZs?<1cf&|=ʈ  dn,0R&?=p"3_,/=4qp c5f"BnEX˰f)"f B̈xW70Ot'O, KT{qUZ4m3ZUMԯM IWx\6D*()xS2%P<'83Z2-+/Q6/)%ʹe SYYaQɗ"f=5df9[2G,ޭq[~[CfA˵"VTKWPEX|s` 9(γAY\VQ\KUaqŃg K1vĮ_ׯu~]_ׯOGKl4Rh' 'L 5VqawUP NfW/ |`-_:M?}5鄥gMbw)l4^ g7G$V4~vpݥ#lf`zJ㰆_DՔϞQ^\@ZVmX\R~lR*ea0m]3]Nl@ӷa7ϝYl/6Uz"%aجo)pAŽ% ~Z6m0‘zgu&3Z0qR+*QV8UoY(+Bo9l_)ܱ|7UW[V~F++(7V~şY_P's&D== Q2ID͜q3І[4}!Fb{Rgfk#mSeplj^ꐒUmtm~ά__HnCmюvHK6q;㦪ª`1AZ`aQ=8[ߩf)/=G=]S]5NjШAе̸Iu~]_ׯ'rO5ΞPpCrnO=&o \dOR1٣v+<ʧn{-=jl[O}8?ͭltWH@V |ղ[uϲm,qۼ)jwމʸ%e}zct70cRz#P9H A=( ;WpY8UOke38q(WnKH} {P r`#=+q5ZDԜt8(N%{ȁ5Zϲ๔3?cag;ٙεxA'Nb͍}CU7F]P*-e_e[sCê!" @迉x{ln2Ns$ YsS?.hXhQzfFBש/mhX!N.P*\:8uK4jԠPwe;Os9zq5D:vz`q5_r[t3GGآ8HVpCܟ0G_יUh.hcZ`1 'fY`2ÞdM 1U ) Hi :?Nc Ow/zWh}-g$2(\᠃Ϲ+wGrѕ8ur"gwbt+p$U [e)zF]O}VqI Jcڿ'X #jmC ϥ@d_h'+;|/Gdd_B¢V'larލH,H*dH("^{/ }z)c,O_'ς>)ǹj}ǥ/MynH}K_pXε=2q419sW1BGh9z@CڛLpЬ&Hi` c_x_(Xzj*&XG<|G/hòbwxqs(}K/Sr.Yh0ﲆʣ(mneGy?۹jgaRvBs_Cp67 S(Oy,ΥC&U~ Z{IS܁/ I<{(=] 1 pMstVcF >,C]?{3Vk?(&P=pHF}T~$S y/y±\_ƭ=4;WJvd7}{`s-se QZU=xe't < orzkO&0=5asN9cqo@kOk  Yv"_C'v_ ߎ+=\wo0v}'&E aoBf{2_xk//u෸_U{A-Khy:Py(I]+ٓΞ"ScjX15P8Ո[iu D*arf{[Ԙ<:17jNJ,LZ^,nuטSbg^vN$G=M[oJp3N2 Mnv9>gļ~7-V\0>a~D `5D24v-oȾ14X[BI`G?!#@kޛp:y DbJMفSp7X=_S(_ጐѱm96M2qw-ʞ T&ojUm]_ji/Gي}sw0wGPE3>z5nTzkZ#/4G_Nk6Wِlzd9}GͣPQ\!mTnoU]ϖi>= z7x0 oM[@7ο1W o:R]obel5Tq7}kW'Q)AU/ 607ss |G&5$8݁m meKirKkV{JޛP ECjNoT] T PHCpDIobSvcfۨ5!PH iZ|ˡ^nr6Rq}YxJ&IT*oR1 )`15K@I.উgH 4t^>O@'ۧ{rp\*h.ewz;zŴy؅\Vd-=(Zqֺ.1}ñ}?e=3$ƺvq* U/OtS8r2^T}?XuoelBwTC#^o|@}{>Jܻj7q <i{h9"VO?L{Mp[LZ\z_Q2RVbS42EFq@gA1)y(jR|QȘ:h0M o5F9)}Z%Zyrd[eQ|(8NH1S</(2Ǡ)޵!åfHu2S\*Q|k8U8]/oX:nl8i gvt> >qG3#:cl 'Kؔ&F'_گTpyxZgiGt&yy{a5Z^1k2%_#O Sc eqhZǡ|š)ZZΡzCzCs8t?\ཇ۟fzm&F=k 9tZ8T̡jkn3 NϡCϡxġy9ġJƐ,iY2AV kx3t*{M_"~p84J>1E.@FЍ zShF3hS}GP*Nx@ ԇAYLA83TPI/^[eY4 Ao1k]'@"19 4 ~v;JT==]ΠsgAi zAJdp3!@stg'F}ɠS^!OF#hbtJE ʡMFA A OT͠R$ځ)dō$qLd_ S:AxY";|>%A?&P P>>f,ae h2tG%LŸ@O=?Q7pAA;b}exso9+C2*ȽHp9$E!ռu;ig$,a&gWOw>Չ||kw uֽFKF2[iq+nxJ!$bH0tZ6e[0?Eڊ&}V~<з ޺ 1NH0 kq U8}Z (He J94ـfR(|5_(=k;MF I=$khK~]xiOX̮jgaɭ$BL-*'ΨۙgjV5+۲wxIԮ&*J.k_ꔦ`bزy M|SijŲ?ag#~VV+?0SS ckk Z`xk^P@HkO k Ŀbц'4k3Φ]!ݜqݺq.D܁~D=܁,xD,g݈gtpKPwQ(5oyk[jnx'- i6 {8jf+q/%<0%5{|R2);Kn Yɵ<<&ߌM)ܚ^h}Z `q-㶎5p{f9:ʒRDZbUtL8+~[\Ûۘ{8O0N!s ~!=i{T?ՑW5[O "eVP m~oU@$5Mp⸄5t}//GMˡy,I㍀?9^Ag =7[_IF'/<+(s6L^66Ru4Rk' >G'@D&q$ }(GD*D&S /0G뾊Hvf3Ւmp= *RIRP=斤P3I;K =X &< چZ,r 1Qy|C Qx}q4u]U$; ~<.ݑ?j0ߦ3Y3.IV9_yEq|(@DB 9]ƒi"Ә x_AnT ]rPߺt=lBsnty y_؇y\ $i֥Kie~9SԋգF_8nbE ݎ=0]# y.>?nߙ>d #~zAEVV BcTTavL ,KiWWR)mD+avm Ņo"ڶn ۑv[7" i(-)hA]C" =b軣vf ӹ)+R -inG;=8JfkO\EwN{-{6,v3 Lj;([uz4`ͩiK$cӒ%4v}5*{s[BكFI/ӻc?ljG7קK£Wjd$:cN܏=j5{?ite;hruߩaOS!hrd@x$}Wi}ZoĆ VEf$$3;Z Gn Ka;6):HEҤB?'ld,@/]h.$Ӯ;]S[a%4&v^Ⱦ̧ۚ\ Tl{i*1aߩ˼pF T!E!:[ p~rwG֌]]h#k]AuiB8r{J M 'مf}D^湄yx; l*-`t-?\ƠlQghoη(=*34(#Aq-v,_VkvINLrwF bo-+6í[< I%BxĸBPӅ˥:v[v`l4h"LF ;@"%@ %AP4gxTK>20j?J.րӍ\*[X]S4xRa!/ |.<>qF ^ԅl[jY gQ$54];i/1*!=yf9&doT!KW HCV!.4ҀB~U4хNE9mr`5D )kgB^l77k}B ăV!x.](Bi}u!*QLO -v!"xDS2<&ξ^Q|LoeBN ysS5D7ZV҅}Uȿ.dw ~V<@Bx*v!,xgj=u+ĪfJ;(a5 j"1(Ҙbb~AmXD1L8_#7`yLx0H$kVғpvńWh0 ?.d! &ʄ'1'„SСٛ}Bl5 B 1a?LM#kV0L+ak ӘA&h#ĄF֭tEO/FxdΏ0_g&F>>^g3F(jgn&|^^+L8Y# '1U=6L& l ,NFτi Wxpɓ۽R˄sQo%| ? L _ߗ~ aaDp#P?Q/3" HSP̄9ae-uVL&Lp>`za<T/W%L5d*,&0ΰ>DŽj# PY kB#5Xǥʄ/s0G#kh6ޘV.+58@8_PgFr+d\̜MdGLGxfwWbp-A-8ӝ"Im*2$_SSޢZ؀t7]6x@=&`i=NoE+R}}n3@\`0Fdi1`wZ_R ]ۂ2a4!Rwac?9ψ%A6> v]ll 08x7dDe=-o\K]W.<WX7z|lE8Si;]SyK%o/QuL3Eu%g+cb%# s%9Z"SEL"oq޽ލ}J ߽mҏ&]4,ɛGV=jNH#'ğ솘z)+f+'f.XǷ4Ec+sAlk.x5@t#G'-V%آ&t3ȼz-. )6~KP8 < ܆:楪^f#bu^mpPh ߅q\W*\l&e#ace;8 w`Yj VXYiR 9&9f6^jhz&ݔK_=ΏG4<%rO4.* OAo7RX|2# :P.b![ThrKME[׽M1ėޕX*h:_EhQ?\јmr=u ʿ`k4ǀ9} 0ȓV9h\HS 9;iWHX [<=g& C$I ,K {٤'{徎ε{2 |ƫM<na7%&;4;KMN;NĨvY|+;1k·'A1> _5¯,48mޫ9թ}B0{#On07}ɭ&mh}T?X?x= e5 E-a M$.HwE[OAH{=m;Q>(ϯ5.{ڝ$Fr  %:Q\0÷O}7 y?^:vB@kv.5W2dm[Ő\n =Jߡ]Dd0Apce/s8]'tҫ"e!od4߽X^bbNʐ:/>xoqs!Ù gmw .I&R.I$$LԿаֽ3kz`$~OaXE2꨽I[6 g;IcZ:lo;<ʇ.+ڼ|CkoHݮ==n.w̓-l;:`P섣P>μOdlr1^4 4up@'6$Re5zl/ >aNz|^^u ]>ݱ|<#\>~rqG-(h:?V9HZ!oFBy1S0qOyA:=NMAȆ@sQN$e \xZ% zy_h NqL'YLTx@Zw a5Qc@yL8o),묻7j0`sXIMˍ8R uDƺ3w^CTS{ԙWۗ~xo6ielKHДu~יt\p=z*\tumf栥3sֽMK1Sʁz0+Q.({_%Kw.ztK=E9~ Rݥx^W n'3Q)jNo KvJ\R)AË#?IEӶKWfi쬛0A4V#b;zoѐ4hOV;EbإL0 Y'?a=k[ʭjg8RoN85:imߡz(G~Nbܱ<+pgx獲hApW#NJ!ZNRpz"K+V`_%z4]b! 6-ۡw)'>;0FǹO%SwO%-"٫1Y{??Ҹ!6a)vY PCX7N/D~j; JӔ maSz Fҷ_Jc}4p 9Gf7|7({Lm@S{8=2 E&vA3j/^u 4E#4kD}42&xqi BDώvRڡ :H 0.>&7=FTLlqʌGV= ڇ+6O-{6VT<N}zU)JSVZ$)!}}=ן!%ßYY&ۭPB4gI:g&+F*E$ru gRƅ82֤-xx6]6wNk!앢z}$Ofj@^ 'Ü{0Wz5V/{%OH+x$ve6YvR2tFRݲBhuPq'&Zp5T[iqm,O}'ZC4RkN9Λl}@%ΤX- IHtXw^Wҷx#١ z ۭ 7{oWNCٕ+7ոOD J6a;(x0p}K,w`)®~IT?M8Fa|]Hh\p%EöJR;ܫ8]tV0C/Z ~O R0Q3}҄MoLﳜ6`15X$|-.8oX@pkK(u|~tީ>F%0]WZZj7Qr!|kj7rnbxN9}fAZW^e3$ 10QU"j8pRab,逖ud;R/:Ƣ1@ʿ%ѮRc(!<uՖG1s4_st** Q}2O@ Xo A,*cYОߨ57Mgo=וɎқ>)v8Kѷ?쬛A5ύS\ǡf Yɂs`Zr:`K'qtZ eN '֪NcXwi $y2qL69MM0 ~)DZ `5:tmD¤uL,!9W0Mo*r,1]'Ҕ:iE=]4ԾmKT5gyq oӘJn/2DNҖTzI 6-6j|8}t=xVƤ<|٣gԯ|Rrt#=&X79V?I %!Jh(hIY۟\xl: A]l) .lT4, TuQJfD-QQETO#j"1(y=*R*e0޷eM1Ȧnj2+NNe!M1&pLMno?ǝ iVp=%I, .CMwsެ?QKr|,\GŠ=DoS#e`ܱ<n+MlQ[S(~/JU| [(~Ͻx$NlYfvb|NvmqݾcgoDH.-9OM7m+e]p3b"σozu1lcY[k[Oqܬ sb4X.s 1ٝ(#ҐM ~yCToxsa綹HPE-kxh~;l;m)SCXoIϿU>m̱\!5ZnEeL;Pn Skx6 K(Ƶ"(e'+"9@ՒC༥PJߏG-v+5nl=GSdծ8cS8*UlD?5ec춱_?TIƕѼ偿ћ'=-0C#s;s݁p x q'o4h5X𫱖>]κ5.\⩏\h/od_{[l׵9_RQ %4tp!RoІGh |Y:Mksf5xa-sI>G&7 qo݁Z>?}(]NִsM6' Tn@:|ixA|؇ģ؃Mb0~|-  1(۷ :(RHiX:J2vSo"ͪ݁)7|++nQxG;H W lhrpVG}N=neRK\TԸS!η5z*Zk}G 1Z˷1llmVj`7)ޥb󔼄&i*eJ)yjI|zCWM4;Ԡ^B|( -nr%!/4'6>uWDOM Uz)볕fcꮃg.fmVZC,8jSLj 2ɏwgnVxҒ=vw=?>}Osz lq+Ssjp+rn&i~oQ< $ƕMw_nSI;pkZ=E ki]ݿ<$_gS6ss v>`FZb7blĮVL^g|ZE6j4W jAr##8,n_ B 0l@whN8U6~t#1sܙ_z{J$IoƵ?v~=d:W,6_a[ܥ Ӣ3pt|>s·%na9n"Rpq厚YڳFJld= (<#a*)=hI$wa T60) }8ӓݙM8t+s|'fn=.xExO䆆o`_͞hثK~fc;ByYN}S,Mq\ȑ5!G`FrYٴ&a\A"$bfohE{ِ ys[jvxJ̸@W0%=V!(=SY r 2t5綯-NN@%n;YlJVK(IŝG%H[C#eRa c'@>5uuB/9=MY}7e%][jؠ$YwY@.xB7GO l9BSä ~X`봋a[|nZ(ݰoIy;Q\%vlv=U)?oNvϿf;s&p-Wٜl>·5IXuБWXeF|Q tfR2֗wf,ԭ̑eNYmOuTi+EI#qJ̅$c'B'd'7BS;1^bTݎS urjlx278d!g NYZ;agrAM圅S'05X= Ӓ=( *ķ1;v.~\4aR\54(;0hPaQiM+!nT 6#RYY0((c/#RIk˖mVffeT֗-Hk"Cwνyq_>{=s='s"pVl5FR8us6Q`96w5hm6u8Yܞ>v[<ΐEռ}h =#'maCV'CŤh̘ӒOQW=ĵuԟP16\4l9mVVW?f&69 DKruG{xLĒ^Í?}8Ϸ~H:ޟ%t^&"ݽXSď TՈqbS#ҹ:LwϦV-sozvgJp#ʕ@y<:%cz{Zв?~wӍt/yq3yNlcWgw=z7.[Agm +wq X!t=yw#Xr%_ Q?mlDȍڌ{m^3H ߉yh,~؏!ScӅu h|^ d*Oָal\1ps4ǸkG @&;^<keDk6::lƋ9QA"Ky4*7*CP>*_k\rz1 ؆t\/2=gxSvgƜ^h0Pf$}~ ͖@'%")V"v?JyZ6C^:+ْ_-{ٳ|k y<}q𰣋#soj 7[$\~t`#~ !uYN\Y8f ¡i紇Y<Ш hlOe7꯱b.?J!fN)ϨےXlQ@˷p|;g[w8Tg{\ 9pD mì0ش&6ݘ 인űq%>٭nǸW+0NT_Wkt`*qUk'<$ C֋W@RƏzl2wH`}țqqѡkxo> 4f&XWSW|hYov[%Y0+v4tfXZ^;}FTOĸ# nL9΍qo0j蚊|Tl1+~iz`YZéܟ*J%DB߃c1X~giu6䙠o\5P5$ӷ<$N׷ӷ`hޯo,\ !(3[^m:&aG.Qo~ތށA#YvjdͽwM{+㺽*13Sx5qQ0jp:#4gf>Mv[b" Х, Dޗl?5Vz~e9f4NCWn\&@lw'Q?ݖ y" YB3 m{A_vπIM~6K뚀lևWuck/E۠|Qrh5wJU[Nϵ|D'Ҿ9vݷm/e+bu'le \(n@9z8Hڲ)TV2?1o#oQ=9h4? wJ44]4FU=qAd~zw-ϟ!؂? sk?/OMGċdXoll3z(֏qT</ĹN=| _y ֆ^Kv Ot-3ifLz_OR*7ԝ%/< .^> }A<@اB&Wo"\ 3YqJ(ƒɜtwhb|c8krs!1wE70 ?tسvX D 8;QDz~~6,Ɓs_׼nj{Q l_|*Ɔ_ bcT .-ÈY =MN={ 40@6[ŵ7c(j\{4\ޯ_W, hQw1Q+ +{^|mZ0 hr\\\׎o5'\1ݦ:+&wBYm נMt7\cIɈjv_!!І)^ȭ?rhndMsv!VK@hY_t5o_*~-k 0 [o\!?~?WcTC뺞fcK_t##7 J([B84 k+T4!wb![{LVO_!?`/lЁ|_*TI9oD!BOeDY= z1.Swф0v)G hJH|J)J+L1%Tx Фvs9D@2 |1JJs/z??E|=zTϯsu("=X{kğ򱈎X~u~G,@L>flxf8xĕ`.z'yg)Ze78?lqg;h̞@ _`ί@CH+wr_kkJbf(b}d}#k:o)3PFd:ؓɃGn X+{QOUy^ynx.q5 @Ǎ=6'C/ZqJJpŝXr(0oa Qk}4b@p9֛/.<ޟ%B:=c|VwES?4YJ\.^9Q9_Ӣ[̌> z>> (i:3g 5 t:ό?o5NZmן~aTF[=+č[Q f;eW2xX ߰ 5ðCܸٽh#O(|BSD#}zM:Q_1$}PG\NSoÌ OXqڡoƆpێ]guvKfӾu-]:;~>uv}6ww] \(nhT\)jc؎:7ƛ!,ϰ򇮾(O/)SZ ) b1丼aPd? q$.-Ή'~}&.o`ݓv/ձ{4y̯7=ΆF٩.5C/h)fw!}gi=w*{Hk{<',=oWm' {.{fwwVcfY;R jkSmWDN=~??6>7,ܛ%xO;b, 6^oR܎)1|=]h-fpp[0&pg>ST{4~*Гb5Xgxw=n-Y{,-=ƹ^tk=UGOڇx2sF3cww˲iìsb׫ ggkbv/s=ءn\4[qW}ƴse7!|ٞ{A=`8TS{2wq/z !SHo{tb닸_~{XɡۇY_oL9shWD|k-q{?uϊ2(JqA~߉K!ϊO;#4opcÍ8Kz /6"!OZ%s$, O~;s}%u_Mwݙ%6σm9^u8ٕ93Kc6b&j)9PWn|-36 6j'#/')@>iˡ57su h\$߷ؐ:mYO*X(Ω#$a%P<~r/z,}nX W4Sbqr h5X]qqk{5>SݛS7uԏd`δpNr`A q2 @ 砏ɿ0m\,>!ǔ~ֽb] c9 'W0+?DISߊ-F3\t%8ƪI< nũ;ކyi\16-Rn9NkYo0е}wra؉J>ю뗸 uˏx@轾_ahXXxW9b=+f 俭cHJ~ƒiރQ8g|.G㔝x=ןl.6U߂ ]os,~oʛcNF >qu\pSdR7[R,YHQsƌD"ȁㄜҠ:{$ ZT Dk}nmϏ5;{^GUΑ2Z:㿜C+A,V} /uWEYq{dj%vɆ!%n [K*}>3ꩆ0I7e{fh[&=xYa1[(Tn c~{']wX܎O< g=?%x-Wh"CgzMqp/lDA2^/KtI%Vʽ7{D3;̽,1 xiqGZs {zuY3iDw= B&zylϮ|qk?rgq$rHlq6wFoƇ-;NҸ>yN[7;?2<̤g.=ӳܒ&߶fu<8-t:eƗ/}\ u[Ir>Rb1Vyqb^/1g%¯-.~srw~\>U8.Oc&+=e3Z k3o߹w|[VjkKo}:J?@ϩ..\XQ`qiuiAmIIqɾ=P`ByA ՕՈ?⦢2c7 ̲SETS[UUYm/.f,xaAyZ̺*{YeVPqTP^^YX`/6M3ث*ʢΪ*.^\Y\b`̴Ir`^i*.Ƹ^[] }/*q) ]wӌreu`fgh lGYJedf晪 P<1| Ï(`.Õd+QOԼF En%h!arYSU . Z{M,51鶤[o[pKr$sIm'ޜ8⛋YRBbBQΘ)Y\]\R6d>FxTUNMRCQ(T+fPzBoWMǮ@/w.wdʰ++ˋ *>| < r%r2/92XЙoJ& ax!} Ƨ`(   A,E2;U2'(&+" t$a;A1\bJDsr 9j0(B ETUee0jh~ A"nKϏ䲰YYS&=|P <﬒ߠ)҃ v|:uUz3 ?z0j2 b@F i<ɇ<z% x"PVh+S*Su%mVFԯ w8kأcj jOPo*~c%޳w+1L|i~BO~N-,'~c!qWoMx.Kn{x$|)h6[w1?%q~|%_V2CHQiKps!NB: 24 , R4xgx7i _b:o>8)^fFWB/fFhS ? 1b}k Z[&~IZ?@0$Nfͣ~ 7 7_F?3q |7~w~7 yagD^H?o~z0^v~lIj뿌~d7F7?:3? 3~?K5 nel'~p-|t$; 7x͚\v-C*gWp"gI5Tݹ Sw5!aZ3^ɧx#iŋQxى7 ?u džUBd__. .m fz\n/7,t_ 3.]Ay)"E!̈́Q _1xG!^3ӶgfdoVǪwmk!NO~Fo]@x9f 0.=^4F7x|~Itj|V>n_zakx6>-PN փOSo_~HӚat|b8GM!,_n}Aě鋇azSsAOĉn@D tu܍n%]䶓{.rOkKn>֑@nFrcnG$$kn'8֑$wMn$m䶒I&>rȍ&7\&k&7\ 9#7ܝ䶑[En;vMn/}2Zuj k\/ߤ^D?<Áwq }}}?On"frSɵCV[G3? Hp3$&h<|猀.*sV`Lp7\ )wYcGSic؛FM(I >#P^L0mAndC0?C  nS n BpwhoD_za^__ƒEqӯ Rݚ1[k a 7%VkH@,]g6֠K?0"M&ίFZ̯*zCPnNZCVFHXC²5#$c-,4jӊ5iE@]3z`AI͠ fXBL!Ӏ(6~`UfPZk5|VhO ބh!?ڀȏ6`+ ،h#?oH _e'*IΎo;G{o ߲[CIy^E~X+0ڀGˣcg"u(A.e^@(^y~e8A].OU/&;all~<|z`)~P2/.F^%2vg3}L42ьJ]yØ\'5;' K> k WDR+Bj4+*ݢra,GIm/aR* yX.X|vŅU˹'-^7omwčpYsQrR_~Erŵ:Qo( rJB3RS!^]T[].j^2Y^\2\V`@uAQ nub-IokqCBADSĢ^=yyru&"聆G ?_$)WUVX' j & ꛅ):)/Fi+>p!=/G;/pVrÙh<_Y՛ /O;\ e6///#-7MkbVNe|DZEˋWU牲]F2+iQ^0Tӊ•,h("qV^ rXIx@\ b)Ne]  jj w$u`7sFJyygLNhW:V₅8_fT2HT-CZw%]J»^D>y8q5p^o䥃"dyR1_HgnSL↬:s5\lj>rE/$O /icz{y":vrytyP^(A/CY-~ ȧyvL꒡:"l/Pp B&|Udh|sl=ɜΒCLcb>;d0G\o+"r)~dp7 tpǃ;8p;\+17 R$Yw yo7pE׽ .RX2_epEn n:nx n~\n F* \n n.S]v\wn nn  |܍I*4pUpqu'Upjඩnq_&m*qAOUpfjvTJj?Z:.;۫SUw w }ϕt}QeyϾt{M=7NrQ9WW?^?HF2Wߡ)UV7&>\_?UgT/!(/Vv?CUGb߈vd-g K?Hu;A5xD*KΆ\զU_y}ƺruDJ {k؆2z;u?B`Wt6 _G/O}XV~^W` P`SI8HH/ /*6<2z$4#df<'躀:'rM"lrNlVsWo桝 %B21q_j36qL(-w q1v<|ߏzϨa,Hhwla Qǝ-7w\nHHvߌ9 Weƛ.[ypQ^Z.]мC:[.x@))*z5\w&;؇1w3h1_7JT7ZI<YhNj5S:12N:eϻ?𞐕c'9~s۔:>6}l\P϶ [ՎD}E4/2)pxx 8@vflƈyȢY%y oXI7CoU]y nc͐{pu "*|kXWw6z? {ޛK{G{9=p=W1p6?l6+|Cw;GGNSҚԜ˿Փ^7thC^Gi߇BG4%}&cR8Ґ\@_>M}՗b}%iauq4`cHO&kX.37ǻAKZW%lv?=xvD ?h|_cYOV|αTc"ʤd뽋ŚSLܰoM̂s`:G2=/@w==)MHiCݩYFqGjv`8t) WN3ps}m߼qLψ}?0Wʍ l (Wݬ K}a:7xfV]y:{!Xjl4J9^/ cq|m@6áOS]r|_0sNs3Y޷7':)>;}^i'4ǠHW@FZ`:of.u3;g˙"gÿ)m;m}5Pb}EO O3W;~;2\:B=s\Ե'}Y _пx~s]a:Ɲ`ܹ 5|Sq3pt !86a9]Lnu0HU<ʯj=DoÜ2dEa1ɋ.>%8ҙImf]}+|\QvoL=q 7 1?:얍<63* [h?K^EǯLZ {<|۳7>}'lP>[|93_|i϶Ag+sV>n5 IaƻBI*Է^?m{}J}60zk!;906աRsˡ,8mXþڏ9\k 0 ;A]B5 q$Ϟ>ڎqm{x|/5i^Ǐ^vi`*Km証 9_2jZY'u*Qx9&yt~J\C}/ oOA`yr!}6܂ᾴn~pmqI#n܏i娤3{[ :)Q>_k~Z@@kcpء9nჇΡY{hr H|]}E#z?>v IW}/jׄVIc?iIF^yÆx߀STdtGQ*Os"}*.of:xrKl o:,6,_L (@.vz<WmJXFs6[޶tS8y;.Ѭ TV Ɯ#VG _ۀb+GI{W|FD~0W@&EXWr[tt{, +5I_~u$ߟL]I9< ?7t=jHwt< H(KFZr{J!. !mi}mUs*ry G2|ct޴`1; 6|jݐ=r"Ztk@;>.Ǔ P->Rx*vtz>Ofy=!ԧ38$u:Џ;#|#G#_} *JYXx>țMСg˗*?`[TwB#Tn* naa}!_ޯIߘ[% >~,!au>緟@Yԇcԇ]ׇW@ S]^3my 쒃Y}py}δN[yO<8Ux2ycIYፑ|f䨃zvXس?[ loo}tUCێHtmmw0f[Yۺc7?#ЏU$GJyD8n5 D9s^cN=WK8S].#ڟ_lzGea r3雤y ƹ\y%"b1cn{4{~5ʑ} Α!ҘV9|_V@̛wJ4^|ܲ\HsY|tSu?dsy|gSuҫqm0VV$ŨӰ qI:5,~Gx5+Aְt] >o|E/{Q?_wp8ߟMmnc{dΗ7maۛa8g qkV|P֟MGm'ԓQ` GQ`>m~֌~Lel#mpk=A:o '9No'*/'R+"|KfqqCt9{roЃȷʫԏ0 8on>\ȫyDx5Xau0~[[㖪 n zmURmܠ=D ƭS݈:Tp7ImxQWh߳NcV3[Qc3VFfاb%2hO< w8GwYJ,)bM`3nld|l[ ~/s>{ vd{K7݅2`9!W t_ouKژZ` :\6n6}aO3ZwM N| 6eu7]87S4'!?9^c @9~ K 986m=.\? iY*8CgW{p1lNȣ帳^/;3gT g:Wx-i|<;ܷ@7v͓}kgnx퉵8qPo+~ K/Tߧ{tE|CvwŪ-|zØ1{ܲLb|ºt6?^(_82O ڮ,V}He3!ͬYOEՔ'5i4RN8-ѣKA+ -hkqL!K-|{eש?c9$}y a{Ϙ 9-5#|c;<@!k cQ~S3I-ސxh3mf@/_;Ze'85{SD>vD>~=.+V4)'[XV|Le%q ?LP?͍o&upjnx|i'fy[@٤?m}qklǜ@I[@/5(0.g4ܯt >i`\=vIx[y(pnCavWׁ2ՠ^۔h; eF%8~:)?owoJeߚtޣOk _}ȸ*>Mae2%t mQ~W~nni=c/iw qp߳"Gm:_ 7.@CSwF SágK;Q˯Vݗd=ݏegtΉ2pz$~v>Ϟ!?xγ=l<9_x6VM?sky@0iop]I'SwMFxzjswXv悩Iu~m;ip\`a-J?G+y>%1o=9f\OI¾Ww ʿ΃AP@W7a6A~|Iel%`nL_ߞCXżNR$ y`:*EȃqSVr]3A<>m3) Xm;̅8zNy\h6 iwԭT!,`8r_$[!OhE{^~g-l_.h~LǍ{ \SB|H1Pi_Jy=.8츉Bc\!ܖv%rj)|Qzߦ=+ph/ n&[/X }|oжnC>Ekܰ m;. >؈ Uom#!>:4|Zh C!̊Lg.'F}jaW1|][G?m[C}-W:ߧ/U|:7 JvNr.۽+N?QT. x{&3\sDҶ\5}WY:;1GRERw2m;ICN)BGUSxT> tSৈ9  ާ{^mw@'T.}8>(]=P&Od2QS)}/cqc̓f3x?mKAҐ{RcO&4|p?VIy߄6'}C#Ozҕ-s=Ѿr:1xA>/57Aˊ]֭(++d3d G%\_%hmzx?>"tHlum0j qDPCFi HHH2IG;4af;(jЈދ#":lq|;7\taraf~߈!U14Wq#^$2/ @SS;%U}3}JmP - N!O9J<#1<ɰ 0B(Çc>t(->D;|? 7ŇRzt:k;2YS3v`>S Dԡ_Wt9S˓ ig7yT@ɂ=jGΟ>;(a?r4>*#K? ~䐜k'8+cn\}KpD#wUNH?a?OO5쌃Gc<g$ZAੈgT3]q4KT|(:6A4p|iGp8rqGYТ3?wd%LKtv\/ܨsX/T{^t h59PgԿYkw9~E|+\N]X N@Ӏc8΀* ''>^9Fz;0Q*=:G9=AH&S;m}= V #Lp=.eZaAYJ9u2.a=曛XT\^1j{E _1Iq $ՑӒEasxD zg!(?}eV#ˬ3q #cl9r&- 8#=G2=g%s`2#h7G0t02>gN]N>::9ϰ H>uRN'eĀ}@r ѡdʛVi7ɹLKNS$- )߀j93^wyp5h*5+|Y0TgII^c"x|G3pؘZLx.Fô^91-d{-cp 2-hZ=$ Z xз&E$a"LpՀ~V`y8 8ОoE7 c??vߛ'ޙسj޳s~{y[\;6kp:ͤ9l n_d~,j/_hSû7.=K +POVz@xXU띷uTu TkR])6uZժR~ul|Gm8StO ?H6쎱bK? ?7~+'跤>LԢu&c65~{"Yq툇/}lt/>\bTqԙLjN羍Cg/aR>j1]q}[1j?nz~= |jko-My>q6pQhltYqIu(\ve,pի3WND[-{`=~J!\ݠp_ ^9G=1˷Bת}2{B ?#jʳ#uhݳ|/}9WQ[7EBjQ'x d \3X&,kE)dwZU{0u&;HF;.)}J#h]B[!߿hʀ;eBog w8j?=*,^f"r tjs̲z?Ѻ }rb{3}_"M͍rɦs5e?@)AY<9;,,)[wd m8mم;"a}alUℜNj  QʼQ8鬊-aF9nJ~M@Tk;+$_ އ/Bxצoμ,&wm6'ovY/d&ۘ~iS@^,L _OsN<4PGw#` ^]:Q -C{P>Qr |m}׀@ϴ7s!ܷUCkkȌhӟH&/B:, d?g ɂ$}VŘE{>A_O]RCI=ƴgJW6I^k;/2KmXqzRpw(Ng~ǎ~ˡdF#gͻ塾_OWg;ʢ<>wϣ%ڣ;բQrʥ=}Q7=^d#W{CrVyVW{ž@.ё%;tJ=#RM1͖=ltMw0,QGރw(Mߙܣ}rYOgN٧Zۤݵ+ISk$E>Gޢ7~'^>Zoih=88:'Q}-88&'/o8xG^ϧ Lx/io"D6+lHб+ xx%$^q"/%/W塧~"^3ꆱK<掃7}zГ:Rr9D:f3 ո%OS@ηǚ~(O&Ou")byA"2!}~9zȩ/1eے11&*o ﷦yy!n#F\* V}<Lg 6jɎ^?I,~1XUa難">[3Y\N19E+4.|wGSWkWx}xd?}ӈ_x%ގmN^fEhD{V?0#6Grn%vLrFRe_;S L0}󷊫wOF̵dk y0w@g> f!3h ɧ>[!HW!)B2L]h'4ė. e,DXtBVDz ٶ$cZ+$G'%W`̙=~؂_pS6][V>N4Oh2L=𑽍[~T2S?z>O|ΞZ>(Ur0rr]g:SD6v\s6wwj=, Ѣ||nU7zkynLUCySA(3~`Tpk.RI'1G'9a>Bq6}_| 5jc9{2eE. cZ ~ސ䝾K24%)a/VwҊ5 0_s>;3"~C6:|QR|mߧv|jW<%ϴ?2mH޼ tCB ߷`lLXraj&ڨ^Tp mZ#"m pD6DPk$׵vimNVsy(4EYep@x|8С6*[*ie>}x(~bd\+Ч]Ndn'dVZ ]Ew¥lȤtD, -/ٓI>To߽}{VT}^(Hх2=YC ;ԦHDŽ+uɀcA}GIʙW69w3|jM b?G'c ceuɆ1kӾbcJY\UTKL{G~aS.ޠqDEd%n +VF4q"¨IQ{J9Q]OCjPբ.\Tn}yբK {)Ky/>C6Dkns5FxQ+sLoo}mhFy37m"G*U aKQ4T$'ah@(D\ޞ:AR6;o]² (+ƥ~eS :k$ھoyHFYCDikp;dK3rp~^)^ |%cD_zLD1]!_ kW$_Ir /'ѹDE4wc7/Kl%mkl9K嘜 \} 6YS~yCyqp{ e9|ѳdc yw1!i_ 8ECMρ+d?= 9xr,urUd sW{OI0]A (i[I7%lHH8^퟿M&f+>,W(0*0*0-rCGH;vJBsDf;G$ ^)98fxN; Ƙo^(DКMa0GYj h ,1۬CVJS=]NНO>Z~'Gd&uQ޷ ro.E_ Y}/Eu&÷ EHG]7˴q Kߍn}ht\7*o-^As5+Z {Un]A>jpgaoE5Bs3!OxQ͛M+8 ˫*i%]W_ZZhtkd[[/%O}2퓏^kD?t'UxgC=ӟ((taIQ)m!7M[+nZ1t|INL#}47E:Awc('Jg S]wP9Cmơ icIhݧ'Č}1ILsNsv߯{B?+x>93۾QuO3v͖F}>ߐ޸eY~âQ6^5kɔ{?G͵m͍w٦?kSonĵqb\C.r/9?~l;NijѳyßVmdDy}]3Uyg3N?WIrHKn@Um0w*;zE_D- OX;+\Ms׆ϣyc7jW~NJgv<; Dѓ%h>}>p<  9K0f-I mpRCmF||_gN-od|xjyAhif;력%I<䳋!Z5GR> iK9q}>ڙ>_鴄B`YnqA k(k_+ž5\Fvg 26 $;!'ܳmTQ协؀:7cx*+'ɡ="ꝏ*{MB6B$+N'c׎ {jS]ՎB>^.ZJOs]Io3GoW(P{~ SݗЙOAQT< ӠBOĮEEj!-R6if:Ȯ &t^*GfҾ~Jr4 \M|y69l{ߓgEZ^ISȯjRr-KK!A5>F=ywSSvݬ%Zg0oo^Ⱦ֞ d>} J<3E:d .Qx`ړfre^EUwמ%t(0kBh릷uƮVЏ1Aq/&?{R(pV͜$` یK84yD? C:t'/44R0_>0Yt8-:Uܾr a4#}y9޸Mt?*iZ ֋t:d=j* d0 3q*TJu{T0άB=hhiòm6)iۨt c?η+աEEŢPZPT 9fS0~ZhEeKL?ɨ}:2 mQ Cص#-99^|q=dDcߍ[="wKw` " $W*^[gW ߥiҘ~wM>]EG P ͑ w["wkDX{Q]5`9SXQ Z%βށgml>Y&4fx߮*t~}M,m'9E@TWnZ 犖lyŔSDkG磝E(qVrNϾHCH,Ӈ$}Vv5"S@m-" hL B6fAwWww;͹=!Gx q@@xti+lߢ?;7o`af?*Dy)!H&T kGH!aVZȵvJe} OQd 'er:-egi/3tGQ~`YVRvjeWV־ xn4O?i}-5=D)1DܷlȤ@ :04ߴ@sƴ* /di?xnۃ; \lCeô@=<nz{ԫ_:HnէMal#U4lV^]HGsHuP|J﮿sp<:J0nL;+ u"W+U?*V{+W+3pXVi)kaÒ ޹诽WK]=iP {sWԣI>Aܗ7ϴ`ӂEƎw@quz= J>@P= z5R J9 eU'G+B#c[ZHc9.d { Y֟ khٱGx u}7dTcΟ<>OjZ]}WKG;x۲H\o+Y٪1\,Rނl|}K֚@ʘekdNszᶙt}$'z vj@W}dlIok7}/5@ҿdN*[8}^>oZ>/<'̧7ڸ~҇n6~c6n>_64^7kz~3^{ t^NJ/#}.a"Q(@ C}|/L}*踹 QLS<@:߱Guxmy{X+6wݦ"٨K/LpnTwZ-R߮/<F1yxOr&oi5y-gŊu5Zҙzda<%{V#9,,g9Cy\тeۥi̱JhJЎ&H Oy"oVɟo+~([/d/s!_Ve-3ȗyqz|#C7/HP[|Q%u+/=\g8}Cr:+,iEk0C!5.QUC?clo. } _lOH_x؞wO{ݾR{ik)o[xKQ1~_z4գ%'Oh%"4}'=JpFydΣ蝑!?ӋvβU'$Ħ/гu'VOi39gCw})Xujӱnܧ!$ݿ u;9c/SH@Rf#*m9.Cy`sw1ԆBH7x \zYϻla->I+ Z,i(iʖz >߯ھ⿶ ]|m1j=WQʖ/K?7/8Ceڀq>گn'{jŸ__bP{!ET(y2oa~2MŲ~iP2idU#hf.J^[䞝S*dx lw< y-}wn;n!=. V,4џ:=/w;0+,gTJr{o8} w:Z&ڑ ,f#>gHsg ? [Ns;Dg5"K}2leW0cqjG W4t9lq7H\  3[?ޱ 0+<5_u#/iޕ ?\6X%>)XZҾ7_ܷp_Eߋ>KaDFnX9-SŤ3LjhaiI>MAWFI#TZKߍ5$˜A6xaFuX>Y[ƪ^濴q<&C'Y>gE濂4u#vOOi?7~pmWtڋ{d+ʽ(kr$mE3 gڦt){_sUoNP?C|2Y sht4$u2JnH߲ʏ\KeKzS7"齁6?z-3d[ƙ*׶]pg]Hr'C!4>Tk;_ZBJ4A_1Z+tǢӕǮ_#bKBg|XɮAr܈:e:Xc:6۩Nx=pAj郼ev-EI͕8A~/r N/c|z} C6LhxGvc:`1t:gr3x8t<9j{@Y \pCf1K:+PhƎ塓Ccya]l̴,>hLXt(J{7WZKanZ+ /N-gH9d_d+rH "rU,ī]S5Җ0isʦΓ"EWcGzOmo];=hA^K*5V 2X?tCWВxsD`ΪrTؤ7t=]( =kгг{y 90=KYsϳmT~36$zIvvcϥ,v8os$Mg'K'XOެ~vaZN_Um59w[x/o'H~ݬt{oOkko,SoC bogDm3֩IǃoGo'{e9࡛<"{2hW4X9  mu蓼/;J ki)zj>u\ρYG!뮥~t پ3xg ;$WMd5;\s>c93|y;(?}ѿRC^?2_8*kD|mvn@X|܉zx}niz`noqГZ35>Ք?$.OM^f< G~iSޭZ  E~.m}$4q^´ =ػľ,Pɢxv~QaQK +bWD:h 7]Eک-o[v=Kp| P.պyWة7G:8EPp =O" ,f;*7ÝA"?A`(>##: 2i7MEK=Pr} >fy^7l[Yꇑ>mYd7a[6:\P,؎/=):uFX ݦSrOD-G"cvv(g$MǙŻM{ߦ@\PgE!CC51fzvIt>Ueij/s =l־uBڂe"IEl)t c3䆃t3vhiR3$we!u9:Mf&8<8?߭Nk^4="]٣Hd->|1r`Dڰ#}yOyiE{uh-{1t^ځokӅ<"J N\|v`2azCz_<)S]2E qx:F™n)tsηLv'И`vq-V,}rlt%ZiFg??3hE{0 }hVԋ|cLfߤ̵(C;.?B[Jdwiw!;[, 8K N磐tl,Chf@/ÏzH8>Q)/0֘0/uNai 6GycLF}CPk"+չH%~o30783VVV`.dsRV^?au xyMRsL:IeF gIgȝ茫?}ON eC̙6J{Pwlݱ?tnhӡ {}گoQ_D4y9L/P'2}"32d޲g"$ EEOPpT Pá'BG/}:J>, ~X:p8$ǚ(mo% 'osݺ7oe,zIbiI'=\;^(,Q_Bz':p"t~pp,#Yl2X'F}x}q316d'戓CCet gq,F tm?He 7Ҁ1bym6npܩ5̵k-V lzaџިeϣyt,KilG$GZlRxN>O_=Ƥ_\a||KΘgib7n9GAsf^[2'~tՓ|&;II;&>$M$Lrw߳LI$'^8woN}$'^;w$'~IgO=kMM|o{kj{ZkZ[kַ7vzjZZ-u-<]5Mֵ]Sh4mCFe:껛<oO1|Ykgm]kq6_ކ>:JT.G[4<}~EX\vbGmX@qy  Nt/&-5_ݶ𱶺-m^O(A?lQhZsqcE=HYK%OH#Q`*hMwݙEwUGy"gS]wxroϽtCt{hIS,_ b;v,Hs/%at}jgJu7CtY=,m]E{KxKۻ[=W 7ՕK(|ȫVO][!Su ^&U>)SoʌYf2 fƆQ@+ .wA qI''6t쯼 W"G*#eK[S"T?9'.~DcêyʾXJ-]lkh^ ]}wpjfHu 5Fip]b猋Bꚸ#a#)\G{W(2s¯u 9+&kxrY4GB2;#YO/#,"tž3еDV8Ҹwhߤ03=wa#T֪Ec.r]D=.o]&?CB}=JÏ~~]ZMMlm"9>؍G=¨tV@!u=Tgvg°X[YO5R9y讒2EX6n:$ Cqhh -mZ|۝\z\zsz&7\V֊͑5F*Wo>8^"dY Dwx.jf:4_/ѼMimX^vy;QBv sX_~#sW,W41(B丹Jl[d,gH 3 h)Ɖ8 g;hHge }P<h4 eR$Gg4u˖cSZ+N)_,e[Parh⾔}eiB,)ΰ®f_65Tɟ0L3 i7/ෲ߂T:03 ~!LmDȆI+6%ـPh%RHʗL/w' [./Do3!Di(i[$Z/$??-XKYl/^T/헥8Jr2g\*< ❖kSDbWöPhp8p0 Ҟޣ(ttKe}6M c萎JBo|͵*~Rs<#vnj/dpQ=&U^H"0lF@C窳Sg EQ$Kz4 ~!. \P:wwLERwrƦ9 RPN B3B$K \[//'+3. ¸FdfovX!(\z9i!^Y--#a%ǁ8:e Kf`67nW'mJn*Y KE0BP U׬nl'ggkN.0`p@>| . IeyC&dsdfY\Y\U9n.kՠjr54\FW#W#W#oW#_W#O_jѼA۵UMh?2)7rxG~OL醙ߏ*>EW]VfjvkmdVv;cWc7 nݝbwvd-v{ݣcwݏ=B; vO{a,=Zصή];f`7lv"v[n).v+حdnֲn3vcWc7 nݝbwvO"}Cf(e#v1cP|1$?3|ϫB=ϵs:?9=UA muKH2%)U}B؏ze$ꔿ(+JبP7wh5P\/VԆڕ>zӉ ӏQ#Q[Q'dz̷1mc^ _`:OQa-ߤI\&{*k/I/*АtTA$0ǩXl -ʿxMw#,`?&g*rI.RWrQf?)9qyi+?n4OkPېִ-?e;i~ '#n.sOO)\[5*\nLx)M GZ؏ޣoF~RP|Ayrtُʿ馮Qut=U4#/f>3;?2e%t.-m:տΟ)l>iOQiGi\gǴ|/miK,*ͭ?B=+[ҶrEn(4߂δ\F{徿_r;_؏rHI`?5ױ쯥>U:S~kO_f&*Oo@9\O忂`?`tx5r όB u=eUF~?٦Y^(>城qe)dqgzkPZKSQ3"_3Yաgr;Z3sw&˓gf[Q3Y~dp2 |?`ݿޞ>w0+_ 3G ?03o0; ?jl6/FK7cnUm/C-[|#;{]3gЭs/; x`2`t.*|~&Xoa09q2 802A 3]\&[8LN.!˛\FeFe~~C?7 ~~D?;όE"9gE.c^ٽݫ^b7q=v;bFvobfvٝ-gwBvsٽݯ{;ؽ;ٽ]'y[n!w{[n1%.f%.e>v]얱rv+ؽ}Jvbavfw+]Ů~i5jveְ[n6Ȯ&vײn Vv׳n;~Nv>v7]]?Q^v~'}J96ʿ),e$?d)+ 0H\.\`\5@YLlu\ ,7nЭ\mn,pݾ mb@)` `)>PX(T<xP x0`9 XX X<X< P   h<Xho:]/8 ~&@Y݌ < x 5M< * ;;<J'Έ^ v^ x*{P7ͲƖ.O[:D^ʿi֨]׸we5U5Үih__VX[]:[SsJ] n r >l"W?04Lg Mn# lS 7)Ζ='Mu(,[iXս~p҄D Ą;"v4& LDߘ(DY&EF9& |+E C*{6­jiMN e 7qHy`e%jN@VhLd% KM]ԮJe5w2"qi}& 6aEM؊"&lF`H0ِ1[K=eJFUJ^UP*SM_3RMuܰܺε]GjT̫hu75a%a6y0E v"/uϑ7l)_yq碘Nsw,Xݱ(cPHcR5dmnMV; w 76vz;6LY_ "ڗ1r i&2gcpWm|YzSdn;:pc1^_Cq&ѻ?²bE R|vEXȣyU5xɤUId&|+jFx> VEMކjj{7t44./;PCբ߬lTm^Jnr⁲.j[yGdrJilh6eUTuЛ?nkĭ'*J|ŚȰ!h[o}w[e*vux["/yzX&Fkzw{=>Gcޑigv2~2[4]¬V*ή._%(6DC} jJt5v/\xǝ-cPK bBcom/sun/jna/linux-x86/PK 2BzïD m'com/sun/jna/linux-x86/libjnidispatch.so mD̽ \T0>#L::hTVtެĨ4|BK 3>J ;Lq:NhYYQYQYQ>2J-D+-,ZݨLIZ{̜gz~F0o0$@o4KK0z7_H#z`$@n 1 1 <= Fqa ўAw+y&@AO~wNvemM{WK +y7o&n ï+$n4[7~/~=XV!1~U{~᷉K50 D|I{~VMus-?F2~`~ Mk[{[᷎̀_:>ޅ9U )G~3y~<|OOe<7~y|*Fo6/~K!ބNyW~s3VM9<_yþw2|jx oAGR4/"?_/~A0~廑5@|PNK_/dM0 7X_;uD<е~iy ~ 7/<,)6/~k޿~)~Wz f dN?(\-,~g*Ǚc?%ę%(qVx? &Ȕ v__;:iø Oe a#=cR, 0~n8|f;;FA}|߀tDR5a7Ir}5q1#EFGl(p#Oi>b=ϪoX&/o[{y?y\_x LGVܬ (iQ4_|< 31~ ȣ{pn$A|j7)Ǘ \+5:v|5+I}P4yxGU} jc>P?}a?{$d~gC*S隣v o4x|5Ěïї&^_+b"/;,R?!qazP p Y|983x:ݮhY_BXlcƏpY /3sl>?"6WaHЧO}?߂.d7oJ{-ggG֖S:Ok5]a/58փ1=@1_~q+_" G>7r{K;G7R雀z?97ojU?~cٻ vj|0#FA?ʘq Ľ*$?{G_~7znz1>/rR4kɼ2uj*[IlB z8?wez3? t.a{W< Nοx'GF?7_SLTNuy0 /pnf}U<+| )?˿'*T!,MSן'GT{^Ƭ~sasؘJ 5|aԃsb7 ﮻TBFk/B՟`}oe'&nOsO1 |i>Tx+5K`OGX9_8;1^7 24Qȿs*`| ~?x<D|9?*A~6jI0Ƿ|4 ?\OjǓ[ ﳪʀ bcp˿]l`~=70?w_ J,CVޜ9rl|̞;\CָYsg)]R[b[X0yE{~qEg5-..,6)fo϶ϙ;2'8_L;fʻ9$CVIQ*̙S0g؂Y%ss (&sr09T_B!Xk(srsgfϺOcxֽEEܢYs(2 `@Z0kn,+,0}$s`fDU$]7Tq}2 ߠ~~CpTLei0-̶ќB̹ͬ‚%@+dpW\8/Kcٹœ!:%{q;Y$IUI>ir~qnv qLMK.*1.gϲg'ΛUȐm maA}fμ7w0ȣ˜"srbJC[ *qd[d)_x_lSsgŇΤ+tЙRI١.O# j)LA2 4ke>TW( 88_Z<`.(s Kr! 2 gҢy3 B֒Ef$u]رkiJ9\kiwZ&]8>%̓R2)L$d %(%S(9)B ښE-g~vp͊WPHRC E%;N7t-rօuC+D0uNBC9钠٠HϝWX(T**9JNS TB/ -STB/9-σpV&=x }1IqwF!~IscSVAN1q ]xt (.C~^攀(GZq늆cOSk*ȌsgW‮Y ˛37ƽw*ZI9ss*hOf(K.DQ@/K&ϐ=7,d+Q&S@܂0̙T?͖`P]υEvCY8( t_0 ٜQFJ yf9px6+fT.]#&1iVRiΙ9뚒kn0dd۳%%l r ˽־r_ *vcܜk HW玅W/võނ9XatQYC:YybgS/ia7%0iB)Thi2ASV0jwt}yfoU \2\Q37^Q3 ދ+)<4fp2p:g0<"򰌇<\ ja򰚇xX (C8 P.OAC0a W@>C8s. ߅C%P!" @|> 1ư>`B}!ԑ"  v g0,p 5]cx 5]ck /0]c/k /p5W]cx5ׂ]cx5 `v0k o0Û1Ñ`]ch0 `p,5i`f]c8 C{;p*5w=b8,k g]b8  @_cz^^1,B ^1`>zp)~a(B@.cXp%ՠ nb,@>E?1| c?1\pÍ 1C?;AcXǰGWa.w=z_62L /cǐɞf㎧||驥8x<5՚XWQq{;3]O)1)!N< <# MX8f1aqgߠsj7"`YmY?P)= +%ﰀ(=0.3%a0_i ҅AH|ox=ZyE줶ҵ~'SB>ᴫ[ĩzYOo]UkT+2V̀۳V%sJj3_Sa?oQIdV| | 5 ucZ' ;ÿtxH_JsG'Vī_~˿Og}ܛ?PCӔ̒]Fwz]v"8\7kJ2"/kS1(PE*`,41cMq +K՗ooT<;28\g] 8LSBBÝbl|#q`Cp 5╶p?A|ƹ?щOGcp1VZb{Q!*'jhaCsZPqL1LE*?UbPʞ("&*)D}6lq?>|"s ކY2҈ۢ|+A`N#Z2IQ$8u#F1Ve|Rp.|kv[$ڣ 6A({6͌mڟKhkCl퐣e"m $jzQ؈:1qr.Hxߴqӟ ZN lq0F 8sS(Cqg2:v.ȗh4/%ubEW(.$ `WOPE /tnOcbތ8y?`8/+96ŝ(EE-YASC,V9&?ܨ^:?)}R^*l@ :a,@ ]Ozn@/ ]LZCI WcJZ@ʖ>׻r<UOĝ`}͸d`4|r %_O7iiyi#OxBtV[c`} -v&h<)St<΋:اך:ϡCFB\$m't\¡`ޞ`xpK4< ;)'Í w% ɔ5C'"jkEԧҚ76 _iˮ$ǭ(0^huΧwr-H.4ԭy^(S%1{ew #v3Hixf~up̦a p$Nϑ,tDW-s+*%BJ핛g2E'D kt #% o%j6?-0*'f7KdBqmeⵕfNj7wlЊoSX[%nTe{s(CUsY.C'~ˁFl"z2ꐨ T3Q/SP,q|#x/5h:2`*E3,4A oXB[TjBuJ-T%OZU;fW7/ N ]%HJ%E;l1+QՖp9(&%??ҏ-Ve2,0˹<%!0K4қg m˳se3UEIBeA/ljlmqxͩ,ǂ,X08kpxd˳VPkq\pOIHT)f/OJ (j8ƴ 0?8ekoڡr3f $BGl2=No@y=CtLN($TtoV'^_ޏ%"et6Rt]Jrelm@F*׳D =N4zָѓeLyN`kӵy .+CB pW2sKfDkD`D9 jI>+7emOu`qњؼd+PC$K魤hᔆp^eTthgRGXq H:^%*qhl|,UOb9BQTܸq!GҺSn|2K%v@-VfqlUvnc\-e6QPM-E+ZcM;|[f  {g:çyRf<)G3}ӬY tĔbxD[Mz]O55鍿g57_.d-O,tbn*m=?Y?,6hK}SBU`kga_D#e]&,pdF>& Ųe/\[}UZ<)$S@}x>O,>n b8s>8Z;,Jk,:BzjykwKҘ"Lo]6zKiϳu+j|=# 8qp:fPkL,`pgTUfKc`3$^IٻP⡽VhT"!̫5'ybO8^ZˋS9'he?\}IuOp*gҍHOMnu\WM tiLqf=?Sj[u`mKkN)UX-~?H/MWēWRpwr DyJe%5!' (W8{]C‰&uHMbgFJ)fiJk dgkzh8UfddYiF\ãoBJyMalaAe-$ @ $#zĿMևqHTCĻJڵ?7Tn؊MLC~ 0MC$3x1׃!PEAmR[Y 1 mJD F6~S a%~)U]lfnOf$tBytuFa`ˆo [e*%_j 5 I~NPH êvfHmFjs8D)+֓˘)<+O2{eQ p?s%Fm)yDܩ璔[ڱL۩$ tH /Ў UeBکՄԮ7׬7u ޴/ X]ojjHenYgMI#)Ilb[hobgpw`ff3'#T'3{\YAmD*#4I); i5h/٧WŠ$D,oO]wg!NӍIeR#NAYDEbL!>Ĉh)<<ĨMû%b%;V}=2o#DMcQswGnٔwȯg7tʋ9,V"y-3=۩דC!w(V1f"7(Yǿ15߳#RADcJ N~s&L#tho[9 ] Jf>BkBV(φ#dNge (d_vT T/mgҟS>cېZ ") /^ݻ>SxL0_bg'R` o#=?uZȇm#95J%͝ qi0C-$@_+TFlp:/KqukѨ k reG0ĖD$iY$= i|Gq iV?`6EI<^q`[=I݁yAoqHܸf9ٵY. zp֌DIyN+;R[t)\MOu!vk_jՍUT~;ӪUZ_ⳊYq֓Ll$%thV2aj$%ʟAH!c,)ơG4DcX5v>ĽJue?]鞻' 81~7@4B@\ae.gT3X2ߏߢ,|Ź܊0 [Lqef/8iCĆhQ}hh[8e+2a8z>KxM62 - 'Ilm"tљ1bf>PrJA`DgFu mAq5I]Qz+V?܊}Lr^ [@ ?|.bmAu8~42P!Eg S ׇk( lKlF?dJ>g}hx,r 7ϴ1βKx<\| ܤ 8_گNzK/H6ۡc#o[4ǻ|׹`ZU>4f&/ߝolD̫IF]،o8 뉜d! K)Hg -"$?Lڕ%::Y񵒋$>IA6>!AiPL#'wO-A/(Dva3x&Y"^׳_qoߴ́NUwgfV@b[wVQ|N|G;#TY#$۳`5=x-P<+.0WԓW$g.i+Yo̬Wd+|dFh=ʙne7 OLvdgz=tNX'מNWv^Qv}rf[f(寝_ -dKg.ӕPvv~Kz@Mzdв^}e7te+WQvpvԠ:uwJO~?WWoF}ivW/ ێ*SuvT)r]"@o< z_pP9|^ϟ/| m__ГO _=)&:ro(q ھLς(O?>x>>;}^gRPd ˧>;}^YЗO(y%|h\6l1Xe3 ŭWO.B]=.@ܵp+T~tRڍ|)=yڟ gճw-9Ғl3At&]yMO&JTNj8F'tړl%bFj`yF\Qgѓ-?`@4fݔ[&O)}U"ٵŷ';FyOgŪϧB+cfoMջN]{W&'QJٴ =ɤUJfʳ̻+C/ד̧5M'᜞Zc9U(ɛL&/דɰ2ɩ<+o6§6կ gCP@/e쉳'B h2=_ġ9O§ =qM?pYɧPc_:d'9+mY~JG$=5IjX`+ZL&KJA|P,1EGqbLCAG)y {#R+it*dpem`\͋np M2L"1|{r~S @nևdeVpB#Fs̿}cTLfu) /m@L␿D(+GLJ( ft{Ri$HL HLIgHxqAWHG3E#١_M gkbʹ$n.Is 3l@[+/P*Hy[o*%*pS/*:Us1anTX, y")e*EiU~kPnZL(zG|Т䢥UCrw1;YIE]PtGh9paJї[0^toYəU8sH>,<r{m`EE_]קh4tTfxz {Ko+sc(O4m;N|Uq;sK{OV ~ҳ\ۧ&,eR` c}ر’RnD(b." ݾ7ʼ%Iiy"?rO\Aw:2|Fk03AʇM'l؉.X|w'9#:rs O2QM"-s~/ZYi%$/v &,Xۀ.q <.</u e&Vɢ85Ac>Dq?mlăf_J&GQ3OE{xNAKz kYVz,ǍX = W̎皓ix~8_L2!7bUWm)쳐l븭eqoh}7 hاʴCq ?0VB:V^gtl:$}yb; 㗙t,'@TPbEf[#] 2~zGrCx ߝ^w*Ksù "ٱXn?P?OWsIހ||JC?)'֏73Q&%=p9zr _sܤ.'^zr/?xW\N/ s<.'.7˾7ˉsgazrQ 8|:1L\N^(+5ɟSTzԍW⒞BP i\ñӣQNh3r^g@c?8 thh@cOko;i,Xz('{2oFvbi>ׁgǹ*/ea8f٫!M!'ry2\fu q)Y(*9fֿ́]Y!rZ2k!^1!/< G151i'Ϛ/ie8V*}x ^|ld ?Z PzF;G9p^x9/-K`/p0}VмMYx 7r#;'j!Xz-IC01p1}[P62kE%zOc*>.q)=^5Me ^vweI8zq$-&K#qGgWxNX^$pkYl>ߜ6 BlՃgﵴI^󵮟-rKY˭k\3'cˎMס,8̀3˫5x/&S2|J`*MztH3n5qC+\qjA.1tIxSnG)jyϴ=$V45 25%Hdx0||ilv-OG4"yFa^] ,e')7#;S[PKw]2eh磈l9DUk%G$5MiOI8T)Nqy[m댵ZLgYְrC)n(E+ѶYtJUbz]Ų~vg &JY mXM fJq t =PMۚlOIm֕`fBz82AǛQ.BL3@ #JC< ݌Oy䤆1O9dayLBȋYP.3b-Xܤ̕3W7GrT??PC# p@%ҖCۧ)އV.uflaWfRi.,|)؊Kr}n6DzEJȗ u2N쿃짚,UM"Me[/8)KaVul䵷-G$Zt%RO)U9 SI.qcmY굄|==0n}@ceǠpd 4 uIb};@_vr%nWzu=^K,#`g˵&,Ƨ@WQc Vo$7'At^&=7a }nwCR0tꋿnPw'KiDlq Uk{x 3Q&~DlM;6|r*[g#ϡY/A޻On9X+3;-wsV܀ZGE*gm\\x؛4 7K㯙*/.ZbI IBm؅i;Q*} GtI?H-:J)»hp;.o kO H6j l=c:Il* G _$mhxQ4!ݴc\ENh8A$${}Fd~;RxD _Eex@1 T1܅tUN2brHG&DWϝ B 3A!>qgS.i U*e&ILi?Ae"bƏlxA$?;h_rl, Qa2 ?Vnګ)ya"r+H: P;1wQCrJ>{W=މ|uC[n3{M6l'=LYƞVUb@U5B "0r m?z彝8J0?$RgExF*~#|^Z962T@w܁ n+ )A^ugw`ݡmAw50I'edpaop4I&WaMtۨI GYCIQ4*_cL75Y&5@'؇w6:̟lM~xR1;294^F~5PF1̅Dә <CZe׻brX#y( |~(1xY^%0QG)FfJ <2)7ĺFSG𓐓VFa/H(`!pqrjE2ǯbљYĚpGgӻ47:I4ɾ #1QUPettE([0^fzoW&fX5J()}ĻtA_>Ҙ`k6 Vvپ\n:U[8;O*v]$`P Ppv5S $[a S=)C1u. |,]pyV/ SJwܞnMSܴjIo!q~WnV~Q7)thH2yJmҚz:'PbSq l־z" 3[=a*5%]U*Fx.m>1 E8}S4n14+M/=e:HF&w\seu]l­zB5C+wHc8, &q=p|v,pLˈ5x=4^g1uyvI(ǎrbBĕ\6`"Ʊ4k@Euk<&\O(\P`}ؐJې "RYRgs-Ԛ*%Orie'V> 'I:๛>k[^!zpCnWpa~ W_ͺ`tElnF^ʪzf.fx68!nSbS˳ [5r-L7 4|/hz "ț"[hh't}Y'.~aoݦNAQ8Ș#p+ٴ[ d¡wk:D6* Z`6]Np 1:6b|( 25ܬGfG%ڢ$Vg kM)rDsW%mg# LU{˧ciy= ns<3_&'ݍ&1: 3[%8 -~HKB(+Ӽ4s3|uz'#tlF HOј5N:uHum/FK]H} <M.VxYR<5t_rtw|Sg>lMK(f=}t.+SoX4{kg )%țqvw!`;5磼h*{ɝ* Q|BEr[?Jn+**9~a.)pMR(~1J'N^GQ nLyK<1$E mٖTP*e}?U() !xEc!5һ%&{V =l1x(mliH&q qgRο^a8|I=ƵfnǯnQ߾ `-{xrB lm+8Y] t_2G3piâx%>лOrh2RQl7ͯQ ?w,/XCE45߳ 2|i'őRtG"!?82V6E)_MA`a?cl'ܨZ_mbX#؊!FREBsq?KF5 &%TE0sx$͝UfJ/lHis_[};\+vLjS,hGRQUB.T_suABےGr' ; w^Zws'yl}q%qm^pYg{yz~ml3f֏PObx Bҏ#b#h4 m'F,њ;g +~58.DJeB-f:i:v7xh}@'=ɑFRWn^ 8E&MI>eHte- 5d@z##vۭ|J]񘸕DknIlF_FQmA'OԜiPR%*wDUg!gfc*3DO쮡}x+k_"I( H_]s6(quVN4~\kyϛ҅s08Ȕ^ZA8Z蕱DnG5MVB#@ {k؆uv\|HL1'_vMȥXd2JsoA#UWѶ ^m咭Jx{R󲌑[ˇSQ8l+ʡ}} {*2~][!xJK/ VVz^!w7Ƃ0ZdAK!v0Iȷ>Yɡ:4[IDdD:|mۄȕGėx<` .\ZN|$ԛrG$(14sM 9nbluk+6;%:qޟ|P{񈴊xO6 mݠ {#fܣ gOF*.RF2݌( 2EbOV1.lJRb{, Ѣ\B~XE6Ui7ѱfsh mp[UH7Ч,_iek.vsyx81E5}͏69Gt (fkӄZ6cecmG8%$4nD%:ZL!\ .:9J̈IڴU ij}t 2s4"tLFBG'չo]&䳀smAr 1H&3&aw8*6{@)S J,nx&`ous1I{0m=p'6;~}iu[KJ(`e2wXVE XG1?_5ŶNh g;yK0T&I;TJCʏ Vg pNH˥%X""'R&9@ڞ89NQ(E\돺@2W}o "IqzY]^=ڛc݈o? 02S奤 JT&(&$:ɄD8s&$AˀxCS*z~tH;jkԍNͽy!wG>b2}Ԋ/r[;^ XZ lvح {W4=h;5#lmz) s}Sܛjvw|5x 紷▔8텧h%\fÊ?̞8Yhsy g`Oќ)69SNo@?ihUt!'ѫiPciwiAHx"B[cv1ˍv¸8^jd : 5AQ=15\zz%8-yv0s;1r~"(rٝ<:Nt(FR$.B͘9C;ih}7 }UC-Bܞ9d9 ӥpk&2IĈz+Ȉff*%@>a »2)Y#ko/K 8Q+N'<~~O(n-R/E-Q$nq󏹭 BdC*1Zyb-6!o"POHːgP{ɧkFhwkwu>KڟAK(wa >A8G=(@:m(ٓDčw;$; [ZNj%{ɒv]ٱboe^:LBmdim=6 y1'؂ZFf"laM;uEY "WPОͱ$ MǾ5%Ns`qgP4}^:h֒2U5ݰ4yK^piAC4-i^VŇAm\#؇w{Ӷ8ji5iAC[ec Y*UeK&Kz8?F 7ʮ@8iLs-ҳ(n,Ky]Z H "+MG0+<ޝnM{=yǿ1)ScۑٯC`-wuh{(uPl0Fe) CG7ghkEYwE{_vh(wpGňpmj3$٢ nkijޙPaPft7i`̶#Ǔq9X'e]*KU3 AvCݴתY<&c/3bY =sK4۱{gјy_86u!S^cCYfqk7_~G. $k;ƇR5rV@@hE a2iv g/:͢P*Td쐈榥 =Lnw g)o&GV}yz[ m"6eISVF ﱉEQl5_9@FPy7e&< Ѽ찫¨yq1MPerK9n22 ߮75Bse؎ SqD{%4v{:(-bm.}<Ĩ2zSo^fI;c4~ڵkMFd^YcjHaFd#C_?-;  rE'ounBmì`>]g=ii.^j)p?qY=ձ!Ա2:g11rZ_˯0z#uƺ:BFxTC^eZR~fxMm>Dġ]Nk%-4w۶&gVk3jc&dHOqѮ\-dѽi]H G0!)XiJ;޹[%My'աyjHW9F msEjrݘU }kccm˿_ kd|]c?|-ՑќnސM&M/IlڅA*ރ26C- S\գ7҄A:i8Sm S)c2.,s阅־Q2Lj>.V~]Y6t{9Ƶ4NԺux~G&}™-3{gyB#6i˨(:æbУXٍOREv"Ls\I̿N{C 9-0M>5iejcC#ͱK_E=\bbv^vD_l^KiZQDu272u:i 9duS; a-9/KGp!&OBtp~u^4V 򷱖:6MAX?km?Ѣ:ajJjGEqWG;msu\wX-4fkjv8[=tHdgtkl$-޷fNR9uLj,^{Ds @y7'O=7=),ioNr,F+5ܝSzRҢۃJM>lJ,ﰐ:CLj]K8f &*" c,JA_6?D 褏ɥi֘8# 1 6¿hݨ ork2ho,;\R #Ҙn̄<ħ[OD"-֞'"QoNiM;b/^/K6O t0ż ̬18 &q:ԣ|rG2{,:i;&5ޅlћ_$n:_Wuͧ*/v_"Vr"ͮ~#d}|cVMꮏ4z 0T;Q::0C7%o㴬NZTX_2Z]k+zlσ)/{xWr*q!/{׿+λyW澱><[/Imzif9 OO K a:`/+ûa׶'KuHd^4ܖiU/?'ϤxnpǠpwښo{>5( Oſhv]GiM/oZ;Ɓ ډvډ^`Gu[2?\c'x($VaWDҿl8Rg ֐(H湎Z#E᣼4v>9C (oL(.#׎;kx3L|}hS;^H]{ZIF'SsAk9Zɱ :HW.LPLS(6vΈ8҈QTlmsfQ!C-|-;t:0:|$NdN2%uDҶLA`GKiez1 `xc"7z|w*Ԧe6v`~L QrD0OiJihi^v To7:@}ѵwv|:89j/³l]*˱=xAmᎡZ`-)Xg@;B;g(,t}ą퐜 jko=*n`v;WTpEsUf_=bbp- xxDL86r]3Dd~-aڳ_ tT; FҠ Ѳ1zIp%tN$Hڝ]wtZ@ p3@0)\' VK0ܒ:;[[϶vs<5#Ȯ qyodOgЩA|wvQ}בXL#ehdObmeAMS1%pw:4m]غg:n6f6~vE;Nr>2NK\aZD~ψe *ŪEU*GŪ3Nqחڎo z_qIȥ3(xh[gh^t:8zGlV|)JiG ߰b+2>8#W響*TVe}^Z)mzONǷ*ƻSSXE['he@\ Yj_5QdMyzoX,o d+s<,T/ެ`ܛUUgG4MQ/,U驮VPZyYZie`PlX[aYվJϯfqћÃgH%*`YbyYx,Vxյ̖wO iDC5JS˪K.[CU>npAA /C|!!Uzʫ1Jjs*uIrOBcyB֎͕YA+`}VU㌯&ݱ6SZ(6kߏ$YzS۞ENH޶6]#ތ8^JoAi/rgƖgեF|!& 4/I[a\ MhW=i{$.cA3WYY.On{oRqEETL(W_&Nag˗%Dma7BYC\I/>)U~D9ӝ GɖzMziWVwUSW]-)r{Tb~cyLkCI*GҀe6șńQu\fh O[<Jm4q} ,a3 +-M/3D܊1?a4$!6Cu*K8%!˚ KZ9]YG5Z&j= YkhidYAy+n62VF3zό0WW(`}*! !?Nc¦Lf ¦Me :9CI∔4Ƴ(E bb#JK`tJUY\m6FL9R[da2a+Y L'q 髩^yg y^)~lH{7H(ͪp0ˆNuNrNR9$dZf)aS$[+"-L|8ۻv .˳BYVnr5 nuAN 5Ղr+-h ?p' m@d&ȢeZq\7C,K5ZΉKʄ vc\wAťȤI&Hu~2+?w&>_ V3B*zTcSzMEDBsqsPq}$dyl { ]_ZG̀Fq}^l !hG^5Jp=H4:h' oh RmE䟺_ߧ!r?Bn?B3r?S,?mlS[YҒҹŋzO GSr*9ZE%.%ǫԪJN][ȧ_ r%'腙5(ZRSkFX >|9elzNpċѩsx~qo>ܛpt>8S\_V\&D?unXϸs}KEw(TF5Sնvbnmt~7Q'`XƔseߔ*h^ 7&tRZJF?CLkp*Bo''b %lILR6~)de_OSzM ފx93y5H lK/ m5%xMyʱMKiSH{& /#ےQ?DZ5.Vv:}bZ\nS ŀE2Mrm ;.rMx{Mihv@70 v8 n1Q@#a!@ IAVO.%vw@9\y>Fw[SeuŤ.K${qe:^QasD<^~jQ\߼D]V&Bw|8v\pfn< 8x `D8 |u p0̉'``!pS ? Xx`'}g3a,<x p>3\8r6eu6d{ fbpr5yOS߂{H+̙5a²)ΩiYV617"F+%d̠plTZeUyUqUs/䔻77u5P^qHWxTVy᮪⤝AT'.#2pڨ|Omu9OT$ ]D?h;`EG#Lكq*1EdzNv9]s$ kpuf}E$U%Ltd ~h3M@IG`&륿k?/,Б "tnY>%[Xf{nZx-t;L:E-t' F%vIGn 2']n$mХ0"'$lm] +{ TM-Ҭt[,tA7t$K^ߥ$nGxRc8~K𲅎AzҵY :KyF2υXޓ #-_wSzckMEp^:Lb6hS6 Y^*22pQ3H.P5mbL*pQ0dmb^]kbM$p1obN!sJ: p1'yWpSc|x0U u^ÿW#W[-# qhW>'EKg  8Dӏ x_Wħ_T$N5V<#,Ѽ/E~^8IGVI&/$?܎odZCPtĊslf ~0ԓ%} `6X;~'6*~TE)}[p~\- h]G$>Cg,ƃw4ߔ$OO {C^߃nx#sL(˛&v0 _M2SZS,~?VQ2[h4?ToWL_"!n{|{6}ȬykDB l7{"%7`."eŖAU\EXA{=a?|$ T/7TaKG PԗKdղ=|-\ǭ8I?9ZBQ`#e:} Vk0\`t.]<c ,}]>u.A^ey2|ON~a8F WdlPAkCZ|}>"_ JK7J> >Jҿ d?3SO>+N> K{PXɯ9,L_(e5~C#W~ N^D#$x=G.o@Y ]S?׀?%?9Ϧ'OmP2G4Aw}/dMo~ 2r]7U|[/Bc =?z.')YOd/yTEJ3<[}C|wF ?2V#>Eo`Lُ(ʥ A$}{ Gf:}PYQ-?KlIWZ3zl/EHH +e7o2k%*Ky;fde_OLo>b NKyRNa~woAiww?2tٞp)kw/ۯ(A//jW0ۗ`.a.!"o)$ZG|~ d< |&v?a͔ c|ģO~p/g/oZj໡/'X?=K73Axp ]CįS]ݳlCE}$Rޛ-L,1QIZ_!wXK|Pˀ H,WrVk*U5+'NvNqN&7zi))<)% .A5TYoC!:Z^BW56ᖶ)UrJnx֛A. ^9 ӧ^޻`[lpWa|@e}AEEkqɽ%a@ze.U׈z%[A5P^={ނ9IJ3@P5QKryE`8]Cũ>{Sa胊wL_XzUw'b=UAMޚZkOyot$&^k9t42nTE+J6y}q%UyjOkF AfI{oߓ3ݚqI/7 f==xTk`Lz%a1>ކE0zO@ h8EjߧG"$4,>wU}m.o/<aqZ ZF] sl`O+JZ0P(X(Pܝn_^,bz{bt.Yd,* $$V31 iCU_)c6vjnPK bBcom/sun/jna/linux-x86-64/PK ^BX+ȫ*com/sun/jna/linux-x86-64/libjnidispatch.soȫy@Te8>,hBeQY-BiE2:BQV.,3f˜-V&k+Z )w Ԝ9ylǏ=9ppEyo[\z!p=z> Wr5Xɇ^<+\o1p}jˁ\S ףpz^'p-p u*P#?Mu\p6AA8< R7zt oeHEw|k_x6n >m >PcFl/-\w`w- Eo28{20^9>W0u{K.V3o 33ڷM>'qC E2?}Xascc&ts;9o<i1XpsܟEܟj_5!CMLN1ҝW8 Vڳnjr^^9H? q}Z0|z^oY=|y@ּr#91^"\\rn8x9rgy-V-w9\C~4o/z*׳hՒdvQ]^~1ƢrYTOrw0o׳<ஏܟW\Ϣ ~o^oG2^R|忧5\A5>Q.jo}yg& .+o5][=zrո/#]_s=x bq\7?+<}>u\ރ>b?DYoa<~ y7a8pG}ݶ5ow9{zܟyRAuQղRf3U?vϓTzg>y-(~\a\uE"|3[vlcpO+G z܉4^?f9N_ar#par^ .?=^5zuz;̣.[2j?Ш3>=y!j2 ~xI:%]Cp^=qp;u\{]~:Noc?sQG 3nb~ģ\M(+#ۢHF?ד|s!R$73xLJ{>2Gv[r<+O[~vlNzp|67̣|jCuOrJ=we_0Xo:t쬡y֡C C3Fedjp>vԤtㇾ>rT5=yyyY#G1X3s'q醌QCsss yY9g[GOKKMCk-jpyFBNyV6*k$=7tႅC3r UYڍLcm~EZI@SeEj`fn4p(f=ٷo4<''=͐oj:T>.5g!W5k694{T0XQ3LsQiZR.a]g::kP&`訬c:4s,tw5M iTM@Y E"4!G %kMg֞ 3r=Y9#?plv^:P_J0q܈@7q_BChsCT7Dn Q h <\K_5+)WiDMyJ#jQQS~҈r5'Z<93C)!r¬z22{&{6L4dAfvn^M! 4:/ Is'6EdK{yM;=_oNϻ!9;. dgc1F Q#R~ahzppeD^*+-3{\z7ȠvQcӺeQ?6uYFanM~ }Gf)к/(k@-?:Pj^X=5`41%'W[tj@/K|mj_tߗ5#[Q-PUhd!8>#< 8>;{Wq|~=q|/|%[<;8>{q0 恟mcL|ygrl|z_쁯| Ǘz8ӟ_/| ys|~Ws|>=o!O#=8Gy83Gr0axgzyyx9>?y/"LW>GL{{WKʗŸw|?,?oLL_E~g{Зx9}<:|7 ~=e\g²Jtz_#Qu}w_/'/^|OQ!DaN(/+C"Q _ć >BxA' xESW xo>[7>eߝpY| x>E l/3W,_p_"GR/'R&|5~|++x('xC,C& o x.LCo xG' `&g Ls|/|?S/E~- b/X/%~/_ 2 R x]z/A' >LF->Ro𖂳!i#.g%!uoE"9g m0e["F2Ƨ%_0>%,&긳9 s@8ǹ.GrFVGa|FR1Ds^0fΆpO! ~ d?nG< d?FfBd?/ |+Op;F6'';wEGE.M=d?WO% ~#|?O;"܅'G#O$ ^Cd?K~'xkTGp4O[?B<G~'!Op.1d?N<~_BO $ d?~' " ~X?M|7ϐWE8& DO' '7GO-d?'prCD'/EY?G_G8'}' ~ ~#<'x~sN!  Hƒ~_@d?~'7/E6>Եb/j/RŶr3X_mOZ b6)i X$c`\ H,Zm*@TWdd) {Ave]Xέ-lHH*\' RL>,r[`utDnfhvi(7$Hq`bEnn.&H{]E%,ґD+9 rH(Ja Dy\c<E1?1 l!FС0 &WM 1QTcq q>l2b*.( #9%X!+&Y՟*2 13 Ǔ$2e1+ĞK. 8ݿKXtG$(i>O).Q 䓂a~jo(u AřS!C"殢H l5)Y/_ł'q?P_9KHD%[nW-RM& j2{a`_t-A@Y>: *jNQgX/Rx3!8i'|HMr"WaYtzgBDGD^s\<S:yüx!K ԃ#,eWES<&i$A@|Ņ xg$xA5!K ѵ'8lZuXpsEJHIU$i ?TXAͽU2HוTvJepe #eZ6 Ë*M.̢2_.t `Bݖ)U+usE AP,rhu롶B= Y ,,-<ŷ5pW#8H5q;*JSa'($niFCꥮ}y'> Xsokuk~ך$7khz,,zfQ S6Ƨj1\xjiJ5J?UZ(H6,h,INFwɅN~O=q_^JpE5ͺܺw%:#WN[ut"NO\^)^`s_ۡ n{ h xf@7`Uޟ @t߁ה:)ddךlNoywķRP`hiL 'eSZ:9dT<"H]E~pїL-r&eqmyva-Y'N|rRZR߳~MlCdc=A1Sic'ʉ 82Ť!NE#-擿\.FZzGuklJ1c߇2v@Ԑ?\.xVimd)1)Sb50{ƶG|FyH%us-v*acn)RY(z, (~I-Cq+ZD{x%B9]r )R9nI(;pYyl8 9`y@)PbXV##4j*Rcy*=w{yS-ΔE<6%mx Q?.NX{;G=q'vA+E(2-@;L_@0iG`5lnKNT2)%I 1lˌ-qۂ)8HE~"؞x%3Yg#Vo\n]w}'Uy7$ط51ͳl>|p:"mf &cP{{$!uk\e0 ržc]@;eYص̷݃(d} 3?ʙ:)YP )]вlTtIJ6^:gsQsbᝢA%b.8u}8^5H`V61{zɞ bȔ2K.҄bLS!sEʹQ(O!+90G2ggcJ9N,I|r,;(P˰:Gb!ޅM]|Q.\o)!iC4.NczAN#Qb(;Hi!9WU6QsI.~CYOm;O3NepmΈZ\=]-pEbF)`llj93iEzuKz@nEMl0bmOQ02އJ;@Y P8=5[;3 D:C d !$P;ȧ:Hb ϼ[+,Uۮ gt8F8_ry~7-|ZÙ=u\7_FE*E4n#eI˸p7e/a ҀK*`.k2@&-:x`~>A~X%ʦ &}o&v,]qpUD2CJGO@ o :N0*+ Y7J6{X[nULL7!勛c5~#}qӊgܵ^)M5E~ }q~=/ww_ܴ`ָ[VnM;5h8wkڕosGoL0@VQWZSڎ2tm;@Э<|SoN}|m~b qvqTY\v U"f `؀ha6fƑ|G~G5*ͥ,kΆX-VNM8ϏaeН8~a1SvZ4M"("_Pm}|ъȖF;,],e0_:L{,k'̝`{,XdϡlT45fnۧc<3Zq;dat8Aث!y; D,8G 3T/)/k-3}L9فl {F!(˕.Tx9|-6v,ff%P(8`?c17$e%ȋ;| xV"#CUXa Я-4WC8,4a.Cۑ.զbSC6Tbo@&;kaC|Ri2:3)C/q07O,N}冶gT_hljp½ "N0^nC\$)l``O(֐'7"TxZ,&mMer< i\EFSBm y&gP CTAI_ۺ3' H7pt&5?OhG P2U0+T`{e*,]j,A0GàAx'kTf(9cG誇aSKV^i}uw^_oS4)_u'*eV~?MڸxF Nu#]Z*wcsG9oߵ lJ/66{I#h\-ҬHJsU-VL)urVe>½Oq?,2`&j|0ᶘ3 *LaS&MqnIZg΅x?Ÿw*Bޘ6/hj5E:c{p/,4|DK;⑆mK: XZw4MnR.ގh;KCn,m{9?ߢ=ok-/K(Ll^r#$8Z jAKDG5Rkd/Z`Htv\^guԆRȖ!| L9ppuQ{lf)NhrMW& eO]o H#F,H G$>: S"dl"\ r6ՙdY0>M MSAz N0X_ +| V+bŀYvrFyi嬭 v\pݍ8(Ljk|}I*VoGk@K`-Aͨ6@z0Dw9hͦݣ#J7PI#}ӈk1'm/anG_RۅR C:hkrrT̉u]tƭ{h6Gͮ6NFi6;Q~gld0$WӖFQ7C«6mG?ѻ$@@:V? 3-H[4x7| V$Ni0CؼA$EYaVA_yƋA.2|=םl9bԪI];Xo[DEO B[_`nQENENt{6]JIv9(-aB[s}[^ rtsϘS8ӦPQTKzfF1IVF` Ɉ3 87/pIs4ygɿxdƶ0'-m=D]WГ0 4k3Չn?Aǡ> Þ:xH"ęn7mj?!n6!.2INBW]}EL{Il-6Zޛ@1zP-LՂUlЙD*~0r*WA-Zkq[ꨌA7po7s2|7GFx3n 9_ ě6?L *Vv/)0X[<`CuT|}Q4Q ,2n#Ti;0JȰu{!gMŜi``p DF(o>dqòY lֶJhCČz)~=$ SJ46D;hÛ\b*/bA[^3mv`U.MM% -%Jg3 [6ZPwZ-LJX_V]LJӌ8G@*H YnRZlxWSh2 򸲽/Gmd'|=_#+3r`[z܊0(Z~.f\"o1l\rM|^aT٠gS`5Br`Z&b|d=R`[B؍'`0XRTzW"4xl?q.#E\[zރm'"ciIVT4 MCj lND &τ3w9,R2 &_ս|J60AfWs力]LG"يe\u~P7S;=V5D``%s KJET5X&k>+ߋ0.?GJ?"~- J7F] CD+W^an򺖫ZNJ~",O 6lC%kEC*ӳBE'ߣGKWLxRb&Rs5pHh?f+;#2A&L9ӁQV&UR4nѠI"Ty%lڂ{WrnV؏xOoƶ*O*Τ0zYӏv^xf $ 5 5zVH{jUs L6P(|y,/j*IqzMX3tYx ^3Ѫ8>_Qm+;\@!QʘM֜N;(S/cC\ݿ*$;f *#LM)9XS?0ُޠ1 Q6_4?яur;d@VF%6=JKMr 6[[#U#0ZxbV!b,v>yeMRP~  bCR "5U[>!֭ \O2ȵip}I=3iTΟO`#Acu .O*;ZbR n~yW4yK_ߨ {s^V4z~9oTzz^_/kR=7J~W{/Ax*S"@`dfRJXT[}/_w[w\{{덳-Gs\~6j5[˒'\uia].x7R6; q+d:TqP%mt.ܳWضvDR̝NYgZ_`vD Ju8ó>P6vԳ1 c(#;DXx?m t_J*Qwѥ{:b&Olϴ` w\(𮅚g@֙e98#x|2^JZ' ꬹ s ,)+gh֜Y38kt#nYBSQ~Y+sփ4B@6@9${*V6gaP~ZfiiuI`_<:LMb'G <7YCUS^Od'|?*? C|3~uy9t"Tr?G|#Tį%l=ѵ!6NH7XJUA51TX@u$<>\)z`=<Љ{`䁉𣬁ғc' ֽ)3$̶J#.hkjme^K5`"ڿN5`hjfGԇߺٯ j f -. 3ԁqgIm%=ج` V O.Z@@G/ZbPOb_iVQ[?M{_rkь*aO|C'T{"+NGMMۿF%` %Q}f)˘?NalAnZD-wҭd/! D '՟iTL'pR?׫\BfW7>DkJ?}CROk^HI$x(/ 7vH522?je>Gke؉˘Gn%ۿٿ_Go,bQcGqA/eV`fvHSL`ff-%3V趷EC>v*0^>'mA{3i wrGyՌ̌fZ]@Mkgu.(Wtz9J5 +쵦¹ yuD"|L"H490S)4 a-!{ޯ{||+Jk21`fkV~H/_5_ `6/f2aߏb6b?}6JMX[CaHTZLoS ~p|0C.h`sm3žG%=Vce ?gzuB_W?__ ПېT!e ԓ`VzWOQ=+8H|)n0+>n?o2 .Q/ZD_>v"1^/D@cu2:~w6VSp"r'T,b~7?t^azGLb$G.-ofN%|$ظPO.-O؏a=UTD^wV_5Hܶr TF^A A:wK+|eZPjdtWwc"9 D/=~έ?:??Ev:m{T[dأrBA/nAg>4Ϩ4_gn_Zdun}$(Ȅ}Oŭ?J]_Z|[!dw| -DqAfJ'>4}l-|J2 =߂6MIm tW;O;K6^K-q^yoժkO{Vul.Ogfir|Q{ϔ1L{SJǴ͘|1wG8|~:-Tݗ>}WI}d+s}{}my]yx98>~c{hMlzyJr|l_?!o}'@Zp+ToS٥zb1o!]IpZ8y b26 ؿjaN8W4=h콤(}9dl  {hZY]aZkV n2ZMf=YwbVW;OܓJ1ևw}&RyNXſX@ў)Xſ;1-Mn<)ΧlwZ&C%0 Kl3o<ݾt>v 0Gchߧ5h߬7ba (_ VKn(C}??ƜۮZ73nvպ>Urxkn#EhhUZ2~[&HU.|J]I֍E7E6DtCq}d.ZNֽS.of]fOɺ?֥.ˏ%2&.dH̕@҆ؖ(#jǢvvx2p?óz~W""O|B&L[ ̐\O-?τFُܞB#p 9-:`"@7 ?C>j9o{3'E1uN$b0Xf[6C"\^2Ð k&gjm?!6ŒZmLӷ"j?EcGOU^MTwɟEgD.ݎ\/d ߾G>?OhiT*ŴV=?W gXP4:f<api0)@HTs k<HBڅ犽vKG/iG@RK|F^z>E}n7CCSáƘ 5W? c_GM%D^%qNN5i$Nm I7rL@Th__R9U͕Q;HB?QTb|AR5ȋoʿ@0]›xS縙qtdo;q|L5 f<ʡ4oD9,"Ps8ȫn7t]E:tq6H8ڰ݊ t{s 'E'U_c(Q񼷌Ds2: ]"5DW,JK;n2RL$ƻҷk2BY*v USgqgیc7GoXsgGox_wN8IѧhpXz1;^< }Uɓ+Q=jWvɦ?e6 ֲkFQBr$zgC]8gwNf^]،ʯ=GV]3||6ïc)=CW)ݿԳ yhѱS]f؀_L*"nc ')Aa*mK45\,:a^Eo6|79Q*N(j*%`vΚ(I!.S? B.h=>;,D;/{{.| kp\cvwb{'3ZʨŽ)C2/9ތVo>m*mxg6KxK_wiJ:\E2|*%`Ҕ| /%Gͻ>`zJdGe͗ע|+y[J9ڟ(}SkMɳ4VOSɌ>L |a|h V@4U~ JcJ|ݧ߮$:ԧ(qyO{)yͧL_d.b|GgތyȘ3T'{1veFveƸrw9`rq6s"Carx_Fbv?d~& Y4Oc x?ߏ׵b16s:үqїRpmұ8Rbf_d 09y~QnR{VsW,loXމØ qUvWjg.z&>7cw}ueMqxfa\oY؂f+q+ϩ:vXS2Pn%VLL1P bapf2RwEO^}AƬ,Ə^9.;m^R%ɝr`<89SpA{ř؞ {V;K'%NHFL_:Y\;<,:%+w8<[;wUZ\qӠcv [Xyvk /8: r U>R0%jX8Ҭd}Q>,޴v\r=žh]i^"sD'--NTut V5DžA>Ū6zp'R>¥? 3 Z5O_"d-芈RXjb&uy<ΆFMrY^ X"I2ԙ>+Sgtļ*~(6NڢG_{l?(]ޞ ODT``l,Jl6\ʢ$X@( 5Lᦇ+GYdR잕̱YP ߼*c_[EVoɡL.jnZ,8R3AH)a9R2)M8\\rbӁd"$kjմvzIvJҔ" H*FɏIR|1QrK xR(R7g ;N3< J(CajP0eC>p_tGPjqFkF/FdŶ߿bW#վ,Q"Ts9EE*^|h,  'J}”\Bs16c-,c13X1 {mﵭIDP69L0EH\ w+<{]K=ѵ}b)o$_ q@” Kiև29XG00A}>B,M*P%I4u|̃k}fN1UP#pQgF)H}UkMG Mkg8 .`4aYHnOۈi#2Nt{ڮV&~%U$:ݓq[gLj!;y.~"ж$(J w`V56Rdg 6}X^wG{S;tThGM7ci:=8# c1n,{fsX%W ӫ$qƖ|z[w߇Ȫr$aCc*(]M2^0,Q-O _oEO:q઴/T_ŏ:ӚC_fa28s(|[+rS9`StH3}G'_y.$e K`Ӧ!ʎXN xfP4ApK5[0*r,1V~bE/D`Yph*|cXGw Aaq/Y!= MY"Xƻ AKxKx@U6/GY?#)THr"\Z T,,_i[05'ZO1rcݑOHa ZQΊ|ʼ)z }oI"R=k_D~[GE`Dlg蝃pfXčm-kQwzu'Wq> ad3LuvlB8ӈ86t )};GW)aKUJC م%8pPw}u>~y;Ly H7}Y% 2+WE`DvC j HwnvCDnbD}J_wݮW}|N ߩ~u&>v~E/7Rma߬n8ʾȟ4HV>:)`x A]>CyǐLJsb-}AENjQvhU>.ո/&7%I xB"}'Sb?= $/T(?휛kPs7BG7m#-]e*=!.5_ 0) 7$3yVup5o=Sq{Y93j&]";Vp]+s(7r2϶ٺsLD6(_rJрlei6n`ݿt{VCꡜѾg[A8i2%uiޤfk/E,h̝:eXmHI54+=kvR\p(^MT6?R2Klucp\֏}BcEcX,X)aP-3Eĥaʺys!L3P;ߴT,+MR٥Ǡ{s͹q|؜6'_Ng5G/o [(iǂ2%=6/u9"@[%dy_r8/)At[ܠ{; "iki1tͻ"K}9iP\ǚh3Ҕ m/D?Y__Zy_o%|e.d/AփmsCZvE;T]~cwy @\[3wF(gG]QGk"-Tz+uhcuWHqBpfB;y pw11_`}T,C'Jw+IǮ +lo}E|=ZkE|{O??}(02 xUy2qG`qy#;N-b]b żc՟츲V!gWgOHcue6ovƉ+O|$y_ 4poq`#OAWI+ɼl{`(}FeWZV*yaf33.O3H ale< ^Ovv-~;Em 9 <-|R"_'{g󈏱9f%]'T>eUIj,-U3UR|RHi@6244nǓ>'}O3[O-3ޫf7їVDŽ~ kl"bh6W/vΫSq̺)x.)ig "Ȃ~7 @oan| ~́p'J%*@V;ހݚ/D_,tAV1?Ёk1Ra(Ym8[?lLJ(T2 9J`쁼x@~c4%`):oRBYsvܜ9{JsOËYoσq} u'?f0ST?ČxnYuD9XP)^Hx!g5~߈ӈ_̂A5k Y7-b.Vgo#Yi+T.:N{ _$GQm"|z{ǒb`?3CkYq?Yޛ+}v͏R9v_b_YF@V A?-<]bx\cPvCh^EKs筳+|CI|~ωK03Ma6{t=f? V4z|`å.ߧ??fc |bٵLv 1 /ƀdegsVzJ{*Upb0i< e_>țgu<<>حn$5n~cC9x_ 2]"?aƙZ}" [X$ڟu %X*b~.8eFFF *G QPW03yH)LF}eUQ2'D=nZ\ͅqv@wԥOZ}m?LjqBfO} 7/ݟN`8$h{ZaF l^qzv^ =xks 33Uu;& dA#ѿ,9dû柑s0|Ӭ៲ C?܆8Tq=ۏ %i=&[+MʄG烿PBݯ 8-O7啚0}hH Z<~J:|{^s 0VAcB- jV0/h`9 B{egޝ4 `620sϴC_&Ni>p,ַTgh\nS#>f¸ = .Q/%BecxZ)`p.O=@.y(fß[ *a:O%KQrb>yG\X)?&4|p%ecֿeG `,XԌVњCh}J ]E+50HT?oaeɟFGkUĨga/dh<0MPM~|e(4r 1p9Oht*:፭.ȖsA1Q#w;pZodaE%9yso;F|!nX> s !9ǜ @>5ڼ.= z%Oco_0Ć]ۥTTu Ou'{&R3k L)5:n~Y,ԿЯC2?FR v(ю /'b-Di샌j%UX9 vp Rߟ!>ˤv떹{K?e]WYWwH2إЈR5Yb=v;RV ` P{.MEaU˅1-\wJ€(OHRyhMҽ)Ey\lg{ wCϛqxAdCE $]i7MnJ9t5=m#  SA6Al j;^lM>MiPVyӽ:cV,^IqHSREn ZobaGfd79S2`_F$aß=ca#?`Jnؽ|u#^Wツ<"ʷ+|LV3MlŤ7.2*bF~Gta\ :> +FvC;)p4Jwm |,0|^vsf0e#ԍ1b M@h 3bثMYB[L(0-0~5U$[% Gy~` Tk{|狵}5PEXO 9 Pw8eWkUڿQI@ywkO[mͣ И#B9 Kf w\xb8޿ 7ZCx"\]w@w>1{F_-5__c`r]0-J2 /ȝ|3 KN4OYaфnХb5PhǦ05Ǡ.*Q pFqn^ymu>8ǺV7J5u9&${ f5.B' ;=MA À~Uq1X%"%YFJ?t7|D"ə;2 u|P߄22LaEcbq,qª <%)j^EzJ'PQ沢qOÈSb+ s+^.cڕ)ҎJ2󦡉S*Eh^EӀGC|d4K.Jh;Qb̒V/wƖ)+d)J΃RLZM{0WB]#o{o Vt>ЅmXש`C0#s'E7x)Ƙ։v[xJmٯ3kmUm3ةVnw浌f@I= )6~CP=+Y݉i,dml 5*l*Eݺnh2)ac^"Džβh()f = da\j^ 3X?[0:͡&Z>1B\qB}\(wb^;/cτְUT1{n?]ldÇ8h1Q+|h:6*o(13j,ppɜ>,2dt6ҲjC]XjdފTuX\s$#Gȉtk(>"&% 4cmz @^BݠXCwbⅬj.8tBřafޫfsBu7gl,$Vձ,d7/ uCXxh,K(l8̖ǿv?,?)-e; (vL ZZZcߑW$Ah[i6!Fe'Zf|3?0$3?`v^ `=Df{KSsn3Rg+cg^W6;xEٶSy?5CipZOGm:#?x#BAC?8:l B^cĀ|=<0Z lo;xXwtM ؆ ԳR4XJ1L^׭?'⟒kcVL̝}U]ڋO~f=贷-ؿ_ b!p{T4H8_)׋C5=lڟeSO+NAaC+\,a[3@wH؛ VO7 †ϩ e].cwe阏"!Wgeq c\ ,v~8[͜cD8{m׿CBvmXF¨#N|&4C~L#O7.?RGڹCi2e\qr81 /<0PS@1$w j~{0̷߃9unůx 08jk4{a"o8p ͬჳ0g{Q':.ރi$/H1crޱ8!7I_M<`u]`W.z|L}ȻGb._)6K;iN>+}o4f[a680OvvZ +do:;IkzG(I29ާ!l/v{: 8]4RN/ Zoeo ŒCbVG萾"`G V||l~]@:&ۛbۆHeCMV5P8L7XACgeC MMe 1,l3UB(+*lif24:ߢoԣl7o2;Є~}y^A)HuVIe}='͓LOgZRq!sGpBgܡⅇ~jEyax夰_I_!_>ޗey֌BݓveWcS[\xψďxPgoձ}ꟹ&$܂.f&n+.XK, d?WߥTA}BQD]tMW._KN t%ǬDv |Sbɉy[Xca[|=n;oAtM] 1B M_vo'43@7slP }`h+7r*ɚ+t/ D-n2-ЭgG~C_+=e*)̍?/?/9;S?ZIQJR>qޖؼ>CSXqC]jX:0S+U9YR~|y,O )y?{UjѠrbcȑo}`w]mj!fx*}Q^?_Po"Fvd/ 0e2A݋X}?{Cko6E{`ET$vuqy[HPO$])`P s rr޳v<\ML׳B؁,X#a1)Fd&xCKk QPO(]gUyI&5.~^;E_sH˚' 3$p*7ۂ gvxMc^2{4yp_%&~S r`(ʉ 0˄wH=.#P=vaGKY}T͛&K̭v$P2}{{H,YF菃 3߲e (^s~=lbSc09nyыnw4NUl3rvlE+MpKqJZM֜VYsZ܂V\n">_)Ơ.0IU+lLSvYjE~V!X‚-!O_0+CTϡ^aQo4sܲKeM 1r3xqCd\G5a]vg/ǴURDX &.I&7ˈZ9t$4\B"1<'ق&Dm 15@$V.Va⹘ڥn_gɯݟXϱMoAy͠U> J'-8_`^>\qaɐ_?ʟfAO5΅;\̆xs? 2HnQx%z9# 껻;bt.م:^eZB.0!2_9,J}pC)eV:'giEq-bV􅏰+MboG*J$7V ̢mIJd}1R?p ;(fBx'@(YH|z Axٖ-~3B }GX9FRa#2QjzÀPv7 ؒR#)H*Ҥ-INx।$&9$?[$͍wfV \;\N{ wexPoث9+K-%ΊEe*OyuĹ9YhµYa]jފW Lx.K,UNO2ųhv!Y32.qz\we)全ucTO%aZo9+\H/uJ?J k\N,U2c-UeՖjju㄂R-K#'L@Ax\j ]ѫѥqФ\h{heh .edI\_ίTVV^\ҳϪ[yT4i@wDU˪egIp[cɷΞZ ]RZ\꥽5VWMU'wiq鷥m Ǘe6֕:&5m\kLi|&N޵-^Xt|?w>NR\z^aVfKGh|^~N̔egI\ 9v=z X$KD奚x^OxÌjМU+5J (4! KAMHxJg lSe奆2PQ] jop;m И[Yƥ0h&`;O4DSb[{(ƥ5hRepz=Ӡُ3x.Q|=2 1tw c!rӥh<J[;6 >22$[*n,Sf1h_E%whd)%v?f\J 'b5'-RSSɍjzJjJ!RT 8.g.`Yo*M& )YLy$!倾0icRe坅v]Ey\NuuY@Ҁ;KNxhˈѲʭ)<׌݃ux x3y, }x|>oe;<-<Y>?i^* 3ʗ!!G38rבg9ħ6n]S\G 0l^=vN]kMzH%cÓfV8E7 =.\FuSY&uv&@ ߥ$?R郖[G0gVi7R U$*(D"JׂAQp\pL犁A/ t^{]KYz0A|5pw| yT?cϽq</[8؜8'p}-39y{-|O'=STh2&\"K/A_]޷GQ}.A7_QPdO3^1.u-^\i ]ѕBjY Նj Wa&Ի@m1(wϙ?_y Y[{%_D1̓A_&hIlf#4 ~. o5;>%'K)u+up]Yۺ! p0|GnoGp46Op^_ tā^>2Wr'DYO;>k_8'|olh8%po `Pn<pSC@.s,m<$/f4` 6O,x`E^\> 7#~ K_x >/SKn(<Y $n|:v}XgA<ey$@z(/M=n<A!n ƤaLcu డ~ '{ p~a) 8+B=1 p@o!_</\ A =G<Ov UR"߁<   \vr8DM3W$78~&7`ǐ60a}c2: 'w} "HGdQ@.gx@B;|X~6cS&s6ڀ< O#Ћr}} 7Lj}qK.4kM}fm6>KI> &3 =1/v|LPMͱjywN0i`~w/ۡ﬇b7f*7%h>&S aIR=k룶ϖAj~A|myXz U] *}O$>z*+Uޥdҗ!PҚX>~"_M}ͦzL_Gp!}Ѓ,;rLc5'<_O}T9(8ݭ@ GQ7($:Xt=?Q:;QJű&8TES$ynz + '2!+,)%@Lg5|Ӂp-Ia oāV_K2:w\?_'{0^'*]ߟL8Q'A ϢK!pK_kzRH-=?>@OҵIn>MN<ȻtvE @O ~6AkєQ~?Mo->E)קQg*Ї_ߞ=t_b>K1^O^􆱽5z?Kn@O÷Q3po@?al/g50"Za~|@<=ZtA3[p WhVV7|3}ӎG?}@?g}+ލ@_[0I 88/1lY>9:'~ vِz0ܨ;ms&_%ҎO< YZ}=@}pI'<7o5' gi:ʩ7M}x 6.*a0p"3.eV?&q# 9m~x,_e)C>C%z>?g/\h1Z>M{zH[ TT'N"?Ig~ Fm9ؼM&g kھZb\DL@gY%˷FqSgeZmz|>Y^[>sd٧EVRog~/O6_C`?NA?5l 5|} j@?փz u}B bIUH[z/DfW+>#cǏt>_h|Gǐo-=7,t}P_=<@OnPlfϒhY?`~TA ˙Wi[/9hǭ9DR\ Y.S竓ȞMٳ ,?guR[wYR:e|oY˝JUHUYvoGm:=?;l<Dz>LN|߸1G]*fa\,nj70.濵;Y2E G=w"gB`3 K82#w{ꕡFO*kn&4 Am`wpx= N%8`57| 6~Clʟ` O >MEo|G!Ep'Bp""fO|&ovCL!8T V\Cp3 H o7̥ Hp*!_$ ~D0_d9o0XמLQx%}cJ>7F"ɹ['O92&%=e%yBoCҼ,t'3Fd!s񜗐|{%;rX^lH)]Y,zj ))t.P ZWWMǐ ) 7-qR\ ť!9vC,)"F4!.+r<#B7)ݻ{_[(o(0 r ]Gxt0 WDS+F ܷP+ GB4ECFM?\1iS#*Qώ[ T3!ʥ~ yp^DĉzqlN4ˢz(~ќʈSwS|E~EO{Ϋ0"gu6D?JbkF"" 26"~;o"O8j7o{%/'W R#YIJqE+)"2?J;"D|ſɾonZ]Cwl1w&o67(_ڿU$< H/Jq_=b{NbǪoR=ެz|}UDžOz|վWvSW?@sz@~jT{ ˱!j㇪UJzj#GI]Q7táM'H|E]Q/G7E/=oF_PãAx.!} Ŀ;<}od%}. F񆆩d ZhDYO -~Έd Gy[~WJ?{ ?J\"EYUǛ{ַl3lVPә _EF77GG3Ŀ5B{^mJy8vAISN 1mc؇W%]<)YJ:/# ?BD3FzI;0Oel"6*v5N;#޵eE7'pNOqː+Jxߠ>L5? a4/W>|zyx{Ә.~'N@ ŒNo|D|GshL?ۉC4~ߦ~B:'iZ)hܓyXr;S_9>h1o1Is9W4Ҹ03}~!̌(;.iNs[<+~ȡ&(_]̀&{갺O-=د?,Ǹ{oFqM䢛vUgn}01Gnyw]seOSr`]VNn덛@JOΞ>c| ÷tF*OXϸ _xã҇~4ϔ[+ո}-w0C=vԘsٻ>Qrՙo};\4`gY̞+g?]1hz[%?Uis={:܏_~3>8pE8ꓻM$1ߛQ?,=7Q{?eh\|?{LnYO/Ro{mpeO 쳮W3pe } yes;UL~~˴Y u|Ek8ٺ/|w_>k Kiydt}j]Igu; 3>t, 3uĞ9[s'36?g4o}n|Yޢin4a_>ek2{O+72eLxWw~qژt>o=_:镳t^Kngϟc4DZbv):%jQnBu-XsLO%^l=]2]WzϔtaLMi,zր; oʗܤSS~=>J|i*#~?(C>,JRcxk>W"ʛ=_+A'A>oJU]}i-ޘ S1AEcSǎt}6'}joyB!Ƅ ҿ;]_̭4q7ʻ8~MSZGoyIׁbt]46}/N!=NjC,-a֨o#[jH[~\y"/'# UYaWK/o?_xsI߃Ι`|zڷ ?jط4Vk2~=,2W#?@~{RUˎ~Tu@vҕlGګy+t]Ae#QgoXhsodhjC LϠ4K IT7CחAqG(oC}Sz-\@fQoۿ1)ڳo_CB{F}Xg6my+:~dv]EK\-'i?l"k JJL,*˿>oQysgS]ϝsOѼYҌY4/"7/b1`òYr U|/%l=E9B$T"W+*-"K?F+O5s̝]sh®jj|chrL*v?/%njN7.!Qä4͸.;ZIq=dnAN!E3hyZ`Lӽ\<;1jd+kOs~Y=y zsSϚsܻ]F}t!D.4^3ct^$1{,Id:~YsG+jבϘWdNJ?p~D #dni8XYs 7{7;3n„愤2OHj IM8!OHjJ)XQcfhfhfhfw_YG rehJ2g̓͟1ޅOQ lsEUpˬB}FJFD8hyED4Qi TګK{3zitbތ^zBF GhE! JʊBFa aԴ͞?gv; } sJf͹ p(f6zXbYQ4瞞͞_VTN.OO?W V0e64f 3 7u ,δx4ϚM͙NbT`Ҟ5[Ŕ[ҏ=G,Dfc4;*:.%W0 9%fa,΁|Q^oZ))*rZ͙?uνp鿢YdִνR_TXPVi|AiABi@⹳..Y^~J / Q~#;"CeG }8n2h)?n<wHfB6LKў[ M`I' "S43v %p98Kl+p .D`e Y-oxx#^ _`nS.>"QYh'l8Q`I;N8ET .p.38[o65*Pn0VE߭a/c;=h<%|t lͨ'PO+$>fl#]}f^&Agބ3Hu>c t J`—g@ ?X _X=[@G؂Gm?t/?ףC#v#G"܏ӽO#ԋpG aM~Nx09DsC ?~N nsvs~N s°p-9at8 OF!@C8m8Dv G& H7|ڛp2ڛhg7} ?%|9s΄S΄C;>#/@?' ,/NEO"?ǣ ;G F'|'ڟsh7 cn!| ڟp=ڟ?qhW ߋ'\'FgkA^'|ڟp6ڟT?:?t?Ǣ _'<O?//Q!kvBoRW]LwkN'HE3n_Jn)%zDo (]#U]!e]"х'9-љ!i*$щ >d_Jn)%zDo (]#U]!e]"х'9-љ!i*$щ >zTDwJ/{%zDE7Inz*2.BΓΖLΐ4NdNDNhDY?9DG\qjclJ` > &Mv'zZo'C&5}t,x( jT;f}5oW<[Oڥ_Kesj<[ky>VnLL B7 7i*s;E$^_ҍ_YT+dX놰10!TgVVCJm̻tc@׊ǮO/?ҥx\#E::8N;~j0.P~ b7E]i*oQ牲S06*(3MrIDH3eOЗ?+J~"l)`Pln y&L'}nE}(}o  \ 6FW19oDˀ6Je}1W*}? .ͱ`GkK繠~N#1"/;7@& 8 ۇ־#ڐC6?9L00ҏ4uU/||">r|.'hIOsQX`[&XrVkYT.wObY_15m4*HGinKiG|*u1ĸ %Ju?Y/tA7#ݗP}t'!?629E`|$Lȼ Sؖت0Lͬ2[ ģL}{0:nkR)Nb KY Pګ$ZܚWt^{^O;}p. ug.)>ww8ƍ cYxg9\S}E=|1/Em1 ]-?CG}F-۝T.E~*,B8ͦ|8O P>  jP傉>$8(okziI \1]ߩ}MsH0i(QXY~?k}>>tSN#80v$:mڋATos0RD@~N4'MFYоblјl_k_Zǘe؝\ړAS Z=ܯtv8Ÿyַ 1FunT$bКQzuu*6mz+-/\駲d k(д#ܟ6yrrxSx1.7x{m;vxBQgɮxߕ6uVwe[U 9斟o&QJ5cx/srZ6_-7, 0vu=lisr*0^և|4ki+U:5 n3m>B_u"giʡO~4X݋r Z&\]I_lgAݱjo>kĜeDShr$@.WjeMA9Si?ah}+}mVgC~ܳVosHk /kֆub!7sw"k3N4UEYQ]op=gFmGչ&P 쏲|lըomRVo3>G8 }=Jhql'΀Ǵo!~0|sIOf9 I&+q&]ٽA5&=9ɍgIO^=xNv'9@֬oI_a/*PMzJz㍠gIOY/z#4驈Go6rMZ~>|%V|1[QC?__ mGz$yVKCavocLƘsG0. *u|GhCǔ^I&6\ޘ2rEzjIfpZS{&Sv=:,~| Iޗr)OMɭޞ5QhOit.bI|n#}Zq ĀoD5<ѤEv|Ga/}a/YX /Gyb$A6hr'浝=cm.X٤-[+i0Lm٠?LujP}fiX*N5NOO=صx9 VuJe 뢖e4!2%}PYlDB0'6F}m;cr@kT$Q,5ZZ3NGz+~_};k}ҡXb`l3IeGNM2LMZ:l!X)_J'qf?Rck!Wj*эj5^M*R|s֤&4,}އw+ʁF8(=}o{9V@ ~QGWk}~/n/gbmY~!^-ݛ"S먄]|L+_s:7X6S|E%$Us9t?*m- ]U(k۵~L{tK\r#y:v ˚7E:wtHK7^EDHtH[="3Hl|fֆ6KnGt'x(2~NuksZ+ў4go'WHڬҒ 7*ңO܊3ЃI!GMHG`nK.nԉ ָ>a5N"QuZu 8d|^: XEzZ/UYTo0mWSՅ5tnnQH6oV;&9d>iA\"$t.IY)]Z:}_%iOI-g #6- `KQkBC4;Q[,hbUBz =xz"}'˪wgHʖ2GJGc?/p]"L_VƜk4Hہc|<kz#7-tL\SߠGmm:]ͫcpo o}߇k*=&V9Aagddq/xO`-N>7 :T&߅%3qƉJcۉ[ EE~GPnjxo/;A9a%x6Q]~u`~X,ee_$l sfEs @p/N,] !S(LL<|Xon6{1>_uxTwF~H+$4vikvƿxslè&XW Al\W _ u=hŹ Pb'j m^ضN5m`A-Q2l=ka0TI]&& dbdd l4'@yLI&2OdL264h Z456J~La͍ یp`¿Wg5cʹ?F.,>XţHs-7h^kl. ! UX"òN,XENEilC ޤg?K;bg9to$Oc9$vALܓC]V~+\H,bKca#+vX5%>Ҹ ]3ڐ=}:UN.?'3okevb-n7- 3^q>=cE *?{,=q+|Q>o='9vFۜ#k{(*uuciI-hUjjwMV&ޑwg?AՏ"_[@b{2zyQ4N(OM2}Gs yƽX;c<ѾzG Q|\ism9˫N|Wj{⾞6\=fw|qD{[&Bqvnӽl﷛U#tm{gmUڤ{U#`bSKF9ooT}o_wy0hNLyDaD;ũ)##DhkߟG}dؓ_;IM3(NM-W؞}`=6Xd'ڱܰ7ۮ4Ǔ[XXw00p- p `j kU+Du9 pR%wc` bE"Zy|X|Mـdۍ8g~%a;sc@" 1Z3N`_WĆX0:#͓~:O2[9yߒ5N#nSBmU_(> yiǛ-1w9o91c?9?1û}wW^yX~+|8=ORĠ=ݚ?.nrߢOۻBsE=D=)s cUcS$d p.U^&@5xI_N> = 󏶟}}{&Oܗ=cLk;~oy8s|xhMʒx=1Yw\xyug\va,x^ !G{lY|}z=΅=fY/@2ӹ8Vd I֗?=;dTz-k053i_+~%rV-w/5~Q׶QvS+ _q^H#sbXk1hVa;>wS;Qcw8p?Eq1vz&;QR?Yώe7hݻ-λd59, =,YQ?ߨVӽ@0ԻV󻓴6՞Uhp+TYհ?mdۧIV'1wQ4:i> tMi?osc[_6Smt'ׯsNCCmkr&VFg!Iw;llS{|c)R;g~;ɔֿyiןz7|ժo}Sܯ>!.aCW5XoV5֛eLBL;g*"za4 0o;nwrr!;v(g 'qfms9qumqڶwipi}a{nVsO_d3w[Z8RtƲZRcfw1~ ٰ_e:p, 9D>ZZ 59Иژ"]C%& lצԿC 9mbݟQ>kc&=tcҒpumt(?L[VEmܦum@φi{vqߐX|_[ԦY"NPD9(pCk w~<#h,m %84 1ɆMf=_5g nZW1L܋yJk/Q18M)|b"ʔzPt;4WS:G˰&%tt?BU2;HߑIxfUj (:F29u]LQyBȜN7 `]>9]/W~ɟ@?koX]7́E~+pvUЫ'zs.lZosNPCr4gJ1kq8"?ٻ_GC3eH3q4رZaU)bv}n@1h7ɿ sbєl2=&ֱӞ烍F)M/{:}Qb?G!z \'\gDZCo׾ئ?3Y\Dz >$I iq\v{e؋bsjIw֎ ~L-%z?oŭuO?9нM*}զ}(DŽ,`\z.5貳Vjo#XQ9# vT4tPqZ]Mݨ+O}u=OV [b3?;FτQBGgolK`LhgY JGuJt9O@SB.Pש7Oju_Ɖw,,˴琬e^ v$Y[7v;crއr;[37@cL,$K- ] E0MҕzХȆzzJc- J'8I{aGv9=Ma>.=J 70 c 1{;ߡ=Cڟw[ȏG@/nzgZS;2W_41@sC |d>c >b_N>w7&/z$q轾1,6z1ۊ_Fc;w#lJ3=ի|Gc=:]ѾMGhsQݦ=tƟOvC}{R(W~<;K;H}Bsѽ+O_ 89&tHo߅=Jo71槓٭&Ml6$lv3ͮl6ͶSئmZ@G&$|迷ɟzɑCMH4M6 ۃ<ʿ"=y|p(&2l$l2,ds/6I=ԣUY%;+$n{6Yj&wM.&s$ՋM'`J`0 8- oЛ朼M5j&眄MEyM&)'`=`&J蜍4xj/Zryxݎ);oek-N-1k{GNl=|q?AאL!uP7pbNX2 ])X{8j{1w)ķ8}OAy l+b; { z2{ w}ᩎf*})C]\Em*?͌e6|TURY;~;~dGߺNn /5@;󫓏7ld Nf;"fb?`XЛfc"M6b/4lB$Dꞷ8sJ,+>y4j_6y$l2llD/6>Y/ d/f"y6yd{%䝄M&Mzl1<2_v8y\jh&M>2MJ69dM"Yt^aN&I&v=SUv.mn͡v6{@7F shϣIu"ʣ{j>?jZt{n#yLjDUavMk/ b]FiX>l޲f:t]yG{ԋ+~!efGbɎd[Sfedo"ے# _tUc"oM]7Eqv̲ϒC|} ;,3?ljoSª7%AqH: U>GvcmvzͰӳ7DҦ[q{tdgNC$6FS%ly!L܂:֘ߙsdU辪UwEU۸crQζwvߡ;hc0}2mHG;}LgҖEWg괶<άF``#c6&y9sbKi?(Oroe?(iK?@̓.sId0oצ=tu6c] m׿+ldoUf%-":?C柋cOgEYȟdm]ĎI"vzog4v:Eqރ bS2Ѯ ԮKbs< 'K%_DcD1-m/ZSv8;{8.S;dH0`pIJEu[ѻ8Z]8 NoziE`߭ {;pMDIkm&P6b2ؠ 6Hl@}0 (yzS5_) ZSX:`o.kŏmAvd<'$;`}uj侐:g< 2Mݷ lAF&[#ůz-n`"d0}/0 h]qaQl'>p8;&ጓjt;$Iv8dD}S(v@}S;g> ljx;M{va81;Ⱦ^?OށvHC}`@簖l]ca_/~lWL6d5'hObG%l=]`iIM 8@O9yll0$lpz/6ȕl05 h2𦓷 .lx6@t. 1 (εFA2x0oŽ>͘6L6l:a#)Ϳ߬gEϻ:+4>7>DFJq&Ta wa uKe|)n%*my1L^g_m5n] 6o.@!hPM>{[a=φgÖ;UҽOf/z{L{ma;yyB.3J)0yB6&5>ϐ]\0후tE(eM$JY;h=_V|0!eynPMN̥ݾ4#J͚Ysz*{hks.VOezS3'}FN}X݌x)4¿fq/O[ 39y r)ʜƦ8ks &ٌ'M PtL ެU8w5{$C%^|c#~ۘzY=ZkMaM *LD\bMSk=rL8Zh<D?x&;xvM" xkpuV(<:Ki?xM ]2>o3=+=G 3I>x5&^3xU;+7^-#xs6^o 3amAZsb=^9}sDo xV3Vw'kԤv U7}3G2 N~[l╂wx5x%]G+^xe&wA=yL[Mjm^7dZہlWl&Fc kǍ NXP ti40 8`! PT6ў ֚{vNT>`g[}g(nJmu=*kµ r k =g)8؍w~meVM%pڰ8 8 x#>9slZ_| Jq} 气1k:1^#޷IM xЙT4nw{t0[iX'3M2]cFkA:h6" M:N޿47 ="O]A|]y,gS~I,xWiRs3ND͠oLq_|r 0o̙pn^1}VINߋr;R?i3ʵ"ߏ[ߢAf#Ku3Bl68%&zO2&s%U92ޱߍ~<0 16ioc}a  Aӻhk1΀WqPNނtkMڽ[S=gG::!VF2;/KkO>taa\ڝMyQtwXg u#wecY+g1(v> e)*USizLJKm?O =CͨGoAvd#:i.bӞy;lҾŪx~?y|z1aCS\-ùݵ,Wy=kj>| ^k4MxS/5t]AGT3#TWEA)Kx={ImkeYpKR;t/Qe-S" ^?Er1 x,b/( ` x ^J塶͂*x"'GӬx_ ކ(:'GAC7׫ ĪXO5o6j~;7gr{IovNw {l}dC a;QL.hRCG2SY i'~] Q ЕDK&iP{H1C(e%\QVW lpVG% ^튲QB|-3"GS-C.&JCW*'><& o'g-Fi5{HmҦdmIB6!lddB1Z!(f ad-}Du 0 WȖ=;̓d˅lf٣-)ҞiC~g&Fގr*~ξ MzަԖ4^VѦ{z]J:FUԥ!$lg Y}Od K鎻 ӄ|C>;3k>4qaʓ<6T#c0ʀΒ/DwAs!)_ԹdDx4URVmB6/l"q:v6MBFe?S^JK$h0.-H9HlEYT͕B,45L\$!tAv|YL].e י Țu!w]Ф֎0ڱz9b.DF_Cpyo)l += y=vҀ-}O3P؇tvj dRu=4>i noblhe,c,1km=ʘ8&>i6Jaݏ띏}mk-c}f.V=2I+,r5(?p:\ŰcV3ؾBLF݀&=$@˴=#aMgnA7xw-d  PCi'"~\Ty @'h?`/`s3tHx(kr^l@ȻV!П̀HV@ tBJ2t7~O}a^nOy悟 poH euIjr*eˌ7VGG |+\H%44' D%4"ٜ0;iTB!#@0!! ad H;^>B!Ms>6 Ï+݁sӳ%ye=|@=eyij>b~.ݮ7rڵs./rm3c$9={†9>w`54軓=v8t_D!>g0~-y{pv3~7Y|_V>P0?i-F:3Bz4/ AAKt? h(A͂3C m͂ zw}aA {.At/lNә!VAo{ ޙlX}r޷wZzNAt=K+~Js9=& z1^  >! l/h/^г=l/B   h4Md{AkUl'=5dAA_IX/# :/QdA_D4:/IpsjM=/h_Чݟ/dA[V>v Ϡ>]߃k:\Nw K6Amt+W*h?ASП.A%Awй~Gл@ 3S:'VAW Uؤҽ,qOpӞIbۂczt?χ*ݳ#q1H&m]#QN V;j7V-oҾYݷ.ԧ7w{ &ZkX^FXȀLzQ67X+}S?< ]}W.Y-dCؘʑ7 o;h}d"JTyw1xi,'yj?IXY>󆹘@|ѷiH♙ݟ"tIN/R_AtVXCDci I0rC%Dpm}2q_IԷhf(_k4ZDiZi <]3:T>"?DL*b WQlgT^([\?5F;tcAB꽌٫\.y*[]lE^)3guZMb` iT>=OrDO'O}R&dluoVjߚxAM=_q}`{nw?*MsJvhlY80m9CC!9$2 bqs+@/30Mb=q/;}:γ3bVq|&@7oslZ{0 ֆ=C?|w'sתvUzW z(ccs BڰO(6>~/̹Nޏ :<.1bdKˀxT v:Z{)$KA<,=Kk)lhHxy@6j^HC4?|i@sq5?gbMd\[{lK6[: 1L_?kSŹ/t;~(x;1~m[]{ tԳf1vϷn22qYc/t=@1a}E;ǪyFmTGRQ\^M6ARne<>C90C9>|l>c?eڃ"ԯXVw Rݿ٠1,? K 9\vK<ޏ1L %y]ՠRzV ~v?cӵ<}%8֨yE VfBA=kQʶ{id.GYY_^x p3`* 3oL?qvq_0~V{2[zj߇8 GۖY%*cqOi]4ٗ.Eˣ3_]6z_9/ЧsEy]ieX~CcRkrT>ïX-N]c28v5/=ēGczX܁屘|QI9jR]>_4拍C?*˞~y`/)il!$, -l9ak${hwH$݆е@JQVw癙!xrDȖ5&B*E.Z$$DC2&Aur"mE(CknVAZn_ݝniK[T${yfIBG<9Ϲ~.\_ݣ"gy|c5^w!>kRm!41-翮~/gZNC)M~)kJ91bK1|͐ n]I[qzfij}+\ riv(| C [p ߘwkgـ 1 i9 &=x|EW}%UMFlɑ21p1ѣӾqtōSj'Qnh{{^50so?aa5:Eb}>د~CM_?rJfΦ/mE1m߹|?G}K׃C ܋#"Fkߛ>᪯*] l'gkWXi^\4ٲ?IXE\K{tuRdLsA3C#i~q mig#Isa3Yosms[y'$?@_|u{oё9^xB a\,r+M>s=<Ӥdm3U)\];{G8c{/OcF0u>=҇/OD<=γ֠+8KMsy=y 3?̉' >t>ۤ}0* _b({FDi8܀oM-~j=hXIo{4A?2p pl!ǏNzcm%?ڙ7'ǥ_*o|S.*ǯwި >eeQ{٧H?sݲ]zf/3 B݇|7YmYУ4ϩuF^_>,݀v1<{Me]vB< ޕ_4,܀PHC=_,FTooO^O@/N.qk5 W>sD#GΏX̧a̳$R}gzkJF0I:c;8m(#rJ{cc^~nrΘ@`"ߜBQ~*GړE_Zp0u'cS;5z.o y&nIszoD^E(O8QakuĿqH  H Xۜ7(m8p?rnX3v<5QfgwRh'ЏHTqzH1c\y~}PMQh7v1qm9 Л{ѶSvD~Xy^S:n;?E_V*@x9Sl5Ngk_SދV#|kg&g޽_¥KHx-MUiZm7h݈0:[Aݾ;amYڻAm1 Bfߦowjgnn1>pL Yyu9{YVt"9՘;9ۡ?=7;s~瞛>=7OwFs̶VW^b-c>0ۢUq/tIW 1tza]m[S]51ɓFυykA6hz}8uN=㜻ٟ6ﯥM}~_=dr'+t-NQ'񙛤1q q&lr%xݸO'7u]Ien9MC;>8}UϠwnHw}m6O$7gG' Йd>DpQ>lZɇ n%ez}+a[? }\7`XN^ae[\r?@cv~1޻ym帧kKN$Z@[1Cx]WR߅>l$O8xlOx)#^HxIoxK|'uk!1A}Uҗ=b[[y[;Dw[r}N*99Ϭ߱c?߰^7pL~=_!u.[7=+JX]!X̍R7Xcϭ8m;#؝*1#v~,oKSͺKλ Yy@}oY|z[T,!?x}HV n//+Vj~Ͻ-1PHwG9unѨ g ?r$ۗd)yLԫJoDݝY}fy_I]c-!l q 4O>"D{zq}fqWΧ㯪7Yv厂/r˒7;AHb?Qz^M}Uƫa|65rC$|c_h=S[xz)Oiu!+F" M'̐V\gAx?{Iɣ uo|k^|R|xu'+I/Oko]ŷOA_82jwq7kQ ^ AG&nkj5c6Rv/W*c/E; ?gz[o@!q8eȽ%n)kg{&waZ2[|.wPYEP'dw򦸷rOOT|4;+>"W%EBU[Ý 9oKSȋs1O%Wn\Lhs{Jypppw>bsC?D6yjZDoLm1˵JffGoAةNF蓷5ht{v8`j~Xg~kHMt.1lO+^:m#6} g;Crܿmp_@c?BC!| D quɗ9>oC&y91gIU$/>.YW~TS6>0[eڦWloěLvt.kSs{a:Ac>%XZ2oՃoU-WDOtKK 5/7T#ik+G~gǴn<kW} TYxNW/OW<˳29HU:Vd㙯y~J^8Wzeס$DZ{$zNof Ha|g;Rh՗+{$)دg_VgFƒkq?,e[FZ?[gy9;e_zzǂV촹C9C~V:lz!av%lk_D{Δ%: PtSs鬚d hh&[}E<?М&&![$? @BO<ƏD p·[_Jb>͒ ѩ@G%vHzo#E@O C.w&fEړ>xI=QrzptYCiJx@{ ݦy/WR?^ٺe&z{-o/s=57sow!>Czeg|^…I$'bтb^ /+iqcs?Zp!_t[y*wzy`8 kp2t=)9ֽ뷕&~%}r;yU)ҙv$.q> C$V9 35&wM;A;tⵞO J혺 I~2a5 ~Vh,Hlq䒘Ǽsл{VR/atK#='i tDZ?MpoV.d[MK_@&\ hXu-62/H3b`̠۰=X[@[@2`p!.:82"!֙S똦X].yU t`uÞ]tاf*z`xxU{tp/xiZ/'JP ԤHbSʡ'YdI!y3i{XGi͖y< t D߸.>L>:q:# V/Vjs^C5|lN9geUƗ?3_Nz/+@] |1%ėA/+t --i|yR/N)+%8q;4+_cK/yRZ@#"֑ OZe9W׊f7bBT|L? ׭H0>cl?`G{0) sBoM$k=q36'YdQo~3#mXw 9Mc͝v~d~~WlOǧٯ`ݝ8wwE[^ד3Y?Sx{x=PCZ_v7)H\V$Ý&٭Ogt8UGYGp_XqO#"m=@[=G3"hpwR^0vĹ_ ѝ̕g$GD[SM'B~~lKGF}k_ew`ا*!޺S1"2Qړ6*UbmKIr:rlyy5_}p yb2A\i|IY_q 6j!zXfKxUCu'+3B8KzT?"wP€>D?_^<Ɋ^ zQ:'ɽUKi$ 'S/$W"5\xJ&q0-XM,MxNЫ.VB2MsSoLӞƮ^H3~yvZ9Oo_X%|3l͊?_%xRo 8ZaH9ֈwt(k4K'&&A'ʅ`_Y;ߩ$ܽ-7K~vY#g.#҆ݻ2&7g#]l(ʼnC=HQgjArNGz%λ=^\ AuZ͖ޙT!|1+H;KU(]$J"Y D XiNl4 S6@`A6 V5i_uW1}?R~$Q ,e.$2 :8g:\o{WkE>m.n&NĻwYxs @]]?:ٮl`G_vHQK>:UV|P)>fj>?;iϸ\,yV 2ظ((yΰ eKWǙ1 {mz}?Tm\+ ﴋ1\qϯʌ)M\ B=eFOGvwwP~$+|egx:y<%cr}*6䂏["sGy3. w8@}1| %JsU K.yDyEOЅK Ƶ0֝D}vk12D)CBpwS±8QS7J' {O#6w|[U N igW$hG}bѿȢ%sɿ'軶vH8F_G0y뀺@G-}X%,ϧp+J+W{+?xfL؄?Cq4lyٰ9M6_y Iܾʼn+&A+ ;휪 ':r֣oiw>-RِsB˹x .4).YV8@gi[n#Hr tOk}=ۑ>Ů˔.y(i,\U* ' .2k )9X[81[ɸ6G }Ġ&e\Y2:\Uo02n :'n4??*}4 5@bSV<ђ/Q^J]s>+؞M^tQўL/'VM`Vאh}\e?\c] 552s)t'r%"Oҵ)W=˴Uv5ddCZy8+Nvj},Jr,!.gYC-yІ-~kW42.dYN4j YjoL\ x;ڤ)~H݀o3E')ao6ۖp+γR{;\XTX_*X噽Wv5gӡ屯I4IS={w_x/gAy\gz3ʚҖ\09Łfڮ vn#8 56[QyeE:SY.]ҏIK}|AO3a_>Sm>yce:0Vy<U$-ϐ瘩kި<#-fX9iaι$s (viox"*1l%/UxQͿ' 6Ȃ36 p @?B ͢FJm3[3%3m3)M!!bO @8#lE8+G(CX%}&_}:p,aD#΅Npͽ[^L6Gt>g0)_9gnH!;ٗ(H9Re[e&3mlu|Խ˳eu+My܇v:ΞL.KYɽL[mg3&*{[e^`g~Þn@rַg'>[Mg=|[>Z42iqTas ?s(9Z|GcЦ {»l/U!7l7'E:Aސqaяp{aw+ xvvyk/X @OA~ƙ5^|p\!LO_{=_z=}Ik;%讙:>a3 /C:}W1Jm._J<|枭|=1A}bb~b,p {y'$zLhs_:_WQ٦?alBKHU"R{Wr}5MY{6iR-~G"X+)xydw>Ar}VwnP/޽հ=>bi?чBކ*]$e2|̵M$wk?]u5uԸQ#7*y0Sr3uUh+O$D [VqmYʣ'\zGr񕪍PGW[hFs2QN+6&w* c7nK;!V&I!@ͅvY7jF>r:U'UY6&*Hq9^ quCRT$=UߊOЏрs?~1{ۓiyGSV{)FNiϡ>o9yFܞ6rP>sʹⵄ.K+ #|San8R`='}aKý gg3Ƚg N3kH7A@oQ`HXk Ka?AfQ 0}:˩;"]1XoQg n_1{3%e(dr}%^GHz}9"Kv{~O!cܖ,{1x`i tpL]e}OxD8044tqU+6.b٦BʌG/slGn1[c>54#GއX1o KGu{rK>Ku=sd]7iCGRoi 8x1Ѩ}i =FoTz|~"ctl:Fc%\ZՑ/a0_Wi8H[ `,nѰ05,tFj8˨@O_qt~<[kON8bϣC_6ysf=:m3b/@u.B\'}'<mPErJ]5LuiNx6HB=Hw^rPo l])ߥx6,GژKM5iuGXx! f=5RwY s\)RYL|cOGR2s=J6~6KiESLl)3S#kIK37os.iwzЏɖmҷ>gx^\ֿUbE;S>s)b3}Gnۼ2r>|^~xHq+=#۹^1oʷx 6s'xa^ُvۓ:k"%{ 1wG|x >gݐg˳z3]c) ʠחC;rO/pg))ލ_Ye!X ({d_ c|j& RgKVm2UE5#B |~gQU&uekW8{<@nǽ%>ݑӈ.LawN\ :Q݁~?8uu#֙.>U.Y: nM}Po~\Ϳ;@ZJ߽y7X{]|]yњ~ݦsB>@@x x'; b|zݍ"-y1]I2hG;ڕv:x|"iN}rFޜ+~G?`~L}d*A?EAJ`0}dUtx{ic5Uy ͬڔZ:xrou4qe/Oq'G^'5vڸg,cc c'=(K_/Ϯ=}w/쓻/<9}zddm+]R[ÞT~3gs}V<_c?a>}kM\}?YMɿ5('cOKwƀ렽^kҼ9ex٥:XVsd=Y&5ajR%sQߩ xCm Yѧg-uP7_(b;G6Ƨ#LȀFQޣ"`N[e¸+W,W3z'093֕C}DO<|?+0O5oXs9.쁹I#]|,ϔG/E$+S3',^32'9PozgQ>O+-3ٗ]6ק?sykJ9|^Zyw8eQ.O7hcmm*$vi[\q;c$O;4'\=َr[QONq:Vg,~m~=Pch ZA5SUo[=#; lOۦC oW ;# ٧I-rH|YnkܳB*pe-$qmB/HXw}8 }G͚PrE==^=~)=5ߌ(ҷ >OؒϢw̷˻xɓwͼo+9_q_SiuG=x鉏3|ᕣ]gx rkEZߠo?{/w_ {Vp<˵H6*\]Aw y~L#D~\+9%6_CyyO1MB0ߦ\y#o)CbYSƵM6(b''N|'{=-Q<ӿ[py;au%սʰ_/=ӚwN= 53FnB32RwngAɠ(w⍬3Ne f*Ӿk\('iG󁹺-;̴#~ySj$`v叾(;oV<ע<ũSqYG*Ǐ~ǽG{>oܾg7q<Gәq~.‘}[׮*/m߼k-܎+q!+}`G3rYWryw'nOPY2zEkg%6S* ڂ?XgxqxҋvϟesLa 챓796M/zMS Ok8.@й x1~ }ߤⷱӯF:V3v>y37u&>Ms5/#:␄w,L6zGu?79HoI~MB|)E<`7SpqG0ǶuO\!y*N+[{{J(H f],e/mz9Z(}QG.qϬ}ZGԫq7b``9nC̭ ڀ>=sʦ~=80uw2PUU6n}gYSUr:]Ck_9E[lO-_(a|] 륾<xxT{w1F^+sM'oXGOl{S(y3{ϑy }ZεZZPUFe\tOmcCU[WjmP565|1ToݲVk5kѶ!~˩G1 PS[Cs [nX7l UwhyC]>9rg(tYkjѱK/4pm]HM7;ʪ %kᆶ53skC: pz /g9Oޟ ,2˚M= V|}FF ۚZ7-[ájK0&@Qfىt/ڶt+%C6(SbZHʺZ 4o`/--h^V +!*%[xoQ'Pۆ@|p0%y MlMR /mpW؂VZ$*V$E톶%/7.[]<ZkEKC 8 Hx!y0 9=es[^۸"YuP_ו:T%,-Ք[ »ƾ)'wޡL갃OVCgX ˁ3 +4|σNnh:+{9d]6s6^wֆZrf罇|L4PU5A^l.;YPb6E@4E=p…\V[j!nqA<}7*URV0ilX}gmS[!-^PB%Vcs6-~tzLG46UN{YuC˚Z],w AJy^1N[YYik0U[f6SZe61505U^q^τf^=c\P`z8vTbTEi L|ږ:2Jt}ly08zA;, ,om*[UKo&˄SЦԱ4ɤɜuZߚ*( 5mͪ8͔˥GΣ  09i /:Ȍ9uz11T4@̓LFkִ2st> .]e5ɻ~pY=yݠ:PofX#qHAD=kl=p`He~vt@!\|+eD >d\5 IlnnpsSIZ~ >Ȧ1M-h6C&jSIzi?w{r:oURҿ{̛+ʣMeKw5o%z: 4MSR&;4I #CA:mͧӇowEnALR]iiOo6;ZۭjiZrCAlM, FQ r}$Dn A+*Z޹8vqvsM479ƕC649Eۆ5Y#F7;]yZZ u k2uF$f#y%&ZʫTOƧ_|2~ s(춦 ke5I1-4]nbH \+6 "mgYR閆=ty~Yf^z3!346UP79 #Vuh!fmhr/aM tt?Is.u4-Z:Ѕ5 ka:g:qx^Fe`e+"ҟ.=< ]ZhaݸVL2krJb-WCVV^bAKiqVj iwZ 9/'>FdGGw ~{|7dzqi``+-CCuHo 6ly-u7ohjTZjAjނ%sOm˴a>tϴuRͿfL x>f:ü.S-2F~ С+߽FWt "~,߅? Cx.Cn.E}U?Cnz,R{?Qb*=xYH߇gSxóyݯїE*~~θ'W<=Y+|T/_Y#t<򇏫x7}gxϿ#^WNFcEzT_ zeWBϭq3}#D7͝{U>/ɌWM~E匿n 7T^b6QԆjW7 9W#H#S+6%DoIO!'um-yih2uZ_Jg[wfE%|%&SBw񩹾VLHf굡~ZWvT˒ʧ-K:w֡!V!k7ԡ7mꓘULk^O+P5aS?UZd䇧t(s}'I#G#ebN!Q>ic C~qE*;vɗv=:&/;9fKx.Cy@yzW>ro+=~%7!|+Ó1'Va~pV+F"^9+Bч+"򙟎ϚtIݛ]O}O7{|+olϔ! Ż9Yәe߯"^ !z_??܉xkeQW=^A ~/MrW9k[qQ_[p:2*(;m&ܓo\ on|ݟ/Bt{wwHîO ٙۈwߜ?"~r J].95dSxWZ9ףdxo3C^!"qd祩@o/MPߋ+g\ *ޖ?oAhS>cƨFf'o>bXwBwoydv_A[^ͯzKxՀAR#M_lx# %GZO~]:~ˀ_@|+%ׂ{TCg\ y8Bw@GC%yE]#T|6ьA$:ޅn\/ shyfoߘv'6!*#gY cyqU}j@?`7:[i@}.Y2&D^3@]~G|Վ߸<#?~L^ Ѩ'-P߄ īukyw?dr!^ }Qg?pG3E ??ˌ4}5,C?u@q2q8CVOC="^| S~7dgď] {W C} 3!i^x̆=orėBO>׈ 3/=u_{{@O{q٘S'oi~:UK36od!){o3Aons?G;f(p;0ֶ kL ڶuxutхWniWu_׬i`zj-+iт9s:CV\NI1,LTҢ54~3nk^_ݺΦjå%-Ԣ.evG5P^j56wrz嚖PRY[CmrU/>oVSfМ:wWWm^$h]0зyrp8_ZVV]-j6!YmcsrEavՂBuwnX/iwlp<՝Bf^X{@^Tmm ;Wo[vL [B%Ԅ9!/?W깘1AG>JdN3N\?6\ 8g6kfjP1LM] õ&/}FWz#$ʍC@4 𹆦.Z6 U]sVj;3Loڍ4-QNyy]f,Q1 80d:~K|C--%4H2>K'mYݹjXWۺ9vNNvչ{a s;n 3Hȗ P݈Y ;j99!5tO|oYP}kӢ B ²iCmM6^o?x!s(MH k Joj6Y5oQ>3_ yi+tsQy7V(q$9 \z͍u@,N\ 4:]uxHҘ-/ @rOO R mlせju\ݨ[wA$OM =Ys e|-C. 0#sLx\6 Շ6޺1Gރ3eex5)ZJRwo(ҫoPelECs4 ovjjΚBAEўV uEY%V٦{IpyTɵZAF2`tG>cȊ9"j,!x.B- wF!DFnRqDFaXbkgUq!ӑ0+pp*Piy#ϠUWo %ȹ{Z4:F,J:<ȓY3|Rgn`oKP%Z#v0Txth}p0!_r&@[}uP g9jcY UYc,2mY:dp j\Tn3q4 .P}ֵ2./1ts-Z-T-jWlY:ĸAL@i 746sA^J~x~ՙ-b:t~t0 u\Be}5ԉfd!PK bBcom/sun/jna/sunos-x86/PK %BԦ'com/sun/jna/sunos-x86/libjnidispatch.so}{|SEMm@F+jպ.UTX+hZ Eyt!塀śh`TQQQQTA TZ\֭VzcVPywΙ$7~fΝ3gΜ9s;+b[~[[P襅7 ,KK d) <n?sr j\+ e.HGق 3^`??$'qZp nO+pd!Z"NQH0 \n⩠rAAς0 \{;!Yp=_!q1p MUVuPj],=Nv\{7ϱ{N7 d\  pe^+w㹛Uu NXgs9= ~b]¿%j2 68~ \w#ݿ&pws/~Ca[9\h ܝ L]+a+݆t {7 ~WY ?syȿ]W{݇0K{~2o)pws~+$*= {~/E%5 ^:7~Mc?wn! hm$^ ˸rC ˯/wA?f(7s7xfN}%?' QF~?CNJ#$`N?F}(?cn&?`4}Gu7'{~>!,| ͋Xp~dኰ/"\ ;Xj%g# p(o#|5~\p(G1꿑g iYu?ңMDo/^?ep3t9+7cvv\qptpͣz}N:#<|l 5,3ݞHpw/akXG`w.x0fPEx k^u;guI $Pnl IK\D>j}u~8m4n ݸ<Nf!|## \}Nf;Qo;~*,Oo0|.b3>~FJlV >,| ies32KPloO5͙̦Ax ,,N*f}%\m;_ " X?瀡z "WoQ']Cp]|pk -B!=ʫO`{<'A2ӛ p3ps՘~.\2T}'kA_@pfh{\Ʒ_zwΗ؀K6?pk^oٓ~nq%|BAE pc3<9V˞`63_\rA{(tE_]a~^ދc'«m܍@ƒC.3g^ u52 o80~ 1 Te=Bï2(C'|P.Yy}'XO|?1J<ų 'O/˟:cG4sƔBaAS&Ov)ࢢ%SgxRnGȚ9@>y)3.ό#&{)'t>l0p.U:S:*,ɟ2(hΚ)XCbĚ]IYz״B 6sJԈwz“5slϬi3Y%9fz x OSX*Χhif2&N6s6D̏]YwO)])Y zgP f͜?+:@c ?mlO>%gzIԴSg̙y*ِlvI!H){\1p!D%c dh)7H@TSf\D;z 00aԻgLRTB,KϜ]Μ] >ſ$}F6 lEw)ۣ} w6ݹl^<'N?BztW_!}Е.5ݿ}n:Al`d^CJc ]h^t B9 E݉AXbAX5 ]Zt3ݻa/a?قЄEԂtSѝn*?P= 0ݳ^={~G~{tܣ&=}Aѝrn%=A t@W@ntρ@wۃ`@zt>}PPB?E7ݵP> mlogBA}ݧ@NM9EZSto}n9E2St7@WW4;[}G!W3/K7B9/nb 4;41R`ܙV $W;ӊ1R`ܡYeb/PB0v(NCxiM!WqY ` *e^$ƨX`ܩY'EO 3˨#r*?O0.^I'w9IT~UV*?O0*;Ê#T~qcq3`̪X+pT~1N*qQ[P#@p-?5S#T& Q#\F~KnGx-TP#Fp?} nG8wR#,Ÿ+~ a,Zq`,Zq9^WP ƢЊWS ƢWS z*?ȊT~!\C'YS\O'8*?ȪT~q[q3`d]B'8 v*?N*Qj>@3b b'5#^OpI&Y_ !2*#\B0>(NCxX5hM@ ^picUG/^'!D0V]q1N \@p?GQS ^EO8Ov? Cw-.mβwK'bxJ/;Nĉ?YNvc"Q c4g}'(>5Y9Euq]ee]6}{<~bJVaB.=T;b %9G{7ɕlk]wL%JU ?4C3}'Hni13Y$[~r$FM+]wz;N ,&F/9X{)5:,,.b >+ly r2Fjuonǜ++0$ _ȕ+0JvsHZJ\! >pEnAPVU nFnvCN \HP+KC3Ε6~rD#5qg>g^8z%WF/" +ݪq,P=THJhAV*c<9,8_~%~ީ'4mq'8e +E?ss(uJ u{jXF |"lFg12oa^vsw?ƛwG<80ijrF`NtK@MiB_Riei:5ya|T+D"+B/]50-cLjm.gPcgvy-*5`f8$y ɊɽK׈eD >d(NGgAPUk:d5$'hWCd7^#jG љz%V]$.02 &fg僉~bA41""!+oP7Dѐ r&H!ֽTN Sl-zL?v0iЙ,}9 Xم:p3dI5i8Y-dyo5[> +ٍLqS8J\KHyM_[b&43A*σ2Dd6VX~r:9 IfۡR„k`k0؇OkVZOk4e4S\R; hџ7n)ILa~$բ(TOT8yԕ̔Ϸ?R>u?)|^LUP4P峖wT>6 hur]xE`4t=8(9x/&C i!>P {@^8:A@"_À85وSYG Bd\8Wp _:o}X+sO%9;̍65q:Ƞ'T\{-W+OfWl`N|jٸ[' &}ˑ@ʪsPSx, ;* =PB(9qDl 8⊕\j(޼h3f}rbIV$?8P8B"Gkq48{7[ڬ(nf.F{FjFgD|T2qw䡸H/:_ZO^hqaP]v*Wd*كjIڿ+E~~櫈NYH.d)vFZ҃GAqJ\yy9g.⯼U2 Y:g|V}7s@7(sݤMF)xKǃ@1Q4څte7f(vs"8Yyb/gtF㏔q۠ؕ}KbRHw?Li+bjluiM'Qm:KL2?E>ї-lDߛ:A;< 4*3OW>bmL?! [.䰀!e* \gk>L2ov1m7`oϩLB~$pwρTTZuի\er$VM9d|fG>dؒσ?G({y"xMߕ%HUZsp2;ٌh@3YO~pU`16I41-Pj II(v^9;5y9Sac} ~ÜjuH112h_2GYl eedbQV20DO\[Z6(;AwrTCq ұ4'x(dSib'1ʛWcm/w7tr-fXFS԰hQ,/)e@:?7t~:egwH ѧOOi`Ĵ{~gV'rԩϯ恿>kg߄s*mZA]%r&{#>r4"fP6/A"rA6m|ʐBvJK1?`iO}Xn-Nܷ2ޙW(v͑i;J^f@{:ma&j}*RvlG9ڏ 5ivr#sx~5mi=&G)A|xYps++@9 \]TG7갨 5H5Q IN0B>@͞5'b9 cK b^y6[Yf}MkwMl$ŹR,fI7 ͑Yt 9%H ħ; Xg!EO F>F R/8c.xӢ*}bjJ7; /0"C14jiqSFv( 5МݵHܟl߿h04>G %h6+|Y*lՀLvaO_@롎WCo?YEOY| g6" |}f3_k ޿c *UDs`+$*"d~qGK&b"v~1V~}i>c]tᔬ/=`#f^H­t5o@d"+)g?W1_ULG"H((cKHdJk#Zm;iJ*pFNlo4؜9h2)HAqC pyrp)'?VdQL9g^$6^jIE%ģj.Z [ auhbS/ 5ծVCqhIO5׉sMr^䷦I2C}b 0ПJ#~b`zgj^K5k,)0Sչ< 6شL͠R.,\Qxoys"DR/e5maņI^V4z2R.F$ύbWDв?جu<~E5X;U GD61eG%8q-.cq9a]n1ۦŵqeZ\7fe;8?<-)7"Ay.ĎQ5mH7N+NUFx6J"i$mi//W [E:ݴ,O/-pyY 2u.] KB-0;xvQ̨'Ҩ'ҨL2_)offZhMV-5a߼14Z9{_Дcs)\xs?`rp)@Zf_p9۞vjO*۵;f8ن'aWw^6i D/؏o˒:zSY/L꥘#LqxbZ/>rAɍMiZX?x^Rm?蹰pWs%XGBS᪲#àRj 0C+!j7Bޭ 20]Jliqt}-umۢ5۪[\E/&PCcq8K<ǣHT/srWy4v1zec !#)|,jm%hE =\hb5YUvBT4{X,cj=LʄAI џ֩?6sÒcDLM*wAA+b+GEκ͠WWb'&J51Rhq[VWjʥDb?X:7?gyWP)|ڕϹJU5 M<ʳRU_~W*.C: "]82s9))Up>W`[h44do:Qy%OvY$߃C<W4Rd+  _Ղ=ZSaXvS-(]&Ulu9zh0G.ZbI(M*f3S,ged&n諥yVߢ]*Ԩ^TdS[Qu o+gSsg3UmUȩ8 Bm|G'|0cjs_C0 tAW0:gH C![8;/K Y@iJNdO]B"^sAI-)e\Tj~p߮A#AA2(Mݙ(z+\GMU6/Gp&ر@@(Q_u_ W@a#e+VV4 "5vྷ$KfiPL-nY`#vn:| ǩEaM&%W0)Έuq>OjlB(IivmR$ƆM44=ڝ;odr4Or:z'(^6)({U5UiW1- #2,1FNVɷ㲶X p2Eρivj6caٜ=vR$&L>u4{稖ϩo2b}Y2D*{9fV=ewAyZ;yThgi'UǨT(#H .t, 9MISBt CDДΎ:DtM5Nk4:CFY=SON{Kbi ζ:DйǝC5鴇iFgK+"<ii sUl:t:ѩй*P>::ĦJ+!tp(Nq;u$P:OW;u"]<0^ -T^6E⣸_[y9-dȺM?o֡1?k)Hߴ*T.btrQ*R:=BSyӞ-8?SYgIdbuQ]料vΉKv;Vl6xsf+|cJ.dTC=Ltʪ-釻Bt{:𔷨#9 f6V!>-+pp9W(NyQѸϱ[4?؋E80=<9.њF e;#0*uZAaMBiթ6 J/7c)I t*]L| cqMk=9K6EQs͢HQ1"z"\־"΂(S_6 q` <q9d981t9A–KqR% -4eZqGU9EɆЁ#B2 Hn]ԖML y  o?.f|YGCa1kC_hʇ[yGwÞ}iqLzXof6ڕQpBN]9NHE >V+`[pm@ԡvHD=z4ƏSjgH# m11* 8֐z(\NT̙݁ns.xQĎ{@ulE.">nwg#;Qu;&yN-zuݢ qOQh;;( {:5|wDD>|).ԸN97-&x.xy!J]al͟_ ;<ّ)7<}ڈV? R1J6{4ߪhJ߁| ߴh.ǝ`x k]E>O9 H|MJS~iD$aؓ$nb3ri&:ߠ,L6a;!N`HR4V2mI._#gwĺ{1MT/KW"\`נ#Li3f^ɟO?ձ3ڌ? FFh ~9?O| b](e3\OSOm!?/gKi7$Pm^C{*Y7ۧ/g⋑s^0KT#[u9/Ɨ?'n݂.kGb@\dk5Λ"弖K`XٽC^J p3@K _p^Y^r Dbo^J- ꮗE+/qs~%2Tvq%ByLr_6=GZ0y=0pQ^ fy32_{>̵ϟ>}ތ>5jl2?Jư(9It?$P/ڴC*qpχNC?YmƟWGgllyv>{*6 uϚg#sɟgbg3fy?ğSOP|igsHiY|'T'?ozpggVŶ_2CzJ Cna!&S)3T$6=yrȥ1tShSf\J}$k|jql+1rai7|mkq> W_m_,0WI3l~2o>iʂ;c , 6y͘H}lN53-/}&-t/hUStxZjƀwKHzO Ꟶl`Qi/5[أFiW{ЍTc~h}F!0f͸~.L%R.1%zP3ymArcMh_-ֿCyH:%KLֿ|ot[y[%l. $OcdOdS>GN2#\^.RVwژӡh>z$7?r&.{dVLޗ\G^vW PT/DKc/|TnuV`")v*4Q)yitm|/i738Áûܔ__ɯr~8ou)Mއ0q!D|I/V|VIOk-6y&|m]_ܜBJ"ŶcdHݘfOdځ4ŤUK2g%'ݚ&oK!mo?D{?hgo6e4) Y__^"<2z.UT?~h@\}/LEmZ|Cx(S "BUAnW RԷ[fE3}1VRcbxe'8/mUNo4-h)WA"v_ ALuCj2%+dd,_,3ݼx/%QX ~kjhJyMK1ػ6X ^97=a>1jePn25 댹71e &Y@̥dC CJU`PMLy Q죜'9a((1&l %MhՓ;ؒrԄ-jUʒ;E&_ڧij#Vl'v1EWo6qbN0 @x.ngleȷQx~WRVSg?u_`2jLS`],_׭S(.y?), SRӇ(&J0ɘ ɇkoג /&F_B{ȿ// >_z3,[+J~h½Jg, 5*fw,ҵujdz~{#? ީK 6~8]Okބ8T9?H: /%,/_rx0 <뽈XՂ]qm `wfU؟]/{#%;/& UZsxx0,;q,&}˸80b4ŴըMjF-Dhkwz!SX~ѡ_+n㿥7&hY񋽠+n}/6/c7p?A9ؔWZv$ozjZA!o*~^HmVkCoy1a0W6 ">)yI޽+ѻi}%=mtr4^?;p݀9b cn5PLM6%5TG>|U,4r 0T[!^pBX/tx]!,4JuFvz XL~~ b o~I?ER)5a*⹇LHsWFZiT=3~qK B+{C:c8|?,3 #ʙ/D tx"x1_=!Bq6* G9 /NƔɮɁ[x66;(4u&<3WɽNytFql3%([K1|!l'*gcsgG">b%Qe 43tE1ql`[?_Ç@O%TՄ?؏e2>)[ٱ/>ZD/gSq\M^”7vҽD}h1J6iSyt#<)?i^$ K[U]9),N)_MOy1U}͞_07!je>(KÂSz&f=Y"S"wY`/hDy`Å (ib'NH\F/'f7F$R\ֈLKyIPxybXωHYj IiYv`p=?a.8} ׇR3τ)|/­41 wӦpk(晰{z0 ?'f>5ϻfwg~Aa=/7OK6% #<)ds GL)P4,pS?&“` Χ!"(lfvv,yiSJa <x';-%/jW)4gў;Q4 TMB'&P(45Ҍ4QOhR(?4hir(ͱnfmhhi(vJ+4hi)"Jehhiޛ|>F>̢)Q##vϹv=ι*e5Y3d2= "2W#|-oe!mNmT`OӃڄP%L![vi T℘{$Iًr;L+bJ:saf$N^Zc |∺֮]9FiSVQLսfEVB)B^_~h%$ƴͤ-WԵ9/“=Il>%QY&XI nf`'IXh+^Q/ǩiVSgd45uB3)I54ˤ4uLd_GH&h4{&xM3٨<ВGd+eIi&(9I{h&KeRCiRص4ZJ *;KK~I]HbLs$W$SH~IMӛ28_R4'h#L5M_J#$MC4(MH~IMӟ\k#%5M*鰰n.8i; AS5.]eM!^ҶM/>W {6ȼ {SU] a E.MXz 7u b9kwpJ#>n<.^zT-J|։A^ G LB7{y!yůȻ[-z_#o'zgK{#zwz琷wI]E Jަ5 N(LģKDz&לZEw+v;v|'}(w|'NJ̾Ib؁A"{I٫cGfwCyf>4+B Vqҽ.eSR_PWᙹ?0v= 2S\ݻ.s(KF%7Ks1+mȁ^h<({y oP.eku=rS^1Z^kGR?[Mv<~/*׋oS9yׅhu|^!KHIA>%;Weio퓷udKqFԳ2jR d#__^AwITK/ j.3eGMNz9/U7lg $FLsT*ZS+/vCv];qT&I$nܫ ,oGvl56k~r~F|xJDj)2?t U;)NAn,tѶ_Yg>ŸBG)B<}"b +tc12I HYp z漆q926U{mZK O [Sʱ4BK=⡌wml)7O=#njLU5s2fM+IYibz>qLynd[NQwTLco!u_4nw}X4)#WɹvzT>t|ᒡ=T7&SEJwi-A۫R~l,9-ūM˟6 >Zi<m_t :ͷ1ñײŗȥNpɶ)<7.Je^5K"N>WMEOre:^O]!cqi)ۓwɽwiSǍvQFB$Н4Kx x D g}.AA>O/g< +Yyj2O(% 핦הs&==jCFO"{6PL'X'+pysyϥ%c]Y4N>OD}b3:p fr}%?_'XXg ߆v>sI vf?1&U}$S \PP%zLe{H #> &MO |*A}oAe~`̴3K6yU‹XC[wʣX 2a&~b ?1uoߎ^`u+>%R] ?@5d6șV|.[FodfLpk>dh" ?b\b[G:6ت]1^Tf0ʑIwШ݌H::낿Noב{1f- {8/^/C+bynTPXhKB-}.r1h`أ4tyƇ1hFI"'sP'wq䬷5yhYчpԃS}'pQ DC9x>.|)g8jɈQ4WqxlDd '}88+ڇ=*@.3x(]VbQߺW-w4^tp459wM O7ӡ*a]}EbiJˣskܷ * y{$ -8zοQ!9\h%?|O[5qVe\nuf|i/,ħcdvZC}gM!FK YFNwXB >h@+"` $!j|Ό_g* > \"b1PDgYˈqx#>A_ሰBb\bƈ- 7vm"W Srj}QJ gڣ9lȂJJo.9ا=ۻFD92 ս][F!5-tJǜ^*Nʌd=b7*S^bMɷ6,2XT^)pT\PE1Tߏ,1IB n[nFHKmD۷@ u Kޣ|UYo $crk7qGHZ]Fu*F/=`PNX`fh@@z,]#.#=^Z&:rR?6"qo1>'^/f[Xu c%0LjCJ*cC%zP{Z h70#V"ٿ#n"KbiX8=.p CkBZ[G: C?6"M%[Kq #RJL*P4S3DeúVo%s؆0jhՆO`+ KL>.زgYh !4Ш*RPAsU}=DH n:ߪAuwd%cN*Ssea rUpܝ3(BQ<bQi{/=QDʏ('\:!+kmFb)(PK˙.ZԹq#7ϖ2<=ΞbFwcϘuY H/V^~0mگ4(03Eݯ#]T9ODCOj(('~#kahX-p:3P6*ΗE:kS4 =g'qMC bBԁЈ71qR0p+oE-̏e:;o&Q.`~G0jy]c0~x& v>_YoyB7~kyNw~/H96O|bsvKdm6zyHWXxxAdž]԰g~^C XWryylPhӦR{פ|;4:C<lpǀiܝa)y11~~ `:v}6+yWd[(8.ϳ"(. l l3A>ױ%*`K",;rcKhXkcXXg-ZiطP&[);zU/84 `XñytTo+T$C$ggQ?<(n!i5~Ε2S3 7-$|*d5A+h[Wʥ-u4H뛃¤BTa;aе m +huyqRa&}p u.R WKE\tglA2S"=rP*KZYֺnVp%W?^RN/֦omHFV/&B>% r M}(t~>:0ϏhSQ/hCƝ&ZiWOw|vLj3bzZ[t,f<}`73uotCZ }2z5x^y@*Crۨ =~:~Dyi|0s&!OI7 G1(+J[*x }&{42[~IĜt2)?8k*}}`jMڸVhE{03>y<hB*%нnG>gnЈAc TMY IL Z_%@4&D6 lXnVkiZomRA ԿR41T"zɞgfy9sO1ːmO/%sHAHn& i3bHm-;3͛ J9nfp#hH~T@cQNPqе!ޗVΏBz>OQmY_*lkCFRdF{wŭ..doI E2DfWQ,;#4'ʍ3e?6 uK{Dc`Ju~H9.$Q#%ѲCI(!v$P*nJg&?P`F1lARdز>$6IQwwS%!鸮"'OH*cԿB*e~+mܥ>m|o};K)V2mo4>+ y=Ĵoch]I0%,%jSLU3UDUplvpG tqGnm TNъ1ե 0k#M&3ڴg?rgс4L~hk&m&9&<\lq6rKqϺ>Jc +f'сӛ[Mɏӿ1G eACl64nQo=5/'v6i2`n;C:պuZ>+zH {QmsX9g C@ѺEd?hswLqSDہ,s`X%b%FvNd";$+vf?EC} -E'kSRg(W=twg5 Ė׶jK`ML`%0?Da^ NB^WwRG (|1bF7ݽLRE8t%~Koq;Zh΄TK]Md[Qә=gQkA 71F,Fi- m1mVnfRޡ4R8}g7uЀw! k-Ecq|5Rm5Yot]h햳F@zH!!Q wlo,>ß%it&v [^B(;Z+n bFAngFm fQLbݰS|]^s`w`-H߂TS0\&48{ e$8ˌ"!ձKO M>؍  dK0+y QcZa5;p(kzqkB9[7YD6u-A5-&Ί uŇƾߒߓ;I_X 2/V:}Ia'%a.=3q zw>i .\wuӟfQl KޏKuqh?h:J:r4ڴ`ل;-D;#4[w`;q&Z,F':WQɬ t5{@(}iRaHvP(gHcf5G8"h4UEB}Hjߊ1D }h461B݌~ì&ѐFQ*Dmm1\4Zc ZKb*IpuA A`Z%3DǬMeǚ`~@ v߾~tAe/Ӛj0Vֆg_Vgvka1 V6bkqvTG@ y=E ff$ya{HH93jaјg:г{oc $Z~K gk? EqqqGP2@ݙ .tTFIv[+G)arPsyL[,ݫun)tL=[dn4pz+:}8mڏQ@5 }TH1X1r+[vQocsi ` :X1ފ12 L6ӃZH90̽Gn5e1qּĂ6M%Ki)R ȭ tt16% o>;v!@1HC6Dh h9khzyW$F)),(Ƨ$ՄXћ4 ࣈ.UqM2R/ծ6EÿkZtO tZL[(ݟYУx7isCUWW^}/g ׁs﷑^?KNvfE)Y2zvj =cQj[a{;w雛gli?&cbWT4(PHAFq9ջ@ƕscϥGZZQ>Pۼ5p6x,7 F-T[vR-m? b ,i#{[Oc RyI-j 6qea`P7o%ό ̴P?T%0q'g z,jZ;Vhhn?]q:Zۜ6_H`O5uv: 1ŭ&QΈ?.Ϭ@^L q@>>mF1/AφzȱM跖aQ{w&m |c8s0fKsEfŬSS=+%%Bㇾlz$c&~1ڍI&ڪ $ND֍fl̍oH8mgDA3;GUQ%_CL@k}0Uo4$ϔr L >)Kv9E?D#.92wd\^#V|iݸqʺBf2gJlf Gl[)[ב桡Rz&>'oXq" γ1Ev ;!sOvv&-5!-Ÿ7KWE}?~oϊbƆ b29ʣYɼ1)T5 }zAW12}1Ϛd>_a7Q9S`MlZ7\ 8(j2HB@hf@)Juʫc;|"nOd;|N15#= "qWBF)XPUS@5{xr$q-;99}xM}x1#~ ?XT}` L 1xQ fvH}~L`5M`}tռf]. N7/_(ElBc 3E,M<3e!$kш dhXMe$y{p^i,ޢG,\/]eX²0MW!˟XXs²\3=Sj&f 4^eT=R/^2CĨ"6>ڛ8T+:$k i{yNgMu%@>c13_l`z$tpuoHcgUGucC?nk|oOd!u{iI?2Yrb,cQm5'(!D,Ccz8R+j_KZ_d9Fٍ&CC=/QLpqq,.kë>h^  6zzͣE"_ZG/'_obEֆ4p%N{WDӏ]·Hk,?>8O;m;ڗ%>}:rZЊkő*!ti@q(0Wӑ}\|̛RLpBW|˘=a}hguu:[0gI\+W f8Zlj!CNܐDi<`mldEX-4 Y&qіAGaV mmL_fQOc8JI.b}XoE Gw&MoyN[h" c!}MMwwH%׈w)-Ŗ@N9EzxnfC)K}C mVЛ& ޹|LL/D5. jkeCMG0WBR_QH[[5_@agQMS0``Fyo \Y s;L) s \eO.et?wD?{ZKgdK-: ?y5~>9?9:wWwrmsq{ts\|^a;Cfiw{!!wGѾfߕX(U^Ǧή;OB"¿jYj1ӭQ #P~XqrB(+)+)+CQ^;ė1t~Tyh;mQI>>{}c_K}=ssPXԞad~ \Hohۧ_ڀ'V3 dMOU=W~qdn&&lH=6 2mo=~5 4";ip]yFO`.yr{~Mdґ̞ޭ0L*g217"o&}qU-0y~>Lc(ǑW2?EX0tbyў/:g=a.w1v~S%078Lo`E*/ABCy*cq9p"!ϝ> K6ETeGޞ-o<->EZHKNH\fPQɻP} #1Q+ dѷëLiʽ* E" G(؋wUM [qtA_|[)Y*jl']]L%B{/6̐pMWW$+8OjP]ZMRRDį'kPsjJH8'#L.J ?S[$FLsk<F.= R`\#/w[ U/6Ÿ]C:"]u/H¼_䘦.< ɮafSN}|q s9.6.jBNNeYC@L迣LjlFZgU$$` PEszU}:ҟ6|⡱wE [!aXd J4w͇PY(֔>jZR~>huR O@zj+hнL+ҵ-C~C.?4ԡ"q2$V{$YM'c`BVQN*_ף\/ex,+\>hJ9IOIMI"EL׸˨Ӛ\([Z 卪rd9hb7M=•Э7QƑFˡ9G+һ6uE?(f< ANt}ŅA*^QvPL4S8*sPG ;YfJfKQY2av"&'FYÝ Oe :YF>:ОY䇒}<fkNz+oɷ-mWQ^#שF&OCH)z1Qt Oɡ?s:sWx5ZXOޔT1dJ *SXLAOa^UJR܋h^d7[*=*eQ*ZX~fD0ƒ}pۚ!0w5Y )a))q ɪ kP_}CROD(!8U*E!EZ%HOuhZ1n?Irɚ)8R"u.T"XpN _]9 ]4CUW׸%e}g) t4}gv[9fVjV=9ˢ"TjQB9T3 VO ҂0,+_Hi{NGҬ$IdHCHGh(h{/9 s I6z 0e0u0M0<$m`w)\_  ag`^sz 0e K0`œ934a\  ag`^s6&&f1LLLMq*m5 4Z)5lh'c̱zz^m%ƨk2l.1ʼ.19gdT7e%欑m0;~;=?kԐUoЧ~-L7HDܢ2;G{ߘ7ojJ n*'Sܖfmdf/5v "1t(}1w=Op9!6E7օDA՚|G ;2O@aSIK/AȺ.6=㣘[ɼ):*', Ql=GyeD2IE+_4"_(MF珬6`H* ]ȳFF K__?.Ē3$?~*?>QnA3R!|.[FrDcI#_:vtƫty}{g?vn25Ek/(mLҼ(mk~60;`v970m0aaNt9 @wL"ŁL0T*F^fiȝgNiZ]75dJ~]vJĭvIg(efY֚tگY˽^gn :ˀڒu',m,J0){BFv2 J&?wf?i<! y%O ~'͊DDណ9M}?>4#m ??8  1Wf,Qja| n(w0N1Ÿvpc/43W>C^ƝnQP9%=wa?5MӦ[ހNނ~%8՗:1d(x_K$DTxI~.>t&{4]Mpw.229fS sr\0⢈\^`T3So'1.enǖ@x?Yx7~k~CzƗ0n`l1W[VjecXOdla$8xƯ'2> %8?G`ȘZ;~F#edif?{>JjsvsFK<w6B𻌗v׌Gf0  1^na@c^~p7㟀b= 8c) fx{s83q?`i]O|ܥ̾+foxXL5x xc:Nhtd F)1̞NS?직3{$Þ&2~x _ ƥ w=̾|:p͌7x3?%-oH3?1_1'7^^p$ Lɇ_[i?e^ r 3$/߂elƔy/%FƂa?1\#Oxl烿d| Rpc'x2p Je}+x#8q\;x+㟒Vӯsko[X{}_/b HK"o`[әJ?/Mb?3X0< ُf2Lcm"x+cO6:|3(s<n^ky#yod[ǘ#טi^fO_+ƻic.8Q\oc|a 3iIu_>rp;YׂGN7gg0>qǸE ~r'd\ 3U^5'2?g8x>_2~a;=_UO<GC m/-n2kXam`~48q̸ PǘQǁ`|όw2NG}T_Y|S18;3 .g3[\^x%gqmA?㟀?c0_3 -j/S3~|;`GFL` P3> ~?GFzG,=Ww;_Nw"4ki4pYq.x,烿x1{Bmvx.Wfp ` 7~2`(x+'?bkp g2~ \xx`J5x%?}=IR_M3/`HO#c+=3No2p&$2NGl}nxf3[z^8q/1^ qKW|'2?YgZp71 νH!x+3͌1=R-AL\=B>j; [F~|90k8G_m6E}6M2O6 G: 1G뵩L_zfO뿳=nc{6fOqizo.cZbi=GGZ{VfO뽻/bg?d;!O-,\o3~2-Ǥ>GФ~LSt.=.q7GcoxSGmp^VhqcOiZQmj3ħ~Qw}טN&z}kMW)/~w+MGsux \_h7k'#|O֯5S%#,etyM\Ge|1r^\.f3/0.7xSn}J?c + ^ 07QxL_v?g ~: 9Iތ_ob|:W0nK݌σ1鳂GO_. O|Ax;~s_7 ޢiLxx3LWW ѾGZ68 ԗ4~t䛮u&yRLW|+xC~xFMN?^sM+#>pEx%!Ssp/ ć<ڮ> 4_N/ׁ۞ִk?/#&~!ߎ&#C"\y%qpG~aMt$^VpZ?9HϛeG:ބS_Դi+' HoFp4kwQM;xzKW"_ W~"%rUx#8 1et_a硰G3ҴኽWJKމW343h/Ng-#*~ܳx*Pŏ* M@( .:i+u rpQmO>4ۖ h<9-b NnVH0 ?f{la?:F|?o@~W?tm|'b|_buDe N_]_&hzi%V~&3Y"K-h۔5o&?.<[ qMۯHV̟"l^Oދ0<^y^96]OGM^tOrUTזWNNVy33&!Ujd% RR+Oj-n拉Ֆ霽hgAEN'hNe:s*vfe͛'nf8#>t8A#E}yFvO?#A]qEqK]n.͐CqJ ;Z\^!%8 /v^Fd@5Zq␶]fὌ:_-EI8SI G EU`=&CP(!jbYYCs(jlJءnKuE'/} dWefozTki'鏍L?–vП6Ulҽpf>l"& 6]򎰵p—]&D&\I_"3MOӄ4^ڊ0Dop.\ Mp3EfX"LnЦ"%e7Cn2D2D8S˩Ta;U)n2m+S)e-8DCtpRRe JʒHUNdQ2QL*#YH6Y>6*b,,,,,,K,tW8H~HaKa)ҍ,C4Uܟ*ʿ"LL))<)i+:{@U*JRTV=M1MUlG6Ymd%grzh..cR$eSUmE]...Sm%j%j%jWN8TkSM7Yvd)CkW1MY̻]J.efK٥@R v% ){jһlvYy~ӕw:vteOQD"+]6f]&[=C)lvپe n-ݮJ/2I6\LM&–t"ceڣ\0**kT^l6SlR2N.Vasz&EHJO)5M*3B6OTh6Y)CtmR6)H[ SE$JPVAOUmEES}r)Cq(HR' U޴٥XShn(-Lsio;EW(4Q>iMio;E_!4Qpi"4!4Qi"i Dy 9/7]lW(tQ]ӅI']htx@m4](t҅ H ](tEO>]'].].]:]1]1]1]1]15]hr pUR .y{Xxk owqLF"ȅ(Bm )TPB] 'BU E)& Be KP"|(LcGvc u+1rVqph8eo.f#'>* YEe5 ZiEemUZstjjw箬F1Kt )&55stqWաVȥZFNȂ4[JSTxS4_V*~~CT08׭L)0T)23E PuLv6ZсC:jVx5U%( P(>AЪ<5n&d³20fX#ƅ:QW|i:&Q. ~VEa7 _yZ5dQrߢlD?/9o**U.}&<;iyyFe;/DȑXf 3\Ba;X8by]Ucv8^qO|y٤ rOY;l4ZX5˖u\xY9kXu PF23NINL}jxge~咱! =v攗hwa CRGU@_K)k*Q[Uz1[ n/T`29ڞ|E/_Q|~-HXȉVkk9EUZAz!->3Hj`5Xܳ@Rw8H(bMܫ?9;4X ) ] S-r6Qnށ\Wv/Ċ" ^BDf6p=$Jιf8,^\4+ "]8DsRw2$,+왢^G*ݕ%ի/g!W44>zBR̟=xA oͳfe5+9Q[}^A_tkު (#zy:h,4oAGWwZySYKCLYwN3CG[p'eJu͞/,GUe1j)!e_ c g<0$?A 5ъ(@ҥ:bCB(0ak:t WW.Test#u73H 6%RP9xi9?70o1D tY;bQJNBŷ Q+([z!e]o2 M~-bF0|` 6h3M^X[5a[j\7f%ZWD{j*J%.Vj҅}`_)&Kibs-6RJWW*QgR+UZYZtyW K*݅+ȉ7TWѮRĤ(ESj,x/)kEpcuhG(N;+k ؏LPnKNì~i+'s|aoVTs2FJ&冎x#(^M盓ޕhOmz(<:2-<<z;:L)<}d3\]9dfReit2[2Y~`|m2; w귔w";5|i:D[>^:ȯaKMNÝI/1e{yxd~ѹf2$ 1wt\:?<3wt>Bvkw3IaMrG'晴Rs_wG5M2nk p,](^EK[Τ7"?a^""2iqPK bBcom/sun/jna/sunos-x86-64/PK B$F*com/sun/jna/sunos-x86-64/libjnidispatch.so}yX;(n *~L Ar!\*qCrKqGq\ZfČ;{; =gt{{ι{}ƙ FWQ5 Y ߥ%Z^7x o0{σ jxqP..zQ%80u6{Wx*>+zeUznV ߄E)_iFBvhƫmxYwp,'ueu wuƬ u^UnerOOJ[XD݊k}v-+r'??ÝO^?u Mn4@QzC b(BY ʄ4g,ӁD 2ge늲rСra :,X(e9(P@Yeh+tl ́2b("| PAY e% ,- /A>(3,&pP&~qX m@Y e!g53~ Pv2ʾPC9('A: )Ay,CA D2 Eɀ2w\ z"2t؀qh53섲35PZ^ _ʠWC邲r  efAEQa}+ e2AvP@i2g A(ˡL; h le) rx t24` + 0 peB<*( <eP^tP> eo2K//C@p\qeAyb('AY (k<eA07Fe ̄r9P܆sݠ@6J(b mlPށP55(切"EvHk:PwPf>jP* =r̄2ʢ J!a~,*]~Z`u+.+el aHAZ.MX^1CR{yq|X_F2/;HԭY6NP~($$^IN P7>^q"!ݫ5:REOlg #m]Ei@tu}cf 5~s92J B%5`!,ra6 !I؍ S9 ic3оO?;/hsM%Z>'5r'|ٟ1|y4эd A0htF\ߧ;ncM6Gm~̟~U1.E'k\ccѵR&ٝ[u?($%rIdث$_0Ҙ} {M>GCy; `AR~ec+0GG%U{ގyY! C}5|4'5s2g'j:c^6|`h{--.szsf*J\-@h3 &qlxK>f$~OU%d50/4]ʢ_[>91(?t2a:i~ ,_5bH,+m>pO6O4~*3@wĖ7 fO @7UGe${X46 =/2\| @sQO4sYE?n=#ZI~]г/BxdJT R(t=ϑ{G&hf4@sZO"X-΄`҃ m4o6㞸tv\ŨtY`/{\ ֧hiL`܇]T@WE`sGԜ핿Nkw-Ѕu$;/d>bUسO_ڰ;u."aXkaf`hmM ՋEl+h.FkY~>&omԻ- 9pI ћB\̶I^`/xZI;ۓ"M`l:%߱<cZֻE8Mdkc jϜ9jz ׿by9>Z'V^:.?G}XkousCo ya|gFx>$@c:3C?O9%7`_f ?y^0}JzR#_VKWx\[7|`{L =4O _:`yA4ܧB;Z1B@D1h;7'5O8he{D@\<'yo ~`H] mH Џ1B۞W{dz/+96"qp*;I`Iy7Ms蛝/%>Uvg+dg^/JG8߉gkp(ϗ]89>T-//x}miN/v,MZZ?o(Ⱥru~9yAޫ`ߣhw+sH'Ɲv70bßIls$Ew;*a3@ҥDop|Ak_h~tAY5%Bl8^v>%qA][a$9=i#;vAmñ_{ J,5APҎ%>2 yRZ4{?IJCS?-~+ ۮ$^)]b(11w@~\?Z*0o_GKtxTc|{n IxTIx&`יO)~gyhoϺ)<q5UakJ}E'J:+ĸ{x~9/2~^N_O~_!/tOu, lcآm{Cj[ bn)kූӮz_;'gV]/l#TW%~c[{p^vT|{B~|t=f^>C^< ?Ӈ$> ~xMW-7XW a>hm>o)|o^IyioMl͑E\˅؇uU7ѯ[-bĸfBxJ͕XO9x_Y:E@&.",^*֨8ླྀJV{S9^:}^T"[y@:nV̓_z1X])/|E 5F=__kv' 9|{}o?9n1SX]q*=yFq~ ᙝY'x!۹_9+|S4~\[s<|_i.ў=PJ͔<D=sÃxIИ^ֽ+=޸~9}Gb֛ 4O'Óx;G =Opx. ~w뵀g|1^9Irrb> O|'v:ݭ|9|a.'ld͇>"o:OO1O>O.?oK})|qO')fuqxlVݯsxjVXyË" D<뙣[s"DO8}8[9}fo=?BOsޮ;DO3|?EE~hd~H"4RzҢ~}_|'^s1S8žk/~г-Ão?tAg>s ez%ӗ^-<0]1>rurp9||3o6dg>'9eTn_~}n1vfu(m9yP|1s ^|п%$qx_d2F LmK4x` >,5M|LRjʐ!RR`I1iIك"ìS*SF$=,a)IϧLK"qIݓ Ktl#Sm#H`戴̤7"|1ؖFT]J0$'Š4[0vOmHuAJmĐaJzpo 4SUYi0r*C$o4 Ɵf{/,FܠRAG[t3̣_2in>}0{e aI$G 6"a8 I#Ҳ(g৴Ѷ))CP0 N2] ikR>dxMI:| @1}K2,6bj;uSW1Z뚑2B:4%HD|Re:)n\,(7>S=NKq&=g%ƚԳ[^IcXI"@M֤OՀFL(Cӆfm1v҆ D&&%س96Es51ϙ~ ؇L5x0+)& job9+klH}h| yirdjaWڰVDYR-"Nns.c`\v /wPi ]{wܐ 4a K(>!C<&4SXBYC/>ʒ2 !$/Ib7z&\GblO>2E>3p4d$>IƎb 9^g)ekȧ8CQ77 gݴ,?ѧa"Pa10w&>Mz'KTc3$got-)m`-!G ۷&rρC Uhx~6dA/>mct;# ħv!BKI:vW q >@߀ϵ1?>væ<4@W~aXP~OndoHm?#0ҏ 0zz#$׆KiI3ϻO'v>~\%:x ^'dz^V/9Rc:18ܥ8FZÕa7y] <9st"/px^tU^s9%:xz9\o:x D  Wi:x6A?Z/E>_rh >c/a ]'K, !] gI@ .?w$gK6|e$Sr2vLg܃$( FHP LI%xP >I[Jp3%x-K n]I" .mPKp n/$x-IJϔ$xc ^#s$xZ ~O]E_"݋%D\~\TJnJKpO5C ^+WJpeJp .YDKp]  |+[Hd )3$[.:]DQ` wargR'RN +:>6掦>p:>^&c(pQ}51)BeXǥ]s DS}&[TVd U~k*?쿡!5~ ߆ZwT;~Oz[oa.#~7Oױ~7`=XXzwz#$'ZAa=}XoOS?DSKk&5yd&duU^8OX d?կd?z'IS'?FS'~~d?wbI꛰OX2GT_g~d5_X&>1d?'` OޕǒTfލXXT8]ޝXAS#֭d?z9O۫,J,x],?{ ˏ1mh Seo>s'ƝeI (.|heOzMs83f.u7 PNUgZ %W @1ҥ$y`sM!xԀ@t+&VjZ__j7m+ZbgH_5p?L OKjP^Qa6c~i1>wg_Y>)Qa1A9P|e7`"&iVyB5Z>.\dCV$[xN ̶b@Y (J`M+/5\dnS~J^{Or?K?sȻ#^dW9"Bǟp+);^QpA~(ߎDUÎ)1XNr;4B1Z- z(Zq Eo`EF)Z$h13Z('3K~ &ey|?*:"6)!c8 HGn#:!#װy.@Kh _gWc2h\e=P&䁠tZD=dUe1\Ή_0G՘ 1'^kwC3nJ+Nȗ(OSkaX ƙ9^3~C+IWXҔke7z1?s?[(6a{& VGX)n<)gVG FqRBq`& yۗlwD=:> b r 5Ӈ ,wW8MBWsq cis;&=Qh}.9dSpmfƍ_ifrfF_GQVjm m:gjQ 9w爯tOwp.G"OZ{릴10Ff(|w4qYsZQt ֳzWx.f?jm^@Nٯ8H rh({f[7jRi?K睕y)EH="WX[۝'Dg~Фzp#73<̿d{<+,57 ?vNlB-$t?SP(pБ9{:rh}"P;3a+$ak>1L ~P  AZ/*`dlT Kt~z}z#WӾ=s8وB("'G;naRK{/=jQ-,N㠯qP m@![fm0vb~ S9oBdT1vY,V6*f`"l318OVSK2QU#xL&CF^Auqu[3e"]##8QFL𚞽Xߋ358J蛇cלu |1g6r'OƘ8MV eңUT۫:TGNrc?t3ĵT]]nm&mk~8![0i-O-'#ogeaW{:uZFtx}:|kwVu`·Q3x×ҍDxrrUttnx; l.[y.%!37tSh^AA NWYc;j,?y\ϡ]>osbqx~&"b3Xlyr %hj2P 3,#t˸6 [k j+v)V=~T{0'TCOq*ɤߨKuWNl--lmuc, ]_h_+ "u^K)-c^2)ᒁZ'xYL`y T"J!}uvZxp7х.򧘗b$ / $5 oYp\ª,OˡseLpF3b *y0}#Ra%1'~M#.Ekv2`N,X܅-X(Ȓ{ iɤдXsIP/}dP/K3Φ9hOLu/6?BB;(bf/x`1h%h`Sڼ)Z,$@uI:X`;~QjbnA/d}X[2`faAϘRe4C>4$~&u?z[~ 0J-ӹ~7dۻORG[K]K|z|gB!oy;Jtw'S@HkB!]G xqzG}b LR@~黑0bpY+0xj-&wW[r>Q5os fx9W,v {Lb߾hXlaVa~_ȧ9p&c 4Rz9#OQ37pچ+o KSHg_.zDD^;]y nmB{ob썅=|n.u۫V#O@9F@ Ny*/@zf#s|dvӽڠcji L<K/8 flD|Tf|+9w<~[A[,}ASk[f6-|os64"e8Br$Xk];GѢ~x;>5ol(Fj.]%לYFV 溍Q C <@S<ˌA7> Q6z -]Z4Vg~!;?"OSK? @NtKj%Ѐhy[r=AP; M{̊)rK v J=4ԞT)oAk'SR{_ z|ܯ*4s?Q:QQ@aat{Qw ӑXE7aƺ QAo\p݁Y@~*I-xh];5,eYv3  &kpea'My #Ί5 9+2ă|]U\W`~ gԫ0H6w[d`t-=xD>tNzNj6Evp2e=.g<¿c8nu<okvӿOK=L{A !|y5oiF_=T;c?q8K]osnčlL7xqKNC ~Hwt+vcӶY[G߀?O7STSQtTw2sLf3\I6v`s 32!gݎ^ 7U84i;[3~dzo|~1bL`_fMKJ"#O^d wk+bЉ|r^e~ܝ0tԓXdk^†fzS=HsLcT[s3YΫ Yh`oqX|ɲ㔿s>ˎT \d^}ku9m;Q2r9zܔ]c11wMGtc˯\ٔ;Jgd:Eي9 (\Pg##`:δ//XΧgn >V[Ly`lnm}{TqYq5qYf\a6DŽuw<]\*VCt 7zh+FND t.PW|s'M>nF܌\&jZu)R(&w!uʞPՈK;!Lc/6:q>Q.Oէ#(.56_\"PʒYuZqܧۃxm_uө.uUb!ur O jU;K-l8̼Xa꽊ɍpqiQK$KX*%=Ek9::_@1ɹ-My6e'Fx`s3`~0tɔOFr)FuvMC<`v1ߋìi>Vl”q10/Ax!WypP;:pO rc|c85fݸt){y'C,g a;DKӄ9n!@>X!RmmO,}]ݯs͌Xy m~ZM\kwG޿.[nj{cbǸr3Sk 1X hUSf`t"\ӝCKܷ1<~ 5bqss֕~t}*SHD, ׼toݳse! hLK:o32nJχk+̐Yʼnl9ްә߈"^wEW;y)|V/RB##8T_?tS=Wt?}k[rhv]EUu\` b G[ØVg|+{Zj`ߡA_7 :bƃnqW|'gȘt>:;{#=`{MD{9 S5>9 kN#}%KB)XX1^밶 { ᛥ~ԣ@GCZ1C5-2x{ n2?ƚbkb\īkHc_FU=<,Μ^~dvnbj6C?2rx{7hV~%Mn 2~#Ŷή j" ߷њx5_鳕,s t.C(z6=X+,\nUw[?X]M5܇ϭksض^^XG 㗘㔉o]vis~m4/S2!O(!vAuh{&!W7Lmd_{yc!|4 Mb#<"F#4{akۅuh>uH,oi"L|g}_}^E}>ߜDϑv1#]גIq).?n(\>>?kB/Ak?wyaaxd[da}K2r뺲Grti0d}5ཁA̖g< f~Y0'nN0k{ aJGW33ti%5ٿߗٿOf~}ٿafo߇bc#*d707}dfj>}TWk?ZhqBڏCt$bo@~]*_!ۿٿBG ??_iO bfjq}[ ̲L p }:mnrz.Pþy%^痎/[[[}/._:]3騭.)pD%zqpP~JR>\(1-gdV#VRnz4x?^O?wzzdO?w >w=xIXcY?`f}:<-c|AVxZcO&&gAmM<]%]j<=KX?KXz2sWoT_(ٿ _GТ:dW1W]2222/ke2ُEt/fcjN˘;U5~zA)dN)'A!fDzz2wu==C)jR/Wi;Pc{̿)~Jt^k ^3~0VXJJwK #^XŒN]olCЮz#@#r#q6|;-c)[!K,̔Aݎm7ٖUOOXʷkj_8i[ .Z+ `f:J$X n`K +H(\hIΖ%48j0Edp1-dt[ -*͏l79pq6FHw&0g|F8g k4g G$9Ʒ3tF%i[8>C?Z+]0u<٫۞g̵[FL} {+g߶ ';2'ߪٿ|o1gLwc/q [ p|,bY?I׷址On8]?xj C]&V$XX$E/$lVo!;0VlsF)=uf:Ne$@Oa^R]_)kbE OI'T*u_9f`޶z{p6X \Ux] c\ ` KH ײd LY8ow0pϹM^U=P7(}B+ҧ̺+uɊȯWj} 2]w0P> 6/֋[wm1n+{)wn|MºRi6}Ⱦt{ B80_ܯק6*N+`x9#/~!2 _6qK u-Ӷ5ȹ1½8neCV%{ {MJvpr~bwCe>[VC2C ] ,?撡en\zmǭY&B; Hf܇47_G  0>CW{0k\2aV\E kKL}ɔ嚉eb&VqL˱/L4esıɔ}t W0DW`U̩s녙ԻC2+ĵeº9dݹeuց)cs<{vܺ`fp['::сcש:aYlu²ųEz8Z\ƀ6//-I-W!RAΙY _V(\3ijvlk%;&;wQFf;^-, bVxZ' _pAf, L!i`j_PRgZv5[+s?i]E qd*aad/wq if^:_f-ֹuiMWZ@\ix|A%ʠpO*56KG~+Uj|Ctjs-5vePuF/8Ȟ`:vsx"6,҅C \23%o^\͟x5m<]?\R k'蒇cLv}Ixˋ_ ٨#ʒz5m]IīƿʆoR){=[wߺC?(aQ?=n|UσsX~ଝ=~1@K sG#K_=3>oAȃٷ+jzҼ5{nj/a :E"9?DSWhԭz CuܡO0t,FA}UmOgl"Z_>䝝-^/' jF'Qͦk a0 ?!*çc0{3l"v!i#~ac?IfS{ήdN+Uov-v|ǫ "Y`Z``# M@F!1g Wx Hyj g(ưߛa}fyz8>qV#ucV >˄Qٟ~5bKe?0ӓz9b?@+8pfc6è'$,]#a cK-4Sl+cۛZ.GC:ZFȇm d?B|#t3}gs;FqJuDj39dԘ67#jc#u}456BYo,K ֞a'mxKQhU[Gv_2W|Y? jc# N88[cPH]6jX-VeQ؍Y-Z%ZVj"ZV gXVj?>|1W=Y-ծZ_&}3j g΁0eGpe1.K',Sc ːrwZŕi% Ɉk}}ѸgCplPҞL3Fe~?' YK9퐍vFN$Ja7;C~ wVB·|q?Yޏ ڀϿ iGD;9T$}g`f ?_D|5s{LA8*?L5+GE: |Pe@Lʸn娳@ckj?2(UQňc# !Cdj,㨷՚c8* QŨvB8*Q3hՏ#j'Ca\p-ZP;8ωP*!M f_sj+0|aZCmP'j6G ArjMSG飯yHs c@% KӦwu AK V/11u; p6'Ȃ/twGՇzv@eu:0!?0kWW86γYSq*/ ;|+]ӟ~RnC԰UJp0[>[+5vw#c"ǫom-|}r DPg R,&.vbOdyݸu5$m]]oV>PgK#]xΐLNOH6}UQhb;U%gyD{ߧil,ڈgΐ{0\nToX}{%c\=}i}$}.5o6r}kGm;:= Ip^X:!.ϼ_=8u}G6ʻmm7qo(Z_dLJ p"zR# O~e=rBH8?$#Z:sh}7Q[Oֱ_K=Ceб@|o'tHǾ) Ee?ۡf/mRW؟ 5;I_繈^cOiWzclϞF_#t u{ɎcNSCxGq:"u'K{IN_SINOB(_ $T|[TLBZjc8/"T6Sŗ䋽3E!;;ɧU6Gک8H.§b]Tk5OfzABnᣍ8BBxbWboE[㙊}}X5Kof}SU4TKx_}Pq!&T1[.$d^sm9udЗqLVU4Kŕ$$WWbNф˗}T@JjC}mI_m G^t=U>H'V10꯳ f: /='/(?-@muT^UO W﫴;ݸ~ v}7^®xݕ]?׏g9؂׭~gxNmP-.Eή_5z ^/f';Clx׹7ŮG# vI Lw/Ԩq,,g!i'F:$mbד:]51ϳYx]Ůgv=u^oa׏ #/dtv)^:]kގz7^ʮu~f;]BaN|fou ݅ k<Ʈ=D|:cct8d6G,|܋Eb/̎?-?aF=5V(B8cʂ1!2~_8no#xv y?q=[D}:۝oF`q${KB}=nN@KA`A}h A`_@g7v=Tٿ8;~ Kb߿v'Nj 7R.sO_2+gk`--LKa[_a{QWLKȌ_8:}њ>=Lc.k}bt޻GQ㳹@@p jՐ MHfM$BrQPd`]LSmi (Ih ޵(P<ٓ.5;s̹<9y3gyM֭ 5ҫ  ``?QaoTi.o]mئvO:zl"pLo0Np B~Tˡ"@K6qN1p͛󷫍1PEu6=uHwLyf9j/ˊ^ؘۼmZI6OKN;ت#Ѵ49 bn8YF9Id !ksa0H~3uK|5 JI( j E&iرނsF+p&U ^AKIl~?[%][I(@Wo9 G{qn rq{lzp>h14(͇d9Uq/IzYL9EG@fi5PQ둤?]޶RCCO?vC6Ѿ-HWd/^Aa)n߶J2o싨D*;-zx94ǹq>u;~ 7{{޵ {ZOn}3\;-c?g}$ :|Am-'_"UZ*I [Ь ڨ)mQԑѼ%PzP 62~Zov=q0͉ L ˭%0(>$5/OX{i]E* t2 0;iH];{ș}+4!S;WF^G/ZHekF~0_o]Nl~ۀbbl5,eJ!wYC}]x^١Xow_lxV KOR^Md[=ԥݱ\XECҦ9T>*8jaT3W+ yk9^eW"w8Փ)=&/\$^&/Z!yO*G:#~Im߸74TG,c˥y# cc#Ed_G?X {)oMy}/*z5aW/<>4yy{MIF7({eLZޟsN2WN{wg"n<2>;/ 8ڿU:+ Jۤ TLސnZ7aM\Lf9q;]/eAdy/nSrx{[l0Sv-#6=;0"gT%Ŭj%yi& VA"t_D3`j3XwG]{+9ZX`Ճ8̻nե2Xim/Ħɞ5L5܄"%XN2PX-tTAc|Io. %|x:*U}n_6^Fv}N<N\<3J( ١߻}1u[ )FQq,qE7p:;FܤjHQϘ33u!nP QOl"TZHkv"A=;Ɔ ,H;t"/ K-4#qo=t=A6WmQ7\ڡ'q|vP'aQkOh>dXV`D4X @6 ,P !V& ,mX=__ ;w拽ec%51ϺEk49ٌfVQfg:页*q \wִ@lF=q2`\)#3ܔI":oYRUNKL7v3 e4'9&Xe".I|FbmftSI}vu)F+CsL 9Z5GW!{ Cq:Hܻr4'8fzi';gz!4^+4oE+ؒ^c-rͷb0AkcH1!ޟh$tU6[Svm\źTx̉^]}}%Kh,1HzEH7&N|WC$177Isx2sowח2yC{eJh#`{M/YQWI MQ7bv'y0B#Ά9nZkAkzU(}+i$ V `ҲjS"ގdC=q_}O<nah'Az7`Kd_4Rq s @)ko<徼bQ2^N!^^ },ڟ/z=, l{zP5E+G0D( Q _i9\|Դ{S?׵ٟm-AgT.i(v(Cjcp $$ plώ$ʱrr9޿ ȷDoq,ڶ ]τ.fc²H\UwzQ5ǚ =yJpnN7HOUF=OB_Ix~~ZXuS@wNcf<,v|cǸwԦX\7z=G,~YmIb m)ۼԻ_[rN=; d_ %%O?E=Bg&GzRB/BI޴ k<ڟ-PAyOs$#kYM׽'YaQg(3T8tw<qp"H|6OE(rnNpn(ܤmM'|X*~8-&- {F){0{D)z1? o9g9sNU$$CխUNX",Bȡ+N/`xl;+^9GLmDldp~(_r-_`]U:PGzB\#ֹʅ<{\ ~ߘƵ..~ҡ73,4T轮1ns| lu0+z/`]S!?B&?O_g=tKӉw_~q%}nOdX5 O6G'9X-pR,`.-\^vNPÉnX@{0]Nߵ Ϛ]Dw3ѵj!ݺYMPnQhf\wB6ʛ]=_MM\Jk#73#}0Hndz#1Uf0k.1H|Y=^t?#=Q_cߣ̥O{&ϧ$ ?lA@i(\yv ›1<>F/$ wb8!ǁPX>7|ܤ ݄ld7®i梑N.5`D=XfX<>kk_q7}t[w.1Ko?5o|?z8Xi7j܏c[GsFU5=6EJ\s#^ÎJφ6M_-6Z_2.[!`39SqU}wYt}9DTFw Wj×4ƩIf cR!T>UϽ*N}&Lݜ{`_fs8 ùǛG-%?jI&}yfϹZBMY[i`J[l%\a;bR)5e<~Uqj"87пr|SAAgӍuUUd{J|yl/oޣ{1@^o[#p p걋ᗺ y{1H>VbQ<2k Pkۇg}6om4?QM ؅UBZ@b>\)pVW y5u~bԓ4uGZ<ݱzl\noף'dz{{G0h߇kF[++DVKۖд<(^ X!gkxw,Ci)ZM_ZIm+,QR egxqWoB7vЁ\eةHn4颹sMuisZF.(3jc| s3;b}zRKq|m H` u7ڥw$׏߄P5*L%B&s9_bϔu {E)pLz//G4657C{YzwSÚ1Sr_OKHCOzBc:${s%ţuOfBy 8:ۨvQsBug}[Nk DzG <};jc)yG,.7f95^{3ZD\+3Q7S)KzD; ;c|9>rxPlr/8W9$ZjP;iC`̤Uz| 94r_㔟}+~.mu2=1o+y?A]><%qS'#]C '?wC @v|!G!!oVw@Sל?ܩ&^ m&v2;3|U>@ H&v=nF˹FE~:z+p,9`^:*B6`x?|6ᏞZ[:rW0wЫW߾}E|jo |A^*uQw{K)JP^|::֏h.%Gg \__rT<4urܷj &q\W@01[D;THăP੽]p~ȷ{ N{1_8,/k#4鈢cM0Z+:ZgfxJ8} \`}MeeF 0-kC*wAi݁CuGyƃq _td]á*kD>@Ar{m;ZơUמA~dG}1ynFk Ёma7qC4z4Qou.#ߣdt6 >jg?dx"9+"dhxDMoBty4)1'{S/8nzvktVf{'ic#JWooxg1eCJ xGQXN1>m}Ya'֡6!]=4"o߹C&$@;+:._Pbi t.-O@9۟Mܫ4uMP{<{<6}:$NNQ T\hn7M_A {G|'dHwmOß6Wj!A!<8߆uw/Nꦷ1L90AK}$'u=\wv4Zm>ً[!ۏu=/^u_ZtCܟNvfN{>b2×0Q ]ft/(*2WQxl BKxipϩh(c|u D֩ڟ@ro+d1jTpnP2ozkmq?rxlHlc2.*.8_]\&;]PnNtI{ u4BPW߭Y曝7CYOj8mjy`t;2^qrG!2]gW;-\Kk+#+ق]oGFYn0H;<-yzl)b铡ONpRן‘'7M̞%(2M#8[6vA}k񜱒YZVۏJZI6}tT$)[o-R m@zJ)䳓=]pkܰػj+ߠ%U^RN,]ӥbjh(optb)v|N;tfope$]\{b˭SsЃwL:CyoD@/vy Bg~dq_EmaߘR Xޠ(5D?|gB*hws s|>1ZzPZQMcЙshzd |zpGz;wrr?02T7' nBCD=q FQa{FO _錦O+rD""Ax+!Wju\`Pd?}5f`.ԑ9)f7L{v^-K ޹'38 wl|,g^ ޣQTe_OIsa]+.[c?oBeLcTge2BIRT4oU7l ϊD2P >i2}~18Xy2 },%/jC+׎سg{{?#LAw(8j!c&'yk}I`w;MRƤ \\YD,f46z7?3"w${ec[s+6-Qyn/gڟ7>Bk}2ofӶTlLl[ 8`g-Pb3ygu ;Np}KaӦ/Sф;9vb'n0sʱ<ԡcV@;tN(8YEtMՔέϿ{̳0bغe@Vbs3TvA \c`G;$1'#$gF A/˳ ÞUlh(b(jB̂6hIGQ9 O??5\ɘKς&A@'HCf=ѱw9_CcF?9V 7^0 u$C dp#Ntb[S7{.mf)Cu[qnSF+]ĉ x=|6uTޠ{=E3~klV7"*.,w<ؿ_ggpɳ`hc Iߔ16)Ocb"=fQG9" hA̰ Uܕ*\"Tt}j(fetz:-蝆4]4f-s4{ht@̅AQ2^jhy,п dI CyS%S&4*$Zj.w.-N9&ݓxn44$mĩN򽮤|oURFi߾df=.T(}|a|di`7j=ᗝ44N?qTcCNQ__y>\x~G N(:-jNpo hgN#8ONPlqӎKz$!xv*07\v0NRo{Μ䝡bKf 赽1w =[l4(l9U|n;39]N˝n7 1,@v "$IݚHw֤ M|H5;&|x.mȳIpoN6~fjP@i:5g+F+pѬ 4 Ԧ@oH,@g 4VME)w8;vu# Bgc`|_N(zs__Ko{|+OȟYt!dfp,1RAۢq2I4`6 6;Qx8u޽cmbh7<2ZM\6z be4;<-q >q޹/Wfj\1G9mޚ=q~+]o@,;f{;j\TS9A }\o_%6ء6CUGĕqO E^^7r1وuW%Jp5QNq& 9|;{0cRiio8#XXB,VDh\/'w˛IRٞ}@uOPs޻Wk.KAInyEZ֝$w; φS_2b8=A_~QF,xת B+`{2Z BƅM+`?_5u[VjTRߝ!m;vk(Qb f%F%l)=(ק'酽ZїO"}O_ADvɷn3h5t#7 VѵwV j#~!Wm B |9[wݶ\ZK'%]؅u?4b4:#.{E{zW|.] mW4pՃ^}3-=u]3Vuo&*.:sw>&J\-:H]mzZQ/;ELk+4Q~}K8DQ~i(`_`{`طz[G&sJckԿ~>νԳq`.P\ }*ȖԖX ~}^6{覷YD/ ,nG+؇ qK'~苙HOj`W;ճC?C^9sKN7&wγ{C&h`Tr͋2$|˻ٽOPp Tp,iV5r>Mg Eh+݃ku}'i>Wҗo[iP{!֋j bj/5}ʳکs wQ.߿^ŋ'b7{8I,:9I]``+i3)  WC$7oi X".qه!Ǎp܂q=|QG5&@O|~Js&5Vp&uy\SkZzk.WMJ_gRK*ߛ4~I"Ωw>,.O"f^$v58.]q EѸNٲ/&OJ#Rg}_Ñۻx,뉦pE?@-۴^#p/9ݛ 7;#z kFoo)صK{{)e.8bwVoo, \GC&xAU\ 8^B`?cy= G {{_3/ph|!9& #ޏ ?;GqPQs9x<8s[^^夿kЮutnm|Ydoe:W 6%v8>.y3e-vK*5ŮʕeVWE}YqUk1Z^[o-mpחY+kJ:YnZ]V][&]UUmI̊*ky}quCjiq ke%.ƺ~i2kImU(+ Vx]UjuYK(rWY}(Vae NQF7\guԬ,,%!e5EY^xlUqͲHrYqUv2w5ܵ.)4O]B^WT"5ۚ2ec u%e|xٰuCL-/*:(rF|qgPơ<c/1υ8]WW[7b1snw( [ eZ.z./5X .*kie=0Rl$a!Pp9rE]*a&Ԑ~~ D_2W3 PR[=]3vyMXgqˎa1Y}t j2G fczh(,+uV֬ (,\֒}u d5RP[Y*CW[#2L=WWU;r$ׇeUKAԗj'r2"9it~q@*K@$\j1]pFcLOy {I\yV)`oD.~8?]z9?ӂ BY+'}T;̅lu`+2*7d[yb$lR1JL6<R?^U_I}Ѝ?ܢâ{e0c9eܑ1MR6uHg7O F"E?}(Of:kEBiDz ZA_HAOsה g#/"9-C(a2GG<׺Ol(z:s'ڗUOXHUxz]\J&<g޹ ZI6s#}SYvEnQEҒMs`э312'ի%]g^0Hf} MZZ_ i,G<?tm\EY[s-lW6t:DmRO?aIO*Ϙ^:.6l\iGNZUm1zf"02.*nc#18~_:Ci/1_.wH(??AI%ͯ))v/Κ+x#*~WiU172']ը*H_GnESfT7F׋1(ku ɬk@ g53X1y!~\p{ 9 }@^C\0v.?6bQbKVMM;}&~,yXnb/uQƮ,몮SƖPQh8R`bvܮYTE'p[%%e dANnUe)Ͱ1Y<"W<)< SѬѥc|23T:e^-8`5kL8PmUѥKt ! j j)GlHA68kkMFy}rhq$Yxr&LlsiCT֎) U#c9elnW:!l26 Js(Fin*Vט(C23 aVBFMf"&1qQj|gn؝`nN],ߘ~C- G9;<\zt2HVET|}} ʁG`٤=Nu1~#16WPVDx9g Rj譍 */ ??"ipUSk]krR@֖M1EJ2*S@SLRϢj U&JVI`x$Hj[Vt|}p%D +,PeX 1+NQ )a<K 򪏲 k&W +H@R8C'8L15gC\ n)& gh"O1 8Rd]c0դd%&sJR5}Paqcƭ@O՗TX":=ݲLvט_zVt={wAoHҤ;X5tsN(fy20EJ}Щ3s$|>>P/s L>߲_ ?wA>?O{?|=|>&?S|=g>>o7 ?1\=L"/S|=g>>o|~{|{|bN)|3| k|A>?=|>|=|>fN)|3l"7~}f9?T1ʉxdE ]EC "᱊ $G*#q ůE+E")heR=F+CΩ} W8"Ô%J/ Ց%6>BI_L_dE>/|TD%nux.ģF(R~"/P<}y|?QQCŽHeF?~ ۷^[/w޷}sXSQ_F1θ1;%/?)7Ond<"^(wHdzڙ]ϸ/gY/cf Ob|3/3qE5lmoSxz ȧ?v.b|Nٞd|܏3"]wJ%jjgJA^37Kx*V Og\s#|Yso`|2w w0~Hg2e[ [Bm^Ƹ&+6VV1"ϒp tu_-xv QCRbFx 9~LI;x| YOG8#G%;_pyR2~B‡2_Y yf8~9G㣙^%*ۘ~D?%)Fx_!;(%9b_,3L—1B«wIx;$Nƛ$-e %kN8ko`s3>y^88fߙGoeI6?(%0$Ɲ~b ܨ/ ?xm=Kx4}&-%aJx"ǣ,5ӷKW3_[>>O%^ _xx1>8b|70 1?Hz~=Yx~Q_NI_=hKzaK:~'oK>x.铽Kx;A $owJz^$3ƻ$Q^$7_(^ƷJ<7Kg\wK]‡)VInS zI3^'3,9H$ӽNJw6y%^xҭfzDb:v"o`f^gH?%_3NA[%GBwJ&Kx;$U5 /k%S%(%'f  SJ@_DG0b|`I8~#%'KI>" $|[%<'$|Hb?G㕌YO~~Jx$gJ=J1X2,;_-3~?A?$5ߔwHOKǖIv)%?wK}* H xD$EW$ZƇKg" d J8-7F/`|/xxna_q<Ӥx~O%6F)_&_/w3,3?0W?'?!1[0~1 ?8 >K$]%<xO/Hx?.C/ %0~L¯dU)cSpY8>*)IvƧK$|.$KxJx-JJwI:e|%0%TQ q?b x`Kɮ8k6H? 1~xcK¿cm&R1k gO~oJ2wIh)kc_Y f|pe8 <_k0^K3Rƕ"|ӯaʸ17LW!|ulNYW| !o~yMަx@xq񝏈L p+d@ױ_Ռkx<3cV.‡1dBd>njt[d|'+v?~݈I"wY5EnEΫsdȗ1}Ix/ϋ.ty>y.Q>U2}C|~7WE+ExNxjofzq+k~&ovd_0ie&NM{%MaCg2z"ƋO-FhbyDj-{?x0.Ovm|fQ.{<~٭`|=~Hb9~Q5}"lUfa=iĹWD~e'Ƈ;c+?x6k?RjoT,Gο4r.fzQίzD8+oJ>dt2g|N6la~#O0c%2+XvƻXN~D>K49[yYd1}*;(t_3^vg/Y~D.[%\?x kC;' r{v6RE_-⹎rk$99x8ToVWaǦ8߰1sQx+ӷ=6VR>g]"l؇0^v0*id~4k'9?Ծ,Wp{(;?ac8xoa~d>,"r>kWD3C'N "5g\}haI`psy[a+EG3>/RvI Sy~OLWFOYfEYx~=eY!wwcVc+jƺVWU:EKݕUc@6kj]=iµƏk*K+]%&aI2A]XRP]^9f)t:+,PnXȮNo/jIP^~imͣU[PX^)UJSOJMWFaej MTh}RwuE, mp \V|- "U4`󒜸:p%EMს`!/5薀+Quِ&4)'=o^ÍJ b胚?N$(l^ 2MAM̐1 eJ[^ ̀)p0Ϫ"b煼rha Q!\څ |,NpY\0kP k]F-**-l([2+"K Ab_PYZ!zH.-2[ZZ+6i Q:VM3n`i""#kKsۤyi\j µkE곶mr[j0vr Aƺ|PZcOBSHX/Ą]$V kxf0X5ͼ5}͹&k6u뛖,Cd"[5M%> }WE{^9EXӸ0IL0f 7E I6=.쳾TkZr%lhS} ec,,3Ґ 1 qaQ``O CQ#AmZ[ O;(~b521!Q̋@МbEUd׉eaupoMqß?6Iǟ 3 2g"M_" z"6F1==o4!M t7IDF(qD9NJu o-,-v([C ajC\X{:"U1VCFoaeeˊd1lӁR'.hPJ5uJBUV])+)PW.\2~<(H4e5+*KX_ qҔʆ┴ |ߺq >_^J'ܙ%b̵u~o('c8#"cx Hk e Օ5e!DZ3si`JZ!2CCV%!zWM xHcj p9 /:ʶB E!oO7Q8Y V'T6k &=\W8.@WBvؚQGDNQUC(%N-!7U_UVׁ 6:w1T{L0?lC;lCtn``XBo+aȫ #ŘW `!PWSYTM/OkWF' P !Th4 s!+gr8眨F^[^;9+M$*Z*(i ( DI$$hi fΜwEV:==o~{}SK2ƐU\3s$ 3)h1 W~i^h#\trJNMP b.5q0a9HysDLQO UX)I/@ =1MXKXpScR-U0\G;#íW h r^âGk@W E)ehQwЮd4OI~-ToBIsh`ΦK "ib(ۻF)?5},d%Ÿ.7(n:X[{Tp(QE(5APllAQ͔g% `=s=1OB#d#fe}yXl@7PxRS *$['WgM=WAfyKɻV? QԓZ܅Z]H^ʞÚ3Nm7J dH @`.4 9'Ѫ\p-.@lxoۯly{!h}t E0[z_bQיP0u0n`%{~T͊_ƪ_dZ؆Y0H g~tOӅ+KaJB&HOGs gM}(WdE 00"f|B~\=2zK! sHa?^ʃǼ 2sm)?k*c ܵn3q}פ1>'?oMεˣ馾Tڙ;<0~K)ֱAQ^HO1#~.%s)g< |n?5f RUb} Ԥ;?~g42bb=H>d5="G??I߳?~}omg%sŢ v6;^gc0O,~>Y=n\w++,~C/YocUh&r{j~VlDe]m; {;|żg]wA_rk}oPK bBcom/sun/jna/sunos-sparc/PK BUɴ*)com/sun/jna/sunos-sparc/libjnidispatch.so xTյ>~#&hG ETi+F*L0@HB4r{#ڑRm UH[Minr{GmZwgNI@{yY眽^{w9ֹd!Îta1܆Әb2r-?۪_0 *31badH,cL*Rpyr8H7|42ۊqẙ/˕.A\/8f^m8>%G]gpi`|^{p܇cpx~p,b+iQJeV>Dݿ:>{ڦ/E~{W%ӡlxUǰLSu~a[yrQDH;6Uu96Ձ~ >0$b#C矦'3Z%oƯO-Ҷ]Q9wcy_=ч}aoRiO͏cEkʱ%;b)$ r1SQDrr~ɏ- GiɈCZοgخ~3GWKx@G>F@z{ C̈>mF4 lg w yپiI)_3f'@,z#03 _Ӵ"I{6 [o_ˉȟվR?>)ߊy?i OE~@{Jem^~?NGɁwDذo9$C=ǎ1mbG&a8 cQ^5lREaK#'>]xi덑n=ߍg`G?u^ SN?#ƣ}\!QoXɏw1g^>#ۼ'ƴ\Ba_-Y^YRTWfVTTՖvWWlQuuYqE+ںFe;V}fQ#’+ WYThEY!ܷj圢ҊFuMs :pM7Ͻ0Q+댅 AEu](*HN_Ҫeʒڊȭ`qY-ԟ_XY \^R(cEYT[WVsKEQmmYm\.*WT-Me%uE).D~yҚԖR^T~*Q ʿy…e5󪠟/UfɢȘJDBVQUTgV+H Ml43 ڄ>n} (oO$ͫBZ?u5eEU%e9j>jr - xiQIyiYQ8swrk=pw~OߪˢZ&-\SSUc@ت7E[J0i;obS* ͌,ķkeKV( gU++Jf.{ޢeF٪,\4 t@4Mm%e K@i9֔U..*YdOd:u֊t: ci >TU̇%ÚYQ(~޲EUT *-^nU0,(6X|v/%ѪG2yQs/\bj`iPɋ*)2[jJjJڝNkD.R:ɡ&P.u(*TX C%ZժZvG:L .Ad&|{"Bi9@ސrPd+H"#Bk/JܿՆ1:DKhJW'jҫA=D9MbH_ya[x.$d JlY]yUBGz[U5-\lvv5HU9(~Vݵuy@ߗԥ7dcϠ ,XT\(`jM0jJ+jW/MGgUFu†BKKU4Y DMZܴi{7'#:vK~ό{zuk7VW-+Ur@_^ZVQ]jz²ʄ4[J._j@#RUuYeEXTUp඼-A+_^yT_ Jz@ Uؽ'[{~4J-y@˾yD1Cӥ+b4=t.NφMͲs46Nj+֕UFG***n,*]$#*$^Y]8/ KhHL Qϖ-ߕ s) Y^[sMII5p2J]'?=Ots~>)tSB@6M@1ͩ*v2v *4].K rzB6f\=Eh0Mx=]=ChqL=K9=BgI/(=G]J3 zI.ZK \hBhZhNЫ>^>Y&u,4e"4u"4lۅ/iBK-4uGhʹϤ (B3}Ь!I?ļGfY]BӦB^BoDŽv4o{8)4e;%t3BS?ĝ]# !!!FX#k^{)Z#/l"]#/b^1eWC'kL//e࿄e K5OƂ.z> w:tG@tt"'h\7 t̻E itִ }࿄<%>g࿔uRWR5R5Rւ25D0`x#/g993rbFB/oY#_HOk!d[+XZ+_vVVV]+_VZ+_hk /_/ =/N ܠe,W_F2MkeZZBt!tVBMBg%ԡ%ԡܶ_{_A9}B _AWP?+XwKh#KX y %Կ y P\6= mh u(_B_rY1/-YbQ<۵hkKO&_D\ .:u%YsALO賠lBSlЭͺw uruB#&\'O9C?f_'N?: SWS?? +aSd@ >URBC.Ih&^~Z/t _?MCӅ?rΔhkgIz=Bϗ4,k\z\=OBHY $=b^3b7o?no~KyMO'%ߌ^MOkYDj?^[Ͱz|ɾ^?࿙|F:o Z~l?[@kZ/< 8MF͔瘤8b}Ph)eg3_eg3zل^634S4W?+ 3lFЂMC3o_6>BW ,l 4_ 9e:lk>#f@mA &%y_Dn M>W7_ɺ_Iyd}gm67 k)Oh_ 7N$ o Qjji %Ɇnoo'h\Z ͼn߶uok7S6`࿉eLZ Q+6J QOFCGW>[e8QlЖ5ۚC.}~1xף=&x q.0N數q|cg 5I~?u-/`,ݤiF_5͌&@M/Iinħ5IhM/ "+pަI3Mz,?$}& ؗ5Y悚/`~I=6 بI& .M/n}Ԥ&OBӛt_?ФMw7>IM/@kf yySt8l? njUUtu*YW?s,b2g2 & o@Ӑ: I:yE_GaMk}puQߝƿOhmfkmN>N 46ojOn.-+ (cѤ4)3ҍdUm%g;M~,7J-٘< <>\e/~mk4?gx9µ\}mHŵTҾ界i.ct+Lk3)/ځ4" FWʘ\6E9{\n|DeAEnG퐥uc@]&o&Һ`dvi3F|:+;wz"'1?<1 uig IEf_z(,ǽ֯fݐt˸,!|InmS<2Yj'sc|W:i^Nԧua򤌴 13F[\>Cg\`ZS^!A pS{y~6v m"5V:F|AiGj+}UyI w_}y vb{>h\3'&w)dmNui^!ZҞ:`״`tJېľGPn{.qmnͨ[qVnE|L2wK~8XCՂ)xҠz~-/OGinjާB9=2A-C}`j9.NŐaz}z|TP``%י^zJe65޿z;ϯ{'?g<~*ϟvr<^+Gr5mcō gOvl{L5#~๾5I{6{۲9re2xhK1XFXkLKYXz˂&uﱑ8募oƈہ:O0uW$TuDÈ\,uSvbΌ0v1[GLj /gm• XXo [@,486KOlj֬ װ >zXj??I,m>Ky'af \b?% ]qzN 9bwvc|U9GmsuLjL1{xY[(]H~tv':G_C)s*ڃ[s KlEtc=ɊlGyw5x: }tU5 GإM;'w}妧FG|妍}+W)Mn7RVi>1zq^/zgxl]oἝզ/yzdisS"zgW3ͩk8nj+w>$F~od9ԋg{LM->=Mi>u^{fބ}P߮uuN#}C(-=tȼcHt`Y{L:C̪ߠ|؜cVsaPvڒJySPF%+oSf="0DGVs畣HsZ4175rm&һΛ Xuc8B rL4ؠͲ{L ڕ <7frrEB>)Wl[hX4[CQd*xゃEX簼~Nٮe|3Xvs-wi3d?tE  l?y/@.@?_Ѧ\.Wm^|O]N{SwtN4^J {.bnuR]}yBfjmڍR~<ʋa$dΧۃߤs7\,~9Y])g 61vm1O8H\UgX3RdNhc$lC1c8xIgNB6e}с::tV۠t>o~;3#^M>u~c|y`>c<-T<$.Q%ΎUumsc3=ʉ3Rwc{j_ڌթr{XgYYw ]0v6W</ΌIsp5g|ECɃfEDcQhIη|YwhVYGZkփ9>@|ȷ;H#[_{Zl-TjG_v37~|? NuLPcQW?NƉjZL96fqs">dkО 9Wu8*_kt>a޶d/B#>ahrZc's7!,5'ag|]1n|hT7JT_^L*OMʻ=gj5w5c_KlkaYv9lqݏA^>>F}:d9>Ծ!_dOzP@Il3/E~Gᱵ;<mve}Z˞?}ێ{T]ͳTNH ϡL\M9qMg\ߤ-9Lo3\&uaڨdVRNxF4s'/)wnKWts6>й{s}ƨ; (T;l읨:Ʀ;:F :ݏx*1* hڽ:҃߹ʶD}G';8!✇Y#ݒ "}DŽB*BPj(@6ݎo\fY7eUB]}:^EzclzݒvmM ϵr=1ۢ;dYx^3͹[/n[6!j9~CG[>=Y~gw"罳CAӸoT \ kH޻CU8J7ל3q,JB{>`,׽Zb'KyϠL藝d~Eypmdu{9αy̏t-TC񗔁|ռ÷~ Foj(:QӜIԣY撲+ٛ ~4(%sM^C/Ac^wU9Uts" O8Vכw;YNQT9T9(Wù?jJFHsJ(y΂!3Y#sU~H>51;2o>{ YwG'w`ʀ<)=g)ϝ~I8GNPi^h7~Gw{"1XCCt {+m#ܡV1Oysqz '{\h3-0uۢqm\ϡ}KAvl ve^1=8ߣOqң:ieK,]S6 OPK1J!_.=u7R?pRNs,6LWr=fk`<ֹG h[ݥX 1>u;g|,|NY)!cr 1^)x_Vy{՜o)_jNȬ=j|1z43~4j֋ڋI:y8845zL^\s ?pz{_2_#8cu4ZQn5x"hg՗δ70BUAp y.ae~={F ϘJЮ]jbD<85/-d^Q_Ų OoX|6mݠɚ82-unآVc60DJ91Q6GxŴ㩗F w߷;V-~bVs96Ww9/߹ v"Vl=Nm2&e!cl܇8A"sMP>7+a 5 |9.50S98lFݛ3M7mF+/a ö_ߛ˹^7ϻo~X$(~yܣ/ٟzZ8#ؙ݀>;y@v&g  CוΞ]2юv#A_ga?={#=|qdm=NQc;vuuÂ86Ƶ}?"bOwYu~Aczco9=f}W#?Vcݎ;A;~j)2:2c65_=<ܳ%O,Sơ'{}ӭ.g@_,〬m_g-#]8Ǜ ; gbGzm6o &fɾkXg;y _:Ȃd,q)1} [~Wp;QވFhxG=|'oVu^2ዑ/H'#^K9ۡeQ^m7#v{Ǵ9p< mΕ}e O䛡p LMLgHy7|s?G N M|>؄{{2"q了qմ+pNٓ/zOB޿ٓ$WYe|V DK`瓉{m tMO{n> ^\79 =bˣw>n"LP]3G1F &s'.Pn֭6HkGM|K+D>3 yG949_=ctkt!Cz^NяA;XH볨E=n‡X炱OY˒k/NG<#Nr^VWtB:C;̴':&z\VlOjD>a^|؃,R>(1zCGq:s)١&yԞI>W< 柪hYʀ(O:1D^C׷y k;x"Axm31F4pS{/8 Z]em~uz>"K=e|tx2oc{5ԳH4<|Q|Ok2]W⯮dwjd5= I.ejՊڑ'͢r/c'ӯMQ]*6۠(~]5ƫGDໞZŗDߛexFH?O0B=(T7ce7ngKiu~oG'~kNJGWHZư6?5^c+jߊel޷RxлSpq(z/ۃl(tcʳ80>} ιq[`gL;90P7c\\;c^q[~[p_vՉNOAnl}!5xkj kY1֠{>x:tpCCsY^A{˴ߞ/ׇuڽKR8[Βv۲KfIVK6t.v';sq-nvVR8gɾֹ`5̏clsGK7e7hZS۪Il =f:5;ʈ F}c˿nug[X)|׭ӭ~Y@=kW{$Ql x i ;=cY,R^OCw߭|@[ JyQ^5uE|v>cU(f_TҌu5% g(?b?)/|@f=wow+i X>u5Oǟ_-C缅zJ ^%Ƥ{'Bu%CXHs^X>~ l~cix m OHϼw\_n koB;:^UuW"u q<4jv(4(۳'A7K pLon/bm[܊?IcQ2/܎|7pL;Bҝs@\×@wj])wf ΨgP\HrV>oRD#vu^{Y9eaLݦ0(mʈߦVE)ϥkS+υ?ݦV:x1foC x׊.R ._t]/A t쉡/R/3/P8u>)|/ExߋNچށ'K1t"u<u\G/W,:@1]\B'_u\~ D5бz5zcit\}:14mXį_φP),1އXLj=Ƿgݫ۳.@{{gWMHh~b@8:2:G~)΍>}({ Qc5&pedymЧzG߰]~}\t:0sW/Nz/J=!k8zCWGߏ_L_ CIӱ]'oy;KZڋ<9< |Ms˻wc m~[Cve+>GȱQބ8 NI[&ǰelYE2l>ߖ۲vmJ-ǖkYFz`}N9}Q:{>T{ ?#ȶ4>(\վ/F^w}WwM8}0kww5O*>@g_? +sw2].51R}q~0]9i7ACj I#]Q#nmC t;&nG q?65nJ D-s^ZUc X7}ٱ뾬oc f{XgI/v|?7ۯ~?݁ a>OE=7hk_*?IJo^mP\F;<n/w_L^,uc\`2㇖%1_<S)⇪[:Ns|^߿b~n~^;/8 ojІkS>&q{WXK]wyNzG?CO_\SGO'R7Hs/շ%8{[vLGbl?^9?~w=SGU9/Tvv̍羪Ljz|9Nl 3fuqǡrvcDgӱR3"feJf!Fm~IiY;3=un7D]{hFݦ]!m*6:3f֝ds§ݨu uNYg{bSX'y?*{e3ȓWEAxg tygFy_KՂν>׮2y昸*MFd |l{om`hJ-chD9-~YʞEPvJE93u,v}r-y`biOEs4~N#mj ` h| A;e0_T`o |-|+o |[^uU8|r< /A9R/>^{>`9^y)Rf}:1Gub:$Nv|@ٿr]b on7ϫP1)'罿Oo L>EȣU-e:o\lC(8!NvT`Atq墷<u/(:V̶:a ŮA/iC>Umšc,fxqҖu܃q-;(75kG֬9l?? 2^֒5a5 eL#x%x̝9; 9G݂:\1q&  0&Uty?s[vI.d 1%e9q7F. kϞnzc.mXva6{s~u5$uȯNz'ꪾ٬ڟqIZ&~c;y쀯vrN1^p.5]K[gEoiW5KL=7cӭ)(Sɺ|f2>-yv =15#yLgo>etS gp=]һ;Efz3s_sw>R<]7tCރd/tI1|O|άx4||8O/3=~wtfBv~\>v%X7nw<,vHw޶-ZbDa/F\;ϴԱuDoQ=̰Y$iN]483Ͳ\@;HC/$GQ>JlȉK1q=[(31x}Y%mH߅C<҆e3)ę1vg oc0wz|_wo,4'yfy/*HUh~+].yQy&Dų>}䛏|30UQ40 tp&Gs{1 _}F_Gw#n9ϡ3d[Mcw]8}[<|wQr~ouNuxk*C]> >2=KT )s&izF %-zy~XauGZ&"<[K|O >K mkȝdic{+>#q;9C8C?)gw}BC?->n)"w?fq2;9D76sAC&8 QFUsj,*7;?8DMw:O8G"\4y/_sQ8+75/CF t;N`uȺP;-u91H]Yr8?ɍSA#p>"ҝZ<0MXj]Z{}GSs ..~f@]]H\%RZpE֥%A]߱erNkMX$wyY˜uY|wuiȺԥuog\D{Iˮ8&`.p]Ґow,s.>C:9>Iԫ#R/Z&=QN;oF֓ӫ@Sj=YSs2e71yȣ#1xr&j#6"?;3܋ 6tL=ZuS9"Wg"~Z 0qsh8sc"43s@ϰ8%{P@{{[m$7yOo۝6qJd>S߇bڂ=|g`X%Ebv iGL)[$,"cD%ߵa~AqQ5Ũߡo''<85 π!f9Nǐ(>_yĊ1Shz7"d#(c|,Qmp[N ǴbKcC] zN"Ok݌Η}yyK,AdaL5)WoUʡld65,463OXgXˣd#U{Чu|>D~Ssw]wAD%fa~o<*}AA ~[¯ep~1w?}z\l>8?gls~!;߇S"qw/wqEh~*^:??;kW:~\nBj @P׫.{5\%OYEgs4s=θcd:UIjiߔDzvp?5T-i9vAvE7}Ws!CzY~Ԓ5~/-\\TkA~|iM=̱]OBzJK~O=bZyy~:0v_2 Yf*SwZ3ީq({ eo],<+1i\b1?1phkEw{}ƨ&Op~O?/jC3tc5Jop|g[wվ]XeuL#;C'y :k9y =zsr^}Ȝ3I3φi^]Dت?]aȜ ;2C}s4<_γx1rg3; qjl;PN 睡35Z6e$i1Gŭ{-:@`9Ž ~oo/C*DRwNnJ+ս'Gh݊ö: ^;\껕c<ֱ+/pϞ|@wy}H݃|7n~;0q|1<~|ggT0N{ޯ퍤;)Ft{ɫ<~] \Sc:;&{;\,*:n[u-'%,KI3꥿B8o~3ȼ8ýO_tmN_{^gcaq{S۝}d >g,g%{ƒ/H>#$@-:4mK]|.iަ֪>iq4YҘ3hIj~87%pw{E,z>&64E=^2䷄Q4 } =)}3'Z_nçu~'RgP=@Uv:(H@?^YZ x;>lWm>&Fƙs |vg k??l]}yz>^p\Q-o@s]Jo~ۣ0݋~ e﷣ߋ<40N;gϪ=zqq.j;ɰЩcf~s|մe/S`9)ȊBʫV{3y- ˳^c!xr49QJRo;RQ^߹{M;s$^Ųp}7M\d7xRї6\m{/6g2 1(Iy6͌ot:>O/,M ڑ^K{ 8=z6h;fiook}1ǹ?pO}QO+R^>'}:S|F]#'NB|Y(9ߋpk'A=Ǔ)io=d +iAC/~ksz mdc|8:ڶc' `moG0{шwv\3#eq\uIӷӓ L{3_s5oJ|qY3oIsƟ.O(84*#!SR:nl't^'3֣OSwYP'Kl&z4.ֽs1GIץ7F6*=;F9R{}]ɩn~l쓟?~MJv~V>V]s"M[;W6azsa'/XȌBec0-!.}F*ԝk\3o}kAgw!gٞ|[ڦq!UO*/vHuY_FB2B8ڝ;;.I9!slosU36 q Gw(tWчp;B,{;e-S Bsmoܟ۩pw9$-=7D_ڳ'pv<{I=ø½ҭflOŋu_S)3}J-W)FE2.u99^OlԼׅx-W}c~&|<ֹ >XljӖYlofׁ`B#V~cZ\a*#u|su%1ý^gox퍆7[xw*q=ٻ<&y4SW[!MLcOz1 FzOz.ÇώEjuA9#g&{ S6RhzN>t+=Wn t|,zl"e_c:X^XuN[|ĈW̷m}h>-ߢ}ߢ}ĜS߶ewm^o"? ם ӷ;gp|ߓ1gtBN`%EcE-i؊钁I+ a:wl)ȇ.,P6UB>){},لf YGf᱔%ψ\[ɽ{]&~RZC L_G#}lnwm$yB UpfIڻ՞GsEP[{\|&I qbό|ṁPlbj p4 ߍYN3[Ã#7zymHG:#~zNB7 #U,Xv)Z\?xdx[[]ٯ-d*?7ciIn'Yؾy-ˌ=P^J!~y.9(Œc|Q~7>x(FRo|9>$&q1& rioCOutkl\kQ[B46[]KfO&_a炌{ɜ+2נl2~2Vp0#E>+ ~YGe6~ _򿭞3+o}6M6z/ꕖ1KS3NOpl|.Vbd3NU=E6j#oOp;<sI2@&!V6!@Ґ)hK/:3$6I3 Z%^O) =5Ez9=詊=?ȟ1bψzPۊL&~|cxY^kk.{fѶ^si_k> xt+>S셖^+ګBLoxv8bc_J12$/Hȁv^Cm~וZ˶Ku-սSs"̱˽|>(tI )Bkp~Qq&ߎؗq0Fy T$BMzat=vޏ-1^ڷvT uԞj)nuGބ|Bl~e'=G@cj^P"[=o(e>Wq?{|(siZ%ogзKз eY^㖮<m;(7)Yp}[{@7}Yz8Yd;uŠ>P drޓ=t>YnÕ֞=t?9SWdNًԎ>KՆGCe;墘b“,9uK,jz97{eX„>sDڛڞrvvx;@w"ibxJ{јDg hѸN6(U; Kaְ/+Զ}Xq+iߝs{cu 曞Mkey_h3:Ϯ甍Ƃ&^ΟGzC%3z$ų\v_K#X4Dj sKy! 8V`Yc5gšq?>p=/OyLJ]G'_B_S[46hmLQmEԆӪxdO=JoƳn+LX5<=p<Їdo#r9=j )ewYoΝ3[`h9Kd-/u!swsm9nvպ| 7?e[N-MܬǗ?k[=ޫF龾aȖoA޼9dgDlaoOgn|)U V&=.R2Gkyjx ;טNԩSlf?vPgs^LN?{j/yum<wJn`֟oS{!Hn``N@^ ؛6BqZvzC^-8=(ZLPav`\r  CΣ!׫da(da(P`U\U\U\U\U푕u(A1}3c:<:Q!q~_ɝU‡܌bA} Bǥ\qE㗆#a>\a̧5IC(Lk^m[ag iA W>r>_H<<|}''xGi&ͷn'|fпYttz,]v}q>ξkLOYE=4 ZM3}@%OBKߢxdc|rArHoI2_Ekwʖ> қsxڥd*CSh ZQƏ6gV6?Dekßl~Z˕:_XG 4 K<'Ea6ˠCJչa yŠ~~Ӊ8juOðTcKMIب'jԥttrrB=c9u|H͙ ˻ouۊd^Ok`.6:;祽鐻*Ts[NuQJcxR6|`>yG}<K!}-Ugr9z4--Lkv_(OrL;7ĸh[f|iTE{]F \"j1N56d]te=πϢpȿ:;AKSHwi^H]OΦI9 }jZw2ag>hvO3ʶb|QzӾ33yoǝenj ]ǜgzzMM>ڛb]%Osy_UxI(F`p (yը?94_n'g.G qP_)')#{9db58:xzhMk -N=I]% t]q֑}~k弅pL,Tg憊 3nή^PtSVWWCk9/?z⒤ەs@K~KQW(qsCB}=?"Q1mse.،Ҥ/¡^FzaOx$%}_\mQ؂\;'}g[]}5!^O u" d;9aP't}K ^Wh2䷐>`$/Z_o~sG<8uT:z Ycf7ϝx>Z1z]pyTGUHi}<7X88_^mF@>lzն[m s*p#9@T_OjbɱR0Z]d#-_Wp l S>zƥP~!k<6~E>la !f.ʕQICQ2PIMeBaDҾ ^ zs4~}j^qF{_XGS7zAsho%g;9D ~3,zF'L΃~ߜ=_gʝ@K\;: }gԚ<1+3|<=~s'~[s%oFʗ}t_M{. 5l* M8I/^R|t&I 9Ӈ|ɔ'#=MS73_җ2D-b g}XU%{K; d(F2V$=𹈃C1𻘇mӀ8M : B?z}?~I@@cGwNyF3{*pvΌʤ{8ʤg(c{?yz~a]υ==NVzSOSkm;P7ѮG]7zf/,]AwN qy!khy zȿq 4J>:y7A7='r΂:#Yg%+%ے$Ɋ~Qw͢h~6zNzrFzd43˟|?v9CWǗPhN6 nd7~7_|<ǔ1 `wZ E㻀mt}d?.Rz)՟ϾxD蔤I|Ӓ+_o,{dZ?=bS)|hh>oz`\cs]N'8x=&C_Fqv\#1:|ܱJЀba뗝,CL_r'.U[xaӻ` WR,l%Kƒ~|l.E[KzE%/Xotk+(F[7~55EV;6=ܖ! ymۅⷱy uBʏVϾ"!3bK}s\j0A7֩ 3aXsRc@jzoXߜ|>Z2X<e|20"8Hh-_l^*ha|}lW[s}<_ҚF^ͽA=znp3QaS~l7ba#oqƟRwψQ]Is3Kr<'O ş 5'H}{y^S~#q9xb4_o|_ɤvs&c$LVS$S:>;;h_x-W^˖p;VLkX}Oqȧ?yN|իi?AJn" j *N~6þ }8sJťsMyP0|=vlܢ`]rp&)W+׸,xXfWv^_rV9NE3 YgC}_tj?hPln҇3Opfg.sNgYGǘm^znCnqg>c{}vqndhIv=u 0nAUW( Ya:^agvv֌>pUQԓk[h~BzgyTFЈۀh zZ;(s/t6 qRGq vYǠ;Euͤ5:?}P\MJ@ bCZSg ZO'IktѸ]x?˄o<^k(Gj=ٛZO$6q^h^KD YHR,H1£jzCoxcoWnOYu.0=s^+'xz",D[Ř>;;SB1ݫK(K5w9*b]y݆۫bm>e|5>V>G)_O>q='?@Wʞi^$!lx Ig9^clSߔs^|`RqI/>.o_Pe+z΍ e@h.î{aZףΐZGSk"% mϦM(6$WaA¶-_ѦupQ7t, mi|鴉&TkYh`цBP{=@WCz8q swl;ZO{~Lϫ- A[\ݓs/?wgV4r9 T9_'O c {t6ٴ㊶+{ g4/Q>O|YxaG|M#Op}(9Z[t::7HSY*z3qݧyғdw/Ca{*"?|Ӄ's`oSxվٓ/fkM)N[(h+w,8ncPۘBv.N\Kd?i ^f[Acy"=Ty_iŚkKTue:LObX0k;NݟGrw5םm7a&ET _ _)~ߵh܏xz,OB!z W yhMu`Y'JvйA3ނ2[`jӪ@*(2 |+Uaxw:[4{CiC!wjfAimitbESDd^{c?+m#o]VMI6`Z󫟢^[Ÿ~MMwf  Y2)7w#A|+{ڷ;~</힞$qp˳xSh5Wud.u5Eu1 Fm6TMNYΠE{Vt6m{YTT7 ~l疏Sgh`J(5;GGB/L!ؘ9kvQhux&㯫~y.uuNލ!8|XV9zQx@y=^ڗ"{ 9,|+#zMJރ^r$')5̧wL_:&"<ð]qm9"g7*Z/P]A}@:Z}|z] 7% fh݅gL‰ ?F ?s߶;_} GPu;Ly*;E,*O4ȆϾ_sv.ҏӫ;(^ ٻ템 tn4ʫnd."ntG=gΠw[r1ڬvvw)fwELﻄ9NAZ8qESzdЧElxjMirZhޗo>ȣwLo\[Outkz^UܨXi!ݡ>mraT1gJq؅񣿻rYwS Pg/j2k=^uU SXڤd:GWIs;Mᢶ΋y8YƩ}ɷ6d25//$7{8yq^ 5t=KObھv*'.q,0 +ø N^SD0VOk'ǑGy༾d' h]^M0>]Oͦ3ݯ~7gJ]FP7pкʻ'7|si䳑2C' ɡAw2yi*OƣN9v.ggRIυ9rWf{9_C}f{99_?4|! ^Es1/>*㫦'غm{Ue3I!쿤׹1B+o1F6IꞪ+HB%Ugy+ѽ$PnA&왞t횎yg iE/ Ż!t ?{ U @_;#*+,Ik]>UZȁ9s3z\4_5vd=F`:[o {wd?'HҧS79RsM>![$'5D߃W"0¤s0'P2L}^,:#6ic;>(ΆZeL@]f$ͥ&"D=J87KjX@tؿשMϷQzOz|aД#3EC~N}znchs5Ү&&QoWLppPZ92xco_FM/0ؠ:W7mmusk7 ͟׀$ʩ]Lk٤~/ i $)Υc@~MPNH{Cz*4Nj~r?fGh0t/Ѵօ]O zYлM.w񝰉[ M<&ZxDIߝ|sƚ{J=EJTɢ؟Z,:{vUxzwzW!Mi$}5+m̋_nn 4DGgC#b6FZ-XԬ-"fbG{HGGz ֖V!R-k6[Z#fռƋ ptkWF[نlokwS#m0P]Pݡ|Ϻĺ#m gMeᆆH<+ #FD~~OGK"c0V04LcLx{!b6:4:DD̼07jFg_{%Q=&4 ,f\"VHo̶p#gͪvs^+qEh=֑4kt630ᗛU{k9/n4; %SF4[M13KJ1j&HB?Vn6&@XgkےD-;ZZZlu@  ,fs5²v.~#Ԑj174f%a&UUc,XHo*x~Z`꜓TNɬHCGTy#вkmc葨5ܱ%)9{/lGIN 8[cq U;Q څ&fi [j6u`6Q-fx|AxSKqMK.aS_FR.RM$R?Z -e5m(ZթWoU_|z8ȩI:.n0- iG*Zk 2m{'&aY]迦XWJ|xNԵo _]ah)"<38lLK.k4m&vbLyI$Uhr̛8wr* gV*y4q&ϣwYD=v՟ĞYTm$satӅ =+U梑{VC КqSUWnƧ̃L6Ц-Ư,b4Rn()>>'ڦFvnd|Ė%dxTb"Wvt}=ZɎ4.Y}B[s5dkCU,eṌd:,{>E_;+͛+|q|ljj Zskz֟mȯ_L_7pժD*~[E ZSk,wcsK+n F -0}دa&xi雺G31}2Zrڲ=8{믾eSH_BF)3;äg0?SAvբ<-͓O8EoQQ3[ \gom,z/QFK\lS8|Kkj.]eHݲں˖Dj6D7.Mϫyus5/_⊾za3 v bQ+ iP^[ObF8N?-.fFӱtҊ7hKl.Z:G""l%ʍ}ʯlwd+*Rcggy 4v,U50* Ldy+H\felhxӭ!YꯈZ#}wdIK܌ڜos/b_<1Ba/mX /U,k VrQ66fSRSVfKѓU+2 ѿƔ梷Y[YNыKWYNӋ [/SyR=DvTAE3s.t; z}U<@q+[SWT#/&|+u?_WVTx]3I3nt Ӓ1Gq{tN;<5| e5|/+&_B_t_t=/pz=_H?fteEINC N{Y>g8-wqe?cH?$pw5| ҧN;H^?HotҝEc^t+7#F8^ }/!N?98݋->&NA>k9= >u~k8+te }H/t%K9M$5&$pI+9M?$qI9MIK9M_i"Ns?$.NcnYNCG4/i9 !!#oXq477{?V3./k9,y,-̒:Aރ՟slCj홠Y,Yf:l}9&yo0^_OGs3OTn|G?p䤚Ryo1fyMs/ü^Q$üv0+ Cvy=~üVQ\_,xh׮Im_&j[?(&/ 8Xki<ʟ7_x| {mtsC?=p h/e8R[-g ;9*nM N Xy@ZC"#Kz<_'e waBiMyBvIE{>yZEMkmMkB==_'MkmMO,%o zb~.XeF<.=X? X B=ϴ6w zcJsw>Ϙ,)g>mhBo}o}oۅ~߶ ߶ }ɇMK0mLみI𷱐oc] п|Ob,'y_؟|ēQ>}?*QT|?*|?*G% Ѻ!QEp>`;ŀ1W;D .,_e ܀$!g?[/зȫЇ`ylo7`A=:~|)ீ^>7K|w .}[n!w |B Xɻ|:A#6 O-݂_ [XCR[pa܎9j4? D"i:FF?Gd>#Pֆry|ZK?)z{p1zX̟Ca4=|1_+zplPy$Yd&a^,Wl' yIw)W&n0ɇפK@@~pWv?pפ ? |B/M ,*ऀ>\eÓsP_̯'|ɐE&_|<\&VM(7GϡXg7ev|dzM?,&E6\Fw񥆱~_ע>&&B%~*8MƷ"] X?ſ,S }e 0'ޕFÕ?(_$@yY#}:$`CŸy_ QXxОX/)GX)Yl|Mn/Y%(/7J> \{Q^?|%?DyaOK+7 8kN^BJɟ_zIBBJj\0E~alu|ݿ{?XƒOܟ|=!0?HL#"^N3$~ N_6_{ܟ|ax6hd?M=>#C~X?W?,+ETJ;a!ϥ<ȘcC?G/n  KH % qAoq!]k8 ^p#χ}K>0~O-c߇},M p&S>p_X pS.ȟ LjoICO"~`8fj|NP=?a8fmd#3I> ~S0N+F~Ey¦ǔ>e_X/+W߂l(DN_%h䥊*`"?)`o ᄀ1?$!O3(H_ go>j? 󉍪?·w1oM  k[~++ نJg}zq/g)Qaʿ=|mz*#SW#?5tN).4oMW7mm _;8ӌ:0#dXSZG4~(s(2C.?g] W~i ?򲨏3o0v?Q'~r>|_>&^?'al#Z(J/?#3$&>0:t[ 7Z[Gj8S|hHhFg LH-#dRrX@gBG>H!?3>τ>LG{a(+g ֣,~B:[~fMXE2;Yp#tA^#լES^OMeGG۟%O6nW5\_P⏋߃v{!EI-x?XqhV'xaد4!v?ixvWͯs {u6=gly {n 9ٟ3S2e>_3zΧlIyd+ѼB21_XKڇX_o9 ?oɐ9[#KT|:u< Xs2}9dasFQ79M}p>Ψ]81oEa<)+N~.(3f ߐ-)WwXgTi{hW=C}wSh=dU?;>T@vx!k{-Kܕj=otxi."Ȩ?"~oh}p9C5ʼ 6}+ol2zmTi>բX[dQpk`KgKk"eh,~Y=Ѱnы4J44ez 긾1~pubK<^QN?#EΦ&ك`c,o6&b`sR;vMH0 *$M6׬޸)T]s]pՆo&kW#}Bho$">e_zFW޸>8`{^׬Y_>_WZeN-W_~ů5X_ck,~ů,Xk,5beƲXcY,Xk,KRj,KRj,KƲDcY,Xh,K4%eƲDcY,Xj,K5ReƲTcY,Xj,4e2eƲLcY,Xi,4eKRi,uKRi,uKR,Xk,5reƲ\cY,X/*.SWSGJֽ.T¾O)(o7ҺnW;z0, Hk֭_ uꩺO+] k] ] ] +^ k^ ^ ^ +_42rVkRjFJc-X|>Joe#+ 4#8[aXe}>VZ[2D [[_ʮ1>˲YͲmqe,cX|A>V!됯2:cVX}>(-,x:2ˌU`P+Krl|l|l|l|l|l|K-ϭ]aePjQי˯p#lA}lB}lC}0Ji1"l|l|l|l|l|l|l|l|-7f1vd~L?k5ϚgfY3f;^#K?륟_kIFzg^Y/~K?uk5g YO9qgqˏ[+|9kg5g Y~@?4OIT~V!?U* )?n aSW76vD,NYi4~V?+ƿ qx$4 +хÿĊg{ \]%M?OK @Vj7wuhDb&HyHpq"{tuPVU7վޘThIIXmI҈W= 9n%VH.c6RSG9RkMZC9Z P`13PߩV [NR~+$PqYbGV~~=ʠLU622i}Ѯ-vuI͊Aj~H--&ͣxdaq!~؊NK=kq `< nI~L&Chkh Ʃ_6K.A_-j`[#Oihfjж#T-NiO[Qd{!@H Ů.FaRT1"NٮJ4[%2ĝq*(7VD>ȾJ.#J4JanF!EȬb-hO:I0HMF%ؐ+*pﹱ LJru0uh";]1 跉jXu-hV`x֎0A4vR2v&s:>oEֶh[=kX{"li법n> 6Äv#-hAzN^5n1G#D+4M֖ͥTQ/H?zV=FvdI&G HG?@dOhlħSkcR뇼@U>+CG"Z7d7nzæ 3AE'"Bi;[DGcg;UFI(D[0  [̮;q9S cʚ{W]A_dj #ڧB1+N&O4]$FE_hLpWOy*X-%k&^W?YF6 V^SӆkkVk%n&B=i tkW`VYxh% B!O8Ba[ 5|e?t?9&3Zk$,S(oEO.,fkիKS;ґɘж5Fa/KJ@/GMXnֿnp*= /7EQniji¬YƷ_)0]rڵ7]l.^lVa}Y<\8X{ٖpR< vR5% wDt07%ZZ}Geo wM(ZW\aW[Fuh :̓9oV]ni-Pf5 W&jT[ !ꭱ ugC n u-'[P߰+9 }o,=8}wi,%\Zug!-r'LC u9ߖ>E&up:"J u[}J?Us>2ڥw/. }O.}VI\MzEÒe׋r{wG[/=>5uG):9wuֽY}˹gz-o(g*.SrлJ֌r4 !?0 6q܃H=($rS㢜"O(Wrݱ,r;.uMՇF^fLZ\F_NrÖZNM]o,9H#5܋jRt|,PK bBcom/sun/jna/sunos-sparcv9/PK 1BJK=P0+com/sun/jna/sunos-sparcv9/libjnidispatch.so xT?| 7 h{(T׈xBՠH& PD@1pxajV i)Sj*og3|s89k^{~{/gK^v]hGgc}Ty!Z>2s=vU|9L.~'}yĒϝ̧"̞gO{ߓ=}[%ˣ3osw.?We ~f} -F~6o}}kU]_||BGg)'M;Ѽv(g~e-}Ce}h <:I?0oqZjf{0(q&"v]~,h), PK:SM-Gx&'X~?sB[:ȿ]o56>u)}]tMe|.]*kEh_)]etͦ9tnk]Y̧Z@Bo5tIǖ ]wk?^麏K]|_AJ*Vӵa,yӵtmk+]4|5IbQ)'Ag?I,2S_/y>Esosz`_)F]Td{=F9ǥ|b3!z 9H_XbMè^'SN}kg~`Ӊ#U6^J/c>'>GG}erbj)#d@AK҇Rzqo9OyEڑmMK2W[`"γ U%L'~|uhS/?*v;*1\_#Zv$A{[ϭ_]{@߁"?s<4>]ԎϤoC;1UorlIo~ˤR?;J"{(U&WG\Ϭ,zeJˤx(" pz1뻩{Y5)1PZze=?R%j_Y:K^r/=fZ4YT-zz&o;E_/3؂ɄANJ?.ܜ+,sD/NEDMs[)$;9>+n wR|^NfYپt/=ɼ{I?#R?ɕ{<)?}_Op e)yppεU|I_(E$yߐx#s'DEҟ~zYp$F )zu}}{]fiQ"퍽L'ޫOJB8I_#"{h~;DCR]h@mvI-,?O*.^c\b&" %~Ng>>?WS_qկEzal_>v*zuYp(M }Xʕ}?k/d?TSz2E yc[W-,ߴi/FNMK˸e{g[~9H~[,v|]Ԏ7SsK8߁qK=/tiC976szDjo4U,q˭~݄&Z7Z[YRgNb/9";ʾ^'O9:KkSi[v~ AWͱ/ yQk*>19MEoIm(mqNwoGJ?@Ձ>!#)2I^Ttvmw,XR2wEIR k.*)/7V9s,䎹M8R\Q2mԪڕKKʫn+Yx/-t%]ɕ%g]yvт;ݱB0^PQ]R>wΑY\A,,B8C[*]1 +]RuGټ *T/:FVͿE[hM_P|QlQyU %?rQQڜYPり[.\TEUbƿΒ*9JibH G P,U`AՂdy F߿ڑn(CMVWkJ5#%$zCc>)̵֔/uڔLk/事L$C gW,6 Vq[yZIPK L/{߽d\u{OOJ4qłs8JoMOW\Yב5d.hmcQB!p>w(fGTqz4..uZ\b¤bd)[/W lf"ZU3kSUikaurR| ]!%p]]a_ϮXTZ^ <_l*{],BnsTf9d䴵9sU\$2]%]fJku ˔=J @e@t> Sn`zi/]dܲn@ZɕKbBŠٷ%Tv٦.!uif%z̤k1Ia32@I J*ڎ/KE>t:ӑeu ;H)k\rvW ר#d_qqeE Wjq La܅hGTq$<;'~GC'we 4}M]v\=Ky wƒ X)]VEΩ:%Oj1$.e!|*ݬ -T;NZ"7t흷U8E!9P+JK_rɌk.SUݛfoIO [(:(?T.]TcѠBܢJ$t \HQJAU-Sdғ P%?X sjvnNJ/so{=~J^t8ӗ((Ӄ\קӣ!7]K2)~!^BdzBfBogz<vdzB| ]3~&]nuK0=7C>|r>T1 } ?d<^טn(ӋzzP+:jx{|Bg<<T+tn+q#xH3Wc?N0]]:ӣ ]ʯ.nG+J( e:VW_kBg=W_z[?ȸ]?vY+t?Znn kٿW+>й=W_b:3=LW_'Nʯ^ʯNYR)RB1]Ri_Uο^O ]QO< "WHS:?!p!]C j0]O'!?tϐ{+^W@ݿRVnw!%ieRVn`:=*TRJz&%='JoG~2CQ%[\*7tJ&:9! +woP_rnP_zz]me g?A F:G +AR΀Bg?AHyԃ$Bgߠ?gAK)o+o':  +o*o`'_mI4+oИ!t f=^Y}7+/tC3X l(t3 ؿ5+_&' 1n/c5+2YBY?7+oR8l2]C^ r*H$/3쟛/cmt_Q2n//cQO?ݨAFq}7*Hg.?}  2=?oTs٨AnG ]E^Uol )?tnT ycTG?R  +or&F{(WqΗ7)qIc c&]37)_vߤ9M >7 I /1]rBgIr%-oP*yU+_%RA+_zU!+_%qU'_)Q&+ &+LWRKJ_mVۗ\f+XͺBg97+_z۬GJfCLWqYJdm(tnwUsY˥ WH: WHy0˛C ǧ`nVqYRo4tk8>٬ԧ5RD:ݒSCk]l:p+_z,]5˿EfP^ `mQqE ]WqEjn[t]lQqEјRLWqEieE-另ӣ:#q+[::3[dJ$冕? ߚ`z>t]I QpBre %=p:+_ +_"5< +_z+_ +_~8T貾 H)_ +It=DV/*5+1>t5zS[ʯW8/% G!Ig?Q`(-w"'Q%" ." [CI`IOǿ%g$DJzORI!Qo$V#A%GVtk/ÈnQQBי?*{D >9Ή?RQ.wO0]?ߪUkBg9**U?aF׶*rGY[2=g?U [_ت?*r[ULW3]ol )e _q%]kQ^'J$+MRBnoU9~۪ݷi =t%8t%8t%_3]Wӕ| 0]ױ޶ ]ʩd6%yDPN):6%y$t%y-N?oO۔g?k=n )t۔ #۔oԃ2]ඨB2]?#ߦm*tz.񏬯g_'ylw?B/}PLgǸO wq?wn(َO(/dI;t~6ӕvw(do1w(xb'йOD1]i>P:QR3#A|ŏ9F?_< t:A|ΜJxST&㫝Bg;T(ӕxC٩zo8m:to},; N5ЙrN5~vgHsS7dlC!6t?҆w!:wu?!Y6t?ˆm萿چ!6tȿ;xߊP鐿؆Kl{)q!fh?ݯ$rLmDS׼Wvu멬QW[/<7r׿i19t9ߠ#]|/iY/Nh(ާ4CDˬaDSIޫy8K%n@G|=7G>B(P~UiR,NA?BW62XV= [P_e+'_1[b@=§ !Z=rʧ u#Qj/]sڐ5Ͻo7~>eDwSRQUiیcֿdh{ -Oy4|*yOtQvp}x?Ŵ-U6M@/*drSzW%BN<44A)r")4 ~<3!OOϣu<# b/.9_?]IX@bLY4Lg oc %o(=6#אi'qM 4wB^n Q~4~ɝH}r%G&Iy,KKҿNsed5ZiU}R{ ,VЮV Bw*z_ީwWv# 6DybVD>m9͢(sf)e6<œi¿lEϔ,B~Eڔl{s8/}%t5NK}S} _~}]_]M}(*og5{Q#kcPxV;PDr"CPyg0;腟 WVZ]nGG]^_6nG6V$RDfK),{yd-Vn-겿$ro=o`]:6p7ji]\zGc .jT*s-Q} kpSNBM zlu82>9x֌m~cVezZ"m * I(oE&Ӵ/8=a~덱~4z + i/ЁoFq!aaZJOp٢a^:\@u.LWWyWi`ڮ?Ot:)#l}U`4<#7֯#t6O?Ę<04q`lp.=#\[qWΌWfU?\zUzWS?sUQ WS̀+W:)oX18D1cSOs뮍uMXN8 c! >ƹ~Z€/5cqRtcy$?\ itCT~t#+A<տ]QFrSk-pdqmƟcZU:cY*_B#Ȣiv:b4ߙNiS!lh^!A dW_q1dUR9AE༉1Et{'{o^RcIG%>Mh+#%c&! ˫#g-s-0O^w7zuF)zסu+'#@0Jusuf_ >V=H>8Nw0V_=_~q|OugxUO=#u= 'z|U?W}ztB3UX/v=|`CѼ'F\dNqQ@mVgI 3Ͽ6=哯Z>y-( h_^ujw$CCȀ ɐKб9xLJ)o>\xM+2*X/\7rYvoMex~b#x  )ޗԇ&ѷ9a/m_*#6Qub:~eT@0§0OzҁQ þY&ָq?չPl$u=u݇u10H/Mk?^\(:A/n]66ԧ?|BM'`k1'&FG+ָSc.szT`ϧe"~iuUj0zN_씞1~zo'Y };#ca(`n!2귺zh$W{&oy}^$zS{w6:Mo^bY n a 9"f=T{O9 "@g5$zbE/kg >3\"n½{K"}$񺡽^ߌnMy9@Tϓ)!>`֧{:1Nk?aa,П끘O*/jŋ@GXNcҩpwٿ0Ҽp8]M^sf~/3䏕lO2K%L B8]|:ѦM`xWcfyb_(. f+aɗ &JAsiC^詃pAi߿$_%b% =EY.EJa(d8ݵghs,mm$Pҁnish^;~` 6M`xD%|0zwS諾~*~+́9q;qw!NcܦhHҟ'9'?$|E=! ~ zO2L:1ɤHۻQxZ;]p5Ic /mN)Ӛz/OX^Lb{5Zqbo9l``[)to(R8 ¼fum ٭َϦvjW>8Y&_ha,mח޾sAʈ-,7`d[BXj_"1DN-(\1?e@|W*pIAqFB#O(6} ֫X㦱GR_v;vçxZ=Ctw"ɣ|Q\#sׯ3wD,<|1D.%ewN9K[ z҉z~Cc@QO:>t*'4jwcHESSSLMF/i _`]SQ/_W{bkY8\1v zx-<{IO҉!i?Oֻ~FunX%Y1z>V }t''Y!׻Fܷo |YؽQUf^[5 S8}Ii弩ew,(η+Ɠ5ՊL&bɓk÷݆深';߄ uVINQ|:md #%7]|7I|h][)]=𤋮D(>Qf}!Y4co9ޛ9)SƑqd6 {.m,SƜPZ1|2=Em=dHϪiGRb,;"CgLM#cY[):O6XMv~*݃1"-x>D9c ?Sr\O7ѽ螃ga~`Τ;ZG~v'ީ?`KuTg/`!bl)Wk2\K{i ^٩ȿS`䬐{zoNWϕg1̹Ue͹KUV  {0eAmgڂ6kyZ঄W1Sk:HHV$%7bCo2k> -ڞYz}3v؍"NuCOVxYFA;!b=#~#S\zhyp1G:똇'ݜGO vûL1v94{0BN(1.XIa @C_T<ܾ8k{ܽH+ 爯S8 ׁuFlwc߈WKo[tUА]Cy!=+&%d>)ೋ?E>$^u]c V- m¥Xe5«kύz{cPju:]h)mׄrRVF8CH^w{G +JE\F߶Cٖy]mC%t؋~e}͍zIn$NVf{g] !a s(v[Ie,lތ83i>(B5~ʐK3_w_qK>_8:ONYwϑZ9pMkOrbu!Kے#׈,@1J}c)WJ?2=H2X˚skDIFy>sϺDz&1Xw"SZj-QsxLK/9Si<՘g؂is>˩Ia_5>I[t{_CEW 70Fg;Ҋ̹v/.%?ZqLͰ_S|_Sz^1ɴl)}g#\fC zE_p/#U^ q޷ɶCzM/žכ'I=Mm/|gں \L]b唅lkyV' mö5gO_ߢs?J0ưm{Js:ESA%Ļv6==a+tA6|bÆݦlDuOa46g"vVtb!^ _:fĝڸܯ 쏈ia9];SxǺ=ڮuu|<˻]Gw~r_"X/L}hXJؼy{i/Ҩ s`('g{=~^j(ighE  %OF4j09C,on'̳X$u-> {B&rZ[]om_nDTX]&-4}EyW(Mnq~q`ŁJ` \OHWۻ ۩/e #;~PvmR{B$7#}?60Лt,Zf`.S(vǍQOW ڸO܄[oҋŻs.Ez#}v>B;GV0LX7rKosjNo@6JZ_us߽f4Қru )+v;+_Mnk>}G<.Hk(Ŝ} չ#--ƻ^[y Nh'RK:; yo 8?t%K5!/zطi=#`poIlv'?=YoYG#O>F| yS{]&ܖ.yL}Kw]! e^>ٛ=`96==4Y+3?g;wNM{y7Gh֧^ K2d0ɞh #DoMp3tqv/1)P3۫ &6*iK+'POire?ݤ6d <" x b}Y͐'q"|P{ǹTzSr(K~\Y()9&Ru%%?&@||'t[*Muvcӹ <߈ޮ^I]Ћ)z$ޯrVWxf*h;ߧ~}'/Bw CPEfn_f.Nf!F;I^b\S, MKǠ|;(86uJC]8ay u-p=C|ӂ}e'SpAmv1Qu#,wO4՝8%^?bxdqa3];.;ᆏZZ3cv O*k?K>Px5ԣ[|l߆9{Cg =IIAQwvcwW} "ZʳvY,]#}աJ7:zvqYsZb٭>WD$ 7c=p q(顃pʫnj}k>ٱƫ}h`/+R#Th-}@O^8w^:Ix/_L(/;ʗ^PWO_^߳,y?N禧;^/Wy˸*00XX8y}>!dqft=lC^z qd>='h5Hމ4{1i>׿,ƫC  S, 9 ~ {Sw0w#{f?sOQ:׸1*geLn~9HOIaJCZ=l=_# z&Зv}kXyoښ_ːI{@_LJXppŴO3TS8;jdgT<]"ޫ-[eżLBi[(yOe;8sOvHb 6Aʏ8}gI[NX_6i%ݟ<P_uaN-Kڑ/4C'4{+ĻۋHy#-kokcXh)Z̴^sn w}5{Ʃ{x158q)ѫ8U] $(%T֟~3G̵ CNc |y(?iqyO!Dq0ed5 fSa˷$|Yt'*&<d\@mj|00kGVX<8:H;h54|ysW : qzi\{m!vw99FGIdʵ_˚nֲֲ&~`519Eݡv;}K6S>`ngL_6>6(mp jml`_D?NzA795\y<(|O9o&28w={l5\|kG`A琞-z>kw=s8yQAϷgsVϠi6z!G|}=O#1qOs֚_M=sGS5ľmC]6$?Y*|'Þːⱉ|羿0Ļ$3x>=?J[[,`akwz)Q&n_s*:Uޱi3gv}i3) m&Lԣk3LG+?ĕ=ul0& `״A׷y %Cpy8ϳY?k9r(A2Wȧ=Nz^AϷk8z>zƦt_ݖX"bv%~-=mts)sz+H|z<1Ouu_zc:shs^OlEsc R=p<6<p75fGD[HAvkk ~6<qW='x=JcEUd=f:4;C97LюaR;;wfgiWӕŲT7܏}39qOgGn$8 `x,y>dB;.zM7x SX'GvN+ISyO!O촀{i] 㑖y.#3|·8֡:[t2[sG,tXLy'֟:?=n;~S%u_ x݈EO-hd'2hϏFsфuфl4aV٭kluzm(d(ִQagE֥ly$eȣ)EKQѕ_FWe%6664Yl4FF4fT[l,6*u^7g|]wYu^^Ϡql]uWy :oǨs?v,:'^_TГN6ʰ_`_Уfd#azl#]|!`>]\6?N!d#v|vu;nǿõߢn)ݎnK)M-Fo؂{4;yUE1;n|:YE<^Xcuc?]#a\?J 6*_=$h_`~={ -n i[Bߡ;3Q+N21w6wLY.FYnQwJԓ&nK}{:U@el6C/Yʍ7٪зM=p/yrL|>ޅˤyƟM{}+Gg솁*\a~ w'i!ݦrkYd"N1yN7yn(?cnL Ox܇&!~k]Ls^WB7ȋS}L9!6KYgmUoz.Li9eQ./&ށ)gMTo"tY_ h<6惼 v[x-0c!sT (ne;"n)}*:}*OXu#ۦ4[RK m^˚$^ʗ8IؗiY~gͳ̬GA)79RhoWnE.4mbym8'l ̀=66WZWG;ԏQmto#}VHMVyŦЗဏ;(/B-Gh[*~_V~ȇpЁՔ¯=;;wZs@HX}{^ŷYZĿ"khm+.,ew.e-XdmqE(ω 1x=O%;(85u ܀<寣m#ΛGY}.Cxz~;t(:/ƹ4W=觧;[F-[\ Q;HQ̖n@ 8h'%ƥzD#Ks9gU^iE^ '79ڛd՘Ghi?K w4 D)f8훣M |W?hy(@z͋ 6̠с /ׄX'5Oo _wԄW޾&ܺ&57ޭ ~MԄGSYՄkք&N&xx&+W5Ӥ>NϠ*9fv5:s=5oQȋRYVaw~Wo>.}7&}K3_7)w̴PJ<_տ_Rci5k4~Gגp+;n b{uI=-u]9/Ʀ8~%T8~ڴ8#'܊3$W겍r|F >궤\~'ާs)o4i*ƕ +R3c3|M,ҒQ;(sLyt|w2->mxg:'yP||/Dwq闃/@/R9)~eε6ƸxM^;x _y4YwNO?ь 9.k^y^U]OCJJK\NsO_l9&V}lc\e ޯ&;*SwSYK?pyD;E iY{Js+ķT^َOf_r%>BwlC\v*?&qe#Ey:z tL d{s xAbҏ~_Ĭ<A_q\}E߁߸z ClmYo}S E<~+x4Oc7ə~sH'o)8ÇdY"α8"K,:"Y,lŸ́te=ߑM6|WbC6|=u~Ȇ1!"6|oX|mj `moZyq_%u&>)'0?O@gS/j/x?pA!W`b* _JQ_z.A=q~'kR>oR_e qɲ#CFi%^l,_ߩ{k`sXieu&}fyd'{H/ٽISUz \"܆ [dh 2^q&LQ ߴP,rqEybALJP֡`8Ȁ"2|/Ub~lC 'e(fUH/O"tM|.5.|o_Jm^vїp~z_Xs όF#PxQ/ŌB r)bch7_FxyإSw -r+ru,Uqr F /Ĉx5*2۹cLQ\Va+̫]ULMH' 'ApvSoV sNד}2&߱v52b3b# .;%6 mdi=ړȑ@DØ{^ݟM,/9o:A[0^<׼zm{*| sks<5P|{`K6>fMcܽc-PNS!m飛RM1?'tEZ` OlxҴϑۇki;u=s7; k ́;]d] k!/XukVu wí6BGS)|pwܟ,^E%+*YGE+Skܓ^ߴIDWxU;iL}IWb/u~,3716#ҳ,x|"~ k޷r!Nؘ1D|u^I7bHL'}:ѽ^OwVӺ7y[nZdo*QVJgs=/~ZRbs7.M-j"aj3ߤ636Qz$DIdbw2$0[6|[&h' Z;lsz b¾ x+8ƀ!o^fL_//iu!L'G;Ѓ$<r/֋O FnY>@MG]اOWr/Yu݀QND~;U_r(M51}O{%.9d?1>I<0%B*'~@ ɷ+#]S?)(cwT9ު)F7G#>@\O}ߡh#X:߭Fmמ^3R7H7zݚ/f0N=\ѶoF>S?Ҙ19ק|ԏ?Gq~pߩ~n=":*$|Ԧ"}!Nx\ֆҡ呶^#uu2{(FG?gt=5o{ϬP}>+|,{"tOei0 Fr m2pb/~#4Bgdu6LҠ=i駄|$J}VUҽ8>+P~Uڲ'qz⳦L%+#n{j[XQLMt;~֟f{9sk鹢??~6;?&\2/ޯ4b2m.ϻ}=v?qӶ܀q?J\qjo\ft ?aa+l}-T ֵ <-fHqj`.K8zo!?bs/L(Q ъ/[z}=ˤ_>}\uT} ="O?:C8cAQVGO@j)|oTvT h1yIS~]nCQ/ ·~Q7zNPy{ ˈPCE}̐Ez>.Cϧ݄j|?aާuC|ﷂT8Cyc3!q_wpw.' tfڤX}@oE]/!/Lxn*^A]3CsYՐ1{Z׮+>_.0 '#-/9cm A\cN#:TMu0q+4ԡ7sd)&AA bogteAF(|`n~ob fs_1g [=ﲝzbK!/}_^lW1[E5=sm(+7M;uݟ/ +FFh$/[[|H7$[eݷ!Kt˻C^sϢQ|9~,-Yٿ&✒o2yoש]U4]1CI|0&ReS'l$ <|ĝbonWwGE̠n>Ļ|9$maSi fM~y̯o =>Č>?J]x1M/qB:AwGWc,CtktAҽҽݐ-s3v%wON;];?{W=r|!ޯ﷝Tu<5Yqm95P ?I2.t<ۇ턾۠4 S9!@E_飶0Z$_@<g;Lʲϲvs9{tsXk~\~ syuvAIzs0^IzU'}αﮓއv}&{ża$[\ ۬Z*yoj#vB ]*Cކl1~A x{|{n}҂j/ߕˉ6|>'aۢ/w7zmc_5 ޱ*K}ǏzZfƴQ wgz 5eY_<:gpc1.E]y,1 EZDymmJZ06RLio;Eb{Uڏ9k&3n>?^{k?9x~^vF6qNu4ajnjSDkUvnW}҂GIp .Er/rx|đEàߔacL⍙ig8 l>u=Uc,̾p]7b< cz C9Z%0~O)EnCpZS338Ŝ K\+a6w6G!bjFƱ Xo=k|sς{q1=(1-8H\>Oľv]E2'Ư\c6#~*erYA@``fo&-Q[xE<؆} ow`GHCXxi )~w[)vbXq ~`@hߚ_2?mΞ)Jױρ?/='>(,c(dZAX1O=`X ogm>I*n` _ h>3g*h~!|w9E>zwOm;n;r. s[38 s )Ulpy'{wWM^8ڀaL8m<<|Lq #m&9y.QꖴifiSw|Uy2[4w@䤩7"r6]aoxP3ǔCFˑeQJ_ksoZx i6plp\sb{l֧5{ߩH ~!rk{}RõȚ{97jr>Ngk1pFeM8Laqkj<|L 1w~%mlN{Anm.8.5J&K߭8<U'Xp}ighv[R y7ޚGhݝ;ޗz<;Tv>{m@?b3: 5@m?xO矶*)r\pMc-۾4fCi:GS_ac%5)ʙy𛠿mco>8wb9Wc`~u SJ@@ep\m^3[?;#;blGTC[;z@Tw Nu9f5gZ"/?x^b0k)k{j={:mVo_(L-}/v>#G9aO)|Y WRh,l@ipb-&x 4}A@nVmӰ|h:]h;]^.h8:-h*iL*7-҃0 꿉}#`k_D< 9 ? tFPX_O.ʼc{e%„1.O<{5=l͟KsߛS5\uݿy%7:+6|RZ<~15MFߓGY/:fqۼd#ܮ5eQt'ูhN[Q1+hEW݉s_l _˝~p*M߆le;K{(frYF:?uY;"F|87F<)S-]YP?UuϞƟ{Jܣ]SLBavX^t~#ա~뚠vVRB#eV@V%1шI;av=?~sv} ׻N/1ԇk3rӤLwx6P0,g)g.ðeҡLg4Fdk #{pCwA2L5{@qYqHe=#MӶ#|}(J ϛYZ<L sB/VR? &h '+OB_5s󨙁GbM},Wp48NHn t DbUN.`0?wCLhk,U'o]@Q;MۨW2q;T%]0茒ep>|'\wv=K^3vZ]l]+A_fWxA6`@4V) .i Su?SXZ)C~~y=;݉m-)>0{̵5"nY Fatf[X}1~2Ƭ>/d= 2{G蟱.M̆wi\| 7 v@Un>t1|Tm-[YU|q"M~J~.[~f[6@;'`>2  \Ʌo6bya(^Y1rAM@?PY5<aY{* 6<"?ogBVL@c &ߊc|Wf!#'2ުi@#e3hG:;a6987 -}P0fPpiP 䶷TsOj9/kgˌ:Ѯ(V!,c9<pbDFG&]d}`dubX^jaa43L |Y1o}of腹u%ZYa6.c`;ZH7GLMu#;| mu``[{` ԇ1?pp <x|R &uC=xW5fwϤ>?ۃJΧ2ٞ v k. G?Vpeڞǜln.a]U߁ֳ }w}ϱ`fnw@/jƾ6 m#9'ك*}&:~8 V?ǥC'xpauSA*Əm w&(8*~@:7*~@Yn:C_n/3?."Gf<#?y=9*cCn6Epq{,"B6/+vg\m_R|G2<:pċ uЂDZ@2 dkyLhSئ=SK~!QQo? #O?a?~a<: 0bv HuE@> q ]Of̉ fJ.1X4Mі1gn]ĄT`.*߈va7`< =FăDv䄘nQ,{'ES-Pq} {:T7 pC19nUs@1޳*#LJ[ܳ-Ӏ6wiڜзtv('].B똌>r/d(þ󐠧DzrFz#) rAe=Z|\amcq 08[8̣;L/4t=5ա~ ڴh_wPjj }WRBz}OJh|YhYkمpn >Z?[+c裝 nt'937ԌpxNhU2:s˜G0G=Ӭd`\Ÿ r7 lds),&4uzDGwFzC9r=rm@_n܉.+<y/}ŢGtO)CMmDzp8]~t!=@vM;[yUx+ r7WFw&å \{5=&w}Uß߸`r櫹5%|;} @`,cѿ8(s*0NP#La e ? i(#=jaKtzWaȦ4\??yziG:ؚ&s o @}8Wjz0kyq^"NOsI^7Dxe:6k%A'a߃k zڕ oqMq(u<|cyVq9>8{4C|6y' 9 ak|k.=}nB]Ẇ]c]<1WyWb{PظB^U#zit`f⼄$/ h^!LKescJ71^\Hy<2ƥ.'DsO܂UO2댣r_?K9ZHF_ _ ?sACk_F@ @y\ĞU< y۰n7A>7_5mt^zk\#8,,6{o gl\#E ·/}A1b,繫Bj.7Y ɢk!o}Mge/>MIC턭ǁ;H;96U6q/F~FN03ttDsbMvdKy/u8۞/!l鸺C1Ho?gd 'dLi۟?NĶ gR^7x$]=Z>Ǻ!_kZ>\F[sx= {[v |u13S9ʜéS>RFI9Ϧ?X}Ic|/;j_^[ˉaqd`+([_ `99y@+&o, s ݬgw|Zs)n[f ݍ|jc{:A}a%hiQp6~@IG!850y>>0kg@߆_)b-p\u0vؾ5v5{÷c8?!.u5*r=xq_ OØgA޸?VQ7#(oh#̡] \ݥNERě~;b+Xיk`^80< c>!dc8Vo!9/ȒdӋ}lf7=tfP0􏱨XXuU hȋ*Ի5Jw^d~[CWoS>gW!A,.}a ]Ew0jFGtX3f<6w̗C9_0`ЯGZőj|p4xtI%+H y5G{_5o!^oWR *S^r8; mw(olwq?adJ׵B_`{ƵhaR&+mϣVY|L8G 1d}2=NO}"kE3X-!aۢ??П񦒺,c{qb-Ehދckfk`xό+1=U l#47ϪivYQ& i|X<5Q\#9ݨ[3ÜEK_utB&ҤM{K~|]!܉c 9u6ӱ@TN} us 'Acwn>tgfs?NFzeDkPw޵b ,&?W|~fЈh۞keױ| ᙃc0ޱkކiVŽT䍩wa~ ] {"m@_~1\l{'Qs)w!OU;dd, f4?UջCx1ۂhm>A.&_oDO2ߟvq\:I.XCy u8b002[s\c5a.sHq]{nb-l}o11jGy>p6\J_(9.s(U[ǡ{`4;q1YV̈́2)9eg3|x Yڧ:yJo>Yϧ qߓ(L⟰/l3`1}gO^Wv߱-{_=x&,7mzkX7? ̎>x/Sek|ڱT-U9޸( ~ɡ9?nC.<_mH]oi<:y\K3Al+ du"=!ծ/{ߍϝ;9mXB毤Y6G2 )?ᙀt< ~ټFIgf]Y =⟰Ϣ!~(6<;;C A[XswY&K[q?e'_F\1kd.> C3(v=׃oF>=w=ʋW:pxH\{'"ﳐgS3t?r4՟?O [^t=Sq{N; 8{0Wmcd0O"?|Gy]ݨ/9M&}+ޔ!ݛe.MB>zybG;ׁ38, @;oG,g?w!OX0>\11>=΋3Z`gmY,#[Qj[\o0mp(.PrVVc=baivV8( ߩ`F4Ȟi{\GP>OGW7 z@8/]g߽xc/o93)ؽ2AM{,/-߉uo|G>v:sɮ?ws<ʾd,>+bw:ʐ=ۄsdoBXh*?t7wds^ޏl? w(8\ҵ #g|^-oüM{E+oj(t=ZY4`r]R:jYIrK5/cI=?p&P wv+Y\AN0G+1=}gA>:y7}q(_"_'z vfw_7=x@(pdFށFF`ֽ@>3{ ^ʥ^CE:Ź<̯a.R ޱ|&dow6<߂sر׾:64Ǧϸv\Ş1 |gSHßr%(wxJ@+yGZw4M})0_ћS!c<3g(y@MA|)kIG}Z>e }a4 hss0 pa0NסLg9fv):pO{f>=~3{w%ƐQ6wAtA{ C= g;cLK~2Z{+`29> /t˱w}]+>V婮k yFwţ4yy|>onTJw}}]cVml4b+īU=UZќ_nwR_Ms^qF[XwuFmGsur o$ @sWVz~/w7^|7_+o.,Ej mS4֥7JIBJȑ\|׫5s!_VޭͩQ7>Q0~oTͩ[W* ͍w6wlHnVXvDͦDG\_0ywurQM:&&DoW']: L,> -ܴ^d9qt^ +k@-0w5(6e_#< E+QzwDfk~`Өո};5N^2X@UD> *ˇG`=> L\V!znpy5c (Wy5K| аcEķBW@:uG1Q[YA PGތܢ(E13"M;^ŏ{aӾ޻4J7]}@#[D4w=&o&kf-;2?Jл@JQjHmr^ Oi,J`b8PrdW@],="OFQR$ׇh:J)qy{Uٯ[ G!}txK҇bw']F#Ue.qII%~IfI]tnJZГ%UVex/$Q+Ve&a>"̫:]ٸF7u, i~uŨU֢}3kQ))\ukyG=UmB_\޶"~$çSLѤ5nNwk/"wnvBҰH܃+Vܭ: `2Z60û7IM47L?[l6j`mA,Q%:?Fq8=%%p..]x%ťeK/,(-,Z"MbGټ6|̸׮`Zz 3 (:X'+[Of1;o7>;䞗 xEHpVy~8A/ԏg4z8pV=|.ABz􁃿fnqE+X5B_RXwUqXn.~de}Ў1 U}bϖ0M_,з I8j8ӷiX ÉpU\y2 G('*/Rȟy#QV׋@9P(`B &*n*@mOW$f[wl]>u$֥C$2Ajv]O7TUyvG?;Ư_kdQ[LD)t -x;oot72^xhi~qvt["$ZZy %[@_mTG5$ubUQnnn[!KP;?:3_#6ĉ<wp{}In>4܈dڀ}uQ Yu]MS H'KrƊoB\r}}+|Y?2gq&ϐ- qϜ ) Q*VMQXɿ}e6l!la(Z>?}G~>}G,I>CP$}PZ0߼^aԳƩ!SWƟBf_!W_}zoDW34ů읪ZzNTo{t̾+ȕ_}~I;WHpz6lR8l,b?SM[ j1pqXg78~>.>Lkbl8Q{!.nMuE1p~6DmsxM3)uk5ﳿg x' x,*%SN=U;Oz~wn& xK/7Kj\QU5MQZB(e7_uC: ZM@M p"gڮ## w8sCE/×FhM'M}Ac)'v8:e~w}0"p_G~ 6"2'n('pWUN封Y߯6 pbG:i"}Z 'p>( A8sS=I'zk8At\%pJwS^&vjw'ex3I^d8أo:?E'yH.81 \W#Ro7ѷaR&pS8)# NeK$N^MB$v\#p'E:cKt>SI !p$#X*'#"ZKϤ|9uTA(T2|mj7}K 8$'(D(_}N0#}NG(azBQ:.Dt^ VghN}K#'?IO{I[L?i 𛶑ȁFG4'qI!pbi^ty#Ao#p$pi${ė49bGiO8^"/>̏>GFE ioFY&>KR@y^ˡ7_MN3t2_K~vD?H^a&EL譙gW~W~fɸ~'qLs?g3T>D? OCs?^L3YO;H'p }6yA%p*s$?8k3Y7;" Ic'vGDoIt'?G$O~W:ɓ 8ɓ#*t[7K'yJ'ɓP:I|ʍ(=$O~Q:ɓɏJ?@Lj#pbw_IJ'~܈ vN?@r:d^NCKӂ{#rG#iz$ouDΖ iY@^X>F-+ eW<~U!ZH}bGt譅r' N"봇~)_'C_Y>!׷tD?-$8DBa'AZ]XHqص(=$8;NB]0@?9H}2;D3C#yɓ3o!tNu*$z&稠~') P8ُ>E2~GӺ/~i&t |:$Ť>Y\Ef'tfu>R ?AAO#+_I5v}$vL[zZ&W&N9n3I\MFf#<00MI92^1.)ic/Y']8> B&p2?"FD0D"LXN'pb/}Ď&4~'.?DS =d`)}\;ͯl} d9~Ư' c?&HMR DO&ޠoED$ߘ!|M$?$~ob3CN HgO|"/}/d5Nm"Ϛf8uU+wA_If=N~KNEVb}d~M?N]ei>@uu~O9{Dr%8Eku wsJdVy'98Z89x!'H=Z='zHDkr#J'9C"Qz.:J!絎sqd  _og `_<9' ?4Q? 4UdzH]htJڝ 2t<7x2%_@dzTUHX0n@ Ĥ?xIUsҾ@S|Y"r{#z<)3yEq뱢~+y>h:>5Qޓ}7;>\ +C!~U\Ha8Wx%_GWm٣Oy:ך9U?A~p՟G:)ן2E*{rUCiw১l?"j#5@=tq̄xu*j 'OG_#]^}K|WI W~_/JP^O8"_$U*.sdzP7rw$Ӝ~GÄN3?[/T#C? q9ut>_yt_{2A9㟧k>dE:^3wyKGt6I9>佥oAw&^Ӯ6{o/ WA~Vɋsmt<"/pڧ>'8MJ:N">O%d7>;I8>S擐'/oCoxO'|^_d?@?i_+6|~xw^tsH POyQ /2C7~(>?M 9gIާߘßy?@O#Ya|1ҟX?,"U:|TC?ħsƷI^!y9xSG͌w ,:_ż2 H)2_P*B0N'C1KgB0^:WrzXe+*N~΁{OK? /xta7t?y9Nr>I⑴/ ~]ɟ rP'ʸAEQOxn}f?<.7&MDOmf%g $M#;fy:%o:Q-?.|PB4B'Y)^~~\!`Dž&ׯ '$ϧ]R0^!Ag/KP8᷏MϽ~ /]i$=g #%A0fk-,|=У ~4)\gU)}B%A?K?0uox¸#ֻ{f'6Y yI^K?3;A4ῗqNPnUg"kZog~]_> j> FWٲd>~J_?aRY/ʊ*w]SV_?\] c1N묩p;^n͋WaU {j x ӹ|ۜnt݊kn[askorQ?T xmJSq ]<0P?la h;|Ex~_K),E_e 9;bXcs,vα9;DzcY,Xp, 8eDzcYr,K)Rʱr,K)Rʱr,Be!DzcYȱ,Xr, 9Be!DzcYı,Xq,8E"eDzcYı,Xs,9be1DzcY̱,Xs,eKRƱq,eKRƱq,eKDzcY±,Xp,K8%e DzcYk+._Ge7y#U4I1m}5D:t!&7mbnۛC ʾmN]av%J+W"lD_ɒ( ȅ؄JQ l l lll*m,m X$@B^ڄڄڄڄڄ٥#'b^&܈Mp$6Il•"~MM6ۤsM7߄   Iw) 3 a*-HwXY@ ɿXKE؄C d.&|M8%"E//لc dn& *n<9Dd+Am…ڄe6;}U&M8$H6l'لS d["Øc" ˴ ˴ ˴ ˴ ˴ ˴ ˴ ˴K_Pg avavaR&javavavavavava2 |2G'ø2H.C6|`0]]]]L 7v:xynSK|9R"|څ؅؅؅؅؅Gp"ƾHFcFcم]؇}̘>avƐ r|2$ĴtyKӺ۷XuFy;.eom*;ݭ'SſNY h^!A#[w:'1^% 9̉|U)9'G_"d)?~Js3r2[_`ذ7 ]O"^PW*AcӺwnv=dIt*9bs.Qptc!U:dHBqiF!3HZ*SN'-i Y,oVYWi 8`O18
# should be 3 * 3 * 10 = 90 # will infinite loop if the clones are removed my $cont := nqp::continuationreset(nqp::null(), { 3 * nqp::continuationcontrol(0, nqp::null(), -> $k { $k }); }); my $val := nqp::continuationinvoke(nqp::continuationclone($cont), { nqp::continuationinvoke(nqp::continuationclone($cont), { 10 }) }); =back By way of example, here is Scheme's call/cc implemented using NQP delimited continuations: # for proper R5RS semantics, run this once wrapping your main function sub run_main($f) { nqp::continuationreset(nqp::null(), $f); } sub callcc($f) { # first get the current continuation nqp::continuationcontrol(1, nqp::null(), -> $dcont { my $scheme_cont := -> $val { # when the scheme continuation is invoked, we need to *replace* # the current continuation with this one nqp::continuationcontrol(1, nqp::null(), -> $c { nqp::continuationinvoke($dcont, { $val }) }); }; nqp::continuationinvoke($dcont, { $f($scheme_cont) }); }); } And here is something resembling gather/take: my $SENTINEL := []; sub yield($value) { nqp::continuationcontrol(0, nqp::null(), -> $dcont { [$value, { nqp::continuationinvoke($dcont, {0}) }] }); } sub start_iter($body) { my $state := { $body(); yield($SENTINEL) }; -> { my $pkt := nqp::continuationreset(nqp::null(), $state); $state := $pkt[1]; $pkt[0]; } } Complete examples may be found in t/jvm/01-continuations.t in the source distribution. =head1 Conjectures =head2 Lazy recursive reinstate optimization Consider the following (Perl 6): my $N = 10000; sub flatten($x) { multi go(@k) { go($_) for @k } multi go($k) { take $k } gather go($x); } my $list = [^$N]; $list = [$list] for ^$N; say flatten($list).perl; This takes O(N^2) time on the current implementation. Why? Because each time take is invoked, we are N frames deep, so each take does O(N) work, and there are N calls to take. We can improve this to O(N) by doing the continuation operations B. That is, when reinstating a continuation only reinstate the top frame(s) that will be executed, and skip the work of reinstating the non-top frames only to resave them later. The design of this is a bit handwavey at the moment. =head2 Multiple callers There are two sensible ways to define the caller of a call frame. Either the frame which caused this frame to exist (henceforth, the static caller) or the frame which caused this frame to be active (henceforth, the dynamic caller). They are the same for most frames, but differ in the case of the top frame of a gather. The static caller of such a frame is the frame containing C; the dynamic caller is the frame corresponding to C. We need both: contextuals use the static caller (TimToady has said so quite explicitly), while exceptions and control flow ought to use the dynamic caller (people expect lazy exceptions to show up and backtrace at the point where the list is used). So we might need to B. Niecza does precisely this, and I think parrot is doing something similar. =head2 Saner cloning C is bad because it exposes details of what the JVM implementation can do without warning and what requires warnings. It would be better to expliclty declare exactly what you intend to do with the continuation as a bit flag passed to control and/or invoke, and let the op set figure out itself when cloning is needed. Flags could include "I don't intend to call this at all" (control used as an escape operator), "I intend to call this exactly once" (coroutines), "I may use this more than once, but only on one thread", "I want to use this on several threads". nqp-2013.12.1/docs/jvminterop.pod000066400000000000000000000054311225523575400164650ustar00rootroot00000000000000=head1 Basic principles We have some degree of interop with native Java objects provided through the C class. The name Boot is intended to suggest that it will not be used directly in most cases; instead it can either be subclassed to provide useful (and fast) HLL-specific marshaling, or it can be wrapped with NQP code to achieve a similar effect. =head1 Common data model All Java objects are wrapped in instances of the C REPR. The instances share a common methodless class by default, but a subclass of C can define an alternate class, or even dynamically create one class per Java type. Marshalling and unmarshalling is done automatically on calls in a statically type-directed way: a function which declares a return type of C will appear to return C, but a function with a declared type of C will wrap any return value even if it is a string. When dynamically creating classes, return values are wrapped in a wrapper type appropriate to their B type. To use methods that exist only on a specific run-time subclass, a cast must be used. This is a deliberate difference from the Niecza CLR interop system, intended to avoid several related semantic traps that exist in Niecza. For instance: $obj.method1.method2; If C is declared to return an object of type C with a single method C, and actually does so, this works in both NQP and Niecza. But if C is changed to return an object of type C which is a subclass of C but has additional methods that shadow or ambiguously overload C, it will B work in Niecza because the binding is effectively too late to reflect host-language subclass substitutability; but it will work on NQP, because the binding is forced to be done based on the static type. When handling these "pseudostatic types", no attempt is made to reflect Java's generic type system. That would just be crazy. =head1 Direct use my $interop := nqp::jvmbootinterop(); $interop.typeForName('java.lang.Thread').unbox( $interop.implementClass( [ ['extends','java.lang.Thread'], ['instance_method', 'run', '()V', method () { say("Hello thread") }] ], ).newInstance ).start; $interop.typeForName('java.lang.Thread')."constructor/new/(Ljava/lang/Runnable;Ljava/lang/String;)V"( $interop.proxy('java.lang.Runnable', nqp::hash( 'run', sub () { say("hello thread2") } )), "AnotherThread" ).start; =head1 Subclassing The C class has a large number of protected methods which can be overriden to support things like automatic creation of Cs to permit method calls against Java objects and types, or adding marshalling rules like C <-> C. =head1 Wrapping TBD nqp-2013.12.1/docs/nqp-overview.txt000066400000000000000000000023761225523575400167740ustar00rootroot00000000000000 Overview of nqp repository directory structure: 3rdparty/ - 3rd-party C libraries dyncall/ - dyncall library libtommath/ - bigint support sha1/ - sha hash library docs/ - documentation for NQP examples/ - NQP examples (some obsolete) src/ 6model - 6model C sources cheats - obsolete core - NQP core runtime types gen - work directory for build guts - multidispatch routines HLL - base classes for building HLL compilers NQP - NQP compiler sources ops - NQP-specific Parrot opcode sources pmc - NQP-specific Parrot object types PAST - obsolete (but not removable yet) QAST - code for QAST types, QAST to VM compiler QRegex - P6Regex to QAST compiler Regex - obsolete (but not removable yet) stage? - build directories t/ - tests hll/ - HLL library tests (?) nqp/ - NQP language tests qregex/ - QRegex tests qast/ - QAST tests p5regex/ - P5 regex tests pmc/ - Parrot PMC regression tests setting/ - ??? serialization/ - NQP serializer tests tools/ - scripts and Perl 5 libraries for configure+build NQP nqp-2013.12.1/docs/ops.markdown000077500000000000000000001226221225523575400161360ustar00rootroot00000000000000# NQP Opcodes Opcodes (ops) are used both directly when writing NQP, and during code generation in QAST nodes. When invoking them directly, you'll need to prefix them with nqp::, e.g. nqp::mul_n(6,9); The ops are listed below by type. Each entry shows the name of the op, its variants, and their arguments and types, and may provide a short description. Some opcodes differ only by argument types - in that case, they are listed under their common name (e.g. `mul`), with each of their variants (e.g. `mul_i`, `mul_n`) together with a single description. Opcode variants may contain a type suffix, which usually indicates: * `_i` argument is native int * `_n` argument is native float * `_s` argument is native string * `_b` argument is code blocks * `_I` argument is Big Integer They may also have a numeric suffix, which typically indicates the number of arguments required. In opcode signatures below, we use the following types, which may not correspond directly to NQP types. * int - native int * num - native float * str - native string * Int - BigInt * Mu - any NQP or VM object * Mu:T - a type object, e.g. `Int` * Exception - an Exception object * Handle - an I/O Handle object * Iterable - something iterable * Context - a Context object * LexPad - a Context object * @ - this sigil indicates an array parameter * % - this sigil indicates a hash parameter * ... - indicates variable args are accepted VM-specific opcodes are denoted with a `jvm`, e.g. on the same line as the header. No annotation indicates this opcode should be supported on all nqp backends. Some individual opcodes may be marked with _Internal_ or _Deprecated_. Both of these indicate the opcodes are not intended to be used. Deprecated opcodes will eventually be removed from NQP. Internal opcodes are typically used at compile time to replace opcodes that take a variable number of arguments. # Arithmetic Opcodes ## abs * `abs_i(int $i)` * `abs_n(num $n)` * `abs_I(Int $i, Mu:T $type)` Return the absolute value of a number. `_I` variant returns an object of the given type. ## add * `add_i(int $l, int $r)` * `add_n(num $l, num $r)` * `add_I(Int $l, Int $r, Mu:T $type)` Add two numbers together, returning the result. `_I` variant returns an object of the given type. ## div * `div_i(int $l, int $r)` * `div_n(num $l, num $r)` * `div_I(Int $l, Int $r, Mu:T $type)` * `div_In(Int $l, Int $r)` Divide $l by $r, returning the result. `_I` variant returns an object of the given type. The `_In` variant returns a native num, using a scale of 309, and a rounding mode equivalent to Java's `ROUND_HALF_UP`. ## gcd * `gcd_i(int $l, int $r)` * `gcd_I(Int $l, Int $r, Mu:T $type)` Return the greatest common multiple of two numbers. `_I` variant returns an object of the given type. ## lcm * `lcm_i(int $l, int $r)` * `lcm_I(Int $l, Int $r, Mu:T $type)` Return the lowest common multiple of two numbers. `_I` variant returns an object of the given type. ## mod * `mod_i(int $l, int $r)` * `mod_n(num $l, num $r)` * `mod_I(Int $l, Int $r, Mu:T $type)` Return the modulus of $l by $r. `_I` variant returns an object of the given type. ## mul * `mul_i(int $l, int $r)` * `mul_n(num $l, num $r)` * `mul_I(Int $l, Int $r, Mu:T $type)` Multiple two numbers, returning the result. `_I` variant returns an object of the given type. ## neg * `neg_i(int $i)` * `neg_n(num $n)` * `neg_I(Int $i, Mu:T $type)` Return the negative of a number. `_I` variant returns an object of the given type. ## sub * `sub_i(int $l, int $r)` * `sub_n(num $l, num $r)` * `sub_I(Int $l, Int $r, Mu:T $type)` Subtract $r from $l, returning the result. `_I` variant returns an object of the given type. # Numeric Opcodes ## base * `base_I(Int $i, int $radix)` Returns a string representing the integer `$i` in base `$radix` ## ceil * `ceil_n(num $n)` Return the ceiling of a number. ## exp * `exp_n(num $exponent)` Return the value of `e` raised to $exponent; ## floor * `floor_n(num $n)` Return the floor of a number. ## inf * `inf()` Return infinity. ## log * `log_n(num $n)` Return the log base 10 of a number. ## ln * `ln_n(num $n)` Return the natural logarithm of a number. ## expmod * `expmod_I(Int $base, Int $exponent, Int $modulus, Mu:T $type)` Return a bigint that is `$base` raised to `$exponent` modulus `$modulus`. `_I` variant returns an object of the given type. ## nan * `nan()` Return NaN. ## neginf * `neginf()` Return negative infinity. ## pow * `pow_n(num $base, num $exponent)` * `pow_I(Int $base, Int $exponent, Mu:T $type_num, Mu:T $type_bigint)` Return the value of $base raised to $exponent; `_I` variant returns an object of `$type_num` for negative exponents, and of type `$type_bigint` for positive exponents. ## rand * `rand_n(num $n)` * `rand_I(Int $i, Mu:T $type)` Returns a psuedo-random bigint up to the value of the given number. `_I` variant returns an object of the given type. ## sqrt * `sqrt_n(num $l, num $r)` # Trigonometric Opcodes Each opcode corresponds directly to the trigonmetric function of the same name. `h` indicates a hyperbolic variant. ## asec * `asec_n(num $n)` ## asin * `asin_n(num $n)` ## acos * `acos_n(num $n)` ## atan * `atan_n(num $n)` ## atan2 * `atan2_n(num $l, num $r)` ## cos * `cos_n(num $n)` ## cosh * `cosh_n(num $n)` ## sin * `sin_n(num $n)` ## sinh * `sinh_n(num $n)` ## sec * `sec_n(num $n)` ## sech * `sech_n(num $n)` ## tan * `tan_n(num $n)` ## tanh * `tanh_n(num $n)` # Relational / Logic Opcodes ## cmp * `cmp_i(int $l, int $r)` * `cmp_n(num $l, num $r)` * `cmp_s(str $l, str $r)` * `cmp_I(Int $l, Int $r)` Compare two values, returns -1 if $l is greater than $r, 0 if they are equal, and 1 if $r is greater than $l. ## eqat * `eqat(str $haystack, str $needle, int $pos)` Return 1 if the string `$haystack` has the string `$needle` at position `$pos`, or 0 otherwise. ## iseq * `iseq_i(int $l, int $r)` * `iseq_n(num $l, num $r)` * `iseq_s(str $l, str $r)` * `iseq_I(Int $l, Int $r)` Return non-zero if the two parameters are equal. ## isgt * `isgt_i(int $l, int $r)` * `isgt_n(num $l, num $r)` * `isgt_s(str $l, str $r)` * `isgt_I(Int $l, Int $r)` Return non-zero if $l is greater than two $r. ## isge * `isge_i(int $l, int $r)` * `isge_n(num $l, num $r)` * `isge_s(str $l, str $r)` * `isge_I(Int $l, Int $r)` Return non-zero if $l is greater than or equal two $r. ## islt * `islt_i(int $l, int $r)` * `islt_n(num $l, num $r)` * `islt_s(str $l, str $r)` * `islt_I(Int $l, Int $r)` Return non-zero if $l is less than two $r. ## isle * `isle_i(int $l, int $r)` * `isle_n(num $l, num $r)` * `isle_s(str $l, str $r)` * `isle_I(Int $l, Int $r)` Return non-zero if $l is less than or equal two $r. ## isne * `isne_i(int $l, int $r)` * `isne_n(num $l, num $r)` * `isne_s(str $l, str $r)` * `isne_I(Int $l, Int $r)` Return non-zero if the two parameters are not equal. ## not * `not_i(int $val)` Return 1 if `$val` is 0, 1 otherwise. # Array opcodes ## atpos * `atpos(@arr, int $i)` * `atpos_i(@arr, int $i)` * `atpos_n(@arr, int $i)` * `atpos_s(@arr, int $i)` Return whatever is bound to @arr at position $i. ## bindpos * `bindpos(@arr, int $i, Mu $v)` * `bindpos_i(@arr, int $i, int $v)` * `bindpos_n(@arr, int $i, num $v)` * `bindpos_s(@arr, int $i, str $v)` Bind $v to @arr at position $i and return $v. ## elems * `elems(@arr)` * `elems(%hash)` Return the number of elements in `@arr`, or the number of keys in `%hash`. ## existspos * `existspos(@arr, int $i)` Return 1 if anything is bound to `@arr` at position `$i`, 0 otherwise. ## list * `list(...)` * `list_i(...)` * `list_n(...)` * `list_s(...)` * `list_b(...)` Create a list of the given parameters. If no arguments are passed, an empty list is created. If a typed variant is used, the parameters are coerced to the appropriate type. ## push * `push(@arr, Mu $v)` * `push_i(Array int @arr, int $v)` * `push_n(Array num @arr, num $v)` * `push_s(Array str @arr, str $v)` "Push $v onto the end of @arr." Bind $v to @arr at the position at the end of @arr, i.e., the position that is just after the last position of @arr that has been bound to. Return the number of elements of @arr on Parrot, $v on JVM. ## pop * `pop(@arr)` * `pop_i(@arr)` * `pop_n(@arr)` * `pop_s(@arr)` "Pop the last value off the end of @arr." Return the value of @arr at its last bound position, and unbind @arr at that position. ## setelems * `setelems(@arr, int $i)` Set the size of `@arr` to `$i` elements. If less than the current size, any elements after the newlast position are unbound. If greater, the empty elments at the end are bound with potentially VM specific null entries. ## shift * `shift(@arr)` * `shift_i(@arr)` * `shift_n(@arr)` * `shift_s(@arr)` "Shift the last value from the beginning of @arr." Return the value of @arr at index 0, unbind @arr at index 0, and move all other binding of @arr to the index one below what they were previously bound to. ## splice * `splice(@arr, @from, int $offset, int $count)` Remove the elements in `@arr` starting at `$offset`, for `$count` positions. Replace them with all the elements from `@from`. ## unshift * `unshift(@arr, Mu $v)` * `unshift_i(@arr, int $v)` * `unshift_n(@arr, num $v)` * `unshift_s(@arr, str $v)` "Shift $v into the beginning of @arr." Bind $v to @arr at index 0, move all other bindings of @arr to the index one above what they were previously bound to. Return the number of elements of @arr on Parrot, $v on JVM. ## iterator * `iterator()` Returns an iterator object to iterate over a list's items. For example: ```perl my $list := nqp::list('a', 'b', 'c'); my $iter := nqp::iterator($list); while $iter { say(nqp::shift($iter)); } ``` You can also use `nqp::iterator()` to iterate over a hash's key-value pairs. # Hash opcodes ## atkey * `atkey(%hash, String $key)` * `atkey_i(%hash, String $key)` * `atkey_n(%hash, String $key)` * `atkey_s(%hash, String $key)` Return the value of %hash at key $key. ## bindkey * `bindkey(%hash, String $key, Mu $v)` * `bindkey_i(%hash, String $key, int $v)` * `bindkey_n(%hash, String $key, num $v)` * `bindkey_s(%hash, String $key, str $v)` Bind key $key of %hash to $v and return $v. ## existskey * `existskey(%hash, String $key)` Return non-zero if %hash has key $key bound to something. ## deletekey * `deletekey(%hash, String $key)` Delete the given key from %hash. ## iterkey * `iterkey_s($pair)` Returns the key associated with the given key-value pair. For example: ```perl for %hash { say(nqp::iterkey_s($_), ' => ', nqp::iterval($_)); } ``` ## iterval * `iterval($pair)` Returns the value associated with the given key-value pair. # String Opcodes ## chars * `chars(str $str)` Return the number of characters in the string. ## chr * `chr(int $codepoint)` Given a unicode codepoint, return a str containing its character. Will throw an exception on invalid codepoints. ## codepointfromname * `codepointfromname(str $name)` Returns the codepoint for the given unicode character name, or -1 if no match was found. ## concat * `concat(str $l, str $r)` Return a string that is the concatenation of the two passed in strings. ## escape * `escape(str $str)` Given a string, return an escaped version that replaces the following characters with their escaped equivalents: "\\", "\b", "\n", "\r", "\t", "\f", "\"", "\a", and "\e". ## findcclass * `findcclass(int $class, str $str, int $i, int $count)` Search the string starting at the `$i`th character, for `$count` characters. Return the position of the first character that is of the specified class (`nqp::const::CCLASS_*`). If no characters match, return the position of the first character after the given range, or the length of the string, whichever is smaller. ## findnotcclass * `findnotcclass(int $class, str $str, int $i, int $count)` Search the string starting at the `$i`th character, for `$count` characters. Return the position of the first character that is not of the specified class (`nqp::const::CCLASS_*`). If no characters match, return the position of the first character after the given range, or the length of the string, whichever is smaller. ## flip * `flip(str $str)` Return a string with the characters of `$string` in reverse order. ## hash * `hash(...)` Return a hash. The first argument is a key, the second its value, and so on. Be sure to pass an even number of arguments, a VM specific error may occur otherwise. ## index * `index(str $haystack, str $needle)` * `index(str $haystack, str $needle, int $pos)` Return the position in `$haystack` at which `$needle` appears, or -1 if `$needle` does not appear. Begin searching at position `$pos` if specified, or at 0, otherwise. * `indexfrom(str $haystack, str $needle, int $pos)` _Internal_ `index` is converted to this internal opcode by the compiler. ## iscclass * `iscclass(int $class, str $str, int $i)` Return 1 if the `$i`th character of $str is of the specified class, (`nqp::const::CCLASS_*`), 0 otherwise. ## join * `join(str $delim, @arr)` Joins the separate strings of `@arr` into a single string with fields separated by the value of EXPR, and returns that new string. ## lc * `lc(str $str)` Return lowercase copy of string. ## ord * `ord(str $str)` * `ord(str $str, int $i)` Return the unicode codepoint of the first character in `$str`, or at the `$i`th character, if it's specified. * `ordat(str $str, int $i)` _Internal_ * `ordfirst(str $str)` _Internal_ `ord` is converted to these internal opcodes by the compiler. ## radix * `radix(int $radix, String $str, int $pos, int $flags)` * `radix_I(int $radix, String $str, int $pos, int $flags, Mu:T $type)` Convert string $str into a number starting at offset $pos and using radix $radix. The result of the conversion returns an array with out[0] = converted value out[1] = radix ** (number of digits converted) out[2] = offset after consuming digits, -1 if no digits consumed The opcode skips single underscores between pairs of digits, per the Perl 6 specification. The $flags is a bitmask that modifies the parse and/or result: 0x01: negate the result (useful if you've already parsed a minus) 0x02: parse a leading +/- and negate the result on - 0x04: parse trailing zeroes but do not include in result (for parsing values after a decimal point) ## replace * `replace(str $str, int $offset, int $count, str $replacement)` Replace the the characters of `$str` starting at `$offset` for `$count` characters, with the `$replacement` string. ## rindex * `rindex(str $haystack, str $needle)` * `rindex(str $haystack, str $needle, int $pos)` Searching backwards through the `$haystack`, return the position at which `$needle` appears, or -1 if it does not. Begin searching at `$pos` if specified, otherwise start from the last position. * `rindexfrom(str $haystack, str $needle, int $pos)` _Internal_ * `rindexfromend(str $haystack, str $needle)` _Internal_ `rindex` is converted to these internal opcodes by the compiler. ## uc * `uc(str $str)` Return uppercase copy of string. ## split * `split(str $delimiter, str $string)` Splits the string `$string` into an array of elements; these elements are the substrings between delimiters in the original string. If the original string begins or ends with the delimiter, the resulting array will begin or end with an empty element. ## substr * `substr(str $str, int $position)` * `substr(str $str, int $position, int $length)` Return the portion of the string starting at the given position. If `$length` is specified, only return that many characters. The numbered variants required the args specified - the unnumbered version may use either signature. * `substr2(str $str, int $position)` _Internal_ * `substr3(str $str, int $position, int $length)` _Internal_ `substr` is converted to these internal opcodes by the compiler. ## tc * `tc(str $str)` Return titlecase copy of string. ## x * `x(str $str, int $count)` Return a new string containing `$count` copies of `$str`. ## sprintf * `sprintf(str $pattern, @values)` Returns a string formatted by the printf conventions similar to Perl 5 / C. Machine sized numeric types, their limits and therefor overflows are not implemented though. ## sprintfdirectives * `sprintfdirectives(str $pattern)` This takes the same pattern as `sprintf` does, and computes the needed value-count that `sprintf` would have to provide. ## sprintfaddargumenthandler * `sprintfaddargumenthandler(Mu $handler)` Lets you register a handler-instance that supports the sprintf op when it has to numify custom types. This handler has to provide two methods, `mine` and `int`. `mine` gets the the value in question and returns true if this handler is in charge for this type, false otherwise. The method `int` does the conversion for patterns like %d. ```perl my class MyHandler { method mine($x) { $x ~~ MyType } method int($x) { $x.Int } } ``` # Conditional Opcodes ## if * `if(Block $condition, Block $then)` * `if(Block $condition, Block $then, Block $else)` If the `$condition` evaluates to a non-zero value, run the `$then` block. If not, and an `$else` block is present, run that instead. ## unless * `unless(Block $condition, Block $then)` * `unless(Block $condition, Block $then, Block $else)` If the `$condition` evaluates to 0, run the `$then` block. If not, and an `$else` block is present, run that instead. # Loop/Control Opcodes ## for * `for(Iterable $iter, Block $body)` Invoke the `$body` for every item available in `$iter`. ## ifnull * `ifnull(Block $cond, Block $body)` If the `$cond` evaluates to null, evaluate the `$body`, otherwise return the result of `$cond`. ## defor * `defor(Block $cond, Block $body)` If the `$cond` evaluates to defined value, return it, otherwise, evaluate the `$body`. ## repeat_until * `repeat_until(Block $condition, Block $body)` * `repeat_until(Block $condition, Block $body, Block $post)` First run the `$body`. Then, enter a loop, running the `$body` only if the condition returns 0. If a `$post` block is present, run that at the end, regardless of `$condition`. ## repeat_while * `repeat_while(Block $condition, Block $body)` * `repeat_while(Block $condition, Block $body, Block $post)` First run the `$body`. Then, enter a loop, running the `$body` only if the condition returns a non-0 value. If a `$post` block is present, run that at the end, regardless of `$condition`. ## until * `until(Block $condition, Block $body)` * `until(Block $condition, Block $body, Block $post)` Enter a loop, running the `$body` only if the condition returns 0. If a `$post` block is present, run that at the end, regardless of `$condition`. ## while * `while(Block $condition, Block $body)` * `while(Block $condition, Block $body, Block $post)` Enter a loop, running the `$body` only if the condition returns a non-0 value. If a `$post` block is present, run that at the end, regardless of `$condition`. # Exceptional Opcodes ## backtrace * `backtrace(Exception $ex)` Return an array of hashes, describing the backtrace of the given exception. ## backtracestrings * `backtracestrings(Exception $ex)` Return an array of strings, describing the backtrace of the given exception. ## die * `die(str $message)` * `die_s(str $message)` Create and throw an exception using the given message. ## exception * `exception()` Return the current exception object. ## getextype * `getextype(Exception $ex)` Gets the exception category (`nqp::const::CONTROL_*`) ## getmessage * `getmessage(Exception $ex)` Gets the exception message. ## getpayload * `getpayload(Exception $ex)` Gets the exception payload. ## newexception * `newexception()` Return a new exception object. ## resume * `resume(Exception $ex)` Resume the exception, if possible. ## rethrow * `rethrow(Exception $ex)` Re-throw the exception. ## setextype * `setextype(Exception $ex, int $type)` Sets the exception category (`nqp::const::CONTROL_*`) ## setmessage * `setmessage(Exception $ex, str $message)` Sets the exception message. ## setpayload * `setpayload(Exception $ex, Mu $obj)` Sets the exception payload. ## throw * `throw(Exception $ex)` Throw the exception. # Input/Output Opcodes ## closefh * `closefh(Handle $fh)` Close the filehandle. ## eoffh * `eoffh(Handle $fh)` Return 1 if this filehandle is at the end of the file, otherwise 0. ## flushfh * `flushfh(Handle $fh)` Flushes the file handle, forcing it to write any buffered output. ## getcfh * `getcfh(Handle $in)` Reads a single character from the supplied filehandle. ## getstderr * `getstderr()` Return the filehandle for standard error. ## getstdin * `getstdin()` Return the filehandle for standard input. ## getstdout * `getstdout()` Return the filehandle for standard output. ## open * `open(str $filename, str $mode)` Open the specified file in the given mode. Valid modes include `r` for read, `w` for write, and `wa` for write with append. ## openasync `jvm` _Experimental_ * `openasync(str $filename, str $mode)` Open the specified file in the given mode for async IO. See `open` for valid modes. ## print * `print(str $str)` Output the given string to stdout. ## printfh * `printfh(Handle $fh, str $str)` Output the given string to the filehandle. ## readallfh * `readallfh(Handle $fh)` Return the contents of the open filehandle. ## readfh * `readfh(Handle $fh, @arr, long $count)` Given a readable `$fh`, and an array of `Buf[int8]` or a `Buf[uint8]`, read in the next `$count` bytes from the filehandle and store them in the array. ## readlinefh * `readlinefh(Handle $fh)` Return the next line of the open filehandle. ## readlineintfh * `readlineintfh(Handle $fh, str $prompt)` Prompt the user with `$prompt`, then return the next line of the open filehandle. ## say * `say(str $str)` Output the given string to stdout, followed by a newline. ## sayfh * `sayfh(Handle $fh, str $str)` Output the given string to the filehandle, followed by a newline. ## setencoding * `setencoding(Handle $fh, str $encoding)` Set the encoding for the given handle. Valid encodings are: ascii, iso-8859-1, utf8, utf16, and binary. ## setinputlinesep * `setinputlinesep(Handle $fh, str $sep)` Set the input line separator on the given file handle. ## tellfh * `tellfh(Handle $fh)` Return current access position for an open handle. ## writefh * `writefh(Handle $fh, Mu $str)` Output the given object to the filehandle. # External command Opcodes ## shell * `shell(str $cmd, str $path, %env)` Using $path as the working directory, execute the given command using the specified environment variables. Returns a POSIX-style return value. Command is executed using an OS-appropriate shell (`sh -c` or `cmd /c`). Blocks until command is complete. * `shell(str $cmd)` _Deprecated: use the three argument version_ Same as the three argument version of `shell`, using the current directory and an empty environment. * `shell1(str $cmd)` _Internal, Deprecated_ * `shell3(str $cmd, str $path, %env)` _Internal_ `shell` is converted to these internal opcodes by the compiler. ## spawn * `spawn(@cmd, str $path, %env)` Using $path as the working directory, execute the given command using the specified environment variables. Returns a POSIX-style return value. No shell processing of args is done. The first value of `@args` is the command executed, further values are passed as arguments. Blocks until command is complete. # File / Directory / Network Opcodes ## chdir * `chdir(str $path)` Change the working directory to the given path. ## chmod * `chmod(str $path, int $mode)` Change the permissions of `$path` to the posix style permissions of `$mode`. Returns 0 on success, throws an exception on failure. ## closedir * `closedir(Handle $)` Close the given directory handle. ## copy * `copy(str $from, str $to)` Copy file `$from` to file `$to`. Return 0 on success, throw an exception on failure. ## cwd * `cwd()` Return a string containing the current working directory. ## fileexecutable * `fileexecutable(str $str)` If the specified filename refers to an executable file, returns 1. If not, returns 0. If an error occurs, return -1. ## fileislink * `fileislink(str $str)` If the specified filename refers to a symbolic link, returns 1. If not, returns 0. If an error occurs, return -1. ## filereadable * `filereadable(str $str)` If the specified filename refers to a readable file, returns 1. If not, returns 0. If an error occurs, return -1. ## filewritable * `filewritable(str $str)` If the specified filename refers to a writable file, returns 1. If not, returns 0. If an error occurs, return -1. ## link * `link(str $before, str $after)` Create a link from `$after` to `$before` ## mkdir * `mkdir(str $name, int $mode)` Create a directory of the given name. Use posix-style mode on non-windows platforms. Returns 0, or throws an exception. ## nextfiledir * `nextfiledir(handle $iterator)` Given the result of an opendir, return the next path from that directory. When no more items are available, return a null string. (check with `null_s`) ## opendir * `opendir(str $path)` Return a directory handle on the given directory path. Throw an exception if `$path` is not a directory. ## rename * `rename(str $from, str $to)` Rename file `$from` to file `$to`. Return 0 on success, throw an exception on failure. ## rmdir * `rmdir(str $path)` Delete the given directory $path. Returns 0 on success, -2 if the directory didn't exist. May throw an exception. ## stat * `stat(str $path, int $code)` Given a path and a code, return an int describing that path. Any of these variants may throw an exception if the platform does not support them. (JVM does not support `STAT_PLATFORM_BLOCKSIZE` or `STAT_PLATFORM_BLOCKS`). * `nqp::const::STAT_EXISTS` Returns 1 if the path exists, 0 otherwise. * `nqp::const::STAT_FILESIZE` Returns the size of the file in bytes. * `nqp::const::STAT_ISDIR` Returns 1 if the path is a directory, 0 otherwise, -1 if an exception occurred processing the request. * `nqp::const::STAT_ISREG` Returns 1 if the path is a regular file, 0 otherwise, -1 if an exception occurred processing the request. * `nqp::const::STAT_ISDEV` Returns 1 if the path is a special file, 0 otherwise, -1 if an exception occurred processing the request. * `nqp::const::STAT_ISLNK` Returns 1 if the path is a symbol link, 0 otherwise, -1 if an exception occurred processing the request. * `nqp::const::STAT_CREATETIME` * `nqp::const::STAT_ACCESSTIME` * `nqp::const::STAT_MODIFYTIME` * `nqp::const::STAT_CHANGETIME` Returns respective time attribute in seconds since epoch, or -1 if an exception occurred. * `nqp::const::STAT_BACKUPTIME` Returns -1. * `nqp::const::STAT_GID` * `nqp::const::STAT_UID` Returns the user id and group id of the path, respectively. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_DEV` Returns the device number of filesystem associated with the path. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_INODE` Returns the inode. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_MODE` Returns unix style mode. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_NLINKS` Returns number of hard links to the path. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_NLINKS` Returns the device identifier. Returns -1 if an exception occurred. * `nqp::const::STAT_PLATFORM_BLOCKSIZE` Returns preferred I/O size in bytes for interacting with the file. * `nqp::const::STAT_PLATFORM_BLOCKS` Returns number of system-specific blocks allocated on disk. ## symlink * `symlink(str $before, str $after)` Create a symbolic link from `$after` to `$before` ## unlink * `unlink(str $path)` Delete the given file $path. Returns 0 on success, -2 if the file didn't exist. May throw an exception. # Type/Conversion Opcodes ## bool * `bool_I(Int $val)` Returns 0 if `$val` is 0, otherwise 1. ## bootarray `jvm` `moar` * `bootarray()` Returns a VM specific type object for a native array. ## boothash `jvm` `moar` * `boothash()` Returns a VM specific type object for a native hash. ## bootint `jvm` `moar` * `bootint()` Returns a VM specific type object that can box a native int. ## bootintarray `jvm` `moar` * `bootintarray()` Returns a VM specific type object for a native array of int. ## bootnum `jvm` `moar` * `bootnum()` Returns a VM specific type object that can box a native num. ## bootnumarray `jvm` `moar` * `bootnumarray()` Returns a VM specific type object for a native array of num. ## bootstr `jvm` `moar` * `bootstr()` Returns a VM specific type object that can box a native str. ## bootstrarray `jvm` `moar` * `bootstrarray()` Returns a VM specific type object for a native array of str. ## box * `box_i(int $val, Mu:T $type)` * `box_n(num $val, Mu:T $type)` * `box_s(str $val, Mu:T $type)` Given a native value, return a perl 6 object of the given type with the same value. ## defined * `defined(Mu $obj)` Returns 1 if the object is not null and is not a Type object, 0 otherwise. ## fromnum * `fromnum_I(num $val, Mu:T $type)` Convert float value to a Big Integer of the given type, discarding any decimal portion. ## fromstr * `fromstr_I(str $val, Mu:T $type)` Convert string value to a Big Integer of the given type. ## isbig * `isbig_I(Mu $obj)` Returns a 1 if the object's numerical representation requires a big int, 0 otherwise. ## isconcrete * `isconcrete(Mu $obj)` Returns a 1 if the object is not a type object, 0 otherwise. ## iscont * `iscont(Mu $obj)` Returns a 1 if the object is a container type, 0 otherwise. ## isfalse * `isfalse(Mu $obj)` Returns a 0 if the object has a truthy value, 1 otherwise. ## ishash * `ishash(Mu $obj)` Returns a 1 if the object is a Hash, 0 otherwise. ## isint * `isint(Mu $obj)` Returns a 1 if the object is an int type, 0 otherwise. ## isinvokable * `isinvokable(Mu $obj)` Returns a 1 if the object represents something executable, 0 otherwise. ## islist * `islist(Mu $obj)` Returns a 1 if the object is an Array, 0 otherwise. ## isnanorinf * `isnanorinf(num $n)` Return truth value indicating if this number represents any of the special values, postive infinity, negative infinity, or NaN. ## isnull * `isnull(Mu $obj)` * `isnull_s(str $obj)` Returns a 1 if the object is a null, 0 otherwise. ## isnum * `isnum(Mu $obj)` Returns a 1 if the object is a float type, 0 otherwise. ## isprime * `isprime_I(Int $obj)` Returns a 1 if the integer value of the object is prime, 0 otherwise. ## isstr * `isstr(Mu $obj)` Returns a 1 if the object is a str type, 0 otherwise. ## istrue * `istrue(Mu $obj)` Returns a 1 if the object has a truthy value, 0 otherwise. ## istype * `istype(Mu $obj, Mu:T $obj)` Returns a 1 if the object is of the given type, 0 otherwise. ## null * `null()` * `null_s()` Generate a null value. `null_s` returns a null string value that can be stored in a native str. The value returned by `null_s` is VM dependant. Notably, it may stringify differently depending on the backend. ## jvmisnull `jvm` * `jvmisnull(Mu $obj)` Returns a 1 if the object is an NQP Type object *or* the underlying JVM object is null. Returns 0 otherwise. ## tostr * `tostr_I(Int $val)` Convert Big Integer value to a native string. ## tonum * `tonum_I(Int $val)` Convert Big Integer value to a native number. ## unbox * `unbox_i(Mu $val)` * `unbox_n(Mu $val)` * `unbox_s(Mu $val)` Given a Perl 6 object, return a native with the same value, of the type indicated by the opcode suffix. # OO/SixModel Opcodes ## bindattr * `bindattr(Mu $obj, Mu:T $type, str $attributename, Mu $new_value)` * `bindattr_i(Mu $obj, Mu:T $type, str $attributename, int $new_value)` * `bindattr_n(Mu $obj, Mu:T $type, str $attributename, num $new_value)` * `bindattr_s(Mu $obj, Mu:T $type, str $attributename, str $new_value)` Binds `$new_value` to the attribute of name `$attributename` of object `$obj`, where the attribute was declared in type `$type`. The notes in the `getattr` documentation also apply to `bindattr`. ## bindcomp * `bindcomp(Str $base-class, Mu $compiler)` Registers `$compiler` as the compiler for the language named `$base-class`, as in: my $lang = My::Lang::Compiler.new(); nqp::bindcomp('My::Lang', $lang); In general, though, `$lang` will inherit from `HLL::Compiler`, and the above will be achieved via: $lang.language('My::Lang'); ## callmethod * `callmethod(Mu $obj, str $methodname, *@pos, *%named)` Uses `findmethod` to locate method `$methodname` on object `$obj`, and `call` to invoke the method with positional arguments `*@pos` and named arguments `*%named`. Example: class A { method x($a, $b, :$c) { say("$a $b $c") } } nqp::callmethod(A, 'x', '4', '2', c => 'foo'); # same as: A.x(4, 2, c => 'foo') ## can * `can(Mu $obj, str $method)` If the object has a method of the given name, return 1. Otherwise, return 0. ## clone * `clone(Mu $obj)` Return a clone of the passed in object. ## create * `create(Mu:T $type)` Returns a newly allocated instance of type `$type`. ## eqaddr * `eqaddr(Mu $l, Mu $r)` Returns 1 if the objects are the same object in the underlying VM, 0 otherwise. ## findmethod * `findmethod(Mu $obj, str $method)` If the object has a method of the given name, return it. Otherwise, throw an exception. ## getattr * `getattr(Mu $obj, Mu:T $type, str $attributename)` * `getattr_i(Mu $obj, Mu:T $type, str $attributename)` * `getattr_n(Mu $obj, Mu:T $type, str $attributename)` * `getattr_s(Mu $obj, Mu:T $type, str $attributename)` Returns the attribute of name `$attributename` of object `$obj`, where the object was declared in class `$type`. The `_n`, `_i`, and `_s` variants are for natively typed attributes. The following example demonstrates why the type object needs to passed along, and cannot be infered from the object: class A { has str $!x } class B is A { has str $!x } my $obj := nqp::create(B); nqp::bindattr_s($obj, A, '$!x', 'A.x'); nqp::bindattr_s($obj, B, '$!x', 'B.x'); nqp::say(nqp::getattr_s($obj, A, '$!x')); nqp::say(nqp::getattr_s($obj, B, '$!x')); Throws an exception if there is no such attribute in the class, the attribute is of the wrong type, or the object doesn't conform to the type. Note that in languages that support a full-blown container model, you might need to decontainerize `$obj` before passing it to `getattr`, unless you actually want to access an attribute of the container. ## getcomp * `getcomp(Str $base-class)` Returns the compiler class registered for that `$base-class`. See `bindcomp` for more information. ## how * `how(Mu $obj)` NQP equivalent for Perl 6's `$obj.HOW`. ## rebless * `rebless(Mu $obj, Mu:T $type)` Convert `$obj` to be an object of the new `$type`. ## reprname * `reprname(Mu $obj)` Return the name of the REPR for the given object. ## setwho * `setwho(Mu $obj, Mu $who)` Replace `$obj`'s WHO. Return `$obj`. ## who * `who(Mu $obj)` NQP equivalent for Perl 6's `$obj.WHO`. ## what * `what(Mu $obj)` NQP equivalent for Perl 6's `$obj.WHAT`. ## where * `where(Mu $obj)` Return a unique ID for this `$obj`. # Bit Opcodes ## bitand * `bitand_i(int $l, int $r)` * `bitand_s(str $l, str $r)` * `bitand_I(Mu $l, Mu $r, Mu:T $type)` AND the bits in `$l` and `$r`. `_I` variant returns an object of the given type. ## bitneg * `bitneg_i(int $bits)` * `bitneg_I(Mu $bits, Mu:T $type)` Negate the bits in `$bits`. `_I` variant returns an object of the given type. ## bitor * `bitor_i(int $l, int $r)` * `bitor_s(str $l, str $r)` * `bitor_I(Mu $l, Mu $r, Mu:T $type)` OR the bits in `$l` and `$r`. `_I` variant returns an object of the given type. ## bitshiftl * `bitshiftl_i(int $bits, int $count)` * `bitshiftl_I(Mu $bits, int $count, Mu:T $type)` Signed left shift of `$bits` by `$count`. `_I` variant returns an object of the given type. ## bitshiftr * `bitshiftr_i(int $bits, int $count)` * `bitshiftr_I(Mu $bits, int $count, Mu:T $type)` Signed right shift of `$bits` by `$count`. `_I` variant returns an object of the given type. ## bitxor * `bitxor_i(int $l, int $r)` * `bitxor_s(str $l, str $r)` * `bitxor_I(Mu $l, Mu $r, Mu:T $type)` XOR the bits in `$l` and `$r`. `_I` variant returns an object of the given type. # Context Introspection Opcodes ## ctx * `ctx()` Return the object representing the current context. ## ctxcaller * `ctxcaller(Context $ctx)` Given a context, return the caller context, or null. ## ctxlexpad * `ctxlexpad(Context $ctx)` Given a context, return its lexpad ## curlexpad * `curlexpad()` Return the current lexpad. ## ctxouter * `ctxouter(Context $ctx)` Given a context, return the outer context, or null. ## lexprimspec * `lexprimspec(LexPad $pad, str $name)` Given a lexpad and a name, return the name's primitive type. The primitive types are 1 for int, 2 for num and 3 for str. 0 is any object. ## savecapture * `savecapture()` Gets hold of the argument capture passed to the current block. Commits to doing enough copying that the list is valid any amount of time. See usecapture for a version of the op that doesn't promise that. Used by the multi-dispatcher. ## usecapture * `usecapture()` Gets hold of the argument capture passed to the current block. (a future usecapture may invalidate it) It's valid to implement this exactly the same way as savecapture if there's no performance benefit to be had in a split. Used by the multi-dispatcher. ## getlex * `getlex(str $name)` * `getlex_i(str $name)` * `getlex_n(str $name)` * `getlex_s(str $name)` Looks up the lexical with the specified name and the specified type. Searching in the outer frames, starting at the current. An error is thrown if it does not exist or if the type is incorrect. ## bindlex * `bindlex(str $name, Mu $value)` * `bindlex_i(str $name, int $value)` * `bindlex_n(str $name, num $value)` * `bindlex_s(str $name, str $value)` Binds $value to the lexical specified by name and type. Searching in the outer frames, starting at the current. An error is thrown if it does not exist or if the type is incorrect. ## getlexdyn * `getlexdyn(str $name)` Looks up the contextual with the specified name in the caller chain, starting at the calling frame. ## bindlexdyn * `bindlexdyn(str $name, Mu $value)` Binds $value to the contextual with the specified name, searching for it in the call-chain, starting at the calling frame. ## getlexouter * `getlexouter(str $name)` Looks up the lexical with the specified name and the specified type. Searching in the outer frames, starting at outer. ## getlexcaller * `getlexcaller(str $name)` Looks up the lexical with the specified name, starting at the calling frame. It checks all outer frames of the caller chain. ## getlexrel * `getlexrel(Mu $context, str $name)` Looks up the lexical with the specified name and the specified type. Searching in the outer frames, starting at the given $context. ## getlexreldyn * `getlexreldyn(Mu $context, str $name)` Looks up the contextual with the specified name in the caller chain, starting at the given $context. ## getlexrelcaller * `getlexrelcaller(Mu $context, str $name)` Looks up the lexical with the specified name, starting at the given $context. It checks all outer frames of the caller chain. # Variable opcodes ## bind * `bind(Mu $variable, Mu $value)` Binds `$value` to the `$variable`. Dies if `$variable` isn't actually a variable. Same as the `:=` operator in NQP. # Miscellaneous Opcodes ## const * `const()` Not actually an opcode, but a collection of several constants. Each of the constants below can be used in nqp as (e.g.) `nqp::const::CCLASS_ANY`. * CCLASS_ANY * CCLASS_UPPERCASE * CCLASS_LOWERCASE * CCLASS_ALPHABETIC * CCLASS_NUMERIC * CCLASS_HEXADECIMAL * CCLASS_WHITESPACE * CCLASS_PRINTING * CCLASS_BLANK * CCLASS_CONTROL * CCLASS_PUNCTUATION * CCLASS_ALPHANUMERIC * CCLASS_NEWLINE * CCLASS_WORD * HLL_ROLE_NONE * HLL_ROLE_INT * HLL_ROLE_NUM * HLL_ROLE_STR * HLL_ROLE_ARRAY * HLL_ROLE_HASH * HLL_ROLE_CODE * CONTROL_TAKE * CONTROL_LAST * CONTROL_NEXT * CONTROL_REDO * CONTROL_SUCCEED * CONTROL_PROCEED * CONTROL_WARN * STAT_EXISTS * STAT_FILESIZE * STAT_ISDIR * STAT_ISREG * STAT_ISDEV * STAT_CREATETIME * STAT_ACCESSTIME * STAT_MODIFYTIME * STAT_CHANGETIME * STAT_BACKUPTIME * STAT_UID * STAT_GID * STAT_ISLNK * STAT_PLATFORM_DEV * STAT_PLATFORM_INODE * STAT_PLATFORM_MODE * STAT_PLATFORM_NLINKS * STAT_PLATFORM_DEVTYPE * STAT_PLATFORM_BLOCKSIZE * STAT_PLATFORM_BLOCKS * TYPE_CHECK_CACHE_DEFINITIVE * TYPE_CHECK_CACHE_THEN_METHOD * TYPE_CHECK_NEEDS_ACCEPTS ## debugnoop * `debugnoop(Mu $a)` Returns `$a`. Does nothing, exists only to provide a breakpoint location for debugging. ## exit * `exit(int $status)` Exit nqp, using the given status as the compiler's exit value. ## getenvhash * `getenvhash()` Returns a hash containing the environment variables. Changing the hash doesn't affect the environment variables ## backendconfig * `backendconfig()` Returns a hash containing backend-specific information, like backend-version, configure and build flags. ## getpid * `getpid()` Return the current process id, an int. ## jvmclasspaths `jvm` * `jvmclasspaths()` Converts the JVM property `java.class.path` into a list of paths, returns it. ## sha1 * `sha1(str $str)` Given a UTF-8 string, return the SHA-1 digest for that string. ## sleep * `sleep(num $seconds)` Sleep for the given number of seconds (no guarantee is made how exact the time sleeping is spent.) Returns the passed in number. ## takeclosure * `takeclosure(Block $innerblock)` Creates a lexical closure from the block's outer scope. ## time * `time_i()` * `time_n()` Return the time in seconds since January 1, 1970 UTC. `_i` variant returns an integral number of seconds, `_n` returns a fractional amount. # Native Call / Interoperability Opcodes ## x_posixerrno * `x_posixerrno()` Returns an int that corresponds to the value of POSIX's errno. nqp-2013.12.1/docs/pir2nqp.todo000066400000000000000000000055711225523575400160530ustar00rootroot00000000000000This file is basically a dump of all "pir::" occurrences in the nqp codebase, then looked at by pm and jnthn to determine what needs to be done with them (and to act as a sort of short / mid-term activity schedule for lizmat). Please update as necessary. stay pir for now, until we know how to do constants: pir::const::CCLASS_ALPHABETIC pir::const::CCLASS_ALPHANUMERIC pir::const::CCLASS_ANY pir::const::CCLASS_BLANK pir::const::CCLASS_CONTROL pir::const::CCLASS_HEXADECIMAL pir::const::CCLASS_LOWERCASE pir::const::CCLASS_NEWLINE pir::const::CCLASS_NUMERIC pir::const::CCLASS_PUNCTUATION pir::const::CCLASS_UPPERCASE pir::const::CCLASS_WHITESPACE pir::const::CCLASS_WORD pir::const::IGLOBALS_CONFIG_HASH pir::const::IGLOBALS_LIB_PATHS pir::const::INTERPINFO_ACTIVE_PMCS pir::const::INTERPINFO_CURRENT_RUNCORE pir::const::INTERPINFO_TOTAL_MEM_ALLOC pir::const::INTERPINFO_TOTAL_MEM_USED pir::const::INTERPINFO_TOTAL_PMCS after jnthn's toqast branch is merged pir::isa 2nd arg = ResizablePMCArray, then nqp::islist 2nd arg = hash then nqp::ishash to be eliminated / handled by jnthn nqp::defined -> nqp::isconcrete pir::is_dispatcher__IP pir::create_dispatch_and_add_candidates__PPP pir::push_dispatchee__0PP pir::getinterp__P pir::getattribute__PPs to become nqp::load pir::load_bytecode to be nqp::changetype pir::repr_change_type__0PP to be nqp::pubmethcache pir::publish_method_cache to be nqp::pubtypecache pir::publish_type_check_cache to be nqp::knowhow pir::get_knowhow__P to be nqp::knowhowattr pir::get_knowhow_attribute__P to be nqp::rxnfaalt pir::nqp_nfa_run_alternation__vPSIPP to be nqp::rxnfaproto pir::nqp_nfa_run_protoregex__PPSI to be nqp::setboolspec pir::set_boolification_spec__0PiP to be nqp::setmethcacheauthoritativeness pir::set_method_cache_authoritativeness__vPi unsure what to do with as yet: pir::compreg__0sP pir::compreg__Ps pir::copy__vPP pir::find_caller_lex__Ps pir::find_codepoint__Is pir::find_dynamic_lex__Ps pir::is_invokable__IP pir::typeof need to stay: pir::new__Ps pir::interpinfo__Ii pir::interpinfo__si pir::getstderr__P pir::getprop__PPs pir::box__Pi pir::find_encoding__Is pir::find_encoding__is pir::get_hll_global__Ps pir::get_root_namespace__PP pir::return__vPsiPPi pir::set_hll_global__vPsP pir::set_hll_global__vsP pir::set_runcore__vs pir::setprop__vPsP pir::sweep__vi pir::trace pir::trans_encoding__Ssi pir::trans_encoding__ssi to be decided on later on how to generalize: pir::assign__vPS pir::set_sub_code_object__vPP pir::nqp_add_code_ref_to_sc__vPiP pir::nqp_create_sc__PS pir::nqp_fresh_stub__PP pir::nqp_get_package_through_who__PPs pir::nqp_get_sc_for_object__PP pir::nqp_pop_compiling_sc__v pir::nqp_push_compiling_sc__vP pir::nqp_serialize_sc__SPP pir::nqp_set_sc_for_object__vPP pir::nqpdebflags__Ii pir::nqpevent__vs pir::nqpevent_fh__PP pir::repr_clone__PP pir::stable_publish_vtable_handler_mapping__vPP pir::stable_publish_vtable_mapping__vPP nqp-2013.12.1/docs/qast.markdown000066400000000000000000000370351225523575400163050ustar00rootroot00000000000000# QAST Nodes The "Q" Abstract Syntax Tree is a set of nodes used to represent the runtime behavior of a program that is being compiled. Parsing a program with a grammar produces a parse tree. As the name suggests, this is strongly tied to the syntax of the language being parsed, and reflects the structure of the grammar. This parse tree is mapped by action methods into an abstract syntax tree - a tree of QAST nodes. Rather than talking about program syntax, they talk about what happens at runtime: loops, conditionals, variable lookups, etc. This document describes the available nodes and what they are for. ## QAST::CompUnit While it's not mandatory, most QAST trees that are produced should have a QAST::CompUnit at the top. It should have a single QAST::Block child. This child block represents the outermost scope of the compilation unit. QAST::CompUnit incorporates information that is relevant to the entire unit of code that is being compiled. This includes: * **hll** - the name of the high level language that this QAST tree was produced from, for example, "perl6", "tcl", "bf". * **load** - code to evaluate at the point that the compilation unit is loaded as a module (but not if it is invoked as a mainline program). Happens after any deserialization and deserialization related actions have executed. * **main** - like load, but instead this contains code to execute if the compilation unit is invoked as the mainline Example usage: QAST::CompUnit.new( # Set the HLL. :hll('perl6'), # This variable contains the outermost QAST::Block of the # program. $top_block, # If we run the program as the mainline, then call the top # block automatically. :main(QAST::Op.new( :op('call'), QAST::BVal.new( :value($top_block) ) )) ) Additional adverbs that can be set on a QAST:CompUnit relate to bounded serialization, which will be covered separately. ## QAST::Block A QAST::Block is both a unit of invocation and a unit of lexical scoping. To clarify, this means that if: * You want to create something that can be called, such as a subroutine, closure block or method * You want a fresh lexical environment Then you want to use a QAST::Block. A block can have as many children as you wish, and the final child should evaluate to the return value of the block. A simple example of a block is: QAST::Block.new( QAST::IVal.new( :value(42) ) ) This will compile to a block of code that, when invoked, returns 42. A block can be given a name and a compilation unit unique ID. The name is user facing, and will appear in any automatically generated backtraces. It does not need to be unique within the compilation unit. The compilation unit unique ID, as the name suggests, does need to be. You typically do not need to worry about it much, however; it will be generated for you the first time it is needed, if you do not specify it up front. Often, you will not need to worry about it at all. Here's a block with a name. QAST::Block.new( :name('answer'), QAST::IVal.new( :value(42) ) ) Note that giving a block a name does not imply *any* installation of the block under this name. It's not installed automatically for you as a method or subroutine. That's for you to do. Blocks can be placed within other blocks. This nesting represents the static chain that will be used for the lookup of lexically scoped variables. When you nest one block inside of another, you may wish for it to be invoked automatically when it is encountered, or you may wish that it be treated as an object (for example, which you can bind somewhere). You can configure this by setting the blocktype: QAST::Block.new( QAST::Op.new( :op('say'), QAST::SVal.new( :value('before') ) ), QAST::Block.new( :blocktype('immediate'), QAST::Op.new( :op('say'), QAST::SVal.new( :value('nested') ) ) ), QAST::Op.new( :op('say'), QAST::SVal.new( :value('after') ) ) ) Here, 'immediate' indicates that this block should be executed immediately, whenever it is reached during program execution. The default, 'declaration', does not have these semantics. You use it when you plan to bind the block, for example into a lexical variable, or you are installing it elsewhere (for example, as a method). Block has one more handy feature: it can be used to maintain a symbol table. It provides you with a hash per symbol (typically, these correspond to the variables you declare in the block, but you can put whatever you want in it). $my_block.symbol('$foo', :scope('lexical'), :readonly(1)); The named parameters you pass are stored in a hash for the symbol '$foo'. If you call it again: $my_block.symbol('$foo', :scope('local'), :optimized(1)); Then the updated value for 'scope' will be put in place, the new 'optimized' value will be stored and the existing 'readonly' value will be left intact. That is to say, you can safely add extra information over time. To get all the known facts about a symbol in a hash, simply do: my %sym := $my_block.symbol('$foo'); Two keys have special significance to the QAST to VM compiler: * **scope** is used to find a default scope for a variable, if none is set in a QAST::Var node that is doing a lookup * **type** is used to know the type of the variable. This matters if the variable is natively typed, since it influences the code generation ## QAST::Stmts and QAST::Stmt Often you will wish to execute a sequence of statements, one after the other. This is what QAST::Stmts is for. It simply contains a sequence of other QAST nodes that will be executed in order. The QAST::Stmts node as a whole will evaluate to the last statement. For example, you may have a program along the lines of: if pints < 4 { say "MORE BEER!"; pint = pint + 1; } There are two statements inside of the if node. This probably compiles to something like: QAST::Op.new( :op('if'), # Here comes the condition. QAST::Op.new( :op('lt_i'), QAST::Var.new( :name('pints') ), QAST::IVal.new( :value(4) ) ), # We want to do multiple statements if the condition is true, # so wrap them in a QAST::Stmts. QAST::Stmts.new( QAST::Op.new( :op('say'), QAST::SVal.new( :value('MORE BEER!') ) ), QAST::Op.new( :op('bind'), QAST::Var.new( :name('pints') ), QAST::Op.new( :op('add_i'), QAST::Var.new( :name('pints') ), QAST::IVal.new( :value(1) ) ) ) ) ) Occasionally, you may want the overall sequence of statements to evaluate to something other than the last child. In this case, use resultchild. QAST::Op.new( :op('say'), QAST::Stmts.new( :resultchild(0), QAST::SVal.new( :value('omg a kangaroo!!!') ), QAST::Op.new( :op('call'), :name('prepare_bbq') ) ) ) Here, the call to 'prepare_bbq' will be run, but the 'say' operation will be given the SVal, not the result of the call. Essentially, resultchild is the zero-based index of which child to use as the result of the QAST::Stmts node overall. There is a variant of QAST::Stmts, which is QAST::Stmt. While the first has no impact on the allocation of temporaries, QAST::Stmt marks a register allocation boundary; beyond it, any temporaries are free to be reused. You do not need to use QAST::Stmt, but it can lead to better code generation if used correct. Incorrect use can, of course, lead to incorrect code generation. Like QAST::Stmts, it also can have multiple children and supports resultchild. ## QAST::IVal, QAST::NVal and QAST::SVal Perhaps the simplest nodes in QAST, these represent literal, native values. All of them expect the literal to be specified by setting value. QAST::IVal represents an integer literal, QAST::NVal represents a numeric (floating point) literal, and QAST::SVal represents a string literal. QAST::IVal.new( :value(42) ) QAST::NVal.new( :value(3.14) ) QAST::SVal.new( :value('keming') ) And that's about all there is to say about them. Simples! ## QAST::Op This node captures the very general notion of "an operation". Operations range from addition to method calls to exception handling. The operations themselves are documented separately; the form of the node itself is pretty consistent, however. The children are the operands for the operation. For example: QAST::Op.new( :op('mul_i'), QAST::IVal.new( :value(2) ), QAST::IVal.new( :value(21) ) ) Represents an integer multiplication. Some operations also take a name, such as callmethod: QAST::Op.new( # Call the method 'can_haz'... :op('callmethod'), :name('can_haz'), # ...on the object in $i... QAST::Var.new( :name('$i') ), # ...and pass a string argument, kthxbai. QAST::SVal.new( :value('cheezburger') ) ) There are hundreds of operations, and QAST::Op nodes will be amongst the most common in your trees. By the way, the nqp::op(...) syntax in the NQP language is actually just sugar for a QAST::Op node. This means that any op you've used when writing NQP code is now available to you when writing your compiler, which is a nice bit of knowledge re-use. It's almost like we designed this thing! ## QAST::Var The QAST::Var node is used for declaring and lookup up variables. If you are using QAST's handling of parameters, then a QAST::Var node is also used to declare these. At its simplest, a QAST::Var node needs to specify the name of the variable to look up. QAST::Var.new( :name('$bar') ) In this case, the symbol table of the enclosing blocks must supply a scope. A variable can always be explicitly marked with its scope. QAST::Var.new( :name('$bar'), :scope('lexical') ) Variable declarations look similar: QAST::Var.new( :name('$bar'), :scope('lexical'), :decl('var') ) Note that the declaration for each variable should only show up once, and all subsequent usages should not set decl. A declaration evaluates to the variable itself, and can also be bound to. QAST::Op.new( :op('bind'), QAST::Var.new( :name('$x'), :scope('lexical'), :decl('var'), :returns(int) ), QAST::IVal.new( :value(0) ) ) Note also that returns can be used to specify the type of the variable. It is not needed in general, but is important for native types. Note that you should supply a 6model type object for the type, not a string type name! It is only used to determine the type of storage to allocate for the variable, and type constraints besides those implied by the nature of the storage will not be enforced. Aside from lexicals, it is also possible to declare locals. These are not visible from nested blocks. They are cheaper than lexicals as a result of this, but naturally more restricted. A compiler may start out with everything lexical and in an optimization phase turn some of those into locals if it can prove that this will not be problematic for the execution of the program. They look pretty much the same as lexicals otherwise. QAST::Op.new( :op('bind'), QAST::Var.new( :name('$nom'), :scope('local'), :decl('var'), :returns(str) ), QAST::SVal.new( :value('bacon') ) ) While you can rely on any object variables being initialized to null for you, there are no such promises for any of the native types. Thus if your language promises that a fresh integer variable will start with 0, you should set it (once again, possibly optimizing away that initialization if you can prove that a user assignment renders it useless). Parameters work in a similar way; just set decl to 'param' instead of 'var'. For example, the following block takes two positional parameters. QAST::Block.new( QAST::Var.new( :name('$x'), :scope('lexical'), :decl('param') ), QAST::Var.new( :name('$y'), :scope('lexical'), :decl('param') ), ... ) Parameter declarations can also be given: * :default(...) - a QAST tree that produces a default value for the parameter if it is not passed. This makes it optional. * :slurpy(1) - specifies that the parameter is slurpy. Use :named(1) also for a named slurpy parameter. Finally, there are a couple of other values of decl that work with lexicals. * static - means that the lexical should be given the value specified in the :value(...) argument. Useful for things that wish to install symbols in the lexical scope with the intention they'll not be mutated (for example, a type declaration may be installed using this). No attempt is made to ensure you do not re-bind such a symbol, but do not do this; runtimes are free to turn lookups of static lexical symbols into direct references to the symbol. * contvar - means that the lexical should be initialized to a clone of the :value(...) argument. Presumably, this represents some kind of container type. There are no restrictions on re-binding. * statevar - same as for contvar, except the container created will be used for all given closure clones. To be clear, cloning a code ref doesn't bring state variables along. On the initial call, containers are formed in the way that contvar forms them: by cloning the :value(...) argument. ## QAST::VarWithFallback In the context of a bind, or with native types, this is exactly the same as a QAST::Var. For fetches of object types, if a null is produced, the QAST tree in :fallback(...) will be run and the value that it evaluates to produced instead. ## QAST::BVal A QAST::Block can only appear once in the QAST tree. So what if you want to refer to a block from elsewhere? The answer is to use a QAST::BVal. QAST::BVal.new( :value($some_block) ) The $some_block should be a QAST::Block. Note that this only works if the block is in the same compilation unit as the one where the BVal is used (though it's hard to think of a typical situation where you'd end up trying to do anything else). ## QAST::WVal This node, known as a World Value, references an object that lives in a serialization context. It may be associated with the current compilation unit or some other compilation unit. QAST::WVal is typically used to talk about objects that you create to represent declarative elements of your program. For example, if the program declares a class, you would create an object describing that type as you compile the program, and then use a QAST::WVal to refer to the type from the compiled program code. Usage looks like: QAST::WVal.new( :value($the_object) ) While obscure at first, QAST::WVal is an extremely powerful tool. Much in NQP and even more in the Rakudo Perl 6 compiler hangs of the notion of bounded serialization and a World that builds up a model of the declarative aspects of a program. ## QAST::Want QAST::Want nodes will appear in the QAST tree whenever you emit a value, but don't yet know in what context it will be used, like 123. Each sub-node of the Want provides a value for one context out of int, str, num, object and void. When a context is known, the last of the matching sub-nodes will be used, or the first one if none match. In the case of 123, it may be a boxed integer or a native integer value This notion of context is very code-generation centric, so a want-value of 123 would not create a sub-node for string context, or else my str $x = 123; would work without complaining. ## QAST::VM nqp-2013.12.1/docs/release_guide.pod000066400000000000000000000050751225523575400170710ustar00rootroot00000000000000=head1 release_guide.pod - guide to NQP releases NQP's development release cycle is intimately tied to Rakudo's release cycle. There is no separate, independent release cycle for NQP. Parrot is scheduled to release the third Tuesday of each month; Rakudo will generally issue its own development release soon after the scheduled Parrot release (usually within a few days). To accomplish this, NQP must be tagged for release immediately prior to the Rakudo release. =head2 Steps to create an NQP release =over 4 =item 1. I Check to see if F needs to be bumped to a later Parrot release. If PARROT_REVISION already contains a Parrot release tag (e.g., C) then it does not need to be changed. If PARROT_REVISION refers to an interim commit, as in C, then update PARROT_REVISION to contain the tag corresponding to Parrot's monthly release. To see a list of Parrot release tags, use C on an up-to-date Parrot repository. Once F has been set to a Parrot release, it must not be changed (except to another Parrot release) until after the Rakudo release. =item 2. Change the C file in nqp: $ echo '2012.12' > VERSION $ git commit -m 'bump VERSION to 2012.12' VERSION $ git push =item 3. Make sure everything compiles and runs from a known clean state. This step is especially important if PARROT_REVISION was changed in step 1 above. $ make realclean $ perl Configure.pl --gen-parrot $ make $ make test Resolve any problems that may still exist. =item 4. Create a release tarball (needed for the Rakudo Star release) by entering C, where YYYY.MM is the month for which the release is being made. This will create a tarball file named C. =item 5. Unpack the tar file into another area, and test that it builds and runs properly using the same process in step 3 above. If there are any problems, fix them and go back to step 3. =item 6. Tag NQP by its release month ("YYYY.MM") $ git tag -a -m"tag release YYYY.MM" YYYY.MM # e.g., 2012.12 $ git push --tags =item 7. Upload the release tarball to L: $ scp nqp-2013.12.tar.gz rakudo@rakudo.org:public_html/downloads/nqp/ If you do not have permissions for that, ask one of (pmichaud, jnthn, masak, tadzik, moritz, PerlJam) on #perl6 to do it for you. =item 8. If creating the NQP release as part of a Rakudo release, continue with the Rakudo release process. =back nqp-2013.12.1/docs/serialization_format.markdown000066400000000000000000000366261225523575400215670ustar00rootroot00000000000000# Serialization Format ## Header The header contains a version, followed by offsets (from the start of the data blob) where various tables can be located. +---------------------------------------------------------+ | Version | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the dependencies table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the dependencies table | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the STables table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the STables table | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the STables data | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the objects table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the objects table | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the objects data | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the closures table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the closures table | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the contexts table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the contexts table | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the contexts data | | 32-bit integer | +---------------------------------------------------------+ | Offset (from start of data) of the repossessions table | | 32-bit integer | +---------------------------------------------------------+ | Number of entries in the repossessions table | | 32-bit integer | +---------------------------------------------------------+ ## Dependencies Table This table describes the Serialization Contexts (SC) that are required to already be loaded in order to load this one. The number of entries this table has, is supplied by the header. Each entry looks as follows. +---------------------------------------------------------+ | Index into the string heap of the SC unique ID | | 32-bit integer | +---------------------------------------------------------+ | Index into the string heap of the SC description | | 32-bit integer | +---------------------------------------------------------+ ## STables Table This table describes the 6model STables that have been serialized. Each entry contains the following items. +---------------------------------------------------------+ | Index into the string heap a string holding the name of | | the representation (REPR) that this STable points to. | | 32-bit integer | +---------------------------------------------------------+ | Offset from the start of the STable data chunk where | | the data for this STable has been serialized | | 32-bit integer | +---------------------------------------------------------+ | Offset from the start of the STable data chunk where | | the REPR data for this STable has been serialized (you | | can get there by reading everything from the previous | | offset, but it may not be efficient if you want to get | | an idea of the object size first) | | 32-bit integer | +---------------------------------------------------------+ ## STables Data The STable is serialized just by a sequence of primitives, in the following order. * HOW (object reference) * WHAT (object reference) * WHO (variant) * method_cache (VM hash) * vtable_length (native int) * \[each of the items\] (variant) * type_check_cache_length (native int) * \[each of the items in type_check_cache\] (object reference) * mode_flags (native int) * boolification_spec (native int flag for if it exists; if true, then a native int for the mode and a ref for the method slot) * container_spec (native int flag for if it exists; if true, then ref/string/int for the attribute and ref for the fetch method) * invocation_spec (native int flag for if it exists; if true, then ref for class handle, str for attr name, int for hint and ref for invocation handler) After this, the REPR data is serialized (which is specific to the REPR in question). ## Objects Table This table describes the objects that have been serialized. Each entry contains the following items. +---------------------------------------------------------+ | Base-1 index of the SC that contains the STable for the | | context, or 0 if it is in the current SC. | | 32-bit integer | +---------------------------------------------------------+ | Index in the SC where the STable can be located. | | 32-bit integer | +---------------------------------------------------------+ | Offset from the start of the object data chunk where | | the data for this object has been serialized | | 32-bit integer | +---------------------------------------------------------+ | Flags. Currently, just 1 if it's a normal object and 0 | | if it is a type object. | | 32-bit integer | +---------------------------------------------------------+ The exact data stored for an object is up to its representation. ## Closures Table This table describes the closures we have taken during compilation and that need to be re-instated during deserialization, along with references to their relevant outer contexts. +---------------------------------------------------------+ | Base-1 index of the SC that contains the static code | | reference that this closure is a clone of, or 0 if it | | is in the current SC. | | 32-bit integer | +---------------------------------------------------------+ | Index in that SC where the static code ref is located. | | 32-bit integer | +---------------------------------------------------------+ | 1-based index into the contexts table where the outer | | context for this closure can be found, or zero if there | | is none of interest | | 32-bit integer | +---------------------------------------------------------+ | Flag for if the closure has an associated code object. | | 32-bit integer | +---------------------------------------------------------+ | If it has one, this is the 1-based SC index of the code | | object, or 0 if in the current SC. | | 32-bit integer | +---------------------------------------------------------+ | If it has one, this is the index in that SC where the | | code object can be located. | | 32-bit integer | +---------------------------------------------------------+ ## Contexts Table This table describes the contexts that exist as outer scopes for closures taking during compilation. +---------------------------------------------------------+ | Base-1 index of the SC for the code ref the context is | | associated with, or 0 if it is in the current SC. | | 32-bit integer | +---------------------------------------------------------+ | Index in that SC where the code ref is located. | | 32-bit integer | +---------------------------------------------------------+ | Offset into the contexts data segment where the values | | for the various lexical entries may be found | | 32-bit integer | +---------------------------------------------------------+ | 1-based index into the contexts table where the next | | outer context in the chain can be found, or zero if | | there is none | | 32-bit integer | +---------------------------------------------------------+ ## Repossessions Table This table describes the objects serialized in this SC that were originally owned by another SC, but were taken over by this one due to being modified while it was being compiled. +---------------------------------------------------------+ | Repossessed entity type (0 = object, 1 = STable) | | 32-bit integer | +---------------------------------------------------------+ | Index in our object list where the repossessed object | | is located | | 32-bit integer | +---------------------------------------------------------+ | Base-1 index of the SC that used to own the object (0 | | is not legal here) | | 32-bit integer | +---------------------------------------------------------+ | Index in that SC where the original object is located. | | 32-bit integer | +---------------------------------------------------------+ ## Primitives This section describes how the various primitive types known to the serializer are stored. ### Native Integers These are stored as 64-bit integers. ### Native Numbers These are stored as 64-bit floating point numbers (doubles). ### Strings These are stored as 32-bit indexes into the strings heap. ### Variant Reference Most times we have a pointer to serialize, we will use a variant reference to do so. The reason being that 1 = NULL 2 = Object reference 3 = VM NULL 4 = VM Boxed Integer 5 = VM Boxed Number 6 = VM Boxed String 7 = VM Array of Variant References 8 = VM Array of Strings 9 = VM Array of Integers 10 = VM Hash of Variant References with String Keys 11 = VM Static Code Reference 12 = VM Cloned Code Reference (a serialized closure) ### Object references These are stored as a 32-bit SC index (base 1 into the dependencies table, or 0 for current SC), followed by a 32-bit index into the selected SC. ### VM NULL We store no extra info for those. ### VM Array of Variants These are stored as an element count as a 32-bit integer, followed by the variants. ### VM Array of Strings These are stored as an element count, followed by the string heap indexes. ### VM Array of Integers These are stored as an element count, followed by the 64-bit integers. ### VM Hash of Variants with String Keys These are stored as an element count. This is followed by that number of string/variant pairs. ### Code References These are always serialized as the SC containing the code reference, plus the index where it can be located. ### VM Static Code Reference The simplest case of code referenced from objects is when the VM has never had to invoke the code during compilation. In this case, the thunk for the dynamic compilation will have been tagged with a STATIC_CODE_REF property and placed into the SC for the current compilation unit. When we encounter such a case, we simply serialize the SC that owns the code object and the code ref index that it is at. Deserialization relies on the deserializer being given a fixed up list of code objects, pointing to the compiled code refs. These are indexed just as the dynamic compilation stubs were, so references to them can be resolved. This also works out in the cross-context case. ### Dynamic Compilation When dynamic compilation is performed, the SC should be updated with the code ref to the now-compiled code. Additionally, this needs to be tagged as a static code reference (and will also be tagged with the SC in question). In the simplest case, we'll never end up referencing this execution of the code - but if closures are taken pointing to it, this will happen, and needs some special handling. ### Closures If we encounter a code object that is not marked as static, but already has been given an SC, then we can simply write the reference out in just the same way as we would for a static code object. This means something has already taken care of the hard work. They are deserializable in a similar way. The interesting part comes when we encounter a code ref that hasn't been tagged with an SC yet. First, we trace back from it to the correct static code ref (probably via the reference back to the static code ref that's held in the static lexical scope info). We make an entry in the closures table indicating the static code ref that needs to be cloned in order to start recreating the closure. Next, we consider the outer. There are two things involved here. One is the context, which represents the lexicals declared in that context. The second is the code object that is associated with the outer. There are some options for this. 1) The outer points to a dynamic compilation boundary (tagged DYN_COMP_BOUNDARY). This means that it is a "fake" frame that exists because the outer scopes beyond here were not done compiling at the point of invocation. We thus don't want to actually do any serialization of this context. 2) The outer points to no interesting outer whatsoever, and represents the point that we should stop doing any serialization. It will be tagged UNIT_BOUNDARY. 3) The outer points to a context with lexicals values that need to be serialized. In this case, it may be an invocation from the static code reference, or it may be an invocation from another closure. nqp-2013.12.1/dynext/000077500000000000000000000000001225523575400141445ustar00rootroot00000000000000nqp-2013.12.1/dynext/IGNOREME000066400000000000000000000000211225523575400152650ustar00rootroot00000000000000Ignoration FAIL. nqp-2013.12.1/examples/000077500000000000000000000000001225523575400144475ustar00rootroot00000000000000nqp-2013.12.1/examples/CallFromJava.java000066400000000000000000000027331225523575400176200ustar00rootroot00000000000000// nqp$ javac -cp bin/ examples/CallFromJava.java // nqp$ java -cp nqp-runtime.jar:3rdparty/asm/asm-4.1.jar:3rdparty/asm/asm-tree-4.1.jar:. examples.CallFromJava nqp.jar nqp 'say(2+2)' // 4 // rakudo$ java -cp ../nqp-jvm:../nqp-jvm/3rdparty/asm/asm-4.1.jar:../nqp-jvm/3rdparty/asm/asm-tree-4.1.jar:../nqp-jvm/nqp-runtime.jar:rakudo-runtime.jar:. examples.CallFromJava perl6.jar perl6 'say 2 + 2' // 4 // Note: curently nqp only functions properly in the application class path. package examples; import org.perl6.nqp.runtime.*; import static org.perl6.nqp.runtime.CallSiteDescriptor.*; import org.perl6.nqp.sixmodel.*; public class CallFromJava { private GlobalContext g; private ThreadContext t; private SixModelObject nqpComp; private CallFromJava(String bytecode, String hll) { g = new GlobalContext(); t = g.getCurrentThreadContext(); Ops.loadbytecode(bytecode, t); nqpComp = Ops.getcomp(hll, t); } private SixModelObject eval(String nqp) { Ops.invokeDirect(t, Ops.findmethod(t, nqpComp, "compile"), new CallSiteDescriptor(new byte[] { ARG_OBJ, ARG_STR }, null), new Object[] { nqpComp, nqp }); Ops.invokeDirect(t, Ops.result_o(t.resultFrame()), Ops.emptyCallSite, Ops.emptyArgList); return Ops.result_o(t.resultFrame()); } public static void main(String[] args) { CallFromJava nqp = new CallFromJava(args[0], args[1]); nqp.eval(args[2]); } } nqp-2013.12.1/examples/fib.nqp000066400000000000000000000003401225523575400157240ustar00rootroot00000000000000#! nqp sub fib($n) { $n < 2 ?? $n !! fib($n-1) + fib($n - 2); } my $N := 29; my $t0 := nqp::time_n(); my $z := fib($N); my $t1 := nqp::time_n(); nqp::say("fib($N) = " ~ fib($N)); nqp::say("time = " ~ ($t1-$t0)); nqp-2013.12.1/examples/hello_world.nqp000066400000000000000000000000661225523575400175030ustar00rootroot00000000000000#!nqp say("Hello, awesome Not Quite Perl 6 World!"); nqp-2013.12.1/examples/json.nqp000066400000000000000000000050161225523575400161420ustar00rootroot00000000000000#! nqp # A JSON compiler written in NQP. To use this compiler, first # precompile the code to PIR, then run that: # # $ nqp --target=pir json.nqp >json.pir # $ parrot json.pir # # It can then be turned into a .pbc to be available as load_language: # # $ parrot -o json.pbc json.pir # $ cp json.pbc /lib//languages # use NQPHLL; grammar JSON::Grammar is HLL::Grammar { rule TOP { } proto token value { <...> } token value:sym { } token value:sym { '-'? [ <[1..9]> <[0..9]>+ | <[0..9]> ] [ '.' <[0..9]>+ ]? [ <[Ee]> <[+\-]>? <[0..9]>+ ]? } rule value:sym { '[' [ + %',' ]? ']' } rule value:sym { '{' [ [ ':' ]+ %',' ]? '}' } token string { } } class JSON::Actions is HLL::Actions { method TOP($/) { make PAST::Block.new($.ast, :node($/)); }; method value:sym($/) { make $.ast; } method value:sym($/) { make +$/; } method value:sym($/) { my $past := PAST::Op.new(:pasttype, :node($/)); if $ { for $ { $past.push($_.ast); } } make $past; } method value:sym($/) { my $past := PAST::Stmts.new( :node($/) ); my $hashname := PAST::Compiler.unique('hash'); my $hash := PAST::Var.new( :scope, :name($hashname), :viviself('Hash'), :isdecl ); my $hashreg := PAST::Var.new( :scope, :name($hashname) ); $past.'push'($hash); # loop through all string/value pairs, add set opcodes for each pair. my $n := 0; while $n < +$ { $past.'push'(PAST::Op.new( :pirop, $hashreg, $[$n].ast, $[$n].ast ) ); $n++; } # return the Hash as the result of this node $past.'push'($hashreg); make $past; } method string($/) { make $.ast; } } class JSON::Compiler is HLL::Compiler { method autoprint($value) { _dumper($value, 'JSON') unless (pir::getinterp__P()).stdhandle(1).tell > $*AUTOPRINTPOS; } } sub MAIN(*@ARGS) { my $json := JSON::Compiler.new; $json.language('json'); $json.parsegrammar(JSON::Grammar); $json.parseactions(JSON::Actions); $json.command_line(@ARGS); } nqp-2013.12.1/examples/loops.nqp000066400000000000000000000001331225523575400163200ustar00rootroot00000000000000#! nqp # Example of a while loop my $i := 0; while $i < 10 { say("i=$i"); $i++; } nqp-2013.12.1/examples/rubyish/000077500000000000000000000000001225523575400161345ustar00rootroot00000000000000nqp-2013.12.1/examples/rubyish/README.md000077500000000000000000000066541225523575400174310ustar00rootroot00000000000000nqp/examples/rubyish ==================== Ruby subset extended from the `rubyish-4` example, as introduced in the Edument [Rakudo and NQP internals course](https://github.com/edumentab/rakudo-and-nqp-internals-course). Example usage: ``` % nqp-p rubyish.nqp -e'puts "Hello World!"' % nqp-p rubyish.nqp examples-rubyish/template.rbi % nqp-p rubyish.nqp # repl mode > puts 37 + 5 ``` Implemented: - simple strings 'Hello World!' %q{...} - interpolating strings: "number #{37+5}" %Q{Hello #{planet}!} - quoted words: `%w[aa bb cc]` - basic scoping, including $globals, @class_instance and @@package variables - conditional blocks: `if ... then ... elsif ... else ... endif`, `unless..end` - nqp opcode calls: `nqp::sleep(5)` - a few built-ins: `abort`, `print`, `puts`, `sleep` - a couple of methods: `.call` and `.nil?` - infixish assignments: `+=` `-=` `*=` ... - simple classes and objects with attributes. - inheritance (no mixins yet) - see [inheritance.t](t/inheritance.t) - `while` and `until` loops - statement modifiers `if` `unless`, `while`, `until` e.g.: `puts 42 if true` - basic arrays and hashes - for loops on arrays: `for val in [10, 20, 30] do puts val end` - for loops on hash keys: `h = {'a'=>10, 'b'=>20}; for k in h do puts h{k} end` - lambda blocks/closures: `def make_counter(n,incr) ; n-=incr; lambda { n += incr }; end` - lightweight eRuby like templating, see [template.rbi](examples-rubyish/template.rbi) - heredocs, literal `< puts 42 To run tests: ``` % prove -v -e'nqp-p rubyish.nqp' t ``` Strings and truth values are Perlish rather than Rubyish: - `+` always does addition (doesn't concatenate strings) - `~` has been introduced as the concatenation operator - `>`, `==`, `<=` ... only do arithmetic comparisons - `gt`, `eq`, `le` ... do string comparisons - 0, '0', '' are false in a boolean context. - hash dereferencing is via angle braces: `puts fruit` or curlies `puts fruit{'bananas'}` nqp op-codes can be called like regular functions. E.g. ``` puts nqp::if(2+2 == 4, 'yup', 'nope' ) def sprintf(fmt, *args) ; nqp::sprintf(fmt, args) ; end puts sprintf("pid=%s time=%d", nqp::getpid, nqp::time_i) ``` this includes nqp control-flow functions: ``` n = 99 nqp::while n > 0, begin puts "#{n} green bottles standing on the wall" puts "#{n} green bottles standing on the wall" puts "and if one green bottle should accidently fall..." nqp::sleep 1 n -= 1 puts "there'd be #{n} green bottles standing on the wall" nqp::sleep 2 end ``` Rubyish does a limited amout of context sensitive parsing, E.g. ``` yy = 37 puts yy -5 # parsed as an expression; output is 32 def xx(n) ; 37 - n; end puts xx -5 # parsed as a function call; output is 42 ``` This only works only if the functions and methods have been previously declared. If in doubt, use parenthesis for function calls, `capitalize(name)` vs `capitalize name`; and make method calls explicit, `self.fibonacci(n - 1)` vs `fibonacci(n - 1)`. nqp-2013.12.1/examples/rubyish/examples-rubyish/000077500000000000000000000000001225523575400214355ustar00rootroot00000000000000nqp-2013.12.1/examples/rubyish/examples-rubyish/closure.rbi000077500000000000000000000004311225523575400236100ustar00rootroot00000000000000def gen_times(factor) lambda {|n| n*factor } end times3 = gen_times(3) # 'factor' is replaced with 3 times5 = gen_times(5) puts "3 X 12 = #{times3.call( 12 )}" puts "5 X 5 = #{times5.call( 5 )}" puts "3 X (5 X 4) = #{times3.call( times5.call(4) )}" nqp-2013.12.1/examples/rubyish/examples-rubyish/fractal-tree.rbi000077500000000000000000000021431225523575400245070ustar00rootroot00000000000000 <%# # Fractal tree rubyish example. Usage: # % nqp-p rubyish.nqp examples-rubyish/fractal-tree.rbi > fractal.svg # %> <%#---------- def cos(a); nqp::cos_n(a); end def sin(a); nqp::sin_n(a); end @scale = 0.66 @PI = 3.1415926535 @eps = 2.0 def tree(x1, y1, len, angle = 1.5 * @PI) x2 = x1 + len * cos(angle) y2 = y1 + len * sin(angle) sw = len > 20? len / 10 : 2; g = len < @eps*2? 210: 20; puts " " if (len *= @scale) >= @eps then tree(x2, y2, len, angle + 0.2*@PI); tree(x2, y2, len, angle - 0.2*@PI); end end width = 1000 height = 850 tree(x1=width/2, y1=height, length=300) #-----------%> nqp-2013.12.1/examples/rubyish/examples-rubyish/pi.rbi000077500000000000000000000007711225523575400225530ustar00rootroot00000000000000# naive approximation: pi = 4 * (1 - /1/3 + 1/5 ...) LIMIT = 50000 def time() ; nqp::time_n() ; end def sprintf(fmt, *args) ; nqp::sprintf(fmt, args) ; end pi_over_4 = 0.0 print 'hang on a few moments...' start_time = time() # sum terms in reverse order to reduce accumulated error n = LIMIT; while n > 0 do m = 4.0*n - 1.0 pi_over_4 += 1/(m - 2) - 1/m n -= 1 end puts sprintf("(completed %d iterations in %.2f sec)", LIMIT, time() - start_time) pi = pi_over_4 * 4 puts pi nqp-2013.12.1/examples/rubyish/examples-rubyish/template.rbi000077500000000000000000000021041225523575400237460ustar00rootroot00000000000000# eRubyish templating - see http://en.wikipedia.org/wiki/ERuby # There are only three directives: # - Header; remainder of the source file is the template body # <% ... %> - rubyish statements # #{ ... } - inserted content # Any arbritrary code can appear before the template. Output to stdout # is appended to the template, both before and within the template body puts %q{}

Green Bottles...

<%n = 10 %> <%while n > 0 %>
#{n} green bottles standing on the wall, #{n} green bottles standing on the wall
<%# -- gratuitous use of puts ------------------------------ %> <%puts %q{and if one green bottle should accidently fall...} %>
<%n -= 1 %> there'd be #{if n then n else 'no' end} green bottles standing on the wall
<%end%> nqp-2013.12.1/examples/rubyish/rubyish.nqp000077500000000000000000000704561225523575400203600ustar00rootroot00000000000000use NQPHLL; # Ruby subset extended from the `rubyish` example, as introduced in the # Edument Rakudo and NQP internals course. my %CLASSES; class RubyishClassHOW { has $!name; has $!isa; has %!methods; method new_type(:$name!, :$isa?) { nqp::die("duplicate class definition: $name") if %CLASSES{ $name }; my $obj := self.new(:$name, :$isa); %CLASSES{ $name } := [$obj]; nqp::newtype($obj, 'HashAttrStore'); } method add_method($obj, $name, $code) { nqp::die("This class already has a method named " ~ $name) if nqp::existskey(%!methods, $name); %!methods{$name} := $code; } method find_method($obj, $name) { my $method; if nqp::substr($name, 0, 1) eq '^' { # '^' prefix indicates a superclass lookup $name := nqp::substr($name, 1); } else { $method := %!methods{$name}; } if !$method && $!isa { my $super := %CLASSES{ $!isa }; nqp::die("unresolved super-class: " ~ $!isa) unless $super; $method := $super[0].find_method( $obj, $name); } $method // nqp::null(); } } grammar Rubyish::Grammar is HLL::Grammar { token TOP { :my $*CUR_BLOCK := QAST::Block.new(QAST::Stmts.new()); :my $*TOP_BLOCK := $*CUR_BLOCK; :my $*CLASS_BLOCK := $*CUR_BLOCK; :my $*IN_TEMPLATE := 0; :my $*IN_PARENS := 0; :my %*SYM; :my %*CLASS_SYMS; ^ ~ $ || <.panic('Syntax error')> } rule separator { ';' | \n } token continuation { \\ \n } rule stmtlist { [ ? ] *%% [<.separator>|] } token stmtish { [:s ]? } token modifier {if|unless|while|until} proto token stmt {*} token stmt:sym {:s :my %sym-save := nqp::clone(%*SYM); :my $*DEF; 'def' ~ 'end' { %sym-save{$*DEF} := %*SYM{$*DEF}; %*SYM := %sym-save; } } rule defbody { :my $*CUR_BLOCK := QAST::Block.new(QAST::Stmts.new()); { $*DEF := ~$; %*SYM{$*DEF} := $*IN_CLASS ?? 'method' !! 'func'; } ['(' ~ ')' ?]? ? } rule comma { [','|'=>'] } rule signature { :my $*IN_PARENS := 1; [[ ]+ % ',' [ ',' '*' ]? [ ',' '&' ]? | '*' ] [ ',' '&' ]? | '&' } token param { [:s '=' ]? { %*SYM{~$} := 'var' } } token stmt:sym { :my $*IN_CLASS := 1; :my @*METHODS; :my %sym-save := nqp::clone(%*SYM); [ \h+] ~ [\h* 'end'] { %*SYM := %sym-save } } rule classbody { :my $*CUR_BLOCK := QAST::Block.new(QAST::Stmts.new()); :my $*CLASS_BLOCK := $*CUR_BLOCK; { $*CLASS_BLOCK.name(~$) } [ '<' { inherit-syms(~$) } ]? { %*CLASS_SYMS{~$} := %*SYM; } } token stmt:sym { } token term:sym {:s '=' } token code-block {:s :my $*CUR_BLOCK := QAST::Block.new(QAST::Stmts.new()); } our %builtins; BEGIN { %builtins := nqp::hash( 'abort', 'die', 'exit', 'exit', 'print', 'print', 'puts', 'say', 'sleep', 'sleep', ); } token term:sym { ['(' ~ ')' ? ? |:s ? )}> ] } token term:sym { 'super' ['(' ~ ')' ? ? |:s ? ] [ || <.panic("'super' call outside of method")> ] } token term:sym { 'nqp::' ['(' ~ ')' ? | ? ] } token term:sym { \%w } token call-args {:s [ ||]+ % ',' [ ',' ]? | } token func-ref { '&' } token hash-args {:s [ '=>' ]+ % ',' } token paren-args {:my $*IN_PARENS := 1; } token operation {[\!|\?]?} token term:sym { ['new' \h+ | '.' 'new'] ['(' ~ ')' ?]? } token var { :my $*MAYBE_DECL := 0; \+? [$=[ \$ | \@\@? ] | '::'> | ] [ ] { $*MAYBE_DECL := 1 }> || ] } token term:sym { } token term:sym { \+? } proto token value {*} token value:sym {} token strings {:s ? } token string { | | \%[ q | Q ] } token value:sym {'<<'} proto token heredoc {*} token heredoc:sym {[$=<.ident> | \' $=<- [\' \n]>+? \' ]\n $=.*? \n$$$ } token heredoc-line {\n? [ \N]+ | \n } token heredoc:sym {\" $=<- [\" \n]>+? \"\n [ | ]*? \n$$$ } token paren-list { :my $*IN_PARENS := 1; *%% } token value:sym { \d+ } token value:sym { \d* '.' \d+ } token value:sym {'[' ~ ']' } token value:sym {'{' ~ '}' } token value:sym { } token value:sym { } token value:sym { } # Interpolation token interp { '#{' ~ '}' [:s [ ] || ] } token quote_escape:sym<#{ }> { } # Reserved words. token keyword { [ BEGIN | class | ensure | nil | new | when | END | def | false | not | super | while | alias | defined | for | or | then | yield | and | do | if | redo | true | begin | else | in | rescue | undef | break | elsif | module | retry | unless | case | end | next | return | until | eq | ne | lt | gt | le | ge | cmp ] } INIT { # Operator precedence levels # see http://www.tutorialspoint.com/ruby/ruby_operators.htm # y: ** Rubyish::Grammar.O(':prec, :assoc', '%exponentiation'); # x: ! ~ + - (unary) Rubyish::Grammar.O(':prec, :assoc', '%unary'); # w: * / % Rubyish::Grammar.O(':prec, :assoc', '%multiplicative'); # u: + - Rubyish::Grammar.O(':prec, :assoc', '%additive'); # t: >> << Rubyish::Grammar.O(':prec, :assoc', '%bitshift'); # s: & Rubyish::Grammar.O(':prec, :assoc', '%bitand'); # r: ^ | Rubyish::Grammar.O(':prec, :assoc', '%bitor'); # q: <= < > >= le lt gt ge Rubyish::Grammar.O(':prec, :assoc', '%comparison'); # n: <=> == === != =~ !~ eq ne cmp Rubyish::Grammar.O(':prec, :assoc', '%equality'); # l: && Rubyish::Grammar.O(':prec, :assoc', '%logical_and'); # k: || Rubyish::Grammar.O(':prec, :assoc', '%logical_or'); # q: ?: Rubyish::Grammar.O(':prec, :assoc', '%conditional'); # f: = %= { /= -= += |= &= >>= <<= *= &&= ||= **= Rubyish::Grammar.O(':prec, :assoc', '%assignment'); # e: not (unary) Rubyish::Grammar.O(':prec, :assoc', '%loose_not'); # c: or and Rubyish::Grammar.O(':prec, :assoc', '%loose_logical'); } # Operators - mostly stolen from NQP token infix:sym<**> { ')> } token prefix:sym<-> { ]> ')> } token prefix:sym { ')> } token infix:sym<*> { ')> } token infix:sym { ')> } token infix:sym<%> { ]> ')> } token infix:sym<+> { ')> } token infix:sym<-> { ')> } token infix:sym<~> { ')> } token infix:sym«<<» { ')> } token infix:sym«>>» { ')> } token infix:sym<&> { ')> } token infix:sym<|> { ')> } token infix:sym<^> { ')> } token infix:sym«<=» { ]> ')> } token infix:sym«>=» { ')> } token infix:sym«<» { ')> } token infix:sym«>» { ')> } token infix:sym«le» { ')> } token infix:sym«ge» { ')> } token infix:sym«lt» { ')> } token infix:sym«gt» { ')> } token infix:sym«==» { ')> } token infix:sym«!=» { ')> } token infix:sym«<=>» { ')> } token infix:sym«eq» { ')> } token infix:sym«ne» { ')> } token infix:sym«cmp» { ')> } token infix:sym<&&> { ')> } token infix:sym<||> { ')> } token infix:sym {:s '?' ':' , :op')> } token infix:sym<=> { ]> ')> } token prefix:sym { ')> } token infix:sym { ')> } token infix:sym { ')> } # Parenthesis token circumfix:sym<( )> { :my $*IN_PARENS := 1; '(' ')' } # Method call token postfix:sym<.> { '.' [ '(' ~ ')' ? ]? } # Array and hash indices token postcircumfix:sym<[ ]> { '[' ~ ']' [ ] } token postcircumfix:sym<{ }> { '{' ~ '}' [ ] } token postcircumfix:sym { } # Statement control rule xblock {:s [ 'then'? | 'then' | >] } token stmt:sym {:s $=[if|unless] ~ 'end' [ [|]? ] } token elsif {:s 'elsif' ~ [|]? } token else {:s 'else' } token stmt:sym {:s $=[while|until] } token stmt:sym {:s 'in' { %*SYM{~$} := 'var' } } token do-block { ~ 'end' } token do {:s 'do'? | 'do' | > } token term:sym { 'begin' ~ 'end' } token closure {:s ['{' ['|' ~ '|' ?]? ] ~ '}' |:s ['do' ['|' ~ '|' ?]? ] ~ 'end' } token closure2 {:s ['(' ~ ')' ? ]? '{' ~ '}' } token term:sym {:s :my $*CUR_BLOCK := QAST::Block.new(QAST::Stmts.new()); ['lambda' | '->' ] } # Comments and whitespace proto token comment {*} token comment:sym { '#' [ \N* || [>\N]*] } token comment:sym {[^^'=begin'\n] [ .*? [^^'=end'[\n|$]] || <.panic('missing ^^=end at eof')>] } token ws { [\h | <.continuation> | <.comment> | \n]* } token hs { [\h | <.continuation> ]* } # Templates token template-chunk { [|] ~ [|$] * } proto token template-nibble {*} token template-nibble:sym { } token template-nibble:sym { [<.tmpl-unesc>|<.tmpl-hdr>] <.panic("Stray tag, e.g. '%>' or ''")> } token template-nibble:sym { [|'#{'|$]> .]+ } token tmpl-hdr {'' \h* \n? {$*IN_TEMPLATE := 1} } token tmpl-esc {\h* '<%' [ || <.panic('Template directive precedes ""')>] } token tmpl-unesc { '%>' \h* \n? [ || <.panic('Template directive precedes ""')>] } # Functions sub callable($op) { my $type := %*SYM{$op} || (%builtins{$op} && 'func'); $type && ($type eq 'func' || $type eq 'method'); } sub inherit-syms($class) { if my %syms := %*CLASS_SYMS{$class} { %*SYM{$_} := %syms{$_} for %syms; } } } class Rubyish::Actions is HLL::Actions { method TOP($/) { $*CUR_BLOCK.push($.ast); make QAST::CompUnit.new( $*CUR_BLOCK ); } method stmtlist($/) { my $stmts := QAST::Stmts.new( :node($/) ); if $ { $stmts.push($_.ast) for $; } make $stmts; } method stmtish($/) { make $ ?? QAST::Op.new( $.ast, $.ast, :op(~$), :node($/) ) !! $.ast; } method term:sym($/) { make $.ast; } method code-block($/) { make $.ast } method term:sym($/) { my $name := ~$; my $op := %Rubyish::Grammar::builtins{$name}; my $call; if $op { $call := QAST::Op.new( :op($op) ) } elsif %*SYM{$name} eq 'method' && $*DEF { $call := QAST::Op.new( :op('callmethod'), QAST::Var.new( :name('self'), :scope('lexical')), QAST::SVal.new( :value($name) ), ); } else { $call := QAST::Op.new( :op('call'), :name($name) ); } if $ { $call.push($_) for $.ast; } $call.push( $.ast ) if $; make $call; } method term:sym($/) { my $name := ~$*DEF; my $call := QAST::Op.new( :op('callmethod'), QAST::Var.new( :name('self'), :scope('lexical')), QAST::SVal.new( :value('^' ~ $name) ), ); if $ { $call.push($_) for $.ast; } $call.push( $.ast ) if $; make $call; } method term:sym($/) { my $op := ~$; my $call := QAST::Op.new( :op($op) ); if $ { $call.push($_) for $.ast; } make $call; } method call-args($/) { my @args; @args.push($_.ast) for $; make @args; } method func-ref($/) { make $.ast } method hash-args($/) { my $args := QAST::Op.new( :op ); $args.push( $_.ast ) for $; make $args; } method paren-args($/) { make $.ast; } my $tmpsym := 0; method term:sym($/) { # seems a bit hacky my $tmp-sym := '$new' ~ (++$tmpsym) ~ '$'; my $init-call := QAST::Op.new( :op, :name, QAST::Var.new( :name($tmp-sym), :scope ) ); if $ { $init-call.push($_) for $.ast; } make QAST::Stmt.new( # create the new object QAST::Op.new( :op('bind'), QAST::Var.new( :name($tmp-sym), :scope, :decl), QAST::Op.new( :op('create'), QAST::Var.new( :name('::' ~ ~$), :scope('lexical') ) ), ), # call initialize method, if available ($ ?? $init-call !! QAST::Op.new( :op, QAST::Op.new( :op, QAST::Var.new( :name($tmp-sym), :scope ), QAST::SVal.new( :value )), $init-call, ) ), # return the new object QAST::Var.new( :name($tmp-sym), :scope ), ); } method var($/) { my $sigil := ~$ // ''; my $name := $sigil ~ $; if $sigil eq '@' && $*IN_CLASS && $*DEF { # instance variable, bound to self my $package-name := $*CLASS_BLOCK.name; make QAST::Var.new( :name($name), :scope('attribute'), QAST::Var.new( :name('self'), :scope('lexical')), QAST::SVal.new( :value($package-name) ) ); } else { my $ns; if $ { $ns := ~$; } elsif !$sigil && $*IN_CLASS { # could be a package constant my $c := nqp::substr($name, 0, 1); $ns := $*CLASS_BLOCK.name if $c ge 'A' && $c le 'Z'; } $name := $ns ~ '::' ~ $name if $ns; if $*MAYBE_DECL { my $block; my $decl := 'var'; if $sigil eq '$' || $ns { $block := $*TOP_BLOCK; } elsif !$sigil { $block := $*CUR_BLOCK; } elsif $sigil eq '@' { $block := $*CLASS_BLOCK; } elsif $sigil eq '@@' { $block := $*CLASS_BLOCK; $decl := 'static'; } else { nqp::die("unhandled sigil: $sigil"); } my %sym := $block.symbol($name); if !%sym { %*SYM{$name} := 'var'; $block.symbol($name, :declared(1), :scope('lexical') ); my $var := QAST::Var.new( :name($name), :scope('lexical'), :decl($decl) ); $block[0].push($var); } } make QAST::Var.new( :name($name), :scope('lexical') ); } } method term:sym($/) { make $.ast } method stmt:sym($/) { my $install := $.ast; $*CUR_BLOCK[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name($install.name), :scope('lexical'), :decl('var') ), $install )); if $*IN_CLASS { @*METHODS.push($install); } make QAST::Op.new( :op('null') ); } method defbody($/) { $*CUR_BLOCK.name(~$); $*CUR_BLOCK.push($.ast); if $*IN_CLASS { # it's a method, self will be automatically passed $*CUR_BLOCK[0].unshift(QAST::Var.new( :name('self'), :scope('lexical'), :decl('param') )); $*CUR_BLOCK.symbol('self', :declared(1)); } make $*CUR_BLOCK; } method param($/) { my $var := QAST::Var.new( :name(~$), :scope('lexical'), :decl('param') ); $*CUR_BLOCK.symbol('self', :declared(1)); $var.default( $.ast ) if $; make $var; } method signature($/) { my @params; if $ { @params.push($_.ast) for $; } if $ { @params.push($.ast); @params[-1].slurpy(1); } if $ { @params.push($[0].ast); @params[-1].default(QAST::Op.new( :op )); } for @params { $*CUR_BLOCK[0].push($_); $*CUR_BLOCK.symbol($_.name, :declared(1)); } } method stmt:sym($/) { my $body_block := $.ast; # Generate code to create the class. my $class_stmts := QAST::Stmts.new( $body_block ); my $ins_name := '::' ~ $; my $new_type := QAST::Op.new( :op('callmethod'), :name('new_type'), QAST::WVal.new( :value(RubyishClassHOW) ), QAST::SVal.new( :value(~$), :named('name') ), ); $new_type.push( QAST::SVal.new( :value(~$), :named('isa') ) ) if $; $class_stmts.push(QAST::Op.new( :op('bind'), QAST::Var.new( :name($ins_name), :scope('lexical'), :decl('var') ), $new_type, )); # Add methods. my $class_var := QAST::Var.new( :name($ins_name), :scope('lexical') ); for @*METHODS { my $name := $_.name; $class_stmts.push(QAST::Op.new( :op('callmethod'), :name('add_method'), QAST::Op.new( :op('how'), $class_var ), $class_var, QAST::SVal.new( :value($name) ), QAST::BVal.new( :value($_) )) ); } make $class_stmts; } method classbody($/) { $*CUR_BLOCK.push($.ast); $*CUR_BLOCK.blocktype('immediate'); make $*CUR_BLOCK; } method stmt:sym($/) { make $.ast; } method term:sym($/) { my $op := $; make QAST::Op.new( :op('bind'), $.ast, QAST::Op.new( :op($op), $.ast, $.ast )); } method value:sym($/) { make $.ast; } method strings($/) { make $ ?? QAST::Op.new( :op('concat'), $.ast, $.ast) !! $.ast; } method string($/) { make $.ast; } method value:sym($/) { make $.ast } method heredoc:sym($/) { make QAST::SVal.new( :value( ~$ ) ); } method heredoc-line($/) { make QAST::SVal.new( :value(~$/) ) } method heredoc:sym($/) { my $list := QAST::Op.new( :op ); $list.push($_.ast) for $; make QAST::Op.new( :op, QAST::SVal.new( :value('') ), $list ); } method value:sym($/) { make QAST::IVal.new( :value(+$/.Str) ) } method value:sym($/) { make QAST::NVal.new( :value(+$/.Str) ) } method paren-list($/) { my @list; if $ { @list.push($_.ast) for $ } make @list; } method value:sym($/) { my $array := QAST::Op.new( :op ); $array.push($_) for $.ast; make $array; } method term:sym($/) { make $.ast; } method value:sym($/) { my $hash := QAST::Op.new( :op ); $hash.push($_) for $.ast; make $hash; } method value:sym($/) { make QAST::Op.new( :op ); } method value:sym($/) { make QAST::IVal.new( :value<1> ); } method value:sym($/) { make QAST::IVal.new( :value<0> ); } method interp($/) { make $.ast } method quote_escape:sym<#{ }>($/) { make $.ast } method circumfix:sym<( )>($/) { make $.ast } # todo: proper type objects our %call-tab; BEGIN { %call-tab := nqp::hash( 'call', 'call', 'nil?', 'isnull' ) } method postfix:sym<.>($/) { my $op := %call-tab{ ~$ }; my $meth_call := $op ?? QAST::Op.new( :op($op) ) !! QAST::Op.new( :op('callmethod'), :name(~$) ); if $ { $meth_call.push($_) for $.ast; } make $meth_call; } method postcircumfix:sym<[ ]>($/) { make QAST::Var.new( :scope('positional'), $.ast ); } method postcircumfix:sym<{ }>($/) { make QAST::Var.new( :scope('associative'), $.ast ); } method postcircumfix:sym($/) { make QAST::Var.new( :scope('associative'), $.ast ); } method xblock($/) { make QAST::Op.new( $.ast, $.ast, :node($/) ); } method stmt:sym($/) { my $ast := $.ast; $ast.op( ~$ ); $ast.push( $.ast ) if $; make $ast; } method elsif($/) { my $ast := $.ast; $ast.op( 'if' ); $ast.push( $.ast ) if $; make $ast; } method else($/) { make $.ast } method stmt:sym($/) { make QAST::Op.new( $.ast, $.ast, :op(~$), :node($/) ); } method stmt:sym($/) { my $block := QAST::Block.new( QAST::Var.new( :name(~$), :scope('lexical'), :decl('param')), $.ast, ); make QAST::Op.new( $.ast, $block, :op('for'), :node($/) ); } method do-block($/) { make $.ast } method term:sym($/) { make $.ast; } method closure($/) { $*CUR_BLOCK.push($.ast); make QAST::Op.new(:op, $*CUR_BLOCK ); } method closure2($/) { self.closure($/) } method term:sym($/) { make $.ast } method template-chunk($/) { my $text := QAST::Stmts.new( :node($/) ); $text.push( QAST::Op.new( :op, $_.ast ) ) for $; make $text; } method template-nibble:sym($/) { make $.ast } method template-nibble:sym($/) { make QAST::SVal.new( :value(~$/) ); } } class Rubyish::Compiler is HLL::Compiler { } sub MAIN(*@ARGS) { my $comp := Rubyish::Compiler.new(); $comp.language('rubyish'); $comp.parsegrammar(Rubyish::Grammar); $comp.parseactions(Rubyish::Actions); $comp.command_line(@ARGS, :encoding('utf8')); } nqp-2013.12.1/examples/rubyish/t/000077500000000000000000000000001225523575400163775ustar00rootroot00000000000000nqp-2013.12.1/examples/rubyish/t/00hello-worldish.t000077500000000000000000000007561225523575400216730ustar00rootroot00000000000000puts "1..5" def capitalize(s) nqp::uc(nqp::substr(s, 0, 1)) ~ nqp::lc(nqp::substr(s, 1)); end class HelloWorld puts "ok 1 - class immediate code" def initialize(name) puts "ok 2 - initialize called" @name = capitalize name end def sayHi puts "ok 5 - Hello #{@name}!" end end hello = HelloWorld.new("worldish") puts "#{nqp::can(hello, 'sayHi')? 'ok' : 'nok'} 3 - can say Hi" puts "#{nqp::can(hello, 'sayBye')? 'nok' : 'ok'} 4 - can't say Bye" hello.sayHi nqp-2013.12.1/examples/rubyish/t/arrays.t000077500000000000000000000011331225523575400200660ustar00rootroot00000000000000puts "1..13" a=[10,18+2 , 30] a[3] = 40 puts "#{a[0] == 10? 'ok' : 'nok'} 1 - a[0]" puts "#{a[1] == 20? 'ok' : 'nok'} 2 - a[1]" puts "#{a['2'] == 30? 'ok' : 'nok'} 3 - a['2']" puts "#{a[1+2] == 40? 'ok' : 'nok'} 4 - a[1+2]" n=0 for val in a do idx = val / 10 + 4 n += 1 puts "ok #{idx} - array iteration #{n}" end puts "#{%w{nok ok nok}[1]} 9 - quote words" puts "#{['nok',['nok','nok','ok']][1][2]} 10 - 2d array" def test_array_args(x, *arg_arr) puts "ok #{x} - fixed arg" for t in arg_arr do puts "ok #{t} - array slurpy arg" end end test_array_args(11, 12, 13) nqp-2013.12.1/examples/rubyish/t/bitwise.t000077500000000000000000000010131225523575400202300ustar00rootroot00000000000000puts "1..8" puts "#{(not true)? 'nok' : 'ok'} 1 - loose unary 'not'" puts "#{(!true)? 'nok' : 'ok'} 2 - tight unary not '!'" puts "#{37&41 == 33? 'ok' : 'nok'} 3 - infix bit-and '&'" puts "#{138 << 2 == 552? 'ok' : 'nok'} 4 - infix bitshift left '<<'" puts "#{138 >> 2 == 34? 'ok' : 'nok'} 5 - infix bitshift right '>>'" puts "#{138 ^ 107 == 225? 'ok' : 'nok'} 6 - infix xor '^'" puts "#{138 | 107 == 235? 'ok' : 'nok'} 7 - infix or '|'" puts "#{(!2==false and not 2==1+3 and 3==2+1)? 'ok': 'nok'} 8 - precedence" nqp-2013.12.1/examples/rubyish/t/contextual.t000077500000000000000000000012361225523575400207570ustar00rootroot00000000000000puts"1..9" # These tests explore context sensitive parsing of variables vs methods def xx(n=-7) ; 2 - n; end def three ; 3; end def zz(m) three = 3 xx = 1 puts "ok #{xx + m +3} - nested symbols" puts "ok #{three +m +2} - nested symbols" 8 end # in particular, `xx +1` is parsed as a method call, `yy -1` as an expression puts "ok #{xx +1} - method parse" yy = 3 puts "ok #{yy -1} - arithmetic parse" puts "ok #{three} - parameterless method" puts "ok #{three + 1} - parameterless method arithmetic" puts "ok #{three() +2} - parameterless method + paren arithmetic" puts "ok #{zz 2} - method with args" puts "ok #{xx} - parameter defaulting" nqp-2013.12.1/examples/rubyish/t/functional.t000077500000000000000000000051721225523575400207360ustar00rootroot00000000000000# implement and test functional primitives: map, grep and sort. puts '1..9' test_counter = 0 def is(result, expected, description) test_num = (test_counter += 1) passed = result eq expected puts "#{passed ? 'ok' : 'nok'} #{test_num} - #{description}" puts "# expected:'#{expected}' got:'#{result}'" \ unless passed passed end def dump(arr) ; nqp::join(',', arr); end # ------------ def grep(array_inp, &selector) array_out = [] n = -1 selector = lambda {|elem| !elem.nil? && elem} \ if selector.nil? for elem in array_inp ; array_out[ n+=1 ] = elem \ if selector.call(elem) end array_out end arr = [0, 2, 10, 1, 13, 27, 5, 4, 18] is dump(arr), '0,2,10,1,13,27,5,4,18', 'array dump sanity' even = grep(arr) {|n| n % 2 == 0} is dump(even), '0,2,10,4,18', 'grep [even]' arr1 = nqp::clone(arr) nqp::push(arr1, nil) is dump( grep(arr1) ), '2,10,1,13,27,5,4,18', 'grep [default]' # ------------ def map(array_inp, &mapper) array_out = [] n = -1 for elem in array_inp do mapping = mapper.call(elem) if nqp::islist(mapping) then # flatten sublists for sub_elem in mapping ; array_out[ n+=1 ] = sub_elem end else array_out[ n+=1 ] = mapping end end array_out end squares = map(arr) {|n| n * n} is dump(squares), '0,4,100,1,169,729,25,16,324', 'map [squares]' # ------------ def sort(list, &func) ; list = nqp::clone list # take a copy func = lambda {|a,b| a cmp b} \ if func.nil? _quicksort(list, 0, nqp::elems(list)-1, &func); end def _quicksort(list, p, r, &func) if p < r then q = _partition(list, p, r, &func) _quicksort(list, p, q-1, &func) _quicksort(list, q+1, r, &func) end list end def _partition(list, p, r, &func) pivot = list[r] i = j = p - 1 while (j += 1) < r _swap(list, i += 1, j) \ if 0 <= func.call(pivot, list[j]) end _swap(list, i += 1, r) i end def _swap(list, i, j) tmp = list[i] list[i] = list[j] list[j] = tmp end str_sort = sort(arr) is dump(str_sort), '0,1,10,13,18,2,27,4,5', 'sort [default]' num_sort = sort(arr) {|a,b| a <=> b} is dump(num_sort), '0,1,2,4,5,10,13,18,27', 'sort [numeric]' # ------------ # put it all together odd = lambda {|n| n % 2 == 1} combined = map(sort grep(arr,&odd)) {|str| nqp::flip(str)} is dump(combined), '1,31,72,5', 'combined map sort grep' splitter = lambda {|n| nqp::split('',n)} is dump( map(combined, &splitter) ), '1,3,1,7,2,5', 'map [flattening]' is dump(arr), '0,2,10,1,13,27,5,4,18', 'array readonly' nqp-2013.12.1/examples/rubyish/t/hashs.t000077500000000000000000000011631225523575400176760ustar00rootroot00000000000000puts "1..11" h = {'a' =>10,'b' => 18+2 , 'c' => 30} h{'d'} = 100 puts "#{h{'a'} == 10? 'ok' : 'nok'} 1 - h{'a'}" puts "#{h == 20? 'ok' : 'nok'} 2 - h" h_idx = 'c' puts "#{h{h_idx} == 30? 'ok' : 'nok'} 3 - h{c_idx}" puts "#{h{'d'} == 100? 'ok' : 'nok'} 4 - h{'d'}" nqp::deletekey(h, 'd') for key in h do puts "ok #{ h{key} / 10 + 4 } - hash key iteration (#{key})" end h = ['nok','ok'] puts "#{ h[1] } 8 - HoA" def test_hash_args(x, h_args) puts "ok #{ x } - fixed arg" for k in h_args do puts "ok #{ h_args{k} } - hash slurpy arg (#{k})" end end test_hash_args 9, 'z' => 10, 'y' => 11 nqp-2013.12.1/examples/rubyish/t/if-then-else.t000077500000000000000000000023131225523575400210460ustar00rootroot00000000000000puts "1..17" if 1+1==3 then puts "nok 1" puts "nok 2" else puts "ok 1" puts "ok 2" end if 2+2==4 then puts "ok 3" puts "ok 4" else puts "nok 3" puts "nok 4" end if "a" eq "a" && 3+3 == 6; puts "ok 5"; else puts "nok 6"; end if "a"~"a" eq "a""a" && 3+3 == 5; puts "nok 6"; else puts "ok 6"; end if "a" eq "b" || 1+1==3; puts "nok 7"; puts "nok 8" else puts "ok 7"; puts "ok 8"; end if "a" eq "b" || 1+1==2; puts "ok 9" else puts puts "nok 9"; end if "a" eq "b" || 1+1==3; puts "nok 10" else puts "ok 10"; end if 2 >= 1 && 1 <= 2 && "b" gt "a" && "a" lt "b" && (2 != 1) ; puts "ok 11" else puts "nok 11"; end def one_liner(i) if i == 42 then 'nok' elsif i == 12 then 'ok' else 'nok' end end puts "#{one_liner(12)} 12 - single line statement" def iffy(n) if n == 10 13 elsif n == 20 14 elsif n == 30 m = 15 m else 16 end end puts "ok #{iffy 10} - [if] elsif elsif else" puts "ok #{iffy 20} - if [elsif] elsif else" puts "ok #{iffy 30} - if elsif [elsif] else" puts "ok #{iffy 42} - if elsif elsif [else]" x=10 unless x > 2 puts "nok 17 - unless" elsif x == 20 puts "nok 17 - unless (elsif)" else puts "ok 17 - unless" end nqp-2013.12.1/examples/rubyish/t/infix.t000077500000000000000000000022571225523575400177120ustar00rootroot00000000000000puts "1..25" x=1 puts "ok #{x} - assignment" puts "ok #{4/2} - division" puts "ok #{5-2} - subtraction" puts "ok #{2*2} - multiplication" puts "ok #{2+3} - addition" x *= 6 puts "ok #{x} - '*=' assignment" x += 1+1 y = x y -= 1 puts "ok #{y} - '-=' assignment" puts "ok #{x} - '+=' assignment" z = 27 z /= 3 puts "ok #{z} - '/=' assignment" puts "#{1+1==2? 'ok' : 'nok'} 10 - ternary (true)" puts "#{1+1==3? 'nok' : 'ok'} 11 - ternary (false)" puts "#{(false && 2)? 'nok' : 'ok'} 12 - infix &&" xx = nil yy = 42 puts "#{(false || 2) == 2? 'ok' : 'nok'} 13 - infix ||" puts "#{(xx.nil? == true)? 'ok' : 'nok'} 14 - .nil? when true" puts "#{(yy.nil? == false)? 'ok' : 'nok'} 15 - .nil? when false" puts "ok #{2 ** 4} - exponentiation **" puts "ok #{37 % 20} - modulus %" puts "#{1&&false or 1? 'ok' : 'nok'} 18 - loose 'or'" puts "#{1||false and false||1? 'ok' : 'nok'} 19 - loose 'and'" n = 22 for tst in [[20, -1, 'less than'], [22, 0, 'equal'], [24, 1, 'greater than'] ] do puts "#{ (tst[0] <=> n) == tst[1]? 'ok' :'nok'} #{tst[0]} - <=> #{tst[2]}" puts "#{ ('x'~tst[0] cmp 'x'~n) == tst[1]? 'ok' :'nok'} #{tst[0]+1} - cmp #{tst[2]}" end nqp-2013.12.1/examples/rubyish/t/inheritance.t000077500000000000000000000017521225523575400210650ustar00rootroot00000000000000puts "1..10" class Point @@tst = -1 def initialize(x, y) puts "ok #{ @@tst = @@tst + 2 } - Point.initialize called" @x = x @y = y end def x; @x ; end def y; @y ; end def radius; (x * @x + y * @y) ** 0.5; end end class Point3D < Point def initialize(x, y, z) puts "ok 2 - Point3D.initialize called" super(x, y) @z = z end def z; @z ; end def radius; (x * @x + y * @y + z * @z) ** 0.5; end end obj_2d = Point.new(10, 20) obj_3d = Point3D.new(15, 25, 35) puts "#{obj_2d.x == 10 ? 'ok' : 'nok'} 4 - 2d obj x" puts "#{obj_2d.y == 20 ? 'ok' : 'nok'} 5 - 2d obj y" t2 = obj_2d.radius puts "#{t2 > 22 && t2 < 23 ? 'ok' : 'nok'} 6 - radius 2d (approx)" puts "#{obj_3d.x == 15 ? 'ok' : 'nok'} 7 - 3d obj x" puts "#{obj_3d.y == 25 ? 'ok' : 'nok'} 8 - 3d obj y" puts "#{obj_3d.z == 35 ? 'ok' : 'nok'} 9 - 3d obj z" t3 = obj_3d.radius puts "#{t3 > 45 && t3 < 46 ? 'ok' : 'nok'} 10 - radius 3d (approx)" nqp-2013.12.1/examples/rubyish/t/interpolation.t000077500000000000000000000010701225523575400214540ustar00rootroot00000000000000puts "1..10" a = 2 puts "ok #{1} - num" puts "ok #{a} - variable" puts "ok #{a+1} - expression" b = 'ok' puts "#{b} #{3*(a - 1) + 1} - expression" tst=5 puts %q " #{tst}" ' - adjacent' ' strings' puts %Q{ok #{a*=3} - expression - side affect} puts %Q{ok #{(a+=2)-1} - expression - side affect} puts "#{if a==8 then 'ok' else 'nok' end} #{a} - nested statement" puts "ok 9 # skip nested starters / stoppers" ##puts "#{'#{tst}' eq '#' '{' 'tst}'? 'ok' : 'nok'} 9 - nested starters / stoppers" puts "ok #{ x = 4; x+= 1 x+5 } - multiline interpolation" nqp-2013.12.1/examples/rubyish/t/lambda.t000077500000000000000000000006451225523575400200140ustar00rootroot00000000000000puts "1..7" def make_iterator(n) lambda { |incr,desc| n += incr; puts "ok #{n} - #{desc}"} end it1 = make_iterator(-1) it2 = make_iterator(3) it1.call(2,"iterator 1") it1.call(1,"iterator 1") it2.call(0,"iterator 2") it2.call(1,"iterator 2") it1.call(3,"iterator 1") # Ruby 1.9+ style lambda syntax m = 5 test = ->(desc) {puts "ok #{m+=1} - #{desc}"} test.call("new lamba syntax"); test.call("new lamba syntax"); nqp-2013.12.1/examples/rubyish/t/line-spanning.t000077500000000000000000000020541225523575400213320ustar00rootroot00000000000000puts "1..13" a=[10, 20] puts "#{a[1]? 'ok' : 'nok'} 1 - array spanning lines" =begin This is a multi-line comment and can span as many lines as you like. But =begin and =end should appear at the start of line only. #{exit 42} =end b = [30 # some comments , 40 ] puts "#{b[1]? 'ok' : 'nok'} 2 - array spanning lines" h = {"a" => 10, "b" , 20 , "c" => 30 } puts "#{h == 30? 'ok' : 'nok'} 3 - hash spanning lines" def tricky(k, n, desc) puts "#{k} #{n} - multi-line signatures #{desc}" end tricky('ok',4,"simple call") tricky( "ok", 5, "multi-line call" ) puts \ "ok 6 - \\ line continuation" heredoc = < 5 do puts "ok #{n} - until loop" n += 1 end puts "ok #{n} - postloop" nqp-2013.12.1/examples/rubyish/t/modifiers.t000077500000000000000000000006051225523575400205510ustar00rootroot00000000000000puts "1..10" n=0 puts "ok #{n+=1} - if modifier" if true puts "nok #{n+=1} - if modifier" if false puts "ok #{n+=1} - unless modifier" unless false puts "nok #{n+=1} - unless modifier" unless true puts "ok #{n+=1} - until modifier" until n >= 6 puts "ok #{n+=1} - while modifier" while n < 8 begin puts "ok #{n+=1} - while modifier - begin .. end block" while n < 10 end until n >= 10 nqp-2013.12.1/examples/rubyish/t/nqp-ops.t000077500000000000000000000012711225523575400201650ustar00rootroot00000000000000puts "1..12" nqp::say("ok 1 - nqp::say") nqp::print("ok 2 - nqp::print with new-line\n") puts nqp::concat("ok ", '3 - nqp::concat') puts nqp::substr("nok 4 - nqp::substr", 1) puts nqp::lc(nqp::flip("KO") ~ " 5 - nQp::fLIp and nqp::lC") nqp::print nqp::chr(nqp::ord('o')); puts 'k 6 - nqp::ord and nqp::chr' def ok(i,msg) nqp::say("ok #{i} - #{msg}"); end def nok(i,msg) nqp::say("nok #{i} - #{msg}"); end nqp::if(2+2 == 4, ok(7, "nqp::if (true)"), nok(7, "nqp::if (true)")) nqp::if(2+2 == 5, nok(8, "nqp::if (true)"), ok(8, "nqp::if (false)")) n = 9 nqp::while n <= 11, begin ok(n, "nqp::while (#{n})") n += 1 end puts nqp::sprintf("%s %d - %s", ['ok', 12, 'nqp::sprintf']) nqp-2013.12.1/examples/rubyish/t/recursion.t000077500000000000000000000011041225523575400205740ustar00rootroot00000000000000puts "1..2" def fact!(n) if n <= 1 then 1 else n * fact!(n - 1) end end result = fact!(6) expected = 6*5*4*3*2 puts "#{result == expected ? 'ok' : 'nok'} 1 - sub recursion" # ---------- class MethodRecursion def fibonacci(n) n <= 1 \ ? n \ : self.fibonacci( n - 1 ) + fibonacci(n - 2 ) ## 2 styles: ^^ explicit method call ^^ implied method call end end fib = MethodRecursion.new.fibonacci(9) expected2 = 34 puts "#{fib == expected2 ? 'ok' : 'nok'} 2 - method recursion" nqp-2013.12.1/examples/rubyish/t/rubyish-3-tests.t000066400000000000000000000002601225523575400215470ustar00rootroot00000000000000puts "1..4" a = "ok 1" puts a b = "nok 1" b = "ok 2" puts b def pass_a_test puts "ok 3" end pass_a_test() def pass_another(test) puts test end pass_another("ok 4") nqp-2013.12.1/examples/rubyish/t/rubyish-4-tests.t000066400000000000000000000004131225523575400215500ustar00rootroot00000000000000puts "1..5" a = "ok 1" puts a ifb = "nok 1" ifb = "ok 2" puts ifb def pass_a_test puts "ok 3" end pass_a_test() def pass_another(test) puts test end pass_another("ok 4") class Tester def test puts "ok 5" end end t = new Tester() t.test() nqp-2013.12.1/examples/rubyish/t/scoping.t000077500000000000000000000037211225523575400202340ustar00rootroot00000000000000puts "1..21" a = "ok 1" b = "ok 2" $a = "ok 3" $c = "nok 4" def some_sub b = "nok 2" $c = "ok 4" $d = "ok 5" end some_sub() class MyClass @@final_test = 17 def set_class(v); @@c = v; b = 'wtf'; end def get_class; @@c; end def set_inst(v1,v2); @i1 = v1; @i2= v2 end def get_inst1; @i1; end def get_inst2; @i2; end def class_const; @@final_test ; end def tickle_f(f); @f = f ; end Y = 18 def const_tests puts "ok #{MyClass::Y} - package constant qualified" puts "ok #{Y + 1} - package constant unqualified" end end class OtherClass def set_class(v); @@c = v; end def get_class; @@c; end def set_inst(v1,v2); @i1 = v1; @i2= v2 end def get_inst1; @i1; end def get_inst2; @i2; end def more_const_tests puts "ok #{MyClass::Y + 2} - package constant cross reference" puts "ok #{Y} - package constant internal reference" end end obj1 = MyClass.new; obj2 = MyClass.new; obj3 = OtherClass.new; obj1.set_class(8) obj3.set_class(10) puts "#{a} - local: main" puts "#{b} - local: main, function" puts "#{$a} - $global: main" puts "#{$c} - $global: main, function" puts "#{$d} - $global: function" @e=6 @f='ok' obj1.tickle_f('nok') puts "ok #{@e} - @instance: main" puts "#{@f} 7 - @instance: main, object" puts "ok #{obj1.get_class} - @@class access" puts "ok #{obj2.get_class() + 1} - @@class access" puts "ok #{obj3.get_class} - @@class variable" obj1.set_inst(11,12) obj2.set_inst(13,14) obj3.set_inst(15,16) puts "ok #{obj1.get_inst1} - @instance access" puts "ok #{obj1.get_inst2} - @instance access" puts "ok #{obj2.get_inst1} - @instance access" puts "ok #{obj2.get_inst2} - @instance access" puts "ok #{obj3.get_inst1} - @instance access" puts "ok #{obj3.get_inst2} - @instance access" puts "ok #{obj2.class_const} - @@class constant" obj1.const_tests OtherClass::Y = 21 obj3.more_const_tests nqp-2013.12.1/examples/rubyish/t/template.t000077500000000000000000000011751225523575400204060ustar00rootroot00000000000000# eRubyish style templates puts '1..10' puts "ok 1 - statements before template" ok 2 - initial template text <%n = 2 %> <%while (n+=1) < 5 %>ok #{n} - while loop test <%end%> ok 5 - text between statements <%if n == 5 %>ok 6 - if block (true) <%else %>nok 6 - else block (true) <%end%> <%if n == 1234 %>nok 7 - if block (false) <%elsif n == 20 %>nok 7 - elsif block (false) <%else %>ok 7 - else block (false) <% end %> <%for test in [8, 9] do %>ok #{test} - for loop test <%end%> <%n = 9 %> <%#puts "nok #{n += 1} - commented out directive" %> ok #{n += 1} - final template text nqp-2013.12.1/gen/000077500000000000000000000000001225523575400134025ustar00rootroot00000000000000nqp-2013.12.1/gen/jvm/000077500000000000000000000000001225523575400141765ustar00rootroot00000000000000nqp-2013.12.1/gen/jvm/.gitignore000066400000000000000000000000021225523575400161560ustar00rootroot00000000000000* nqp-2013.12.1/gen/moar/000077500000000000000000000000001225523575400143405ustar00rootroot00000000000000nqp-2013.12.1/gen/moar/.gitignore000066400000000000000000000000021225523575400163200ustar00rootroot00000000000000* nqp-2013.12.1/gen/parrot/000077500000000000000000000000001225523575400147115ustar00rootroot00000000000000nqp-2013.12.1/gen/parrot/.gitignore000066400000000000000000000000021225523575400166710ustar00rootroot00000000000000* nqp-2013.12.1/src/000077500000000000000000000000001225523575400134205ustar00rootroot00000000000000nqp-2013.12.1/src/HLL/000077500000000000000000000000001225523575400140375ustar00rootroot00000000000000nqp-2013.12.1/src/HLL/Actions.nqp000066400000000000000000000164301225523575400161630ustar00rootroot00000000000000class HLL::Actions { method string_to_int($src, $base) { my $res := nqp::radix($base, $src, 0, 2); $src.CURSOR.panic("'$src' is not a valid number") unless nqp::atpos($res, 2) == nqp::chars($src); nqp::atpos($res, 0); } method ints_to_string($ints) { if nqp::islist($ints) { my $result := ''; for $ints { $result := $result ~ nqp::chr($_.ast); } $result; } else { nqp::chr($ints.ast); } } method CTXSAVE() { QAST::Stmts.new( QAST::Op.new( :op('bind'), QAST::Var.new( :name('ctxsave'), :scope('local'), :decl('var') ), QAST::Var.new( :name('$*CTXSAVE'), :scope('contextual') ) ), QAST::Op.new( :op('unless'), QAST::Op.new( :op('isnull'), QAST::Var.new( :name('ctxsave'), :scope('local') ) ), QAST::Op.new( :op('if'), QAST::Op.new( :op('can'), QAST::Var.new( :name('ctxsave'), :scope('local') ), QAST::SVal.new( :value('ctxsave') ) ), QAST::Op.new( :op('callmethod'), :name('ctxsave'), QAST::Var.new( :name('ctxsave'), :scope('local') ))))) } method SET_BLOCK_OUTER_CTX($block) { my $outer_ctx := %*COMPILING<%?OPTIONS>; if nqp::defined($outer_ctx) { until nqp::isnull($outer_ctx) { my $pad := nqp::ctxlexpad($outer_ctx); unless nqp::isnull($pad) { for $pad { my str $key := ~$_; unless $block.symbol($key) { my $lextype := nqp::lexprimspec($pad, $key); if $lextype == 0 { $block.symbol($key, :scope, :value(nqp::atkey($pad, $key))); } elsif $lextype == 1 { $block.symbol($key, :scope, :value(nqp::atkey_i($pad, $key)), :type(int)); } elsif $lextype == 2 { $block.symbol($key, :scope, :value(nqp::atkey_n($pad, $key)), :type(num)); } elsif $lextype == 3 { $block.symbol($key, :scope, :value(nqp::atkey_s($pad, $key)), :type(str)); } } } } $outer_ctx := nqp::ctxouter($outer_ctx); } } } method EXPR($/, $key?) { unless $key { return 0; } my $past := $/.ast // $.ast; unless $past { $past := QAST::Op.new( :node($/) ); if $ { $past.op( ~$ ); } if $key eq 'LIST' { $key := 'infix'; } my $name := nqp::lc($key) ~ ':<' ~ $ ~ '>'; $past.name('&' ~ $name); unless $past.op { $past.op('call'); } } if $key eq 'POSTFIX' { $past.unshift($/[0].ast); } else { for $/.list { if nqp::defined($_.ast) { $past.push($_.ast); } } } make $past; } method term:sym($/) { make $.ast } method termish($/) { make $.ast; } method nullterm($/) { make NQPMu; } method nullterm_alt($/) { make $.ast; } method integer($/) { make $.ast; } method dec_number($/) { make +$/; } method decint($/) { make self.string_to_int( $/, 10); } method hexint($/) { make self.string_to_int( $/, 16); } method octint($/) { make self.string_to_int( $/, 8 ); } method binint($/) { make self.string_to_int( $/, 2 ); } method quote_EXPR($/) { my $past := $.ast; if %*QUOTEMOD { if nqp::istype($past, QAST::SVal) { my @words := HLL::Grammar::split_words($/, $past.value); if +@words != 1 { $past := QAST::Op.new( :op('list'), :node($/) ); for @words { $past.push(QAST::SVal.new( :value($_) )); } } else { $past := QAST::SVal.new( :value(~@words[0]) ); } } else { $/.CURSOR.panic("Can't form :w list from non-constant strings (yet)"); } } make $past; } method quote_delimited($/) { my @parts; my $lastlit := ''; for $ { my $ast := $_.ast; if !nqp::istype($ast, QAST::Node) { $lastlit := $lastlit ~ $ast; } elsif nqp::istype($ast, QAST::SVal) { $lastlit := $lastlit ~ $ast.value; } else { if $lastlit gt '' { @parts.push(QAST::SVal.new( :value($lastlit) )); } @parts.push(nqp::istype($ast, QAST::Node) ?? $ast !! QAST::SVal.new( :value($ast) )); $lastlit := ''; } } if $lastlit gt '' { @parts.push(QAST::SVal.new( :value($lastlit) )); } my $past := @parts ?? @parts.shift !! QAST::SVal.new( :value('') ); while @parts { $past := QAST::Op.new( $past, @parts.shift, :op('concat') ); } make $past; } method quote_atom($/) { make $ ?? $.ast !! ~$/; } method quote_escape:sym($/) { make "\\"; } method quote_escape:sym($/) { make ~$ } method quote_escape:sym($/) { make "\b"; } method quote_escape:sym($/) { make "\n"; } method quote_escape:sym($/) { make "\r"; } method quote_escape:sym($/) { make "\t"; } method quote_escape:sym($/) { make "\c[12]"; } method quote_escape:sym($/) { make "\c[27]"; } method quote_escape:sym($/) { make self.ints_to_string( $ ?? $ !! $ ); } method quote_escape:sym($/) { make self.ints_to_string( $ ?? $ !! $ ); } method quote_escape:sym($/) { make $.ast; } method quote_escape:sym<0>($/) { make "\c[0]"; } method quote_escape:sym($/) { make $ ?? '\\' ~ $.Str !! $.Str; } method charname($/) { my $codepoint := $ ?? $.ast !! nqp::codepointfromname(~$/); $/.CURSOR.panic("Unrecognized character name $/") if $codepoint < 0; make nqp::chr($codepoint); } method charnames($/) { my $str := ''; for $ { $str := $str ~ $_.ast; } make $str; } method charspec($/) { make $ ?? $.ast !! nqp::chr(self.string_to_int( $/, 10 )); } } nqp-2013.12.1/src/HLL/CommandLine.nqp000066400000000000000000000210721225523575400167470ustar00rootroot00000000000000=begin =head1 NAME HLL::CommandLine - command line parsing tools =head1 SYNOPSIS my $parser := HLL::CommandLine::Parser.new([ 'verbose', 'target=s', 'e=s' ]); # treat the first non-option argument as the program name, # and everything after that as arguments to the program $parser.stop-after-first-arg; # -e "program" also treats everything after it as arguments # to the program: $paser.add-stopper('-e'); my $results := $parser.parse(@*ARGS); my %options := $parser.options; my @args := $pasre.arguments; # remaining arguments from @*ARGS =head1 DESCRIPTION HLL::CommandLine::Parser stores a specification of command line options and other behavior, and uses that to parse an array of command line directives. It classifies the directives as I (usually of the form C<-f> or C<--foo>) and I (ie. non-options). The result of a C<.parse(RPA)> call is an C object (or an exception thrown), which makes the options and arguments available via the methods C and C. =head1 HLL::CommandLine::Parser =head2 new(Array) The C<.new> method and constructor expects an array with option specifications. Such a specification is the name of an option, optionally followed by the C<=> equals sign and a single character describing the kind of value it expects. Missing value specification or C stand for C, ie the option does not expect a value. C stands for a string value. Optional values are only supported for string values so far. For the value specified with C the value will default to ''. =head2 add-stopper(String) Adds a stopper. A stopper is a special value that, when encountered in the command line arguments, terminates the processing, and classifies the rest of the strings as arguments, independently of their form. C<--> is a pre-defined stopper. If an option is used a stopper, that option itself is still processed. Examples: yourprogram -a --bar b -- c --foo # options: a = 1, bar = 1 # arguments: b, c, --foo # with stopper -e, and -e expecting a value: yourprogram -a -e foo --bar baz # options: -a = 1, -e = foo # arguments: --bar, baz =head2 parse(Array) Parses the array as command line strings, and returns a C object (or thrown an exception on error). =head1 HLL::CommandLine::Result An object of this type holds the options and arguments from a successful command line parse. =head2 options Returns a hash of options =head2 arguments Return an array of arguments. =end class HLL::CommandLine::Result { has @!arguments; has %!options; method init() { @!arguments := []; %!options := nqp::hash(); } method arguments() { @!arguments } method options() { %!options } method add-argument($x) { nqp::push(@!arguments, $x); } method add-option($name, $value) { # how I miss p6's Hash.push if nqp::existskey(%!options, $name) { if nqp::islist(%!options{$name}) { nqp::push(%!options{$name}, $value); } else { %!options{$name} := [ %!options{$name}, $value ]; } } else { %!options{$name} := $value; } } } class HLL::CommandLine::Parser { has @!specs; has %!options; has %!stopper; has $!stop-after-first-arg; method new(@specs) { my $obj := self.CREATE; $obj.BUILD(specs => @specs); $obj; } method stop-after-first-arg() { $!stop-after-first-arg := 1; } method BUILD(:@specs) { @!specs := nqp::list(); %!options := nqp::hash(); %!stopper := nqp::hash(); %!stopper{'--'} := 1; $!stop-after-first-arg := 0; for @specs { self.add-spec($_); } } method add-stopper($x) { %!stopper{$x} := 1; } method split-option-aliases($s) { nqp::split('|', $s); } method add-spec($s) { my $i := nqp::index($s, '='); my $type; my @options; if $i < 0 { $type := 'b'; @options := self.split-option-aliases($s); } else { $type := nqp::substr($s, $i + 1); @options := self.split-option-aliases(nqp::substr($s, 0, $i)); } for @options { %!options{$_} := $type; } } method is-option($x) { return 0 if $x eq '-' || $x eq '--'; return 1 if nqp::substr($x, 0, 1) eq '-'; 0; } method wants-value($x) { my $spec := %!options{$x}; nqp::substr($spec, 0, 1) eq 's'; } method optional-value($x) { my $spec := %!options{$x}; $spec eq 's?'; } method parse(@args) { my $i := 0; my $arg-count := +@args; my $result := HLL::CommandLine::Result.new(); $result.init(); # called when an option expects a value after it sub get-value($opt) { if $i == $arg-count - 1 { nqp::die("Option $opt needs a value"); } else { $i++; @args[$i]; } } # called after a terminator that declares the rest # as not containing any options sub slurp-rest() { $i++; while $i < $arg-count { $result.add-argument(@args[$i]); $i++; } } while $i < $arg-count { my $cur := @args[$i]; if self.is-option($cur) { if nqp::substr($cur, 0, 2) eq '--' { # long option my $opt := nqp::substr(@args[$i], 2); my $idx := nqp::index($opt, '='); my $value := 1; my $has-value := 0; if $idx >= 0 { $value := nqp::substr($opt, $idx + 1); $opt := nqp::substr($opt, 0, $idx); $has-value := 1; } elsif self.optional-value($opt) { $value := ''; $has-value := 1; } nqp::die("Illegal option --$opt") unless nqp::existskey(%!options, $opt); nqp::die("Option --$opt does not allow a value") if !self.wants-value($opt) && $has-value; if !$has-value && self.wants-value($opt) { $value := get-value("--$opt"); } $result.add-option($opt, $value); slurp-rest if %!stopper{"--$opt"}; } else { my $opt := nqp::substr($cur, 1); my $len := nqp::chars($opt); if $len == 1 { # not grouped, so it might have a value nqp::die("No such option -$opt") unless %!options{$opt}; if self.wants-value($opt) { $result.add-option($opt, get-value("-$opt")); } else { $result.add-option($opt, 1); } slurp-rest() if %!stopper{"-$opt"}; } else { my $i := 0; while $i < $len { my $o := nqp::substr($opt, $i, 1); if %!options{$o} { if self.wants-value($o) { if $i + 1 == $len { nqp::die("Option '$o' in grouped options '-$opt' needs a value, but does not have one"); } $result.add-option($o, nqp::substr($opt, $i + 1)); last; } else { $result.add-option($o, 1); } } else { nqp::die("Grouped options '-$opt' contain '$o', which is not a valid option") } $i++; } } } } elsif %!stopper{$cur} { slurp-rest(); } else { $result.add-argument($cur); slurp-rest() if $!stop-after-first-arg; } $i++; } return $result; } } nqp-2013.12.1/src/HLL/Compiler.nqp000066400000000000000000000436201225523575400163360ustar00rootroot00000000000000# Provides base functionality for a compiler object. class HLL::Compiler does HLL::Backend::Default { has @!stages; has $!parsegrammar; has $!parseactions; has @!cmdoptions; has $!compiler_progname; has $!language; has %!config; has $!user_progname; has @!cli-arguments; has %!cli-options; has $!backend; method BUILD() { # Backend is set to the default one, by default. $!backend := self.default_backend(); # Default stages. @!stages := nqp::split(' ', 'start parse ast ' ~ $!backend.stages()); # Command options and usage. @!cmdoptions := nqp::split(' ', 'e=s help|h target=s trace|t=s encoding=s output|o=s combine version|v show-config verbose-config|V stagestats=s? ll-exception rxtrace nqpevent=s profile profile-compile'); %!config := nqp::hash(); } method backend(*@value) { if @value { $!backend := @value[0]; @!stages := nqp::split(' ', 'start parse ast ' ~ $!backend.stages()); } $!backend } method language($name?) { if $name { $!language := $name; nqp::bindcomp($name, self); } $!language; } method compiler($name) { nqp::getcomp($name); } method config() { %!config }; method autoprint($value) { self.interactive_result($value) unless nqp::tellfh(nqp::getstdout()) > $*AUTOPRINTPOS; } method interactive(*%adverbs) { nqp::printfh(nqp::getstderr(), self.interactive_banner); my $stdin := nqp::getstdin(); my $encoding := ~%adverbs; if $encoding && $encoding ne 'fixed_8' { nqp::setencoding($stdin, $encoding); } my $target := nqp::lc(%adverbs); my $save_ctx; while 1 { last if nqp::eoffh($stdin); my $prompt := self.interactive_prompt // '> '; my $code := nqp::readlineintfh($stdin, ~$prompt); if nqp::isnull($code) || !nqp::defined($code) { nqp::print("\n"); last; } # Set the current position of stdout for autoprinting control my $*AUTOPRINTPOS := nqp::tellfh(nqp::getstdout()); my $*CTXSAVE := self; my $*MAIN_CTX; if $code { $code := $code ~ "\n"; my $output; { $output := self.eval($code, :outer_ctx($save_ctx), |%adverbs); CATCH { self.interactive_exception($!); next; } }; if nqp::defined($*MAIN_CTX) { $save_ctx := $*MAIN_CTX; } next if nqp::isnull($output); if !$target { self.autoprint($output); } elsif $!backend.is_textual_stage($target) { nqp::say($output); } else { self.dumper($output, $target, |%adverbs); } } } } method interactive_result($value) { nqp::say(~$value) } method interactive_exception($ex) { nqp::print(~$ex ~ "\n") } method eval($code, *@args, *%adverbs) { my $output; if (%adverbs) { $output := $!backend.run_profiled({ self.compile($code, :compunit_ok(1), |%adverbs); }); } else { $output := self.compile($code, :compunit_ok(1), |%adverbs); } if $!backend.is_compunit($output) && %adverbs eq '' { my $outer_ctx := %adverbs; $output := $!backend.compunit_mainline($output); if nqp::defined($outer_ctx) { nqp::forceouterctx($output, $outer_ctx); } if (%adverbs) { $output := $!backend.run_profiled({ $output(|@args) }); } elsif %adverbs { $output := $!backend.run_traced(%adverbs, { $output(|@args) }); } else { $output := $output(|@args); } } $output; } method ctxsave() { $*MAIN_CTX := nqp::ctxcaller(nqp::ctx()); $*CTXSAVE := 0; } method panic(*@args) { nqp::die(join('', @args)) } method stages(@value?) { if +@value { @!stages := @value; } @!stages; } method parsegrammar(*@value) { if +@value { $!parsegrammar := @value[0]; } $!parsegrammar; } method parseactions(*@value) { if +@value { $!parseactions := @value[0]; } $!parseactions; } method interactive_banner() { '' } method interactive_prompt() { '> ' } method compiler_progname($value?) { if nqp::defined($value) { $!compiler_progname := $value; } $!compiler_progname; } method commandline_options(@value?) { if +@value { @!cmdoptions := @value; } @!cmdoptions; } method command_line(@args, *%adverbs) { my $program-name := @args[0]; my $res := self.process_args(@args); my %opts := $res.options; my @a := $res.arguments; for %opts { %adverbs{$_.key} := $_.value; } self.usage($program-name) if %adverbs || %adverbs; if $!backend.is_precomp_stage(%adverbs) { %adverbs := 1; } self.command_eval(|@a, |%adverbs); } method command_eval(*@a, *%adverbs) { self.version if %adverbs || %adverbs; self.verbose-config if %adverbs || %adverbs || %adverbs; self.nqpevent(%adverbs) if %adverbs; my $result; my $error; my $has_error := 0; my $target := nqp::lc(%adverbs); try { if nqp::defined(%adverbs) { $!user_progname := '-e'; my $?FILES := '-e'; $result := self.eval(%adverbs, '-e', |@a, |%adverbs); unless $target eq '' || $!backend.is_textual_stage($target) || %adverbs { self.dumper($result, $target, |%adverbs); } } elsif !@a { $result := self.interactive(|%adverbs) } elsif %adverbs { $result := self.evalfiles(@a, |%adverbs) } else { $result := self.evalfiles(@a[0], |@a, |%adverbs) } if !nqp::isnull($result) && ($!backend.is_textual_stage($target) || %adverbs) { my $output := %adverbs; my $fh := ($output eq '' || $output eq '-') ?? nqp::getstdout() !! nqp::open($output, 'w'); self.panic("Cannot write to $output") unless $fh; nqp::printfh($fh, $result); nqp::closefh($fh); } CATCH { $has_error := 1; $error := $_; } CONTROL { if nqp::can(self, 'handle-control') { self.handle-control($_); } else { nqp::rethrow($_); } $has_error := 1; $error := $_; } } if ($has_error) { if %adverbs || !nqp::can(self, 'handle-exception') { my $err := nqp::getstderr(); nqp::printfh($err, nqp::getmessage($error)); nqp::printfh($err, "\n"); nqp::printfh($err, nqp::join("\n", nqp::backtracestrings($error))); nqp::printfh($err, "\n"); nqp::exit(1); } else { self.handle-exception($error); } } $result; } method process_args(@args) { # First argument is the program name. self.compiler_progname(@args.shift); my $p := HLL::CommandLine::Parser.new(@!cmdoptions); $p.add-stopper('-e'); $p.stop-after-first-arg; my $res; try { $res := $p.parse(@args); CATCH { nqp::say($_); self.usage; nqp::exit(1); } } if $res { %!cli-options := $res.options(); @!cli-arguments := $res.arguments(); } else { %!cli-options := nqp::hash(); @!cli-arguments := []; } $res; } method evalfiles($files, *@args, *%adverbs) { my $target := nqp::lc(%adverbs); my $encoding := %adverbs; my @files := nqp::islist($files) ?? $files !! [$files]; $!user_progname := join(',', @files); my @codes; for @files -> $filename { my $err := 0; my $in-handle; try { $in-handle := nqp::open($filename, 'r'); CATCH { nqp::say("Could not open $filename. $_"); $err := 1; } } nqp::exit(1) if $err; try { nqp::setencoding($in-handle, $encoding); nqp::push(@codes, nqp::readallfh($in-handle)); nqp::closefh($in-handle); CATCH { $err := "Error while reading from file: $_"; } } nqp::die($err) if $err; } my $code := join('', @codes); my $?FILES := join(' ', @files); my $r := self.eval($code, |@args, |%adverbs); if $target eq '' || $!backend.is_textual_stage($target) || %adverbs { return $r; } else { return self.dumper($r, $target, |%adverbs); } } method exists_stage($stage) { my $found := 0; for self.stages() { if $_ eq $stage { return 1; } } return 0; } method compile($source, :$from, :$lineposcache, *%adverbs) { my %*COMPILING<%?OPTIONS> := %adverbs; my $*LINEPOSCACHE := $lineposcache; my $target := nqp::lc(%adverbs); my $result := $source; my $stderr := nqp::getstderr(); my $stdin := nqp::getstdin(); my $stagestats := %adverbs; unless $from eq '' || self.exists_stage($from) { nqp::die("Unknown compilation input '$from'"); } unless $target eq '' || self.exists_stage($target) { nqp::die("Unknown compilation target '$target'"); } for self.stages() { if $from ne '' { if $_ eq $from { $from := ''; } next; } my $timestamp := nqp::time_n(); if nqp::can(self, $_) { $result := self."$_"($result, |%adverbs); } elsif nqp::can($!backend, $_) { $result := $!backend."$_"($result, |%adverbs); } else { nqp::die("Unknown compilation stage '$_'"); } my $diff := nqp::time_n() - $timestamp; if nqp::defined($stagestats) { nqp::printfh($stderr, nqp::sprintf("Stage %-11s: %7.3f", [$_, $diff])); $!backend.force_gc() if nqp::bitand_i($stagestats, 0x4); nqp::printfh($stderr, $!backend.vmstat()) if nqp::bitand_i($stagestats, 0x2); nqp::printfh($stderr, "\n"); if nqp::bitand_i($stagestats, 0x8) { nqp::printfh($stderr, "continue> "); nqp::readlinefh($stdin); } } last if $_ eq $target; } if %adverbs { return $result } else { return $!backend.compunit_mainline($result); } } method start($source, *%adverbs) { $source; } method parse($source, *%adverbs) { my $s := $source; if %adverbs { $s := $!backend.apply_transcodings($s, %adverbs); } my $grammar := self.parsegrammar; my $actions; $actions := self.parseactions; $grammar.HOW.trace-on($grammar) if %adverbs; my $match := $grammar.parse($s, p => 0, actions => $actions); $grammar.HOW.trace-off($grammar) if %adverbs; self.panic('Unable to parse source') unless $match; return $match; } method ast($source, *%adverbs) { my $ast := $source.ast(); self.panic("Unable to obtain AST from " ~ $source.HOW.name($source)) unless $ast ~~ QAST::Node; $ast; } method dumper($obj, $name, *%options) { if nqp::can($obj, 'dump') { nqp::print($obj.dump()); } else { nqp::die("Cannot dump this object; no dump method"); } } method usage($name?) { if $name { say($name); } my $usage := "This compiler is based on HLL::Compiler.\n\nOptions:\n"; for @!cmdoptions { $usage := $usage ~ " $_\n"; } nqp::say($usage); nqp::exit(0); } method version() { my $version := %!config; my $backver := $!backend.version_string(); nqp::say("This is $!language version $version built on $backver"); nqp::exit(0); } method show-config() { self.verbose-config(); } method verbose-config() { my $bname := $!backend.name; for $!backend.config { nqp::say($bname ~ '::' ~ $_.key ~ '=' ~ $_.value); } for %!config { nqp::say($!language ~ '::' ~ $_.key ~ '=' ~ $_.value); } nqp::exit(0); } method nqpevent(*@pos) { $!backend.nqpevent(|@pos) } method removestage($stagename) { my @new_stages := nqp::list_s(); for @!stages { if $_ ne $stagename { @new_stages.push($_); } } @!stages := @new_stages; } method addstage($stagename, *%adverbs) { my $position; my $where; if %adverbs { $where := %adverbs; $position := 'before'; } elsif %adverbs { $where := %adverbs; $position := 'after'; } else { my @new-stages := nqp::clone(self.stages); nqp::push(@new-stages, $stagename); self.stages(@new-stages); return 1; } my @new-stages := nqp::list(); for self.stages { if $_ eq $where { if $position eq 'before' { nqp::push(@new-stages, $stagename); nqp::push(@new-stages, $_); } else { nqp::push(@new-stages, $_); nqp::push(@new-stages, $stagename); } } else { nqp::push(@new-stages, $_) } } self.stages(@new-stages); } method parse_name($name) { my @ns := nqp::split('::', $name); my $sigil := nqp::substr(@ns[0], 0, 1); # move any leading sigil to the last item my $idx := nqp::index('$@%&', $sigil); if $idx >= 0 { @ns[0] := nqp::substr(@ns[0], 1); @ns[-1] := $sigil ~ @ns[-1]; } # remove any empty items from the list # maybe replace with a grep() once we have the setting for sure my @actual_ns; for @ns { nqp::push(@actual_ns, $_) unless $_ eq ''; } @actual_ns; } method lineof($target, int $pos, int :$cache = 0) { my $linepos; if $cache { # if we've previously cached c for target, we use it. $linepos := $*LINEPOSCACHE; } unless nqp::defined($linepos) { # calculate a new linepos array. $linepos := nqp::list_i(); if $cache { $*LINEPOSCACHE := $linepos; } my str $s := ~$target; my int $eos := nqp::chars($s); my int $jpos := 0; my int $ord; # search for all of the newline markers in c. when we # find one, mark the ending offset of the line in c. while nqp::islt_i($jpos := nqp::findcclass(nqp::const::CCLASS_NEWLINE, $s, $jpos, $eos), $eos) { $ord := nqp::ord($s, $jpos); $jpos := nqp::add_i($jpos, 1); nqp::push_i($linepos, $jpos); # treat \r\n as a single logical newline. if nqp::iseq_i($ord, 13) && nqp::iseq_i(nqp::ord($s, $jpos), 10) { $jpos := nqp::add_i($jpos, 1); } } } # We have c, so now we (binary) search the array # for the largest element that is not greater than c. my int $lo := 0; my int $hi := nqp::elems($linepos); my int $line; while nqp::islt_i($lo, $hi) { $line := nqp::div_i(nqp::add_i($lo, $hi), 2); if nqp::isgt_i(nqp::atpos_i($linepos, $line), $pos) { $hi := $line; } else { $lo := nqp::add_i($line, 1); } } nqp::add_i($lo, 1); } # the name of the file(s) that are executed, or -e or 'interactive' method user-progname() { $!user_progname // 'interactive' } # command line options and arguments as provided by the user method cli-options() { %!cli-options } method cli-arguments() { @!cli-arguments } # set a recursion limit, if the backend supports it method recursion_limit($limit) { if nqp::can($!backend, 'recursion_limit') { $!backend.recursion_limit($limit); 1; } else { 0; } } } my $compiler := HLL::Compiler.new(); $compiler.language($compiler.backend.name); nqp-2013.12.1/src/HLL/Grammar.nqp000066400000000000000000000613131225523575400161510ustar00rootroot00000000000000use QRegex; grammar HLL::Grammar { my $brackets := "<>[]()\{}\x[0028]\x[0029]\x[003C]\x[003E]\x[005B]\x[005D]\x[007B]\x[007D]\x[00AB]\x[00BB]\x[0F3A]\x[0F3B]\x[0F3C]\x[0F3D]\x[169B]\x[169C]\x[2018]\x[2019]\x[201A]\x[2019]\x[201B]\x[2019]\x[201C]\x[201D]\x[201E]\x[201D]\x[201F]\x[201D]\x[2039]\x[203A]\x[2045]\x[2046]\x[207D]\x[207E]\x[208D]\x[208E]\x[2208]\x[220B]\x[2209]\x[220C]\x[220A]\x[220D]\x[2215]\x[29F5]\x[223C]\x[223D]\x[2243]\x[22CD]\x[2252]\x[2253]\x[2254]\x[2255]\x[2264]\x[2265]\x[2266]\x[2267]\x[2268]\x[2269]\x[226A]\x[226B]\x[226E]\x[226F]\x[2270]\x[2271]\x[2272]\x[2273]\x[2274]\x[2275]\x[2276]\x[2277]\x[2278]\x[2279]\x[227A]\x[227B]\x[227C]\x[227D]\x[227E]\x[227F]\x[2280]\x[2281]\x[2282]\x[2283]\x[2284]\x[2285]\x[2286]\x[2287]\x[2288]\x[2289]\x[228A]\x[228B]\x[228F]\x[2290]\x[2291]\x[2292]\x[2298]\x[29B8]\x[22A2]\x[22A3]\x[22A6]\x[2ADE]\x[22A8]\x[2AE4]\x[22A9]\x[2AE3]\x[22AB]\x[2AE5]\x[22B0]\x[22B1]\x[22B2]\x[22B3]\x[22B4]\x[22B5]\x[22B6]\x[22B7]\x[22C9]\x[22CA]\x[22CB]\x[22CC]\x[22D0]\x[22D1]\x[22D6]\x[22D7]\x[22D8]\x[22D9]\x[22DA]\x[22DB]\x[22DC]\x[22DD]\x[22DE]\x[22DF]\x[22E0]\x[22E1]\x[22E2]\x[22E3]\x[22E4]\x[22E5]\x[22E6]\x[22E7]\x[22E8]\x[22E9]\x[22EA]\x[22EB]\x[22EC]\x[22ED]\x[22F0]\x[22F1]\x[22F2]\x[22FA]\x[22F3]\x[22FB]\x[22F4]\x[22FC]\x[22F6]\x[22FD]\x[22F7]\x[22FE]\x[2308]\x[2309]\x[230A]\x[230B]\x[2329]\x[232A]\x[23B4]\x[23B5]\x[2768]\x[2769]\x[276A]\x[276B]\x[276C]\x[276D]\x[276E]\x[276F]\x[2770]\x[2771]\x[2772]\x[2773]\x[2774]\x[2775]\x[27C3]\x[27C4]\x[27C5]\x[27C6]\x[27D5]\x[27D6]\x[27DD]\x[27DE]\x[27E2]\x[27E3]\x[27E4]\x[27E5]\x[27E6]\x[27E7]\x[27E8]\x[27E9]\x[27EA]\x[27EB]\x[2983]\x[2984]\x[2985]\x[2986]\x[2987]\x[2988]\x[2989]\x[298A]\x[298B]\x[298C]\x[298D]\x[298E]\x[298F]\x[2990]\x[2991]\x[2992]\x[2993]\x[2994]\x[2995]\x[2996]\x[2997]\x[2998]\x[29C0]\x[29C1]\x[29C4]\x[29C5]\x[29CF]\x[29D0]\x[29D1]\x[29D2]\x[29D4]\x[29D5]\x[29D8]\x[29D9]\x[29DA]\x[29DB]\x[29F8]\x[29F9]\x[29FC]\x[29FD]\x[2A2B]\x[2A2C]\x[2A2D]\x[2A2E]\x[2A34]\x[2A35]\x[2A3C]\x[2A3D]\x[2A64]\x[2A65]\x[2A79]\x[2A7A]\x[2A7D]\x[2A7E]\x[2A7F]\x[2A80]\x[2A81]\x[2A82]\x[2A83]\x[2A84]\x[2A8B]\x[2A8C]\x[2A91]\x[2A92]\x[2A93]\x[2A94]\x[2A95]\x[2A96]\x[2A97]\x[2A98]\x[2A99]\x[2A9A]\x[2A9B]\x[2A9C]\x[2AA1]\x[2AA2]\x[2AA6]\x[2AA7]\x[2AA8]\x[2AA9]\x[2AAA]\x[2AAB]\x[2AAC]\x[2AAD]\x[2AAF]\x[2AB0]\x[2AB3]\x[2AB4]\x[2ABB]\x[2ABC]\x[2ABD]\x[2ABE]\x[2ABF]\x[2AC0]\x[2AC1]\x[2AC2]\x[2AC3]\x[2AC4]\x[2AC5]\x[2AC6]\x[2ACD]\x[2ACE]\x[2ACF]\x[2AD0]\x[2AD1]\x[2AD2]\x[2AD3]\x[2AD4]\x[2AD5]\x[2AD6]\x[2AEC]\x[2AED]\x[2AF7]\x[2AF8]\x[2AF9]\x[2AFA]\x[2E02]\x[2E03]\x[2E04]\x[2E05]\x[2E09]\x[2E0A]\x[2E0C]\x[2E0D]\x[2E1C]\x[2E1D]\x[2E20]\x[2E21]\x[3008]\x[3009]\x[300A]\x[300B]\x[300C]\x[300D]\x[300E]\x[300F]\x[3010]\x[3011]\x[3014]\x[3015]\x[3016]\x[3017]\x[3018]\x[3019]\x[301A]\x[301B]\x[301D]\x[301E]\x[FD3E]\x[FD3F]\x[FE17]\x[FE18]\x[FE35]\x[FE36]\x[FE37]\x[FE38]\x[FE39]\x[FE3A]\x[FE3B]\x[FE3C]\x[FE3D]\x[FE3E]\x[FE3F]\x[FE40]\x[FE41]\x[FE42]\x[FE43]\x[FE44]\x[FE47]\x[FE48]\x[FE59]\x[FE5A]\x[FE5B]\x[FE5C]\x[FE5D]\x[FE5E]\x[FF08]\x[FF09]\x[FF1C]\x[FF1E]\x[FF3B]\x[FF3D]\x[FF5B]\x[FF5D]\x[FF5F]\x[FF60]\x[FF62]\x[FF63]"; my $cursor_class := NQPCursor; method throw_unrecog_backslash_seq ($sequence) { self.panic("Unrecognized backslash sequence: '\\" ~ $sequence ~ "'"); } token termish { * * } proto token term { <...> } proto token infix { <...> } proto token prefix { <...> } proto token postfix { <...> } proto token circumfix { <...> } proto token postcircumfix { <...> } token term:sym { } token infixish { } token prefixish { <.ws> } token postfixish { | | } token nullterm { } token nullterm_alt { } # Return if it matches, otherwise. method nulltermish() { self.termish || self.nullterm_alt } token quote_delimited { * } token quote_atom { [ | | [ <-quote_escape-stopper-starter> ]+ | * ] } token decint { [\d+]+ % '_' } token decints { [<.ws><.ws>]+ % ',' } token hexint { [<[ 0..9 a..f A..F ]>+]+ % '_' } token hexints { [<.ws><.ws>]+ % ',' } token octint { [<[ 0..7 ]>+]+ % '_' } token octints { [<.ws><.ws>]+ % ',' } token binint { [<[ 0..1 ]>+]+ % '_' } token binints { [<.ws><.ws>]+ % ',' } token integer { [ | 0 [ b | o | x | d ] | ] } token dec_number { | $=[ '.' \d+ ] ? | $=[ \d+ '.' \d+ ] ? | $=[ \d+ ] } token escale { <[Ee]> <[+\-]>? \d+ } proto token quote_escape { <...> } token quote_escape:sym { \\ \\ } token quote_escape:sym { \\ } token quote_escape:sym { \\ b } token quote_escape:sym { \\ n } token quote_escape:sym { \\ r } token quote_escape:sym { \\ t } token quote_escape:sym { \\ f } token quote_escape:sym { \\ e } token quote_escape:sym { \\ x [ | '[' ']' ] } token quote_escape:sym { \\ o [ | '[' ']' ] } token quote_escape:sym { \\ c } token quote_escape:sym<0> { \\ } token quote_escape:sym { \\ {} [ || [ | $=(\W) | (\w) { self.throw_unrecog_backslash_seq: $/[0].Str } ] || $=[.] ] } token charname { || || <[a..z A..Z]> <-[ \] , # ]>*? <[a..z A..Z ) ]> > } token charnames { [<.ws><.ws>]+ % ',' } token charspec { [ | '[' ']' | \d+ [ _ \d+]* | <[ ?..Z ]> | <.panic: 'Unrecognized \\c character'> ] } =begin =item O(spec [, save]) This subrule attaches operator precedence information to a match object (such as an operator token). A typical invocation for the subrule might be: token infix:sym<+> { } )> } This says to add all of the attribute of the C<%additive> hash (described below) and a C entry into the match object returned by the C<< infix:sym<+> >> token (as the C named capture). Note that this is a alphabetic "O", not a digit zero. Currently the C subrule accepts a string argument describing the hash to be stored. (Note the C< q{ ... } > above. Eventually it may be possible to omit the 'q' such that an actual (constant) hash constructor is passed as an argument to C. The hash built via the string argument to C is cached, so that subsequent parses of the same token re-use the hash built from previous parses of the token, rather than building a new hash on each invocation. The C argument is used to build "hash" aggregates that can be referred to by subsequent calls to C. For example, NQP::Grammar.O(':prec, :assoc', '%additive' ); specifies the values to be associated with later references to "%additive". Eventually it will likely be possible to use true hashes from a package namespace, but this works for now. Currently the only pairs recognized have the form C< :pair >, C< :!pair >, and C<< :pair >>. =end # This lexical holds the hash cache. Right now we have one # cache for all grammars; eventually we may need a way to # separate them out by cursor type. my %ohash; method O(str $spec, $save?) { # See if we've already created a Hash for the current # specification string -- if so, use that. my %hash := %ohash{$spec}; unless %hash { # Otherwise, we need to build a new one. %hash := nqp::hash(); my int $eos := nqp::chars($spec); my int $pos := 0; while ($pos := nqp::findnotcclass(nqp::const::CCLASS_WHITESPACE, $spec, $pos, $eos)) < $eos { my int $lpos; my str $s := nqp::substr($spec, $pos, 1); if $s eq ',' { # Ignore commas between elements for now. $pos++; } elsif $s eq ':' { # Parse whatever comes next like a pair. $pos++; # If the pair is of the form :!name, then reverse the value # and skip the exclamation mark. my $value := 1; if nqp::substr($spec, $pos, 1) eq '!' { $pos++; $value := 0; } # Get the name of the pair. $lpos := nqp::findnotcclass(nqp::const::CCLASS_WORD, $spec, $pos, $eos); my $name := nqp::substr($spec, $pos, $lpos - $pos); $pos := $lpos; # Look for a <...> that follows. if nqp::substr($spec, $pos, 1) eq '<' { $pos := $pos + 1; $lpos := nqp::index($spec, '>', $pos); $value := nqp::substr($spec, $pos, $lpos - $pos); $pos := $lpos + 1; } # Done processing the pair, store it in the hash. %hash{$name} := $value; } else { # If whatever we found doesn't start with a colon, treat it # as a lookup of a previously saved hash to be merged in. # Find the first whitespace or comma $lpos := nqp::findcclass(nqp::const::CCLASS_WHITESPACE, $spec, $pos, $eos); my $index := nqp::index($spec, ',', $pos); $lpos := $index unless $index < 0 || $index >= $lpos; my $lookup := nqp::substr($spec, $pos, $lpos - $pos); my %lhash := %ohash{$lookup}; self.'panic'('Unknown operator precedence specification "', $lookup, '"') unless %lhash; my $lhash_it := nqp::iterator(%lhash); while $lhash_it { $s := nqp::shift($lhash_it); %hash{$s} := %lhash{$s}; } $pos := $lpos; } } # Done processing the spec string, cache the hash for later. %ohash{$spec} := %hash; } if $save { %ohash{$save} := %hash; self; } else { # If we've been called as a subrule, then build a pass-cursor # to indicate success and set the hash as the subrule's match object. my $cur := self.'!cursor_start_cur'(); $cur.'!cursor_pass'(nqp::getattr_i($cur, $cursor_class, '$!from')); nqp::bindattr($cur, $cursor_class, '$!match', %hash); $cur; } } =begin =item panic([args :slurpy]) Throw an exception at the current cursor location. If the message doesn't end with a newline, also output the line number and offset of the match. =end method panic(*@args) { my $pos := self.pos(); my $target := self.target(); @args.push(' at line '); @args.push(HLL::Compiler.lineof($target, $pos) + 1); @args.push(', near "'); @args.push(nqp::escape(nqp::substr($target, $pos, 10))); @args.push('"'); nqp::die(join('', @args)) } method FAILGOAL($goal, $dba?) { unless $dba { $dba := nqp::getcodename(nqp::callercode()); } self.panic("Unable to parse expression in $dba; couldn't find final $goal"); } =begin =item peek_delimiters(target, pos) Return the start/stop delimiter pair based on peeking at C position C. =end method peek_delimiters(str $target, int $pos) { # peek at the next character my str $start := nqp::substr($target, $pos, 1); # colon, word and whitespace characters aren't valid delimiters if $start eq ':' { self.panic('Colons may not be used to delimit quoting constructs'); } if nqp::iscclass(nqp::const::CCLASS_WORD, $start, 0) { self.panic('Alphanumeric character is not allowed as a delimiter'); } if nqp::iscclass(nqp::const::CCLASS_WHITESPACE, $start, 0) { self.panic('Whitespace character is not allowed as a delimiter'); } # assume stop delim is same as start, for the moment my str $stop := $start; my int $brac := nqp::index($brackets, $start); if $brac >= 0 { # if it's a closing bracket, that's an error also if $brac % 2 { self.panic('Use of a closing delimiter for an opener is reserved'); } # it's an opener, so get the closing bracket $stop := nqp::substr($brackets, $brac + 1, 1); # see if the opening bracket is repeated my int $len := 1; while nqp::substr($target, ++$pos, 1) eq $start { $len++; } if $len > 1 { $start := nqp::x($start, $len); $stop := nqp::x($stop, $len); } } [$start, $stop] } my $TRUE := 1; token quote_EXPR(*@args) { :my %*QUOTEMOD; :my $*QUOTE_START; :my $*QUOTE_STOP; { for @args -> $mod { $mod := nqp::substr($mod, 1); %*QUOTEMOD{$mod} := $TRUE; if $mod eq 'qq' { %*QUOTEMOD{'s'} := $TRUE; %*QUOTEMOD{'a'} := $TRUE; %*QUOTEMOD{'h'} := $TRUE; %*QUOTEMOD{'f'} := $TRUE; %*QUOTEMOD{'c'} := $TRUE; %*QUOTEMOD{'b'} := $TRUE; } elsif $mod eq 'b' { %*QUOTEMOD{'q'} := $TRUE; } } my @delims := self.peek_delimiters(self.target, self.pos); $*QUOTE_START := @delims[0]; $*QUOTE_STOP := @delims[1]; } } token quotemod_check(str $mod) { } method starter() { my $start := $*QUOTE_START; nqp::isconcrete($start) ?? self.'!LITERAL'($start) !! self.'!cursor_start_fail'() } method stopper() { my $stop := $*QUOTE_STOP; nqp::isconcrete($stop) ?? self.'!LITERAL'($stop) !! self.'!cursor_start_fail'() } our method split_words(str $words) { my @result; my int $pos := 0; my int $eos := nqp::chars($words); my int $ws; while ($pos := nqp::findnotcclass(nqp::const::CCLASS_WHITESPACE, $words, $pos, $eos)) < $eos { $ws := nqp::findcclass(nqp::const::CCLASS_WHITESPACE, $words, $pos, $eos); nqp::push(@result, nqp::substr($words, $pos, $ws - $pos)); $pos := $ws; } @result } =begin =item EXPR(...) An operator precedence parser. =end method EXPR(str $preclim = '', int :$noinfix = 0) { my $here := self.'!cursor_start_cur'(); my int $pos := nqp::getattr_i($here, $cursor_class, '$!from'); my str $termishrx := 'termish'; my @opstack; my @termstack; my $termcur; my $termish; my %termOPER; my @prefixish; my @postfixish; my $wscur; my $infixcur; my $infix; my %inO; my str $inprec; my str $opprec; my str $inassoc; my int $more_infix; my int $term_done; while 1 { nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); $termcur := $here."$termishrx"(); $pos := nqp::getattr_i($termcur, $cursor_class, '$!pos'); nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); return $here if $pos < 0; $termish := $termcur.MATCH(); # Interleave any prefix/postfix we might have found. %termOPER := $termish; %termOPER := nqp::atkey(%termOPER, 'OPER') while nqp::existskey(%termOPER, 'OPER'); @prefixish := nqp::atkey(%termOPER, 'prefixish'); @postfixish := nqp::atkey(%termOPER, 'postfixish'); unless nqp::isnull(@prefixish) || nqp::isnull(@postfixish) { while @prefixish && @postfixish { my %preO := @prefixish[0]; my %postO := @postfixish[nqp::elems(@postfixish)-1]; my $preprec := nqp::ifnull(nqp::atkey(%preO, 'prec'), ''); my $postprec := nqp::ifnull(nqp::atkey(%postO, 'prec'), ''); if $postprec gt $preprec || $postprec eq $preprec && %postO eq 'right' { nqp::push(@opstack, nqp::shift(@prefixish)); } else { nqp::push(@opstack, nqp::pop(@postfixish)); } } nqp::push(@opstack, nqp::shift(@prefixish)) while @prefixish; nqp::push(@opstack, nqp::pop(@postfixish)) while @postfixish; } nqp::deletekey($termish, 'prefixish'); nqp::deletekey($termish, 'postfixish'); nqp::push(@termstack, nqp::atkey($termish, 'term')); last if $noinfix; $more_infix := 1; $term_done := 0; while $more_infix { # Now see if we can fetch an infix operator # First, we need ws to match. nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); $wscur := $here.ws(); $pos := nqp::getattr_i($wscur, $cursor_class, '$!pos'); if $pos < 0 { $term_done := 1; last; } # Next, try the infix itself. nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); $infixcur := $here.infixish(); $pos := nqp::getattr_i($infixcur, $cursor_class, '$!pos'); if $pos < 0 { $term_done := 1; last; } $infix := $infixcur.MATCH(); # We got an infix. %inO := $infix; $termishrx := nqp::ifnull(nqp::atkey(%inO, 'nextterm'), 'termish'); $inprec := ~%inO; $infixcur.panic('Missing infixish operator precedence') unless $inprec; if $inprec lt $preclim { $term_done := 1; last; } %inO := nqp::ifnull(nqp::atkey(%inO, 'sub'), nqp::atkey(%inO, 'prec')); while @opstack { $opprec := ~@opstack[+@opstack-1]; last unless $opprec gt $inprec; self.EXPR_reduce(@termstack, @opstack); } if nqp::isnull(nqp::atkey(%inO, 'fake')) { $more_infix := 0; } else { nqp::push(@opstack, $infix); self.EXPR_reduce(@termstack, @opstack); } } last if $term_done; # if equal precedence, use associativity to decide if $opprec eq $inprec { $inassoc := nqp::atkey(%inO, 'assoc'); if $inassoc eq 'non' { self.EXPR_nonassoc($infixcur, @opstack[nqp::elems(@opstack)-1], $infix.Str()); } if $inassoc eq 'left' { # left associative, reduce immediately self.EXPR_reduce(@termstack, @opstack); } } nqp::push(@opstack, $infix); # The Shift nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); $wscur := $here.ws(); $pos := nqp::getattr_i($wscur, $cursor_class, '$!pos'); nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); return $here if $pos < 0; } self.EXPR_reduce(@termstack, @opstack) while @opstack; $pos := nqp::getattr_i($here, $cursor_class, '$!pos'); $here := self.'!cursor_start_cur'(); $here.'!cursor_pass'($pos); nqp::bindattr_i($here, $cursor_class, '$!pos', $pos); nqp::bindattr($here, $cursor_class, '$!match', nqp::pop(@termstack)); $here.'!reduce'('EXPR'); $here; } method EXPR_reduce(@termstack, @opstack) { my $op := nqp::pop(@opstack); # Give it a fresh capture list, since we'll have assumed it has # no positional captures and not taken them. nqp::bindattr($op, NQPCapture, '@!array', nqp::list()); my %opOPER := nqp::atkey($op, 'OPER'); my %opO := nqp::atkey(%opOPER, 'O'); my str $opassoc := ~nqp::atkey(%opO, 'assoc'); my str $key; my str $sym; my $reducecheck; my $arg; if $opassoc eq 'unary' { $arg := nqp::pop(@termstack); $op[0] := $arg; $key := $arg.from() < $op.from() ?? 'POSTFIX' !! 'PREFIX'; } elsif $opassoc eq 'list' { $sym := nqp::ifnull(nqp::atkey(%opOPER, 'sym'), ''); nqp::unshift($op, nqp::pop(@termstack)); while @opstack { last if $sym ne nqp::ifnull( nqp::atkey(nqp::atkey(nqp::atpos(@opstack, nqp::elems(@opstack) - 1), 'OPER'), 'sym'), ''); nqp::unshift($op, nqp::pop(@termstack)); nqp::pop(@opstack); } nqp::unshift($op, nqp::pop(@termstack)); $key := 'LIST'; } else { # infix op assoc: left|right|ternary|... $op[1] := nqp::pop(@termstack); # right $op[0] := nqp::pop(@termstack); # left $reducecheck := nqp::atkey(%opO, 'reducecheck'); self."$reducecheck"($op) unless nqp::isnull($reducecheck); $key := 'INFIX'; } self.'!reduce_with_match'('EXPR', $key, $op); nqp::push(@termstack, $op); } method EXPR_nonassoc($cur, $op1, $op2) { $cur.panic('"' ~ $op1 ~ '" and "' ~ $op2 ~ '" are non-associative and require parens'); } method ternary($match) { $match[2] := $match[1]; $match[1] := $match{'infix'}{'EXPR'}; } method MARKER(str $markname) { my %markhash := nqp::getattr( nqp::getattr(self, $cursor_class, '$!shared'), ParseShared, '%!marks'); my $cur := nqp::atkey(%markhash, $markname); if nqp::isnull($cur) { $cur := self."!cursor_start_cur"(); $cur."!cursor_pass"(self.pos()); nqp::bindkey(%markhash, $markname, $cur); } else { $cur."!cursor_pos"(self.pos()); $cur } } method MARKED(str $markname) { my %markhash := nqp::getattr( nqp::getattr(self, $cursor_class, '$!shared'), ParseShared, '%!marks'); my $cur := nqp::atkey(%markhash, $markname); unless nqp::istype($cur, NQPCursor) && $cur.pos() == self.pos() { $cur := self.'!cursor_start_fail'(); } $cur } method LANG($lang, $regex, *@args) { my $lang_cursor := %*LANG{$lang}.'!cursor_init'(self.orig(), :p(self.pos()), :shared(self.'!shared'())); if self.HOW.traced(self) { $lang_cursor.HOW.trace-on($lang_cursor, self.HOW.trace_depth(self)); } my $*ACTIONS := %*LANG{$lang ~ '-actions'}; $lang_cursor."$regex"(|@args); } } nqp-2013.12.1/src/HLL/World.nqp000066400000000000000000000104041225523575400156450ustar00rootroot00000000000000# While the grammar represents the syntactic elements of our language and # the actions take care of building up an AST to represent the semantics # of it, the world is about the declarative aspects of a language. This # includes: # # * Symbol table management # * Creating meta-object instances # * Parts of library loading (most likely it delegates to an actual loader) # * Resolving references to objects, within or between compilation units # # Just as there is one AST produced per compilation unit, there is also a # world produce per compilation unit. # # A world includes a serialization context. This contains a bunch of # objects - often meta-objects - that we want to persist across the # compile time / run time boundary. If we're doing pre-compilation # rather than "immediate run" then we serialize the contents of the # serialization context. class HLL::World { # The serialization context that we're building. has $!sc; # The handle for the context. has $!handle; # Whether we're in pre-compilation mode. has $!precomp_mode; # The number of code refs we've added to the code refs root so far. has $!num_code_refs; # List of QAST blocks that map to the code refs table, for use in # building deserialization code. has $!code_ref_blocks; # List of QAST nodes specifying dependency loading related tasks. These # are done before the deserialization of the current context, or if in # immediate run mode before any of the other fixup tasks. has @!load_dependency_tasks; # List of QAST nodes specifying fixup tasks, either after deserialization # or between compile time and run time. has @!fixup_tasks; method BUILD(:$handle!, :$description = '') { # Initialize attributes. $!sc := nqp::createsc($handle); $!handle := $handle; @!fixup_tasks := nqp::list(); @!load_dependency_tasks := nqp::list(); $!precomp_mode := %*COMPILING<%?OPTIONS>; $!num_code_refs := 0; $!code_ref_blocks := []; nqp::scsetdesc($!sc, $description); # Add to currently compiling SC stack. nqp::pushcompsc($!sc); } # Adds an object to the root set, along with a mapping. method add_object($obj) { nqp::setobjsc($obj, $!sc); my $idx := nqp::scobjcount($!sc); nqp::scsetobj($!sc, $idx, $obj); $idx } # Adds a code reference to the root set of code refs. method add_root_code_ref($code_ref, $past_block) { my $code_ref_idx := $!num_code_refs; $!num_code_refs := $!num_code_refs + 1; $!code_ref_blocks.push($past_block); nqp::scsetcode($!sc, $code_ref_idx, $code_ref); $code_ref_idx } # Updates a code reference in the root set. method update_root_code_ref($idx, $new_code_ref) { nqp::scsetcode($!sc, $idx, $new_code_ref); } # Checks if we are in pre-compilation mode. method is_precompilation_mode() { $!precomp_mode } # Add an event that we want to run before deserialization or before any # other fixup. method add_load_dependency_task(:$deserialize_past, :$fixup_past) { if $!precomp_mode { @!load_dependency_tasks.push($deserialize_past) if $deserialize_past; } else { @!load_dependency_tasks.push($fixup_past) if $fixup_past; } } # Add an event that we need to run at fixup time (after deserialization of # between compilation and runtime). method add_fixup_task(:$deserialize_past, :$fixup_past) { if $!precomp_mode { @!fixup_tasks.push($deserialize_past) if $deserialize_past; } else { @!fixup_tasks.push($fixup_past) if $fixup_past; } } # Gets the built serialization context. method sc() { $!sc } # Gets the SC handle. method handle() { $!handle } method code_ref_blocks() { $!code_ref_blocks } # Gets the list of load dependency tasks to do. method load_dependency_tasks() { @!load_dependency_tasks } # Gets the list of tasks to do at fixup time. method fixup_tasks() { @!fixup_tasks } } nqp-2013.12.1/src/HLL/sprintf.nqp000066400000000000000000000341031225523575400162450ustar00rootroot00000000000000my module sprintf { my @handlers; my $assert_used_args; grammar Syntax { token TOP { :my $*ARGS_USED := 0; ^ * $ } method panic($msg) { nqp::die($msg) } token statement { [ | [ [ | ] || <.panic("'" ~ nqp::substr(self.orig,1) ~ "' is not valid in sprintf format sequence '" ~ self.orig ~ "'")> ] | ] } proto token directive { <...> } token directive:sym { '%' ? * ? [ '.' ]? $=<[bB]> } token directive:sym { '%' ? * ? } token directive:sym { '%' ? * ? [ '.' ]? $=<[di]> } token directive:sym { '%' ? * ? [ '.' ]? $=<[eE]> } token directive:sym { '%' ? * ? [ '.' ]? $=<[fF]> } token directive:sym { '%' ? * ? [ '.' ]? $=<[gG]> } token directive:sym { '%' ? * ? [ '.' ]? } token directive:sym { '%' ? * ? [ '.' ]? } token directive:sym { '%' ? * ? } token directive:sym { '%' ? * ? [ '.' ]? $=<[xX]> } proto token escape { <...> } token escape:sym<%> { '%' * ? } token literal { <-[%]>+ } token idx { $=[\d+] '$' } token flags { | $ = ' ' | $ = '+' | $ = '-' | $ = '0' | $ = '#' } token size { \d* | $='*' } } class Actions { my $knowhow := nqp::knowhow().new_type(:repr("P6bigint")); my $zero := nqp::box_i(0, $knowhow); method TOP($/) { my @statements; @statements.push( $_.ast ) for $; if $assert_used_args && $*ARGS_USED < +@*ARGS_HAVE { nqp::die("Too few directives: found $*ARGS_USED," ~ " fewer than the " ~ +@*ARGS_HAVE ~ " arguments after the format string") } if $*ARGS_USED > +@*ARGS_HAVE { nqp::die("Too many directives: found $*ARGS_USED, but " ~ (+@*ARGS_HAVE > 0 ?? "only " ~ +@*ARGS_HAVE !! "no") ~ " arguments after the format string") } make nqp::join('', @statements); } sub infix_x($s, $n) { my @strings; my $i := 0; @strings.push($s) while $i++ < $n; nqp::join('', @strings); } sub next_argument($/) { if $ { $assert_used_args := 0; @*ARGS_HAVE[$.ast] } else { @*ARGS_HAVE[$*ARGS_USED++] } } sub intify($number_representation) { for @handlers -> $handler { if $handler.mine($number_representation) { return $handler.int($number_representation); } } if nqp::isint($number_representation) { nqp::box_i($number_representation, $knowhow); } else { if nqp::isnum($number_representation) || nqp::isstr($number_representation) { if $number_representation > 0 { nqp::fromnum_I(nqp::floor_n($number_representation), $knowhow); } else { nqp::fromnum_I(nqp::ceil_n($number_representation), $knowhow); } } else { $number_representation; } } } sub padding_char($st) { my $padding_char := ' '; if (!$st && !has_flag($st, 'minus')) || $st ~~ /<[eEfFgG]>/ { $padding_char := '0' if $_ for $st; } $padding_char } sub has_flag($st, $key) { my $ok := 0; if $st { $ok := 1 if $_{$key} for $st } $ok } method statement($/){ my $st; if $ { $st := $ } elsif $ { $st := $ } else { $st := $ } my @pieces; @pieces.push: infix_x(padding_char($st), $st.ast - nqp::chars($st.ast)) if $st; has_flag($st, 'minus') ?? @pieces.unshift: $st.ast !! @pieces.push: $st.ast; make join('', @pieces) } method directive:sym($/) { my $int := intify(next_argument($/)); $int := nqp::base_I($int, 2); my $pre := ($ eq 'b' ?? '0b' !! '0B') if $int && has_flag($/, 'hash'); if nqp::chars($) { $int := '' if $.ast == 0 && $int == 0; $int := $pre ~ infix_x('0', $.ast - nqp::chars($int)) ~ $int; } else { $int := $pre ~ $int } make $int; } method directive:sym($/) { make nqp::chr(next_argument($/)) } method directive:sym($/) { my $int := intify(next_argument($/)); my $pad := padding_char($/); my $sign := nqp::islt_I($int, $zero) ?? '-' !! has_flag($/, 'plus') ?? '+' !! ''; $int := nqp::tostr_I(nqp::abs_I($int, $knowhow)); $int := nqp::substr($int, 0, $.ast) if nqp::chars($); if $pad ne ' ' && $ { $int := $sign ~ infix_x($pad, $.ast - nqp::chars($int) - 1) ~ $int; } else { $int := $sign ~ $int; } make $int } sub pad-with-sign($sign, $num, $size, $pad) { if $pad ne ' ' && $size { $sign ~ infix_x($pad, $size - nqp::chars($num) - 1) ~ $num; } else { $sign ~ $num; } } sub stringify-to-precision($float, $precision) { $float := nqp::abs_n($float); my $lhs := nqp::floor_n($float); my $rhs := $float - $lhs; my $int := nqp::fromnum_I($lhs, $knowhow); $lhs := nqp::tostr_I($int); $float := $rhs + 1; $float := $float * nqp::pow_n(10, $precision); $float := ~nqp::floor_n($float + 0.5); $float := $float - nqp::pow_n(10, $precision); $rhs := infix_x('0', $precision - nqp::chars($float)) ~ $float; $rhs := nqp::substr($rhs, nqp::chars($rhs) - $precision); $lhs ~ '.' ~ $rhs; } sub stringify-to-precision2($float, $precision) { my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10)); $float := nqp::abs_n($float) * nqp::pow_n(10, $precision - ($exp + 1)) + 0.5; $float := nqp::floor_n($float); $float := $float / nqp::pow_n(10, $precision - ($exp + 1)); #?if jvm if $exp == -4 { $float := stringify-to-precision($float, $precision + 3); $float := nqp::substr($float, 0, nqp::chars($float) - 1) if nqp::chars($float) > 1 && $float ~~ /\.\d**4 0+$/; $float := nqp::substr($float, 0, nqp::chars($float) - 1) if nqp::chars($float) > 1 && $float ~~ /\.\d**4 0+$/; } $float #?endif } sub fixed-point($float, $precision, $size, $pad) { my $sign := $float < 0 ?? '-' !! ''; $float := stringify-to-precision(nqp::abs_n($float), $precision); pad-with-sign($sign, $float, $size, $pad); } sub scientific($float, $e, $precision, $size, $pad) { my $sign := $float < 0 ?? '-' !! ''; $float := nqp::abs_n($float); my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10)); $float := $float / nqp::pow_n(10, $exp); $float := stringify-to-precision($float, $precision); if $exp < 0 { $exp := -$exp; $float := $float ~ $e ~ '-' ~ ($exp < 10 ?? '0' !! '') ~ $exp; } else { $float := $float ~ $e ~ '+' ~ ($exp < 10 ?? '0' !! '') ~ $exp; } pad-with-sign($sign, $float, $size, $pad); } sub shortest($float, $e, $precision, $size, $pad) { my $sign := $float < 0 ?? '-' !! ''; $float := nqp::abs_n($float); my $exp := $float == 0.0 ?? 0 !! nqp::floor_n(nqp::log_n($float) / nqp::log_n(10)); if -2 - $precision < $exp && $exp < $precision { my $fixed-precision := $exp > $precision ?? 0 !! $precision - ($exp + 1); my $fixed := stringify-to-precision2($float, $precision); pad-with-sign($sign, $fixed, $size, $pad); } else { $float := $float / nqp::pow_n(10, $exp); $float := stringify-to-precision2($float, $precision); my $sci; if $exp < 0 { $exp := -$exp; $sci := $float ~ $e ~ '-' ~ ($exp < 10 ?? '0' !! '') ~ $exp; } else { $sci := $float ~ $e ~ '+' ~ ($exp < 10 ?? '0' !! '') ~ $exp; } pad-with-sign($sign, $sci, $size, $pad); } } method directive:sym($/) { my $float := next_argument($/); my $precision := $ ?? $.ast !! 6; my $pad := padding_char($/); my $size := $ ?? $.ast !! 0; make scientific($float, $, $precision, $size, $pad); } method directive:sym($/) { my $int := next_argument($/); my $precision := $ ?? $.ast !! 6; my $pad := padding_char($/); my $size := $ ?? $.ast !! 0; make fixed-point($int, $precision, $size, $pad); } method directive:sym($/) { my $float := next_argument($/); my $precision := $ ?? $.ast !! 6; my $pad := padding_char($/); my $size := $ ?? $.ast !! 0; make shortest($float, $ eq 'G' ?? 'E' !! 'e', $precision, $size, $pad); } method directive:sym($/) { my $int := intify(next_argument($/)); $int := nqp::base_I($int, 8); my $pre := '0' if $int && has_flag($/, 'hash'); if nqp::chars($) { $int := '' if $.ast == 0 && $int == 0; $int := $pre ~ infix_x('0', intify($.ast) - nqp::chars($int)) ~ $int; } else { $int := $pre ~ $int } make $int } method directive:sym($/) { my $string := next_argument($/); if nqp::chars($) && nqp::chars($string) > $.ast { $string := nqp::substr($string, 0, $.ast); } make $string } # XXX: Should we emulate an upper limit, like 2**64? # XXX: Should we emulate p5 behaviour for negative values passed to %u ? method directive:sym($/) { my $int := intify(next_argument($/)); if nqp::islt_I($int, $zero) { my $err := nqp::getstderr(); nqp::printfh($err, "negative value '" ~ $int ~ "' for %u in sprintf"); $int := 0; } # Go through tostr_I to avoid scientific notation. make nqp::tostr_I($int) } method directive:sym($/) { my $int := intify(next_argument($/)); $int := nqp::base_I($int, 16); my $pre := '0X' if $int && has_flag($/, 'hash'); if nqp::chars($) { $int := '' if $.ast == 0 && $int == 0; $int := $pre ~ infix_x('0', $.ast - nqp::chars($int)) ~ $int; } else { $int := $pre ~ $int } make $ eq 'x' ?? nqp::lc($int) !! $int } method escape:sym<%>($/) { make '%' } method literal($/) { make ~$/ } method idx($/) { my $index := $ - 1; nqp::die("Parameter index starts to count at 1 but 0 was passed") if $index < 0; make $index } method size($/) { make $ ?? next_argument({}) !! ~$/ } } my $actions := Actions.new(); sub sprintf($format, @arguments) { my @*ARGS_HAVE := @arguments; $assert_used_args := 1; return Syntax.parse( $format, :actions($actions) ).ast; } nqp::bindcurhllsym('sprintf', &sprintf); class Directives { method TOP($/) { my $count := 0; $count := nqp::add_i($count, $_.ast) for $; make $count } method statement($/) { make $ && !$ ?? 1 !! 0 } } my $directives := Directives.new(); sub sprintfdirectives($format) { return Syntax.parse( $format, :actions($directives) ).ast; } nqp::bindcurhllsym('sprintfdirectives', &sprintfdirectives); sub sprintfaddargumenthandler($interface) { @handlers.push($interface); "Added!"; # return meaningless string } nqp::bindcurhllsym('sprintfaddargumenthandler', &sprintfaddargumenthandler); } nqp-2013.12.1/src/NQP/000077500000000000000000000000001225523575400140565ustar00rootroot00000000000000nqp-2013.12.1/src/NQP/Actions.nqp000066400000000000000000002025511225523575400162030ustar00rootroot00000000000000class NQP::Actions is HLL::Actions { sub xblock_immediate($xblock) { $xblock[1] := block_immediate($xblock[1]); $xblock; } sub block_immediate($block) { $block.blocktype('immediate'); unless $block.symtable() { my $stmts := QAST::Stmts.new( :node($block.node) ); for $block.list { $stmts.push($_); } $block := $stmts; } $block; } sub default_for($sigil) { if $sigil eq '@' { QAST::Op.new( :op('list') ) } elsif $sigil eq '%' { QAST::Op.new( :op('hash') ) } else { my $default; try { $default := QAST::WVal.new( :value($*W.find_sym(['NQPMu'])) ); CATCH { $default := QAST::Op.new( :op('null') ) } } $default } } sub default_value_for_prim($prim) { $prim == 1 ?? QAST::IVal.new( :value(0) ) !! $prim == 2 ?? QAST::NVal.new( :value(0.0) ) !! QAST::SVal.new( :value('') ) } method TOP($/) { make $.ast; } method deflongname($/) { make $ ?? ~$ ~ ':' ~ $.ast.named ~ '<' ~ colonpair_str($.ast) ~ '>' !! ~$/; } sub colonpair_str($ast) { if nqp::istype($ast, QAST::Op) { my @parts; for $ast.list { @parts.push($_.value) } join(' ', @parts) } else { $ast.value } } method comp_unit($/) { my $mainline := $.ast; my $unit := $*W.pop_lexpad(); # If our caller wants to know the mainline ctx, provide it here. # (CTXSAVE is inherited from HLL::Actions.) Don't do this when # there was an explicit {YOU_ARE_HERE}. unless $*HAS_YOU_ARE_HERE { $unit.push( self.CTXSAVE() ); } # Detect if we're the main unit by if we were given any args. If so, # register the mainline as a module (so trying to use ourself in the # program will not explode). If we have a MAIN sub, call it at end of # mainline. $unit.unshift(QAST::Var.new( :scope('lexical'), :name('@ARGS'), :decl('param'), :slurpy(1) )); if $*MAIN_SUB { $mainline.push(QAST::Op.new( :op('if'), QAST::Var.new( :scope('lexical'), :name('@ARGS') ), QAST::Op.new( :op('call'), :name('&' ~ $*MAIN_SUB.name), QAST::Var.new( :scope('lexical'), :name('@ARGS'), :flat(1) ) ) )); } # Push mainline statements into UNIT. $unit.push($mainline); # Load the needed libraries. $unit.push($*W.libs()); # Wrap everything in a QAST::CompUnit. my $compunit := QAST::CompUnit.new( :hll('nqp'), # Serialization related bits. :sc($*W.sc()), :code_ref_blocks($*W.code_ref_blocks()), :compilation_mode($*W.is_precompilation_mode()), :pre_deserialize($*W.load_dependency_tasks()), :post_deserialize($*W.fixup_tasks()), # If this unit is loaded as a module, we want it to automatically # execute the mainline code above after all other initializations # have occurred. :load(QAST::Op.new( :op('call'), QAST::BVal.new( :value($unit) ) )), # If we're executed as the mainline, get the command line args # and pass them along. :main(QAST::Stmts.new( QAST::Op.new( :op('call'), QAST::BVal.new( :value($unit) ), QAST::Var.new( :name('ARGS'), :scope('local'), :decl('param'), :slurpy(1), :flat(1) ) ) )), # Finally, UNIT, which in turn contains all of the other program # elements. $unit ); $*W.cleanup(); make $compunit; } method statementlist($/) { my $past := QAST::Stmts.new( :node($/) ); if $ { for $ { my $ast := $_.ast; $ast := $ast if nqp::defined($ast); if $ast { $ast := block_immediate($ast[0]); } $ast := QAST::Stmts.new($ast) if nqp::istype($ast, QAST::Node); $past.push( $ast ); } } else { $past.push(default_for('$')); } make $past; } method statement($/, $key?) { my $past; if $ { my $mc := $; my $ml := $; $past := $.ast; if $mc { $past := QAST::Op.new($mc.ast, $past, :op(~$mc), :node($/) ); } if $ml { if ~$ml eq 'for' { $past := QAST::Block.new( :blocktype('immediate'), QAST::Var.new( :name('$_'), :scope('lexical'), :decl('param') ), $past); $past.symbol('$_', :scope('lexical') ); $past.arity(1); $past := QAST::Op.new($ml.ast, $past, :op(~$ml), :node($/) ); } else { $past := QAST::Op.new($ml.ast, $past, :op(~$ml), :node($/) ); } } if $past { # Variable declared and unconditionally initialized; can strip # the added just-to-be-safe initialization of the lexical and # just have the var decl. my $decls := $*W.cur_lexpad()[0]; $decls.push($decls.pop()[0]); # First child of bind node is var decl } } elsif $ { $past := $.ast; } elsif $ { $past := $.ast; } else { $past := 0; } make $past; } method xblock($/) { make QAST::Op.new( $.ast, $.ast, :op('if'), :node($/) ); } method pblock($/) { make $.ast; } method block($/) { make $.ast; } method blockoid($/) { my $BLOCK := $*W.pop_lexpad(); if $ { my $past := $.ast; if %*HANDLERS { $past := QAST::Op.new( :op('handle'), $past ); for %*HANDLERS { $past.push($_.key); $past.push($_.value); } } $BLOCK.push($past); $BLOCK.node($/); $BLOCK := %*HANDLERS if %*HANDLERS; make $BLOCK; } else { if $*HAS_YOU_ARE_HERE { $/.CURSOR.panic('{YOU_ARE_HERE} may only appear once in a setting'); } $*HAS_YOU_ARE_HERE := 1; make $.ast; } } method newpad($/) { $*W.push_lexpad($/) } method outerctx($/) { unless nqp::defined(%*COMPILING<%?OPTIONS>) { # We haven't got a specified outer context already, so load a # setting. my $SETTING := $*W.load_setting(%*COMPILING<%?OPTIONS> // 'NQPCORE'); # If it exports HOWs, grab them. Also, if we're loading the # setting, also by default load Regex library (we can't load # this in the setting as Regex depends on the setting). unless %*COMPILING<%?OPTIONS> eq 'NULL' { import_HOW_exports($SETTING); unless %*COMPILING<%?OPTIONS> { if %*COMPILING<%?OPTIONS> -> $lib { $*W.load_module($lib, $*GLOBALish); } else { $*W.load_module('NQPP6QRegex', $*GLOBALish); } } } } self.SET_BLOCK_OUTER_CTX($*W.cur_lexpad()); } sub import_HOW_exports($UNIT) { # See if we've exported any HOWs. if nqp::existskey($UNIT, 'EXPORTHOW') { for $UNIT.WHO { %*HOW{$_.key} := $_.value; } } } method you_are_here($/) { make self.CTXSAVE(); } ## Statement control method statement_control:sym($/) { my $module := $*W.load_module(~$, $*GLOBALish); if nqp::defined($module) { $*W.import($module.WHO.WHO) if nqp::existskey($module, 'EXPORT') && nqp::existskey($module.WHO, 'DEFAULT'); import_HOW_exports($module); } make QAST::Stmts.new(); } method statement_control:sym($/) { my $count := +$ - 1; my $past := xblock_immediate( $[$count].ast ); if $ { $past.push( block_immediate( $.ast ) ); } # build if/then/elsif structure while $count > 0 { $count--; my $else := $past; $past := xblock_immediate( $[$count].ast ); $past.push($else); } make $past; } method statement_control:sym($/) { my $past := xblock_immediate( $.ast ); $past.op('unless'); make $past; } method statement_control:sym($/) { my $past := xblock_immediate( $.ast ); $past.op(~$); unless $*CONTROL_USED { $past.push(QAST::IVal.new( :value(1), :named('nohandler') )); } make $past; } method statement_control:sym($/) { my $op := 'repeat_' ~ ~$; my $past; if $ { $past := xblock_immediate( $.ast ); $past.op($op); } else { $past := QAST::Op.new( $.ast, block_immediate( $.ast ), :op($op), :node($/) ); } unless $*CONTROL_USED { $past.push(QAST::IVal.new( :value(1), :named('nohandler') )); } make $past; } method statement_control:sym($/) { my $past := $.ast; $past.op('for'); my $block := $past[1]; unless $block.arity { $block[0].push( QAST::Var.new( :name('$_'), :scope('lexical'), :decl('param') ) ); $block.symbol('$_', :scope('lexical') ); $block.arity(1); } $block.blocktype('immediate'); unless $*CONTROL_USED { $past.push(QAST::IVal.new( :value(1), :named('nohandler') )); } make $past; } method statement_control:sym($/) { my $block := $.ast; set_block_handler($/, $block, 'CATCH'); make default_for('$'); } method statement_control:sym($/) { my $block := $.ast; set_block_handler($/, $block, 'CONTROL'); make default_for('$'); } sub set_block_handler($/, $block, $type) { if nqp::existskey(%*HANDLERS, $type) { nqp::die("Duplicate $type handler in block"); } unless $block.arity { $block.unshift( QAST::Op.new( :op('bind'), QAST::Var.new( :scope('lexical'), :name('$!'), :decl('var') ), QAST::Var.new( :scope('lexical'), :name('$_')), ), ); $block.unshift(QAST::Var.new( :name('$_'), :scope('lexical'), :decl('param') )); $block.symbol('$_', :scope('lexical') ); $block.symbol('$!', :scope('lexical') ); $block.arity(1); } $block.blocktype('declaration'); %*HANDLERS{$type} := QAST::Stmts.new( QAST::Op.new( :op('call'), $block, QAST::Op.new( :op('exception') ), ), QAST::VM.new( :parrot(QAST::Op.new( :op('bindkey_i'), QAST::Op.new( :op('exception') ), QAST::SVal.new( :value('handled') ), QAST::IVal.new( :value(1) ) )), :jvm(QAST::Op.new( :op('null') )), :moar(QAST::Op.new( :op('null') )) ), default_for('$')); } method statement_prefix:sym($/) { make $*W.run_begin_block($.ast); } method statement_prefix:sym($/) { $*W.cur_lexpad().push($.ast); make QAST::Stmts.new(); } method statement_prefix:sym($/) { my $past := $.ast; if nqp::istype($past, QAST::Block) { if $past && nqp::existskey($past, 'CATCH') { make $past; return 1; } else { $past.blocktype('immediate'); } } make QAST::Op.new( :op('handle'), $past, 'CATCH', QAST::Stmts.new( QAST::VM.new( :parrot(QAST::Op.new( :op('bindkey_i'), QAST::Op.new( :op('exception') ), QAST::SVal.new( :value('handled') ), QAST::IVal.new( :value(1) ) )), :jvm(QAST::Op.new( :op('null') )), :moar(QAST::Op.new( :op('null') )) ), default_for('$') )); } method blorst($/) { make $ ?? block_immediate($.ast) !! $.ast; } # Statement modifiers method statement_mod_cond:sym($/) { make $.ast; } method statement_mod_cond:sym($/) { make $.ast; } method statement_mod_loop:sym($/) { make $.ast; } method statement_mod_loop:sym($/) { make $.ast; } ## Terms method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method term:sym($/) { make QAST::Op.new( :op('takeclosure'), $.ast ); } method fatarrow($/) { my $past := $.ast; $past.named( $.Str ); make $past; } method colonpair($/) { if $ { $.ast.named(~$); make $.ast; } else { my $past := $ ?? $.ast !! QAST::IVal.new( :value( !$ ) ); $past.named( ~$ ); make $past; } } method variable($/) { my $past; if $ { $past := $.ast; $past.unshift(QAST::VarWithFallback.new( :name('$/'), :scope('lexical'), :fallback(default_for('$')) )); } else { my @name := NQP::Compiler.parse_name(~$/); if +@name > 1 { if $ { $/.CURSOR.panic("Twigil not allowed on multi-part name"); } $past := lexical_package_lookup(@name, $/); } elsif $ eq '*' { my $global_fallback := QAST::Op.new( :op('ifnull'), lexical_package_lookup(['GLOBAL', ~$ ~ $], $/), QAST::Op.new( :op('die_s'), QAST::SVal.new( :value('Contextual ' ~ ~$/ ~ ' not found') ) )); $past := QAST::VarWithFallback.new( :name(~@name.pop), :scope('contextual'), :fallback($global_fallback) ); } elsif $ eq '!' { my $name := ~@name.pop; my $ch; if $*PKGDECL eq 'role' { $ch := QAST::Var.new( :name('$?CLASS'), :scope('lexical') ); $ch.set_compile_time_value($*PACKAGE); } else { $ch := QAST::WVal.new( :value($*PACKAGE) ); } $past := QAST::Var.new( :name($name), :scope('attribute'), QAST::Op.new( :op('decont'), QAST::Var.new( :name('self'), :scope('lexical') ) ), $ch ); # Make sure the attribute exists and add type info. unless $*IN_DECL { my $attr; for $*PACKAGE.HOW.attributes($*PACKAGE, :local(1)) { if $_.name eq $name { $attr := $_; last; } } if nqp::defined($attr) { if nqp::can($attr, 'type') { $past.returns($attr.type); } } else { $/.CURSOR.panic("Attribute '$name' not declared"); } } } elsif $ { my $name := ~$ eq '@' ?? 'list' !! ~$ eq '%' ?? 'hash' !! 'item'; $past := QAST::Op.new( :op('callmethod'), :name($name), $.ast ); } elsif $*W.is_package(~@name[0]) { $past := lexical_package_lookup(@name, $/); $past.fallback( default_for( $ ) ); } else { my $name := ~@name.pop; if $*IN_DECL eq 'variable' || $name eq '$_' || $name eq '$/' || $name eq '$!' || $ eq '?' || $*W.is_lexical($name) { $past := QAST::Var.new( :name($name), :scope('lexical') ); } else { $/.CURSOR.panic("Use of undeclared variable '$name'"); } } } make $past; } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { make $.ast } method package_declarator:sym($/) { # Construct meta-object with specified metaclass, adding it to the # serialization context for this compilation unit. my $HOW := $*W.find_sym($); my $PACKAGE := $*W.pkg_create_mo($HOW, :name(~$)); # Install it in the current package or current lexpad as needed. if $*SCOPE eq 'our' || $*SCOPE eq '' { $*W.install_package_symbol($*OUTERPACKAGE, $, $PACKAGE); if +$ == 1 { $*W.install_lexical_symbol($*W.cur_lexpad(), $[0], $PACKAGE); } } elsif $*SCOPE eq 'my' { if +$ != 1 { $.CURSOR.panic("A my scoped package cannot have a multi-part name yet"); } $*W.install_lexical_symbol($*W.cur_lexpad(), $[0], $PACKAGE); } else { $/.CURSOR.panic("$*SCOPE scoped packages are not supported"); } make QAST::Stmts.new(); } method package_def($/) { # Get name and meta-object. my @ns := nqp::clone($); my $name := ~@ns.pop; my $how := %*HOW{$*PKGDECL}; # Get the body code. my $past; if $ { $past := $.ast; } else { $past := $*W.pop_lexpad(); $past.push($.ast); } # Evaluate everything in the package in-line unless this is a generic # type in which case it needs delayed evaluation. Normally, $?CLASS is # a fixed lexical, but for generic types it becomes a parameter. Also # for parametric types, pass along the role body block. if nqp::can($how, 'parametric') && $how.parametric($how) { $past.blocktype('declaration_static'); my $params := QAST::Stmts.new( QAST::Var.new( :name('$?CLASS'), :scope('lexical'), :decl('param') ) ); if $ { for $ { $params.push($_.ast); } } $past.unshift($params); $past.push(QAST::Op.new( :op('curlexpad') )); $past.symbol('$?CLASS', :scope('lexical')); $*W.pkg_set_body_block($*PACKAGE, $past); } else { $past.blocktype('immediate'); } # Add parent, if we have one; otherwise set default. if $ { my $parent; my $parent_found; try { $parent := $*W.find_sym(nqp::clone($)); $parent_found := 1; } if $parent_found { $*W.pkg_add_parent_or_role($*PACKAGE, "add_parent", $parent); } else { $/.CURSOR.panic("Could not find parent class '" ~ ~$ ~ "'"); } } elsif nqp::can($how, 'set_default_parent') { my $default := $*PKGDECL eq 'grammar' ?? ['NQPCursor'] !! ['NQPMu']; $*W.pkg_add_parent_or_role($*PACKAGE, "set_default_parent", $*W.find_sym($default)); } # Add any done roles. if $ { for $ { my $role; my $role_found; try { $role := $*W.find_sym(nqp::clone($_)); $role_found := 1; } if $role_found { $*W.pkg_add_parent_or_role($*PACKAGE, "add_role", $role); } else { $/.CURSOR.panic("Could not find role '" ~ ~$_ ~ "'"); } } } # Finally, compose. $*W.pkg_compose($*PACKAGE); # If it's a grammar, pre-compute the NFAs. if $*PKGDECL eq 'grammar' && nqp::can($*PACKAGE, '!precompute_nfas') { $*PACKAGE.'!precompute_nfas'(); } # Export if needed. if $ { $*EXPORT.WHO.WHO{$name} := $*PACKAGE; } make $past; } method role_params($/) { for $ { my $var := $_.ast; $var.scope('lexical'); $var.decl('param'); $*W.cur_lexpad().symbol($var.name, :scope('lexical')); } } method scope_declarator:sym($/) { make $.ast; } method scope_declarator:sym($/) { make $.ast; } method scope_declarator:sym($/) { make $.ast; } method scoped($/) { make $ ?? $.ast !! $ ?? $.ast !! $.ast; } method declarator($/) { make $ ?? $.ast !! $.ast; } method multi_declarator:sym($/) { make $ ?? $.ast !! $.ast } method multi_declarator:sym($/) { make $ ?? $.ast !! $.ast } method multi_declarator:sym($/) { make $.ast } method variable_declarator($/) { my $past := $.ast; my $sigil := $; my $name := $past.name; my $BLOCK := $*W.cur_lexpad(); my $*DECLARAND_ATTR; if $name && $BLOCK.symbol($name) { $/.CURSOR.panic("Redeclaration of symbol ", $name); } if $*SCOPE eq 'has' { # Initializer not allowed. if $ { $/.CURSOR.panic('Initiailizers not supported on has-scoped variables'); } # Locate the type of meta-attribute we need. unless nqp::existskey(%*HOW, $*PKGDECL ~ '-attr') { $/.CURSOR.panic("$*PKGDECL packages do not support attributes"); } # Set up arguments for meta-attribute instantiation. my %lit_args; my %obj_args; %lit_args := $name; if $ { %obj_args := $*W.find_sym([~$]); } if $sigil eq '$' || $sigil eq '&' { if $ { %obj_args := %obj_args; } else { try %obj_args := $*W.find_sym(['NQPMu']); } } # Add it. $*DECLARAND_ATTR := $*W.pkg_add_attribute($*PACKAGE, %*HOW{$*PKGDECL ~ '-attr'}, %lit_args, %obj_args); $past := QAST::Stmts.new(); } elsif $*SCOPE eq 'our' { # Depending on if this was already considered our scoped, # we may or may not have got a node in $var that's set up # right already. We build it here just to be sure. if $ { $/.CURSOR.panic("Cannot put types on our-scoped variables"); } $name := ~$; $past := lexical_package_lookup([$name], $/); $BLOCK.symbol($name, :scope('package') ); if $ { $past := QAST::Op.new( :op('bind'), $past, $.ast ); } } else { my $type; my $default; if $ { unless $sigil eq '$' { $/.CURSOR.panic("Only typed scalars are currently supported in NQP"); } $type := $*W.find_sym([~$]); if nqp::objprimspec($type) -> $prim_spec { $default := default_value_for_prim($prim_spec); } else { $/.CURSOR.panic("Only native types are currently supported/checked"); } } else { $default := default_for($sigil); } $BLOCK[0].push(QAST::Op.new( :op('bind'), :node($/), QAST::Var.new( :name($name), :scope('lexical'), :decl('var'), :returns($type) ), $default )); if $ { $past := QAST::Op.new( :op('bind'), :node($/), $past, $.ast ); $past := 1; } $BLOCK.symbol($name, :scope('lexical'), :type($type) ); } # Apply traits. if $ { for $ { $_.ast()($/); } } make $past; } method initializer($/) { make $.ast; } method routine_declarator:sym($/) { make $.ast; } method routine_declarator:sym($/) { make $.ast; } method routine_def($/) { # If it's just got * as a body, make a multi-dispatch enterer. # Otherwise, need to build a sub. my $past; if $ { $past := only_star_block(); } else { $past := $.ast; if $*RETURN_USED { $past[1] := wrap_return_handler($past[1]); } } $past.blocktype('declaration'); my $block := $past; if $ { my $name := ~$ ~ $.ast; $past.name($name); if $*SCOPE eq '' || $*SCOPE eq 'my' || $*SCOPE eq 'our' { if $*MULTINESS eq 'multi' { # Does the current block have a proto? if $*SCOPE eq 'our' { nqp::die('a multi can not be our-scoped') } my $proto; my %sym := $*W.cur_lexpad().symbol('&' ~ $name); if %sym { $proto := %sym; } # Otherwise, no candidate holder, so add one. else { # Check we have a proto in scope. my $found_proto; for $*W.get_legacy_block_list() { my %sym := $_.symbol('&' ~ $name); if %sym { $proto := %sym; $found_proto := 1; } elsif %sym { $/.CURSOR.panic("Cannot declare a multi when an only is already in scope."); } } # If we didn't find a proto, error for now. unless $found_proto { $/.CURSOR.panic("Sorry, no proto sub in scope, and auto-generation of protos is not yet implemented."); } # Set up dispatch routine in this scope. nqp::die("Dispatcher derivation NYI"); } # Create a code object and attach the signature. my $code := $*W.create_code($past, $name, 0); attach_multi_signature($code, $past); # Add this candidate to the proto. $proto.add_dispatchee($code); # Ensure we emit the code block. # XXX We'll mark it static so the code object inside the # proto is captured correctly. Technically this is wrong, # as the multi may be nested in another sub. $past.blocktype('declaration_static'); my $BLOCK := $*W.cur_lexpad(); $BLOCK[0].push($past); } elsif $*MULTINESS eq 'proto' { # Create a candidate list holder for the dispatchees # this proto will work over, and install them along # with the proto. if $*SCOPE eq 'our' { nqp::die('our-scoped protos not yet implemented') } my $code := $*W.create_code($past, $name, 1); my $BLOCK := $*W.cur_lexpad(); $BLOCK[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('&' ~ $name), :scope('lexical'), :decl('var') ), $past )); $BLOCK.symbol('&' ~ $name, :scope('lexical'), :proto(1), :value($code), :declared(1) ); # Also stash the current lexical dispatcher and capture, for the {*} # to resolve. $block[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('CURRENT_DISPATCH_CAPTURE'), :scope('lexical'), :decl('var') ), QAST::Op.new( :op('savecapture') ) )); $block[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('&*CURRENT_DISPATCHER'), :scope('lexical'), :decl('var') ), QAST::Op.new( :op('getcodeobj'), QAST::Op.new( :op('curcode') ) ) )); } else { my $BLOCK := $*W.cur_lexpad(); $BLOCK[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('&' ~ $name), :scope('lexical'), :decl('var') ), $past )); $BLOCK.symbol('&' ~ $name, :scope('lexical'), :declared(1)); if $*SCOPE eq 'our' { # Need to install it at loadinit time but also re-bind # it per invocation. $*W.install_package_routine($*PACKAGE, $name, $past); $BLOCK[0].push(QAST::Op.new( :op('bind'), lexical_package_lookup([$name], $/), QAST::Var.new( :name('&' ~ $name), :scope('lexical') ) )); # Static code object needs re-capturing also, as it's # our-scoped. $past.blocktype('declaration_static'); # Also need to make sure it gets a code object so it's # in the SC. $*W.create_code($past, $name, 0); } } $past := QAST::Var.new( :name('&' ~ $name), :scope('lexical') ); } else { $/.CURSOR.panic("$*SCOPE scoped routines are not supported yet"); } # Is it the MAIN sub? if $name eq 'MAIN' && $*MULTINESS ne 'multi' { $*MAIN_SUB := $block; } } else { if $*W.is_precompilation_mode() { $*W.create_code($past, '', 0) } } my $lexpast := QAST::Op.new( :op('takeclosure'), $past ); $lexpast := $past; $lexpast := $block; make $lexpast; # Apply traits. if $ { for $ { $_.ast()($/); } } } method method_def($/) { # If it's just got * as a body, make a multi-dispatch enterer. # Otherwise, build method block QAST. my $past; if $ { $past := only_star_block(); } else { $past := $.ast; if $*RETURN_USED { $past[1] := wrap_return_handler($past[1]); } } $past.blocktype('declaration_static'); # Always need an invocant. unless $past { $past[0].unshift(QAST::Var.new( :name('self'), :scope('lexical'), :decl('param'), :returns($*PACKAGE) )); } $past.symbol('self', :scope('lexical') ); # Install it where it should go (methods table / namespace). my $name := ""; if $ { $name := ~$ ~ ~$.ast; } elsif $ { if $*PKGDECL ne 'role' { $/.CURSOR.panic("Late-bound method name only valid in role"); } $name := "!!LATENAME!!" ~ ~$; } if $name ne "" { # Set name. $past.name($name); # Insert it into the method table. my $meta_meth := $*MULTINESS eq 'multi' ?? 'add_multi_method' !! 'add_method'; my $is_dispatcher := $*MULTINESS eq 'proto'; my $code := $*W.create_code($past, $name, $is_dispatcher); if $*MULTINESS eq 'multi' { attach_multi_signature($code, $past); } $*W.pkg_add_method($*PACKAGE, $meta_meth, $name, $code); $past := $code; # Install it in the package also if needed. if $*SCOPE eq 'our' { $*W.install_package_routine($*PACKAGE, $name, $past); } # If it's a proto, also stash the current lexical dispatcher, for the {*} # to resolve. if $is_dispatcher { $past[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('CURRENT_DISPATCH_CAPTURE'), :scope('lexical'), :decl('var') ), QAST::Op.new( :op('savecapture') ) )); $past[0].push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('&*CURRENT_DISPATCHER'), :scope('lexical'), :decl('var') ), QAST::Op.new( :op('getcodeobj'), QAST::Op.new( :op('curcode') ) ) )); } } # Install AST node in match object, then apply traits. my $lexpast := QAST::Op.new( :op('takeclosure'), $past ); $lexpast := $past; $lexpast := $past; $lexpast := $past; make $lexpast; if $ { for $ { $_.ast()($/); } } } sub only_star_block() { my $past := $*W.pop_lexpad(); $past.push(QAST::Op.new( :op('invokewithcapture'), QAST::Op.new( :op('ifnull'), QAST::Op.new( :op('multicachefind'), QAST::Var.new( :name('$!dispatch_cache'), :scope('attribute'), QAST::Op.new( :op('getcodeobj'), QAST::Op.new( :op('curcode') ) ), QAST::WVal.new( :value($*W.find_sym(['NQPRoutine'])) ), ), QAST::Op.new( :op('usecapture') ) ), QAST::Op.new( :op('callmethod'), :name('dispatch'), QAST::Op.new( :op('getcodeobj'), QAST::Op.new( :op('curcode') ) ), QAST::Op.new( :op('savecapture') ) ) ), QAST::Op.new( :op('usecapture') ) )); $past } sub attach_multi_signature($code_obj, $routine) { my $types := nqp::list(); my $definednesses := nqp::list(); for @($routine[0]) { if nqp::istype($_, QAST::Var) && $_.decl eq 'param' && !$_.named { $types.push($_.returns =:= NQPMu ?? nqp::null() !! $_.returns); $definednesses.push($_ eq 'D' ?? 1 !! $_ eq 'U' ?? 2 !! 0); } } $*W.set_routine_signature($code_obj, $types, $definednesses); } sub wrap_return_handler($past) { QAST::Op.new( :op, :name, $past ) } method signature($/) { my $BLOCK := $*W.cur_lexpad(); my $BLOCKINIT := $BLOCK[0]; if $ { my $inv := $.ast; $BLOCKINIT.push($inv); $BLOCKINIT.push(QAST::Op.new( :op('bind'), QAST::Var.new( :name('self'), :scope('lexical'), :decl('var') ), QAST::Var.new( :scope('lexical'), :name($inv.name) ) )); $BLOCK := 1 } if $ { for $ { $BLOCKINIT.push($_.ast); } } } method parameter($/) { my $quant := $; my $past; if $ { $past := $.ast; if $quant ne '!' { $past.default( default_for($) ); } } else { $past := $.ast; if $quant eq '*' { $past.slurpy(1); $past.named( $ eq '%' ); } elsif $quant eq '?' { $past.default( default_for($) ); } } if $ { if $quant eq '*' { $/.CURSOR.panic("Can't put default on slurpy parameter"); } if $quant eq '!' { $/.CURSOR.panic("Can't put default on required parameter"); } $past.default( $[0].ast ); } unless $past.default { $*W.cur_lexpad().arity( +$*W.cur_lexpad().arity + 1 ); } # Set the type of the parameter. if $ { my $type := $[0].ast.value; $past.returns($type); if nqp::objprimspec($type) -> $prim { $*W.cur_lexpad().symbol($past.name, :type($type)); if $past.default && !$ { $past.default(default_value_for_prim($prim)); } } } # Set definedness flag (XXX want a better way to do this). if $ { $past := ~$[0]; } make $past; } method param_var($/) { my $name := ~$/; my $past := QAST::Var.new( :name($name), :scope('lexical'), :decl('param'), :node($/) ); $*W.cur_lexpad().symbol($name, :scope('lexical') ); make $past; } method named_param($/) { my $past := $.ast; $past.named( ~$ ); make $past; } method typename($/) { # Try to locate the symbol. We'll emit a lookup via the SC so # the scope we emit code to do the symbol lookup in won't matter, # and so we can complain about non-existent type names. my @name := HLL::Compiler.parse_name(~$/); my $found := 0; try { my $sym := $*W.find_sym(@name); make QAST::WVal.new( :value($sym) ); $found := 1; } unless $found { $/.CURSOR.panic("Use of undeclared type '" ~ ~$/ ~ "'"); } } method trait($/) { make $.ast; } method trait_mod:sym($/) { if $ eq 'parrot_vtable' { # XXX This should be in Parrot-specific module and need a pragma. my $cpast := $[0].ast; $/.CURSOR.panic("Trait 'parrot_vtable' requires constant scalar argument") unless $cpast ~~ QAST::SVal; my $name := $cpast.value; my $package := $*PACKAGE; my $is_dispatcher := $*SCOPE eq 'proto'; make -> $match { $*W.pkg_add_method($package, 'add_parrot_vtable_mapping', $name, $match.ast // $*W.create_code($match.ast, $name, $is_dispatcher)); }; } elsif $ eq 'parrot_vtable_handler' { # XXX This should be in Parrot-specific module and need a pragma. my $cpast := $[0].ast; $/.CURSOR.panic("Trait 'parrot_vtable_handler' requires constant scalar argument") unless $cpast ~~ QAST::SVal; my $name := $cpast.value; my $package := $*PACKAGE; make -> $match { $*W.pkg_add_parrot_vtable_handler_mapping($package, $name, ~$match); }; } elsif $ eq 'positional_delegate' { make -> $m { $*DECLARAND_ATTR.set_positional_delegate(1) }; } elsif $ eq 'associative_delegate' { make -> $m { $*DECLARAND_ATTR.set_associative_delegate(1) }; } elsif $ eq 'export' { make -> $match { my $ast := $match.ast; my $name := $ast.name; $*EXPORT.WHO.WHO{'&' ~ $name} := $ast // $*W.create_code($ast, $name, 0); }; } else { $/.CURSOR.panic("Trait '$' not implemented"); } } method regex_declarator($/, $key?) { my $name; if $ { $name := ~$.ast; } else { if $*PKGDECL ne 'role' { $/.CURSOR.panic("Late-bound method name only valid in role"); } $name := "!!LATENAME!!" ~ ~$; } my $past; if $ { $past := QAST::Block.new( :name($name), QAST::Op.new( QAST::Var.new( :name('self'), :scope('local'), :decl('param') ), QAST::SVal.new( :value($name) ), :name('!protoregex'), :op('callmethod') ), :blocktype('declaration_static'), :node($/) ); $*W.pkg_add_method($*PACKAGE, 'add_method', $name, $*W.create_code($past, $name, 0, :code_type_name)); } else { my $block := $*W.pop_lexpad(); $block[0].unshift(QAST::Var.new(:name, :scope, :decl)); $block[0].push(QAST::Op.new( :op('bind'), QAST::Var.new(:name, :scope, :decl ), QAST::Var.new( :name, :scope('lexical') ))); $block[0].push(QAST::Var.new(:name<$¢>, :scope, :decl)); $block[0].push(QAST::Var.new(:name<$/>, :scope, :decl)); $block.symbol('$¢', :scope); $block.symbol('$/', :scope); my $code := %*RX; my $regex := %*LANG.qbuildsub($.ast, $block, code_obj => $code); $regex.name($name); if $*PKGDECL && nqp::can($*PACKAGE.HOW, 'add_method') { # Add the actual method, marking it as a static declaration # since it's reachable through the method table. $block.blocktype('declaration_static'); $*W.pkg_add_method($*PACKAGE, 'add_method', $name, $code); } # If this appears in a role, its NFA may depend on generic args. # If it does, we store the generic version of it. if $*PKGDECL eq 'role' { my $gen_nfa := QRegex::NFA.new(); $gen_nfa.addnode($.ast, :vars_as_generic); if $gen_nfa.generic { $code.SET_GENERIC_NFA($gen_nfa); } } # In sink context, we don't need the Regex::Regex object. $past := QAST::Op.new( :op, :name, lexical_package_lookup(['NQPRegexMethod'], $/), $regex); $past := $regex; } make $past; } method dotty($/) { my $past := $ ?? $[0].ast !! QAST::Op.new( :node($/) ); if $ { $past.unshift($.ast); $past.op('callmethod'); } elsif $ eq 'HOW' { $past.op('how'); } elsif $ eq 'WHAT' { $past.op('what'); } elsif $ eq 'WHO' { $past.op('who'); } elsif $ eq 'REPR' { $past.op('reprname'); } else { $past.name(~$); $past.op('callmethod'); } make $past; } ## Terms method term:sym($/) { make QAST::Op.new( :op('decont'), QAST::Var.new( :name('self'), :scope('lexical') ) ); } method term:sym($/) { my $past := $.ast; $past.name('&' ~ ~$); make $past; } method term:sym($/) { # See if it's a lexical symbol (known in any outer scope). my $var; if $*W.is_lexical(~$) { unless $ { try { my $sym := $*W.find_sym([~$]); unless nqp::isnull(nqp::getobjsc($sym)) { $var := QAST::WVal.new( :value($sym) ); } } } unless $var { $var := QAST::Var.new( :name(~$), :scope('lexical') ); } } else { my @ns := nqp::clone($); unless $ { try { my $sym := $*W.find_sym(@ns); unless nqp::isnull(nqp::getobjsc($sym)) { $var := QAST::WVal.new( :value($sym) ); } } } unless $var { $var := lexical_package_lookup(@ns, $/); } } # If it's a call, add the arguments. my $past := $var; if $ { $past := $[0].ast; $past.unshift($var); } make $past; } method term:sym($/) { my @args := $ ?? $[0].ast.list !! []; my $pirop := ~$; $pirop := join(' ', nqp::split('__', $pirop)); make QAST::VM.new( :pirop($pirop), :node($/), |@args ); } method term:sym($/) { make QAST::VM.new( :pirconst(~$) ); } method term:sym($/) { my $op := ~$; my @args := $ ?? $[0].ast.list !! []; my $past := QAST::Op.new( :op($op), |@args, :node($/) ); make $past; } method term:sym($/) { make QAST::Op.new( :op('const'), :name(~$) ); } method term:sym($/) { my $dc_name := QAST::Node.unique('dispatch_cap'); my $stmts := QAST::Stmts.new( QAST::Op.new( :op('bind'), QAST::Var.new( :name($dc_name), :scope('local'), :decl('var') ), QAST::Var.new( :name('CURRENT_DISPATCH_CAPTURE'), :scope('lexical') ) ), QAST::Op.new( :op('invokewithcapture'), QAST::Op.new( :op('ifnull'), QAST::Op.new( :op('multicachefind'), QAST::Var.new( :name('$!dispatch_cache'), :scope('attribute'), QAST::Var.new( :name('&*CURRENT_DISPATCHER'), :scope('lexical') ), QAST::WVal.new( :value($*W.find_sym(['NQPRoutine'])) ), ), QAST::Var.new( :name($dc_name), :scope('local') ) ), QAST::Op.new( :op('callmethod'), :name('dispatch'), QAST::Var.new( :name('&*CURRENT_DISPATCHER'), :scope('lexical') ), QAST::Var.new( :name($dc_name), :scope('local') ) ) ), QAST::Var.new( :name($dc_name), :scope('local') ) )); make QAST::Op.new( :op('locallifetime'), $stmts, $dc_name ); } method args($/) { make $.ast; } method arglist($/) { my $past := QAST::Op.new( :op('call'), :node($/) ); if $ { my $expr := $.ast; if nqp::istype($expr, QAST::Op) && $expr.name eq '&infix:<,>' && !$expr.named { for $expr.list { $past.push($_); } } else { $past.push($expr); } } my $i := 0; my $n := +$past.list; while $i < $n { if nqp::istype($past[$i], QAST::Op) && $past[$i].name eq '&prefix:<|>' { $past[$i] := $past[$i][0]; $past[$i].flat(1); $past[$i].named(1) if nqp::istype($past[$i], QAST::Var) && nqp::substr($past[$i].name, 0, 1) eq '%'; } $i++; } make $past; } method term:sym($/) { make $.ast; } method term:sym($/) { make $.ast; } method circumfix:sym<( )>($/) { make $ ?? $[0].ast !! QAST::Op.new( :op('list'), :node($/) ); } method circumfix:sym<[ ]>($/) { my $past; if $ { $past := $[0].ast; unless nqp::istype($past, QAST::Op) && $past.name eq '&infix:<,>' { $past := QAST::Op.new( $past, :op('list') ); } } else { $past := QAST::Op.new( :op('list') ); } $past.name('&circumfix:<[ ]>'); make $past; } method circumfix:sym($/) { make $.ast; } method circumfix:sym<« »>($/) { make $.ast; } method circumfix:sym<{ }>($/) { if +$ > 0 { my $past := QAST::Op.new( :op('takeclosure'), $.ast ); $past := 1; make $past; } elsif $ { make $.ast; } else { make default_for('%'); } } method semilist($/) { make $.ast } method postcircumfix:sym<[ ]>($/) { make QAST::VarWithFallback.new( :scope('positional'), $.ast, :fallback(default_for('$')) ); } method postcircumfix:sym<{ }>($/) { make QAST::VarWithFallback.new( :scope('associative'), $.ast, :fallback(default_for('$')) ); } method postcircumfix:sym($/) { make QAST::VarWithFallback.new( :scope('associative'), $.ast, :fallback(default_for('$')) ); } method postcircumfix:sym<( )>($/) { make $.ast; } method value($/) { make $ ?? $.ast !! $.ast; } method number($/) { my $value := $ ?? $.ast !! $.ast; if ~$ eq '-' { $value := -$value; } make $ ?? QAST::NVal.new( :value($value) ) !! QAST::IVal.new( :value($value) ); } method quote:sym($/) { make $.ast; } method quote:sym($/) { make $.ast; } method quote:sym($/) { make $.ast; } method quote:sym($/) { make $.ast; } method quote:sym($/) { make $.ast; } method quote:sym($/) { make QAST::VM.new( :pir( $.ast.value ), :node($/) ); } method quote:sym($/) { my $block := $*W.pop_lexpad(); $block[0].push(QAST::Var.new(:name, :scope, :decl)); $block[0].push(QAST::Op.new( :op('bind'), QAST::Var.new(:name, :scope, :decl('var') ), QAST::Var.new( :name, :scope('lexical') ))); $block[0].push(QAST::Var.new(:name<$¢>, :scope, :decl('var'))); $block[0].push(QAST::Var.new(:name<$/>, :scope, :decl('var'))); $block.symbol('$¢', :scope); $block.symbol('$/', :scope); my $regex := %*LANG.qbuildsub($.ast, $block); my $past := QAST::Op.new( :op, :name, lexical_package_lookup(['NQPRegex'], $/), $regex); # In sink context, we don't need the Regex::Regex object. $past := $regex; make $past; } method quote_escape:sym<$>($/) { make $.ast; } method quote_escape:sym<{ }>($/) { make QAST::Op.new( :op('stringify'), block_immediate($.ast), :node($/) ); } method quote_escape:sym($/) { make "\c[27]"; } ## Operators method postfix:sym<.>($/) { make $.ast; } method term:sym($/) { make QAST::Op.new( :op('call'), :name('RETURN'), $ ?? $.ast !! QAST::WVal.new( :value($*W.find_sym(['NQPMu'])) )); } method prefix:sym($/) { make QAST::Op.new( QAST::Var.new( :name('$/'), :scope('contextual') ), :op('callmethod'), :name('!make'), :node($/) ); } method term:sym($/) { make QAST::Op.new( :op('control'), :name('next') ) } method term:sym($/) { make QAST::Op.new( :op('control'), :name('last') ) } method term:sym($/) { make QAST::Op.new( :op('control'), :name('redo') ) } method infix:sym<~~>($/) { make QAST::Op.new( :op, :name, :node($/) ); } # Takes a multi-part name that we know is in a package and generates # QAST to look it up using NQP package semantics. sub lexical_package_lookup(@name, $/) { # Catch empty names and die helpfully. if +@name == 0 { $/.CURSOR.panic("Cannot compile empty name"); } # The final lookup will always be just a keyed access to a # symbol table. my $final_name := @name.pop(); my $lookup := QAST::VarWithFallback.new( :scope('associative'), QAST::SVal.new( :value(~$final_name) ) ); # If there's no explicit qualification, then look it up in the # current package, and fall back to looking in GLOBAL. if +@name == 0 { $lookup.unshift(QAST::Op.new( :op('who'), QAST::Var.new( :name('$?PACKAGE'), :scope('lexical') ) )); $lookup.fallback(QAST::Op.new( :op('ifnull'), QAST::Op.new( :op('atkey'), QAST::Op.new( :op('who'), QAST::WVal.new( :value($*GLOBALish) ) ), QAST::SVal.new( :value(~$final_name) ) ), default_for(nqp::substr(~$final_name, 0, 1)))); } # Otherwise, see if the first part of the name is lexically # known. If not, it's in GLOBAL. Also, if first part is GLOBAL # then strip it off. else { my $path; if $*W.is_lexical(@name[0]) { try { my $first := @name.shift(); $path := QAST::WVal.new( :value($*W.find_sym([$first])) ); CATCH { $path := QAST::Var.new( :name($first), :scope('lexical') ); } } } else { $path := QAST::WVal.new( :value($*GLOBALish) ); } if @name[0] eq 'GLOBAL' { @name.shift(); } for @name { my $path_temp := QAST::Node.unique('pkg_lookup_tmp'); $path := QAST::Stmts.new( QAST::Op.new( :op('bind'), QAST::Var.new( :name($path_temp), :scope('local'), :decl('var') ), $path ), QAST::Op.new( :op('if'), QAST::Op.new( :op('existskey'), QAST::Op.new( :op('who'), QAST::Var.new( :name($path_temp), :scope('local') ) ), QAST::SVal.new( :value(~$_) ) ), QAST::Op.new( :op('atkey'), QAST::Op.new( :op('who'), QAST::Var.new( :name($path_temp), :scope('local') ) ), QAST::SVal.new( :value(~$_) ) ), default_for('$') )); $path := QAST::Op.new( :op('locallifetime'), $path, $path_temp ); } $lookup.unshift(QAST::Op.new(:op('who'), $path)); my $sigil := nqp::substr(~$final_name, 0, 1); if $sigil eq '@' || $sigil eq '%' { my $viv_temp := QAST::Node.unique('pkg_viv_tmp'); $lookup[0] := QAST::Op.new( :op('bind'), QAST::Var.new( :name($viv_temp), :scope('local'), :decl('var') ), $lookup[0]); $lookup.fallback(QAST::Op.new( :op('bindkey'), QAST::Var.new( :name($viv_temp), :scope('local') ), $lookup[1], default_for($sigil) )); } else { $lookup.fallback(default_for($sigil)); } } return $lookup; } } class NQP::RegexActions is QRegex::P6Regex::Actions { method metachar:sym<:my>($/) { my $past := $.ast; make QAST::Regex.new( $past, :rxtype('qastnode'), :subtype('declarative'), :node($/) ); } method metachar:sym<{ }>($/) { make QAST::Regex.new( $.ast, :rxtype, :node($/) ); } method metachar:sym($/) { make QAST::Regex.new( QAST::Node.new( QAST::SVal.new( :value('!INTERPOLATE') ), $.ast, QAST::IVal.new( :value($*SEQ ?? 1 !! 0) ) ), :rxtype, :subtype, :node($/)); } method assertion:sym<{ }>($/) { make QAST::Regex.new( QAST::Node.new( QAST::SVal.new( :value('!INTERPOLATE_REGEX') ), $.ast), :rxtype, :subtype, :node($/)); } method assertion:sym($/) { make QAST::Regex.new( $.ast, :subtype, :negate( $ eq '!' ), :rxtype, :node($/) ); } method assertion:sym($/) { make QAST::Regex.new( QAST::Node.new( QAST::SVal.new( :value('!INTERPOLATE_REGEX') ), $.ast), :rxtype, :subtype, :node($/)); } method codeblock($/) { my $block := $.ast; $block.blocktype('immediate'); my $past := QAST::Stmts.new( QAST::Op.new( :op('bind'), QAST::Var.new( :name('$/'), :scope('contextual') ), QAST::Op.new( QAST::Var.new( :name('$¢'), :scope('contextual') ), :name('MATCH'), :op('callmethod') ) ), $block ); make $past; } method assertion:sym($/) { my $name := ~$; my $qast; if $ { $qast := $[0].ast; self.subrule_alias($qast, $name); } elsif $name eq 'sym' { my str $fullrxname := %*RX; my str $rxname := ""; my int $loc := nqp::index($fullrxname, ':sym<'); if $loc >= 0 { $rxname := nqp::substr($fullrxname, $loc + 5 ); $rxname := nqp::substr( $rxname, 0, nqp::chars($rxname) - 1); } else { $loc := nqp::index($fullrxname, ':'); my $angleloc := nqp::index($fullrxname, '<', $loc); $rxname := nqp::substr($fullrxname, $loc + 1, $angleloc - $loc - 1) unless $loc < 0; } if $loc >= 0 { $qast := QAST::Regex.new(:name('sym'), :rxtype, :node($/), QAST::Regex.new(:rxtype, $rxname, :node($/))); } else { self.panic(" only valid in multiregexes"); } } else { $qast := QAST::Regex.new(:rxtype, :subtype, :node($/), :name($name), QAST::Node.new( QAST::SVal.new( :value($name) ) ) ); if $ { for $[0].ast.list { $qast[0].push( $_ ) } } elsif $ { $name eq 'after' ?? $qast[0].push(self.qbuildsub(self.flip_ast($[0].ast), :anon(1), :addself(1))) !! $qast[0].push(self.qbuildsub($[0].ast, :anon(1), :addself(1))); } } make $qast; } method arglist($/) { make $.ast } method arg($/) { make $.ast; } method create_regex_code_object($block) { my $code := $*W.create_code($block, '', 0, :code_type_name); if nqp::existskey(%*RX, 'code') { %*RX.ADD_NESTED_CODE($code); } $code } method store_regex_nfa($code_obj, $block, $nfa) { $code_obj.SET_NFA($nfa.save); } method store_regex_caps($code_obj, $block, %caps) { $code_obj.SET_CAPS(%caps); } method store_regex_alt_nfa($code_obj, $block, $key, @alternatives) { my @saved; for @alternatives { @saved.push($_.save(:non_empty)); } $code_obj.SET_ALT_NFA($key, @saved); } } nqp-2013.12.1/src/NQP/Compiler.nqp000066400000000000000000000026741225523575400163610ustar00rootroot00000000000000use QRegex; class NQP::Compiler is HLL::Compiler { method optimize($past, *%adverbs) { %adverbs eq 'off' ?? $past !! NQP::Optimizer.new.optimize($past, |%adverbs) } } # Create and configure compiler object. my $nqpcomp := NQP::Compiler.new(); $nqpcomp.language('nqp'); $nqpcomp.parsegrammar(NQP::Grammar); $nqpcomp.parseactions(NQP::Actions); hll-config($nqpcomp.config); $nqpcomp.addstage('optimize', :after); # Add extra command line options. my @clo := $nqpcomp.commandline_options(); @clo.push('parsetrace'); @clo.push('setting=s'); @clo.push('setting-path=s'); @clo.push('module-path=s'); @clo.push('no-regex-lib'); @clo.push('stable-sc'); @clo.push('optimize=s'); #?if parrot @clo.push('vmlibs=s'); @clo.push('dynext=s'); #?endif #?if jvm @clo.push('javaclass=s'); @clo.push('bootstrap'); $nqpcomp.addstage('classname', :after); #?endif #?if moar @clo.push('vmlibs=s'); @clo.push('bootstrap'); #?endif #?if parrot # XXX FIX ME sub MAIN(@ARGS) { #?endif #?if moar # XXX FIX ME sub MAIN(@ARGS) { #?endif #?if jvm sub MAIN(*@ARGS) { #?endif # Enter the compiler. $nqpcomp.command_line(@ARGS, :encoding('utf8'), :transcode('ascii iso-8859-1')); # Uncomment below to dump cursor usage logging (also need to uncomment two lines # in src/QRegex/Cursor.nqp, in !cursor_start_cur and !cursor_start_all). #ParseShared.log_dump(); # Close event logging $nqpcomp.nqpevent(); } nqp-2013.12.1/src/NQP/Grammar.nqp000066400000000000000000000624431225523575400161750ustar00rootroot00000000000000grammar NQP::Grammar is HLL::Grammar { method TOP() { # Language braids. my %*LANG; %*LANG := NQP::Regex; %*LANG := NQP::RegexActions; %*LANG
:= NQP::Grammar; %*LANG := NQP::Actions; # Package declarator to meta-package mapping. Note that there is # one universal KnowHOW from the 6model core, and an attribute # meta-object to go with it. my %*HOW; %*HOW := nqp::knowhow(); %*HOW := nqp::knowhowattr(); # Serialization context builder - keeps track of objects that # cross the compile-time/run-time boundary that are associated # with this compilation unit. my $file := nqp::getlexdyn('$?FILES'); my $source_id := nqp::sha1(self.target()) ~ (%*COMPILING<%?OPTIONS> ?? '' !! '-' ~ ~nqp::time_n()); my $*W := nqp::isnull($file) ?? NQP::World.new(:handle($source_id)) !! NQP::World.new(:handle($source_id), :description($file)); my $*SCOPE := ''; my $*MULTINESS := ''; my $*PKGDECL := ''; my $*INVOCANT_OK := 0; my $*RETURN_USED := 0; my $*CONTROL_USED := 0; my $*IN_REGEX_ASSERTION := 0; my %*HANDLERS; self.comp_unit; } ## Lexer stuff token identifier { <.ident> [ <[\-']> <.ident> ]* } token name { ['::']* } token deflongname { ? } token ENDSTMT { [ <.unv>? $$ <.ws> ]? } token ws { || || [ \v+ | '#' \N* | ^^ <.pod_comment> | \h+ ]* } token unv { # :dba('horizontal whitespace') [ | ^^ <.pod_comment> | \h* '#' \N* | \h+ ] } token pod_comment { ^^ \h* '=' [ | 'begin' \h+ 'END' >> [ .*? \n \h* '=' 'end' \h+ 'END' » \N* || .* ] | 'begin' \h+ [ || .*? \n \h* '=' 'end' \h+ $ » \N* || <.panic: '=begin without matching =end'> ] | 'begin' » \h* [ $$ || '#' || <.panic: 'Unrecognized token after =begin'> ] [ || .*? \n \h* '=' 'end' » \N* || <.panic: '=begin without matching =end'> ] | {} .*? \n ]? | \n ]> | [ \s || <.panic: 'Illegal pod directive'> ] \N* ] } ## Top-level rules token comp_unit { :my $*IN_DECL := ''; :my $*HAS_YOU_ARE_HERE := 0; :my $*MAIN_SUB; :my $*UNIT := $*W.push_lexpad($/); # Create GLOBALish - the current GLOBAL view, created fresh # for each compilation unit so we get separate compilation. :my $*GLOBALish := $*W.pkg_create_mo(%*HOW, :name('GLOBALish')); { $*GLOBALish.HOW.compose($*GLOBALish); $*W.install_lexical_symbol($*UNIT, 'GLOBALish', $*GLOBALish); } # This is also the starting package. :my $*PACKAGE := $*GLOBALish; { $*W.install_lexical_symbol($*UNIT, '$?PACKAGE', $*PACKAGE); } # Create EXPORT::DEFAULT. :my $*EXPORT; { unless %*COMPILING<%?OPTIONS> eq 'NULL' { $*EXPORT := $*W.pkg_create_mo(%*HOW, :name('EXPORT')); $*EXPORT.HOW.compose($*EXPORT); $*W.install_lexical_symbol($*UNIT, 'EXPORT', $*EXPORT); my $DEFAULT := $*W.pkg_create_mo(%*HOW, :name('DEFAULT')); $DEFAULT.HOW.compose($DEFAULT); ($*EXPORT.WHO) := $DEFAULT; } } { $*W.add_initializations(); } <.outerctx> [ $ || <.panic: 'Confused'> ] } rule statementlist { '' [ | $ | > | [ <.eat_terminator> ]* ] } token label { :my $label; ':' <.ws> } token statement { | $ > [ |

-joՖ{[<> 6xqV 'HWG%%8K$p64'81?)>$@.:(!ɺs].ݰvNPezS%je&X>ս0٭IlA~{&Es |2z>t6Rs% #fv8fܸqV@̭lJPRm4i% s76}{Q#UmEe n(YUVx~mVbQV/_~Vj KhE0ݺﭷJnX,aXY{=@&wvG?B j}}^ύ큺zy P^0VV܍ bB]Q4{jE>T[SkZV]twB@E_ wqS}@)fSb6+fA,t ?JX_vVx",z>,p  VU?<*/&cjWL!ms(A|-`z{ܲ}8ʾ=f(lljS=iS E~M^sЯ m6y7%-=7y5;D8Wz8sQ?J˺l+/B1ߡ|$|ɜICqϳ򹶄㵜ӓϥRm3P~_T]2cL(ƷǶo/F{Ԛ/N|oVӾOS?qڋ|w-ar/ڋsU<7ppߏkUO_Gx%GiϔJQ&JM)y ++yIO7SฒgC5!d(pP$rѫ歔S6^:%NN ?K "hfc%O,Ukk[V~2p p[_s@%K*Y_//cl, = lwgww$?6G"5a.dc-8ho1?7o/_ dׄMV_ |C|n6`~[5cԗe{oϯ ={Ws 8ßl+5B=+l\3I,sʯ{ M\>w/C1o[ wgA~3bk.|gxϟ˷4pwXa|qZ6~!?[B%[Qq ߢ:wV]6Bg|{_ȵ< wdOuy#P~ ǁal&7fM{$dO? a> "̾|N>&1WǪ 'OO}%0 FC>]6s&0 ׭ \'>/8_^}}?Ǡ~1S< Gٜ@_PcI_0/j/7/awBu lf~ |x5so29 Ÿ\|`j_ WH!*|k7O+s /F>+A-|Ioke4/!m8?PiR2|Sja6<.. Fw7aV>/@^xC:,ԇ4+cjH^@`6g[f6PɂP ; a/Ex4?Dp th+ho9 {~]X[Uc䏄s"S&1b=ԟCڧ4޻G獽P:&ѹdg̵J+WJK̙?'T=TٲUҊKẀQ5߿fr}}yfj ʺ3 uuU]宻'f.++\u).wzj*e/w!SfUM `az&ϚsהOǛw;Q LcP^.]]bv]\srM<#|ikn-cBں)U8&] \\AʭPp*|E͌.}[S :TSlrbbʌfL5gL+UPBMq=.Q-)RT \Udvuː2wmHȅɵeTOF>n(㪛mJ\C78Ȃ 9TRE2kFU|ֻVO\@ 5rŖbCh Vl,@da@ȅ|"X S@rQI +/]pF-e5<-? kfԗK%jzٸQs HV_ZzWo2ǎ=; *뼠 jyAu^Pb@Sp`?TXRbJ%)(TXrRb ̹-oiJ$z *]Qq 1{6Hz_AOrF]LUe A W>mFX1UT՟[Az^[z^^B})1kO`FEh,FO(:gg>OrȰ͘3y: #c:ޤ9u3\KU=J_ZAi9M9Ux(~10h;+˧`ؠZfb6 (OL{r)\Q^7P"u__[w{|.w[3O)=/+)wF(K-8*{0{:ݬ[s sӃEN{f_5fxgO ՂK>} R= ֫q+ =<[gR4{4,/ a9h*-^ƂFZ3S Om>ӿ>0_z<0 a`Ĵ!#gCӛ>0 ~ L瀞1}vӵFC.1 i"ӟ^|c +_L_L>1z/LG?fӑ`c r蟇i?Lar44 49 OLǂ1bzS| `:1-tĭZ O (P9 ǍA#1h0_K$ʣT`AT;0Ay4̏|:'a>hJQwWUb@y49?*Nq*pwOopz6\C㕛Ti= '|˄ʙmwgs- =**˃y'ǡgL \?ۡ x6 +<Ro:M ?@444`igWIzz. AsHO22E|3 ˎ@m*r]["7j@1.X 5q {,0DvRwT7 u8 DlV04`+^ F{OQEW]ԧhﱾ?A P΋SPJ R;{7,p{)S`q |yI (wB,pAzugxl&c`R+(`zqDŦl&MR%8`Q@{rtpnIp B`qTN'X!8- Аn@ѣ(!E z5஢|j>B$7~S<<BsdGdZU?ib?]K!}$?o$};HvIis mAߪ&^mN.&FQ+v-!ĩ@MP 味L(hjR/ J^6`}M𮞆`8 ;h*)!U!`T?P_PNӌBlNB⿀@L=P4o/ Jm>P֭Wx7g%[6wA`8ڠ[ $*=eggRE {`LN;<0&1(-Hmzeh O/Ǻ9tYC G?27R ]uXERQh@u 9U)YZ$ ַZ] 4gfDxmd܌(s8)~C;8W2ipZdhWk~r┎! (vD Tvdi UXP~2 HA)kURi%4VRrÕaR9J&Rx&J9S {G͕;RJ1 ʀ qkĦJJMF"ّw\6Ffhr[q)V_gi JbHcfGq$&dȋ{ / p}D KLa?A{`"Le#x0!s8=31 uǂ/@kWd )rw@a"T(7dIb|܉|sMsԂ`_ሶ]-6'Nt-h8擭^Q Zڱ̔a#F2P)0˗N%8*,3QYIq3q"jֵշپ>w;&P;Qmd mm"5&U۔4{gMO(|WB\EzT 5~ϾPĻlW x~NO^#H a0٧Of#»fw/_Gmk A(–{vF#F(j >E= KwOmx0o@"2s! |ERZoY/#I{q(c?͵ jM$Fߞ!^\22_ |s$DuC<hRq&7  cr!EGV'U!tC cH8Ȫ.'j^&Ƒ21lm[+&Lk@Qs<.*㕊ﳾq3Km Ўs/頛#u%ThOK%LjtnwE,=Z ] 7@1FqV4rk (7Z=2xB>heJ ߁j L ++U˔E2 .?q'Q mf6xv`*Dͫ.܄'Ssiҗno5ptx2Yس [}"O׀6!r[muP޷MMBnW vZS;"ߴI/!F@4! °{-` C{q!@8['1N( #t RKu)GԒpHSzF/|͆.3W W"sn2dJd1 Pop<PZS7TPkINʈ .첤D*?d#pչ<͊Tl+T.]j$VZLT]a*b'I5m>j!9Fk%Ng [N=I}mhpO5wn lz^5ūpMr=ߓEh!"J%@VE")No3P b\ܴnж$e͙)qW|o)M_E=287(‰R+< |QoS+9[+T;=>ɰ:ZA>ZPg <Fx^T,VJ7j IiF=e|nR.}< l[hhkY3N屖!Y8 #!!W`]v(.gXO4| G%حYȩqR-Sd kQz;~gi^+$O40ײwT:Hʁ!#MGx4)?M8Ԋ*2e#[BCP{ML@9yУpN@+<ښPBi/xp1۱uSZ=RfJ7Wx+D r#S{Y0c50-Tr'>B/zK ' ~Isy …&!G 3ًJ2BY'Oy-0/G0G1衲A1Cap=y:8) V\vE 3p=ap0+X-jc@w(~c_M)s 貤t&;N&p0 _w⢪1g q?dSu?z*Gu7 F< QcY7d W} ,ޅ -j%oA->O9LJfE ༝o.CBH8'%Zr$E[!䖌L<nnEJ:b }]o`{YïXJ RJ33X./`O:&APX6puB@n1ӌnT-*Xk4ςhsV(DEQS?0XWrFbsQ&blwj-Y-FlaluQ=HYBy~ [$7Kɩ"ם(7K[_Kp 'eb!t|Ymi8Kp1kŽPϯء;}̞AkG]P̺Wwxf~(:mxG؜1/L}j\pgk&5{UY8陋j ǹDs`^K^KA֍Uar)CKzD#~GX0Uy60 ةDr#"RN,6m# zBAQ*XA!%}3+ R >I \TWYx)8zhH"ـ0&`G::gY}hNS &qJ'+,ؤW; gq_X-~؏vc jM%_D1h`qڑOJ\/Y}x f҈NmJ+ncRㇺڀ}[OXDW&gy5:"'7ǜ_>Ԩ}(O\i=&n`;-zjz,geN",~]dA8L۱F at|c^g)+Pr6a̴ZYP`\Ei%T/;(Hb*mԥSC:lt:H{? +8 Hv7~UCu@N}StvLrBАͤVkZw e*> z)iHe徧xfXlv3vE^+*""X]ώFCv0Le=pLR[%Ј6MM0@7bwy[198.AM|fxO17qE4xZYCMJ+th}i! SHX lGݺ4ܒߣ;ԳjcsZ6`R3,lUAz qYftSm,Fv^Ć?u0 ݰu\FZ#*+G͎pw=GC*[d6#[XIO :| M,@T1vSؗgf<2ٺ6\Q6?%g8"eqy{P~$pU[E{QuԭP>= L̟ Cb›8EP Zrz$_KcYD/U7!C0P}%P䄽3:Q{q v~ fWIH R&2Y%K7y-'~ $7̪13NG6/MabDFwgX?-oZQ(y5{=20p:(6΃,`l!pBbZ?7&ք+"R얭S lVF SI%- e\l#PRDb c@U"Q1P"P=}2Q 1|hCUQ۸Y_O\ěyF6S\_T-ppڨK U(#֕RG?"R;9ĺ:Xu*C~40zjvs^a;6aU1_́C6ў qD vށ\`y .FG.My\םOςÔ"?,,1U|)q}?<lsJxu$]bakC\i' -J%\[8GS;CaQy#=R瓸w[Хia`Mv'J?CB冕BPT9 wVL7l}15 Nr]/8mo;N dJ=O'@ PS=0lF? ~?\!+ /{(PK]A2O&,$\70;kO;{NI,̡D{w27.n4ۮMsat0Gz33ކ #ӭ)>u3t ?_ohUt\c-C;˔,܂={1V y>|m!A"rK)~.5c  r6N^4YS}oh[ucMcvZy)vӔk,?YLUqULr6i!$XlW^NLyMZ%0%0eغW,ZBqCZMZ-rٵ9|=fhSMoQS4U~ m36O۴jPQw&n>a0Np{{zLH&ɪz4lɾM?E&e%כ nFo-aE mëMϫ1&uf=-#y=Sxq>|xMެͱx}x]ܤuߦH^?ב3[·Qtް)O6kp׮Sx~|xݨx$)cvtԗۿkH.^6{&V3^﹪=+Xw{8FYlt[avAo^n/fIϮբ+°t@ptU-z5Dɽ>* ;& :~,YQGze"l_Sl))7^k:="y=ky[k:ukYH^{~ f?o#kM=oFjIϯ;^7$t. ew&PD0b*'J'W)_9:U4;=b?t "9*wb^zԷFlhRS$_*yV$t<5'|5oSya<eS:"z߈?7t<:" D !l &n eno( 3MbXi:#|G^gy՘)伮O D8ϾXq1eÚ ODmz{h~M EWb'E;?5c_`}şloD%Υa6j? o׶sNy]| aƘytL8U D.ͫ 6q Y P!؏;m6+z~%/乲6zEs9d~w^`笗y99EϼqIzξy9bq'ηGdd/| (tTǁ՝c^劈%u<|c34q2H%=~I+o˺?6ʑgXXBoLaR|1lcckbI 9rˍW5oO ϱS3 ~YOOE?%_clKs#K Wb3רgb$iC_5yYMxqxq8k5QcGE5{ v~x0![_:/=:_.&Sѣk_c^"Elt^+g\k΃?kݾ'yk+>|^q$;ϭϝ{I[8]k94 yH^>sq$ ]t_DQX_+kCF3A.f'4Y}Xi  Ig=/x^/z:,C*Yއh^^m)q(Hy5=s>+ey' e #`0sܵp7sp+c ]SqS\)~Ͽ5Rҹ /DҔIZZy 7O!RjgEr?}\WЋ>icw21KR}g7v {~ HeנPj0w7-IF!PE/lM&$#Y H\b^;TF7v'=^^SZ! wC"gpHjQ>_t_ئL&_>@9nr5EsxFcK{F_)΋ TbN #HT-w$"uSً4 JAW6>v[N+0D zRnTS%q$5IjeI(Ek3gIRf| '?fBEV4A)Nȑb(S LR~nĚUX/}2Tg#wj|<M4TA(g,*O9s]NY!o !gѪ5x/u}6 "F_r<ߢ<%(D5ƶF\/?[nGQ ˼zZQߑdfQR)Z +NJAx}IZ4_WF)؃9̐8W ꉭU @)~)XJUՋJO83RxkX%ngPI-/=vY:Ѫc] qvcsPN`uG``I rINkWpBhV%7QC? -)hQFB~aMg4 Q; aFztv??Pސ&'Re[blB<@jtńv ԈސzJLMxFh7K`~GIEfC^[T|r"|Q~+z[$֥ԐU*ݕc~Fr̆@ҩ6yW,ݵq34e³'eb]N^>d`^B2Vc {-!Z2ߜnev*q'J#yw~K+B=zՋ/kw1*Z/Ymľz;E Zu~5e>rh ɐ+, > o_=Y_XZ_3r qS;E| Kls@663O5Q6} dߌ'7ǮM'M*?{tjgdFhP@;  ѭ@9T]7K1~Yw_>Tuf|1<^Ϸi."b ?Mt/-oޅ' a!αpA{<}XƳA&j^zɗ~L,>9F6: h{ߓШG.̉:E/o͉6̔9~O\l?!˚9h|c7?Ѡ =` .Kb1utH:A{ke~ad'/`K3_n J C գ-V5Ж=E;Hw>|Qbȯ }~7;XlYr!0Ac8 PzcOTԳW{zAt<}(9Xkr: )9E }q 3"qpGQqO.q1# 9qx6:9!c*G?8pqLǂ@^ ⸡Ǒ8s|8p#q<%!h8f#Ꮒ#X8~d_|o6٫N0>a~T0Zs_' (@: y+wV=A#!'AQJ}NE'(56AQ/ABBP:'(TA JBPFe@$AY ʊMPVr%('D45$~ʍMPn41 AiHК&0 A%T"h^&p A 4!6A4_&Z2NkHDtbT~ 'yg{"jL/vgnWlE /͟"{(: |z|N>5D}E?n 3?% |Y<_/'/8&^"R5D,> U" Ri2̍TՀOY߁j7);z ]Gп#w S>S'X;BbOCb$9? @k<)׆OI^I2{̩$ '(: AR +?3,Spvꊘ/^$ T 8F-`PٽOvw`mk'x h YD}5ſڪO$:_{$9rAz ¼RD|s$d2A 6  ~aA#cK"GIF92 /:.|Q?4#! v0#eGFLT Wn/&2o&BYK~{E)@H E)Tn2 :Ѕ+i>BP'D@$;b,~7~0`k&t]=\5yn~u`Ӄ*_݇Iv,t P[Q({x?rx;u ( ~gaGk"!Q|Eg"O0/=nnFRċ}{ܮ݃ ٞg*z#^/hwO6k/}@ 0[gjC4 J-q#WaGXY#(j~5$#d'A-`?RhϧmD+ŕ)$L4ʚsm<%ճsDžb_= #ot>?W~3Sw9@(nS9i}a1i'g]ń_vm >`[ٟ Ţ\_ՇQf(AJ{%QxQ*JǽB)g~!Y`Re*%$,0cpW4-i(y䡿?N b^"I67QԽtG5Zi\Zp5?c۟'&ҏkSewRmtH7h)V}i+F;Չ?Ai&_x+:i')ք|KI-}N .c`!m6E[GaKvM,l3Gg.Re#_~j@iQ).'1?6&Q.\yĦpwܝkn_F0ԤsȬdfNNf9(^*ɕBti3qT@W3y[|YǶ}5W{mM<1OxRz w\Q$9g3=7+:H0M‘=toDao*㱒Zko`9؄F]\*H\ 7V+=#<p]XR ,tkdG6m^,%(_#~VͷA]5+'ʳҁPtCóBG6GM~@AShE"$xr)*g:aߍim&[=;~ !ڿUii6e4;]Gs(cK9TYR!2l!`wݜ sv4~gcjˣ~F;AóVB+Pms80msL]$tžO~ie{k8rNYԆb{?=SWm~ϊU|=-TB/}m0/0O4.'G65}D2)N7g[iN+Ybq\~߃ojlHmiEiE؁gj KS ]uH {\$UY0ٽv((.j*wu6ÿ4(*ʾ1@b!NAsȀ)M-w i &*'49'qІ$sL)2~ ϲ.DS ?q|@,9 _,?J t,0ȏ=M?.(H]& =TOhdjvѹ$$oTD;gv6wr 6"e }S-9 'pgm6sޙ_YX-! s"A2gk֢?6(Z,M(f9Ē?g&"vʺ)$,'ЩODy>Δ$|EclC8 NOzw7~0 pPVQItML?ɬ03d&dA'kMB%}91e)Bj&B"r7MOS~߇E߉@hPL& MI`_( 1d2l6}:]2E:TF9u#]g*q"<G' u ?Yf P IEkR`R`PAz?')9a}hy\QWbTn _#Jbm"<-o_UR\Rk`hX&+IYdM6kn {$>KLRf;Z+e/؅-'r!8sh7ʠYp{,5ۏOO {P='IqcG$Dqų^@%kh3͎%~"ѽS4-׺R7(aO8a2Z}~*0 l\@bt#{kh?vaup;ǜo/. OJwMg4bwz`(fGO1U;)"L>6Mlp ^ϰ%xo 0߆}A-7A}7>#%y.̚4l G}@=˺ho|eGt"^TG݈֮{\Y^iwVgO>+}Qmf+ُ 3 p-MH+G}77c iw8[B߀S |ް6 m|7PlcAՍB ,4I$h թ0u1T/.E |{(MwF{lk"3v D10t'^fݐaʹkЎL21~ 3Lb">NhƘ@UA:B4Z-}Hw׷? w1 ;# ~Gs>DC@=[ ]6CHpKǣ/؂]9mrL=g^=_fJ%/ҹs |͓A6@g4)K 4n^07c0w?֠y~>obU3e_t6㣄B&}8y7K"6ܫ0W %' DQ <٘!|4K2oǶ <]onsF8Q MdH`cjɔVCGKgʞWa:Je-%4/`*XC~Rg'6^蚊5ET;e\n G¾}'c̝x?4@_xGg%8,J1E{P{FP8`2DOn+&oD q3 {Ѡ\̰iA :gSB}Y}\mوzs4qhIr + R"'ҐVC|7LDQwɮQ&9aLb֣f& <}b)ܘsmlCnXXn9;},FA]g=Mj}ȍӼ Wpj@NA$ļ =IPh:BGa~dna={E&OHeV(D`ƛ'8vÓ!jң'kU?M)}|cgt`&m] uVK7 Z=5>9yozqϿ">F:N:=jwBj"a~S*n~[CqSSt.&xa>%86Ժ%x`|7C:LhTLi61b{ҊOMKV7 6(" A`D;гx摭GwSg7|qa27[=fNw<\eS^s*yX ̽"D\3\ Apvˡo`RojkdtL[Nmu=}lW8p.1ouGBJ'Y'Ԯ+߬* )p^`;y‘v-=!Fݳ;z!&t|!5(ʴ9Y96ѹR|d-h H.RnVrAB~W`.}`~$8_GB@o ܃e|@5[j$ ړ;dDqU;pO+ip:nmG5 Cpn  5KW.0juvćMS=h h]~72CGݟ@6чG'>f`R8G^ܫBz"Hp)'WxyT}xϹZx&lP*1#d&[74 a 5h_呆;SPQmbtD!d[ĢDl-4pw"8<@-:wPkK;,' ~Iq xg?gXdI;bnn d #Q@/Y(f|~´&U< 7M{O]H^''D4<.ǺmyW"nIj'1 v 4@oɵ1Bwۂ E0"|䛬Y["'l`P[jhҷxͷSz@^Tm@82`!-b9퀸^wP̴u]X7LIm`5G&k@V(!-#»6oGE Aa=4/E#]/,w?9_lDVOM\څ2xay-9j?tZP,HR2A%m_ 1q /lI\_H;3-FЅgNsA7وiX-{ϩ񰚈:C>k3ɀmb-hReBe_%$B=dp~9s&Q$q˭h޾*U>j*U_R4Qy! 2gΙI2>ʜڿ^{{Lg*u#bM`4 -6's0ytQŨ|c%rn2ߴu&fV|lk+R!嬩k; dҔVRk.𷥵lExN|iܙdzcfo%}vɦS_8%5JT1* *yy1}@N+E1RCPiFThӪ=L1H$4F, >Cs}}n`.}ܟ4'>0҇bG`ҢE3҅$M*{Ńu_,Q%F֬R?Jm;ҔWX׎0 g` ,1(VvPVd?q]BM]מmŴtB-;վ>Qp#o `mI3##Էq_68?OHRҘG >J]bݘhBZWI7KbsML+bBIUr$UlA}t왭M'{i|#|zeX}8ZstWOev ;goh7A@/ܒʅ}D{hmH M8GKg*I o=̦Sc}_*[7i$5{WdcC6/YD_bP oj m٪oˣڱu)"%x$. YR]$Lb*YʃG+xSklVeCwM3ReFل4f FNu~EbAEY0jwbc]ұc>ڸSݑA3~vW}3LeU@]3~Ԟ-H Y 6+] Nr ilձ9Q^|49r;gk./#:)Ĺ nrB{5T,,ɯQʇꢰvS$CPGʦ,le]RE-9I~2m1## I䪲 Dg4g'J}Noɇt245Upj}JMNcJuR7l4 2>Չ I=MIHlRhS S}h1wFf_,:eBhGQ6k7+f꣒m'2-6\(21SFFx>Cy([yk#f","<:4?HNC(~,{k)󳹾P\_2((h(afr ΁R'hXl̺#rNP , d$,h%^h źMزL*TG=lvΦ=fmj {lٴw16k%ZV(ɮ5u,#ն?x׽qvyCsC0PuFxIA+nVR ]Q[SNseC$Ϥ5O֍H7] `9J$b8tQ~9c{'^ɫWrU''}Y9GܠHVR=Ki[l'\3LwAnR;F3 lWP!u>b †]BҎi@)O:F%XAyLڧL].<.2Eֱ FS<i>(< b=T rU=Ff\+ue7D\"_.,d^H.98G/:P@ :?ư 62m^TTj0NVBV /ӹNά^01!?i>I4dO]7ՖkK++:nfe}V9;&6ץ?aF;Ӿ)T2m€Ă7,:?Z;D/n.~&uB xByԞ"'bެXgr/⋣hwΜ¢؏ԜmٌqٕvH[S"PZߛX!;-=;"4uDSOx~eRX8KhkbOʕďDˊL +~Ӓ/~mZMll ֠e,5AК2WkJ%k[vdi8cbb[QVS 'ܠ|cfM@m{1PlUVmҶ)/C8]OZ!^nW}\IˑT:Ҟu0IBt5 LagzO`گ<32iD(淋/lc}ҋa cI-~6Xٽ+-E[vʕeO .XUr݇cs/oߤ"wOoeͰtA^\ ا&|,/ec1KV:أ bFG8߿Mr0=(ɔ8P:)D~68|<{-ޔ *h/[:UΥJ\9iVI@x#UJKL& ;ȥeRa%s|.E_;GkSb 8K5tOa]efwgs;K+_'戽l v-Oo,:v+Ğ#ڽQK>}I]z[w+Lg(mJ[V i?\m^,2Tg#}ߎW+֓V~(h =<88$<=ta!s31þ+ea%6&:0gGdu?]72x[.$/[2рH*:vrclcOcʩ)hx!s8q~]u1b:h4\XڡtCLM"x^B&~ǟ)Ԩ!r_Or ۪mztj?=P͢BwS_ErYJg ,FF6X +_:26<$:QERc oc%&/]҄gy9k yi#ьȈA.d| + "GKssTx851 #}\Nz&QC\LXX!EG+Ҩ."x07̉YCۖ);#9L1c zO!f(<ژ-7|Ny挎Ar,\3|(YʄI)j{3T 59<Әs!@b@X18]0?c!*Gkg7:Xdeo<,7H~ptJR:pvU< E<U>Ez(!u0uY3O4#ȉB=Gu&S~J?юWh;EZSP~q{1:ga6E:fH9, {~5FwP P' B4Lݙ63R2s=KL W||UX]]g^vA)}mva:& Iev 9;ͭYvCr%eAԧvlGL9$ݾvC]EjnC^1r8 5f݇:[^OsG~؃ADCC`o됚ނPWg/}s+Ϯ"OqM0}r0,N)/.Z2%^ v_37I_uH$I,lN&'\2p`18N*IP"k~fClq;ZI6r_'auC ^7>r֭8l^nt%hn#]45 Dlon5̂6]z!J6MM#:Qfd蟦ZޡjRD^a}clijv~69u!43؃I&mvS 4 P3VqYN?$qݮS|F!XWb\ i Z E]8}p47irZVG/^EuLP). vMZVi՛H^5E*S1HUdI-/:dL·iɦLI=WNVCҏNCkQ;iTЧ(u2'2SuNC3ܒSGWl=YԬ*?la;Jycs8> OMI|*ffiØS>ʠ?H:&?&Aկ9]3yҏ{Jijh"|6eMl$x7rC'6o$._1l ׮UcxmDFDijY5[Xy0'b1+5ؒBn^E7/*r߼9%΅]/<rVimwOT,mv$ Ʃ_˩4j}j'lJ!ߕ(/Oǃ44U%=_c^w}"|p%ŀG~$c,݋v*aKpO{tOmp { ţaOCXw_\X0-\oOCVm>u 1*srVӘt7$iLctƵiT?{QK/(8Y%]Zj7$}a kKE9<</D艙Md7PI^eMTa\'&u<]pzWDu4)~2x|.@n60/ߊǛKK6ߎǟt& <2^H7\ggY8# :le:iKs,3Gkꞧ5RA=X {RVjJUuVVs0)#;v{|b/I/ Ҍs4 K^f K>WtAZX   x }@7``/PX4n <@l< lz'o Tyݗ:=9Wadx lqfILj򬮌Sʷb*#}0;>"2(2Z,9 # @g5Y}][g1S=1HDW5to >4bܒQipY ri:yvh{~WgYk1r~ $Qbɡ<M2^NG0Su 6Qe1gx-R5 ZǞx|x,^"msM_@; ;suՂ-K]vED9ăX; (oxxhB.]vz%gs%#񉮥x^f,f}⿣f#yz!W/q/睈# ⶟H-@# l7NT6sDieu"{$1Qb3tb2p5x=$]_,bx_"M::3ǐ?8 L͗*M is#À_Bz% @hl<xui0`*UK& x49Ӏaԛp=` p[O<8xp0 :*M is#}N_eYRs^|B"lEo^PO"YB}=~ mUZV %3xdB.";7/BaH:[m|w {͒^ ȷŏC@^rZLf7v X9U+>u [E⺃Iz$WА^daDGOK3rI,ё^"%.ѕIߑ>$BNqXZۛad:j<;ίNGG {r{0'玦K1;NM]y5ZyE(.Sj:Ƽ@5F;:ttSG7 41G tz];t|yLdLy _h:Y7F:Z2)= 3:T%8/ 9hLp 2>yF{8 SqsUj'parp!Y8tu>dVs_Qn`V 2'p>b8~e2Ϥ)gSn>_'+?e)x(0WRIwK_OOM~dڟJ?Up`I"IVu{VJWnKIN_rJ)8Ke~}vtJHZ _g#?O,U"ƌx_LIW`~[J{R૾&IsEytM_ =Ga+;QE"Z]§d&7# |Atc| xϿb~B_Jۀ;^]x $IHp)%_~$gow>*t߽8J݂?w|?{xX+k%+Iwv/kdw (SLK "hLko~@W'nյx7y5O/o)kDlLQ2*W?059GJCtoڮƕ #ZJɿOS4eV!}X_I _ K_xo]$c?Ds# =E ߷Ko>Kg1^Y7/IHJ#c䛡}$IE`Jc)wvj,u&Ȝ}DboFn[^v'Zߦ;@+OZfOKoǫ7LKn)xsץk &;s>E?n)<#th; yl*stNC-%-YI}f?^ ~x~S\JyFh.}1zCZwnHvr~Qd-~/\{0o?I5s{0UۍFM>-߮_K&O$KF<(c*~rVw p7н}6[fI>Zik7#f7jsqkA)"1C i#sVH aҜ>rqC Zucxm4!ǪrY)~  +wcђW\r4v8UU`SF0C °h > -@6Y}Jۀ\pzHP2n쵭mmD;xhThSj0n(b]?%{SS텒NpXi Y%/kl}^{@߶Lyd@ (kڛC/}5iص5Klc6aWtlHbe%ѩ׹pz&VbKr0BmuU~CBtS6[F1k4`< @ƶzTL!6MJH$4@ӱXBI,+{h :OɅ>Nty}fbbKrMXƆ"ItugwT5mf4o.Qc\[5sAH'}l4L~!sLmȻkBG~[!7؉4$:tƆߐ# tӃL}GWt㗁ѳvwߓVUxdCP̣.J;~_B 4UUd:Ʀ*YB+H!w "#ym\P5!D{,0e|tce/t$v'-i+IzW=L9w[6V8UDBR&_TT٤z.i^e0ڃrnJ%4=-ə%e{CaozOB M2#S?/23(M-DŽhdiR;7MCj6Xv%+EcBd,,XCe:Ri5mgIgs_PK bBcom/sun/jna/freebsd-x86-64/PK 1Bqމ,com/sun/jna/freebsd-x86-64/libjnidispatch.so}{\T&EiEeeu+ڃel(,3TD fJ1O.YJ͌*ORRՙ0%-$_[k}yqZgw3͘4 8( {LMqAjpkt=(l.:Ue<~Sz}{<䂹\g\gyѨa\z\upw*ϳ5p% wQ&õ^ pq W-?Cn#Q=p̓VހNµ z/׫pgp}7 N 2D&u KgsFEp,k\\˽W\(\ ?p}W 8pU{ Z'pk߄+Tq7pW|A^k \c9m+99pg zk4\8}\z/5*GJ~%\S} ֋ *%~=78?Lip\F'yv#\7pl..#\pMΟ@ez9]5K[7>$<φk>gUק~:v \CȨ5Su}:w`ڇ+Ӡt67.?~'T0]_rmZ;?\k=]uY)~LnP_öÅ>AJ1:s?>wsAoxу8sz;3MK}W0}чտ9nft2'sG7ݟ. FXQ ܓ@ cvR' *N?7jӥgF3x:tT9ܟѯ3ߜ,?;uՅi}8 's4W;Cq<>_:h6/O۸Rawr?1/3wΟz{nSa8F\J!ᄎ&jhpW^8^\yd0&ۙWv o:xP,\+Y>yPD^K}@Ƿ]3h5gsxW"qy:W߸=^a\h|C?'8?w?zc$ 0h?=g'y>7![}n屉wckJߢ+Y2Fu>鷾/JoZoԱ޾+9^N =gK =uO2ҫ]Ir/|WSg:6KPFݩԫ<\i\'ɿ'@9)<ï jk5?iJ&Fs|('y;2T/2}8x:>[7:w0o](&x>v5%\OO~g"uhrq#g~K44>;u%9|cnB䁣&ٟqR 諆ydD$#ObpC^.sr^%C G6+:m\oAID:7JHpi: gy(yГ&s"4Q,|Mh=>@O0)#/?{%T яQE@k!E5BK6!Yy 1\ 0-^ɣrs3`M=.#Ё},.c%oT%m.; :Dj4L=F{G0rM@A4 5/)fkj?\"K o? %B$AD@A!]- cR :pf^(.-81j1/q,?1?B߀dO3CWr\60~feY/+Ԁ eP/+vB2<  +-P{)-P{'-P{n+9ͬQoZmOIbv@U?kf%¶_`n[` kb^ :?`0h3r&^v(Iʿ/ _'[z3۩P-|w[Nޅ $žXLl5K/RT.#S&Z <^k\2 &* pc=Asgdz9v7u bRA洧&$MƦ֔~Fޝ!S' ;&;?:AScXx^ X-S0^bY'3|dF3Ȝ gO^ƄI넜Q-t'9Dq(ϞGRj:dA4 ee#0֤eL%Fu߅:ҋ|ު܋^wx8֋_2p~17y9_Wp~m^Z%x9?̋/#a7p~/~$G{8{9)^x7qH/~ gyq~$Ogq~?gzp~K39̋ {K9‹/~zy8;?p8_˟|B8̋_Λ{xyz?M§x#؟O[]a?R[}?WSSPg D/b?] |q_vG;l_+z@7 o~+_%\ |qo;VQ_/ ".%[~o&o>;L[A .)%GG W(^?(M?E?" |qkH ?W(LPL?@|/{"e?Y/~Ow!Vy(zI(_|Em=g 0- ~}-s~_o & Hg |3?K L/S"J~/ / ?O;"_+?o_ &/~V nZ` |]5_##F |#+~}F/wLFSv77!1J犽:uk$_[䂿["Cg=SNow~8ˉnEw8ˈ>4,!%q}i4ՙKnKIvq3jqk3uHwF:Hgˑƭ5NыO-ΖH6?3N~?ѓAt': ?/"} 'z(ґAH_KuǐI~^{}7~o@F髑"DwE&OtGo&D_[?ѭH&D@VO1o#D@vOn~#}'; ?됾~#}7'z~?A^hOH~g }'u'DOBOc ?љH?H~~"ݗ=?~ҏ~DQO=H~oC1O H?NQ#Ot'#??'DO cH D@ OnMH ?H$DCIOJ?ˑN&D/Bz'"g)N!DӄH?C~IH!@cEZw-LjZ6CIM,3ME0Z WIܘd`=2i$d2+ C+TWˮX2c!{aȞ`:rHSx LP U'ZSڂ@ۤ*" BJ?.Wfff cF(IRFY:$Ae;f'W n4!Mҁ$7WJ0IUX73IݕM2(3Z䜶$9KpGuU,~ lh1M?nƦlXby6\t6>3sToGLgc.*opxz"Wh3}qbLAzkW }nGڿT*=&G\ 8Xpwxw a.:n s[86hFrDAZ찄^1Et :s 4KC )"tK<$wA6ON_\jO{5H=oT1yFY!$i`$7hǂ@81.;3K}*w?% 2:cN6mJ@Ba ' ;{牥sz%MJ D]g@Ʊ=>y=&{41$3 sVT h5B&)$%&IFt,x\قŤ/"ߥw"SN`gZ_/ { W0X( +$u8BZScN\\&9*dr3YTa2'IѦ*sPM?ƈ`h8#.4AiE5V/ sNοt[{eY[aftf wSx֦kjSt\18"Q m1qqI7nҵٮhyJ 'bG[Gl?b6gxklb|`N^ӮI&5ydv&ݧ]\ Ňo.k},l[<,9莼;*է CS '=?&YT(%IMm7(Mrj q~>LD ᾷZHsё}A$cs>*F\И^k#|+)ZdU_#Q1SAJB0IFE6 jG@yJ>fڇr`G ;A~].9F `43Z'Ud=u!ͻ /?9"kIvW:ЍC] P;{"Ƶ@JOҪ,'5@Mw^F9)&%jRlz[KJ{ho I!x1ֵT*ȔMEzRISo4==ꎨ8qЇi0[xZAʡ%ݵj+w7Gu*<yUԴiwZUwDnV_ +V1wgi[HԴ*l!FN75&xZ$Siz!bXmЁQXUeO0ʪ!zCv@bqc}j SKp%K-үXCu$I-Z;Iې$[zGRQ  lu, LD6b7IF$1ۻ`2U% tVh4/:ja_D/LnncC Cҏ,TUJC[;SɆ+Y&| !1\"h|OԯČ5\TЇN&q%8$CidML@mWCG:Jt!ʞX-=L¶^Vr牥 *Xꠅ(iF۪NĖOI (=̟4sQ~4inMk@a~i&@n Jo'Mk.'MAtđ0m+eُ]PthUQe*^մlTP cxkh'j\=.s&\byx6ahB*ki3.Wѡ5ƭԍV$m7Jϱv&1$ٲ>~ىV9PpL,^PN{ljx}!$^\t xSF3-#Mo-K|F #'ShwI^ UuŵpL-* 9sGq& M9x1OO4_ `$l4l/[5*Q3m1#{jDNgRMH({OW*oqpJ 刨P>?S*Do[ցHlLEӆf̒p0g<&1AoVWl"??dr;`2ٯ_Q?\B&9CТ:˭P:]%a*A*uYw쿡ɃI Hru ]~g >̟$7 d & k v 4mz-v0mF[+|!C|+r::j,1YLY2l|>%*V˵UH:S[ 8Oci{\ (OWcȓ`&Ui:bYhü+^c6rH:Y.3\DظÜRF=7ٓE{߃c.m.)T"9Ј9dfm2\cGvu]aTWufi}n*Eݡ=XQ0:aԥ_wm# R>@ U<bhFDA`Jn X(t/JCvJ~GLM.,_a|Cg2x5.!{=3 {\Xo -~ݓ[F;9tt&8ҾʭuvrF:'iǒd-TV#X13ןH1am5Mutj~2K;R%YIˣ f#AX]/.WaOO],\Z`vWw6{tGzqP۾ނmkq u$!rzcZjg]<0⎝T}ymq 5E#iNbVT(g,4T2e !ԑ o JApf/`V],崴u#(TzoYQKUɷ\d[2X&Zm1߮=u41=t*?.-^[9IC1~6K0U=Zpr>0!'zVoNV\pms Sjްx@Kren-yx tRu`?hT\w$7bJ+7^递M `Sub6rU;N@%Z$O7ou/XHDkJq6r)V ܙZMX˔-~ TD.l^ u-jY-U붸+շPJďIDdUo+՟XvP^j,j&.8ZKNq  MZsfK6"se"Qr6PeVR5dJ#QjTBG9ʊ%d/},/+ӦGqX>uX(Mz0z+cA+Er*14bλ.hY$*ȡnJ ln,r R\jY`06*`5hiy$!wTBVw,paZ)=@=/m aXQN/$u'J=,J=R͵z_G 9=R%[;!ɞܦCEM_/nH(<1ȿktv@ta7-y`HXnN߽j|xQx_wKߣ?86qܯw_Tÿ3Xfi3$pG:*F¨D9H)Ր$59oZ.i/kisDݼo~uhEi;)SWcM1Ƒl;bk]Pm O+_R_}Z7!{f@́imCeIHVѱE|Kt3렫yx>Y:ϏH>{wYg0? x e=N=/!b-*Azv%]z w _z`K} '6oAejCcy>=m\s(ռTMOZ6JVq\$J#Rr 5vv>~Ihl~_)muql{vmw@[h ZD_ڌ驝6uTGG4Xk6iY)~w"HE&? g N'+?\?XrDn|%~ҽ"d[!e/G.c^[Qޅ".= UR‹Q{@m9**V/kx_?,;FDxIYxGg }_C# ؛U=WFԇ |}F?3  =%ÿG=%cxW O{4+=ˡ{|Z_Pwc_nV7П}I#YYc=,pi;Z_nr;{jﺟZmGٯE݈KM!䁷û]0ᛕwOG~R~GxoI;r Ɩ ɿF<-)MJ9Q2=p`;]4ȡ䱊.Y_L)5}RKߒgt{zȏď#y!d^#zGKQ/kGvQToSmTOS-Bʣ=|ǀZ W.a.V#kW.w]2g_p.=Ka:Kgh N¯߹v?nN#Yhj@k?_7xcGy[lo ?B&ک _U[Nu#+?nNB<Y_ODK"^L@|mB5(%P{NN-_iSw+=gո=᯿$R#=޷=Vߡ_=Znpk/gk򿜕#kD_?YX˱]ChzrV5!;o˵K vldv#?=xKXݳY/cZ/jI"o3hm~ngSX-},>Gxҽ[꩏*r{xq%Sr,={z~k2=jY6#im*;D7qliuÓTBGn@<-B[d960Q~8.W~]VʶWUX{l+mf#ާxݪ} sƌn?mB{k+kl.cԷq"lDGyKlCRR(_xXJxNW.?| ᕐu m&:Q[T×^@b%hf3k-;?%!n蕃蕽++)ܬ=˷6< ~ \ QЀ_D@ږlW_C@ Kjb[ר|m3FEͬ1@beJ5h7wG]hߠq|gKT ojqMՄ{dxoAQ5 o❢}Z+/$SUm:?@ yUDݘ0f]U}b7nd/p=к XDaD59(ZCA;Cf1 >潝9ł.0E؜*u+'[[7‘FKߤ XIk{Mm7>vs}侎װ|q6V!gzoBݰSCRТ.@ot7xtDž(FlT1>;0&nT1/U|R2T6z6n+|Ԗr|>,G YHm[Fֶ1V6G68T*6`g? OO SOXyPYNx*l4U%*_!ԚMYlp6V8}81k>#G1Cx+ǭ$uc0a<_0@Cߢο6TzvYݎ%~]9p?2vڵɥaL}SF^#ÿGVY5 Ï|sm#F[3%N6P06C:Eg+ 򰢳,NJXJX7k~T^ͱ54WON?O;:ݯt%*q`[n B # 4Zcγl̻ '>E(Sod ʄO#WIXjr/0طP.VkJ&7W_Ln]8g={7uùZSQU={jZ"[}īC /Eo+FB5~F{5O OS2^c.hmhGv\v%|*UhT` \Ϳ9+(aX|ܓNI1[>vnXE+h65x*ў_I(/Uص,Z<~=%(^I:"'I3BR[˨sDMaTQB=ng v =m)cep{.n Mdj^jJBW}MTg:vY17 ɨ(FgTFcgNgT g(}a9)QDK/H kC@rPn诐F_X!}<{Tj/zt>e餾%&[d==:S l" Ѻ*\,{Ha<}*0ԪJeK胩sdB;p"yܩ4XCop<!E|{;fyp dO#k}: H$:>+ h0{'/hcPec[oa8BQd'va^ ,}ڋ2zgb%\ޙhg67H %,uGf 0{<Չײ^y1 ++5GhZ ~K!3_n7ϡy iѡLS 6ƯZPKCE*WUEOT˯!*:*CvOo*9e\ů* *AxYPWe9;*TQUQ*n*|ULBoUTUDU"x¯ "WKxTOTˠ7O \$cb%[wf(>׸H5Ǹ ո:x{.qM 㦏1%ĿqqgYKF6 `\`CyǸwu..v%~[̍Ϝw2αmܓ̸'|8qbƽ,kqϣq%0~`F,c\x ߸#s1nܸy-q>w׍k\gr}WKG2Z8Kd\nq0"m^6l]č; Ϝߟ `ܬEn#veȸ Y|M5.8Bq35n.o\B͸c:.KHMga+Uy3a_'7$&h;6dr\&7er_5%SHnߪ\Ker|~`r/ܻL.Lq{^{2g|3[HfMn(1X_\(*g"9|W.4F7L.u亐ܫ\W&gerW]r4cI.)c}g$w&Xf_onk8$mHn\hrLn6Wn0{Fkr>#}brܝܧLgyl"NR.0}"՚\4&go/䆳t7]Kr5^$ &wo|L-kr L_Ln'SKd](#;rW1$7O{W0Y8Ir29 ݧuf`r2|'K"-L.7L^>$?%AH-M_\o|ɒ(&wbr$w&Wv C'U2HV&77t&7jr'$7]=&͐7Z֘͝\UEnP@hͨQ*rU\ed'tg!@|R qVBK4:}n.uF?f.#A^8\ /E$<}rS$mo/Kr/p\%xc̑t5%6&>> ?@%A-/EuHj:" >de 1 46AmX{C!§E50)X5BHsk&0H.I` Y$+ٷ{ONpȓN^J|K4`~E2Cz&9dIJg/P6Ę!, 9,AT Pbl=Ꜻ G |\߼ag[T#֚݊<FLaK£)@gx b< :K4%sd<9HQe ^Ju b"890],6-v`N[gle3h<="đj_k,NfQg ~yQZ WɞZuV95:Ux֯ES!oX^55èĿ(UiK-ƳGPsilQ(_WlT$e,Z*ӬTcO>߇3vzUǣx6iGRשLoʤ#fkh5SzBC[&sؼt$˃:90 ߠ|2e㧇lbEe'Xq qL{7|3`#mA锏->G<R(diV;$xL H?b@kHܣ7.ճ}z)2f3 Lvs953Wz92 .]^ؚMɭfmx fjM>1ʫ.<X b/F*幽ED?A M͟)Aoy̧EN?n Og &*ƶXRk}~쵨)hm9޽c?MA_~òu+bk)gK6Z-hT5`@|ԮE=L8J雔V!"^GuF,䂮5+6Z# Ȣy* ~y01L;@iHS$wl{䁢Go}H9vlAn>In )ácgrQݏ3LNA\Mp->mYQ\cw?үǧ T q3%nM2:beSu<]ʰ&rpZ?!Kim \C_\ij ~Q.{]Q[GWY/Uv؀IƓ)5}t." 1Uj'Ր|2{rhm6АB$vƥn҆8A]AZ@6G9T5P)p%-:FCt*g``vY.U&P)-2s@F:X =+)f{A_Bd,AG:NMwƱdtPi*0$c k FYM:حck0wAp?nT<=MӱCt.ti8g;vHwtÐnu;Oط~=rUc=r) gHomFotЧ:m ͗su^) .#6L\/5(b0Qv׊D Uga s~8!C{PkauiuZ{EBGYWXW 3f)1BKRUڵ:KXk:D/2CFB['j S 2 29y{Uʸ,] +]]t(H_\cOuVQ;TP̦[du詔|NZ1jw`l]+ /$yM1{Nq_/č-(Vs7L{(:?uQ]ҷ;, :*<.8Ձ5ڝ*|8x@@!e'٬a96*35q〪s ciL5lV@a[K{__0>aWX 2kZyqŢ_Dg]]R&Wi㣪'L2woGԫUL||[.QlOT^و=, ab?^t`[@ "h(Sv) C?4εn!/£;lX2Kҧ@].M a PX(PƦ]HNx{ WεΡ)O]L.fVd9кl!=^| %F)D[Ćܟ%֥VP(@XJPӅЄC>!<5-2o1f*t#Lm/ьUClW}Wwiȅ(^~#.?:V`6Jc Ёk*3r/'+^T:f`'|!U;nW|y?ڧ3S %Vx!xH`, S2`aG(vn()֥)4 0!1 M4={<4;O`CABv4Yev1r`߈?P7 ]w_.;hc K!+nvU|Զuvʦ!Vxf8 |".SF9aDCe3T{3![ ԁ7#``PBfC+ 3/Ew;A֭`D.0o/ya?n8R>eM0y:Y|;wO ]3Ȟ4S @1,̣RN!<*ͲEt~8b L&ff,`:,K{D%ʠ#՘r0 [ajFGn,>\&N֔d7' tgg[58[a~0$uX>2Gc"v:1|^Ub!`5lW챇IȨ ܺ9jo35:g)*.w{ϸx6Le wEO-E?+gb>֣=)v>f7z#i[ H]BhA$XLm X=۶`DB a="kSBʍ'3p ,Gi89=yM;=[^dи!+֏8a(|lz*C5Ӎ f-h~)Vfc' $ށ !C~P[SΙ'b+|~·@jj<CϽ4m=w/x Tp$K8d"0_ qXz}Ob @В\4kf ZYxd 1Xf[Go:w};R6W;d{J:TŽw0+^J|ӉC[i\(9,/ӰO i[ۜ#pB(8,6eB@Yiڶ G4 ȸv {?QVd_rXvaUMm33ϏBu$qX3`c,F0|&+,8q!SR/\{a\ ^Ѵ0y(vkL˲l=|%zέ>dOT|ރocѹ ƈH  =քm_hy U< 51\|PىJ?Q i:3D?ųŸ}Wн0K u*+tiIdŮ IT8z#Sp8h Vxы4jN[{PF0Lh 0mz`?yy r>æ6Ry ߟpUi$녝la:P2w>hRs+\t!?ǻspҸp845.YU.~g 9XLJKS{L̜@鸄^TB7^ÏZ;xF4]%fX,Z=dMbvr0l?[E7Ei-VGJˈ pih-p 6m{F|]S fd;Bs P۶^ ~i*'v#pRQ+h,8.pAPTtV1|++EU0b {>2m({X?+*@V"i2@p#[Q7i Ghz]hnO_;~`oxdY[:׳Myeo0:o=-< ]q v63 B{2yT([aZ (I=B|Iۍ-/BF!~bfjۿӁ:^myQ>`YՌ#LȍF&'=m =a'~n. j _@?+?P"Xz%3ڄ K=o$,G;S/pdÈrrA~FDJWDdcVD"2EdE2d6H H 4f`>3.2IRV3g"+І[/4ѻ6p 4<@>v(a0DGt} '~s9e9Rn{o\مxP.?*{Js$eK^ V [+ϣ"j}4wO"S\ OV8q}v? '?Uxpg.CoN܏=C|!$B4no^.%9>/ _瘝"ԮQh|#J \@m;;#1_jf6 $׊"Wg6VuKNW똫i.ƭNݱA럹~iƟ^qB׃%ꢇ7 w<)bhW '!}4O‹KאZ!^tk6M)Y'orAcOS4w?e;l6{#a4dml&A{ Cmf#zJ Xgggk@a}Xɵ"\ƗQ?2/iĕZ+CscLyu5 z<;^)SC8RwVT! p0~ l=}}+c޸و_?@G,4C?D(bˁBѸ(QCÉFQht2hWF=ΪllDlґu36n;C*˞ge}6q>XJu+uX gۘo.@@dEgk F l %ҍ4"ƌ<)oq+ueRGЎ~uIvE=28=t"t{_OpÓ_Xe.duThuYMFycShh;";xY<)#r˝Uu-F 10tL8>&EGeF!6,(\fHn]MRߪAmaYkM,\؏f˸_3a8)S }h]uSYZzFS0w=a2sex̆gr)ڲ\!U*_H[ mj60TԴv d8p̳O gM{r\,+-/1u O I+=YEXWW B1f3RۍR/עK~s.y&mtx‰A& ]"$K[|{2VՌzʸn~IR`=xCK~,E lA{J9nYvhlL'a4GذmvvE2>PhM+55ŷ8E.RD_3o)JæmuigPV{KU(0qxJ,f&b3x3mf/ *^i s&U 2 Qjƍqki oMIlco͞p_@[b0}ۈѳч~vrE# ixoIskEw9f!/ƽ3Yߚ7@.AR˝뗣PSaѽ:0E-w[q+O֣be3/ =L'B$F'IG/g'e;*j,'A>6}K<˚ 2?oqt!YFlB{. ^f*e7珠BdO&Ûˠ]3ԮMg4t.Sި|~Fotp -쌟fi2}:"/lgsbVIy}KhqWkG@p79MVh"xGb:Fӧ=!_}nz~ӶףS5'Y|eKNKj #P{DJq''2"ٶQejZ:7{QZYX%k;CwZ^_m?l?$dwGMYmI  Nvu !|VS;wC=n4Bifv'T1~-vFZ`%_Y"a߃ajOA/[˰/\yK"ZI_Ow/l3BO:n<]!% N{'\4k MOCcz-o)['v3+Ϝ}urs(t?He sCI.iLLm@NLв*ʟ \Lf0zѣSGv?͘ kѱR+ caXqO@˜r#8LŮCip7 C`p`ZTpIhӉVC;嵓I?QFtNoDٍFw?Ow7e7҆}H[h# Y.OY /sr=d3}.4`zފkin=B(;Ԕs1! a><5X6qYr?=fݷP޴M; WX, ͯۏlV.͐@K*咽ws_7a eLC&dB}&d Fpz-TC:/d?Bv Ovm} h8t"d{IΤdgᝳNv "K |2q Hpnl޹7dupJS:vC{#31Bȶ.B:kR!Vmw{lxvO.A7/b1k -j!4?Kd;S>u bQɶ#dn0c +wP1y{$Ji̭AJ?czE;lAy[Ė[![6˙;]ax=_3 #r!I LFR\U @tكF{}r|)O1=_2Km;,{ G~¶OMwڃ`n*}EI/:p &ζ[#e? ?9B=C pAHƭR)͛v.Hσl;bj>u3S}j$dlmN:?U+ "jy/1JE^0 k{mv';8{t}l;5T1^f:-L`3m @}C*KQyQQUMx4Ƌ̳GH9jG ,G2gh)'g8hh|8 )Nvwit@r),LԒq@(T^sTY!m<`B1į,Sxu+7aڃ*ES۱4nxZ;2&5 YcOxف'{QuWuK?&ǛX;Ź1\Un!~n! "} 2e4JiOI֧ z;!k!W&x(+R͈„m?ŋNt=t= Bp+0s*])7.JG0Q55aGxzJj>LU:Q 17<^x<,xf#=M0<'rE+ >5eY n8GND-9aG7_Lg>QoTS9%q|"giO\N?q~"!NdVHv:/.]T~Z;fR/0\7mVcט 'LT0eBsA]S,w[~wٶŜ3׻u܉uy]k\\ՓlV]]]i|(kؿŭ{ָfoz\[V\juBa>UyNmm)8u6zV6֩}n߸{fغ:}f:&hV'*f=s+ uZo$_3~k|oi߭kqVo3Â5`Zխ[#S91Cq{|~֭sޅl ^"K:':UrJ/q5U)ԸjH\wcPO~WUT1 ssχo&gu7P "߅XMb`lT{|WWi]z %WgŁVZgZ]j̲BM.܈15 @UG@ )ʚ\> Vw}tu*BBj(UIFRm8Uq1:F cteV`nQOd ptZrē]S?YڬryG1+9\2.XN#υU-͍ r4|~s tm#4ri57 K\ll6/*>*׹fW=j;gmNGgid9Iϖ8yG p&Z:dlM#r^f=>hc^jQmBG]igS1򋵳C`ݭ#UL =ޥJv\VBF@5TYu|JLdmp9D<D<_ey=,޴KU3Tl/.%Ӥ_Vs$Yд2'xɯz>8#AM|=aourlJnƉe1M˘2)yYy]*j_ ea ɲXU0r[H(Wf\TjH!Օ-V0W2AR@^AChMWOQrŦ/P0^ZTy$FeM/#^K\+rv3wdopr<0-]}54|!U蟸/PAzSGBhҨM9hį~#ptE׫ e)aS/.MS,/JRGNd_M2>|YmW:L-K6+dMe3@ [dkĉj}(AS4Lx ] N:mz͝wEw NuOh~,ǖ'H KS%< >Cjxށ璕kТj5{=*XL(Q.\AsSӫ^t Ԇ;A!Ka*O+!(5OP%M0#_}'s} 0 ^9ܾP7iuE7νfY'st`ְ!W$ 7ѽ*I?sݯͣS 'ayhڴa%]r 7/adOS8@aJp{)Ga'QxBF (̦La.QXB@| Q [(\Gf Sx(”Re0:$|KUH ښZ).^=:` x}A mF ;AÜp*fjSүti<{ iA=Y)i@ہS4t%=rJcPӅ ;җ<f>`;_J9(7s<&u-ה𽀿AJ)X؍ҏ r7Ѵ^ ~2K+tCxS-Ƕf7_*U@J}oK0{4Lu-E^S75z6T_+'!n; yI7Ad-I?ȱ!J:p/$ ߖDFK ^x;Hjb <?rx>2t˦KQw?s~V>Y?\cwWW~ _63%1i7~=D 70U ޒ!]!~)4ʒX>[;'|T۴퇩/huߒo~- ~GoJR~|Z~Tc*$K+x]9_x39~{? s7??/yw|ߢo*4~4wAb}!+~u}Cg/zF=@y/mׅ?get.q{>7]n6R+Y/]S·J#]ֺ~C-)j:U\ ~. A]o9ـU_z]u-j܋ca8?.hX#0H7sĮcKgS{/(R3yI.J`@\ I8>jgE$_J0>~F k#Y>oZ%JM98KxU{4 zIX zNU3t£5U 7'h/O_'i;8\~B~<("?|W= ޮm?ji/4ۣzEqsP6X]:Hɧ"ay9c^/B?bN7oMZ::x0 m@wwWt`L_Tc/dl 8(~"-a؞to'xIuPY2kmM7S8R RXCa+[(|g(|n Px³SLd K)\Ha nq Y )n?wA*PaBWsc.7 ΃k!^H^h׾fv&ݐ=M:ndlصJZhe\k iqg)F FZ19㵽 >. A0^wfм$$dX Td$7'K&$I}Ad(哒2~_Zx\^JZZs K $ɿ$ |v*'`fze{&x;<~#wft)I}>J?Cr+\ucy:~ŤboJKmDo>^6D?<%x#[<P; $/+|x\ ^B8KǏEt.&ʧ-Կ }v=E4.dndN˹.N?LI%_]a@`d܏w|75ǟ&.oƗI/}_.ϯn{w~Dٜ.?lḢcD_@,YNzC1sZo%<|y_?o㲽[hx\Ijzqwg7@sq zk{ ~'%ƌ S/9`8G rb$*Lt< (1&@G$.eH|} کC;N^L$W)oDns_o$./Sn#ܱ<7_뫣-<.럧Ex7_7q>B|;Kg9G}|7;LZY_J\oj_ x,0y!?MQķ8$e|>I=SGS=C<.?w?]N|[Z#+}9,G >8b~$?Jn&;RI y ^G GZN>n|ۻ9)OzF>@;ISɎL2v58-3&~=0sN 9E~-2$,4A^ӱ"Fgc x=T?D5н@5<. ޱw0 㲼]gn#x㲞#yfJ̷'Gt^/yNL/WYDz,?+1=JTJg|%o"d}=~LOQ&|o\vn̚@cF: Cd,}-.m'|{(s> g}}㴩r f$ZHNesXPbM4$tڦ@O7c~Wj`!wܢ3j_S Tn7]M-^uO?q<*ۏIq<[2.myI ;u-7&:ˊQ.{y 性բ.gi/]/Wx(Y[[kr{nU|TNʹj`[ulcW[)1:-W׹-Ye HMثy^Wյ\ơZFwt'` Ra_U)P5 ^IҧkRxCνn^=^aAW,T a:T}{ʻvaEPU7hFɮk-uP2.U+tNC_>4 }؍0]_`jqY5 ӱ C $J!hy5u~_:]?;uW7POI j'>R@=s0RjvWè I)-Ck;eZۤRn]CWB{-^?84b4\8dIN+S;դCK"3p:_jС\c2Pi(H{]됀/(ݬdxҧ(;d?#U?fykm-k!lAual,vns'kaQeWev]Uׄ|ֺ@Q}mS]]ur FMNCSg:':^}hWW@?!"߽oB0k&P>;8UF&4U=:yCj!TtyQPO\W^_;lFR|8CA ^vc0\9d]oqu6x9-Ti.Z}uL/׳Av 'g;Z**W/:l@.{`s'bh_yˮ!Q&jf> fyMr]+Ca|Jmw4DVCzX]I]u$gwr''^]Ƚ^RVɧ^CS+P?ޖW~.nj"uPK bBcom/sun/jna/openbsd-x86/PK B j|)com/sun/jna/openbsd-x86/libjnidispatch.soԽ\0,nJ-K*nY nH,aAZjhbݫ>E"eeeeeeE3CC%ѲBҢ.ճnQRsfj/|fg93gΜ9,"=} !`ϻ SBfo!s z OD4 !<~E45KHD>1k#$=R>*! /p+7#,ByB"'seCx6 v¿b#w5ۿ<`20πhLۥ%`^ۅ&03&h|h 3`.#-0u<00M!= *0YeL 0y?`eq0 f0 ̫`x`VyLL6?< aoY&0Ls`ܾאn̛`frb03Sҙ.0[|C=`f aq#0{iHH_} C,\ *0Wd 9@2cɷ!&b*`9NH f,v9Cscȷ>/ `ns7E`3 x0&&fHi0%`2ng>0}!En3|K Ioo.,5|LaKރq?UW%~6P ]iD*4?Ke 淑<(%2O?[ɏc0΀5/ VLNM~9O/+OggZ#*zjE$QEx "=) 5'3E ?h!y_ IWuwS{ *ϢZHѐ~9s0JacJ)<Om_z^Ӄ?U/">?~6& )>w~i鷝kJy8imWEֆUV&_`wY_:3гoП'GAs9?O|o7CO_[ɘw7?sx->pc9z-dB]b::Q OwWH}Bz[5O} jMNRAW ;-1̏rj2 Γxz8}Jv1}Bc  ء?Nr-;A؞;ebRnf20z;-ĿOoLσI_w \C%1Nh ; C~s6k+菇e?ōl?0rz i/>?:3y|g[H@wOB~>!䛙mPݗLv 1D?Ϲ4+栽a|y9yϩ_xE8eB:W7VOoį*KIGx ,7eǪso37|1~~װ9 I85O+lOKYDŸ`8n=998QR> t=12 yq@6&s 8Z? y{@DCz(ɗ/6J?zЧ&#Cwb;?W۱8 ㊯`s*/?U\Ӽo3>xnhυH8&8~(q-+OAzA&ƃ!1o< VoU_ l.Peu;=ͽ~M,c44;oیy͏?:L,!I쟎«=YoxL/]v= ޮԓH>:}V|5[!\O77%&u0 ۫Py-r ޘskư[F e s'N6cR &4pdiY7N*//.%fɸIӋsn4{Ri3 aRi靓&-L-v德pʬ LV>;&Ϝ1xV3 N߆CrSgCѓJ=œYţܳ<ݞYv$x? _4sg`JIn[W \gϜVa6PJO/,(kƤB!ʜ6 q83e `)nabL ;kCL+/,< 7Y4d{Jv˰"G@2LU\\2tf9~B 1G 8sNt~.,, ӋC?aX# mrϜuP>m*k>5,bYœ o*}RyIaɤEQV# 'AXe9ݮYf΢  apӧBǧRQ3.t挩} >|Ft)qncECj y`YeE΃S,u zJ3~<!r,B0g]<GQrljqbd=N&2z[P=:@!;Q7x[gdם\v0eZikE8#N"CaѴBQ)P14s$8*h 1Б͜M9f@F;ΙQNJ1ӊT&JQ%3gE4hTN]較}t)hQn(5h SCѩ0xTz\*tv<:L=r:uϚ4]8D)KuRo42;a"KuNC19lj{܎`$s:ޛȇy 6gr9b|PR?@!$}$wNSa 6x`鄉-f ɏgJ𣿁xڮuǕ\j ?:K菿xxǠܾO"1j UO1 :ǝO$?&U;ɏ;%xT/.#+cǝ *?1**?dYI5u2*?4O *?UT~㉊:*?T~iɒ*?ՒT~pTL'?^O~!-ܙB,"+y}|khshCQkL*_%?M\!W/J$e#buwmSw~.WM??DOyNYĦ( .җ{!#,uj#A-ϷI.9NJK eg.;8$k`dA Nɝdŀ$[ /3 o 󻥎 ۱"|) P#^.+^@cYsm@}It\OSrMYCyebc8,'v ]`J3D-{0"4$I YlQ|8e,,CberYK't*GvٔG^3EkmOmvlH޿t邥 'Mu%DAFsă9 O3a#>ac2ELy$t3po?s!%x$ Fulc<(K!I+6ᖲ<ԬWt[M{1f}bؾGe7Cf=7a@bx3V I0Fzs͡ߎ1褈͡R8{9Щ=k9tZDtshd:ѣ :3"\be! 0d^X&<]n_3(3IePa C0$;)Jۏ_ig~~0!HO)"h/vĮKg B|dNM=XÂ˾'tIģTGˣ\ģ, ϣXyԛG9W#;q|&dqEP`) |0G/9FS:m4O0XrH0v/0>.;DF&F:r<#ˬ|>Jo#|cx>tȏ)^T.i*X` RIsV RI$Gr_(r,xzM.öt~A)WgxGiBk" PPy"Zv6K $>) ܛUMf_Plp/I;>+)q5@2=Ip)È|:g)>. BXZ^^Hc%x؞Xu)ٔyU"YD fUn 2yKqw9d722 ͱe'1ˮy|E_tStȂ2:b\zYp&w,!TKPh$~`H|}1.*?ϤђkፁЂ+(N_4Ռ?~rƞqv5Ec~1)f y.,=4Aކ'c.ˠRZ{ ?#5>lh~OҤft\Dw ;x1:SBh}TQ+CeQAhcX ̵1!`zZb!NbPq0E>g0v9I17/dܞfP6u5KN LӤlȸ"8ъ8#j~uhËi(Z~,o>EB*gųRK5Ts̟!E|Ǽ8Vs1 sNdJ=N+wsw pFG5 KݻKM}Z"QʺѪ=Dǧ%l6㢗aFuڨ#~󈆔}0~)YոI!OtΟE|42ķ1[:\G8bU;Sv+gR/BF5TIL llj1%S)g5 k0S JKhGX`z ˘р L?7^E)B05>IxlW0iDq<> \Tm)%ߘ 4zl J9G7fufvH! c*1 Ɍp,PzT/97r棳'-IO.EtuX靶7f(,;`\E;\duRK& q {$~A @EVj ]E`AOi>_[E@3DaK/^JU|%I4@> ]n tune,5-M?-U ]'a H4aMRGh+ +S 8?dd(+Ep3]OTSCibX|.zAIa>~HlLMVYXDpJO' ﱝԯ[zN,xUˡЁӟE!(N-e,G \AU3-G=ōZO1HjR! 7W 1eCD`'*ƕcmi<кb'Aeil5C#g9999kv+eAKn>n+/D:-#CV\iO#"j[]cā~ @9f/Xc@6׎xa]lL`ux0{Ҙi@5l!ti֍ØT#}G%q_'ᤱɚoM*eeIkUoպ?]Ŏ޴ ՛Pm>2|Y/>Iyh At݃dJgNVVמ Z[\? K'ɼsoS2}|gYIѧ5:}쟛<}rD9Sͱ6B%}0ϘEtt7ϧMsԊp<}r)3C&$vggfY }O>/>-?ugf9pwR??5ϣgӧοL?5ϑO3xIѧY}fbB4 3II;ߴe\nj> N>Fb }<}"}/f35O>{gfY }<}Z[>y#3Q8}.}RimNygG&I=yA,Tfi0>=>8)]}>4OI+<ٌ(MrJ} RJ}mjxh^I8Wl뼸їtMEL*hsTe0ކNiLZS$qe/\*Ay3ٲ).ɹPvO]@mP5Vrŝ-=vZ]@;T`F6Z9y_!b)k>0㔧>;# &3niEЇQq1n'—AAV))ɢ}lA{g~ UGT@L U(߿GGþcQ&"GL?~qw-P":o.2 d}Pj'!sdID>e d wDf"2~A0ȴk' I??d:g/ OYoMV~ V +aSiv Exemk!+8޾$oa^C^tU}.Ir7Hnܝ&!(5KɡݼF{ XЁ6d[ăo"-y&xvQ9T:2ªQԭjMb C T 6gO dJ' `4Ƴ֒\A? JV.DyG;Lƺ@:J rA"ZcO>09`>JFhGNvK_܋]FRr&܀zPK#wI`G$W%;g&a,ɵHrTek)?{Z&SQWl"Īom*"0e܉|o[fs&9;sF4VF`:;B@9ZG~9nW(omƤjIZYTd7EU1/iJjuQZЈbnwL:vyNؽI+;pO WR؅b >d ˉW :'3 #$~tH"ts),E'];qVx69qKjP|D :Y29` ?Ȧ16b+`/LRhS5$_ь}۟fhfoٍ ҁ 6n[GjC=v7>hl;x s1r?1]jTbxtyY(wAR`ss#Wqԏ|ٚX)R*okC^|M,_(zK.vH%'+z*^,ݮH%WGI7tg.'bWP;ip{J~ k 3^.je#).FG-}_CәrXV~{0}U&Ac Z@Ph\ S[l,А$:iaKjKPel&CI)8wqut#׮&gu5/p˽@ 2iw# }`¼n-\oUxUGGlVه!L q/>p-X8)QX/,1r$ TeZBnjʉ@b}yt@;u蟏;NڮC >t":'Dt諃Uv"ЂNa=drt=\Hs|.\a,-c)~-I?} 72'&0a87x*a^u|4|JĘ/hVawn ~q_Vcj/l;<t ѦxbTmĕ{fu2߁B/DAq;\*>rB7 G7J%2|~2t߻ͬSZL2m6eëRe,cZ63AB?^\fmC<'cf*s& ?CtHKP=Z}vTG5yw Gs(7^)'L+!(ʦxlg?ݐ 'Fco (.eÐNfXBx[{E6k P~ LhgB+ch 8d{I]_ڪiaijHgZ5/&;uVeWR(—VjLJM/գEOd7yխ#~Byy²ɻ\,zVVj,_Zv^Fč?c!) c(=qD]Qd,=_=QsP:]g* ms= *]O'7V}>ǔ)BYPժ}VoƩ/fI|2B^3DmwCn>MUHV,u+.UK^a.7KdNxjI RZͿ U.~`'L߆vOԼ@:v_u˞s%x; @oD4@M`O^2/'#W0~"|3VO_{3'viW.6y:]<]x ߪFp瑲7!/h1 wk1֊g©պ@>z+яdžCS$MQ.?P "l0%›OɧÉٓP+!i3"FO?)R 2\UvU\}מ2cO`'NAOѠSFĞRg7۫], *|__nROXQK ZnZ=,z$óOB~2MN=T<4E'r{`"O#=qz=@fXD8%6?vR\1{ytJ{Œh 3A\aXUpxq3T<NGO'XZy˱kXk"-ǖ2=r˵2_4#?匐t2&]t<-fFOyb /j4s* {6FqkYJ߇~x1vVCzk F$7$M:!%'! Qw(KĤV)<I\@:C\ WLFS˳^f /E^CaRPQ>"P>%V41=UNP:8Sj1YJ⊀2alv׽ͮz0)Q9I6e7>ׇDŽ2]T$\ 4k@3!Iyܵ„ :|;7MFΰlaFUps(Qy%v=h!.xШB**W `wvՐZ9tHGWc.LGF5x!O$ml3ۉGtb6ϒm"ԧR2Rx褦>e}JL1@Y+LńwC NS$cB]5AF$><=>RWQ**R'^ĺ/hC@s-rEz[$(+#I']P6xoGG zs0N{Ys6>z2=6虔ub5YA{`gpU$ MqAkCJb]򙭿'TOȨ=3N%pU/kkb.=ō[j ےɴ)_;b g@.]@ID07_Kʹ(^ժmwl8"v$^ %#ӭtFAΟ뉕8v=iYLA$P+;j8Bw\6l{ yFw)oOyQ;^Ty^}k򞧱Cħe8U!Ut}Tҙ6fh]H<侗+e8ڂy!:YV*\%DO@ǵ;'Zc~;x=9{^Ѧho!-}5 HXBxzl]Z,?+=vvcouER6ǦHRSOHCX!G.9>{ԩ\\i*wßSn׬Cg/rˑ}Z\7`/n{s'6o*T(%S ;G[A >OqZ=a!ogE3vC>X>zKh]M)Vsp3&}>spX}&y6sp2ϧ7g6 X)8 כg>bl6g+8&)dK9L(F98 L-%fc2]pd-crC(Ŧv&8RH8 "!8Q*_f# l8tQc Ok8IG4<ԏzTT)l3_MF B He 1̡K!|@ ] Cvsȝ9 /!0ϳ߻ r7A~GMt9C6Yd1\>E`7S/46Fpnփg81b8@>'-vͦd AE{f#iQ KB2 yyp%3`NЏl3˰4$O[b2,a&K ( ۂR]hҝB_M'WG;]mՄt8D{ʸdnF myRBUx?襱Lu٫gLz5ZLN9m OE,r[jؘ#usvJ&f;$%2}=2h'14jQoj/KљH4tAt$DtpƍC'rt~E:t% ;Hu$}-Ml CjrCs:er rvcrw t=t ww :lBL\|yװm󶸇 WhCw|mg^SE:LWoWSRVY(ern/sELn(jK퇩nkp3CAΑW^ vëBr;?K5-[AUͫý=Lw9&RAGJlrMBm\%u+h?j#j)ݑp,ob7 2."MlLAYİ̼ C0U9@L@ () 38l+ CQw'8% SIs9>?iͤfٚrT:!73\/;Oh MYo`k0C0p?L  a|WP z`@ d10),c6^ugH(gZh&(ulaz[4hNT䄵Z+lPgmX"XZ6X.c_yxvOLJ@@txxʷl| o'Y *ޏ4JWoI.!8*SɁ0t_ 5}g8~iDPv({G"ҡe~g2҉*|AоفDLػg3́9ԟsʴ+@^^w/31@C{B?U= .Y?RDf=a*:Q?$?A*0`QA9oEPtqJ<|"=sya3u/avH; }0.]OyWzWpwށG#ta \W1iZ\z!#^t41?. bCz$6Ϙ)1}y9\:!M4ҏwhmMH-= ,T ;q)aٙ_:δjx3큖9|u("ޏ7Vrʲqdء+aTbqոlqཇDvyx&͹Ayꈁ .K?ʇanLxLdMX& Dʭ\Z~*啗ɳtIKfsׯ , MH f5Ha2'=q`xi';ɲ?Z\֦o:eδ.o:x_n'A'ulagb Y:cyDHYgK}?tLg(r:c(+pAM2d\7Gt>n$$˹LA=C$*ob ]Tea+ KL0yXgMihIm>oGik`SF6e.Oi ! Ү=#J|eOLzT0v~tl&FʹͲw)Mv˹!^!*4}r^l}[n>~˦: l=ʲ p5zЁ_ID ZX{z utQ}79 )'5k؉cbSc7mͥP$)/J{&fP; z8eWbC [l_~ -"ރ51={sOE*l?I\`}a1#R+J#y71N6Ɩz|jdXB:όfbj4 Jk|a!P^+PJO6|挻hމx2/ |ެG wmvէI=Iad(~$pk7]ɥ-&t:䂵rFa'`sʹNىT] շL8?;Se]J pmzW;SZPe%ӠFwtk.rXwDf >f6.ha} lߠ8R#oɄ:An_g~1XJ 5ĥd&A9 &GiD݁~?YmYr,}d_L pdre"j?J>I:3Rq? NJrrN|vz*b > ֔yyj%/3 U\j4eK>S@s_* [[},~@{:H}6;FYeێb?^dls(o3UPqCw|N v);$ _-t_HiܱM5Qh) eqU&}HsH|LDR ^wS˦2ºAS תN u-jG)RGy~Qfɕu~Ȳ[h),{s' GB(kaeHl+C =r6SB iRHK˨n/,v`l;ǔg%5oIpV |B7Fd${c L闪jM[1.x l)4w>$?%؎opGf=H7k6H`B? mPFWəŞc):pܞ!2ts=>`YDlH2( x"g):c櫩 aZEeQl/UiJ|uMRZtw,_--xWc^ƒXAp!THRMe”i4'Ƽ; Ed; 7D%Lc T^5h%̇0CATw3bGQ2|Yt)+f=t7DZa94h 73}D&k >"^)7cހ!,dwߟ.~Ku;Q>M*0)Wخ}Q&`m2#[a N -H TJo9bujY)[b,ewRMnrm=~:i >+Qy:*hso8*f v_|a;*DpUP8*IܨakBk"@Fx>maduC줏x;`FE7̃8+N=Q'?H:*d2ўԋeÏ?12rzfst?TV2.=fqJ`PX =Lj3ǯQ!w%|oA#7,zjXG͛D ŐzSO2e{p|EZ 77*6c=ebJ%L6&pͰ̦alVWݤ)VxBȆ^3ңY;84u[q^l6MNbXo4V$Rмui|AYFAS.+ ЪڢE-4N$G_ox-bWc;Q@𾲈6*ՎEcb bCZG)6$]H~ujnpOܷJ` QoB*k?:wuq?EzWVh>7Rݝ6왑 ~2rܽ\Sxvʹ.[aSwNB i*|e?t-t610 00`"'6jp2#C!; ҔQBP1狖{3!G 7߿6~oֿmԿyԐoqc|E}QM;KQ^:g09R~R]mg?ʎݨNǎ=,T{.`3b"b<+- [,d.ԃT9I_wrRNq]"0)6EȳOD5rf2 Rx|nJ3i uw ʗŴc;nt,p=00o E0qwg6$C:6V #u_@ sn5&ތE񇍇+ aX6' SS<1 -ΩHPA*s`_G{vV7'-F]M4C3~?6l>,5W _& wFX a CÁHǚ\֡Yge[k\*C:g d7( pNV7:[{g:f9+<:߃6K73 Hw /EO_WNcr";=sayRmGۚk} <Tcz9{svn5 u !'qÍ!F| ݉1UVzKY\ZmEoPW6.ͪ-vdbLT떘Q70HPzQz򄘘)0xK#1nNĠ ד^ :C^OݧnYZ~:!5`:NV"'~#el``X1qP 7I_ޭYX_$`,)!T?<:wmIŇ8Cͻ CJSEYtJfog7,BH7I ȵ!_G aaXʒT}}w~_zZ99(t9 {t{:g$p@0F˟F6=NZÎ ud3 /y7p)j56&╂tSiI $X]Ku\c ^Ka{pX 5H'JN(^-_-jwdمT>|O-qTNp*/ӀQUjMxÁB} n[}v)`b04Uϵ4Xm@03 F/zPhcڴOè_w >CFk1]ɹ)_ uslFa#,t=׉W\GQ0 qm&ѭRA ߍFl49Ǝ/MiJҮh|}o=MtlHf|4N#ndžSl66 <>,ؿ)=2.iUkl(hq_ 6Y8BS-P~8?הNOKVlmRvY]_Ѿ#D0tW;|%,[87V ڮ>IW NE6SgG!0S|'ۆ#:YqrQۉN#voR+%#hv$ŹOvJ>Ng`&\,Hc0im=f]vcMqi58' VI(s !v"co"z"6Z'lo&@.e,ervK\EϹ򄮔~ &7u\  IB;@1M v18 ’?[r+:u"cs{Q]h6ү,vwiqdib%4qZmC wΙWyz?3_̙3g93so`9`Y!:x%` "GG1mNeƆrwv{~kotQxrd6WnuB|f#+9 ry+ξow^hX vA}wR2j,y;xCRԗN^J7oϺY8=q~ʼn1μeI$KG.1?K¸w0 ~p~\r4Pi8͒#@O}~4iP{ѤYϢTjRRlMm Mi>vDJj̲/E.5n8V(R|o\̧7&/z? m+vhqA: h^~Ո> =Te{m7z? 9MAIR)lGqpV]@/5 Lr }ۂ(mx8o<94 OE-㘼M+<]c D`wzVٗ&Oכj7YR:GdIzډBm|v"R~R]5A^I|T>1RgZ#vyr4G?=2DX>g4.R%CYfK+8%^A[>!C II/H27,@_:Xc8 Rui+榺dZsy߇yнj "mM?m [ym-&xT5JM*\'˪\\"m=F$ΦTHv(i&RpWl-q=~ Ls%+epr ן]p1NbhߨۮpҦl<G_}4T8D$6ɗCm '>-\IA :rg Lq`FCtfS/A[LMU,x$ÂN@|_BEEw-[;]؛feDǝ4:=5M#DgRԦpf }s'=ysgQy(F*]M1gM{=Zu<K wQGB<[y`qȅ&|q9|Uc2:ε~O?Щ%aPޖ@3IK?Z *EaS7g>mvdem idžDͤ`1[`x` I^]c.-a;yc 0iz^'"I(ͥY4ӈzc̖R,vfw>q1Uܦ -R:Sk PQO~\'H=b9 ,\CKϠVvGyϢv{<'Zoo}%Q;y.oAӋLY |7=7<EEw47`IE4]fop9d)9곆{ܶQFL#HƚytH^ca;A/Z K<JPP 󸍌7&5yuJFZ򀂏Moq 6}2;`peލgmF{j`>̫ndǩ7h\+Ep\ru ]0,VkL gf|[B[N&0—_GebhOVrґ8·Fs6Gʰ쯄,ZQ(;ye$m/38D&4%=OOsy+"y+Jcq|Qo"u\t6,x}R+@q^uAob+$>$_D6:N  ~`O- F+9&v'vx?ǜ &ɥLGbaB0:Բ.$x]NdG\TL&u1*fnn!se5V.6kQ(f޼P}7dʀuMg bhz {ۣwSC'#Ir]>F/ARq.ʁ駴ڮ4w3>] g; d/ނp w>0*ϒ&B~< M+ gDn;.gnuJN"~ 40\OZw@#hC/T*rn(NFR R b/Hv($`$aR6DOplUs G%cr:?ĤKNj@s3r Z /v!I8&2ڏb`v(a7<{  %WHQ~G>"J8Kޅ8.[hwa-`Fޔ&NC6×O 6;fTLSVʹlF/ܧAGRiP(0MJcVű:cͮEDqӳ|(LhfѼWPɌnѩr軘R~Zk(<t;atUOr>误{WzB)tssLa~"I:w륒;ZVth74_r?NPhqVl, &7 bǒoF ,YÞ.~ 0{'Є)5y a36eE8 J `!3d;'[Zg(|M-Wr1-0U O藍 ;n/^'pca?+bH~оU?/8\I8Q~5.q !O6~fLݙ;<(zōqō&{%W]@\U}m>XPoP&t}m%ꌹUٍ_:F XWrJTM3Ksͅ7<ov=КT8-?>K3x{A'^ vlo>eiy ?@#P% HJI8G3ET4%~)q=sUc,\MN]n1nb|Yܢ"/_3AM 41౦f2E.Q6>Q=vO1&E# I-':W\>e<0#:t!Kī1ۓז$6kr\Y&y;d\X2.d^S r]C@zzU PP WhHVV], pnD uSn1gkUClЬ[0 O]Ֆ |9lEZ|-ć}3'Rràl{Ww\OGs2NkeUTCtF僉F8>Bl(2-iN|c\ a.jG bLLۀo-H <X3pu6}x acXo; cWW$֊2q^s{*@NF5!aT;KvQtoB"-,/^a5+L7Y1 atB;M_*F{"/$ 9yͲ2>xt:}c`0_._<7_`%&*i` oUQj~9*B+,;;eɂ:C =6j(`'%f)A.~Zfܟ7]Ƭ2 'Կm a?Q.k b-l d?A'- %[pNC\;7u 潗@3Մ"(jAovP)Jـ" GƵ+#Q9 oO:Ը]s㦹\6!8>[X]T_{iz{j{XOڽأ13s E. o*`6`b?HuҗCm&)]):7`7[IP sؠLL NlɛZv\NY vjuZ6(A!b }{n:6g{EuQ<^Q=Y~i\t.!K VDXvF#}]0\r5rľ7KJ&$~λS7og ͓ M?w`5ϊGz&vL\C5M3)qt2oQNN#nt+"Vf@odny ]>/$x5AgEZOYއ q5c%Nv54;h?g4t"r fw5aU}X̋"ϫӷW$Kn/8$t E+iiz(W n_crx0R<r4J- 6%xyywOG_KOCxB5 !< aHA-4rHZW;V_6ѷߗ>o.|[n nw>3\!o -]臘0Ba])n% %O8:'td$7j@<0~e%\EmUb:G{E3'åǕ[m^@^g ٤OcsH8nҧf;l8S5;Hʅ,K/Y~{mKwg.ZR^ݸ '7׏[ ^Ĉj & zG \y(uI7?$.> *1/AZI檂~*G,{HMU~5#TdkjCF,u{ذ:O3PQ.VV@K6|9jPMI3Q)YW}49<֎t^PDnF8;6C8QRh˫WF)ȆL9?S'b _n{萪<|z&:;?oj0z S>+ǖ<[5?(Z0Kx p> qNH14cܓZݗ˫*`>uQ OSXlɺt?= ad}.T8]$O{z4C 56w}PƢ⼂laӷPe ]z]Dm:6< 8l^P<xH\}S3 m^ V"|j:Z Cp[ofaƞG?`pov5m4\biYOxyT3z* /X1W 'ڞ. ᓩc{63I!~Y@Ȅ2!a5^pB9.@p |F&),R!A a b l.!>3KL:Xy-G>q&URvg w _cr$0~͐XZޔ䜖F*_ @z[,}Ք`r% aW ?~iäGfa>-$ciA$j,~do' oeqk$^PJxR|}oXx8]J(ƷXxN<ɏ4gHoK)؋gXW xnlI· ?&H$8رv^?v,ѨaҰilh1} P琞46vWC!=5 Sy?jO,3 _Ų},0imVG$W (h860 +H Xڽ̊,8>@l fl: P^.fl6\_#NA8 "0v+@ȇP BfAxK@8,χBX!B)ru!<E/A8.BC a |!Ah!SBaP\K C(PB3 %G pE3<@ȇP BfAxKC|<0sKD>>+NX Yq.̗y';ze]}!jwl|_ORa,7Y!4hTI@``i/h\Vj`~!)6c_RW~˪k|3 #| ߮F_;%ڍ$i:MG+Fy a7L0kf|ˉ y-moHL'0r '쟭œ:0h869m+PaNi]OTQrx8N81z0?csAIbFÜ0b-[ F>mLKߞψ7#x0%-+'?NJX>4F:{tvMot@v :\{2{JS oA cR>!}~`K c)I <3} . :7ly Z%6A> ܛPG E{ނ'k]Rw ~/snXH_ ksyOc5I`.[Ufƾ#d+61ȟ [@H U~ʈ<pj~p+QߛwჄ&% ~o3vߘ 'FL,c,(x ;e?#>C3A(9E}!"9"H(񚼶@,-A{w? EWWvܘɛX x[t|5u |;Zi0Eh֞`נ|님^u{ | |TTblgfAx|VP6,[+? p IwaL90g@ǘHϿeϥoA-3 .mk}Nl;pki ,݀d[Gb[7cu _l$-`t=+FXaQ>R;pmDOv7y{A)$olv?8YCgo/_Mמ E}/'<_C_Zτb I-]}O>l8A2w5yq V>w9!4Pi[A'sxglDFx_){a "qHķ;u}J<lt)E}>o paK>oSV=c܏I+}U`+ h00ZAX\dK\p%ЏZ{ɬ'O^_7Շƿc?o˄9"=-!}5dCBfg ҏnlkl@FYlAn3p ~L`x[^^Vzk z(EK|1qauVH_-ܶlrۍN SVpuzHr*e ė'Z^歩qz\VWy[UҽU5#o@gպ#=n9.{XG,-a1\ťWv?v&F߁ZnyUYS냬#?X[^vda,Z xj̑ڜaV~lց{G<^-u8*q!ܞ:V_v{FoK=Ep%\8c'pwT;;G go[=:]|*erown~캬v;="[Ѯ γtu8ʶ9q |։?#f9E7+rs#F&˽m]9<<7:US!]~g.t*ΣM q3(pU:i.@l%ؒǤ!_y\"=8'Kڦ:  8#}Sw&o,0Rmsc"ܿXQ q~4Q6|,f yk/ֈ6t Hu]h)GFv9C"IfYbQ+鸑ͯΉ*V|*@mL Fڱd1 Iw'Gk=kt!IRƨ;WȮ[J"Yڸ1|tqGVoQ+Q0Vnh ]ոd|([Tc YKpc҉ t:(\S\]?P3z܀{C&~8X5ɽ́GA+-5;Lj<ՑړC#8-oq+; 2!S<oYFF뎩ClcVDʒ^[C'D Xͅ6lP|fH<`|bͥՌ.j:'IӠԚDրN:ܴ "Ǫ5rs8ootl]cw0RG.?b_,1 dqCnn@f&q4hx:V 'I*(U ;XHQrR%2GacT:6(/cMQZ>I>wZ36ePK bBcom/sun/jna/openbsd-x86-64/PK (BNNsѝ,com/sun/jna/openbsd-x86-64/libjnidispatch.so̽ |E7 añ4jDTDI0] Q4.Uq5@DQ͂E U%Vs5A"~Wk$& <#t :/ZKVUI[ZVUJN gi`>epdAgp\52\czәS[ ; AϓpõUW zp} W \pUpy C]|p WoN*] ;} @ؠ i'%KyJQN?'uO!p7և ׃p ? p k 獂+9 \}]s[*/%s;g ?/w!$z'Z0M ~!k ~!g ~aѝ %7P׼m ڸKYv8Û^Gxq7! hy,?Zy;wo^A] M+ WڶQG|HC-w(Y#Xǐի}Rxx`IC`m~"~P$㗾o[3=Wv4-!ok$cjAgRxw{zGp򁘑^MZ1~~F?xr6/x^.){4OJ_q5eX_.7C-VX߷1%8?|o3,0^hm`~m99>Pi9z1\q{j3z_x9x9\?8Q\`܅?q!VX{xNA=/>Wy8 1/ ?u/Ap`i8^j?{}ڽ<~0FNϟ%;z'j{e gnp~WpUzN^x}l8[^.y?۫mJ^_ >6Ip~O}좶?Wǒ9 OV ;/s񤺮׻?r? @ΏW??_qRx;S yۿۯexҽoy\Xt7/s;Ka:p;NLSq;#Ax^/ g1zx},j?Jxi boeoPPewR5؏|n{|g6?|]Zu {s\|WmrGM7Hd<֕%2:ossӝB2Hq0_W A\;ڟN {|1=!~*tևX3H̡)iɣ2ƌ5vsc81cl;(`˟P0ߔAN8jcC |`رO~0:זmJanfބqyyc2t]0~b13Ǝ< ;a(DytX{a҄1! l} e31w(WҿoJUXGIə[T 0x*L3~4",xl0BTo2 yh ;нScl:YcrChM Ӱ eg>=~T&?bMf&) c' >ΘB&1h%\ۨ!Q6@6(%3 yrs3;!gbHPY 6Wߒ8plYߐGNn;@l~6aVM y;`CјP xz\arGdf=btr9_NˉԯHcN~( JYj)X-e\c z,)dU?j|V.+bYG&L(@y2s Z(16Kjބ-?ڷSEmE  ;yl>dSTXPk%b?ӊuX1h &>ǃ@Aax)2.Ȑ)*hxlL:i!֐ s~KTDc[[v"mRG \}\r.T.d.R00CdۄQٶ̉4Mz[&r'TRX\^.i8bllj} ^'2.CCr m]/eg+6uxMrZzɊmW;v>F`Cigc\[~A!w|!3㩢"hP|T o~_W8?އ}|3ed7K9/,~9Ї_}?݇x~$Gs~?c99܇߇}ɜ_7s~07q&~>7 972Gs~c| />|}MLJo߇f~4p0~,ە-.9|װ>y }y|%H&"V ceᆱ.CW >^~?lO foB?U`G ~U|=X?[x_*/~/f/ß]X/_C |U>_|8Y_+)ŕ_|yYf/ m% ; /(⫩s~o_*~_"wX}Z' Z/>9{ ?M+o^f?Pv h~X?DC~T~!?S0/Y➘|/ 8?Y~!%#~ E_3DOeE_.~w Z/ z/ WL$_Gd(>H?OG ~X _$W_,7, _܏6LY~/?]o3ϖj?GRE/%Gq$R̎M'; r܄44ik~i|K]N@m;!oKi.!NqNHBo@,Fw i|ÝLt[!Ot(ր; @k1h#i!#."ф=Hw$D!݉΄Hw!DBD+?_ }%'z1= ?ѯ!} 'e~C'z~F:駐%DGzO#H@􍄟~H~A&OHw'Dߊ̈́A[?ѝ?ѡH$D'8ҷ~BxO?uHIނtoOF"DB:w~@?H!Dt_OL!D藑I HO~sTH'~#B~~H?@t*'?w"ݟ}+?7 m&D_ 遄H?HEJ>{鄟H"DC,?҃ ?{~]#-H!@g)CnOf9V+" +h i`#ُHYSav$!|+#ܭ†,UC̎Z]9fyy%lrD3Xbvۮ6<fGE$VDMrD.C!NH_OUĴmW;ЦfWMAQJT]>ߝ:- Է3gCW,Q~:xUmHҸf@k[iwoSJҟ,UuU3P2(sf<5)j1@Sf Y!QtB `#S MAIMByM`?MY{7t> :-R9U:hX8(Ůq)+1KWM(DŽM@ 9^lغ [ m.!!†+JcBgYg؀Քa5)~RO?U>n0zJ 1?RZV!T^)OI9D,._%,Axe/̕ WX=,{[{]k/oZ5/+ y44}I=A{sQnTl.nФQVԡI/ *=/4iA ISZLڴB@V~ۛ 'FrW \a=܇]#|2ۼ3Bo*Q.`|e[h.Zc[kG6cB|Vy>jAf۾]t|CX 3Rff>ޙ B7j|;Rxfyp 0S'6d:Omۮ4ГzblSBX4qhew`8ڃ\:LMyzJߘ 6n{ZkU13]3zvXfVfW%{ފ[1_caP@yA}~̧YXȤ@QS.թX!;3p+eS-)2[Mih5ؼazTrgXߊ(Z:SJ|@C T@SRrDj&i{`:th?Kq9f̪[q@)-J?[GrG$@0+Sߚ<"mܧ>3TRJVYY%8zKv5Dyhظhlah\wtc9to$^/֩+1 sZ_8zAZܙ).b!CVHghٕ&H!.jy =Nfz/d{d{Yʨ5KN M@,c4lGQ(;Y-b4"AZ0@<7- ruQjBU:JK#``+f t|TcZu̎iqj T-zě+!a<[h~`H C[; m5kFuDCK[B4gn t_PH=tu;[a5_CQ7u77n lպ[+;fo4wE޵7;_wg\ {m㹭k_f+-Tk Xlt.ȽQbjoku%n"2088Cpp/";x^׃F,nŋ,Dy/]ͤ75iI ItbI+RECϯαolkrof9,_ 5a/:Ÿ ܰXmx }5bc8BiQ@)ЪDqxcj}KڄXSdL[<71L"_" -ra]*&2HIq5,ݴ85Yp4i:Hh%lN);!'=)[ @ANENpLٮ}r:f͸pjK M0]~G0_q[gF%Lh#N\ t%|A*QJT2<=#½{_~x5*j2׵4׉wuA*GPE !Sqbag?uw+iM&w9 C#,gS'a"pqs#y{ \eL?5)Ջ ; !6߈ TSQc\W_4pY§}(NQ>ܴOưccO8m<ui4(H(w$ $Y]-V6׀7Uqf\> Kz$mV~P̊rGS#kݎ#1 :u YWS}ض:4rAS&*gyx5Iތ&D*Js`Tx3uwre;Vu&̷!~ssg|3a0'F"fS*b>E!'}jzhF38tMBBrqSR1+'%9 V@V7"M iPS҄;@z (??-jÓS0:QKg[4T9b`  H;jǧ,{Sj8g_D@b0k3 O! GYߑwƿ7 ~S]GRw s*~LWÿWÿdGrBOK}{ />aGGozGB"\11)&?>'5t{je{ O"_~#Ï{ V+O ou'42'4olm m/߁GV_w :AA\ÿ?r4*٥i  MAc%4rPӚiXrb\qO{-1J99 4:q_l:E `Ts]{ܣN%FZzE-=Tn;Q҉twgzg lQX%МL5TSGy |=ܣ>{5j~!Bۮ@C%~ɶv:[=VޫTCqY8ګZJ] ֤fx_Z?v@U=nQs $|C9( .1vm?B9x r`kw9cevz8fUS >`Ԯ [YGvzoKzb+/?~ra [|?:jfj?߶sww3.Q0G^߆Wx[%?em.}gFmW75Mobow1 ?y$73τ?2H .W0-dGN5Ï۽&ob+n'35u  jGJ)G j{-E5 $tp ue<]\Zj%`XU`H;8whh2߲ʉ3ZҝҥsPkMN ]R9<)ww_-e@i;]aRNPyK= }+=QKiӊɥ'oYth_j)İ7{'L ZUhzToX]Gpz"AHIG7\p'D7l`=7 \6G$TZ˷,N7|6z,/@CIdVJ ~P͖"qk~1:[Q9VS(PP/d˩dzJPν/Ăs$xNW@ZG~Q-< Lea+Gg_rjJ7gHL:ã Gj# !"F שu-9ßpO(wb9Cv(:0ta.n_N%q=hi ժ3GǨ: ?"/pV)ǃ7&@{R&ABAdTwmwZ7TBC[J<)h{^XG4g[}}{ l('gy[=*ٛWi^:E5 {T/G>LǴV>54`,h9G/UB)o<+ *;2ǎQOQq hpaJ4cQ*N?SO?r3k+~ORB1:H\`0/%ڒ&]-&JlSD8Z$#-rH(g55QR+B>ۙ16ZIbGk=ę5$qj_7UB>0*&D3%2h&pweLbDIoIؘ2&q`o+-τ0΃eB ]Wp|筀 0|??鈪ZE%{g}lR4IMOnu ~Jmѓ\<&M.n^ܾ$\+T~,?Go8gq|4?(݉W?wAzr7nSHUfW CoS9iX1uI>ϨdFdQ3j0f0FYŨ~gԽ*d]̨^DM[ ]\F0느crŅf eTՎQ )51zF53ӋdzFE3 bQXr:q ٕV etIE* ײ0S2_ʕ ֛+8E*{0͇Z )]MGey3JHoaq\2:'W@mqVהU4qw86sހt]L].< . O"sof8?ߌ?o{"y,}yPg >cJbla ,hĂBxF j˂ֱ*2J'wHbk'Uj}.Y%Xb{jH0X߃Uhi5"Fd+q&rSr7 {gZ*X6_9HgpR O;~k2߲]8MfW* F{3a,M3Ks Yd1QEH[a4iACL*9S4% {bN$(~Y ")#ZKGU i"-MpmLw-e*U: xXD<7:3̀:x6qw 3Z(^X7y5;V׺ h: ^&gqob%2C"rnXcSgH4jvTĤmxqO✱HYN /PuZo윎n';,d:!+|&2Z",%Z7&n\*1Ao| x&_R྽@k>qBD78jjPva~LվݝV(0h׋,B0̌fi QW PP(pS;BĝЂP}!>!@ɺZj A3[ OnqPy!Ov7NhLjU8p(`u7)N课VP?ooVDx^ Os c@U{xfH0Xv]Snˢ Wjϯk*v<4^U?ƿ/k Gs .BCeby+GuaUr?ӓG-Ŕ k1y2*bv=Q aկqݵG 7UiNx5ݖےz㖡.-*s^ܯ`X&-Szw`[Ę4 Ne%Xc* "L`Mh00>hNWR_(UxK< B 4Gyd7Yg>Ⱥz|Ը]. U鼺d% R]Rv-NƷlEI?¦r|3-߰JS`j|zsV_íמUNB睼t$+ɨz8>C UR;~Y) ?yL[ c)yؔM4ǓUyG/ |oM]3˩+6ǔ~K) JMF7 *`v⾴ i|"Kr=j1$p?O@Jr|󔱸^3$DzYk\IwBJB_\̡E, Y޵芦HUJѹVbbNiJ\]T5߷xQ@Ԗԕ~,=|oQ0o 9 '?rOAlm{! =V /h_c>CELWz⯵"ҩ@<_oS@b"ǔTqXߪo1^l}P,4k<w;ٮepV4*oz` 7#,ʊE;@F? N+SAq\Ȯb(gxqwSK]z?74Ji'_vj9X0Hk,B&Q4/bNr|?i>?+}@_o>u{gW8R>\k([Ǧxeqhv($Atm6ˉY%SӒc%hkiMi"OJ?&N5eWb9`|I/JO k"__ ˼GkϾDs) ㊴'/3v1i8H*k*c$_u|f)F÷9[[ߵf%%|uja/۳ _9=U}U]&h[W^ *{׫n]ߓ{u|zwZw3wiAI{]Ⱥ ^; -S>Gx) ̘[L TpO~F֯S=EGw1?"f-tOfSBxB?^^p»(<(p д kUS?%֪4LNzTl/ܿ*x‘8_4Ы0|! de|,//"ćfQ(،$v419h0T9jm= (h SY: rVz?+)p!prx=ZO {` C ?Jg{w=-ڻ i!+Ųh1kT_BXֹqEf:d0Nhо{BGjFI>b>^HD;gDsѮG)1L;mZ?s-?hM7X* U|,9CkWN~y\~NH<{d.>۫vIP_%!?OR{,tY S XBܷ ޿Ju7D]zYU]2 S^@07ì_ 4D%EB"+-D~`~ ?K I,>} cJF0.<)">^X\+S7Q O4?֤#dh0ޕ;'}Gֱ"_v ;3׳&+_+Txo ^j)Ĝgd#&3k?t4ENNE ?J7g괝j ߒo܀uh'/j޼sD7p.sIkבUZ7֫yu(yVk^ mׇUh/<n\IW!phT}ڨ[kOtD|&U~KdCp{j Rܟ0KïP?D?D/NUŨtfRsFz:+_mjR#||6R-[7^)=V M&1t,wz:JlYtT#>0M5Y?*/Ĭgt ic19-\̦d)UT۪ :Vuω4s Ua݂mՖ-Ԛ _WZUө%~^g?ŬI٤ׇ'a7~-74M4FI 6x<@T囧mJ9H3.DͰ_9=c䨝54jK9谞kC=FobP9:rt0o;)G_%w-G`:cC,GkbmOVii <5RBٲ HyUZY4SV؈6 _í1/7IX4Ɵ3g ȉTk;Rsʭ[Rsk; _ S0[(lVax_UOi?\- y*MKpG7aRS#hV28ve56f(i0aamsYw7=r {G=qEmS:m.3b g` %#eD[w S8pv(!>c&qO^svQh´],=Eq$fzцU4']dJ 9a`>:$ Z|ygT:3dM LBwx2{&KHwoPMdR`E5 [5r_&Y1i[kx2@9Tu;O  eXa)7Ħ>3 =y Cu/R/2s%MCS8 o|=x v~ Qa >6 ڍx4x-o`.?,Pw> lĽ:Ct:0NaPR`]Gr~Ptt![ $_GŹ5fg[]GO(tSx]GMG|*3/]G:SS6cn{AtK8 ާhM+ ^8  ]pi( z8Z)|fDTK8ċ ḃ6ʉaӸj:jס)Q.:y/o8=9F4(@FK:4jF72<PGh:L_hҵt\HvЌg8C0#) MGTddx`# ddGґ0k0Тyh窠FQ(^ #34RZȩcYT@#3)p@CF>@q*)ܬٝjj@#O`䟫QGx`#P5#L3k}0#ߠٚFf21$`xndw#8yfN3שddܲ*kIǂv,@@[YLq2* Oԍ3㟶lG;۪ nMYH=wvLehIe&s~Lp ޣ a}``C! 6W3)$XTd?c F1'IM]#|  J Lࣺ`LpLz g#1P<(c}^A n 6$.؝ >S,aIp.70)f2SP.s `ogIР b? ^6NR1YH &X/ ~AoLpr/|3tLp&(`W]m&c =O0 N!ߵVL1~,gS43$.˜#?+$.hePL A*MmI.x9gL/ *Q a3A`1,'J]%b,?&A.R g P]R= !,F<5gO,g!4W0S| ^E,x&dLBB]6g) {1$]K n'xl1-& $8 ~L-ܬ Nb*"o3$. sa$8Ddm~LZaW1AD?7ɉ(x0D/&X- OI&XEtl bH@\`S~Hn]p:e HAcg1$IL2k0Va,^5M!}8C]Q2Ϥ~P'KTizIUtلr`xJسnk0[6[DKarWh$^Hh^S1@Nu!NN/M_/:~#}c8Q $#Ξ(ɂ=i>쬳H8 Oe A#ͻNf;W<;HԲxKKG<<}@d)#QZ6gWg/+a猉}TW x22O6fSXC͎ѸIUi*)lʳ2g>vJ>hYtc0h6@ ?0:ynzŽ9YX=M8—sKBډ+K錋4!cG!\M}߆6FJgӤf0} >Ρ8VW]ƁrxLVcqw8Θ&QÙnᯚCmϧa jፅL(pck%xiHi6\p qNʻt9' t J}J䗣VcmQZ,]㺦Cɳxs$./,ѧR𶕹o( dm.Z6H݌9J vfY\_Z`qT泳XVcH*,LknS ^Cy%t2/s,٩N5Dk0.µ[/q p]rc=:7nrJ&Wsi.)4])"X7+N<̝@OXdҺJ(K}Z;Bza:4Ơ,\lbr$ _%d9;#ځ7şEM8@; 9FR N_ϫ F熶_XI qbp6%nzlMivl#(&ZElm[L3N̦}sؾ?^F糺indA;KV7rjd ys㞆 4CWs܌G\ij]"2 QJVQ>PI"P]"}ҷ3(yG9U=J;~)GCY < `4N`Y j/ .z8'LZv$siCbH&IF$s5DӁƸ8zZ8*Mv p.U zFR!Z{imRC8ՏbbEU΂9ZaUΟS7靲+q]@yi}j9_PiM揰+L.UrxfŔe2q,gtSp/]8H'^)dVn~ŧ7Cw ^c' L!({ rmR>QRvd%Q7$p>&{4Ka16IӔG{+/ QRK;Jw.D y3G")ţ#w`ybDj ;v^ށ֕r-Lq=I4J\dW_kJMҚ5@j"!YIg:9jR!F.9IhRm#k^ZH6[iu#s 1do\x}q}x{[Б1l+9sF%p{% 8KOvU]ɱ3cXl ;_Kv6s,Ҧ;67X]f)cײp ˜A3n-荦7٨%mٱA`wǨlVX9#o#h( 38R5 uA8J (A 6ɤ/^@?+Yl0+L{K2+c "rc/gyO@?󴖊SbE['[YpO/9OܘZ]lz#sSV>)@fQ >{ P5$47΁{\^2Wf|nqMӸ_d#ga,!a?% Z%ƿ߮~>c!2WTR{ً>s&]nޟK[e'9EaSZnYŇFV]9q*ŒHb|O00?w&gH>Iƽ$mcWp(fZQs%*d(zv֍߭5`?=;v|1bx4=I1K#ؖL/jk҆ɬFoa }:|kjJlqФ၃VUӏBG?G ,GŽM t^1@ܸ2P}k"sG95XT:a/wXʾ{R ]UGPX ĄT=ɚWIヒY_):TUb=2 9q0W k-O +>7ow@aEc`lma! rFEy?VmlP3]emO1M>(z< `%/a.Xz X9Ըhő]ԸaJ M' J؋juRjJ!)}GuR̕d)BT ǎd̘9|]ڄ[#cĚc3O%PЊ=H,^^5=@x%|qÓ^0{.&auaSƍ d86Hb0eee{rJB{: SOF5LcqʤxN)3^)%KA48G0U&+3pJO媜9A%ueVa0t˃HЋ&]oEdƙ%Y'!:K0xDGE5q]HepZB|cj0!N!II x'l,dv(Q!<+1W4e, !bvVWEʳ0scmhݷxAM2dYd0;)Xjuch6c{E5GDJЮD}Nrp6xm1!aoli6`mN,Sբ6%)7%%h)mJ+}$<!ml㷱g99-ia>cQ|LqR|@JɽiRy|{hzFz-Qg!: # Ⱦj+ib?כp}EE:CK5o#dQ qb%s'[PfٛhBᜫZx>bK#Q?o8`X\aMvK(5"Z"ZDbKut{4 rH`%g a'fg3L4Z ba:/>cJa:.hY}Yw{?xO['b"LXs"eOe㧰1N{0LHHk8MC4lHSER$`g7̑⌹ahg4ғMy[<5#LDrB}kkKl*e_JށoqSN/Ub/=CPRPx t6ohՈqvDԠ6"J wCoԨ.D}Aߨ!\O62$;w:d:phfv fêŖ u i⟢amז3~ވw? N,|hi(=xx ܀dO_PDWߵ*相1CA؈w6@Ӗo-nq~ fu b/ Yבs?n@o 0&G;0.8fv_ 6͢>pw6x#d2_ކ10[OlSzg/6˯p^vk N 94Jjl Y.XB/[fCcq0m`Ɇo-Ax:v~N;lgBoV5fMJt~aNef4g`%07Av=XJ) KVzŖ멝7ҥ NjX=Z"?? QC˖!f!/7zt:L/Fouy~?6kNB,x7no`g= L>IxDe.g`! _}.K =-`a2: Ngy#`{: {<3SF5Lk%xK޾VEVK)I:&3K߰4Bo$4߀`Vl`9JW!r~q{wE7z$6?iezP9ss*Q~C}(1yw2>֓Ѥ1GNeЕG[ggca~/05%tJ)9t <3GoUz%Z58F]ɟ7"yJ'MEE0A1F#ч:X|QU+JhDM2&唁Ͳס3DnN]~m(u#Bulgev]1T <)F]5 [[] VP, JCh=B r@0![7?9 %~kpl FLҷ"$t5x:ɡJě 4gc8tD^:nKw(HIx}kՉb>TdjU#={$8[zP 3)' FI[A]ױOLꕒ^Ve1[_q2ي;hB5k%=wGZ6FRQ(㨸/d6?⟝lnɝ܁E:hmzLt؆c>oߧw]Ɩޡ^8/?'fS bt²;BfY4i4v A7KSKNwiNyE15s`/4!"-r(b|#_؂ܿ[d| )(j$ #:)2X]yNB*On{>GuIS's$b,Ɍa:>"+ YlD/BЯB~CPRk k!M0s:40Z8u굘I7IҨ@^~d.u\[ ǃ; gQLB4<@XYMB%{8 vxpqd RpFiUBad>- @/S-bsmBS7: Ębt゠l'PC%VG6T(i}TȊ%At"K2w{`9}Zb"ߛQ\;)׉;tMlajB/sv}+1k˲=gTZh t8X|A@gA0| ɪXZrȝ4#G\`t VH59!߅S5`n^HȑkV*2W$oת͑[ĖcЀA]a* Es `_ncg ֡P4Ǿ,(C}QfTu$.xa!\+; rHwty j3o_7@]rP/['/MQ:pW}Yi8E'?GG9 Si;'xwa}x9y/oY#yҮA 6iǺߤ_dHb6Ehh*J7 r tsa:qZe#7s,-$+ә*ڳ/&9Gq z2 )(R.ȡ')Ç0_Y4YY.* eJ.nh4Vrb^_4a&s2_1 |ЄgTք}Ԅ(N>5a H&;&LaM(F ѹ0~!ے )E|itF GNv =}3>F 0t{IGN:'(Axũґ.0.pX V(SJ6,[kذ{V*a;FM `xBU(4| Dre~ kSFC_6-δqhHCۃRrJFwvzN2ҳ`2!T'0"~bdlG=!N|j?GnC˼HrC7ԅr薣q唿Ds+_mt= Z`v+a1Hv}Ł Ԡ夕g0 ЧfWQV^;AQ7 kf",C=Nɜ{ qBT@!PJ@\'(eDu2jR 4sC,x00~nr?'S:'8,ə8cr[EN3i9ΦAvyx2#@{KK2X@A JCL2 @N -6xɝ_Efaճ\ϦX 3б%TXв;W}h*'R^k#M)>>{Û|t̲v9:Z55:^w_$)o:7vwdpaUeȧir6S A&5x{5PJ\54[wRQJ9 z!)>=A~p6ڣQYCYT!Zy Y!rFL9;0ߞ#>0c>;9̙Uo:}->@c2kˇ^7Jc5~LgMF![n *;a{cSl<zoSM4'չq@9ƿN';srv`ί@lK2g'&ym iL]Z3>K4l I@ ܊ L| f<1 F(- +4jlԟ9C#y0>͜C A6@/gе逝°Bҫr^u,ߤJMB=ʳ_ï_( <=?"xxfyQ>ZОT`:Ք:nz)[#SG$ݿU%\@t2[b$Z;w5ȣw7)=޷#2P,|iG;,7tym|!_wPl5c{3,([{on`,VGF; =А; XnA)>ϽQNk:tJ rcR,ǽ'0c>`D28КCoS` i8xwaOgRHEoVbvʯ)#-x <1&a&Zvu9V9I1NUYi3 H;䓖BgigK2cj78$r~ъ{'#xp7N'6_)8ko#ϱ᳒⻟IkhMiM!}N aWK& 㟴2X^ˑl[BW=: ,@~:CN\e;vT뚧`o@YΔhkd2R`^%u&[sug 7Q]\`n!{_zj#+ f68-4k@&(sJ6a5Zg`xzfn^K!TW b~ 4F ܛ'~!!@܈TI/(\CQyOڤ,}Og73/!qe?wn'-$d! T#:ua޿Lt"go2 =w̑h_߱Ezw勧vC{KC >ףV`"hnuȼ vQ$}TII8e$E5jԑ|)s |Ȏ:܊sYCUL+0S`Un}p+GޗNh9>i0ѿ*b= űʝ#'?qGNs l1GUzk <H ZH\#Cn 2`( ]L| AKˇ=G1 ޳Ȏ7agob$N=6 WmOA.P8`==~4FnsB cBvdJNyHh H(\ 4vW%WR=v2ڦ$XhÄ &h8J>*#6)+qJl[%"s"MY^=#Yx*V>1H+UvU0vLGO~ÿ+xi@{Ċ5[j4OȒ6,ES K~A&ҥ9v` ̔Kl I{Iocaås p-c 3IKrF؂lЬlCm?G1s1iwr^E}޶c8Ihg(6|qbƿ%v\ g.]ff=нE,}c㾯-9 -t /}/a j6ZAJ˱zA9?z@憼6*%CYyL/Ã|F3 Lzo+&;IPcUhpe~rC/茤$7Ϛҹct*4{t`b&;CQd4?'d:o{MvyAȨ/Rx⺜N\ψuye"6Y $<B@E87sW`Rm\l9Hv&GEys"ͼÕBxvX3=gWBtӹC:1Lo:Ê륁6^GG7xה"ZeM}m6HplAJ oG?5`p1; f}8:p?~2zW|L8cK~ͶlnSH@_\^;]ߛ_83uh|_d V)0P !>/j"42zA/lyt~(GؑgaĎ\i`G&{`U{#vɔp`NU}H>t$+|pPՑ##ЫW3Ldui [8b!1Bsͧ-̱6Ǐ\/d&Mls/g( Qd +)[))mM;,,傯9RJ79d!~~,Dң^0;1Hv f\1qͅf޽vnEᶌk~$n+rNdJV.sNAMt"^+UBW :r,`F"dd:ZCtß R{5T%{yy极A +&._ )o WG}}xcUp`ߕ^SUUWܪy  &:nfIA7LpGl|O08e6(H{!{[Ǫ-x|;ʷve7e}|k1m_w/u>IA]"C~~j>*;^Ykmymyg{>I>)@$~| ӣVW[iK[l1rPoB_'y]H[Vz zj-]yn5&..z | Z=ci/- !w:=&՞q"{_D顳 زQI4~sKC(pҚ ɭbK5 {Xv w>߅dyue©=U7z^$ MT1)>KG"$a_w6U=f|'ω؞f{2CpphBJ3t)~Y?H|'lrʟ8z4q=oK#[Cojg:brje/tUɳ[t~Vwմyλf0OQ{BC2%ǎ[a~X}]'צ/ j9n_8"$WH~TI>4϶Я+:SZdk kKM } }+#0È6oێ/;;21euIk H]g/1s$|T^P{tP#>6K呃/ :SAH--&ɼћ נ;:fbUAkl(\ӾSw_Vsgl J.}AȖN=',C29БNDD Ŝ?eEy_d[A-:RuSҪ: (SE-t\M)tݵmU*yJľ:Ľq+sSg#3FGT.rlqiAAl:-YdL*~Oa{Q|kJ}- _N[/˶mCƼ6m+R61öge:zbQTӠ(!?Q*^R{~ ͯ jUTT8s=x_clp-qq=Zsa4ou@5Wd h<es#r G. 7T4z_+0C`/A,>ޗ4;:B *d/߷gۊuͶmbˏqgۂgA *XKWarSŏ.I vI;0s/C¶ ߎLKu>,ԱMoY~oZ$GIJS.`*gg^cO4 \N }} gbQC϶{rD.J S8IH L[;\vfJVJ U И!E᥇VTvD2}Y鉋Pg>Bif0zgс/wI2%|$U|)b ˗,%>ݜkҭ뱣Wdȩ{~\k~~S07>xֽ<{%e_@W(,V qX .i~n+ں좭B%ÓwDa1Ǹ'{,bCa.[\,].n k/:J:{ ْ~zGvCf#>zzR`WNKMٸ>; >^\ow7YJý^| 4׏P@N9<^h/B\ *IվJ\k΅oiv 0{[>Mne/ep-?rLwM]^5M%5*MMUU&geKx|Y%clMM M=چr44/QśLrV$e5:™+*\n7hyS RQ]T^q5)&Wyel5+Ƹc/SPS)55FD]TdǚjnloUUMPHwDX*HHQXVQSŅ8m*8҆S]y=zo6ԕ0 56 FVgkk?P3 [斖Mqy h˫l*_ 0MU Q(ȫ(j^^STgAaUW?MM+j?:wt*rpbq< Bl2D}MØBR00 ?7E9@VbqE(EH+ KbW:Ħ64ԺR7+ `UUA**Hшrq%9ͮQ58e4NPP%0fpڽ5S4N`W&Raؐ Xt(mjA@sac:Z S=-0h%8 RFdan2РU(Ȕ!y oԂ(sqݏen&(z[4bI\ LG76kpo4UUb<4e.o"BStg&Hckp ݀zM˒hhVNrMtcvv.pз1Iߢ]q K֔omoUKȣkvxAk4<.Qz/yfqyvS.mE6Ŗ<>k`T-U=\@c#Mv"&Ss{=flIkC)G!?@\hwڥR`:,1Uԍbf'Gۜ`,Htonrv53wBl'ĜSgxq=dBl;D6!/o=n^DK␷vyD!Wrj@te8vO9%:Çu栤Y3˕ n"PtWtߙWw-kv+\;rpQi+xqv Y%M k]unJL4n.|ITOoHp$xn0^˛ܴJ?d` 24e0hʘ+!tvDBg!#OEe揻Pݹ5 %^ȍ۸҃nqCSߧ X}ٳ+ʽK{,R$MEKsp8he7 w_GT<%y[1͍b ,_s/ծR}+2fh>y+]+"Ӑ&X5Q▫R}$G]J݊SSIj6>gv mn cG JI7V:zR9[@E8ƦzHcc(^$M9۫j|]*Rɨ]_#K.Azң#Pzk,spUyGBj)YV4S(t-㮮N*=l zŝx1X:%Vw]t\Y=`».a? 7B,< , `)mpw؇^H?'ԟ+6 = i!}R ܂]b|_̸p RGzfO|"~> XykzN7!r:,¡ï!O?Epᕐ = H0###̂C^ zX zHi" p/r:<\zz:<\3ti1P.'@:H< ~" `>-=wa>eAz~*v>V"Zl> kh'> .hw !@k/nMh'-]W@yAПC=Kg7տ;ha9p np;;8n8䰋^F9a㰀Cqj9\:qxVp(4ra&FP3 datu '+1nET#^CowD#XO<$eO)1t"|n󑁀zanXWH_y@7ǡgoV}:igHV~]/?A9#|}zFGo%Mlb*})ѧiVNN7EEX>s"{5}@utm9}[O t@'~nI3{R4Kz@6|)7'yy m=s"<͠0lJYK}<%k;{"Ӫo'"ΟF-oZ<2R/]}׼|]/=+RCCw%x @+8==Bi(];&YӯDžz=@Ǔ}Rx}'C@_z nЃ|l2lN)3~s"\7UO<3ɛS},!>:vrzH@?mBwB.~ 61(%u'K/JNLπ@>1=&Cw]|z)S` 5q@]h3&(X7xC?/;ܭngؤ$Snҭ3Ogh([8=Z&u<{ϥ!mJGyx>aSj~L@7]Pa@? tg>E@zT=!ASЧ uB!#x 7wDwnuJP0ݢ]t{Kj^λMy@I@>+oN@@VGT; c@?ȓ>N)ǓmI0m~QcB:eM1:?HgnNd?3v#q9Ы~ nS+y(KW;|܂V71m@;ucN@;nny\w ~o~'Qa\-2'?/1B~o>X݅O_?X>MbxY|/Wz-Ʈޛ􍓻f5ݦkGG3˵u'`-tM{?Cv\z7y>b}`ܨǡj^J FV٣34tGQ]] @*C[O_cS Wf 3.VM5z гdHyBywUę'Pa5?Up;ֶ)Ŋv!s@qq0@cL_T30&pnzzkt|>u9p1nj]7軗uQU/ q? "v ^u^/ ~z xO_b~ku<`T0xA Vfu 'OLKJ,Y=EXN3ۀ}*ωCSϳocj{O8zur ) @h?з}";~1鵘^:Ѓ@J[4z?WZ85x`>Iw.V׻;:?2aqGY Z8DG槢mvu5Cc7x;z+ߧopoqs&kO>з6-x;^cy' N*LK5O:b>{;<| N 5&(]Le|ǖnp#U9]ȠR,#uyГW/UNQʿ]ϺAܴ5ESHya! v/.<~#r_8"pX2s$p<9|Ï8N8a8\>-?,)x~;9,pU.p=Or s÷8ó{as8p9|g8|G0^>N8a8\>-?0/v/ibZy.wW +WC=M&Wm9ScGy oS.oF%5z.[DeՕBl*lcؿJ<*B@Xi,̥a4vC-O{g}sS+zU( WEaU ~RW(NS+Bg뢤W[_)BLze>Q2 =5Nz2)coĞĤ>^ KbM)|W-<ψI TaI7ŤGWKsY1co9cxwcĦWc\+ecoņI?ӏeIӘgͽC~{6~l7EUbo^ЕJ?>7rxyO~[F`,BYsĤ/i㐥wƤ_/o 76~y*5[c=bSU)uղ)g߁-B7(A%Jd#N咱qs&ʼ#oy->%Ԉ^}Q-~pDOjWDkZF/Fw ҥ-8JψK->32޴#H&2>YB_~8%pMM O?)6o?Qem |V!B·q|{Tp 7$+Z_xi:o9<7A>ry>Ym 0g"`2B6Yg<&'5~hk, =Y-sO_%SX&ߤ—®v$I*O)<µR.oS܎_<vN2oX'r|k Zߘ]B) OW8>}+ 7RYNWin 8>JXx5_pq_߮z%9,y?|FQxy1A$w$m;l. o4vI,l\]~Vs7J;"Kf0W8~-,xiC|>?9>S6|.R>)`{\=<)Y<~<VFex-}yV> +zo9㷿8Oǣ~c*X㭩3/!_|>:x|b/|Voxqy\N=cb=&O ;߮g<=_ɟ Rz#ko[L{$ȿ%~_r?y;w~o+8P̓+*|rWM?Ƿ}񧃏J_by:(>*Vhuu|? Zsϙpcbϧm|S#+gϧ˹ǡo|O_sb!$]噷7s7+>u6j_;ds<~ 9gWp<~xvMP<~,̏xck%~9 +fJZ--~N%"m4n?Ĕ(RET)Wo~ += {i9Cy"o0wrpN^x>CX{O:m Q/Lf6$>5$x-ϧvr9|VhyCi/ 'y(,[2[8 %^*Qg_43F~y._X_rP>~ |=u/y;!t+U7a ,?'O&)xށo+ ?!+"ãO)m|3:rHG +15!wSŘ^=KV!Oyp1| @hbEC]]y}m55j&5&6rq**X&Ak9vy0_tÀ+X} z7P|62w6T&&.+,_#o uF:iu7(9/+[)sW"[\˄ZWT[PVw]:ex [V[p51 &WƦF24Dҕ!â&CQ0!]Ff]lV6қ KH**+[vsq;q6~iPY H>U .C]Z @$Ey=eMrĬRF#Pii|clUCW/"%vT 8$*@^"P0.CXAF\2ؗ̈ +e4bՎ2i̽Dr.leYqV5 T0LR(s7ʦ8ZeӋfJJ-[@cRR)kHV>vwv6k=y5 0|K0z-fu8D{ [dx5zj$h ;+b9̐ʊJ]x Ubs$/M8juz9F ,}tYrDg*PK bBcom/sun/jna/win32-x86-64/PK BB( M0(com/sun/jna/win32-x86-64/jnidispatch.dllM0{|SE?~&5A(TbԢ)4VQ,P!ŪJkmeWW]EE{b\xw癙3䤭gx~.sgf4k9/ִuA#ϫ#[WG]hzK]xK,/Ŀf̳W,yy} 9;~oi6]6m|cso38Z K5ziw~mrj[͵Mm=?qrHY_&gm~3WөM9@ ;XQjuVVg㣗Fr'1a.0z(&4v=L8`Zy-ʾ릌p) dnCoe =ꤒGz.|) LWZ/c 7-&HSIaAB_)R >- K CG CFxuvaޗ,?[YעDC0?V/ vO+\MxpS}aV { KOxѼ#zsF#U!p?S),`p} VG2ߍ؏cߨ~M}/NL[ WTJ**D9^{/uhջ@7fZa> *(LD +g?NX\| X@H#qx gZkS 0>DSK`T8A@ TX@ )rUb tPt H< ͒S ކT^SjpBcv*Fdli5ⵠ=53N7]c:=5un,lXFVJqz}o p^rr¹g,x!}TmhZҞkPkBk,E!5EOT\1~Ћ@nr C Nrض}BD ^,ɥPsk^KTUIEBGuTG |wFH_E!EHtZVF? cEs6ŬB1&B 0{ק\0"!PLdQbZ?t:u T?[%? <]W,`aMR;+ufj,3)B C3D٤r^+EMYrcmZB,'5o 4ߒ3 8f'qҷNSوm%''[`'${MH-0to7n ܻ́eds;VJȴ=[g 0ymr]1nbS ^53UN0ׯnٙlTkW薳h9.#[C:4 hh-GQQ[~1~w~Kد4@ىz%,%%`UIpkM6e_R%PGT–* 9̆گzB)P*2̤=^PWP#sybCu2Q|ёIuP=ZKm# l +y/_3Y"Ym-1?ai&ʷF65mEJ?"sQld sLA7&(εkYX/O,5yRc'hFeE,SB9G D_lplt$͐9S u%T#P|.RX(1ida#ig %S8hPӑ€ f0ǚ1*JՖP!06VBCH4>0ޔh%ThQe L4q6P*m^`&=!"M lL$*Q̃%ZLV*6 @uٲ*AD~C&,f*r?סeo4Q-nϲZCH k -`"ozGx1[]1wՁJ|t2LK1da>L%ua{DztrwIw"΢-h}hAgV8n~ n]pwk"w>蠼Sļ"$8o!l6_G}ݷJv,g72vS7B@hlD}1ZT[ؚ(c('1NcUeo1~7:Os8r "w{{W|O ~*zWo3)#B%7@vFfhE1<.\7.3>9Qgor\~ drepX /FQ6vKDKCdGvѷ8QtR@^WM [۶R, !֙~Rj+ ب]^jXBy4ϹY9Ucde}ov "wXmBKsX7|Ϋ[7ܯ_:EuP2".]E񦈥bzySpi+yTxi%KqTҠ7qmĪ*/5aOr\e, ՎZ0* 1)ɵW pTllD(o|.7MbT;mPzuw_KLaGS)%CΞ9Gp[]qf*g KLqV6u4o0v;5va3rqyL5L+bbz>115xL22i[P& {4/CTZ\X9] SlB$nJf1G;6Z?6bf옞1ho c+&e.O[l} :FEfuz" t l5҇Y#]6 L-+@|* AV! dw|:76]9$^d5j 3k,Qdڥd`bzq(Y x/ S5Hg{|WDW‹[ "&w~ }4 a s0\T徖ny`]H9j8ұgKǂ~B}@[ 54srvo!HSf0/tf-Yu@ݮ4v &]҆8a_ ]jz۩!՚8ImwtC= )OݑBʗA;R* wRYH3H)= Tjztga-hLFj[҉ZD1˜=;‹_ge[j7g| /Oԩf2ٻuRJ+Lkjx&բ:4hSͤx׫{8zKq<S&+ʩg.i uYL,\#7 ܫY]fLܝ?hIH$pq,z,45lԍmfc;l7C p `Z8ƤBRC^&It.5tKw$4P[B=\RGP%KÏ cK^&~U%;;Ml?n41FUB{;E{wtѠ&+{^.Ʒwq6.:Ӆ8e,et1rwv]tv}){ee2;!Ԡܥ^aȆe8 q$|c7~?YQ¢ Q:]rT6DI͟=lC,|0Gy: Dsjb)#ޮCeq!_5<0qḽh) j^ s;#4SAs01 L7`h(J>ARe~0ku;_ }NM𳒹 H"A@@eY5-+H:ԩ5b| |y~7K>ƁпfYoov|-uj:g}&T9 ɇ r+Pt_wM[)V:H:8o47a]?A (dw=>}A Thv&p4>dO4 |.ci1C>CDa"(nA&ֈ0º(P$*hvoHwIvQKμr)ՙq{k"ů5jk4JO! E|F>4q7caSny6D]PaW`ەq;#~϶rB/hiU|QAe0 -ʩ0Uu]R?ܤzW,#Ki]?9TjVyLO\Z~}YH5S[z m>1a](K}D`6eablD&:HJ!19;J+cJY9Rn&jבZ"&V>x?Y> [. |;{eVUT,"/XŰ0{55ac ohc !ls|JULxe5G`b(oVR~PEp"cTлBxmVRcrCa-hq ,.FWGqMjoY+BukѠ202 qIȲ׏dւq="kE f<VZ,CU4|C GH/j/<vظX \I(c"=\g2.@1LVƃzX؉o/o?غ2 (L;>L9S;f* b?%۷_Mr ZC9{WPu5(u٬#dBK6 &W JHor%_H{;ӈ${s{W%E~ ^{^x?x޵o\"_8S$H{Amh]yk&bFeWN:/-;?lȃZB6x`Ǖd7E $[`nC'. m?Jv]~vQ.*@+gAw}Wv.~Ӌybc]t.mŢ;ғKsWb+&{rUbWm؈Y "hyxȓ\$DpݏQBEA:mo 0FG{>xoDemx^\f7NxW'o#xEKP~NPF$3Nt_Y.&m="VZ|c 7,Rs:BX'z -v cF8Y L's%ƒKKoi瞰1–n6 {n 7 X L0$8c<%sFF5p_vggu8;BnL͕[<ۻam+R_~|}̴]+bجYer4S$Z!P1X_)?* o$D-6 lgv D0+KtIe~P+6V>,YBM*3xZ62f0(jHpr]rA5J]Aup\lsSw \{7aѼ, šssJ.`Ne^F_^*x0;l ?Q"PpgM_F@%= 'bW%~-t FFXR _^9y ry("KNwË~U-a?Ml>sn>~`i0NÆM4*(GC]Ntpj(&ԙR S)%|@i+ݵ?g\(9w\*t_:M[)C\ۡEgCwc\V䣊xopt؛ مOp[}ao:_?M= 4^O]ka"b^!.7@e]D$:Y9ϕ*[~ ި=#P.Y6*$U6*lNl 0wAss/q뽂ĽFdRaRq`60;L_ImAH~^ÉA{?G%׌K[!w?Mo m*_!XO#k$kA7%  9ؚ]K0]#Uq]+[Uz5,f2#z]ɳgj]xv 􏤱wTa"ߪ>!&^wOV'T݌G}V6> 6"m Cw }FV wA~jmlFf!巿&)뤔uuRbl{lyB;6Iٓ\ٍFFF;P٘lg)IE{ؔ-8nbYѬ,Fl|;q|d_*88Q1IIacd>bmăoup.DmKW%s,z]6:DĊ[L=.h [x3f)LNiL3!_n!t;_} j+Gf?@:׎"/nϣ\;2/{[mOʹS*-"?F-}鈌ېZ6596:$$0 u59y%''''N:erDjQ5vF&&U?fdHAL9dg`!UwHHHHHcI٪HH/&3)\DZy्ֳEFbNJO7l=1̦>8U24{R[U~pTi[m40߈s*]{+ s_xm" #EzroJ-鿗UCqIÑ&xsb-Vŷ#Rf ${Lu[5۞Q߀oP5[AƟEbI"T> pf\~)Rt*R.m|*vf/FsHYfgl FRAEAHbcF:ƍ.+-m΂Y뉍"FFdPbt9.O0_!T?NZ(w1p#3U/ZG!n(ŊHc@$tU짋QƠhviB rrE咍-FReせuZ5bfYs%?KI\^av?"!ݏ~45ݏrFz÷ӿp3csVx+wV{BhmA[i!P4EYx$RnmQ`_+ٛʮ};L>xi_'SVͬF[T/@jR*AGъt)Hs p0|N_4^^&X߄NMPNIײ@rxev"CA:2GoћPo̙sq: ƃ0wp_J[DEr !ISw-L"6+ ;OhsZY[:T:Q={JoDc0Sl@Q~%}|*ET"Oa_`)yTKX5p2d=KsB?e_aX^(J6-$kUusl\1M.MaF(LK!BB!6MW]ԄGL HO`> P[\Ó+ˬ\"쌉rlɥɘTxx>M|qcai6:-r^ح<3v@ jUܑU$qH݈E6paSۂ&_wÿmC{Eg~&U;Bոy˜ V%m<mZ2rr ۃO'K~m$x*1ɏ=QOg@ ' tL*3yJ57N>|m4MLFHfNk!诱mRS(cdƾbxk̔#t˱&gB}KW0o爦So߱+5`Bj zBBo$*qq^Ʃ)J>eqtieO'߀ w 1z 6~׀T>oq$4v+kNd X;X g`hahnhP!~,0z0VFg0Gn܎0VT3VHF}IďpEF>1'{N2@ ! F$Xc6OT1VIFD(Η\VҞP`p+!\-M`vچ'W^  91aVFle)^vݣ˾wv ~g]oT"vQDޣ\n;cd??Phe?/!Uݫ%~s?a:$RIe:bgg,_U؟uEV$2OYeZ#bѷ7&phvJ`3fI^3(7mb[C}[;[-*rp[8[9[%ό_!TYt "*]eUNc#ίb4&$1ieqVgNSٟl# $bJFߧᯜxL_p LIO`}%oW"'VJ,7aZ"܈[4*Ɠ`rBzf};>Ζco}4[}q%u_B_Zj,TQi~U {naԾIVKNMR5=]k߯Eb{=vξ9yR'#˯RvD}dW Q}YD}RWDYE-ࢊHĢd"TrXF}2j\o^Zk,?p 75F~5~9lGRG^ӭz]ccZRJ^YDFz"҈^zI-ZE-Ai!LC8jQCM5T'W۰ثWS&*O]M9a~fcRZzu\mc5ݯV-ukyQgډz`DPEEVpQ˹RۂRZj{j D,ZZ2 6YR52z5~g_ٯfAC5ZK ;*RVgk;Q;Io Mժ\ArQk\jisfJX-U~RFQRQ/Dm_GĚ*ˢ/oqYhgǣD'jc)0TݜE,uoDߤ:[ju,-8fVK}3j\Rdo,쿹܆#&yo`hgRwkXirzjˌ>RQ\f#"6Ɉnr<`[2KݖoڱVK|%"R,˳u24چ#7ռٷu2cR_AK]PݭTX=oW}џ"CWڈhD79.·`#PZj¤Pj ;ﳳKؗK?gRRG6.R˖X/$&CYDNF"VgD79-≲k'8TۑRlyב(G%eK%·d WdG+j źQd`XGpz$GH9?$< s %)gJ)s)}ҧ@$7 C! %6%W ++xKBf ?\b'jj)e5/! _BV+ W䝗@rlq q/' ! d@Bu^+H6,F?,[L]'G09! Ȗ>iܖ]CAVȭ ?vB_& s/#Ȑ )! YE /Q9JB!2@%ybKvR&[%7+62 d r"ܵH@>$dY!!?V4F@A>B}@*NMrIB] ÒG!BS@GR) s)7K f ozwE a;)"^KxQBnQ HR0r:Iy*A6^ly%y%UBnU JG3z[!<!v2pq1JEB>f@n4;|UJK*![V y1@z2 $9g;)?!)?RK.!v  7BLR ȱv/@ȣdP ;$K ȉ"d(ܶ$]OBS Ik1r(\E/ IF)!;N )/G6\]$ ?w3%@ r ϑv$Ba%՗$r_Bd@~KeE6$eT. y@< !g9V=2ƤX8 K% e u!/|B~|B޿#!ˈ&rZ!Q~A>r S|ٿ_JȠ gjVȿdp6[!;+HB)x_p~^p=<uiq܋ˉNN;up!.@6iiP|A=, ҠJ=aiPKv4DžC=, mn ė}2Uq䏛 /v4__Gx$:<0_G'| _Gg#Gq#zD[@x`?=>i37H3y"zx=<xZNcx z,䏕EUŷZ`qe)alleXdf-h0WZ=٩_iZr U/|.Bҭ_hUcCdW0+ҢG`g4hFiJ=L~"_'aΰMtx8wIhq ?ʕ>0)n?淤 }vU_{vwA%Uxe5qX[n?6~tt\ְ{ `x:jWyVkҟ,TDBw`<;?LCxzV ̙{~/jPuUlUE݌E\nT&( %6&EYwƁNVxo%y D),z!M Ke-fSp.XAHJ$\>gYB6(QDž7l vءzDz!xE LVI(R;\VM!ǎbЖbخP.D&р>NCPvp67CjjSY wLڍ4}(q Ĕ($dViXb谼݀o=pm*jzֳHyS3soWwq+jфBK3i&NN­jzlX (fS#Up*©T rob(Y@Q&)Mw\{1(ZߡqhѪiqW]khMi61e-V GlEWV4ZBg#ZUABPuih{鈲Z[š^3vv:nzW+cq(d ˛3Ȗ/|X[K>RV YRxwZ3mZާC}c#Re]zF /uf]sj '>:1ׯΞrv;&h>}}ЂNޤAaQC7@*5ݠ㪙3:2p*ާse&C-nf9QT; 3Zާb؎F'"r˦f=M%rmBMn`/#MYa_>5\nxtG=^l1Cf?|7;b~"-̨͢`FEL%@ ]բ6&d 4,<M_a :8f#piXBj,[B7,LQNFy(3P[5*]&9V>RRc51a4W(N;uFh!ݸ7A;rspy'5ek/vdd*M >g/Ot'6bv +Qsi v$QR<Ϫ? R *SKB~<;BK6Mdbv2f~i߱-hڸ=7Uk2-/)EM;3teF{'^8~|RleaV0F8gڟ9M3%EcHTɣP0q84:l%  \:Eyb%<-Y>(~@ާQ-*;Ur+M'ߌJԇkA&;4ʿg*)RQN(L!h!/*+gF[=9)t*"d>4<ri.<.*sS6(7~ D$q mÃ*8FQE%R"Pxt׉b%vfEnkqp(:ΒŠvz$M7b{r0!Quǫ_+|T\3dǩ D ~1` (!LPel ~ $KHE5/3aFO!SE| "տŬY?:43VR&;HpvM7o–ΪazqD|"^\; );[T#bCDUv>|053FÎoP ZS87L+E JB$&vؽ7g8M$Iq?&ïO /2mVLZb8i~;~&b®(#Q@ Zt{#qU,slH38!*Y(ʺ_߇5碓Z]8c}Xp^\yEKmy ߺMn6S+PHk,FX}6)/L& wR8^f1Rc* PDEwV-Q7!j.9j_R^dOS=8*IΊq;pdXk?<#D%F6mRH;Zܷp 6a0qf@3M834n nCzӱƌ7n,M¦=xOIM|c2dII{6lgU?f* $꒦/a&:ݒ$6R%j L!!h?wwp.`Iar&b> Ha ;^%%JLz`Cc(pajs}ъ?l PۨP{\R;٥(*&W=ˏBoZ9~S"J886Kmq4VfrgZ:Pc_dHGiYpl.1}Kإ5D^P&FҾOxNscrMF|a("*#B]Gh]Gؖas3"t!5c͡}].LlgLux2mG$#Q2+xBz^\[I%<è.l61[u&VQ0e}D8ХCu(ppE^3ʍ}Q :NJ(4k8ϑ#Sa:Xh^X臚H_W29ȇo>V\aƕ3嬀 lc?/ܰ}7 tTk{̈][E3B0 )aP~.DWvzO^ȑgU+{pe'*}uLTkPZӗjb#6nr [5 ԛqNdޚǟp_ _Ov}Q7˭cKNt\t!kZ#Zlo:'&ޅ78ay)GP3JGƐԼV2#[a%X0>y ש7TP#b>-ZGF0i.+ (OI4 Cn,>8O2DZY}*TCX 8PK.!pȸz~588d omD@oi6T^©\^r'on_=?@{^: $Pn CćKQ8, L!E#2K .9d[Sx#$hLSmOrSܛ⮲xOE)xtZɆo Bߐ g0vk!1V(?b <4ᾑi1柨y ej8q :[Q]˯NZ/wGyoԟm=NݳxRߟDգUel6QAp}Ud`GXG 25&\1v7]ףwD#'k_xiSLO.-ƞCO. ;EiEiUk8/oqv|;&(pKv"(9 в(gU)13|OH.*Yx %HWV7^Ȉ! xIQY Y㕢K UHj0`n ŽK <;z|kVJ{BwNZ0'nb룇U˹"[, ߱bkVO7yQYj{"Yay5˹@~ ^'G}f6LQ֘X)k2)n(j oT)iC22ZV9e!6΋a^lJ>X> Anvh QLM[Y,p0*@ ge ǁF@iw,$;1â \dF?x<R>h+ٕ\P-Aˮ[A?i  [ƎN- n2@fH%b2cČV0aU\jv7*&61fX֒Hz2 w0ŹnG(Ny"v =J*#sg_hVqux,Dzr\df詄)PQKB:J" E?c4~EMQ,/>#/r \ x0h% Kjaa/5mcQ_iڰ{߽_h/ jڝ9=ib%y0!3tz!>oDMýk WDOo}?%\$ ~_Uz75%5؍ЍfĢB{0ix\}~ GƦ^/h9\tAܡ| %Jv 6Cw-o# [g߳9ϵxA 54Ɔ5'l_Ŋٖ7)7.Tx#V'`k, X謤e[Ȑu8 $(=b/fu;vU}yɈJ}yuNUژ Hj)<4* 't'"${J4>B&X.#V=GMS =ӂԡ⩯/b@Nt>d;&@0'6P[wF= HtXm C<0ICޜpɥi"7лNo-X;*Kw9xMʽ/~=S{+cI WCP?\6\. A[SDA{S\3'Oݕh]Nֽ^mi$!Ŕ]ZNvU~GԙV(U[t{KF8䬱Xbp j~~K%X3Va-kT!X>ZͨU`5x!|9s_*k}I@ʂ ޺(^h~wF>SB0Wh9Gt>`VJ!{Eh$Ge+.|ųo]ko}'/|gL}"cp3lUYgGTyrFW\EA(:rj-PL P D)S&ėLlޞ VL[BT̗987sPd+Sbv3-*t B*!ϖO%p BPP-X 44HXBd+ᓍRv ^ҊrLV'x2Ws娇>dh3^^ WY:z,%kYӯ$bـ8; Dve_Շ%ؠ?ObX;`M'n_EN *+B‚xW@_UWiɌز)[ai.oS7. 5>L`P$?=cS7`Ф&y~O^˃0y< `/zm V ͚Q|?x3x<ڏ% t(p+Mp w9*0>wü:_2)֙ci&}7vY$hWuH"o_^o :Qoy. U pzn75_'eƳu:="ZA2+3_٫t@?V~< 0p<Պdw*LF)yN`g"-+DwIӳnKLkh/%1||rbk#z&3DS/牾B&r5WD_>Aq oujoQBUn%q%,iZ E2o}._7sub((h8]mh(ů|K>-mwbɊY#ط~:#5 s_+8W`& lre-Z+yجo]mUm6_\5gu~ߗE466 I뉼QsN¹sE QqS ;OGY ĩq?9xafLJ㾢qP? 1GZw폨+$uv T5)5;"CB*K,T$TN Md-qw!Ỉ沯ƅ|cx.h"e  Mӹ,߾kSGdzƓ@ w@5 A֌jszk4`+ O!cS5I侟=L%~{8wĻ%jJ F-cu/e ]xp wɾ//Q̹BW2=13x=܅cJf- |}* a-n 'r5M%\ e?jh ߟ>V5k/5h?+Vv>[*"{bV %_AdM)AaFc d~Z[(מs"`O0(q0S=q[۽`jmoq\,5\g+r_Xێyy@nW^~H |hT\^p]3K#$·QbDg{ȷZ~wsq9B9 mX]C̦LyLyw/~Xc<=$1hbU@bȫƪJtǣHUir4TC(4*45Bx#dnxф/3Y|9U0P2/h@k*ec^16.yVP[pMGGʈQhmBt/" HD%#_%BI793=@ '4ה5sxc կTlkV_Y4f ,P]qAS汑{R˙&<+_F:Kuzjbwִ"Gy aS%|`W^1bp4 1N`5%Mw.6Zi}Uj3Id%'{:Sj3=:@/9/ D%#m%,;nmN%c_N)k;}d25j.LCӐXfIOiZlHk܏R&VLF3"q/`$52lwf]TGy$kȫ`tUsѽ/iT~FiE" XyR6hҝ+k-~r8}Ա< Y1`2-Ь11usY'qݝvPsZ e >.Ϫr vx[_ lS6wvc-PV XdE$j|Fq](h Vo38WOc0/a~֑ݩع,nݐ΂,N/nm\}8I 9-ۓ -h5 fy/ ;1d p _ 3uD~GG6W6X^7n3%&S7`/',XHm&Xu;v(L9 M5 ^=0 йj{Cِ:+ܫ3^U¹kXe* s2, &M̷=b=]=_{zwvaXQ, f' VioBg'4>sa yӓ=jOrws`6%賆 -gPCz4A ߂N<ؐ[}]w[P~) GUN A >sQ D*_qL'{rd$<"[n=P+x *DχwɉL+NW,7]K ˍ͠~;cR` Kϫ6Uwx[}zy\(X wx,'h8KqR[C-${YcZd-jeGIP6g>,\%7BïthNNnOMvd  ?C?ًa\:Q1i`dgii{9L$cO]q9ktY&@i yzlN_ ׏h:h{?fj:Z|`ezFB ~fM)jxKk3hԵhS"Q= NJJXe:*5YUGlyE ԙ|˵]MMm nN_CcxlTͰv IGQ moJYfuԵͨ i3:c Mj3mFݢͰV+ƴO#dh3N`ڌеւЧ6Y0e5.cp!*CeD9M[F)sHٗ^-~-y%[y61ٗ0 ِ,%iCsO(VV >xy6181Fmc3D:\meyGt9'T'=#Y/}f_RJ+źEOdeİY{2E>?8}]2a&bnlI;Ẅ́:?Ùv}/(ħ&$(rgvUS7^NLlᝍ9fB;㣩'qv,une0޹ qƙ8wfd8tZg04jqN`!BrvZ> z 3f͜ag ?ƙ*1ד,3Ey|{bi7!KdE`,b2܇yj؈e>,3o*ٶV31-=/1m>4&2%MY1TOΠcgB':#-%0^pf# E<ʙyfTU3'j-i6"3~O%.s>o.0OkMր_4O(%Z`O3G̞=ʛd2V2~K{t.`${&-?ižɶ-[>ytۮ2cZ3j v5g uW/ B*knf'=}M+J?`n3ڈg@= -zegEs{V_mC+;FD|53$OvcmWzRmxJ̳ZxT٨K\am6؉̼1T[oTsȜIj04'Ĺ,.b-7`$|/ayBrIR eS[P{(;Ş0TwQ`t˾}C[ sV33<~ODFxæxml]-ȪjN ˱J-^HhU͎l&ח}̂\%Ws^i͏@lGftnd+jұ+'uN3` }oosiϣ3G0m8PqoY@f6U;~6`ç1v"yynr4N/]p5zx~Sʷ;\E W#-N/enyC^OlcĄ}*{ƻJ6lWL"g`gGVPgs1n3mh92O<(¬32m@I۝o̶ x|ITo̺?8pc ub&,u)YHa|ewLxn31—Y_ZA=ޱm* ֒:+8a;nZz: sFYДĖc%~hK4:Wk yKv#ך[bIЬ'8'&jN4HЭ{*R w-\{3Zb Co3,Gau1GV-uxBc5cND5!4-t%TRWG;8S0q݈ǹW}?ax!UUo{b2f/Z2L/Ȧ7ʋXYC EO-a`gP(n/.H|vC£oɧόn2<5䅿6t|~k9vsI$!y/Cw͝=4OC:]J+yAң)b?w{=A3+`rA~ޜsO<&a/'xywA3~w?Szcש(M .7T]f\t39^ P<{A3vy |q㪹<|Z9'GNN9qz|oGOyP'z++cVxs߉C/w{$0BXgKN3Nt`GwVP0V4/CCƠs#FFPHpZ*rR_fXѭ٭t-+=zޣɹ5g ӿɹK#zߘ>y 6d.4.xt M)N".f葶>H[_$(~~ՁDy,9u<ѻ6 YGaiG*KQΉA=Lz;"t8ڡ$7\jx*DW25<,3mCT\eJO28ʴb)Y"*S|1TwlCTEQ9]GRZ䭱3h>8-#EGR̳ѹ:)q'`Lr)pb,:{ O _,~LT&p[؇-6](.%$p6bT͔ 񜚿!'rb2B g$l6rMn0,?kL/PXTb<1@nOg5k4úFM[ 亵[T,Ct*oɤAty>춊[@d [ll(换[7OO&d٭llD|ՌjnPuJc[׎:ǞJlaa;p^<8c\oJ֌Bui^QI692YVg 2:Ы#VP*xJ0Ɵ$ BnMP?@rs CfQDdhS )pӎܧMD*Iu9 I_ѣ>7HbHz wڪTNx 19Z4()eC92_B{8q+IfBSBY,u /T= ZA.=hͅ4B>Hgғp1$!S;,'Cg(DIEtڪMyެ:SLy'l䠲W#º,,O :J{(c%nWLa ::6>-ˡxA^>U#bz1BU0Ȋ -4ZjiqWhZ(pԲ+yF׾{p:ȹ97%˔hA@л#tlJ nTv,:0C0agP!8 ;iQۯKeSkhnʉFEA6 d=>xAnQӂ4ђ`tAnE@P%;%e]EP(#')G CM`ȖN " fz$B6gt`e^X[ī{gFv0rzە~_H"Uv¶&qΏk?$-7?ہ40$YO@%^"*Zd ~oͽbQ|z՝ݭy. F*Sv"AaV@*mH`Doccum (mabp Vqg1DQBsӈs >7n{wD&fmץg ɮ}8(}k'؇هvvKA/T#n ĺ)$oƮ *cQM΀ TJ{p-5cpz4lu3?ǥT$ }Jb4G>yxL>w-HRKGwW;$uЄ͌GՅ^`}6,RtNV>2vGp[}:;T5WBU>w,6<#H- Ȧ@oCΎ B- 59TTw>#&1@ VKSaE%Ѹu>P_O#=d.Žo'wlۇqr넵_@x~/j΂.~DN-9:`3 gZb)b /ytUURd4€-U^ 4ZZZGUa$LmIƏ̅ޘ .Ï 2ZG$Ѕ(:{2smy0o?\p£KޖT29*d$n@@XMB_KRoKł)$% e'9䃬KzXJ+A`*O<_0à2/y Z'tzS=A7IVKGQT:9B?'շ!Dau>LV^PhM b`r5ư `zax7*u`hOF叁zKJZ?@~ou1x$m>F4@R8d$ K6Irs1)uT6@6K8>~lqL#A 7#–<:& mP{i|z4m):0iOۏۃa* T ư. zuc8Ռ 蓍QEĚ\꧍y$QWH#Y?ŷ7,cgcx:goJnMaoϲco+ uuf]}y |+܇v.;-$rb5rP?Wg#tU&lG9SP>TqѴNV C:J?JTވ-iī$niѳOUv]N_Cy>67ђۥ(kkٿ}:\jv/;"yA15,Im15O isy.L_BJ;MFC}mB'c9;_XNYD{"Q~M>)^hQԕ0_ Sޢv>7+шtZѕn܈^ߺӒm-Ĥ Yps5Y ұUuv}c= / -]u~X>K, Pi`e[˭je2ШWݚ#U<@>6 Ҝ A9->9K0zjN5Mܔ UBLa-ik}-1)_I7g si)ȸnH lg8F;lq\.ײwc?JbUrvPl{+"UE"q;%alɴ,9/w-=?W.Zv=(^=%-{{9eJIj w^=3qoc.=Q9͚}FW_t! >7` H]DÜ(ֹ`4޻FeyM怣3?˨iҔuxfŏ#DVIQ$2 VPx2Wn^K߹ęiĉFXyI#'nXQ^I!7isH(w1H 0i@HJ;b<fV15:7:_cP,A<PM-++]rH e)NR[I=:,ܟtXXa}˃"mD16jZL@W|<HpAn7rO:mO,nVILp8kJgC+-s)2צ4̣RwB/Mm=Eۆlx?qTM zKr|0/\< Ph-1J.硐rr": b@ Dgems8pܛ!J+Z:SO'AfyD L;Nՙ'FnuGn.IE&:oŢ }b#iC)q.z"̼AX1/=M^:Kx}GN."lnmRtl|Z%Z&CY wT' M.p??(8ܿPx|9RuIȜBӇK2/.̛A:p|#zYАMoB?bR2"JmVWYXR;򹢰 ami?EcWNKF5ܼ,&N 8/` rBO2ʭRoT`f*;z֒I›/mC2S K5,q &,HLj+K͏oM$`)9΂|u[=bxBt*tz F_L~*/kpw/^C|g5)ICLDziUrϥ#gGI=O:Ee`/w+ $M( q=6|PE6n@ɟ[N\(->#~RV ɥJi?gy7? ua\,tʸQ4<_z RM $nQ-zpB޲پ/JstVAxCt79$mG1f!nB5UZ4W>)V-2h;4(5QwD^b^A~o^~}VLUGi"C2d';h*0J_+ivmޚWDRe '$#VU\-qGC'IȩO7j6vXm eg` ͼzV7+E<'(\$mV;`5.Mwq%l;]cM1MvH$k6aAKH\2C{ۭ0A4H·Ywi fJ]^3u@(ܱ ;=ae*ѪW֭_%ۓ((v-|^H_ +1|! $<B; ZA_Rw4m}]_s+gJmTH־i 05$; V@ˡN/UB, џ SboI4s-n,u/_Bz‰"09}]qfühfNƒzdN/9w<9,WLYR؃=vmj J::?T|m`{Q7ifJseC |%L$a8wV/təR{nܼ5[,V%)IM@3-q6u1j4G:~%•e6m+ xkjřuxuޟ{[xnuv+^>#^oKxv ^o;E#噞؜'~^c0^_U)ٌ}횴j}Cvp;"v#j{ g}ݩbcM:v& voX0w}GdѡWqj()O X )'+mj!仏}ק5MA*CAy-0 7h,J1c+NWM, .mHNg(8? ~"v(D{L\~-{r+>RP g5aP߇e2`y_`YzPS{+7RSidkD~zYnNjx*6˟(hBPڼ.9@>6 #݂߰f2#h-_ |񆟑y>`?_C)W0NꞀ&ƿ׽OҭKZ.d x dUZm8{u#eDf= 1](@#N*&:d|pwEjWwYAD+_!2Zʢ9Um.y6zY7f;2]ϥBP-3H~)Z J% d]z6){rFL"Tp>B)0+ v6ݞ7рS'&g̫]> kh : ׺Sw ـ6hYL3rLK<q= Exԁ;/ײ{7YL? K}h߄Svl#Y[3(Ϝǭ"4gDL!tA po\~C T~ kXwqڌHiY_贪%; [Ji_\^6eUss5͇[w+0GʾE^6l~5Ѡ- ;Rfjv|i^wGXbmPi9 BԻi)o (҄R4m_n:3m}gXff0jy2;g/2LqyLs46J;Ne0:=0]*m8Tg$Gc؀KDRqn[!3e 'k<*`[\ _ɋ|[j˷ xenʏ0^-N1Ѥ/s۔ W&<Cr2Uq7qֶ\{l٣ {%һWCIw@N㪋h+qՋ@F3:ZcB~ vi)fm+J)R(m'07_< 4'ãKu=t-J2ni"+;m$V%CڋGf2Qm@P ʔ" L݇WjԠ'Wdt)z[|6]js;RhGoײ,U7n MQ/8K|&4֡g&M#jh V "3b'1a PNRm/%%F~Ǧ[x_P위EE_Pt*+ZfC̓5#֡X <;ר8nPEحe? ◼wa-C-_^ZXH3S@WGosF;1swsMxzM.Fs²[?Ekr."bdN} 1al%K_p6?LX?Ns ʆ9+bv؁\>,C+܍=v~:< [PJr'"%9T2jMJёD.0SUPߋ86TZ8b;M0x@>- ++_~ĆۿPC& M3{n!Y:^ &}2V#QXR?4Dj1 8S8x, >d%%F=2ڱBfÄ|* I#C;DgX6Wo]&E3m04_!L>~5Q#7KGa/UK@8w RЃi~,h,X9&)WJ ={حy3Rv= .Ȥ~&yᕘd|]oh6SYz\Ʇx簦E5QmB7| bk/; #Yi?Q 7ad? fB0. sB %f޸;YpOïB0ܳG_΃VTyxU'JBUŨ4Z):=saB_}Wf|ԸOvy Mv74mp&"9+a=i-@e-5M,HC!.4iz3fDf/C'm遏`T[ zzW iZxu6 S]-igJWS$Zhs ]?Hdgd|$҆xe^օg[!| wYK4* Fk;rkB$Fh0ux۹Km.vVBVT!)N]̰? |i~ lPV-VG;Sv_ x$Z#RT(U*Ԕ(n4X}`S1,\  5ӥ1/cj>>߆&i&Q*z.\nN z j|/n1pϤ?bP k$G_AQO3*mߨiJ(`gզVj!TJmKy]>a,{S?{9a6]O 5-q@?GW :vz@.EEwR4ГS$1 u{?an?RDw:Srt1wrlJEYc{drd᲋uo?S=#g0c/Mh%"4$UJL/+5 @5=疋Mm~wq?*Sv;PuDoOؒ#Plp13`k RbXJ&I -ul'z:Y Oϝ*U@hoKdcxEɶ_nudqUW5 V5ĊdA\)ԮN)^GjJ!(C%} ҔV^U(yUl?H !FM&$ 2@x^c喽}+/667>N@Ʒ?6sԉۆ./w禽PLb>٣nmrݺgnz U6y҄ꎔ|]7:?sѠMv1qJlMV/TpsڑנQKI8[=@D~'~t1Cw5oh-ïuS-˼ޭ\l55&|#8װ7@W[ЀGϳ3h,ി4[PT$) K*Da;r.~3Fʹ)&bFZ_kD$:#S`Ѫ)ZoZ䤳mJyʴ1Fx? mǩO&6[% gho:(/ S9/cOZqa=ckZdVnec$Htf1 #X."{\uOӷ bP&yXLhA0sgI"4<8yv٦f@5D }˺p2efn $0hWE.Э,K RO|UQ PSGK Ky+2\b #W5}DqW~e)-U} ŷ$*ut#3R+M/D]l`? Z_^߀/Qx5{B))LmO؍Ih*н6†O jU>}haUynVM7~H*nVSMwԉ`_[l+H8}wAQ&f.I+c39>O*y,K$7q<3~ZͪO0.QeUO֬:IK8@a'Ȱ-s;,& 䆉4!BDt@=lƿUÛtU7V*\OY5"1n=#ahvhdeǭ! Sl:e:>xN [%3 z3 ImJaؕIt.9. _{&cFkGzO`?l帑.*̟9 F ]SʛjG{zbA<&)gc#ZޞwJ1Q%)a$P[R Vv.\2^X̪XK5Ox#ዟoa-er9XULVUY{YBTIdnLl2t6^6Kvp@3CdKOxИD'#vŽV<} e>{U]jlѪ+Bc+.C}T)|YpUqРwG~~|Cb>TDE=j)4|-4;#8_]JqeQ+a]Ӣv5iDM#uh9D6˱mX]S'3.!ڑׅa/&faĺ<!r|6DOeϷ5t[x+~d6z<5JddJx&sl!CqL*FET5V`kfv"]վq˨ $\/UZ<^Oo0f[l?ꓵHmE]|춟m M ϸy6jOGDC)v vf#hg^m$mʁ'lid O3İfFz|;@LMҲ K8k!ea0b;D/R#.i>ŧztTV߇?V=tTa ,5(m=fIhJ+"a RQ&lYk3e0O~g)Z?10[.9S_E < Ӳo0.UEHZSuE%MCOYC2дv8frc0TU9ί* b;i0I(e`>7avGZHQ?GF V?-j Cs=n C)iia, /S~O$+JC}8@;>Nol4gNd}ۘCtoޛS(^*?t QիHXha!dr];@~xjq\t8\sɻܬʆXa l= ^eoPА:>OrYP|!:]30UğPX`t3Y2m~mQ·os7[<>@,VdoJ йFMx]hI!L07> 2}mX*j |NDħt1ZP^1<.|,C>,g^T^'[m=4ƯIKxNJ,qؽGY<-.pr;Y>F/pٴc^rC~/GsJ]loh&\UBYt,w*;vBC#TWPޕTPߓ-6UD\Fn>B\WC6ٕ8OEB. vslM6((U!n@h@ZH?X;yV{f>&B4Ág0:c9IZ;',p߷.T Al6ܲz?HW. siʖ&|y폏SsR(o)G/P{"<7R=+;[264&fTݓQ_ ?-JJS;]9H>Tv{FD^JAy @G^bI(=h>V^X/"_Rs؂$b4Q]^-G*ܧ w7jk8shS]uB;(xs:PJS3c?Df,V"d šV-{c,g!@4W$w D]ViBR4 R} 9y~Wf+s$]Nmhޛ6QX&/q|)&Qpt6nHXL hsmD$!&tn(KMsmuѧl:#sdQ  aQP 7v۝N 7} T׭SUNmNJӋBlS AUE{ÒͪnWI`Q=" WzBUL$<[-Q]fyzθt.(̰}tH5Ui$XƩM< 0TjA!=`vl< } L,?X (r3 Q\u]jLLs@͡`.HglM;5*l6\ WuǸkP+nOoJ Z ud q;$v Twx%L ?W BSt5[͞.肴Shwcn3O< .7jAP &a mc5xKIf)A)N!T/؄ "DVO\RsuC%%*(n=nPcpsoo޳SmOE^br17|lXtEeEEO˄G=xiϥ7-:Qs;A~fiu4%ȣUz饺:|Iyepߏ/.H.{{E*&3o_C%09jsR:B|0 oODFխ(lr+mdNLFǾgM 8׳^n <}ϢO5_WMi8,K,E'' g VSHyt ÀWVe3jc'wJ'wfT\,b߆SD #L)#ܻ!A,uiRޱjgwMPt@RP; )ܙܑH IA{ԯ36OGGOI6A&|ZzA`PPxa35Co>* eWA}3X9ky΃ʁ}P`2>fQDn&įG+ay1%| )v,r`o`cC뀣/~oQu{L;aY /#9ٳǮpB+ k y-Lޣ#[9&btT 6iJe_y#VW:ɮHʝ*w Z' i- orrd{;Bb\%.puGYL@Y@k//*W;5jd-c!L4{ P*Lc%pp;X<<j/{Ww3>M0G_=.xϠ[_eeEZXwrA0Q}OFI|Q_<՝r(h*f?\lmUQUy.U;#QufVW{6Եje_n&Sy,y<2ǐ{Z AxZ6gmroB`LyQ!{J^P>m 7PTf,w.D ƴTL1B#0c(7`P[yңcAh? Rk|O5hŘn{@_t65qzNH]=[W󦳮n=xBܓsjޝ .+g$+^9W=~UNOZԯƮWH 04lJ'<;է TsV;ԢkWw 7UR+2}3}z++HWH0 Y6#E2tLȱnD5Mn/7%Z/ӿ. {ˁ0/DѬ<}N(MC?c͸`U魞zn Of5.E-F 7٢iFYD9=d_(1XP-\07p &q Xa@I:Y/OfAi'j;"cr2}t>lb Soì BSS_dZٿ7@B&otO,Tq[H &Wv :y:fw [Iƒ0J/׋1 imPQ2yb &[) !AvJꛮ/gpF ?(c/t[3z&-?@`X(*|ؤad.fTc܋1_c,`Ͷx2> cr24ج^ JxOWOA٢<ܼB:qVY?ϴIҪ۵JUZՌm&iAO leziXU9]ސjyѼsm>^O 19 jԽu?lН¯Xz5 @z'xVsZc:|&' Aޗxr'TS!.~ǺK woI(Iۛp yn} ݧDuGpE>x^=9ײ$K*Er1 JN!cC_]w8pb>.{*TaoY7%z][6Lک_|/ׄ4`( @qʷ#>$Ox8x=JaDJe%3.#?*U|//,M'KSyN5Rd(&ZϷ)6 K4Kru6S r(Oq dGNFgbÌ-a[l5%w/yGW(Q'ӭkRE:M~jN[U9zgGn-\ ֵtBG;O/Wƣ^>zJHѫ : wة`TXwLL7D8 Ϟ D|7U A _uޏՆϯBGkq 7OY&&?f'*!t_"s8|=pWEYm`FhNY8@'~t 2,sB{ m>uW* ʗS!#5V=x6 S0|z"SP^iQ1ekp_{K݊bDDQhW}WgDf[z俨GXki9E]N;(6EL&< O< ŋ!4=|Nk@3 \ v.ρpP3QŔȎF3*-ALz(WoA9C R;*{zJ==oŃohEJY Zn%8j؉i,{س9H"|=P˨msCR"?PK\ۄ2}H5(@Ea cNmS?;M-&30-Wvw|m.%it'!Kjr.I2-qOHi;@*,9Trt TxzB+iQtvf9RCԼՄ9xW@l0JmRxn=jbt6 x=UoBfX%bZ *('dmmjI㽼5bxNiq>m Um@An{6O>05cz28;tLjW~A"$SnmZ#n]pJTf\Cz5z^PF0"ޮ`Bޮŭa^P-8|"m!);zyHŭBkz8Dvo,^B"ġo)9j-/YQ`8Ifjih*JLIORվIX%J1CI2֎I${YVO5Jt:WCco@H_VѴpm_Ezv}pioĭ5XkH[,@nK/Cf/anE;L}Np#! ;*O]$fZ%wBL/v 97F;ElχI[U: [hk^`ʽHjr.W2ns{C vp(3x yYL ɪv@š`gTX7ɥ(M;=-%SkhNvJ(QW;F +;p^ˆl?kegT4"Y-^\^t^b7E9,:@[/apq~Cq]N{2#3*Aҩ@䥹W+Ra XmJ8 Tc T7>!  cox&Ei<{,\R`*CgBKQLnaBur}aɲ"w 2{`W|n. sGRa jEO < > :%e]vn"Ga<^I' f$~xgwojeNB0ڲ'0!~ YLxh,پ@F&LIaq-A,CDw~p@xw%la>Avc/)L:y0m&eX[oL@= MgWx= zrWUyt@gE)2dNX!|Lv؁9KotwKm9#D5pϱx[Y uOɵ5RقhV0O3^3,оNfCWLGSm>]<}Gτ351,/xG׫H_0Q Czz7Uo=1RS0_9v[Ql1֪aγ;K ?7W >J9{5yv6^V0j Ԩ}^_xkI:-tG[$ iOwi:Ƨ7KڐۧARƛڸi&'xxT >KY:tPi[Hm+BNNQ fJ/#,Q1m< {6"XX. B_`3BF6V@K4C=ȱ0Y R9_ m޿M7ʭypI;[ߣi`:9[/mUt jyi\4Q=þKQxic6_SjWL'lnv Mj _`lƯL{Vo4WγBmYr->Mu.aǶe0I0qV HV* ?>;ܢVx: M)rs PYx1V37MǬkHVY@-Ty FyMP+ VN8r(Yl%/ $1 YOږtľ нl0/Œ<.,">1$=g[wtfrx  /!զo=~N= ;4SGJN=Li-]56Pr\[9=Tc2 k86wv(nӑخhֱ 1T}dGy "g_,Q$?>_ly-pʫRy)Z -o,\Ⱦ}# *CdTCh:ENa8$aKYw ~̾qO[nfm}}#?'ƾ-yM%g(r'׳oǓ.D鼫]}<}Os Oc u2zʿ D=hz|.b-|3B)6:ͤgQs#y #$7O63e'|g>ϙϩYŻӌ6ShZĵI13aLi?PuQDEVKq>ϝH;$ S{uS[ix Wޚh& p~  >p8=(P{Jd4w?|s>bDVk !Zxm{8l?7yRߪqᓦ,<@0GH-屘CU z > ip ) 3ZY=-iJ&ӡh!x6R|kpaawz%|UR{%`YXuAAfBa)PgwNu vP<'b}A)["~uU*ge"KYdD9Ln*~yKL;í.k}j ϷWέPT"MzPWf5N W>OՇ},L7Ć[f㷦a>C}*omz mQl^m6H֫-`=B@amf=,4˿kֱmFߦu; 㾌fl%*h}=qN„Ohe4|/d(4 K2!v4j9u=ISSoPŭ{F#mܦtcԄHc[EP0@Jq&;i/콡Cn\֒8`E_B,s+CdW~If%}"hy&#`nIcMMbGR ! 6@1APP?CǭCeCOR >!Tľ?b(9L|Ns7u3$Tco %6X!ݗP_SǘnF]&K[Q< p4M8eh@ 6~j{ӏLq}b%1j],8 ]׎@t[b>V>Nfʬ9=xY_3ݼ5j 0pUsuqϤ0W77"KU[\Cn"Y.nO5'G՜sފrXqO(O/\.b0 G1$}=V+>|_x[[(#PHbg&u6nK#b~!C+$| `G7_.a(5LLD)kkӑ.tcy2lMAj3IKx^k(]Rd qǬPO4&>f3^K]|V^^VoKT""!I4m{A~GN{E:G퉶BK ςAW%5*ӰɛvyLClPwkѣA1n@O^5zw cfci0n&-uhJA49nÁ)A4]0?5 ڥ#5U^|RWuQ6@ȭ 't ;sPW{Z/ѵ~{'Bo?`:.}v+ӹͰ6B`ܓ!01ڭ ^c'k7QV.x>]Ljc _aYC%s5xD[gVC޶ߚK H]~Yo%,ڍ"G/bỘ9PI_ڂƒy}~竭8n+jßZ .$|#LUUI6,<^ VzzsY0i+ۂa0uɣV I61boŎí? !;8p邯r%(ş2Gjy&%5Hq>_ ܿ$-m}nRT,f1(]k]`CI"Aqv; ~G^gR^اYN[`.!ͷ*4it>kժO|  /\`q-5f͇}Q0R?X=a:Z-~Z姯`@3[ONʰBI1HG+'d,Wash6idY\=hv[@eEt% 08c \"C-i$ H֌CPE45^2oXLGG":?p5Zجq>ϳ;h''yกK.`uO BӅR+䚷2I{j.F">yYE|OY&^NDbp1f焸 D½!5Q9?uNΎ7: :.3&N[2Lvee֜MW߈5Kp ?DiwQ;Ǡh1hX}G;i <{uC:PH$ax/dgCZj10ط`0ӫ _\tYTs ^4%3Nc`sXH4g=^slkQ􈚂 Ff pkj%r3X8?+ ԕ_NKf|{ڻЛBIA:kћj{K } <+RT\Ua^0y\exυXp]{Od,=k-&,^ѕ W~6/G#ah7 -(.0(=7o*t@*`cDgs &&Ry!e^ ~ uJ>sYV<)yn\$+?:%+$$%l~uH)!wǽs:N ED)W8 }w0k~eL><@+Fe::*ۘ"Hcz͑^|EΝO^PS{ónR죊bSmTъ=I LSz~LUMޮ؇bؗ;yf(vb[^ŮP않A*vbz.;S'(M)R~@W+SQK"{+@Ş؅]bM}\TlKJ=P+vbߡw+~T_VMbmM^fA=ZŞ۩ء'h~GvuS;UW gD(أ;[؂bߡ=Cg+<.SJ>v]Qa; }m؎?>lu߅.Ww?;ڡ>nS졤IFÇV+*G4MRfYc3I>`Ο'dfZ5}QY@\ zJzDYOCG)@,ٔK%NeVK|WUE*ՎN])/.WHHR̗zX$<:g͙YcbJcYQ^R,WUˊKbE"hUťFn5(*v-3WT\b {qXRU)4FD7TNg Bŋ(*ҀEfd<_VB#ߎ+ @ZYWU,3]󍕐b;*,ˋ+"|ye)dy6.r"qiF]TU-BY!u,^UcIqEfBFT-rWKCo*p 3:ܕ%v*ED(TTcGc+D=X,.SrUTAIQ.U޴BFo ,zzD擉`jc{& 1]Y<PFRB[)Nu.Unr.h$M pcLnUzM@,"1q]Ww}qy=!<"B'R'h9H>"hbZ85}HbqBy 5΃K34MP8ZTm#Jw5uIC's\WBMVU.WJy>Kb|7WK9`C;+0z uW^⪪r崴aؠp=rH2骚"VraeՒ_@J3V ltgdf#gF;3xNG;X';UjVO{JJ'%oK3^?pP!7 vc#o5:k؛o74_ܖO̓nXl˛25ig̜u̞sܢy%v +UV9݋,]vW\EnΙ0U-)i#Bvy X[ j/9vKA ӲFl6g.gέWbu?U&*owyTC PS_p~/ E"îJ;ԭYS[޵CyW<'ݳ=‹/?|o߰ql޲߸mvg{78x9G>'|v_Kd૯SϜ=wKkpjB.w3][bhx\ɳRñ?#~,?ꟗwSiM̑G{ iP)U; v "!w+hzwm*ǽbWI}˭:!_ Ǵ1MLӂ0-LcRP,]4Ir勐2:"dQfJYVbɨAwNS&f .;u 6$iA2-'%@yXP:($ %G\şGHP5魒e*b\")k"=&*p/*=ፄZMM)8 VEI4u~8¯ Q_ɞr|gY 6{&; &s]e!d>'!uw1LMF_?; &sڝs:{y.!;I7*rYhwY.; t8&s]Cz0N[ FuvN!2[ VDгܻ̻ nx)`v}2E`~,:]l%`ކ`2VS+B8B ` p"F'`QL=jjwhp0O8p*m6u^rBi8Jo= &s]}iq\[y7X I{L|Ba!7GMƁ!l'mZxyc 5ITQ7t :R7v@ViUbfh\nOC[$|9ǫI1QsK?dz`ANzx 0mvqEe.#ƈr)|KYO3:t '/vr" nZT;0k*LV(?v/#uZw7ufp 44߂D1!; ߠv|*E@+i U90/(eJȴ^-'6ȰUdgpOH`ޒ!щ 5ج" h*ēb"vPR7'7" PQ ZHu qNqR#e{ JՑ㡔X{(1d@}tΩ-GH=IڦmS,)$Kmp"'X%;:Ud74#-D8^py`=XD|k,4(@ ڂ4g}0H,ˌ@Rc!uYKO =}bՖ5'4ą/Ud+Y nbI?~cHi}ڒ[z5'6paZU/`D>&y/5T͕hliW4!35=,}󟤧jQ];o/:\^))#EҠߍ1KʃƑ#x=DP&<Cy = E])Z4|G3 S`6+iw.74<[~sKzޮ- θ"d4 9ch  MH"ibBp&:AM"Oa"=L% cHQNpQMtc}$cMz t11,3ܷ`q& pIz Vdq1wahcjixj4 oRG$$h㽠$r{ۦoj6#x#G"k 8gꨄ`LO-%Y?xArzIѱX5LiM0< K<3c_;|lFD] \znfj)FMzZz47:c Nc)LZ0XOPO`fDi7Պ̩I0$ŵ4+~fnJ9TxͲ>BKMto%N:ݑ+e+݋QRw>J%T)T֭ jʸMr^;Ԟ[V*CD;C5 q(3c,/Kqei}*9cRTAYK/˦/)*($*vaÁjE/-uQ̉ŠjQ\]+*JMڂ I(˪E"D!3r\wxNb/v2g5ĊK+KKiDE+U. T ڳf/^l2R0k)!jR0Uqmvش+(!ӚT^!1 -D2WynStUR!ikZ-Ϸy*Da~n$ERE > Ev Zb)k,~0+JU(KvBAS$P`]UȏؖYUn@|)c˜v2[ pb`=`v0`6 s'``&7f! ̛`sWd2*0 8d(``g`tQt0< :09&j"YF*`~se` 0ujr#+ 00ڿA!/t$ ohKH;$dқ!)$%H2\G҈\OA$ &C #7 2 #M.EF,2%7[`M3'&2J~An#9'I. 3DTW;Œ2b;szeu/.[RhnrS-sGͷB9ޛ`Eh6`:_-W\K`|(A0wtٝZ*KeUu·^%%KVuƸӮM &rϫ6I(v;݅0"W ˻;0ehP(f.Ⱦtc;&vS.ZQj۷`ЋnP`am1&93@?721z~fTw=tW(ҋ0],*[ s0 C1d Ő15htx'-lNk^surOGh]Rp,uV}:ӟ\"sC7;r 3a1^{iBzʏr$B:b<_ֆ+F1W\gxCM &<#|Å|ń~q=לaAġruW^57oPkmuu\r\syT]~¹<Pp.Or |?\^=\\~E+ X-7֛w,f:3FѺkق=xc=/߻Gkk2]/3;uCwg[\nnwP)Ο}\ӻOY'^=wOZ&4˂I|. +2ǟHvj.@<yAG??qaD!1Gv_J6Vudo*A\դO .uޕ$NɠQLש;7-V%Ӕ;הIXM>>;An! KԚT"KM:PRl3=vcw/N7y9s1tzNu.'~={e<5_=4Z_cɉhD#\πv5{=j>*NnMd =$nNCt=vжhoEo;@cXew= W[vI6֜뷴}vG@nN4?\UY:*ww'm+u9>iEkI ~<_#*#۬xO ]DY'`0;Lfvi)?6{oNM)z?v+*U|HtF/nxBl @[;J߮s)|=h '÷;Nץ"Kůx|]Ok3=59>j_#kmW}k5ltaȹږ?3o؈ˏVE72sW y,?DnʵGu?"V_gh~颟D_[4QX]yc=uaKw-i@Պy/Tw#{p ъ]r: dxF ;MqQ ؄[7XwOtt53]֟D^B v^H#~M^4YE+9ʑÜ0u3,Os;,[D,Yc1'cf$͡g$qyo?S,6,߮"moHCXb(鹦#?7Ô滿ާ#O|6u,?~}߳G WS7/:Dd)v_\{Q"LDF]u͵si6*:cW#GD&<"}*6+>R>1׆\3LʩzlKڬLM>p{j={.Trcgqp 6*W4wbYmzԫy Y=LEwjwpբn.p.$yAՈ@ To52l#e`̓6<|13]ٍrAgdgb 5y>s ϻdg2~3?ɚN$G^;Cs|l7XDJ3EO8CEm@P4)_(m^,qT^_&I (,_?CNe秷 R\p'/IPߓ/]6bpI]`:oD.~OE+ |_ҁſ4J|>@1_eeR:ֿhn}S؜}+^-?26lP`\%5)A:yY$?~"n\*tB>RUj{Y+Ku W$Jlx@b& %J,Nbe %.X 1O]EbtgIL((1J`/$x Lb$6K+AbR{zַZ_^kl{SۓiI5#DôL!]Lkr*څoDO~Ku|&J<.!y]Tot OA.D_.~wUU^ܾ;(7|ݸ'&'_U̮?ff Zj=ת'?n/zqՋٸ}>>W3^kYE>T1f۽Ob- nC7n|oÇ.[|y!vwh?[}5gm.p|ܙ //Ƕn~h䨫I?}٣Vߑ>IXc^}oy71Mg_Л-5^C1#6_yر=e7V I;_^c:*?s_~&̭FEϾ.fe}mawƘݲcѳS˜1ti/q1bbW|yOŕ1woк-}Ḧݐvi%_z|t݀;bo}D/:vQBm;xߦ^[v_x,׍c໗ 3Gn^f)Ob CJZշX+wm{'^4sƚ^2ǖ9mZ|Ԟwz~ڞ=A+ ?(y^aP?tHdP(uL;z=зԗ ;4 dh*PzV |vM!+ofos|0_?sD B Sρ `wЍ" BYS=ϡ B2@=d ǂ AK}/e, 2N~xa, Joѷܑ ?o^t|$pU(Jt#Q>dP5ay=vP xX-d'Z|=!2 <8 eCOg+[AKz%h$L(. P"xe7L(.p(<}۾l ʄd ہA+)]X/< %j$` c_ ]߸dOߺΆO߼ }la {A[߃77<<. =>L;oO7H>xiйR Cs ,tx:`+A!Ȍ6#XEs ~ f|7@Y錂@$ tv@,O 8@m鼁LlIh@soCwO8|]t&{ftA=Z%h-(CtXP2x:@Ɂ~t¥KQ&/5(| pΜJOgOWzfxtP!x:P`Q?JI'p( R8p(@!Ʈ >h57).v@QCA\>P` Pc!;{ :fztK_ %S8cձ, FcvFPR` dgXDb tlѱHPt:VAu o6X=o5P8pA5Qށ@dDu#AǾ2бu칵N½'!@.7C{{@S)!3948LSȰ*JS$o>C!H+~%j[(j ZByK0 Tp\X[l5@O: w]x Pw91mk_N:Qˀ,mdWou glL!6Wo+/%a/ؑ=|D4o|!Bp+:WѮfcQ-1ց4!YoN߼);`H#+Nn%oy,~(DR9ͨv̡4(1 x>$tOsO~ l{$_G_r_| xۧHSɷ[ZMaL-6k?M <R8 fW}2_ <8($Em7F_P9C~NGGXt9k <&ڤ{Y1Π͌.>.t.)Vw:y! 빝{^n) 񡗞: u GƂJLg@n B=[v$Wt :C8*_ * MIB{1~|;0))bvzPH:k1")hڋ׃RCShy` AAC"i/ >*oUr Zd FZ ROQ-k].`t}.IG)AD띜}9]ժo+eloIޭkuXmOzR]ǟLAX2:[HRn(,.7/O,O.O-*olشecF֮=TWDVGW K+۪TՄjk$dՔTГdBYAYaYQYqYIYiYEYmY]Y#!ɕʂʢʊʺʦʖʶ# v8v㝉dg3iw8 EbgYu9 &glwqઐ******^UPUXUTU\URUQUdoZ')wʝr?PK bBcom/sun/jna/w32ce-arm/PK BJ|}<%com/sun/jna/w32ce-arm/jnidispatch.dll|Uř?>7&\ izX#zTͶWC.k m[J[vB"H\[گ۵mlY؍Je FK*p̜{O.5sgygy晙g\wK !| "{j5 =_0UfxWa.]|Eybse73XQQ5Btzrŭ?#=n13U4 hӿFY###e?#cG"ZU<4_#f}xA/iXjXW__SX56⽁ Ygq Dau^R^d媕.j)^[\g'n߿OyĜd8x۞`4.jP4^~`b~R7[?WD?P]&4ޝ xg)8/Ό3+XuRǁx*u,< ^X-ќMcbV;`|*q"J7|wq,˚3b_i"M c]ws ~7ۢs l@ }f%Ąqx'ޠ)qTNծl=V49R4wKZ-کh=~ bIP\7wj4>!_KfI"l&ݟG_+6&oIgϤՐhM"dA#xG^H̾'~-C-a9 |4>s0M?4CRz0 zDNzV Igh p'Y;4X pc4܆!4\p.8D'Tǘ uDtpL+FӤ^Gp!0`| v2$ W/Lr,46c,lIQ?Ah0Ux0 v8 UA=֓^O% iWw KFV/yTy$#ڈ~}nz]o<7לُ!CE#*1u*wxUlg}֫Ɩ1r*qiiOs9נL@e\?*\ ծYi4D_`~ib,1 ̷w_bSݖ?b~t~vҐ}c|.;:6_@7-Yߨ| ųOѩxb8V>V'lcQ1 !C؍!F"AmfMMI9!g.F:ϲ)xIga@{(r<,c;9F6ۣoG_2ʇ 7upUÄ&5L U`:\@Ē"K㷁߁,K[7ׅr:uȝxX{Īdd͵qe{!Iʵkm^ 1/nZc91&7 GS>eLjg7dŁu | 3 `p 7{patrgs>l3pyA\4&F}Oxj-q w8i)%8}w91,qLA1P&A~f~N?{o? Y?J}{նtCqGB K<љ6c^3>79.O= 9ck>Cz/O̥]qAs@S80l=KdzO?MxL`\]GMJ:u 9 OՀF%?9w\v<~T#Ys gw%}ϩK"kB C6c2oo~T ꄙ[K9'wi_%QznRjz8l5^8 Mʔci3ە;Kt7AK$;42+ =Odn;{Pm7E~onFz95@WU♭ӿM^|@}N럱PS9.' : )Plhhi~{'0ݘ,>NK٣qy'{qAI1a-m\rTXݹv,W#1yW%H$^J%H)~'cBq׸Dy}x=3N'O+}ЧVT7pY_~~nf|9uCei{Z?P[hg zu]ʅZpЖo|(aIحv6j.6[_&]v >kp;إy3a|O͙ r3tv֯T3i`Ɍ%۽ SmC;HSS3}+Gmx`76aeNuJ 6/v'/*^::ya{&/cggxy /e N.+q REC{Wg$r&O_̍}B O6)G.`l5i~Gl5YgyM}| u>%nH~q1H?ͼ=-G>0,n?`@*/rAFW fwJ ^_C*U^lWRUؿx񙴽1o6&Ny]M;iv!m1Wc;9?q(z;?D=SX[MIó.MX̓X~P-㘟=6}/y6*,g_e84uGjz>T t~4;dz06nyaX,IE*{3{/,k &R|(cYeqBm\G0ʚ<};'W<3!\߿zoixƟ}/|.;#@8\WܿFs 8@g衟Hi Qǃ [szXUS4W3-$שּׂ)A_ܓi9c$תDmϋ〃܏j~q_(=35wq F8n!x5$^<%ȿ)GGWRij.sXWAC5;#Zy/KH4%0Exq͂bDzfShpVITmog%l?/u0v !iۨI >k r+9uiMc̗O>;"nNoMȩSPr^ox_74^p^o>⸟5{=:\R[Jz|kqyé3 q̑auC!HRt%>Lp_Xྋ1^e-O*Tמ.ugm9gЬϸ?AqZL'Z7? ٬ʺͺ r-֩].r:kB{ѳv &,A?j$ӟ=ϵ"5<m1v#9P9>˴YϣG3:,M|e9/ r~~11ߝqS]tٟǎXן~^=vÅ9;Dj\!-cN]DNѿ{\{Y\ǕoL{T [*V|q_qD;{.X|k"Z爢۽~82'X~u{5F|u6R{k \9];1H?.<'"v tO n%@QnaK~5/[8496$-5:gp?0&9Kӑ&g\t]kSVoN[7ԁ~јe"[A srF'҇m?ދ36Z:2R(l"䜁HP"OJr* k8&9z,poKV^Fd2slsk\hc>yɜo]$37> OON}w9j߽?w^ՖV\̏?0 Ùk@jhӻ-7>3w|OsvJxC#P~Xt "zJл~X+vTwS=#v]AFl.`쩆7s:8y6[*WOL ЇHiAg{u%Uh\w zЯfwNXm/w^.^)2BU@DygBВS Ē΅΂+ȹwd?ugOIq0OzހǍ~F~%'M9˅x}:2gǫy1%'lH1GRvu1N1tz;y֮qtG>u~Ȇ;hhUkzɷ]‰>Bx4M]KA3$SԵh4}jCT5}۶'?`re\dWPN ^~|L<~c}c"ߥ-vU1<YQrrA!68˨q.-O9\_!z2|1Yg\:|a~xLЛ, |7i%ki/A7P)Ǔ\!XJCO4r窔Q}>>xm+sLcWB0 ?HnY (K 'lB:o*!*ParUB yW}z1|5j͵“ы*J8I/iz!m+a+i+,m%kkD4+J˃hs Xc/~]K8'covpls.]8:~h_3( ƅ\{ɁySSuήSij%uZhw!,$vȽّK?->Hm_TX^};r}v gw*u.(ݱtҏd>:>C=_yM|2vg"g}w=3񀽳,t|/Bwimgt/+}]Ew t߂OI}}?8v}/Wkk.dt/n_'B$UCwe??idtޗ-}?ZJΤ;ݗIi({/dtYt9?}v?]}>+{'n[_2?B)HN{iߡ2^s;x]ҟx0  >|vSURW~5_ ?[\l /ܯo\']h\)CA;6%F<^kqـ<ې.)cu:W<5ȳyff30+OЕg*#烮r*t9''fe}9rNqwz{"ٗȔsd*͕+O'܄<;y05<swgX+UēpO^ ^͹*:i'D f!5Mxwىwes}6^ON*;ǻs x~ #l|=<ӇO#xV"|!_gܯs;&7Z!X\g=OE=]xr<'7cY@9B|!<eby yT^XUqU3zAƨsnF`r̹? p p[ǔp"}~ٖ94яQtx7y)}JyZQ  6~ ooj]ƒMBPçGbP.p{d/T~pmx|VKO q`Dfݨ%KZrozY`W Jgãaī;/Gw*ϙRbckok\+ pp7:Ks]"0&`g>1/n/pVE='lApsדKbN9y /ڿ3%!˄³aW-RaB o0V#_B<!,{9L=.~!q~4;bnq%D[s/6Ѹ Va=VO)"ϤRML܂zOy s"ɽ:7O8dm8Fh" O&~`;>h;-C yfcø>kv|;&Kolb}sM룹;1mҾqUqj9~xgpEGPF||{b]Y,v!ʺsqx>0/ىgzUq#J+п!r$_=jd5O<7aWT#JcMKzFr\xuaFxvxa݄gڌ>.yީ WO=l7?d9J<>J"ɛ&wx;z~!b<\)Z;FܔG\ɲVK5Wl[]n>.׹Mwu~ߟN6N2,ϸG+a^u!0yfcq::aߟ2尌7 r?[g܈3}]ΟOg4yfY<{p(ڬAHYl"~x-K7e6܊2_e2O Pjo.H)~  7s@U>ʥiwy^7쇟G? g v)(Cop+4ִviNS}cmSR?FQfe&Py28ۦ+k| z}ޣ$˩eߣ̀η^wn[zj팑N;CEϔӼg1I바1alVC-ܼ{}dkj ѭ=leҩrb򍻬]!g*C$3q8HhS)N8+g"P=s]=UǣOR>V5.@v? ς%eyjVx~Wt}tp[=*~)˛S_'RiΒ15zHЯO9<nWYjmORV0rOoݗRa1OMi3'$lа;t?'~-G:B_H""g{x֮E;Iyɘpuyʿ7'%s 'U>3Z`h}IO³G>c$}F1o |*Mh\T1}so{p}CKQ7ko?KUe|}zgsEη ?ޣ/x6% ;_yBsQP,~2,ƵDW }sm>qo@pq_W3$Qo,4+QUu;EFBr_W*xTz[1)}o< 97ۑ{P]Y_w+C(HB_5O@;a~0292y4ed1sDhsYί Ld3I 5!zs5}\9_,К=uBbmR\k]W=EnQu'G7J/㾘n/K/r=:U>7^ont_AtVvLtJ cZ1Vu4W9v7)q݃mZ\iX }![|zl׼xA~VsqOte泬C~xmWv6yGs0q?mm"yfz[e$LofiKZޯZ񻅱ɰA` mdKxSl3-F](}Ɠ+y%}Pл@<6^ 8 KbT<ۮw[-2ڀه=a&{ttk:[7R8wMye&0ŀyf4L `vsT&3Ĝ1#5?IZ~^u'~/~vΘ`qO{V?X y3]aga uَ}nNu).9x\sͧRA}5|'ϿQRdB~Y Yy+N1辱[˯/00O M8:_tU`M8qkԱʪ>t^Y3wΛɻ78Msy.) %._QE|BL߭>:,]sU,#la~ `G'gη=M *#q5&Q\ grOF&)>#J4}ڙ 7GjXV{^h:xƱpt4YoSMnG&`|Szl+ϦsHVic\#£_  0v<ꑾ:碞B)4C b6OGd9V-_:i8ٿG\j\{DQN~;y|&3|% 򌑘ij9n)1zk!$w8Rܣ a\4xAWd =~CcFȹR׺,GLgZZxO~Ϸ[1ۊ=)Pk@o5qOF Qo㙖 `Z» [^ő;ᙟk/}?5 #Mxq;l߇v[;2sW?\evԇUf%< uNec5 _;y"Mg&f _0 n`]ib)ٹ~f:wc=w_yεWa/ Vq-+oe~5Xm?<ƮFr?};aZ2::t.'B?#-|)3yznӄ>4tsGO}Q<ɵh ٶ\;ˊM#poWX׉O2[6;`CK'+1~*l:*'NﰕZhW>CS2ݚZ[xPT}-Xg.=G}Z&ڼ/~xNeBf7|3ـ5MvBj>Ŀi5JovfTWJ}m}g4ym)>B^~pן\@a{_Wt]aW{tZ؋h60pVW)|'Z@6w5.|?y%7B_-\}Q zW06O̕`ΝlI'׫'C/ޏ~`^Ȃdv9.9ȴ'-lӼὋ'.<3}H{] {師޿/P\?iEcPui a'C0*܅ow [F Q ȱg9Z,Ӷ,`̹cNK󓟕MyDŽw2mK}%1X?@Vk7:.X}#[GV}mڈ&B@08`yO}@^^ЮTbaB=;O:]80ԷK6ێͺ[q(W^~sGN{o3xYwUs'O{L;e>NkN.㜯vݮ5%5X }tZ΋XFw!& l@C]uxTI#Pbq7sx?ոkmF #Ƀ6s1W%x+m oF=S^8aTbмl@Y/}fnצ o3EX_I\pY<ށt;:0f8:<Ôqq̑53 O[}~UߒdJGW?w{oPX_N¶*s1ViO#gg_񛤮}a^f~4jO:d}oqWu\/as޿ӿJU]t~z]4GiN[lԟ<$ûyJ4]+6ҡ雎1%%Y(|q?|}GB!✑tq-sHSQa 7[0wOn:DiF5{Dʹ9hnmKGHE/jYꂿ{߄No&_ ;ׄ(c 1L5}fFUjajx-m w3dMxnB7*wAbld#U˹f(7+B&aFkw$N17sW~[mJC0W>Yyro>![d/0ԚE2V{'v~3pY=Kɯ̋_±Rw,GUBϹ/͵1і.b7?[1'"jncce{2z!ۈwoTͲOC{UnX퀦-qk.wq]c'}\Wz!O'!gŮ1-#ɱ6`#xUzc%ǐ=oqceYc;ؘV6zrLAEُ~ ::['Ӧ/M^ Yror-ߙ4k`ߥY@?)7<Z=X?@K9nLLf2_cп4N;ϻw?%ԵZd;1P>3>  jC qzPҹu!Wy)|Zz`Z=~N/v_z;%ЃMСohD.ۉg+}5ZJ`l:=R!﫼Oòn.˩3V 4QQotW}q-C\=Nʳ$7>Bag,i1s;8ѹ+5'{\zX#SgLmۼXo"e)V>#F9ݢ|l u}Sm6,1[e{͝B8SOM43ngR$!?Tꠃקw,Oeڷ~N{S,{e8m&Mwf9s5톋-\d%3sQ|^L9q\PfҶWGr){(ڮp8;8b >}:6t-k)ᝰUAhM/ c鏄QLCiq}7Z)xOI#~Nᄄ'OLIm9[ -܏pym4[b"r1/1Mg'@Oӿ/7&r'Ol׊;a{[0O˽1]Ȝy˅m}ȉ ΏJFA룠1_0?r4mb4gs"e:x_D1~/~*|bsք+z,O 9SNJ9W%C/#zrD^1>E/:t΃c. <ڬpDynCk/T?O9km>Lgy[OR9.|%i ʞ9{m٢CY¸KԐ:/"^09s N4û͎x-3:OUM)]4a,%oguѤgw=)3~ܷ8}ġco:Ⱛ9\76.fZ%h#7"e$sWKv]kʜ[Gk=2RC0 +2'cbsWV?}St ɪMwqtsϘsFپ{;<"9Xo]uGmSG9v>G)S8DK>rԁ#Pl 9՘#6k-! T{Zng_*6)r9e_? }34_  4]'YVDfu,]C)7'hQ}J۳:#r1yz~a1VsgNi3@{pmr0g!GOo/߀I'D!Cm駭+~-7'۞[0{ud"h;Q9~<~N #dOmܲԏ9`5yEhHh~Znn_gaH緂oA9?xNyEayoh$<-\C)}vjp"׺-l,WԷ=֫]jV K;vAnL_N'?8= y jل9F:uĜdZvgvP*=f'ϣsao>Lεu?6kiXSlni%=Z_f͘kP ȯWz>{#ේ~:~Toccƨ#']7%Z$/<-%~)I|лsjyg>߮N?XL}]9?%Ŗc',VR)qxqS/ =| SZnM#7=гGz~un|Oy>K~w]$ϧ5'.k5/" 3Nvev t6A%hUzl_^圲&q>37vN`&rďϨXԃ1 s6{ِ倘'Cd:"ʒ#"&H ?.b:~xڐvG=kS(|\Y:#<}ցqLt>3#k;"eeG/(u9b3\*qK|KׄrB=J{ve_EݥyCceym }EHmdQL~=dSW50HDff+ exi{xe^/8pt-=\$J} Z,#(O'tzLYIKH/Ub﮾\ێy^^+dٯYl4|~/t`ݒU Ԯ*Xjl~c3|~MH91^z) sN@pgg2r\"0VǪ~tCh;x']+)\|k\pM?2GbR&ۖP{0^}j]Mcj,#Ľ.k貞0LHV@p?<Ov@6oyqNi ?:͎щ1јhHO3o Ի~6}YZLwz6`4,}^-=ԣGK'\=10L?L,7GzQ.a)n'K߰#9@9%aGIS>ush[wN(+,ɳ`3{WxNv逦>jNو{Bݟ=7b~l$^?öwWƎo9&7|:k._κΖ/6&P_\~ټ}{Ucm lI>^®Ƨ[B/^F#6Ii>ZF/=563L! 7&6c9F=^mS h#֍~"ǭ\{)9ЕWw#yoeV]@k#o*[< >yezqhz{GIs[GaTPqN]~ O=io;9G:̶&/8f|()kpOxYՁl Xvm85)wCוAkLO[>5++Hiz8oz=7dNvI}}{SwrcъĄ)Mb3r?s^8iwo%Ϋџs>y=b&gUbK7'> yfons}֗4,jψC~og#y&Mr8,vԋ>gȅ}`з6Gྐྵ:|*]ewz/v\~'\U.r.:>ypo˘so0a#ҙV\EZ].k^[cW/ZnXbׯX~qݲ5\dJs*ss՝ xn%-co^r劕(v fm}E 檆˖ߞ:W"+%י +E+ w.js4FPha]͆n\b~*2._2_%4*&>%+kXE_7W5rdi*ŋ׮`"0%CߢwI-4jj4i2ԝUw.kk/ X.߸|jjɲu-z>vrTv*|%@s \˖/k^tioraLm@<_QL0A*}͌d彽~m`Ő- Xr{ 3]7EݜU9 }/rѰtE)FL KEgĜQf Qn ,]:ew-Fg]/WΈ.!ʦKi6F͠lːקs|mnPqrKV¡%4K.\ѯfYkЩj!ĵ}KMg_][a\)}JE4\L +59|DJ ?dzp+4J:F$| l6OoT[ǑK2Y3uҠPxW g:%}^ivgaKץݟTҷ8ۮbRUgL_s">=JU_-!hB?|HRTqj4 j}k|iӜ9yo2G+_^Pe69}ynu@vu[}+0gTWJ#eܠJAӟm;Zܠ";[U[|^Ӧ˗,YUF^[͂>r׊Ziqvp0.}KאE{H1a!BBa5BaB v(cGO w0w5fU{Ϡc٪Uj2G9~Ueu*tSLm^r+M'դ"ZD;qӳ@L^bYb΋.B>gYqAE8.Z$נk#|1a  b~6>+*y 89o5o{ 7 3kxCOWcpw.&u0 Ze+UfBgo&]o:%k(伳ċklkd01 X v؏`f23PLr;:X]Ra/*Z(9*9ܝRH(N*9{fRQ}zᑇ\34hnPycʏ?"< 2]Y+Mk1a#8nU0Kx%DY$P1J*yg(nU:J%b)3łcMÑLd0A< 291?ܿc|)Z gQbZ&^&n8 mMD nn ʝ'Z'ӂ\ӼйY2&3Dۏ'ӿ>MAh/2n-ɚ¢Z L-ٺm9GXGZ jblv_bIsؙIc]j1ބI~*됂ȒYLsmc<=5|EXst(.߫}-1U[VbGoea4(i@2b O? $ ;"{ݩFő>!{6=!#7A\OtGPca󻂳.bv1 L<go?;i}YNiXc<5G}Bx{fk6" Qh("t5V>I݊suq#ѡa[(p]{F$>E*=u%a /ki,rhh#b3GB%o7:k̏*zowGwt,vt^Խy`]'s['=v5p"6q2z-<c]R7 v (, 6aɬkb+ N:k [w}NUu 爈Yzeth{pƇCrLw.*iC !B _4/ g!=m!\͇!4 -x65ď0xAݠVUG Y3 moT᧝:B>H MAkQ>]OAh.#'@gA?Z/#ρ>z tP2r tE7@?x@ˠ~*)#ς@@oVA?=d AoAOtt2RzM~(]{rG+ϡ=JQr?QI JhD'!&qJh#go.ģl:n&F #/m)B9O(>G_Xg4Eb_eyrm {1D793W)Y椛ND]W"CҊz$P';ϝ \Ύ&M"tyYlDQ^>m/|0`bX^xeNE+LUfaBoa{5NrDSWZ'#a^4O簎.,}9Dry0(Z\g*89Bq>'K3ʱI f}@9z:A}6hǠAՃ@P<J9iuwA7?@k9:A|\&:&(;$#lUBbND>[q(N/d_JEG1>AUF3y|]MΌ@0#ѐ:`|*/ңЦC׃xcݱL2>]KcBxB.w't L %rrsM|\@. jK\ Srk9|N(=VGAk &FÄ|` _hnLbSzCWǛ́d627π.#'#d9 w^OO>EO[xh_Ej"p-c"_5n9A/ݩ{ u$ë׋?iٝ'$JK`iLK{}n ް­p{#{}hx8ùXx<< O3kTq\Qװ+Jr1׸kµ~OwSB o6R`ag}sy߂ow۷[V}_)JҮt(Jң*}JTVJZ)cʸ2L*Sʴ2\S+7-eVSeQ,)ʊrGYU*k=徲l(ʖO> ~Ky]Ly[ UC5P]>j BސBP{#zC}hh8C9!چI!שp+ܕ*w]s׻܍nVݚzz;ͫwך5o^ohljn~мL o7vP4! x<|L@71u\P') zKUhP꒺wUS;*iQ[ZZZ\I7lڴvl%UCݡN:Wk5\>OiV_uz|>_7KҾo7;n ?mc/M5uRrJ˝Ֆ-k-Zll"-ZvZHՀԊ>{<`&[a]Qbvx)^ ZS=5]Y?[BʰgM@0A96%#:MC=xuIм|!!4b\yڒ7@"Buڑ?+"FS(!?UG6 yȲ<}Riп'!! U"dCB2@u |H#xK 5 y>/%!Gc"GW<%}14IH3E r_B~HE| H1MBG%ȘH'JU yvǥ7 5RBiH@vH"biI }r HGDP "?,Jsm3'D% O# B\϶|H]n 9~LKH;% dSB^RT_@Z%jlG!$HE*!Y 9 [;@Vl2L{DogKB6L6Ox"!h 䚄I+"2*8 r ]Dd⼈|Ȝ-5 yq[B@z>#"~VDR@@"G}'"d\BȢ<#!x/Im ȔYk%i})P Q  դlِ.XH["R$>BzFD7%"@*ib~sl;_l;' B5mɃ9 ]@?_J ˔v"i@~5?)Fd+k?ȗ~dSBH۵ްyP_.^G~zRWȎGU;aDQ $ 9o) rȰJ% /aF$kf\ 4}sC)ywxR#놅 !5l<6bFEP7~iuZv |"5Y#" )oxrO{步N\dY٢ aUT9\IsygKT4.e\ uRؗ> Y9rr2,OKi°-!wEeGSN;ζ6DWK^QkW2XDה=~e_S.?Ҿ:iwvH [k-AlӹpNY`1SDk_ ex1 Gc]A$] c#1>_ϊB-٢O2_'1T&+!&240EF4퇋7:G-儅Yv0:qO1۴3%jr6ұxё\ /}S /F9p`Ȕ, +%Ra T"JfD4R4-A Gzs-<3PT0|$uyߧ]; V;RФb E)&e tA4ky |lf#@2$~k2h얠2K,Z$N]!]nK 2gB#"#f[5f[P$.0a8S:fE˿LU+}nϑa*J әz#8`3H|Ċ<w~q,d XCPK bB AMETA-INF/PK bB4+META-INF/MANIFEST.MFPK :SBA com/PK :SBA,com/sun/PK ;SB ARcom/sun/jna/PK ;SBA|com/sun/jna/ptr/PK ;SBAcom/sun/jna/win32/PK bBYm&com/sun/jna/AltCallingConvention.classPK bBB( '3com/sun/jna/Callback$UncaughtExceptionHandler.classPK bBz#acom/sun/jna/Callback.classPK bBz*rcom/sun/jna/CallbackParameterContext.classPK bBn~i1 com/sun/jna/CallbackProxy.classPK bBQ1 com/sun/jna/CallbackReference$AttachOptions.classPK bB#8 com/sun/jna/CallbackReference$DefaultCallbackProxy.classPK bB|? 96com/sun/jna/CallbackReference$NativeFunctionHandler.classPK bBy4#}!com/sun/jna/CallbackReference.classPK bB ּD+'Z;com/sun/jna/CallbackResultContext.classPK bBI'+<com/sun/jna/CallbackThreadInitializer.classPK bBYR5)?com/sun/jna/DefaultTypeMapper$Entry.classPK bBde #GAcom/sun/jna/DefaultTypeMapper.classPK bB l9#Gcom/sun/jna/FromNativeContext.classPK bBMCU %Hcom/sun/jna/FromNativeConverter.classPK bB ,Icom/sun/jna/Function$NativeMappedArray.classPK bBrn'Kcom/sun/jna/Function$PointerArray.classPK bB\'9Ncom/sun/jna/Function$PostCallRead.classPK bB$W!G!Ocom/sun/jna/Function.classPK bB> pcom/sun/jna/FunctionMapper.classPK bB$5m>b*qcom/sun/jna/FunctionParameterContext.classPK bB‘'scom/sun/jna/FunctionResultContext.classPK bBn x`ucom/sun/jna/IntegerType.classPK bBՠ"|com/sun/jna/InvocationMapper.classPK bB[XE~$}com/sun/jna/LastErrorException.classPK bB*/Kcom/sun/jna/Library$1.classPK bBgZ .!com/sun/jna/Library$Handler$FunctionInfo.classPK bB%n !com/sun/jna/Library$Handler.classPK bB"com/sun/jna/Library.classPK bB-K%ڏcom/sun/jna/Memory$SharedMemory.classPK bB]@mxf"hcom/sun/jna/Memory.classPK bBr(com/sun/jna/MethodParameterContext.classPK bB_6%{com/sun/jna/MethodResultContext.classPK bBjDcom/sun/jna/Native$1.classPK bBC&2com/sun/jna/Native$2.classPK bBuPcom/sun/jna/Native$3.classPK bB=JfEcom/sun/jna/Native$4.classPK bB,com/sun/jna/Native$5.classPK bBG com/sun/jna/Native$6.classPK bBsq*com/sun/jna/Native$7.classPK bBoWJ!com/sun/jna/Native$8.classPK bBAصcom/sun/jna/Native$AWT.classPK bBNCU com/sun/jna/Native$Buffers.classPK bB0%%com/sun/jna/Native$ffi_callback.classPK bB: HIcom/sun/jna/Native.classPK bB GSR&I!*com/sun/jna/NativeLibrary$1.classPK bBmP!com/sun/jna/NativeLibrary$2.classPK bB$#F; com/sun/jna/NativeLibrary.classPK bB NF[u/com/sun/jna/NativeLong.classPK bBu\' 1com/sun/jna/NativeMapped.classPK bBARMy '1com/sun/jna/NativeMappedConverter.classPK bBT 48com/sun/jna/NativeString.classPK bB, *>com/sun/jna/Platform.classPK bBqOJcom/sun/jna/Pointer$1.classPK bB_ Kcom/sun/jna/Pointer$Opaque.classPK bBwJ%TQcom/sun/jna/Pointer.classPK bBF/  wcom/sun/jna/PointerType.classPK bB-«l {com/sun/jna/StringArray.classPK bB}fJcom/sun/jna/Structure$1.classPK bB**com/sun/jna/Structure$2$StructureSet.classPK bBͺ#bKcom/sun/jna/Structure$2.classPK bB4k >L Acom/sun/jna/Structure$3.classPK bBk)ȋcom/sun/jna/Structure$AutoAllocated.classPK bB"'com/sun/jna/Structure$ByReference.classPK bBT\#com/sun/jna/Structure$ByValue.classPK bBlBX=,acom/sun/jna/Structure$FFIType$FFITypes.classPK bBDnV*com/sun/jna/Structure$FFIType$size_t.classPK bBzZF #com/sun/jna/Structure$FFIType.classPK bBGgdh &%com/sun/jna/Structure$LayoutInfo.classPK bB4br'ͤcom/sun/jna/Structure$StructField.classPK bB/i^?\com/sun/jna/Structure.classPK bBٞC&Ccom/sun/jna/StructureReadContext.classPK bBdq'%com/sun/jna/StructureWriteContext.classPK bB-*!com/sun/jna/ToNativeContext.classPK bB҈#com/sun/jna/ToNativeConverter.classPK bBSncom/sun/jna/TypeConverter.classPK bB/Hhcom/sun/jna/TypeMapper.classPK bB9Ujcom/sun/jna/Union.classPK bBI''com/sun/jna/Version.classPK bB/com/sun/jna/WString.classPK bBSp@'\com/sun/jna/WeakIdentityHashMap$1.classPK bB@db;com/sun/jna/WeakIdentityHashMap$IdentityWeakReference.classPK bBFH%wcom/sun/jna/WeakIdentityHashMap.classPK bBC/!Zcom/sun/jna/ptr/ByReference.classPK bBɴ?Τ%com/sun/jna/ptr/ByteByReference.classPK bB' com/sun/jna/ptr/DoubleByReference.classPK bB]r& com/sun/jna/ptr/FloatByReference.classPK bB|9 $com/sun/jna/ptr/IntByReference.classPK bBt%acom/sun/jna/ptr/LongByReference.classPK bB+Ncom/sun/jna/ptr/NativeLongByReference.classPK bBǯR(xcom/sun/jna/ptr/PointerByReference.classPK bBwF&mcom/sun/jna/ptr/ShortByReference.classPK bBpO£#Ucom/sun/jna/win32/DLLCallback.classPK bBBXu9com/sun/jna/win32/StdCall.classPK bBܒ) -com/sun/jna/win32/StdCallFunctionMapper.classPK bB #6?com/sun/jna/win32/StdCallLibrary$StdCallCallback.classPK bBOi>&C com/sun/jna/win32/StdCallLibrary.classPK bBGJd:*,!com/sun/jna/win32/W32APIFunctionMapper.classPK bBP-'t%com/sun/jna/win32/W32APIOptions$1.classPK bBUD'_'com/sun/jna/win32/W32APIOptions$2.classPK bB#w_Q%G)com/sun/jna/win32/W32APIOptions.classPK bBs*Q+com/sun/jna/win32/W32APITypeMapper$1.classPK bBLw*9.com/sun/jna/win32/W32APITypeMapper$2.classPK bBIYr(D1com/sun/jna/win32/W32APITypeMapper.classPK bBA3com/sun/jna/win32-x86/PK FB6E;_9z%4com/sun/jna/win32-x86/jnidispatch.dll9z;_PK bBAcom/sun/jna/darwin/PK UBd l$(ړcom/sun/jna/darwin/libjnidispatch.jnilibPK bBA,com/sun/jna/linux-x86/PK 2BzïD m'`com/sun/jna/linux-x86/libjnidispatch.so mDPK bBAcom/sun/jna/linux-x86-64/PK ^BX+ȫ*4com/sun/jna/linux-x86-64/libjnidispatch.soȫPK bBAX9com/sun/jna/linux-arm/PK 7B]3G'9com/sun/jna/linux-arm/libjnidispatch.soPK bBAcom/sun/jna/sunos-x86/PK %BԦ'com/sun/jna/sunos-x86/libjnidispatch.soPK bBAcom/sun/jna/sunos-x86-64/PK B$F*Jcom/sun/jna/sunos-x86-64/libjnidispatch.soPK bBALcom/sun/jna/sunos-sparc/PK BUɴ*)LLcom/sun/jna/sunos-sparc/libjnidispatch.soPK bBAcom/sun/jna/sunos-sparcv9/PK 1BJK=P0+com/sun/jna/sunos-sparcv9/libjnidispatch.soPK bBAF com/sun/jna/freebsd-x86/PK BzFK)| com/sun/jna/freebsd-x86/libjnidispatch.soPK bBA=< com/sun/jna/freebsd-x86-64/PK 1Bqމ,v< com/sun/jna/freebsd-x86-64/libjnidispatch.soPK bBA1 com/sun/jna/openbsd-x86/PK B j|)g com/sun/jna/openbsd-x86/libjnidispatch.soPK bBAn com/sun/jna/openbsd-x86-64/PK (BNNsѝ,n com/sun/jna/openbsd-x86-64/libjnidispatch.soPK bBA com/sun/jna/win32-x86-64/PK BB( M0( com/sun/jna/win32-x86-64/jnidispatch.dllM0PK bBAJ com/sun/jna/w32ce-arm/PK BJ|}<%J com/sun/jna/w32ce-arm/jnidispatch.dllPK, nqp-2013.12.1/3rdparty/libtommath/000077500000000000000000000000001225523575400165415ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/libtommath/LICENSE000066400000000000000000000013151225523575400175460ustar00rootroot00000000000000LibTomMath is licensed under DUAL licensing terms. Choose and use the license of your needs. [LICENSE #1] LibTomMath is public domain. As should all quality software be. Tom St Denis [/LICENSE #1] [LICENSE #2] DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. [/LICENSE #2] nqp-2013.12.1/3rdparty/libtommath/bn_error.c000066400000000000000000000021741225523575400205210ustar00rootroot00000000000000#include #ifdef BN_ERROR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const struct { int code; const char *msg; } msgs[] = { { MP_OKAY, "Successful" }, { MP_MEM, "Out of heap" }, { MP_VAL, "Value out of range" } }; /* return a char * string for a given code */ char *mp_error_to_string(int code) { int x; /* scan the lookup table for the given message */ for (x = 0; x < (int)(sizeof(msgs) / sizeof(msgs[0])); x++) { if (msgs[x].code == code) { return msgs[x].msg; } } /* generic reply for invalid code */ return "Invalid error code"; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_fast_mp_invmod.c000066400000000000000000000064201225523575400223730ustar00rootroot00000000000000#include #ifdef BN_FAST_MP_INVMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes the modular inverse via binary extended euclidean algorithm, * that is c = 1/a mod b * * Based on slow invmod except this is optimized for the case where b is * odd as per HAC Note 14.64 on pp. 610 */ int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) { mp_int x, y, u, v, B, D; int res, neg; /* 2. [modified] b must be odd */ if (mp_iseven (b) == 1) { return MP_VAL; } /* init all our temps */ if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { return res; } /* x == modulus, y == value to invert */ if ((res = mp_copy (b, &x)) != MP_OKAY) { goto LBL_ERR; } /* we need y = |a| */ if ((res = mp_mod (a, b, &y)) != MP_OKAY) { goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { goto LBL_ERR; } mp_set (&D, 1); top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { goto LBL_ERR; } /* 4.2 if B is odd then */ if (mp_isodd (&B) == 1) { if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { goto LBL_ERR; } } /* B = B/2 */ if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { goto LBL_ERR; } } /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto LBL_ERR; } /* 5.2 if D is odd then */ if (mp_isodd (&D) == 1) { /* D = (D-x)/2 */ if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { goto LBL_ERR; } } /* D = D/2 */ if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { goto LBL_ERR; } } /* 6. if u >= v then */ if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { goto LBL_ERR; } } else { /* v - v - u, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { goto LBL_ERR; } } /* if not zero goto step 4 */ if (mp_iszero (&u) == 0) { goto top; } /* now a = C, b = D, gcd == g*v */ /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; goto LBL_ERR; } /* b is now the inverse */ neg = a->sign; while (D.sign == MP_NEG) { if ((res = mp_add (&D, b, &D)) != MP_OKAY) { goto LBL_ERR; } } mp_exch (&D, c); c->sign = neg; res = MP_OKAY; LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_fast_mp_montgomery_reduce.c000066400000000000000000000107361225523575400246330ustar00rootroot00000000000000#include #ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes xR**-1 == x (mod N) via Montgomery Reduction * * This is an optimized implementation of montgomery_reduce * which uses the comba method to quickly calculate the columns of the * reduction. * * Based on Algorithm 14.32 on pp.601 of HAC. */ int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) { int ix, res, olduse; mp_word W[MP_WARRAY]; /* get old used count */ olduse = x->used; /* grow a as required */ if (x->alloc < n->used + 1) { if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { return res; } } /* first we have to get the digits of the input into * an array of double precision words W[...] */ { register mp_word *_W; register mp_digit *tmpx; /* alias for the W[] array */ _W = W; /* alias for the digits of x*/ tmpx = x->dp; /* copy the digits of a into W[0..a->used-1] */ for (ix = 0; ix < x->used; ix++) { *_W++ = *tmpx++; } /* zero the high words of W[a->used..m->used*2] */ for (; ix < n->used * 2 + 1; ix++) { *_W++ = 0; } } /* now we proceed to zero successive digits * from the least significant upwards */ for (ix = 0; ix < n->used; ix++) { /* mu = ai * m' mod b * * We avoid a double precision multiplication (which isn't required) * by casting the value down to a mp_digit. Note this requires * that W[ix-1] have the carry cleared (see after the inner loop) */ register mp_digit mu; mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); /* a = a + mu * m * b**i * * This is computed in place and on the fly. The multiplication * by b**i is handled by offseting which columns the results * are added to. * * Note the comba method normally doesn't handle carries in the * inner loop In this case we fix the carry from the previous * column since the Montgomery reduction requires digits of the * result (so far) [see above] to work. This is * handled by fixing up one carry after the inner loop. The * carry fixups are done in order so after these loops the * first m->used words of W[] have the carries fixed */ { register int iy; register mp_digit *tmpn; register mp_word *_W; /* alias for the digits of the modulus */ tmpn = n->dp; /* Alias for the columns set by an offset of ix */ _W = W + ix; /* inner loop */ for (iy = 0; iy < n->used; iy++) { *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); } } /* now fix carry for next digit, W[ix+1] */ W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); } /* now we have to propagate the carries and * shift the words downward [all those least * significant digits we zeroed]. */ { register mp_digit *tmpx; register mp_word *_W, *_W1; /* nox fix rest of carries */ /* alias for current word */ _W1 = W + ix; /* alias for next word, where the carry goes */ _W = W + ++ix; for (; ix <= n->used * 2 + 1; ix++) { *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); } /* copy out, A = A/b**n * * The result is A/b**n but instead of converting from an * array of mp_word to mp_digit than calling mp_rshd * we just copy them in the right order */ /* alias for destination word */ tmpx = x->dp; /* alias for shifted double precision result */ _W = W + n->used; for (ix = 0; ix < n->used + 1; ix++) { *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); } /* zero oldused digits, if the input a was larger than * m->used+1 we'll have to clear the digits */ for (; ix < olduse; ix++) { *tmpx++ = 0; } } /* set the max used and clamp */ x->used = n->used + 1; mp_clamp (x); /* if A >= m then A = A - m */ if (mp_cmp_mag (x, n) != MP_LT) { return s_mp_sub (x, n, x); } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_fast_s_mp_mul_digs.c000066400000000000000000000052701225523575400232260ustar00rootroot00000000000000#include #ifdef BN_FAST_S_MP_MUL_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Fast (comba) multiplier * * This is the fast column-array [comba] multiplier. It is * designed to compute the columns of the product first * then handle the carries afterwards. This has the effect * of making the nested loops that compute the columns very * simple and schedulable on super-scalar processors. * * This has been modified to produce a variable number of * digits of output so if say only a half-product is required * you don't have to compute the upper half (a feature * required for fast Barrett reduction). * * Based on Algorithm 14.12 on pp.595 of HAC. * */ int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY]; register mp_word _W; /* grow the destination as required */ if (c->alloc < digs) { if ((res = mp_grow (c, digs)) != MP_OKAY) { return res; } } /* number of output digits to produce */ pa = MIN(digs, a->used + b->used); /* clear the carry */ _W = 0; for (ix = 0; ix < pa; ix++) { int tx, ty; int iy; mp_digit *tmpx, *tmpy; /* get offsets into the two bignums */ ty = MIN(b->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = b->dp + ty; /* this is the number of times the loop will iterrate, essentially while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* execute loop */ for (iz = 0; iz < iy; ++iz) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* store term */ W[ix] = ((mp_digit)_W) & MP_MASK; /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = c->used; c->used = pa; { register mp_digit *tmpc; tmpc = c->dp; for (ix = 0; ix < pa+1; ix++) { /* now extract the previous digit [below the carry] */ *tmpc++ = W[ix]; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.c000066400000000000000000000047061225523575400242300ustar00rootroot00000000000000#include #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this is a modified version of fast_s_mul_digs that only produces * output digits *above* digs. See the comments for fast_s_mul_digs * to see how it works. * * This is used in the Barrett reduction since for one of the multiplications * only the higher digits were needed. This essentially halves the work. * * Based on Algorithm 14.12 on pp.595 of HAC. */ int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY]; mp_word _W; /* grow the destination as required */ pa = a->used + b->used; if (c->alloc < pa) { if ((res = mp_grow (c, pa)) != MP_OKAY) { return res; } } /* number of output digits to produce */ pa = a->used + b->used; _W = 0; for (ix = digs; ix < pa; ix++) { int tx, ty, iy; mp_digit *tmpx, *tmpy; /* get offsets into the two bignums */ ty = MIN(b->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = b->dp + ty; /* this is the number of times the loop will iterrate, essentially its while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* execute loop */ for (iz = 0; iz < iy; iz++) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* store term */ W[ix] = ((mp_digit)_W) & MP_MASK; /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = c->used; c->used = pa; { register mp_digit *tmpc; tmpc = c->dp + digs; for (ix = digs; ix < pa; ix++) { /* now extract the previous digit [below the carry] */ *tmpc++ = W[ix]; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_fast_s_mp_sqr.c000066400000000000000000000054731225523575400222350ustar00rootroot00000000000000#include #ifdef BN_FAST_S_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* the jist of squaring... * you do like mult except the offset of the tmpx [one that * starts closer to zero] can't equal the offset of tmpy. * So basically you set up iy like before then you min it with * (ty-tx) so that it never happens. You double all those * you add in the inner loop After that loop you do the squares and add them in. */ int fast_s_mp_sqr (mp_int * a, mp_int * b) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY], *tmpx; mp_word W1; /* grow the destination as required */ pa = a->used + a->used; if (b->alloc < pa) { if ((res = mp_grow (b, pa)) != MP_OKAY) { return res; } } /* number of output digits to produce */ W1 = 0; for (ix = 0; ix < pa; ix++) { int tx, ty, iy; mp_word _W; mp_digit *tmpy; /* clear counter */ _W = 0; /* get offsets into the two bignums */ ty = MIN(a->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = a->dp + ty; /* this is the number of times the loop will iterrate, essentially while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* now for squaring tx can never equal ty * we halve the distance since they approach at a rate of 2x * and we have to round because odd cases need to be executed */ iy = MIN(iy, (ty-tx+1)>>1); /* execute loop */ for (iz = 0; iz < iy; iz++) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* double the inner product and add carry */ _W = _W + _W + W1; /* even columns have the square term in them */ if ((ix&1) == 0) { _W += ((mp_word)a->dp[ix>>1])*((mp_word)a->dp[ix>>1]); } /* store it */ W[ix] = (mp_digit)(_W & MP_MASK); /* make next carry */ W1 = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = b->used; b->used = a->used+a->used; { mp_digit *tmpb; tmpb = b->dp; for (ix = 0; ix < pa; ix++) { *tmpb++ = W[ix] & MP_MASK; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpb++ = 0; } } mp_clamp (b); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_2expt.c000066400000000000000000000021741225523575400211260ustar00rootroot00000000000000#include #ifdef BN_MP_2EXPT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes a = 2**b * * Simple algorithm which zeroes the int, grows it then just sets one bit * as required. */ int mp_2expt (mp_int * a, int b) { int res; /* zero a as per default */ mp_zero (a); /* grow a to accomodate the single bit */ if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } /* set the used count of where the bit will go */ a->used = b / DIGIT_BIT + 1; /* put the single bit in its place */ a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_abs.c000066400000000000000000000016511225523575400206300ustar00rootroot00000000000000#include #ifdef BN_MP_ABS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = |a| * * Simple function copies the input and fixes the sign to positive */ int mp_abs (mp_int * a, mp_int * b) { int res; /* copy a to b */ if (a != b) { if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } } /* force the sign of b to positive */ b->sign = MP_ZPOS; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_add.c000066400000000000000000000025501225523575400206120ustar00rootroot00000000000000#include #ifdef BN_MP_ADD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level addition (handles signs) */ int mp_add (mp_int * a, mp_int * b, mp_int * c) { int sa, sb, res; /* get sign of both inputs */ sa = a->sign; sb = b->sign; /* handle two cases, not four */ if (sa == sb) { /* both positive or both negative */ /* add their magnitudes, copy the sign */ c->sign = sa; res = s_mp_add (a, b, c); } else { /* one positive, the other negative */ /* subtract the one with the greater magnitude from */ /* the one of the lesser magnitude. The result gets */ /* the sign of the one with the greater magnitude. */ if (mp_cmp_mag (a, b) == MP_LT) { c->sign = sb; res = s_mp_sub (b, a, c); } else { c->sign = sa; res = s_mp_sub (a, b, c); } } return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_add_d.c000066400000000000000000000045241225523575400211200ustar00rootroot00000000000000#include #ifdef BN_MP_ADD_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* single digit addition */ int mp_add_d (mp_int * a, mp_digit b, mp_int * c) { int res, ix, oldused; mp_digit *tmpa, *tmpc, mu; /* grow c as required */ if (c->alloc < a->used + 1) { if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { return res; } } /* if a is negative and |a| >= b, call c = |a| - b */ if (a->sign == MP_NEG && (a->used > 1 || a->dp[0] >= b)) { /* temporarily fix sign of a */ a->sign = MP_ZPOS; /* c = |a| - b */ res = mp_sub_d(a, b, c); /* fix sign */ a->sign = c->sign = MP_NEG; /* clamp */ mp_clamp(c); return res; } /* old number of used digits in c */ oldused = c->used; /* sign always positive */ c->sign = MP_ZPOS; /* source alias */ tmpa = a->dp; /* destination alias */ tmpc = c->dp; /* if a is positive */ if (a->sign == MP_ZPOS) { /* add digit, after this we're propagating * the carry. */ *tmpc = *tmpa++ + b; mu = *tmpc >> DIGIT_BIT; *tmpc++ &= MP_MASK; /* now handle rest of the digits */ for (ix = 1; ix < a->used; ix++) { *tmpc = *tmpa++ + mu; mu = *tmpc >> DIGIT_BIT; *tmpc++ &= MP_MASK; } /* set final carry */ ix++; *tmpc++ = mu; /* setup size */ c->used = a->used + 1; } else { /* a was negative and |a| < b */ c->used = 1; /* the result is a single digit */ if (a->used == 1) { *tmpc++ = b - a->dp[0]; } else { *tmpc++ = b; } /* setup count so the clearing of oldused * can fall through correctly */ ix = 1; } /* now zero to oldused */ while (ix++ < oldused) { *tmpc++ = 0; } mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_addmod.c000066400000000000000000000016421225523575400213130ustar00rootroot00000000000000#include #ifdef BN_MP_ADDMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a + b (mod c) */ int mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_add (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_and.c000066400000000000000000000023061225523575400206230ustar00rootroot00000000000000#include #ifdef BN_MP_AND_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* AND two ints together */ int mp_and (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] &= x->dp[ix]; } /* zero digits above the last from the smallest mp_int */ for (; ix < t.used; ix++) { t.dp[ix] = 0; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_clamp.c000066400000000000000000000021071225523575400211540ustar00rootroot00000000000000#include #ifdef BN_MP_CLAMP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* trim unused digits * * This is used to ensure that leading zero digits are * trimed and the leading "used" digit will be non-zero * Typically very fast. Also fixes the sign if there * are no more leading digits */ void mp_clamp (mp_int * a) { /* decrease used while the most significant digit is * zero. */ while (a->used > 0 && a->dp[a->used - 1] == 0) { --(a->used); } /* reset the sign flag if used == 0 */ if (a->used == 0) { a->sign = MP_ZPOS; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_clear.c000066400000000000000000000017651225523575400211570ustar00rootroot00000000000000#include #ifdef BN_MP_CLEAR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* clear one (frees) */ void mp_clear (mp_int * a) { int i; /* only do anything if a hasn't been freed previously */ if (a->dp != NULL) { /* first zero the digits */ for (i = 0; i < a->used; i++) { a->dp[i] = 0; } /* free ram */ XFREE(a->dp); /* reset members to make debugging easier */ a->dp = NULL; a->alloc = a->used = 0; a->sign = MP_ZPOS; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_clear_multi.c000066400000000000000000000015361225523575400223650ustar00rootroot00000000000000#include #ifdef BN_MP_CLEAR_MULTI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #include void mp_clear_multi(mp_int *mp, ...) { mp_int* next_mp = mp; va_list args; va_start(args, mp); while (next_mp != NULL) { mp_clear(next_mp); next_mp = va_arg(args, mp_int*); } va_end(args); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_cmp.c000066400000000000000000000017601225523575400206430ustar00rootroot00000000000000#include #ifdef BN_MP_CMP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare two ints (signed)*/ int mp_cmp (mp_int * a, mp_int * b) { /* compare based on sign */ if (a->sign != b->sign) { if (a->sign == MP_NEG) { return MP_LT; } else { return MP_GT; } } /* compare digits */ if (a->sign == MP_NEG) { /* if negative compare opposite direction */ return mp_cmp_mag(b, a); } else { return mp_cmp_mag(a, b); } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_cmp_d.c000066400000000000000000000017331225523575400211460ustar00rootroot00000000000000#include #ifdef BN_MP_CMP_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare a digit */ int mp_cmp_d(mp_int * a, mp_digit b) { /* compare based on sign */ if (a->sign == MP_NEG) { return MP_LT; } /* compare based on magnitude */ if (a->used > 1) { return MP_GT; } /* compare the only digit of a to b */ if (a->dp[0] > b) { return MP_GT; } else if (a->dp[0] < b) { return MP_LT; } else { return MP_EQ; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_cmp_mag.c000066400000000000000000000022551225523575400214670ustar00rootroot00000000000000#include #ifdef BN_MP_CMP_MAG_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare maginitude of two ints (unsigned) */ int mp_cmp_mag (mp_int * a, mp_int * b) { int n; mp_digit *tmpa, *tmpb; /* compare based on # of non-zero digits */ if (a->used > b->used) { return MP_GT; } if (a->used < b->used) { return MP_LT; } /* alias for a */ tmpa = a->dp + (a->used - 1); /* alias for b */ tmpb = b->dp + (a->used - 1); /* compare based on digits */ for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { if (*tmpa > *tmpb) { return MP_GT; } if (*tmpa < *tmpb) { return MP_LT; } } return MP_EQ; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_cnt_lsb.c000066400000000000000000000022741225523575400215110ustar00rootroot00000000000000#include #ifdef BN_MP_CNT_LSB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const int lnz[16] = { 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a) { int x; mp_digit q, qq; /* easy out */ if (mp_iszero(a) == 1) { return 0; } /* scan lower digits until non-zero */ for (x = 0; x < a->used && a->dp[x] == 0; x++); q = a->dp[x]; x *= DIGIT_BIT; /* now scan this digit until a 1 is found */ if ((q & 1) == 0) { do { qq = q & 15; x += lnz[qq]; q >>= 4; } while (qq == 0); } return x; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_copy.c000066400000000000000000000025121225523575400210320ustar00rootroot00000000000000#include #ifdef BN_MP_COPY_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* copy, b = a */ int mp_copy (mp_int * a, mp_int * b) { int res, n; /* if dst == src do nothing */ if (a == b) { return MP_OKAY; } /* grow dest */ if (b->alloc < a->used) { if ((res = mp_grow (b, a->used)) != MP_OKAY) { return res; } } /* zero b and copy the parameters over */ { register mp_digit *tmpa, *tmpb; /* pointer aliases */ /* source */ tmpa = a->dp; /* destination */ tmpb = b->dp; /* copy all the digits */ for (n = 0; n < a->used; n++) { *tmpb++ = *tmpa++; } /* clear high digits */ for (; n < b->used; n++) { *tmpb++ = 0; } } /* copy used count and sign */ b->used = a->used; b->sign = a->sign; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_count_bits.c000066400000000000000000000017641225523575400222410ustar00rootroot00000000000000#include #ifdef BN_MP_COUNT_BITS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* returns the number of bits in an int */ int mp_count_bits (mp_int * a) { int r; mp_digit q; /* shortcut */ if (a->used == 0) { return 0; } /* get number of digits and add that */ r = (a->used - 1) * DIGIT_BIT; /* take the last digit and count the bits in it */ q = a->dp[a->used - 1]; while (q > ((mp_digit) 0)) { ++r; q >>= ((mp_digit) 1); } return r; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_div.c000066400000000000000000000155051225523575400206500ustar00rootroot00000000000000#include #ifdef BN_MP_DIV_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #ifdef BN_MP_DIV_SMALL /* slower bit-bang division... also smaller */ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) { mp_int ta, tb, tq, q; int res, n, n2; /* is divisor zero ? */ if (mp_iszero (b) == 1) { return MP_VAL; } /* if a < b then q=0, r = a */ if (mp_cmp_mag (a, b) == MP_LT) { if (d != NULL) { res = mp_copy (a, d); } else { res = MP_OKAY; } if (c != NULL) { mp_zero (c); } return res; } /* init our temps */ if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) { return res; } mp_set(&tq, 1); n = mp_count_bits(a) - mp_count_bits(b); if (((res = mp_abs(a, &ta)) != MP_OKAY) || ((res = mp_abs(b, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { goto LBL_ERR; } while (n-- >= 0) { if (mp_cmp(&tb, &ta) != MP_GT) { if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { goto LBL_ERR; } } if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { goto LBL_ERR; } } /* now q == quotient and ta == remainder */ n = a->sign; n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); if (c != NULL) { mp_exch(c, &q); c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; } if (d != NULL) { mp_exch(d, &ta); d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; } LBL_ERR: mp_clear_multi(&ta, &tb, &tq, &q, NULL); return res; } #else /* integer signed division. * c*b + d == a [e.g. a/b, c=quotient, d=remainder] * HAC pp.598 Algorithm 14.20 * * Note that the description in HAC is horribly * incomplete. For example, it doesn't consider * the case where digits are removed from 'x' in * the inner loop. It also doesn't consider the * case that y has fewer than three digits, etc.. * * The overall algorithm is as described as * 14.20 from HAC but fixed to treat these cases. */ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { mp_int q, x, y, t1, t2; int res, n, t, i, norm, neg; /* is divisor zero ? */ if (mp_iszero (b) == 1) { return MP_VAL; } /* if a < b then q=0, r = a */ if (mp_cmp_mag (a, b) == MP_LT) { if (d != NULL) { res = mp_copy (a, d); } else { res = MP_OKAY; } if (c != NULL) { mp_zero (c); } return res; } if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { return res; } q.used = a->used + 2; if ((res = mp_init (&t1)) != MP_OKAY) { goto LBL_Q; } if ((res = mp_init (&t2)) != MP_OKAY) { goto LBL_T1; } if ((res = mp_init_copy (&x, a)) != MP_OKAY) { goto LBL_T2; } if ((res = mp_init_copy (&y, b)) != MP_OKAY) { goto LBL_X; } /* fix the sign */ neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; x.sign = y.sign = MP_ZPOS; /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ norm = mp_count_bits(&y) % DIGIT_BIT; if (norm < (int)(DIGIT_BIT-1)) { norm = (DIGIT_BIT-1) - norm; if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { goto LBL_Y; } } else { norm = 0; } /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ n = x.used - 1; t = y.used - 1; /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ goto LBL_Y; } while (mp_cmp (&x, &y) != MP_LT) { ++(q.dp[n - t]); if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { goto LBL_Y; } } /* reset y by shifting it back down */ mp_rshd (&y, n - t); /* step 3. for i from n down to (t + 1) */ for (i = n; i >= (t + 1); i--) { if (i > x.used) { continue; } /* step 3.1 if xi == yt then set q{i-t-1} to b-1, * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ if (x.dp[i] == y.dp[t]) { q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); } else { mp_word tmp; tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); tmp |= ((mp_word) x.dp[i - 1]); tmp /= ((mp_word) y.dp[t]); if (tmp > (mp_word) MP_MASK) tmp = MP_MASK; q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); } /* while (q{i-t-1} * (yt * b + y{t-1})) > xi * b**2 + xi-1 * b + xi-2 do q{i-t-1} -= 1; */ q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; do { q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; /* find left hand */ mp_zero (&t1); t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; t1.dp[1] = y.dp[t]; t1.used = 2; if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { goto LBL_Y; } /* find right hand */ t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; t2.dp[2] = x.dp[i]; t2.used = 3; } while (mp_cmp_mag(&t1, &t2) == MP_GT); /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { goto LBL_Y; } /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ if (x.sign == MP_NEG) { if ((res = mp_copy (&y, &t1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { goto LBL_Y; } q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; } } /* now q is the quotient and x is the remainder * [which we have to normalize] */ /* get sign before writing to c */ x.sign = x.used == 0 ? MP_ZPOS : a->sign; if (c != NULL) { mp_clamp (&q); mp_exch (&q, c); c->sign = neg; } if (d != NULL) { mp_div_2d (&x, norm, &x, NULL); mp_exch (&x, d); } res = MP_OKAY; LBL_Y:mp_clear (&y); LBL_X:mp_clear (&x); LBL_T2:mp_clear (&t2); LBL_T1:mp_clear (&t1); LBL_Q:mp_clear (&q); return res; } #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_div_2.c000066400000000000000000000027521225523575400210710ustar00rootroot00000000000000#include #ifdef BN_MP_DIV_2_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = a/2 */ int mp_div_2(mp_int * a, mp_int * b) { int x, res, oldused; /* copy */ if (b->alloc < a->used) { if ((res = mp_grow (b, a->used)) != MP_OKAY) { return res; } } oldused = b->used; b->used = a->used; { register mp_digit r, rr, *tmpa, *tmpb; /* source alias */ tmpa = a->dp + b->used - 1; /* dest alias */ tmpb = b->dp + b->used - 1; /* carry */ r = 0; for (x = b->used - 1; x >= 0; x--) { /* get the carry for the next iteration */ rr = *tmpa & 1; /* shift the current digit, add in carry and store */ *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); /* forward carry to next iteration */ r = rr; } /* zero excess digits */ tmpb = b->dp + b->used; for (x = b->used; x < oldused; x++) { *tmpb++ = 0; } } b->sign = a->sign; mp_clamp (b); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_div_2d.c000066400000000000000000000041661225523575400212360ustar00rootroot00000000000000#include #ifdef BN_MP_DIV_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift right by a certain bit count (store quotient in c, optional remainder in d) */ int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) { mp_digit D, r, rr; int x, res; mp_int t; /* if the shift count is <= 0 then we do no work */ if (b <= 0) { res = mp_copy (a, c); if (d != NULL) { mp_zero (d); } return res; } if ((res = mp_init (&t)) != MP_OKAY) { return res; } /* get the remainder */ if (d != NULL) { if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } } /* copy */ if ((res = mp_copy (a, c)) != MP_OKAY) { mp_clear (&t); return res; } /* shift by as many digits in the bit count */ if (b >= (int)DIGIT_BIT) { mp_rshd (c, b / DIGIT_BIT); } /* shift any bit count < DIGIT_BIT */ D = (mp_digit) (b % DIGIT_BIT); if (D != 0) { register mp_digit *tmpc, mask, shift; /* mask */ mask = (((mp_digit)1) << D) - 1; /* shift for lsb */ shift = DIGIT_BIT - D; /* alias */ tmpc = c->dp + (c->used - 1); /* carry */ r = 0; for (x = c->used - 1; x >= 0; x--) { /* get the lower bits of this word in a temp */ rr = *tmpc & mask; /* shift the current word and mix in the carry bits from the previous word */ *tmpc = (*tmpc >> D) | (r << shift); --tmpc; /* set the carry to the carry bits of the current word found above */ r = rr; } } mp_clamp (c); if (d != NULL) { mp_exch (&t, d); } mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_div_3.c000066400000000000000000000033711225523575400210700ustar00rootroot00000000000000#include #ifdef BN_MP_DIV_3_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* divide by three (based on routine from MPI and the GMP manual) */ int mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) { mp_int q; mp_word w, t; mp_digit b; int res, ix; /* b = 2**DIGIT_BIT / 3 */ b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { return res; } q.used = a->used; q.sign = a->sign; w = 0; for (ix = a->used - 1; ix >= 0; ix--) { w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); if (w >= 3) { /* multiply w by [1/3] */ t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); /* now subtract 3 * [w/3] from w, to get the remainder */ w -= t+t+t; /* fixup the remainder as required since * the optimization is not exact. */ while (w >= 3) { t += 1; w -= 3; } } else { t = 0; } q.dp[ix] = (mp_digit)t; } /* [optional] store the remainder */ if (d != NULL) { *d = (mp_digit)w; } /* [optional] store the quotient */ if (c != NULL) { mp_clamp(&q); mp_exch(&q, c); } mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_div_d.c000066400000000000000000000043461225523575400211540ustar00rootroot00000000000000#include #ifdef BN_MP_DIV_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static int s_is_power_of_two(mp_digit b, int *p) { int x; /* fast return if no power of two */ if ((b==0) || (b & (b-1))) { return 0; } for (x = 0; x < DIGIT_BIT; x++) { if (b == (((mp_digit)1)<dp[0] & ((((mp_digit)1)<used)) != MP_OKAY) { return res; } q.used = a->used; q.sign = a->sign; w = 0; for (ix = a->used - 1; ix >= 0; ix--) { w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); if (w >= b) { t = (mp_digit)(w / b); w -= ((mp_word)t) * ((mp_word)b); } else { t = 0; } q.dp[ix] = (mp_digit)t; } if (d != NULL) { *d = (mp_digit)w; } if (c != NULL) { mp_clamp(&q); mp_exch(&q, c); } mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_dr_is_modulus.c000066400000000000000000000020021225523575400227220ustar00rootroot00000000000000#include #ifdef BN_MP_DR_IS_MODULUS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if a number is a valid DR modulus */ int mp_dr_is_modulus(mp_int *a) { int ix; /* must be at least two digits */ if (a->used < 2) { return 0; } /* must be of the form b**k - a [a <= b] so all * but the first digit must be equal to -1 (mod b). */ for (ix = 1; ix < a->used; ix++) { if (a->dp[ix] != MP_MASK) { return 0; } } return 1; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_dr_reduce.c000066400000000000000000000044471225523575400220250ustar00rootroot00000000000000#include #ifdef BN_MP_DR_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduce "x" in place modulo "n" using the Diminished Radix algorithm. * * Based on algorithm from the paper * * "Generating Efficient Primes for Discrete Log Cryptosystems" * Chae Hoon Lim, Pil Joong Lee, * POSTECH Information Research Laboratories * * The modulus must be of a special format [see manual] * * Has been modified to use algorithm 7.10 from the LTM book instead * * Input x must be in the range 0 <= x <= (n-1)**2 */ int mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k) { int err, i, m; mp_word r; mp_digit mu, *tmpx1, *tmpx2; /* m = digits in modulus */ m = n->used; /* ensure that "x" has at least 2m digits */ if (x->alloc < m + m) { if ((err = mp_grow (x, m + m)) != MP_OKAY) { return err; } } /* top of loop, this is where the code resumes if * another reduction pass is required. */ top: /* aliases for digits */ /* alias for lower half of x */ tmpx1 = x->dp; /* alias for upper half of x, or x/B**m */ tmpx2 = x->dp + m; /* set carry to zero */ mu = 0; /* compute (x mod B**m) + k * [x/B**m] inline and inplace */ for (i = 0; i < m; i++) { r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; *tmpx1++ = (mp_digit)(r & MP_MASK); mu = (mp_digit)(r >> ((mp_word)DIGIT_BIT)); } /* set final carry */ *tmpx1++ = mu; /* zero words above m */ for (i = m + 1; i < x->used; i++) { *tmpx1++ = 0; } /* clamp, sub and return */ mp_clamp (x); /* if x >= n then subtract and reduce again * Each successive "recursion" makes the input smaller and smaller. */ if (mp_cmp_mag (x, n) != MP_LT) { s_mp_sub(x, n, x); goto top; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_dr_setup.c000066400000000000000000000016071225523575400217110ustar00rootroot00000000000000#include #ifdef BN_MP_DR_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ void mp_dr_setup(mp_int *a, mp_digit *d) { /* the casts are required if DIGIT_BIT is one less than * the number of bits in a mp_digit [e.g. DIGIT_BIT==31] */ *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - ((mp_word)a->dp[0])); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_exch.c000066400000000000000000000014421225523575400210100ustar00rootroot00000000000000#include #ifdef BN_MP_EXCH_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* swap the elements of two integers, for cases where you can't simply swap the * mp_int pointers around */ void mp_exch (mp_int * a, mp_int * b) { mp_int t; t = *a; *a = *b; *b = t; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_expt_d.c000066400000000000000000000023331225523575400213440ustar00rootroot00000000000000#include #ifdef BN_MP_EXPT_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* calculate c = a**b using a square-multiply algorithm */ int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) { int res; mp_int g; if ((res = mp_init_copy (&g, a)) != MP_OKAY) { return res; } /* set initial result */ mp_set (c, 1); while (b > 0) { /* if the bit is set multiply */ if (b & 1) { if ((res = mp_mul (c, &g, c)) != MP_OKAY) { mp_clear (&g); return res; } } /* square */ if (b > 1 && (res = mp_sqr (&g, &g)) != MP_OKAY) { mp_clear (&g); return res; } /* shift to next bit */ b >>= 1; } mp_clear (&g); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_exptmod.c000066400000000000000000000054071225523575400215460ustar00rootroot00000000000000#include #ifdef BN_MP_EXPTMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this is a shell function that calls either the normal or Montgomery * exptmod functions. Originally the call to the montgomery code was * embedded in the normal function but that wasted alot of stack space * for nothing (since 99% of the time the Montgomery code would be called) */ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) { int dr; /* modulus P must be positive */ if (P->sign == MP_NEG) { return MP_VAL; } /* if exponent X is negative we have to recurse */ if (X->sign == MP_NEG) { #ifdef BN_MP_INVMOD_C mp_int tmpG, tmpX; int err; /* first compute 1/G mod P */ if ((err = mp_init(&tmpG)) != MP_OKAY) { return err; } if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { mp_clear(&tmpG); return err; } /* now get |X| */ if ((err = mp_init(&tmpX)) != MP_OKAY) { mp_clear(&tmpG); return err; } if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { mp_clear_multi(&tmpG, &tmpX, NULL); return err; } /* and now compute (1/G)**|X| instead of G**X [X < 0] */ err = mp_exptmod(&tmpG, &tmpX, P, Y); mp_clear_multi(&tmpG, &tmpX, NULL); return err; #else /* no invmod */ return MP_VAL; #endif } /* modified diminished radix reduction */ #if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C) if (mp_reduce_is_2k_l(P) == MP_YES) { return s_mp_exptmod(G, X, P, Y, 1); } #endif #ifdef BN_MP_DR_IS_MODULUS_C /* is it a DR modulus? */ dr = mp_dr_is_modulus(P); #else /* default to no */ dr = 0; #endif #ifdef BN_MP_REDUCE_IS_2K_C /* if not, is it a unrestricted DR modulus? */ if (dr == 0) { dr = mp_reduce_is_2k(P) << 1; } #endif /* if the modulus is odd or dr != 0 use the montgomery method */ #ifdef BN_MP_EXPTMOD_FAST_C if (mp_isodd (P) == 1 || dr != 0) { return mp_exptmod_fast (G, X, P, Y, dr); } else { #endif #ifdef BN_S_MP_EXPTMOD_C /* otherwise use the generic Barrett reduction technique */ return s_mp_exptmod (G, X, P, Y, 0); #else /* no exptmod for evens */ return MP_VAL; #endif #ifdef BN_MP_EXPTMOD_FAST_C } #endif } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_exptmod_fast.c000066400000000000000000000175331225523575400225660ustar00rootroot00000000000000#include #ifdef BN_MP_EXPTMOD_FAST_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 * * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. * The value of k changes based on the size of the exponent. * * Uses Montgomery or Diminished Radix reduction [whichever appropriate] */ #ifdef MP_LOW_MEM #define TAB_SIZE 32 #else #define TAB_SIZE 256 #endif int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { mp_int M[TAB_SIZE], res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; /* use a pointer to the reduction algorithm. This allows us to use * one of many reduction algorithms without modding the guts of * the code with if statements everywhere. */ int (*redux)(mp_int*,mp_int*,mp_digit); /* find window size */ x = mp_count_bits (X); if (x <= 7) { winsize = 2; } else if (x <= 36) { winsize = 3; } else if (x <= 140) { winsize = 4; } else if (x <= 450) { winsize = 5; } else if (x <= 1303) { winsize = 6; } else if (x <= 3529) { winsize = 7; } else { winsize = 8; } #ifdef MP_LOW_MEM if (winsize > 5) { winsize = 5; } #endif /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { return err; } /* now init the second half of the array */ for (x = 1<<(winsize-1); x < (1 << winsize); x++) { if ((err = mp_init(&M[x])) != MP_OKAY) { for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } mp_clear(&M[1]); return err; } } /* determine and setup reduction code */ if (redmode == 0) { #ifdef BN_MP_MONTGOMERY_SETUP_C /* now setup montgomery */ if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { goto LBL_M; } #else err = MP_VAL; goto LBL_M; #endif /* automatically pick the comba one if available (saves quite a few calls/ifs) */ #ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C if (((P->used * 2 + 1) < MP_WARRAY) && P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { redux = fast_mp_montgomery_reduce; } else #endif { #ifdef BN_MP_MONTGOMERY_REDUCE_C /* use slower baseline Montgomery method */ redux = mp_montgomery_reduce; #else err = MP_VAL; goto LBL_M; #endif } } else if (redmode == 1) { #if defined(BN_MP_DR_SETUP_C) && defined(BN_MP_DR_REDUCE_C) /* setup DR reduction for moduli of the form B**k - b */ mp_dr_setup(P, &mp); redux = mp_dr_reduce; #else err = MP_VAL; goto LBL_M; #endif } else { #if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) /* setup DR reduction for moduli of the form 2**k - b */ if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { goto LBL_M; } redux = mp_reduce_2k; #else err = MP_VAL; goto LBL_M; #endif } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { goto LBL_M; } /* create M table * * * The first half of the table is not computed though accept for M[0] and M[1] */ if (redmode == 0) { #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* now we need R mod m */ if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { goto LBL_RES; } #else err = MP_VAL; goto LBL_RES; #endif /* now set M[1] to G * R mod m */ if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { goto LBL_RES; } } else { mp_set(&res, 1); if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { goto LBL_RES; } } /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_RES; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { goto LBL_RES; } } /* create upper table */ for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&M[x], P, mp)) != MP_OKAY) { goto LBL_RES; } } /* set initial mode and bit cnt */ mode = 0; bitcnt = 1; buf = 0; digidx = X->used - 1; bitcpy = 0; bitbuf = 0; for (;;) { /* grab next digit as required */ if (--bitcnt == 0) { /* if digidx == -1 we are out of digits so break */ if (digidx == -1) { break; } /* read next digit and reset bitcnt */ buf = X->dp[digidx--]; bitcnt = (int)DIGIT_BIT; } /* grab the next msb from the exponent */ y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; buf <<= (mp_digit)1; /* if the bit is zero and mode == 0 then we ignore it * These represent the leading zero bits before the first 1 bit * in the exponent. Technically this opt is not required but it * does lower the # of trivial squaring/reductions used */ if (mode == 0 && y == 0) { continue; } /* if the bit is zero and mode == 1 then we square */ if (mode == 1 && y == 0) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } continue; } /* else we add it to the window */ bitbuf |= (y << (winsize - ++bitcpy)); mode = 2; if (bitcpy == winsize) { /* ok window is filled so square as required and multiply */ /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } /* empty window and reset */ bitcpy = 0; bitbuf = 0; mode = 1; } } /* if bits remain then square/multiply */ if (mode == 2 && bitcpy > 0) { /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } /* get next bit of the window */ bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } } } if (redmode == 0) { /* fixup result if Montgomery reduction is used * recall that any value in a Montgomery system is * actually multiplied by R mod n. So we have * to reduce one more time to cancel out the factor * of R. */ if ((err = redux(&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } /* swap res with Y */ mp_exch (&res, Y); err = MP_OKAY; LBL_RES:mp_clear (&res); LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_exteuclid.c000066400000000000000000000061131225523575400220470ustar00rootroot00000000000000#include #ifdef BN_MP_EXTEUCLID_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Extended euclidean algorithm of (a, b) produces a*u1 + b*u2 = u3 */ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) { mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; int err; if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { return err; } /* initialize, (u1,u2,u3) = (1,0,a) */ mp_set(&u1, 1); if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } /* initialize, (v1,v2,v3) = (0,1,b) */ mp_set(&v2, 1); if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } /* loop while v3 != 0 */ while (mp_iszero(&v3) == MP_NO) { /* q = u3/v3 */ if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } /* (u1,u2,u3) = (v1,v2,v3) */ if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } /* (v1,v2,v3) = (t1,t2,t3) */ if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } } /* make sure U3 >= 0 */ if (u3.sign == MP_NEG) { mp_neg(&u1, &u1); mp_neg(&u2, &u2); mp_neg(&u3, &u3); } /* copy result out */ if (U1 != NULL) { mp_exch(U1, &u1); } if (U2 != NULL) { mp_exch(U2, &u2); } if (U3 != NULL) { mp_exch(U3, &u3); } err = MP_OKAY; _ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_fread.c000066400000000000000000000027051225523575400211450ustar00rootroot00000000000000#include #ifdef BN_MP_FREAD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read a bigint from a file stream in ASCII */ int mp_fread(mp_int *a, int radix, FILE *stream) { int err, ch, neg, y; /* clear a */ mp_zero(a); /* if first digit is - then set negative */ ch = fgetc(stream); if (ch == '-') { neg = MP_NEG; ch = fgetc(stream); } else { neg = MP_ZPOS; } for (;;) { /* find y in the radix map */ for (y = 0; y < radix; y++) { if (mp_s_rmap[y] == ch) { break; } } if (y == radix) { break; } /* shift up and add */ if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { return err; } if ((err = mp_add_d(a, y, a)) != MP_OKAY) { return err; } ch = fgetc(stream); } if (mp_cmp_d(a, 0) != MP_EQ) { a->sign = neg; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_fwrite.c000066400000000000000000000021741225523575400213640ustar00rootroot00000000000000#include #ifdef BN_MP_FWRITE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ int mp_fwrite(mp_int *a, int radix, FILE *stream) { char *buf; int err, len, x; if ((err = mp_radix_size(a, radix, &len)) != MP_OKAY) { return err; } buf = OPT_CAST(char) XMALLOC (len); if (buf == NULL) { return MP_MEM; } if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { XFREE (buf); return err; } for (x = 0; x < len; x++) { if (fputc(buf[x], stream) == EOF) { XFREE (buf); return MP_VAL; } } XFREE (buf); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_gcd.c000066400000000000000000000047651225523575400206310ustar00rootroot00000000000000#include #ifdef BN_MP_GCD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Greatest Common Divisor using the binary method */ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) { mp_int u, v; int k, u_lsb, v_lsb, res; /* either zero than gcd is the largest */ if (mp_iszero (a) == MP_YES) { return mp_abs (b, c); } if (mp_iszero (b) == MP_YES) { return mp_abs (a, c); } /* get copies of a and b we can modify */ if ((res = mp_init_copy (&u, a)) != MP_OKAY) { return res; } if ((res = mp_init_copy (&v, b)) != MP_OKAY) { goto LBL_U; } /* must be positive for the remainder of the algorithm */ u.sign = v.sign = MP_ZPOS; /* B1. Find the common power of two for u and v */ u_lsb = mp_cnt_lsb(&u); v_lsb = mp_cnt_lsb(&v); k = MIN(u_lsb, v_lsb); if (k > 0) { /* divide the power of two out */ if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { goto LBL_V; } if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { goto LBL_V; } } /* divide any remaining factors of two out */ if (u_lsb != k) { if ((res = mp_div_2d(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { goto LBL_V; } } if (v_lsb != k) { if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { goto LBL_V; } } while (mp_iszero(&v) == 0) { /* make sure v is the largest */ if (mp_cmp_mag(&u, &v) == MP_GT) { /* swap u and v to make sure v is >= u */ mp_exch(&u, &v); } /* subtract smallest from largest */ if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { goto LBL_V; } /* Divide out all factors of two */ if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { goto LBL_V; } } /* multiply by 2**k which we divided out at the beginning */ if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { goto LBL_V; } c->sign = MP_ZPOS; res = MP_OKAY; LBL_V:mp_clear (&u); LBL_U:mp_clear (&v); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_get_int.c000066400000000000000000000022011225523575400215040ustar00rootroot00000000000000#include #ifdef BN_MP_GET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the lower 32-bits of an mp_int */ unsigned long mp_get_int(mp_int * a) { int i; unsigned long res; if (a->used == 0) { return 0; } /* get number of digits of the lsb we have to read */ i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; /* get most significant digit of result */ res = DIGIT(a,i); while (--i >= 0) { res = (res << DIGIT_BIT) | DIGIT(a,i); } /* force result to 32-bits always so it is consistent on non 32-bit platforms */ return res & 0xFFFFFFFFUL; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_get_long.c000066400000000000000000000020121225523575400216510ustar00rootroot00000000000000#include #ifdef BN_MP_GET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the lower unsigned long of an mp_int, platform dependent */ unsigned long mp_get_long(mp_int * a) { int i; unsigned long res; if (a->used == 0) { return 0; } /* get number of digits of the lsb we have to read */ i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; /* get most significant digit of result */ res = DIGIT(a,i); while (--i >= 0) { res = (res << DIGIT_BIT) | DIGIT(a,i); } return res; } #endif nqp-2013.12.1/3rdparty/libtommath/bn_mp_grow.c000066400000000000000000000027261225523575400210450ustar00rootroot00000000000000#include #ifdef BN_MP_GROW_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* grow as required */ int mp_grow (mp_int * a, int size) { int i; mp_digit *tmp; /* if the alloc size is smaller alloc more ram */ if (a->alloc < size) { /* ensure there are always at least MP_PREC digits extra on top */ size += (MP_PREC * 2) - (size % MP_PREC); /* reallocate the array a->dp * * We store the return in a temporary variable * in case the operation failed we don't want * to overwrite the dp member of a. */ tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); if (tmp == NULL) { /* reallocation failed but "a" is still valid [can be freed] */ return MP_MEM; } /* reallocation succeeded so set a->dp */ a->dp = tmp; /* zero excess digits */ i = a->alloc; a->alloc = size; for (; i < a->alloc; i++) { a->dp[i] = 0; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init.c000066400000000000000000000021061225523575400210220ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* init a new mp_int */ int mp_init (mp_int * a) { int i; /* allocate memory required and clear it */ a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); if (a->dp == NULL) { return MP_MEM; } /* set the digits to zero */ for (i = 0; i < MP_PREC; i++) { a->dp[i] = 0; } /* set the used to zero, allocated digits to the default precision * and sign to positive */ a->used = 0; a->alloc = MP_PREC; a->sign = MP_ZPOS; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init_copy.c000066400000000000000000000014331225523575400220560ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_COPY_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* creates "a" then copies b into it */ int mp_init_copy (mp_int * a, mp_int * b) { int res; if ((res = mp_init (a)) != MP_OKAY) { return res; } return mp_copy (b, a); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init_multi.c000066400000000000000000000033121225523575400222340ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_MULTI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #include int mp_init_multi(mp_int *mp, ...) { mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ int n = 0; /* Number of ok inits */ mp_int* cur_arg = mp; va_list args; va_start(args, mp); /* init args to next argument from caller */ while (cur_arg != NULL) { if (mp_init(cur_arg) != MP_OKAY) { /* Oops - error! Back-track and mp_clear what we already succeeded in init-ing, then return error. */ va_list clean_args; /* end the current list */ va_end(args); /* now start cleaning up */ cur_arg = mp; va_start(clean_args, mp); while (n--) { mp_clear(cur_arg); cur_arg = va_arg(clean_args, mp_int*); } va_end(clean_args); res = MP_MEM; break; } n++; cur_arg = va_arg(args, mp_int*); } va_end(args); return res; /* Assumed ok, if error flagged above. */ } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init_set.c000066400000000000000000000014221225523575400216750ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_SET_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* initialize and set a digit */ int mp_init_set (mp_int * a, mp_digit b) { int err; if ((err = mp_init(a)) != MP_OKAY) { return err; } mp_set(a, b); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init_set_int.c000066400000000000000000000014341225523575400225520ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* initialize and set a digit */ int mp_init_set_int (mp_int * a, unsigned long b) { int err; if ((err = mp_init(a)) != MP_OKAY) { return err; } return mp_set_int(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_init_size.c000066400000000000000000000021251225523575400220550ustar00rootroot00000000000000#include #ifdef BN_MP_INIT_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* init an mp_init for a given size */ int mp_init_size (mp_int * a, int size) { int x; /* pad size so there are always extra digits */ size += (MP_PREC * 2) - (size % MP_PREC); /* alloc mem */ a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size); if (a->dp == NULL) { return MP_MEM; } /* set the members */ a->used = 0; a->alloc = size; a->sign = MP_ZPOS; /* zero the digits */ for (x = 0; x < size; x++) { a->dp[x] = 0; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_invmod.c000066400000000000000000000020171225523575400213540ustar00rootroot00000000000000#include #ifdef BN_MP_INVMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* hac 14.61, pp608 */ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) { /* b cannot be negative */ if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } #ifdef BN_FAST_MP_INVMOD_C /* if the modulus is odd we can use a faster routine instead */ if (mp_isodd (b) == 1) { return fast_mp_invmod (a, b, c); } #endif #ifdef BN_MP_INVMOD_SLOW_C return mp_invmod_slow(a, b, c); #endif return MP_VAL; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_invmod_slow.c000066400000000000000000000077601225523575400224320ustar00rootroot00000000000000#include #ifdef BN_MP_INVMOD_SLOW_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* hac 14.61, pp608 */ int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) { mp_int x, y, u, v, A, B, C, D; int res; /* b cannot be negative */ if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } /* init temps */ if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { return res; } /* x = a, y = b */ if ((res = mp_mod(a, b, &x)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (b, &y)) != MP_OKAY) { goto LBL_ERR; } /* 2. [modified] if x,y are both even then return an error! */ if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { res = MP_VAL; goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { goto LBL_ERR; } mp_set (&A, 1); mp_set (&D, 1); top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { goto LBL_ERR; } /* 4.2 if A or B is odd then */ if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { /* A = (A+y)/2, B = (B-x)/2 */ if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { goto LBL_ERR; } } /* A = A/2, B = B/2 */ if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { goto LBL_ERR; } } /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto LBL_ERR; } /* 5.2 if C or D is odd then */ if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { /* C = (C+y)/2, D = (D-x)/2 */ if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { goto LBL_ERR; } } /* C = C/2, D = D/2 */ if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { goto LBL_ERR; } } /* 6. if u >= v then */ if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, A = A - C, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { goto LBL_ERR; } } else { /* v - v - u, C = C - A, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { goto LBL_ERR; } } /* if not zero goto step 4 */ if (mp_iszero (&u) == 0) goto top; /* now a = C, b = D, gcd == g*v */ /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; goto LBL_ERR; } /* if its too low */ while (mp_cmp_d(&C, 0) == MP_LT) { if ((res = mp_add(&C, b, &C)) != MP_OKAY) { goto LBL_ERR; } } /* too big */ while (mp_cmp_mag(&C, b) != MP_LT) { if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { goto LBL_ERR; } } /* C is now the inverse */ mp_exch (&C, c); res = MP_OKAY; LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_is_square.c000066400000000000000000000061161225523575400220570ustar00rootroot00000000000000#include #ifdef BN_MP_IS_SQUARE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Check if remainders are possible squares - fast exclude non-squares */ static const char rem_128[128] = { 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }; static const char rem_105[105] = { 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 }; /* Store non-zero to ret if arg is square, and zero if not */ int mp_is_square(mp_int *arg,int *ret) { int res; mp_digit c; mp_int t; unsigned long r; /* Default to Non-square :) */ *ret = MP_NO; if (arg->sign == MP_NEG) { return MP_VAL; } /* digits used? (TSD) */ if (arg->used == 0) { return MP_OKAY; } /* First check mod 128 (suppose that DIGIT_BIT is at least 7) */ if (rem_128[127 & DIGIT(arg,0)] == 1) { return MP_OKAY; } /* Next check mod 105 (3*5*7) */ if ((res = mp_mod_d(arg,105,&c)) != MP_OKAY) { return res; } if (rem_105[c] == 1) { return MP_OKAY; } if ((res = mp_init_set_int(&t,11L*13L*17L*19L*23L*29L*31L)) != MP_OKAY) { return res; } if ((res = mp_mod(arg,&t,&t)) != MP_OKAY) { goto ERR; } r = mp_get_int(&t); /* Check for other prime modules, note it's not an ERROR but we must * free "t" so the easiest way is to goto ERR. We know that res * is already equal to MP_OKAY from the mp_mod call */ if ( (1L<<(r%11)) & 0x5C4L ) goto ERR; if ( (1L<<(r%13)) & 0x9E4L ) goto ERR; if ( (1L<<(r%17)) & 0x5CE8L ) goto ERR; if ( (1L<<(r%19)) & 0x4F50CL ) goto ERR; if ( (1L<<(r%23)) & 0x7ACCA0L ) goto ERR; if ( (1L<<(r%29)) & 0xC2EDD0CL ) goto ERR; if ( (1L<<(r%31)) & 0x6DE2B848L ) goto ERR; /* Final check - is sqr(sqrt(arg)) == arg ? */ if ((res = mp_sqrt(arg,&t)) != MP_OKAY) { goto ERR; } if ((res = mp_sqr(&t,&t)) != MP_OKAY) { goto ERR; } *ret = (mp_cmp_mag(&t,arg) == MP_EQ) ? MP_YES : MP_NO; ERR:mp_clear(&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_jacobi.c000066400000000000000000000043551225523575400213160ustar00rootroot00000000000000#include #ifdef BN_MP_JACOBI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes the jacobi c = (a | n) (or Legendre if n is prime) * HAC pp. 73 Algorithm 2.149 */ int mp_jacobi (mp_int * a, mp_int * p, int *c) { mp_int a1, p1; int k, s, r, res; mp_digit residue; /* if p <= 0 return MP_VAL */ if (mp_cmp_d(p, 0) != MP_GT) { return MP_VAL; } /* step 1. if a == 0, return 0 */ if (mp_iszero (a) == 1) { *c = 0; return MP_OKAY; } /* step 2. if a == 1, return 1 */ if (mp_cmp_d (a, 1) == MP_EQ) { *c = 1; return MP_OKAY; } /* default */ s = 0; /* step 3. write a = a1 * 2**k */ if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { return res; } if ((res = mp_init (&p1)) != MP_OKAY) { goto LBL_A1; } /* divide out larger power of two */ k = mp_cnt_lsb(&a1); if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { goto LBL_P1; } /* step 4. if e is even set s=1 */ if ((k & 1) == 0) { s = 1; } else { /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ residue = p->dp[0] & 7; if (residue == 1 || residue == 7) { s = 1; } else if (residue == 3 || residue == 5) { s = -1; } } /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ if ( ((p->dp[0] & 3) == 3) && ((a1.dp[0] & 3) == 3)) { s = -s; } /* if a1 == 1 we're done */ if (mp_cmp_d (&a1, 1) == MP_EQ) { *c = s; } else { /* n1 = n mod a1 */ if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { goto LBL_P1; } if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { goto LBL_P1; } *c = s * r; } /* done */ res = MP_OKAY; LBL_P1:mp_clear (&p1); LBL_A1:mp_clear (&a1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_karatsuba_mul.c000066400000000000000000000113011225523575400227060ustar00rootroot00000000000000#include #ifdef BN_MP_KARATSUBA_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = |a| * |b| using Karatsuba Multiplication using * three half size multiplications * * Let B represent the radix [e.g. 2**DIGIT_BIT] and * let n represent half of the number of digits in * the min(a,b) * * a = a1 * B**n + a0 * b = b1 * B**n + b0 * * Then, a * b => a1b1 * B**2n + ((a1 + a0)(b1 + b0) - (a0b0 + a1b1)) * B + a0b0 * * Note that a1b1 and a0b0 are used twice and only need to be * computed once. So in total three half size (half # of * digit) multiplications are performed, a0b0, a1b1 and * (a1+b1)(a0+b0) * * Note that a multiplication of half the digits requires * 1/4th the number of single precision multiplications so in * total after one call 25% of the single precision multiplications * are saved. Note also that the call to mp_mul can end up back * in this function if the a0, a1, b0, or b1 are above the threshold. * This is known as divide-and-conquer and leads to the famous * O(N**lg(3)) or O(N**1.584) work which is asymptopically lower than * the standard O(N**2) that the baseline/comba methods use. * Generally though the overhead of this method doesn't pay off * until a certain size (N ~ 80) is reached. */ int mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) { mp_int x0, x1, y0, y1, t1, x0y0, x1y1; int B, err; /* default the return code to an error */ err = MP_MEM; /* min # of digits */ B = MIN (a->used, b->used); /* now divide in two */ B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) goto ERR; if (mp_init_size (&x1, a->used - B) != MP_OKAY) goto X0; if (mp_init_size (&y0, B) != MP_OKAY) goto X1; if (mp_init_size (&y1, b->used - B) != MP_OKAY) goto Y0; /* init temps */ if (mp_init_size (&t1, B * 2) != MP_OKAY) goto Y1; if (mp_init_size (&x0y0, B * 2) != MP_OKAY) goto T1; if (mp_init_size (&x1y1, B * 2) != MP_OKAY) goto X0Y0; /* now shift the digits */ x0.used = y0.used = B; x1.used = a->used - B; y1.used = b->used - B; { register int x; register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; /* we copy the digits directly instead of using higher level functions * since we also need to shift the digits */ tmpa = a->dp; tmpb = b->dp; tmpx = x0.dp; tmpy = y0.dp; for (x = 0; x < B; x++) { *tmpx++ = *tmpa++; *tmpy++ = *tmpb++; } tmpx = x1.dp; for (x = B; x < a->used; x++) { *tmpx++ = *tmpa++; } tmpy = y1.dp; for (x = B; x < b->used; x++) { *tmpy++ = *tmpb++; } } /* only need to clamp the lower words since by definition the * upper words x1/y1 must have a known number of digits */ mp_clamp (&x0); mp_clamp (&y0); /* now calc the products x0y0 and x1y1 */ /* after this x0 is no longer required, free temp [x0==t2]! */ if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) goto X1Y1; /* x0y0 = x0*y0 */ if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) goto X1Y1; /* x1y1 = x1*y1 */ /* now calc x1+x0 and y1+y0 */ if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = x1 - x0 */ if (s_mp_add (&y1, &y0, &x0) != MP_OKAY) goto X1Y1; /* t2 = y1 - y0 */ if (mp_mul (&t1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = (x1 + x0) * (y1 + y0) */ /* add x0y0 */ if (mp_add (&x0y0, &x1y1, &x0) != MP_OKAY) goto X1Y1; /* t2 = x0y0 + x1y1 */ if (s_mp_sub (&t1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = (x1+x0)*(y1+y0) - (x1y1 + x0y0) */ /* shift by B */ if (mp_lshd (&t1, B) != MP_OKAY) goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< #ifdef BN_MP_KARATSUBA_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Karatsuba squaring, computes b = a*a using three * half size squarings * * See comments of karatsuba_mul for details. It * is essentially the same algorithm but merely * tuned to perform recursive squarings. */ int mp_karatsuba_sqr (mp_int * a, mp_int * b) { mp_int x0, x1, t1, t2, x0x0, x1x1; int B, err; err = MP_MEM; /* min # of digits */ B = a->used; /* now divide in two */ B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) goto ERR; if (mp_init_size (&x1, a->used - B) != MP_OKAY) goto X0; /* init temps */ if (mp_init_size (&t1, a->used * 2) != MP_OKAY) goto X1; if (mp_init_size (&t2, a->used * 2) != MP_OKAY) goto T1; if (mp_init_size (&x0x0, B * 2) != MP_OKAY) goto T2; if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) goto X0X0; { register int x; register mp_digit *dst, *src; src = a->dp; /* now shift the digits */ dst = x0.dp; for (x = 0; x < B; x++) { *dst++ = *src++; } dst = x1.dp; for (x = B; x < a->used; x++) { *dst++ = *src++; } } x0.used = B; x1.used = a->used - B; mp_clamp (&x0); /* now calc the products x0*x0 and x1*x1 */ if (mp_sqr (&x0, &x0x0) != MP_OKAY) goto X1X1; /* x0x0 = x0*x0 */ if (mp_sqr (&x1, &x1x1) != MP_OKAY) goto X1X1; /* x1x1 = x1*x1 */ /* now calc (x1+x0)**2 */ if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) goto X1X1; /* t1 = x1 - x0 */ if (mp_sqr (&t1, &t1) != MP_OKAY) goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ /* add x0y0 */ if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) goto X1X1; /* t2 = x0x0 + x1x1 */ if (s_mp_sub (&t1, &t2, &t1) != MP_OKAY) goto X1X1; /* t1 = (x1+x0)**2 - (x0x0 + x1x1) */ /* shift by B */ if (mp_lshd (&t1, B) != MP_OKAY) goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))< #ifdef BN_MP_LCM_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes least common multiple as |a*b|/(a, b) */ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) { int res; mp_int t1, t2; if ((res = mp_init_multi (&t1, &t2, NULL)) != MP_OKAY) { return res; } /* t1 = get the GCD of the two inputs */ if ((res = mp_gcd (a, b, &t1)) != MP_OKAY) { goto LBL_T; } /* divide the smallest by the GCD */ if (mp_cmp_mag(a, b) == MP_LT) { /* store quotient in t2 such that t2 * b is the LCM */ if ((res = mp_div(a, &t1, &t2, NULL)) != MP_OKAY) { goto LBL_T; } res = mp_mul(b, &t2, c); } else { /* store quotient in t2 such that t2 * a is the LCM */ if ((res = mp_div(b, &t1, &t2, NULL)) != MP_OKAY) { goto LBL_T; } res = mp_mul(a, &t2, c); } /* fix the sign to positive */ c->sign = MP_ZPOS; LBL_T: mp_clear_multi (&t1, &t2, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_lshd.c000066400000000000000000000030351225523575400210130ustar00rootroot00000000000000#include #ifdef BN_MP_LSHD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift left a certain amount of digits */ int mp_lshd (mp_int * a, int b) { int x, res; /* if its less than zero return */ if (b <= 0) { return MP_OKAY; } /* grow to fit the new digits */ if (a->alloc < a->used + b) { if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { return res; } } { register mp_digit *top, *bottom; /* increment the used by the shift amount then copy upwards */ a->used += b; /* top */ top = a->dp + a->used - 1; /* base */ bottom = a->dp + a->used - 1 - b; /* much like mp_rshd this is implemented using a sliding window * except the window goes the otherway around. Copying from * the bottom to the top. see bn_mp_rshd.c for more info. */ for (x = a->used - 1; x >= b; x--) { *top-- = *bottom--; } /* zero the lower digits */ top = a->dp; for (x = 0; x < b; x++) { *top++ = 0; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mod.c000066400000000000000000000020031225523575400206320ustar00rootroot00000000000000#include #ifdef BN_MP_MOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = a mod b, 0 <= c < b */ int mp_mod (mp_int * a, mp_int * b, mp_int * c) { mp_int t; int res; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { mp_clear (&t); return res; } if (mp_iszero(&t) || t.sign == b->sign) { res = MP_OKAY; mp_exch (&t, c); } else { res = mp_add (b, &t, c); } mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mod_2d.c000066400000000000000000000025721225523575400212320ustar00rootroot00000000000000#include #ifdef BN_MP_MOD_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* calc a value mod 2**b */ int mp_mod_2d (mp_int * a, int b, mp_int * c) { int x, res; /* if b is <= 0 then zero the int */ if (b <= 0) { mp_zero (c); return MP_OKAY; } /* if the modulus is larger than the value than return */ if (b >= (int) (a->used * DIGIT_BIT)) { res = mp_copy (a, c); return res; } /* copy */ if ((res = mp_copy (a, c)) != MP_OKAY) { return res; } /* zero digits above the last digit of the modulus */ for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { c->dp[x] = 0; } /* clear the digit that is not completely outside/inside the modulus */ c->dp[b / DIGIT_BIT] &= (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mod_d.c000066400000000000000000000012661225523575400211470ustar00rootroot00000000000000#include #ifdef BN_MP_MOD_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ int mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) { return mp_div_d(a, b, NULL, c); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_montgomery_calc_normalization.c000066400000000000000000000027511225523575400262150ustar00rootroot00000000000000#include #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* * shifts with subtractions when the result is greater than b. * * The method is slightly modified to shift B unconditionally upto just under * the leading bit of b. This saves alot of multiple precision shifting. */ int mp_montgomery_calc_normalization (mp_int * a, mp_int * b) { int x, bits, res; /* how many bits of last digit does b use */ bits = mp_count_bits (b) % DIGIT_BIT; if (b->used > 1) { if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { return res; } } else { mp_set(a, 1); bits = 1; } /* now compute C = A * B mod b */ for (x = bits - 1; x < (int)DIGIT_BIT; x++) { if ((res = mp_mul_2 (a, a)) != MP_OKAY) { return res; } if (mp_cmp_mag (a, b) != MP_LT) { if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { return res; } } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_montgomery_reduce.c000066400000000000000000000057411225523575400236160ustar00rootroot00000000000000#include #ifdef BN_MP_MONTGOMERY_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes xR**-1 == x (mod N) via Montgomery Reduction */ int mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) { int ix, res, digs; mp_digit mu; /* can the fast reduction [comba] method be used? * * Note that unlike in mul you're safely allowed *less* * than the available columns [255 per default] since carries * are fixed up in the inner loop. */ digs = n->used * 2 + 1; if ((digs < MP_WARRAY) && n->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_mp_montgomery_reduce (x, n, rho); } /* grow the input as required */ if (x->alloc < digs) { if ((res = mp_grow (x, digs)) != MP_OKAY) { return res; } } x->used = digs; for (ix = 0; ix < n->used; ix++) { /* mu = ai * rho mod b * * The value of rho must be precalculated via * montgomery_setup() such that * it equals -1/n0 mod b this allows the * following inner loop to reduce the * input one digit at a time */ mu = (mp_digit) (((mp_word)x->dp[ix]) * ((mp_word)rho) & MP_MASK); /* a = a + mu * m * b**i */ { register int iy; register mp_digit *tmpn, *tmpx, u; register mp_word r; /* alias for digits of the modulus */ tmpn = n->dp; /* alias for the digits of x [the input] */ tmpx = x->dp + ix; /* set the carry to zero */ u = 0; /* Multiply and add in place */ for (iy = 0; iy < n->used; iy++) { /* compute product and sum */ r = ((mp_word)mu) * ((mp_word)*tmpn++) + ((mp_word) u) + ((mp_word) * tmpx); /* get carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); /* fix digit */ *tmpx++ = (mp_digit)(r & ((mp_word) MP_MASK)); } /* At this point the ix'th digit of x should be zero */ /* propagate carries upwards as required*/ while (u) { *tmpx += u; u = *tmpx >> DIGIT_BIT; *tmpx++ &= MP_MASK; } } } /* at this point the n.used'th least * significant digits of x are all zero * which means we can shift x to the * right by n.used digits and the * residue is unchanged. */ /* x = x/b**n.used */ mp_clamp(x); mp_rshd (x, n->used); /* if x >= n then x = x - n */ if (mp_cmp_mag (x, n) != MP_LT) { return s_mp_sub (x, n, x); } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_montgomery_setup.c000066400000000000000000000030211225523575400234740ustar00rootroot00000000000000#include #ifdef BN_MP_MONTGOMERY_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* setups the montgomery reduction stuff */ int mp_montgomery_setup (mp_int * n, mp_digit * rho) { mp_digit x, b; /* fast inversion mod 2**k * * Based on the fact that * * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) * => 2*X*A - X*X*A*A = 1 * => 2*(1) - (1) = 1 */ b = n->dp[0]; if ((b & 1) == 0) { return MP_VAL; } x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ x *= 2 - b * x; /* here x*a==1 mod 2**8 */ #if !defined(MP_8BIT) x *= 2 - b * x; /* here x*a==1 mod 2**16 */ #endif #if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) x *= 2 - b * x; /* here x*a==1 mod 2**32 */ #endif #ifdef MP_64BIT x *= 2 - b * x; /* here x*a==1 mod 2**64 */ #endif /* rho = -1/m mod b */ *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mul.c000066400000000000000000000033301225523575400206540ustar00rootroot00000000000000#include #ifdef BN_MP_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level multiplication (handles sign) */ int mp_mul (mp_int * a, mp_int * b, mp_int * c) { int res, neg; neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; /* use Toom-Cook? */ #ifdef BN_MP_TOOM_MUL_C if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { res = mp_toom_mul(a, b, c); } else #endif #ifdef BN_MP_KARATSUBA_MUL_C /* use Karatsuba? */ if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { res = mp_karatsuba_mul (a, b, c); } else #endif { /* can we use the fast multiplier? * * The fast multiplier can be used if the output will * have less than MP_WARRAY digits and the number of * digits won't affect carry propagation */ int digs = a->used + b->used + 1; #ifdef BN_FAST_S_MP_MUL_DIGS_C if ((digs < MP_WARRAY) && MIN(a->used, b->used) <= (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { res = fast_s_mp_mul_digs (a, b, c, digs); } else #endif #ifdef BN_S_MP_MUL_DIGS_C res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ #else res = MP_VAL; #endif } c->sign = (c->used > 0) ? neg : MP_ZPOS; return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mul_2.c000066400000000000000000000035431225523575400211030ustar00rootroot00000000000000#include #ifdef BN_MP_MUL_2_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = a*2 */ int mp_mul_2(mp_int * a, mp_int * b) { int x, res, oldused; /* grow to accomodate result */ if (b->alloc < a->used + 1) { if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { return res; } } oldused = b->used; b->used = a->used; { register mp_digit r, rr, *tmpa, *tmpb; /* alias for source */ tmpa = a->dp; /* alias for dest */ tmpb = b->dp; /* carry */ r = 0; for (x = 0; x < a->used; x++) { /* get what will be the *next* carry bit from the * MSB of the current digit */ rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); /* now shift up this digit, add in the carry [from the previous] */ *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; /* copy the carry that would be from the source * digit into the next iteration */ r = rr; } /* new leading digit? */ if (r != 0) { /* add a MSB which is always 1 at this point */ *tmpb = 1; ++(b->used); } /* now zero any excess digits on the destination * that we didn't write to */ tmpb = b->dp + b->used; for (x = b->used; x < oldused; x++) { *tmpb++ = 0; } } b->sign = a->sign; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mul_2d.c000066400000000000000000000036311225523575400212450ustar00rootroot00000000000000#include #ifdef BN_MP_MUL_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift left by a certain bit count */ int mp_mul_2d (mp_int * a, int b, mp_int * c) { mp_digit d; int res; /* copy */ if (a != c) { if ((res = mp_copy (a, c)) != MP_OKAY) { return res; } } if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } } /* shift by as many digits in the bit count */ if (b >= (int)DIGIT_BIT) { if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { return res; } } /* shift any bit count < DIGIT_BIT */ d = (mp_digit) (b % DIGIT_BIT); if (d != 0) { register mp_digit *tmpc, shift, mask, r, rr; register int x; /* bitmask for carries */ mask = (((mp_digit)1) << d) - 1; /* shift for msbs */ shift = DIGIT_BIT - d; /* alias */ tmpc = c->dp; /* carry */ r = 0; for (x = 0; x < c->used; x++) { /* get the higher bits of the current word */ rr = (*tmpc >> shift) & mask; /* shift the current word and OR in the carry */ *tmpc = ((*tmpc << d) | r) & MP_MASK; ++tmpc; /* set the carry to the carry bits of the current word */ r = rr; } /* set final carry */ if (r != 0) { c->dp[(c->used)++] = r; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mul_d.c000066400000000000000000000034061225523575400211630ustar00rootroot00000000000000#include #ifdef BN_MP_MUL_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiply by a digit */ int mp_mul_d (mp_int * a, mp_digit b, mp_int * c) { mp_digit u, *tmpa, *tmpc; mp_word r; int ix, res, olduse; /* make sure c is big enough to hold a*b */ if (c->alloc < a->used + 1) { if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { return res; } } /* get the original destinations used count */ olduse = c->used; /* set the sign */ c->sign = a->sign; /* alias for a->dp [source] */ tmpa = a->dp; /* alias for c->dp [dest] */ tmpc = c->dp; /* zero carry */ u = 0; /* compute columns */ for (ix = 0; ix < a->used; ix++) { /* compute product and carry sum for this term */ r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b); /* mask off higher bits to get a single digit */ *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* send carry into next iteration */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } /* store final carry [if any] and increment ix offset */ *tmpc++ = u; ++ix; /* now zero digits above the top */ while (ix++ < olduse) { *tmpc++ = 0; } /* set used count */ c->used = a->used + 1; mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_mulmod.c000066400000000000000000000016421225523575400213600ustar00rootroot00000000000000#include #ifdef BN_MP_MULMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a * b (mod c) */ int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_mul (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_n_root.c000066400000000000000000000055261225523575400213700ustar00rootroot00000000000000#include #ifdef BN_MP_N_ROOT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* find the n'th root of an integer * * Result found such that (c)**b <= a and (c+1)**b > a * * This algorithm uses Newton's approximation * x[i+1] = x[i] - f(x[i])/f'(x[i]) * which will find the root in log(N) time where * each step involves a fair bit. This is not meant to * find huge roots [square and cube, etc]. */ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) { mp_int t1, t2, t3; int res, neg; /* input must be positive if b is even */ if ((b & 1) == 0 && a->sign == MP_NEG) { return MP_VAL; } if ((res = mp_init (&t1)) != MP_OKAY) { return res; } if ((res = mp_init (&t2)) != MP_OKAY) { goto LBL_T1; } if ((res = mp_init (&t3)) != MP_OKAY) { goto LBL_T2; } /* if a is negative fudge the sign but keep track */ neg = a->sign; a->sign = MP_ZPOS; /* t2 = 2 */ mp_set (&t2, 2); do { /* t1 = t2 */ if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { goto LBL_T3; } /* t2 = t1 - ((t1**b - a) / (b * t1**(b-1))) */ /* t3 = t1**(b-1) */ if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { goto LBL_T3; } /* numerator */ /* t2 = t1**b */ if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { goto LBL_T3; } /* t2 = t1**b - a */ if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { goto LBL_T3; } /* denominator */ /* t3 = t1**(b-1) * b */ if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { goto LBL_T3; } /* t3 = (t1**b - a)/(b * t1**(b-1)) */ if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { goto LBL_T3; } if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { goto LBL_T3; } } while (mp_cmp (&t1, &t2) != MP_EQ); /* result can be off by a few so check */ for (;;) { if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { goto LBL_T3; } if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { goto LBL_T3; } } else { break; } } /* reset the sign of a first */ a->sign = neg; /* set the result */ mp_exch (&t1, c); /* set the sign of the result */ c->sign = neg; res = MP_OKAY; LBL_T3:mp_clear (&t3); LBL_T2:mp_clear (&t2); LBL_T1:mp_clear (&t1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_neg.c000066400000000000000000000016161225523575400206350ustar00rootroot00000000000000#include #ifdef BN_MP_NEG_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = -a */ int mp_neg (mp_int * a, mp_int * b) { int res; if (a != b) { if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } } if (mp_iszero(b) != MP_YES) { b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; } else { b->sign = MP_ZPOS; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_or.c000066400000000000000000000021211225523575400204740ustar00rootroot00000000000000#include #ifdef BN_MP_OR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* OR two ints together */ int mp_or (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] |= x->dp[ix]; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_fermat.c000066400000000000000000000026531225523575400225400ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_FERMAT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* performs one Fermat test. * * If "a" were prime then b**a == b (mod a) since the order of * the multiplicative sub-group would be phi(a) = a-1. That means * it would be the same as b**(a mod (a-1)) == b**1 == b (mod a). * * Sets result to 1 if the congruence holds, or zero otherwise. */ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) { mp_int t; int err; /* default to composite */ *result = MP_NO; /* ensure b > 1 */ if (mp_cmp_d(b, 1) != MP_GT) { return MP_VAL; } /* init t */ if ((err = mp_init (&t)) != MP_OKAY) { return err; } /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { goto LBL_T; } /* is it equal to b? */ if (mp_cmp (&t, b) == MP_EQ) { *result = MP_YES; } err = MP_OKAY; LBL_T:mp_clear (&t); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_is_divisible.c000066400000000000000000000022441225523575400237230ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_IS_DIVISIBLE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if an integers is divisible by one * of the first PRIME_SIZE primes or not * * sets result to 0 if not, 1 if yes */ int mp_prime_is_divisible (mp_int * a, int *result) { int err, ix; mp_digit res; /* default to not */ *result = MP_NO; for (ix = 0; ix < PRIME_SIZE; ix++) { /* what is a mod LBL_prime_tab[ix] */ if ((err = mp_mod_d (a, ltm_prime_tab[ix], &res)) != MP_OKAY) { return err; } /* is the residue zero? */ if (res == 0) { *result = MP_YES; return MP_OKAY; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_is_prime.c000066400000000000000000000035001225523575400230610ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_IS_PRIME_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* performs a variable number of rounds of Miller-Rabin * * Probability of error after t rounds is no more than * * Sets result to 1 if probably prime, 0 otherwise */ int mp_prime_is_prime (mp_int * a, int t, int *result) { mp_int b; int ix, err, res; /* default to no */ *result = MP_NO; /* valid value of t? */ if (t <= 0 || t > PRIME_SIZE) { return MP_VAL; } /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { *result = 1; return MP_OKAY; } } /* first perform trial division */ if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { return err; } /* return if it was trivially divisible */ if (res == MP_YES) { return MP_OKAY; } /* now perform the miller-rabin rounds */ if ((err = mp_init (&b)) != MP_OKAY) { return err; } for (ix = 0; ix < t; ix++) { /* set the prime */ mp_set (&b, ltm_prime_tab[ix]); if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { goto LBL_B; } if (res == MP_NO) { goto LBL_B; } } /* passed the test */ *result = MP_YES; LBL_B:mp_clear (&b); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_miller_rabin.c000066400000000000000000000045111225523575400237140ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_MILLER_RABIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Miller-Rabin test of "a" to the base of "b" as described in * HAC pp. 139 Algorithm 4.24 * * Sets result to 0 if definitely composite or 1 if probably prime. * Randomly the chance of error is no more than 1/4 and often * very much lower. */ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) { mp_int n1, y, r; int s, j, err; /* default */ *result = MP_NO; /* ensure b > 1 */ if (mp_cmp_d(b, 1) != MP_GT) { return MP_VAL; } /* get n1 = a - 1 */ if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { return err; } if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { goto LBL_N1; } /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { goto LBL_N1; } /* count the number of least significant bits * which are zero */ s = mp_cnt_lsb(&r); /* now divide n - 1 by 2**s */ if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { goto LBL_R; } /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { goto LBL_R; } if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { goto LBL_Y; } /* if y != 1 and y != n1 do */ if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { j = 1; /* while j <= s-1 and y != n1 */ while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { goto LBL_Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { goto LBL_Y; } ++j; } /* if y != n1 then composite */ if (mp_cmp (&y, &n1) != MP_EQ) { goto LBL_Y; } } /* probably prime now */ *result = MP_YES; LBL_Y:mp_clear (&y); LBL_R:mp_clear (&r); LBL_N1:mp_clear (&n1); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_next_prime.c000066400000000000000000000111441225523575400234270ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_NEXT_PRIME_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* finds the next prime after the number "a" using "t" trials * of Miller-Rabin. * * bbs_style = 1 means the prime must be congruent to 3 mod 4 */ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) { int err, res, x, y; mp_digit res_tab[PRIME_SIZE], step, kstep; mp_int b; /* ensure t is valid */ if (t <= 0 || t > PRIME_SIZE) { return MP_VAL; } /* force positive */ a->sign = MP_ZPOS; /* simple algo if a is less than the largest prime in the table */ if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { /* find which prime it is bigger than */ for (x = PRIME_SIZE - 2; x >= 0; x--) { if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { if (bbs_style == 1) { /* ok we found a prime smaller or * equal [so the next is larger] * * however, the prime must be * congruent to 3 mod 4 */ if ((ltm_prime_tab[x + 1] & 3) != 3) { /* scan upwards for a prime congruent to 3 mod 4 */ for (y = x + 1; y < PRIME_SIZE; y++) { if ((ltm_prime_tab[y] & 3) == 3) { mp_set(a, ltm_prime_tab[y]); return MP_OKAY; } } } } else { mp_set(a, ltm_prime_tab[x + 1]); return MP_OKAY; } } } /* at this point a maybe 1 */ if (mp_cmp_d(a, 1) == MP_EQ) { mp_set(a, 2); return MP_OKAY; } /* fall through to the sieve */ } /* generate a prime congruent to 3 mod 4 or 1/3 mod 4? */ if (bbs_style == 1) { kstep = 4; } else { kstep = 2; } /* at this point we will use a combination of a sieve and Miller-Rabin */ if (bbs_style == 1) { /* if a mod 4 != 3 subtract the correct value to make it so */ if ((a->dp[0] & 3) != 3) { if ((err = mp_sub_d(a, (a->dp[0] & 3) + 1, a)) != MP_OKAY) { return err; }; } } else { if (mp_iseven(a) == 1) { /* force odd */ if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { return err; } } } /* generate the restable */ for (x = 1; x < PRIME_SIZE; x++) { if ((err = mp_mod_d(a, ltm_prime_tab[x], res_tab + x)) != MP_OKAY) { return err; } } /* init temp used for Miller-Rabin Testing */ if ((err = mp_init(&b)) != MP_OKAY) { return err; } for (;;) { /* skip to the next non-trivially divisible candidate */ step = 0; do { /* y == 1 if any residue was zero [e.g. cannot be prime] */ y = 0; /* increase step to next candidate */ step += kstep; /* compute the new residue without using division */ for (x = 1; x < PRIME_SIZE; x++) { /* add the step to each residue */ res_tab[x] += kstep; /* subtract the modulus [instead of using division] */ if (res_tab[x] >= ltm_prime_tab[x]) { res_tab[x] -= ltm_prime_tab[x]; } /* set flag if zero */ if (res_tab[x] == 0) { y = 1; } } } while (y == 1 && step < ((((mp_digit)1)<= ((((mp_digit)1)< #ifdef BN_MP_PRIME_RABIN_MILLER_TRIALS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const struct { int k, t; } sizes[] = { { 128, 28 }, { 256, 16 }, { 384, 10 }, { 512, 7 }, { 640, 6 }, { 768, 5 }, { 896, 4 }, { 1024, 4 } }; /* returns # of RM trials required for a given bit size */ int mp_prime_rabin_miller_trials(int size) { int x; for (x = 0; x < (int)(sizeof(sizes)/(sizeof(sizes[0]))); x++) { if (sizes[x].k == size) { return sizes[x].t; } else if (sizes[x].k > size) { return (x == 0) ? sizes[0].t : sizes[x - 1].t; } } return sizes[x-1].t + 1; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_prime_random_ex.c000066400000000000000000000070341225523575400232340ustar00rootroot00000000000000#include #ifdef BN_MP_PRIME_RANDOM_EX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* makes a truly random prime of a given size (bits), * * Flags are as follows: * * LTM_PRIME_BBS - make prime congruent to 3 mod 4 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) * LTM_PRIME_2MSB_ON - make the 2nd highest bit one * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * */ /* This is possibly the mother of all prime generation functions, muahahahahaha! */ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat) { unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; int res, err, bsize, maskOR_msb_offset; /* sanity check the input */ if (size <= 1 || t <= 0) { return MP_VAL; } /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ if (flags & LTM_PRIME_SAFE) { flags |= LTM_PRIME_BBS; } /* calc the byte size */ bsize = (size>>3) + ((size&7)?1:0); /* we need a buffer of bsize bytes */ tmp = OPT_CAST(unsigned char) XMALLOC(bsize); if (tmp == NULL) { return MP_MEM; } /* calc the maskAND value for the MSbyte*/ maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); /* calc the maskOR_msb */ maskOR_msb = 0; maskOR_msb_offset = ((size & 7) == 1) ? 1 : 0; if (flags & LTM_PRIME_2MSB_ON) { maskOR_msb |= 0x80 >> ((9 - size) & 7); } /* get the maskOR_lsb */ maskOR_lsb = 1; if (flags & LTM_PRIME_BBS) { maskOR_lsb |= 3; } do { /* read the bytes */ if (cb(tmp, bsize, dat) != bsize) { err = MP_VAL; goto error; } /* work over the MSbyte */ tmp[0] &= maskAND; tmp[0] |= 1 << ((size - 1) & 7); /* mix in the maskORs */ tmp[maskOR_msb_offset] |= maskOR_msb; tmp[bsize-1] |= maskOR_lsb; /* read it in */ if ((err = mp_read_unsigned_bin(a, tmp, bsize)) != MP_OKAY) { goto error; } /* is it prime? */ if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } if (res == MP_NO) { continue; } if (flags & LTM_PRIME_SAFE) { /* see if (a-1)/2 is prime */ if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } /* is it prime? */ if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } } } while (res == MP_NO); if (flags & LTM_PRIME_SAFE) { /* restore a to the original value */ if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } } err = MP_OKAY; error: XFREE(tmp); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_radix_size.c000066400000000000000000000032571225523575400222300ustar00rootroot00000000000000#include #ifdef BN_MP_RADIX_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* returns size of ASCII reprensentation */ int mp_radix_size (mp_int * a, int radix, int *size) { int res, digs; mp_int t; mp_digit d; *size = 0; /* make sure the radix is in range */ if (radix < 2 || radix > 64) { return MP_VAL; } if (mp_iszero(a) == MP_YES) { *size = 2; return MP_OKAY; } /* special case for binary */ if (radix == 2) { *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; return MP_OKAY; } /* digs is the digit count */ digs = 0; /* if it's negative add one for the sign */ if (a->sign == MP_NEG) { ++digs; } /* init a copy of the input */ if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* force temp to positive */ t.sign = MP_ZPOS; /* fetch out all of the digits */ while (mp_iszero (&t) == MP_NO) { if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } ++digs; } mp_clear (&t); /* return digs + 1, the 1 is for the NULL byte that would be required. */ *size = digs + 1; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_radix_smap.c000066400000000000000000000013431225523575400222100ustar00rootroot00000000000000#include #ifdef BN_MP_RADIX_SMAP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* chars used in radix conversions */ const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_rand.c000066400000000000000000000022411225523575400210030ustar00rootroot00000000000000#include #ifdef BN_MP_RAND_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* makes a pseudo-random int of a given size */ int mp_rand (mp_int * a, int digits) { int res; mp_digit d; mp_zero (a); if (digits <= 0) { return MP_OKAY; } /* first place a random non-zero digit */ do { d = ((mp_digit) abs (rand ())) & MP_MASK; } while (d == 0); if ((res = mp_add_d (a, d, a)) != MP_OKAY) { return res; } while (--digits > 0) { if ((res = mp_lshd (a, 1)) != MP_OKAY) { return res; } if ((res = mp_add_d (a, ((mp_digit) abs (rand ())), a)) != MP_OKAY) { return res; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_read_radix.c000066400000000000000000000037161225523575400221710ustar00rootroot00000000000000#include #ifdef BN_MP_READ_RADIX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read a string [ASCII] in a given radix */ int mp_read_radix (mp_int * a, const char *str, int radix) { int y, res, neg; char ch; /* zero the digit bignum */ mp_zero(a); /* make sure the radix is ok */ if (radix < 2 || radix > 64) { return MP_VAL; } /* if the leading digit is a * minus set the sign to negative. */ if (*str == '-') { ++str; neg = MP_NEG; } else { neg = MP_ZPOS; } /* set the integer to the default of zero */ mp_zero (a); /* process each digit of the string */ while (*str) { /* if the radix < 36 the conversion is case insensitive * this allows numbers like 1AB and 1ab to represent the same value * [e.g. in hex] */ ch = (char) ((radix < 36) ? toupper ((int)*str) : *str); for (y = 0; y < 64; y++) { if (ch == mp_s_rmap[y]) { break; } } /* if the char was found in the map * and is less than the given radix add it * to the number, otherwise exit the loop. */ if (y < radix) { if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { return res; } if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { return res; } } else { break; } ++str; } /* set the sign only if a != 0 */ if (mp_iszero(a) != 1) { a->sign = neg; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_read_signed_bin.c000066400000000000000000000020301225523575400231470ustar00rootroot00000000000000#include #ifdef BN_MP_READ_SIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read signed bin, big endian, first byte is 0==positive or 1==negative */ int mp_read_signed_bin (mp_int * a, const unsigned char *b, int c) { int res; /* read magnitude */ if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { return res; } /* first byte is 0 for positive, non-zero for negative */ if (b[0] == 0) { a->sign = MP_ZPOS; } else { a->sign = MP_NEG; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_read_unsigned_bin.c000066400000000000000000000024141225523575400235200ustar00rootroot00000000000000#include #ifdef BN_MP_READ_UNSIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reads a unsigned char array, assumes the msb is stored first [big endian] */ int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c) { int res; /* make sure there are at least two digits */ if (a->alloc < 2) { if ((res = mp_grow(a, 2)) != MP_OKAY) { return res; } } /* zero the int */ mp_zero (a); /* read the bytes in */ while (c-- > 0) { if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { return res; } #ifndef MP_8BIT a->dp[0] |= *b++; a->used += 1; #else a->dp[0] = (*b & MP_MASK); a->dp[1] |= ((*b++ >> 7U) & 1); a->used += 2; #endif } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce.c000066400000000000000000000044651225523575400213400ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces x mod m, assumes 0 < x < m**2, mu is * precomputed via mp_reduce_setup. * From HAC pp.604 Algorithm 14.42 */ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) { mp_int q; int res, um = m->used; /* q = x */ if ((res = mp_init_copy (&q, x)) != MP_OKAY) { return res; } /* q1 = x / b**(k-1) */ mp_rshd (&q, um - 1); /* according to HAC this optimization is ok */ if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { goto CLEANUP; } } else { #ifdef BN_S_MP_MUL_HIGH_DIGS_C if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { goto CLEANUP; } #elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { goto CLEANUP; } #else { res = MP_VAL; goto CLEANUP; } #endif } /* q3 = q2 / b**(k+1) */ mp_rshd (&q, um + 1); /* x = x mod b**(k+1), quick (no division) */ if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { goto CLEANUP; } /* q = q * m mod b**(k+1), quick (no division) */ if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { goto CLEANUP; } /* x = x - q */ if ((res = mp_sub (x, &q, x)) != MP_OKAY) { goto CLEANUP; } /* If x < 0, add b**(k+1) to it */ if (mp_cmp_d (x, 0) == MP_LT) { mp_set (&q, 1); if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) goto CLEANUP; if ((res = mp_add (x, &q, x)) != MP_OKAY) goto CLEANUP; } /* Back off if it's too big */ while (mp_cmp (x, m) != MP_LT) { if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { goto CLEANUP; } } CLEANUP: mp_clear (&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_2k.c000066400000000000000000000024421225523575400217250ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_2K_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces a modulo n where n is of the form 2**p - d */ int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) { mp_int q; int p, res; if ((res = mp_init(&q)) != MP_OKAY) { return res; } p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto ERR; } if (d != 1) { /* q = q * d */ if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { goto ERR; } } /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto ERR; } if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } ERR: mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_2k_l.c000066400000000000000000000025211225523575400222360ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_2K_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces a modulo n where n is of the form 2**p - d This differs from reduce_2k since "d" can be larger than a single digit. */ int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) { mp_int q; int p, res; if ((res = mp_init(&q)) != MP_OKAY) { return res; } p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto ERR; } /* q = q * d */ if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { goto ERR; } /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto ERR; } if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } ERR: mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_2k_setup.c000066400000000000000000000020721225523575400231440ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_2K_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ int mp_reduce_2k_setup(mp_int *a, mp_digit *d) { int res, p; mp_int tmp; if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } p = mp_count_bits(a); if ((res = mp_2expt(&tmp, p)) != MP_OKAY) { mp_clear(&tmp); return res; } if ((res = s_mp_sub(&tmp, a, &tmp)) != MP_OKAY) { mp_clear(&tmp); return res; } *d = tmp.dp[0]; mp_clear(&tmp); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_2k_setup_l.c000066400000000000000000000017551225523575400234660ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_2K_SETUP_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ int mp_reduce_2k_setup_l(mp_int *a, mp_int *d) { int res; mp_int tmp; if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { goto ERR; } if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { goto ERR; } ERR: mp_clear(&tmp); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_is_2k.c000066400000000000000000000023341225523575400224200ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_IS_2K_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if mp_reduce_2k can be used */ int mp_reduce_is_2k(mp_int *a) { int ix, iy, iw; mp_digit iz; if (a->used == 0) { return MP_NO; } else if (a->used == 1) { return MP_YES; } else if (a->used > 1) { iy = mp_count_bits(a); iz = 1; iw = 1; /* Test every bit from the second digit up, must be 1 */ for (ix = DIGIT_BIT; ix < iy; ix++) { if ((a->dp[iw] & iz) == 0) { return MP_NO; } iz <<= 1; if (iz > (mp_digit)MP_MASK) { ++iw; iz = 1; } } } return MP_YES; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_is_2k_l.c000066400000000000000000000021171225523575400227320ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_IS_2K_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if reduce_2k_l can be used */ int mp_reduce_is_2k_l(mp_int *a) { int ix, iy; if (a->used == 0) { return MP_NO; } else if (a->used == 1) { return MP_YES; } else if (a->used > 1) { /* if more than half of the digits are -1 we're sold */ for (iy = ix = 0; ix < a->used; ix++) { if (a->dp[ix] == MP_MASK) { ++iy; } } return (iy >= (a->used/2)) ? MP_YES : MP_NO; } return MP_NO; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_reduce_setup.c000066400000000000000000000016351225523575400225540ustar00rootroot00000000000000#include #ifdef BN_MP_REDUCE_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* pre-calculate the value required for Barrett reduction * For a given modulus "b" it calulates the value required in "a" */ int mp_reduce_setup (mp_int * a, mp_int * b) { int res; if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { return res; } return mp_div (a, b, a, NULL); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_rshd.c000066400000000000000000000030761225523575400210260ustar00rootroot00000000000000#include #ifdef BN_MP_RSHD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift right a certain amount of digits */ void mp_rshd (mp_int * a, int b) { int x; /* if b <= 0 then ignore it */ if (b <= 0) { return; } /* if b > used then simply zero it and return */ if (a->used <= b) { mp_zero (a); return; } { register mp_digit *bottom, *top; /* shift the digits down */ /* bottom */ bottom = a->dp; /* top [offset into digits] */ top = a->dp + b; /* this is implemented as a sliding window where * the window is b-digits long and digits from * the top of the window are copied to the bottom * * e.g. b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> /\ | ----> \-------------------/ ----> */ for (x = 0; x < (a->used - b); x++) { *bottom++ = *top++; } /* zero the top digits */ for (; x < a->used; x++) { *bottom++ = 0; } } /* remove excess digits */ a->used -= b; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_set.c000066400000000000000000000013471225523575400206600ustar00rootroot00000000000000#include #ifdef BN_MP_SET_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set to a digit */ void mp_set (mp_int * a, mp_digit b) { mp_zero (a); a->dp[0] = b & MP_MASK; a->used = (a->dp[0] != 0) ? 1 : 0; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_set_int.c000066400000000000000000000021701225523575400215250ustar00rootroot00000000000000#include #ifdef BN_MP_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set a 32-bit const */ int mp_set_int (mp_int * a, unsigned long b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < 8; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> 28) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_set_long.c000066400000000000000000000023101225523575400216660ustar00rootroot00000000000000#include #ifdef BN_MP_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set a platform dependent unsigned long int */ int mp_set_long (mp_int * a, unsigned long b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < sizeof(unsigned long) * 2; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> ((sizeof(unsigned long)) * 8 - 4)) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_shrink.c000066400000000000000000000016541225523575400213640ustar00rootroot00000000000000#include #ifdef BN_MP_SHRINK_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shrink a bignum */ int mp_shrink (mp_int * a) { mp_digit *tmp; int used = 1; if(a->used > 0) used = a->used; if (a->alloc != used) { if ((tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * used)) == NULL) { return MP_MEM; } a->dp = tmp; a->alloc = used; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_signed_bin_size.c000066400000000000000000000013411225523575400232120ustar00rootroot00000000000000#include #ifdef BN_MP_SIGNED_BIN_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the size for an signed equivalent */ int mp_signed_bin_size (mp_int * a) { return 1 + mp_unsigned_bin_size (a); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_sqr.c000066400000000000000000000024611225523575400206700ustar00rootroot00000000000000#include #ifdef BN_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes b = a*a */ int mp_sqr (mp_int * a, mp_int * b) { int res; #ifdef BN_MP_TOOM_SQR_C /* use Toom-Cook? */ if (a->used >= TOOM_SQR_CUTOFF) { res = mp_toom_sqr(a, b); /* Karatsuba? */ } else #endif #ifdef BN_MP_KARATSUBA_SQR_C if (a->used >= KARATSUBA_SQR_CUTOFF) { res = mp_karatsuba_sqr (a, b); } else #endif { #ifdef BN_FAST_S_MP_SQR_C /* can we use the fast comba multiplier? */ if ((a->used * 2 + 1) < MP_WARRAY && a->used < (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { res = fast_s_mp_sqr (a, b); } else #endif #ifdef BN_S_MP_SQR_C res = s_mp_sqr (a, b); #else res = MP_VAL; #endif } b->sign = MP_ZPOS; return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_sqrmod.c000066400000000000000000000016231225523575400213670ustar00rootroot00000000000000#include #ifdef BN_MP_SQRMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = a * a (mod b) */ int mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_sqr (a, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, b, c); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_sqrt.c000066400000000000000000000033401225523575400210510ustar00rootroot00000000000000#include #ifdef BN_MP_SQRT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this function is less generic than mp_n_root, simpler and faster */ int mp_sqrt(mp_int *arg, mp_int *ret) { int res; mp_int t1,t2; /* must be positive */ if (arg->sign == MP_NEG) { return MP_VAL; } /* easy out */ if (mp_iszero(arg) == MP_YES) { mp_zero(ret); return MP_OKAY; } if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) { return res; } if ((res = mp_init(&t2)) != MP_OKAY) { goto E2; } /* First approx. (not very bad for large arg) */ mp_rshd (&t1,t1.used/2); /* t1 > 0 */ if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { goto E1; } if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { goto E1; } if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { goto E1; } /* And now t1 > sqrt(arg) */ do { if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { goto E1; } if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { goto E1; } if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { goto E1; } /* t1 >= sqrt(arg) >= t2 at this point */ } while (mp_cmp_mag(&t1,&t2) == MP_GT); mp_exch(&t1,ret); E1: mp_clear(&t2); E2: mp_clear(&t1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_sub.c000066400000000000000000000031471225523575400206560ustar00rootroot00000000000000#include #ifdef BN_MP_SUB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level subtraction (handles signs) */ int mp_sub (mp_int * a, mp_int * b, mp_int * c) { int sa, sb, res; sa = a->sign; sb = b->sign; if (sa != sb) { /* subtract a negative from a positive, OR */ /* subtract a positive from a negative. */ /* In either case, ADD their magnitudes, */ /* and use the sign of the first number. */ c->sign = sa; res = s_mp_add (a, b, c); } else { /* subtract a positive from a positive, OR */ /* subtract a negative from a negative. */ /* First, take the difference between their */ /* magnitudes, then... */ if (mp_cmp_mag (a, b) != MP_LT) { /* Copy the sign from the first */ c->sign = sa; /* The first has a larger or equal magnitude */ res = s_mp_sub (a, b, c); } else { /* The result has the *opposite* sign from */ /* the first number. */ c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; /* The second has a larger magnitude */ res = s_mp_sub (b, a, c); } } return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_sub_d.c000066400000000000000000000040321225523575400211530ustar00rootroot00000000000000#include #ifdef BN_MP_SUB_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* single digit subtraction */ int mp_sub_d (mp_int * a, mp_digit b, mp_int * c) { mp_digit *tmpa, *tmpc, mu; int res, ix, oldused; /* grow c as required */ if (c->alloc < a->used + 1) { if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { return res; } } /* if a is negative just do an unsigned * addition [with fudged signs] */ if (a->sign == MP_NEG) { a->sign = MP_ZPOS; res = mp_add_d(a, b, c); a->sign = c->sign = MP_NEG; /* clamp */ mp_clamp(c); return res; } /* setup regs */ oldused = c->used; tmpa = a->dp; tmpc = c->dp; /* if a <= b simply fix the single digit */ if ((a->used == 1 && a->dp[0] <= b) || a->used == 0) { if (a->used == 1) { *tmpc++ = b - *tmpa; } else { *tmpc++ = b; } ix = 1; /* negative/1digit */ c->sign = MP_NEG; c->used = 1; } else { /* positive/size */ c->sign = MP_ZPOS; c->used = a->used; /* subtract first digit */ *tmpc = *tmpa++ - b; mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); *tmpc++ &= MP_MASK; /* handle rest of the digits */ for (ix = 1; ix < a->used; ix++) { *tmpc = *tmpa++ - mu; mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); *tmpc++ &= MP_MASK; } } /* zero excess digits */ while (ix++ < oldused) { *tmpc++ = 0; } mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_submod.c000066400000000000000000000016431225523575400213550ustar00rootroot00000000000000#include #ifdef BN_MP_SUBMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a - b (mod c) */ int mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_sub (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_to_signed_bin.c000066400000000000000000000015571225523575400226730ustar00rootroot00000000000000#include #ifdef BN_MP_TO_SIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in signed [big endian] format */ int mp_to_signed_bin (mp_int * a, unsigned char *b) { int res; if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { return res; } b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_to_signed_bin_n.c000066400000000000000000000015721225523575400232050ustar00rootroot00000000000000#include #ifdef BN_MP_TO_SIGNED_BIN_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in signed [big endian] format */ int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) { if (*outlen < (unsigned long)mp_signed_bin_size(a)) { return MP_VAL; } *outlen = mp_signed_bin_size(a); return mp_to_signed_bin(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_to_unsigned_bin.c000066400000000000000000000022171225523575400232300ustar00rootroot00000000000000#include #ifdef BN_MP_TO_UNSIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in unsigned [big endian] format */ int mp_to_unsigned_bin (mp_int * a, unsigned char *b) { int x, res; mp_int t; if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } x = 0; while (mp_iszero (&t) == 0) { #ifndef MP_8BIT b[x++] = (unsigned char) (t.dp[0] & 255); #else b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); #endif if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { mp_clear (&t); return res; } } bn_reverse (b, x); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_to_unsigned_bin_n.c000066400000000000000000000016061225523575400235460ustar00rootroot00000000000000#include #ifdef BN_MP_TO_UNSIGNED_BIN_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in unsigned [big endian] format */ int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) { if (*outlen < (unsigned long)mp_unsigned_bin_size(a)) { return MP_VAL; } *outlen = mp_unsigned_bin_size(a); return mp_to_unsigned_bin(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_toom_mul.c000066400000000000000000000156221225523575400217210ustar00rootroot00000000000000#include #ifdef BN_MP_TOOM_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplication using the Toom-Cook 3-way algorithm * * Much more complicated than Karatsuba but has a lower * asymptotic running time of O(N**1.464). This algorithm is * only particularly useful on VERY large inputs * (we're talking 1000s of digits here...). */ int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) { mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; int res, B; /* init temps */ if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { return res; } /* B */ B = MIN(a->used, b->used) / 3; /* a = a2 * B**2 + a1 * B + a0 */ if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { goto ERR; } if ((res = mp_copy(a, &a1)) != MP_OKAY) { goto ERR; } mp_rshd(&a1, B); mp_mod_2d(&a1, DIGIT_BIT * B, &a1); if ((res = mp_copy(a, &a2)) != MP_OKAY) { goto ERR; } mp_rshd(&a2, B*2); /* b = b2 * B**2 + b1 * B + b0 */ if ((res = mp_mod_2d(b, DIGIT_BIT * B, &b0)) != MP_OKAY) { goto ERR; } if ((res = mp_copy(b, &b1)) != MP_OKAY) { goto ERR; } mp_rshd(&b1, B); mp_mod_2d(&b1, DIGIT_BIT * B, &b1); if ((res = mp_copy(b, &b2)) != MP_OKAY) { goto ERR; } mp_rshd(&b2, B*2); /* w0 = a0*b0 */ if ((res = mp_mul(&a0, &b0, &w0)) != MP_OKAY) { goto ERR; } /* w4 = a2 * b2 */ if ((res = mp_mul(&a2, &b2, &w4)) != MP_OKAY) { goto ERR; } /* w1 = (a2 + 2(a1 + 2a0))(b2 + 2(b1 + 2b0)) */ if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&b0, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp2, &b2, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w1)) != MP_OKAY) { goto ERR; } /* w3 = (a0 + 2(a1 + 2a2))(b0 + 2(b1 + 2b2)) */ if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&b2, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w3)) != MP_OKAY) { goto ERR; } /* w2 = (a2 + a1 + a0)(b2 + b1 + b0) */ if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&b2, &b1, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { goto ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w2)) != MP_OKAY) { goto ERR; } /* now solve the matrix 0 0 0 0 1 1 2 4 8 16 1 1 1 1 1 16 8 4 2 1 1 0 0 0 0 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication */ /* r1 - r4 */ if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r0 */ if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { goto ERR; } /* r1/2 */ if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { goto ERR; } /* r3/2 */ if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { goto ERR; } /* r2 - r0 - r4 */ if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { goto ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto ERR; } /* r1 - 8r0 */ if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { goto ERR; } /* r3 - 8r4 */ if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { goto ERR; } /* 3r2 - r1 - r3 */ if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { goto ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto ERR; } /* r1/3 */ if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { goto ERR; } /* r3/3 */ if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { goto ERR; } /* at this point shift W[n] by B*n */ if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w0, &w1, c)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, c, c)) != MP_OKAY) { goto ERR; } ERR: mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_toom_sqr.c000066400000000000000000000123071225523575400217260ustar00rootroot00000000000000#include #ifdef BN_MP_TOOM_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* squaring using Toom-Cook 3-way algorithm */ int mp_toom_sqr(mp_int *a, mp_int *b) { mp_int w0, w1, w2, w3, w4, tmp1, a0, a1, a2; int res, B; /* init temps */ if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL)) != MP_OKAY) { return res; } /* B */ B = a->used / 3; /* a = a2 * B**2 + a1 * B + a0 */ if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { goto ERR; } if ((res = mp_copy(a, &a1)) != MP_OKAY) { goto ERR; } mp_rshd(&a1, B); mp_mod_2d(&a1, DIGIT_BIT * B, &a1); if ((res = mp_copy(a, &a2)) != MP_OKAY) { goto ERR; } mp_rshd(&a2, B*2); /* w0 = a0*a0 */ if ((res = mp_sqr(&a0, &w0)) != MP_OKAY) { goto ERR; } /* w4 = a2 * a2 */ if ((res = mp_sqr(&a2, &w4)) != MP_OKAY) { goto ERR; } /* w1 = (a2 + 2(a1 + 2a0))**2 */ if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sqr(&tmp1, &w1)) != MP_OKAY) { goto ERR; } /* w3 = (a0 + 2(a1 + 2a2))**2 */ if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sqr(&tmp1, &w3)) != MP_OKAY) { goto ERR; } /* w2 = (a2 + a1 + a0)**2 */ if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sqr(&tmp1, &w2)) != MP_OKAY) { goto ERR; } /* now solve the matrix 0 0 0 0 1 1 2 4 8 16 1 1 1 1 1 16 8 4 2 1 1 0 0 0 0 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication. */ /* r1 - r4 */ if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r0 */ if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { goto ERR; } /* r1/2 */ if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { goto ERR; } /* r3/2 */ if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { goto ERR; } /* r2 - r0 - r4 */ if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { goto ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto ERR; } /* r1 - 8r0 */ if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { goto ERR; } /* r3 - 8r4 */ if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { goto ERR; } /* 3r2 - r1 - r3 */ if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { goto ERR; } if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { goto ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto ERR; } /* r1/3 */ if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { goto ERR; } /* r3/3 */ if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { goto ERR; } /* at this point shift W[n] by B*n */ if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { goto ERR; } if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w0, &w1, b)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { goto ERR; } if ((res = mp_add(&tmp1, b, b)) != MP_OKAY) { goto ERR; } ERR: mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_toradix.c000066400000000000000000000032151225523575400215330ustar00rootroot00000000000000#include #ifdef BN_MP_TORADIX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* stores a bignum as a ASCII string in a given radix (2..64) */ int mp_toradix (mp_int * a, char *str, int radix) { int res, digs; mp_int t; mp_digit d; char *_s = str; /* check range of the radix */ if (radix < 2 || radix > 64) { return MP_VAL; } /* quick out if its zero */ if (mp_iszero(a) == 1) { *str++ = '0'; *str = '\0'; return MP_OKAY; } if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* if it is negative output a - */ if (t.sign == MP_NEG) { ++_s; *str++ = '-'; t.sign = MP_ZPOS; } digs = 0; while (mp_iszero (&t) == 0) { if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points * to the first digit [exluding the sign] of the number] */ bn_reverse ((unsigned char *)_s, digs); /* append a NULL so the string is properly terminated */ *str = '\0'; mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_toradix_n.c000066400000000000000000000037411225523575400220540ustar00rootroot00000000000000#include #ifdef BN_MP_TORADIX_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* stores a bignum as a ASCII string in a given radix (2..64) * * Stores upto maxlen-1 chars and always a NULL byte */ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) { int res, digs; mp_int t; mp_digit d; char *_s = str; /* check range of the maxlen, radix */ if (maxlen < 2 || radix < 2 || radix > 64) { return MP_VAL; } /* quick out if its zero */ if (mp_iszero(a) == MP_YES) { *str++ = '0'; *str = '\0'; return MP_OKAY; } if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* if it is negative output a - */ if (t.sign == MP_NEG) { /* we have to reverse our digits later... but not the - sign!! */ ++_s; /* store the flag and mark the number as positive */ *str++ = '-'; t.sign = MP_ZPOS; /* subtract a char */ --maxlen; } digs = 0; while (mp_iszero (&t) == 0) { if (--maxlen < 1) { /* no more room */ break; } if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points * to the first digit [exluding the sign] of the number */ bn_reverse ((unsigned char *)_s, digs); /* append a NULL so the string is properly terminated */ *str = '\0'; mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_unsigned_bin_size.c000066400000000000000000000014251225523575400235600ustar00rootroot00000000000000#include #ifdef BN_MP_UNSIGNED_BIN_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the size for an unsigned equivalent */ int mp_unsigned_bin_size (mp_int * a) { int size = mp_count_bits (a); return (size / 8 + ((size & 7) != 0 ? 1 : 0)); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_xor.c000066400000000000000000000021251225523575400206700ustar00rootroot00000000000000#include #ifdef BN_MP_XOR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* XOR two ints together */ int mp_xor (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] ^= x->dp[ix]; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_mp_zero.c000066400000000000000000000014301225523575400210350ustar00rootroot00000000000000#include #ifdef BN_MP_ZERO_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set to zero */ void mp_zero (mp_int * a) { int n; mp_digit *tmp; a->sign = MP_ZPOS; a->used = 0; tmp = a->dp; for (n = 0; n < a->alloc; n++) { *tmp++ = 0; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_prime_tab.c000066400000000000000000000053351225523575400213340ustar00rootroot00000000000000#include #ifdef BN_PRIME_TAB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ const mp_digit ltm_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, #ifndef MP_8BIT 0x0083, 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 #endif }; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_reverse.c000066400000000000000000000015301225523575400210360ustar00rootroot00000000000000#include #ifdef BN_REVERSE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reverse an array, used for radix code */ void bn_reverse (unsigned char *s, int len) { int ix, iy; unsigned char t; ix = 0; iy = len - 1; while (ix < iy) { t = s[ix]; s[ix] = s[iy]; s[iy] = t; ++ix; --iy; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_add.c000066400000000000000000000045131225523575400211350ustar00rootroot00000000000000#include #ifdef BN_S_MP_ADD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level addition, based on HAC pp.594, Algorithm 14.7 */ int s_mp_add (mp_int * a, mp_int * b, mp_int * c) { mp_int *x; int olduse, res, min, max; /* find sizes, we let |a| <= |b| which means we have to sort * them. "x" will point to the input with the most digits */ if (a->used > b->used) { min = b->used; max = a->used; x = a; } else { min = a->used; max = b->used; x = b; } /* init result */ if (c->alloc < max + 1) { if ((res = mp_grow (c, max + 1)) != MP_OKAY) { return res; } } /* get old used digit count and set new one */ olduse = c->used; c->used = max + 1; { register mp_digit u, *tmpa, *tmpb, *tmpc; register int i; /* alias for digit pointers */ /* first input */ tmpa = a->dp; /* second input */ tmpb = b->dp; /* destination */ tmpc = c->dp; /* zero the carry */ u = 0; for (i = 0; i < min; i++) { /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ *tmpc = *tmpa++ + *tmpb++ + u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)DIGIT_BIT); /* take away carry bit from T[i] */ *tmpc++ &= MP_MASK; } /* now copy higher words if any, that is in A+B * if A or B has more digits add those in */ if (min != max) { for (; i < max; i++) { /* T[i] = X[i] + U */ *tmpc = x->dp[i] + u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)DIGIT_BIT); /* take away carry bit from T[i] */ *tmpc++ &= MP_MASK; } } /* add carry */ *tmpc++ = u; /* clear digits above oldused */ for (i = c->used; i < olduse; i++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_exptmod.c000066400000000000000000000136451225523575400220730ustar00rootroot00000000000000#include #ifdef BN_S_MP_EXPTMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #ifdef MP_LOW_MEM #define TAB_SIZE 32 #else #define TAB_SIZE 256 #endif int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { mp_int M[TAB_SIZE], res, mu; mp_digit buf; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; int (*redux)(mp_int*,mp_int*,mp_int*); /* find window size */ x = mp_count_bits (X); if (x <= 7) { winsize = 2; } else if (x <= 36) { winsize = 3; } else if (x <= 140) { winsize = 4; } else if (x <= 450) { winsize = 5; } else if (x <= 1303) { winsize = 6; } else if (x <= 3529) { winsize = 7; } else { winsize = 8; } #ifdef MP_LOW_MEM if (winsize > 5) { winsize = 5; } #endif /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { return err; } /* now init the second half of the array */ for (x = 1<<(winsize-1); x < (1 << winsize); x++) { if ((err = mp_init(&M[x])) != MP_OKAY) { for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } mp_clear(&M[1]); return err; } } /* create mu, used for Barrett reduction */ if ((err = mp_init (&mu)) != MP_OKAY) { goto LBL_M; } if (redmode == 0) { if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { goto LBL_MU; } redux = mp_reduce; } else { if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) { goto LBL_MU; } redux = mp_reduce_2k_l; } /* create M table * * The M table contains powers of the base, * e.g. M[x] = G**x mod P * * The first half of the table is not * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { goto LBL_MU; } /* compute the value at M[1<<(winsize-1)] by squaring * M[1] (winsize-1) times */ if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } for (x = 0; x < (winsize - 1); x++) { /* square it */ if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } /* reduce modulo P */ if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { goto LBL_MU; } } /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) */ for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { goto LBL_MU; } if ((err = redux (&M[x], P, &mu)) != MP_OKAY) { goto LBL_MU; } } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { goto LBL_MU; } mp_set (&res, 1); /* set initial mode and bit cnt */ mode = 0; bitcnt = 1; buf = 0; digidx = X->used - 1; bitcpy = 0; bitbuf = 0; for (;;) { /* grab next digit as required */ if (--bitcnt == 0) { /* if digidx == -1 we are out of digits */ if (digidx == -1) { break; } /* read next digit and reset the bitcnt */ buf = X->dp[digidx--]; bitcnt = (int) DIGIT_BIT; } /* grab the next msb from the exponent */ y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; buf <<= (mp_digit)1; /* if the bit is zero and mode == 0 then we ignore it * These represent the leading zero bits before the first 1 bit * in the exponent. Technically this opt is not required but it * does lower the # of trivial squaring/reductions used */ if (mode == 0 && y == 0) { continue; } /* if the bit is zero and mode == 1 then we square */ if (mode == 1 && y == 0) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } continue; } /* else we add it to the window */ bitbuf |= (y << (winsize - ++bitcpy)); mode = 2; if (bitcpy == winsize) { /* ok window is filled so square as required and multiply */ /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } /* empty window and reset */ bitcpy = 0; bitbuf = 0; mode = 1; } } /* if bits remain then square/multiply */ if (mode == 2 && bitcpy > 0) { /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } } } } mp_exch (&res, Y); err = MP_OKAY; LBL_RES:mp_clear (&res); LBL_MU:mp_clear (&mu); LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_mul_digs.c000066400000000000000000000046031225523575400222100ustar00rootroot00000000000000#include #ifdef BN_S_MP_MUL_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplies |a| * |b| and only computes upto digs digits of result * HAC pp. 595, Algorithm 14.12 Modified so you can control how * many digits of output are created. */ int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { mp_int t; int res, pa, pb, ix, iy; mp_digit u; mp_word r; mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ if (((digs) < MP_WARRAY) && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_s_mp_mul_digs (a, b, c, digs); } if ((res = mp_init_size (&t, digs)) != MP_OKAY) { return res; } t.used = digs; /* compute the digits of the product directly */ pa = a->used; for (ix = 0; ix < pa; ix++) { /* set the carry to zero */ u = 0; /* limit ourselves to making digs digits of output */ pb = MIN (b->used, digs - ix); /* setup some aliases */ /* copy of the digit from a used within the nested loop */ tmpx = a->dp[ix]; /* an alias for the destination shifted ix places */ tmpt = t.dp + ix; /* an alias for the digits of b */ tmpy = b->dp; /* compute the columns of the output and propagate the carry */ for (iy = 0; iy < pb; iy++) { /* compute the column as a mp_word */ r = ((mp_word)*tmpt) + ((mp_word)tmpx) * ((mp_word)*tmpy++) + ((mp_word) u); /* the new column is the lower part of the result */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* get the carry word from the result */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } /* set carry if it is placed below digs */ if (ix + iy < digs) { *tmpt = u; } } mp_clamp (&t); mp_exch (&t, c); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_mul_high_digs.c000066400000000000000000000041421225523575400232050ustar00rootroot00000000000000#include #ifdef BN_S_MP_MUL_HIGH_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplies |a| * |b| and does not compute the lower digs digits * [meant to get the higher part of the product] */ int s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { mp_int t; int res, pa, pb, ix, iy; mp_digit u; mp_word r; mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C if (((a->used + b->used + 1) < MP_WARRAY) && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_s_mp_mul_high_digs (a, b, c, digs); } #endif if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { return res; } t.used = a->used + b->used + 1; pa = a->used; pb = b->used; for (ix = 0; ix < pa; ix++) { /* clear the carry */ u = 0; /* left hand side of A[ix] * B[iy] */ tmpx = a->dp[ix]; /* alias to the address of where the digits will be stored */ tmpt = &(t.dp[digs]); /* alias for where to read the right hand side from */ tmpy = b->dp + (digs - ix); for (iy = digs - ix; iy < pb; iy++) { /* calculate the double precision result */ r = ((mp_word)*tmpt) + ((mp_word)tmpx) * ((mp_word)*tmpy++) + ((mp_word) u); /* get the lower part */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* carry the carry */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } *tmpt = u; } mp_clamp (&t); mp_exch (&t, c); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_sqr.c000066400000000000000000000043771225523575400212220ustar00rootroot00000000000000#include #ifdef BN_S_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ int s_mp_sqr (mp_int * a, mp_int * b) { mp_int t; int res, ix, iy, pa; mp_word r; mp_digit u, tmpx, *tmpt; pa = a->used; if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { return res; } /* default used is maximum possible size */ t.used = 2*pa + 1; for (ix = 0; ix < pa; ix++) { /* first calculate the digit at 2*ix */ /* calculate double precision result */ r = ((mp_word) t.dp[2*ix]) + ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); /* store lower part in result */ t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); /* get the carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); /* left hand side of A[ix] * A[iy] */ tmpx = a->dp[ix]; /* alias for where to store the results */ tmpt = t.dp + (2*ix + 1); for (iy = ix + 1; iy < pa; iy++) { /* first calculate the product */ r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); /* now calculate the double precision result, note we use * addition instead of *2 since it's easier to optimize */ r = ((mp_word) *tmpt) + r + r + ((mp_word) u); /* store lower part */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* get carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); } /* propagate upwards */ while (u != ((mp_digit) 0)) { r = ((mp_word) *tmpt) + ((mp_word) u); *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); } } mp_clamp (&t); mp_exch (&t, b); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bn_s_mp_sub.c000066400000000000000000000041641225523575400212000ustar00rootroot00000000000000#include #ifdef BN_S_MP_SUB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ int s_mp_sub (mp_int * a, mp_int * b, mp_int * c) { int olduse, res, min, max; /* find sizes */ min = b->used; max = a->used; /* init result */ if (c->alloc < max) { if ((res = mp_grow (c, max)) != MP_OKAY) { return res; } } olduse = c->used; c->used = max; { register mp_digit u, *tmpa, *tmpb, *tmpc; register int i; /* alias for digit pointers */ tmpa = a->dp; tmpb = b->dp; tmpc = c->dp; /* set carry to zero */ u = 0; for (i = 0; i < min; i++) { /* T[i] = A[i] - B[i] - U */ *tmpc = *tmpa++ - *tmpb++ - u; /* U = carry bit of T[i] * Note this saves performing an AND operation since * if a carry does occur it will propagate all the way to the * MSB. As a result a single shift is enough to get the carry */ u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); /* Clear carry from T[i] */ *tmpc++ &= MP_MASK; } /* now copy higher words if any, e.g. if A has more digits than B */ for (; i < max; i++) { /* T[i] = A[i] - U */ *tmpc = *tmpa++ - u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); /* Clear carry from T[i] */ *tmpc++ &= MP_MASK; } /* clear digits above used (since we may not have grown result above) */ for (i = c->used; i < olduse; i++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/bncore.c000066400000000000000000000023621225523575400201600ustar00rootroot00000000000000#include #ifdef BNCORE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Known optimal configurations CPU /Compiler /MUL CUTOFF/SQR CUTOFF ------------------------------------------------------------- Intel P4 Northwood /GCC v3.4.1 / 88/ 128/LTM 0.32 ;-) AMD Athlon64 /GCC v3.4.4 / 80/ 120/LTM 0.35 */ int KARATSUBA_MUL_CUTOFF = 80, /* Min. number of digits before Karatsuba multiplication is used. */ KARATSUBA_SQR_CUTOFF = 120, /* Min. number of digits before Karatsuba squaring is used. */ TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ TOOM_SQR_CUTOFF = 400; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/changes.txt000066400000000000000000000602431225523575400207170ustar00rootroot00000000000000July 23rd, 2010 v0.42.0 -- Fix for mp_prime_next_prime() bug when checking generated prime -- allow mp_shrink to shrink initialized, but empty MPI's -- Added project and solution files for Visual Studio 2005 and Visual Studio 2008. March 10th, 2007 v0.41 -- Wolfgang Ehrhardt suggested a quick fix to mp_div_d() which makes the detection of powers of two quicker. -- [CRI] Added libtommath.dsp for Visual C++ users. December 24th, 2006 v0.40 -- Updated makefile to properly support LIBNAME -- Fixed bug in fast_s_mp_mul_high_digs() which overflowed (line 83), thanks Valgrind! April 4th, 2006 v0.39 -- Jim Wigginton pointed out my Montgomery examples in figures 6.4 and 6.6 were off by one, k should be 9 not 8 -- Bruce Guenter suggested I use --tag=CC for libtool builds where the compiler may think it's C++. -- "mm" from sci.crypt pointed out that my mp_gcd was sub-optimal (I also updated and corrected the book) -- updated some of the @@ tags in tommath.src to reflect source changes. -- updated email and url info in all source files Jan 26th, 2006 v0.38 -- broken makefile.shared fixed -- removed some carry stores that were not required [updated text] November 18th, 2005 v0.37 -- [Don Porter] reported on a TCL list [HEY SEND ME BUGREPORTS ALREADY!!!] that mp_add_d() would compute -0 with some inputs. Fixed. -- [rinick@gmail.com] reported the makefile.bcc was messed up. Fixed. -- [Kevin Kenny] reported some issues with mp_toradix_n(). Now it doesn't require a min of 3 chars of output. -- Made the make command renamable. Wee August 1st, 2005 v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed. -- [Peter LaDow] found a typo in the XREALLOC macro -- [Peter LaDow] pointed out that mp_read_(un)signed_bin should have "const" on the input -- Ported LTC patch to fix the prime_random_ex() function to get the bitsize correct [and the maskOR flags] -- Kevin Kenny pointed out a stray // -- David Hulton pointed out a typo in the textbook [mp_montgomery_setup() pseudo-code] -- Neal Hamilton (Elliptic Semiconductor) pointed out that my Karatsuba notation was backwards and that I could use unsigned operations in the routine. -- Paul Schmidt pointed out a linking error in mp_exptmod() when BN_S_MP_EXPTMOD_C is undefined (and another for read_radix) -- Updated makefiles to be way more flexible March 12th, 2005 v0.35 -- Stupid XOR function missing line again... oops. -- Fixed bug in invmod not handling negative inputs correctly [Wolfgang Ehrhardt] -- Made exteuclid always give positive u3 output...[ Wolfgang Ehrhardt ] -- [Wolfgang Ehrhardt] Suggested a fix for mp_reduce() which avoided underruns. ;-) -- mp_rand() would emit one too many digits and it was possible to get a 0 out of it ... oops -- Added montgomery to the testing to make sure it handles 1..10 digit moduli correctly -- Fixed bug in comba that would lead to possible erroneous outputs when "pa < digs" -- Fixed bug in mp_toradix_size for "0" [Kevin Kenny] -- Updated chapters 1-5 of the textbook ;-) It now talks about the new comba code! February 12th, 2005 v0.34 -- Fixed two more small errors in mp_prime_random_ex() -- Fixed overflow in mp_mul_d() [Kevin Kenny] -- Added mp_to_(un)signed_bin_n() functions which do bounds checking for ya [and report the size] -- Added "large" diminished radix support. Speeds up things like DSA where the moduli is of the form 2^k - P for some P < 2^(k/2) or so Actually is faster than Montgomery on my AMD64 (and probably much faster on a P4) -- Updated the manual a bit -- Ok so I haven't done the textbook work yet... My current freelance gig has landed me in France till the end of Feb/05. Once I get back I'll have tons of free time and I plan to go to town on the book. As of this release the API will freeze. At least until the book catches up with all the changes. I welcome bug reports but new algorithms will have to wait. December 23rd, 2004 v0.33 -- Fixed "small" variant for mp_div() which would munge with negative dividends... -- Fixed bug in mp_prime_random_ex() which would set the most significant byte to zero when no special flags were set -- Fixed overflow [minor] bug in fast_s_mp_sqr() -- Made the makefiles easier to configure the group/user that ltm will install as -- Fixed "final carry" bug in comba multipliers. (Volkan Ceylan) -- Matt Johnston pointed out a missing semi-colon in mp_exptmod October 29th, 2004 v0.32 -- Added "makefile.shared" for shared object support -- Added more to the build options/configs in the manual -- Started the Depends framework, wrote dep.pl to scan deps and produce "callgraph.txt" ;-) -- Wrote SC_RSA_1 which will enable close to the minimum required to perform RSA on 32-bit [or 64-bit] platforms with LibTomCrypt -- Merged in the small/slower mp_div replacement. You can now toggle which you want to use as your mp_div() at build time. Saves roughly 8KB or so. -- Renamed a few files and changed some comments to make depends system work better. (No changes to function names) -- Merged in new Combas that perform 2 reads per inner loop instead of the older 3reads/2writes per inner loop of the old code. Really though if you want speed learn to use TomsFastMath ;-) August 9th, 2004 v0.31 -- "profiled" builds now :-) new timings for Intel Northwoods -- Added "pretty" build target -- Update mp_init() to actually assign 0's instead of relying on calloc() -- "Wolfgang Ehrhardt" found a bug in mp_mul() where if you multiply a negative by zero you get negative zero as the result. Oops. -- J Harper from PeerSec let me toy with his AMD64 and I got 60-bit digits working properly [this also means that I fixed a bug where if sizeof(int) < sizeof(mp_digit) it would bug] April 11th, 2004 v0.30 -- Added "mp_toradix_n" which stores upto "n-1" least significant digits of an mp_int -- Johan Lindh sent a patch so MSVC wouldn't whine about redefining malloc [in weird dll modes] -- Henrik Goldman spotted a missing OPT_CAST in mp_fwrite() -- Tuned tommath.h so that when MP_LOW_MEM is defined MP_PREC shall be reduced. [I also allow MP_PREC to be externally defined now] -- Sped up mp_cnt_lsb() by using a 4x4 table [e.g. 4x speedup] -- Added mp_prime_random_ex() which is a more versatile prime generator accurate to exact bit lengths (unlike the deprecated but still available mp_prime_random() which is only accurate to byte lengths). See the new LTM_PRIME_* flags ;-) -- Alex Polushin contributed an optimized mp_sqrt() as well as mp_get_int() and mp_is_square(). I've cleaned them all up to be a little more consistent [along with one bug fix] for this release. -- Added mp_init_set and mp_init_set_int to initialize and set small constants with one function call. -- Removed /etclib directory [um LibTomPoly deprecates this]. -- Fixed mp_mod() so the sign of the result agrees with the sign of the modulus. ++ N.B. My semester is almost up so expect updates to the textbook to be posted to the libtomcrypt.org website. Jan 25th, 2004 v0.29 ++ Note: "Henrik" from the v0.28 changelog refers to Henrik Goldman ;-) -- Added fix to mp_shrink to prevent a realloc when used == 0 [e.g. realloc zero bytes???] -- Made the mp_prime_rabin_miller_trials() function internal table smaller and also set the minimum number of tests to two (sounds a bit safer). -- Added a mp_exteuclid() which computes the extended euclidean algorithm. -- Fixed a memory leak in s_mp_exptmod() [called when Barrett reduction is to be used] which would arise if a multiplication or subsequent reduction failed [would not free the temp result]. -- Made an API change to mp_radix_size(). It now returns an error code and stores the required size through an "int star" passed to it. Dec 24th, 2003 v0.28 -- Henrik Goldman suggested I add casts to the montomgery code [stores into mu...] so compilers wouldn't spew [erroneous] diagnostics... fixed. -- Henrik Goldman also spotted two typos. One in mp_radix_size() and another in mp_toradix(). -- Added fix to mp_shrink() to avoid a memory leak. -- Added mp_prime_random() which requires a callback to make truly random primes of a given nature (idea from chat with Niels Ferguson at Crypto'03) -- Picked up a second wind. I'm filled with Gooo. Mission Gooo! -- Removed divisions from mp_reduce_is_2k() -- Sped up mp_div_d() [general case] to use only one division per digit instead of two. -- Added the heap macros from LTC to LTM. Now you can easily [by editing four lines of tommath.h] change the name of the heap functions used in LTM [also compatible with LTC via MPI mode] -- Added bn_prime_rabin_miller_trials() which gives the number of Rabin-Miller trials to achieve a failure rate of less than 2^-96 -- fixed bug in fast_mp_invmod(). The initial testing logic was wrong. An invalid input is not when "a" and "b" are even it's when "b" is even [the algo is for odd moduli only]. -- Started a new manual [finally]. It is incomplete and will be finished as time goes on. I had to stop adding full demos around half way in chapter three so I could at least get a good portion of the manual done. If you really need help using the library you can always email me! -- My Textbook is now included as part of the package [all Public Domain] Sept 19th, 2003 v0.27 -- Removed changes.txt~ which was made by accident since "kate" decided it was a good time to re-enable backups... [kde is fun!] -- In mp_grow() "a->dp" is not overwritten by realloc call [re: memory leak] Now if mp_grow() fails the mp_int is still valid and can be cleared via mp_clear() to reclaim the memory. -- Henrik Goldman found a buffer overflow bug in mp_add_d(). Fixed. -- Cleaned up mp_mul_d() to be much easier to read and follow. Aug 29th, 2003 v0.26 -- Fixed typo that caused warning with GCC 3.2 -- Martin Marcel noticed a bug in mp_neg() that allowed negative zeroes. Also, Martin is the fellow who noted the bugs in mp_gcd() of 0.24/0.25. -- Martin Marcel noticed an optimization [and slight bug] in mp_lcm(). -- Added fix to mp_read_unsigned_bin to prevent a buffer overflow. -- Beefed up the comments in the baseline multipliers [and montgomery] -- Added "mont" demo to the makefile.msvc in etc/ -- Optimized sign compares in mp_cmp from 4 to 2 cases. Aug 4th, 2003 v0.25 -- Fix to mp_gcd again... oops (0,-a) == (-a, 0) == a -- Fix to mp_clear which didn't reset the sign [Greg Rose] -- Added mp_error_to_string() to convert return codes to strings. [Greg Rose] -- Optimized fast_mp_invmod() to do the test for invalid inputs [both even] first so temps don't have to be initialized if it's going to fail. -- Optimized mp_gcd() by removing mp_div_2d calls for when one of the inputs is odd. -- Tons of new comments, some indentation fixups, etc. -- mp_jacobi() returns MP_VAL if the modulus is less than or equal to zero. -- fixed two typos in the header of each file :-) -- LibTomMath is officially Public Domain [see LICENSE] July 15th, 2003 v0.24 -- Optimized mp_add_d and mp_sub_d to not allocate temporary variables -- Fixed mp_gcd() so the gcd of 0,0 is 0. Allows the gcd operation to be chained e.g. (0,0,a) == a [instead of 1] -- Should be one of the last release for a while. Working on LibTomMath book now. -- optimized the pprime demo [/etc/pprime.c] to first make a huge table of single digit primes then it reads them randomly instead of randomly choosing/testing single digit primes. July 12th, 2003 v0.23 -- Optimized mp_prime_next_prime() to not use mp_mod [via is_divisible()] in each iteration. Instead now a smaller table is kept of the residues which can be updated without division. -- Fixed a bug in next_prime() where an input of zero would be treated as odd and have two added to it [to move to the next odd]. -- fixed a bug in prime_fermat() and prime_miller_rabin() which allowed the base to be negative, zero or one. Normally the test is only valid if the base is greater than one. -- changed the next_prime() prototype to accept a new parameter "bbs_style" which will find the next prime congruent to 3 mod 4. The default [bbs_style==0] will make primes which are either congruent to 1 or 3 mod 4. -- fixed mp_read_unsigned_bin() so that it doesn't include both code for the case DIGIT_BIT < 8 and >= 8 -- optimized div_d() to easy out on division by 1 [or if a == 0] and use logical shifts if the divisor is a power of two. -- the default DIGIT_BIT type was not int for non-default builds. Fixed. July 2nd, 2003 v0.22 -- Fixed up mp_invmod so the result is properly in range now [was always congruent to the inverse...] -- Fixed up s_mp_exptmod and mp_exptmod_fast so the lower half of the pre-computed table isn't allocated which makes the algorithm use half as much ram. -- Fixed the install script not to make the book :-) [which isn't included anyways] -- added mp_cnt_lsb() which counts how many of the lsbs are zero -- optimized mp_gcd() to use the new mp_cnt_lsb() to replace multiple divisions by two by a single division. -- applied similar optimization to mp_prime_miller_rabin(). -- Fixed a bug in both mp_invmod() and fast_mp_invmod() which tested for odd via "mp_iseven() == 0" which is not valid [since zero is not even either]. June 19th, 2003 v0.21 -- Fixed bug in mp_mul_d which would not handle sign correctly [would not always forward it] -- Removed the #line lines from gen.pl [was in violation of ISO C] June 8th, 2003 v0.20 -- Removed the book from the package. Added the TDCAL license document. -- This release is officially pure-bred TDCAL again [last officially TDCAL based release was v0.16] June 6th, 2003 v0.19 -- Fixed a bug in mp_montgomery_reduce() which was introduced when I tweaked mp_rshd() in the previous release. Essentially the digits were not trimmed before the compare which cause a subtraction to occur all the time. -- Fixed up etc/tune.c a bit to stop testing new cutoffs after 16 failures [to find more optimal points]. Brute force ho! May 29th, 2003 v0.18 -- Fixed a bug in s_mp_sqr which would handle carries properly just not very elegantly. (e.g. correct result, just bad looking code) -- Fixed bug in mp_sqr which still had a 512 constant instead of MP_WARRAY -- Added Toom-Cook multipliers [needs tuning!] -- Added efficient divide by 3 algorithm mp_div_3 -- Re-wrote mp_div_d to be faster than calling mp_div -- Added in a donated BCC makefile and a single page LTM poster (ahalhabsi@sbcglobal.net) -- Added mp_reduce_2k which reduces an input modulo n = 2**p - k for any single digit k -- Made the exptmod system be aware of the 2k reduction algorithms. -- Rewrote mp_dr_reduce to be smaller, simpler and easier to understand. May 17th, 2003 v0.17 -- Benjamin Goldberg submitted optimized mp_add and mp_sub routines. A new gen.pl as well as several smaller suggestions. Thanks! -- removed call to mp_cmp in inner loop of mp_div and put mp_cmp_mag in its place :-) -- Fixed bug in mp_exptmod that would cause it to fail for odd moduli when DIGIT_BIT != 28 -- mp_exptmod now also returns errors if the modulus is negative and will handle negative exponents -- mp_prime_is_prime will now return true if the input is one of the primes in the prime table -- Damian M Gryski (dgryski@uwaterloo.ca) found a index out of bounds error in the mp_fast_s_mp_mul_high_digs function which didn't come up before. (fixed) -- Refactored the DR reduction code so there is only one function per file. -- Fixed bug in the mp_mul() which would erroneously avoid the faster multiplier [comba] when it was allowed. The bug would not cause the incorrect value to be produced just less efficient (fixed) -- Fixed similar bug in the Montgomery reduction code. -- Added tons of (mp_digit) casts so the 7/15/28/31 bit digit code will work flawlessly out of the box. Also added limited support for 64-bit machines with a 60-bit digit. Both thanks to Tom Wu (tom@arcot.com) -- Added new comments here and there, cleaned up some code [style stuff] -- Fixed a lingering typo in mp_exptmod* that would set bitcnt to zero then one. Very silly stuff :-) -- Fixed up mp_exptmod_fast so it would set "redux" to the comba Montgomery reduction if allowed. This saves quite a few calls and if statements. -- Added etc/mont.c a test of the Montgomery reduction [assuming all else works :-| ] -- Fixed up etc/tune.c to use a wider test range [more appropriate] also added a x86 based addition which uses RDTSC for high precision timing. -- Updated demo/demo.c to remove MPI stuff [won't work anyways], made the tests run for 2 seconds each so its not so insanely slow. Also made the output space delimited [and fixed up various errors] -- Added logs directory, logs/graph.dem which will use gnuplot to make a series of PNG files that go with the pre-made index.html. You have to build [via make timing] and run ltmtest first in the root of the package. -- Fixed a bug in mp_sub and mp_add where "-a - -a" or "-a + a" would produce -0 as the result [obviously invalid]. -- Fixed a bug in mp_rshd. If the count == a.used it should zero/return [instead of shifting] -- Fixed a "off-by-one" bug in mp_mul2d. The initial size check on alloc would be off by one if the residue shifting caused a carry. -- Fixed a bug where s_mp_mul_digs() would not call the Comba based routine if allowed. This made Barrett reduction slower than it had to be. Mar 29th, 2003 v0.16 -- Sped up mp_div by making normalization one shift call -- Sped up mp_mul_2d/mp_div_2d by aliasing pointers :-) -- Cleaned up mp_gcd to use the macros for odd/even detection -- Added comments here and there, mostly there but occasionally here too. Mar 22nd, 2003 v0.15 -- Added series of prime testing routines to lib -- Fixed up etc/tune.c -- Added DR reduction algorithm -- Beefed up the manual more. -- Fixed up demo/demo.c so it doesn't have so many warnings and it does the full series of tests -- Added "pre-gen" directory which will hold a "gen.pl"'ed copy of the entire lib [done at zipup time so its always the latest] -- Added conditional casts for C++ users [boo!] Mar 15th, 2003 v0.14 -- Tons of manual updates -- cleaned up the directory -- added MSVC makefiles -- source changes [that I don't recall] -- Fixed up the lshd/rshd code to use pointer aliasing -- Fixed up the mul_2d and div_2d to not call rshd/lshd unless needed -- Fixed up etc/tune.c a tad -- fixed up demo/demo.c to output comma-delimited results of timing also fixed up timing demo to use a finer granularity for various functions -- fixed up demo/demo.c testing to pause during testing so my Duron won't catch on fire [stays around 31-35C during testing :-)] Feb 13th, 2003 v0.13 -- tons of minor speed-ups in low level add, sub, mul_2 and div_2 which propagate to other functions like mp_invmod, mp_div, etc... -- Sped up mp_exptmod_fast by using new code to find R mod m [e.g. B^n mod m] -- minor fixes Jan 17th, 2003 v0.12 -- re-wrote the majority of the makefile so its more portable and will install via "make install" on most *nix platforms -- Re-packaged all the source as seperate files. Means the library a single file packagage any more. Instead of just adding "bn.c" you have to add libtommath.a -- Renamed "bn.h" to "tommath.h" -- Changes to the manual to reflect all of this -- Used GNU Indent to clean up the source Jan 15th, 2003 v0.11 -- More subtle fixes -- Moved to gentoo linux [hurrah!] so made *nix specific fixes to the make process -- Sped up the montgomery reduction code quite a bit -- fixed up demo so when building timing for the x86 it assumes ELF format now Jan 9th, 2003 v0.10 -- Pekka Riikonen suggested fixes to the radix conversion code. -- Added baseline montgomery and comba montgomery reductions, sped up exptmods [to a point, see bn.h for MONTGOMERY_EXPT_CUTOFF] Jan 6th, 2003 v0.09 -- Updated the manual to reflect recent changes. :-) -- Added Jacobi function (mp_jacobi) to supplement the number theory side of the lib -- Added a Mersenne prime finder demo in ./etc/mersenne.c Jan 2nd, 2003 v0.08 -- Sped up the multipliers by moving the inner loop variables into a smaller scope -- Corrected a bunch of small "warnings" -- Added more comments -- Made "mtest" be able to use /dev/random, /dev/urandom or stdin for RNG data -- Corrected some bugs where error messages were potentially ignored -- add etc/pprime.c program which makes numbers which are provably prime. Jan 1st, 2003 v0.07 -- Removed alot of heap operations from core functions to speed them up -- Added a root finding function [and mp_sqrt macro like from MPI] -- Added more to manual Dec 31st, 2002 v0.06 -- Sped up the s_mp_add, s_mp_sub which inturn sped up mp_invmod, mp_exptmod, etc... -- Cleaned up the header a bit more Dec 30th, 2002 v0.05 -- Builds with MSVC out of the box -- Fixed a bug in mp_invmod w.r.t. even moduli -- Made mp_toradix and mp_read_radix use char instead of unsigned char arrays -- Fixed up exptmod to use fewer multiplications -- Fixed up mp_init_size to use only one heap operation -- Note there is a slight "off-by-one" bug in the library somewhere without the padding (see the source for comment) the library crashes in libtomcrypt. Anyways a reasonable workaround is to pad the numbers which will always correct it since as the numbers grow the padding will still be beyond the end of the number -- Added more to the manual Dec 29th, 2002 v0.04 -- Fixed a memory leak in mp_to_unsigned_bin -- optimized invmod code -- Fixed bug in mp_div -- use exchange instead of copy for results -- added a bit more to the manual Dec 27th, 2002 v0.03 -- Sped up s_mp_mul_high_digs by not computing the carries of the lower digits -- Fixed a bug where mp_set_int wouldn't zero the value first and set the used member. -- fixed a bug in s_mp_mul_high_digs where the limit placed on the result digits was not calculated properly -- fixed bugs in add/sub/mul/sqr_mod functions where if the modulus and dest were the same it wouldn't work -- fixed a bug in mp_mod and mp_mod_d concerning negative inputs -- mp_mul_d didn't preserve sign -- Many many many many fixes -- Works in LibTomCrypt now :-) -- Added iterations to the timing demos... more accurate. -- Tom needs a job. Dec 26th, 2002 v0.02 -- Fixed a few "slips" in the manual. This is "LibTomMath" afterall :-) -- Added mp_cmp_mag, mp_neg, mp_abs and mp_radix_size that were missing. -- Sped up the fast [comba] multipliers more [yahoo!] Dec 25th,2002 v0.01 -- Initial release. Gimme a break. -- Todo list, add details to manual [e.g. algorithms] more comments in code example programs nqp-2013.12.1/3rdparty/libtommath/tommath.h000066400000000000000000000416361225523575400203750ustar00rootroot00000000000000/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com */ #ifndef BN_H_ #define BN_H_ #include #include #include #include #include #include #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif #ifdef __cplusplus extern "C" { /* C++ compilers don't like assigning void * to mp_digit * */ #define OPT_CAST(x) (x *) #else /* C on the other hand doesn't care */ #define OPT_CAST(x) #endif /* detect 64-bit mode if possible */ #if defined(__x86_64__) #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) #define MP_64BIT #endif #endif /* some default configurations. * * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits * * At the very least a mp_digit must be able to hold 7 bits * [any size beyond that is ok provided it doesn't overflow the data type] */ #ifdef MP_8BIT typedef unsigned char mp_digit; typedef unsigned short mp_word; #elif defined(MP_16BIT) typedef unsigned short mp_digit; typedef unsigned long mp_word; #elif defined(MP_64BIT) /* for GCC only on supported platforms */ #ifndef CRYPT typedef unsigned long long ulong64; typedef signed long long long64; #endif typedef unsigned long mp_digit; typedef unsigned long mp_word __attribute__ ((mode(TI))); #define DIGIT_BIT 60 #else /* this is the default case, 28-bit digits */ /* this is to make porting into LibTomCrypt easier :-) */ #ifndef CRYPT #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 ulong64; typedef signed __int64 long64; #else typedef unsigned long long ulong64; typedef signed long long long64; #endif #endif typedef unsigned long mp_digit; typedef ulong64 mp_word; #ifdef MP_31BIT /* this is an extension that uses 31-bit digits */ #define DIGIT_BIT 31 #else /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ #define DIGIT_BIT 28 #define MP_28BIT #endif #endif /* define heap macros */ #ifndef CRYPT /* default to libc stuff */ #ifndef XMALLOC #define XMALLOC malloc #define XFREE free #define XREALLOC realloc #define XCALLOC calloc #else /* prototypes for our heap functions */ extern void *XMALLOC(size_t n); extern void *XREALLOC(void *p, size_t n); extern void *XCALLOC(size_t n, size_t s); extern void XFREE(void *p); #endif #endif /* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ #ifndef DIGIT_BIT #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */ #endif #define MP_DIGIT_BIT DIGIT_BIT #define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) #define MP_DIGIT_MAX MP_MASK /* equalities */ #define MP_LT -1 /* less than */ #define MP_EQ 0 /* equal to */ #define MP_GT 1 /* greater than */ #define MP_ZPOS 0 /* positive integer */ #define MP_NEG 1 /* negative */ #define MP_OKAY 0 /* ok result */ #define MP_MEM -2 /* out of mem */ #define MP_VAL -3 /* invalid input */ #define MP_RANGE MP_VAL #define MP_YES 1 /* yes response */ #define MP_NO 0 /* no response */ /* Primality generation flags */ #define LTM_PRIME_BBS 0x0001 /* BBS style prime */ #define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ #define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ typedef int mp_err; /* you'll have to tune these... */ extern int KARATSUBA_MUL_CUTOFF, KARATSUBA_SQR_CUTOFF, TOOM_MUL_CUTOFF, TOOM_SQR_CUTOFF; /* define this to use lower memory usage routines (exptmods mostly) */ /* #define MP_LOW_MEM */ /* default precision */ #ifndef MP_PREC #ifndef MP_LOW_MEM #define MP_PREC 32 /* default digits of precision */ #else #define MP_PREC 8 /* default digits of precision */ #endif #endif /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ #define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) /* the infamous mp_int structure */ typedef struct { int used, alloc, sign; mp_digit *dp; } mp_int; /* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); #define USED(m) ((m)->used) #define DIGIT(m,k) ((m)->dp[(k)]) #define SIGN(m) ((m)->sign) /* error code to char* string */ char *mp_error_to_string(int code); /* ---> init and deinit bignum functions <--- */ /* init a bignum */ int mp_init(mp_int *a); /* free a bignum */ void mp_clear(mp_int *a); /* init a null terminated series of arguments */ int mp_init_multi(mp_int *mp, ...); /* clear a null terminated series of arguments */ void mp_clear_multi(mp_int *mp, ...); /* exchange two ints */ void mp_exch(mp_int *a, mp_int *b); /* shrink ram required for a bignum */ int mp_shrink(mp_int *a); /* grow an int to a given size */ int mp_grow(mp_int *a, int size); /* init to a given number of digits */ int mp_init_size(mp_int *a, int size); /* ---> Basic Manipulations <--- */ #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) #define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) #define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) /* set to zero */ void mp_zero(mp_int *a); /* set to a digit */ void mp_set(mp_int *a, mp_digit b); /* set a 32-bit const */ int mp_set_int(mp_int *a, unsigned long b); /* set a platform dependent unsigned long value */ int mp_set_long(mp_int *a, unsigned long b); /* get a 32-bit value */ unsigned long mp_get_int(mp_int * a); /* get a platform dependent unsigned long value */ unsigned long mp_get_long(mp_int * a); /* initialize and set a digit */ int mp_init_set (mp_int * a, mp_digit b); /* initialize and set 32-bit value */ int mp_init_set_int (mp_int * a, unsigned long b); /* copy, b = a */ int mp_copy(mp_int *a, mp_int *b); /* inits and copies, a = b */ int mp_init_copy(mp_int *a, mp_int *b); /* trim unused digits */ void mp_clamp(mp_int *a); /* ---> digit manipulation <--- */ /* right shift by "b" digits */ void mp_rshd(mp_int *a, int b); /* left shift by "b" digits */ int mp_lshd(mp_int *a, int b); /* c = a / 2**b */ int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d); /* b = a/2 */ int mp_div_2(mp_int *a, mp_int *b); /* c = a * 2**b */ int mp_mul_2d(mp_int *a, int b, mp_int *c); /* b = a*2 */ int mp_mul_2(mp_int *a, mp_int *b); /* c = a mod 2**d */ int mp_mod_2d(mp_int *a, int b, mp_int *c); /* computes a = 2**b */ int mp_2expt(mp_int *a, int b); /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a); /* I Love Earth! */ /* makes a pseudo-random int of a given size */ int mp_rand(mp_int *a, int digits); /* ---> binary operations <--- */ /* c = a XOR b */ int mp_xor(mp_int *a, mp_int *b, mp_int *c); /* c = a OR b */ int mp_or(mp_int *a, mp_int *b, mp_int *c); /* c = a AND b */ int mp_and(mp_int *a, mp_int *b, mp_int *c); /* ---> Basic arithmetic <--- */ /* b = -a */ int mp_neg(mp_int *a, mp_int *b); /* b = |a| */ int mp_abs(mp_int *a, mp_int *b); /* compare a to b */ int mp_cmp(mp_int *a, mp_int *b); /* compare |a| to |b| */ int mp_cmp_mag(mp_int *a, mp_int *b); /* c = a + b */ int mp_add(mp_int *a, mp_int *b, mp_int *c); /* c = a - b */ int mp_sub(mp_int *a, mp_int *b, mp_int *c); /* c = a * b */ int mp_mul(mp_int *a, mp_int *b, mp_int *c); /* b = a*a */ int mp_sqr(mp_int *a, mp_int *b); /* a/b => cb + d == a */ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* c = a mod b, 0 <= c < b */ int mp_mod(mp_int *a, mp_int *b, mp_int *c); /* ---> single digit functions <--- */ /* compare against a single digit */ int mp_cmp_d(mp_int *a, mp_digit b); /* c = a + b */ int mp_add_d(mp_int *a, mp_digit b, mp_int *c); /* c = a - b */ int mp_sub_d(mp_int *a, mp_digit b, mp_int *c); /* c = a * b */ int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); /* a/b => cb + d == a */ int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); /* a/3 => 3c + d == a */ int mp_div_3(mp_int *a, mp_int *c, mp_digit *d); /* c = a**b */ int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); /* c = a mod b, 0 <= c < b */ int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); /* ---> number theory <--- */ /* d = a + b (mod c) */ int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* d = a - b (mod c) */ int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* d = a * b (mod c) */ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* c = a * a (mod b) */ int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c); /* c = 1/a (mod b) */ int mp_invmod(mp_int *a, mp_int *b, mp_int *c); /* c = (a, b) */ int mp_gcd(mp_int *a, mp_int *b, mp_int *c); /* produces value such that U1*a + U2*b = U3 */ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3); /* c = [a, b] or (a*b)/(a, b) */ int mp_lcm(mp_int *a, mp_int *b, mp_int *c); /* finds one of the b'th root of a, such that |c|**b <= |a| * * returns error if a < 0 and b is even */ int mp_n_root(mp_int *a, mp_digit b, mp_int *c); /* special sqrt algo */ int mp_sqrt(mp_int *arg, mp_int *ret); /* is number a square? */ int mp_is_square(mp_int *arg, int *ret); /* computes the jacobi c = (a | n) (or Legendre if b is prime) */ int mp_jacobi(mp_int *a, mp_int *n, int *c); /* used to setup the Barrett reduction for a given modulus b */ int mp_reduce_setup(mp_int *a, mp_int *b); /* Barrett Reduction, computes a (mod b) with a precomputed value c * * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code]. */ int mp_reduce(mp_int *a, mp_int *b, mp_int *c); /* setups the montgomery reduction */ int mp_montgomery_setup(mp_int *a, mp_digit *mp); /* computes a = B**n mod b without division or multiplication useful for * normalizing numbers in a Montgomery system. */ int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); /* computes x/R == x (mod N) via Montgomery Reduction */ int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); /* returns 1 if a is a valid DR modulus */ int mp_dr_is_modulus(mp_int *a); /* sets the value of "d" required for mp_dr_reduce */ void mp_dr_setup(mp_int *a, mp_digit *d); /* reduces a modulo b using the Diminished Radix method */ int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); /* returns true if a can be reduced with mp_reduce_2k */ int mp_reduce_is_2k(mp_int *a); /* determines k value for 2k reduction */ int mp_reduce_2k_setup(mp_int *a, mp_digit *d); /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); /* returns true if a can be reduced with mp_reduce_2k_l */ int mp_reduce_is_2k_l(mp_int *a); /* determines k value for 2k reduction */ int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); /* d = a**b (mod c) */ int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* ---> Primes <--- */ /* number of primes */ #ifdef MP_8BIT #define PRIME_SIZE 31 #else #define PRIME_SIZE 256 #endif /* table of first PRIME_SIZE primes */ extern const mp_digit ltm_prime_tab[]; /* result=1 if a is divisible by one of the first PRIME_SIZE primes */ int mp_prime_is_divisible(mp_int *a, int *result); /* performs one Fermat test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ int mp_prime_fermat(mp_int *a, mp_int *b, int *result); /* performs one Miller-Rabin test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); /* This gives [for a given bit size] the number of trials required * such that Miller-Rabin gives a prob of failure lower than 2^-96 */ int mp_prime_rabin_miller_trials(int size); /* performs t rounds of Miller-Rabin on "a" using the first * t prime bases. Also performs an initial sieve of trial * division. Determines if "a" is prime with probability * of error no more than (1/4)**t. * * Sets result to 1 if probably prime, 0 otherwise */ int mp_prime_is_prime(mp_int *a, int t, int *result); /* finds the next prime after the number "a" using "t" trials * of Miller-Rabin. * * bbs_style = 1 means the prime must be congruent to 3 mod 4 */ int mp_prime_next_prime(mp_int *a, int t, int bbs_style); /* makes a truly random prime of a given size (bytes), * call with bbs = 1 if you want it to be congruent to 3 mod 4 * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * * The prime generated will be larger than 2^(8*size). */ #define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) /* makes a truly random prime of a given size (bits), * * Flags are as follows: * * LTM_PRIME_BBS - make prime congruent to 3 mod 4 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) * LTM_PRIME_2MSB_ON - make the 2nd highest bit one * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * */ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat); /* ---> radix conversion <--- */ int mp_count_bits(mp_int *a); int mp_unsigned_bin_size(mp_int *a); int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c); int mp_to_unsigned_bin(mp_int *a, unsigned char *b); int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); int mp_signed_bin_size(mp_int *a); int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c); int mp_to_signed_bin(mp_int *a, unsigned char *b); int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); int mp_read_radix(mp_int *a, const char *str, int radix); int mp_toradix(mp_int *a, char *str, int radix); int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen); int mp_radix_size(mp_int *a, int radix, int *size); int mp_fread(mp_int *a, int radix, FILE *stream); int mp_fwrite(mp_int *a, int radix, FILE *stream); #define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) #define mp_raw_size(mp) mp_signed_bin_size(mp) #define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) #define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) #define mp_mag_size(mp) mp_unsigned_bin_size(mp) #define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) #define mp_tobinary(M, S) mp_toradix((M), (S), 2) #define mp_tooctal(M, S) mp_toradix((M), (S), 8) #define mp_todecimal(M, S) mp_toradix((M), (S), 10) #define mp_tohex(M, S) mp_toradix((M), (S), 16) /* lowlevel functions, do not call! */ int s_mp_add(mp_int *a, mp_int *b, mp_int *c); int s_mp_sub(mp_int *a, mp_int *b, mp_int *c); #define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int fast_s_mp_sqr(mp_int *a, mp_int *b); int s_mp_sqr(mp_int *a, mp_int *b); int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c); int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c); int mp_karatsuba_sqr(mp_int *a, mp_int *b); int mp_toom_sqr(mp_int *a, mp_int *b); int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c); int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode); void bn_reverse(unsigned char *s, int len); extern const char *mp_s_rmap; #ifdef __cplusplus } #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/tommath_class.h000066400000000000000000000507341225523575400215610ustar00rootroot00000000000000#if !(defined(LTM1) && defined(LTM2) && defined(LTM3)) #if defined(LTM2) #define LTM3 #endif #if defined(LTM1) #define LTM2 #endif #define LTM1 #if defined(LTM_ALL) #define BN_ERROR_C #define BN_FAST_MP_INVMOD_C #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_FAST_S_MP_MUL_DIGS_C #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_FAST_S_MP_SQR_C #define BN_MP_2EXPT_C #define BN_MP_ABS_C #define BN_MP_ADD_C #define BN_MP_ADD_D_C #define BN_MP_ADDMOD_C #define BN_MP_AND_C #define BN_MP_CLAMP_C #define BN_MP_CLEAR_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_CMP_C #define BN_MP_CMP_D_C #define BN_MP_CMP_MAG_C #define BN_MP_CNT_LSB_C #define BN_MP_COPY_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_C #define BN_MP_DIV_2_C #define BN_MP_DIV_2D_C #define BN_MP_DIV_3_C #define BN_MP_DIV_D_C #define BN_MP_DR_IS_MODULUS_C #define BN_MP_DR_REDUCE_C #define BN_MP_DR_SETUP_C #define BN_MP_EXCH_C #define BN_MP_EXPT_D_C #define BN_MP_EXPTMOD_C #define BN_MP_EXPTMOD_FAST_C #define BN_MP_EXTEUCLID_C #define BN_MP_FREAD_C #define BN_MP_FWRITE_C #define BN_MP_GCD_C #define BN_MP_GET_INT_C #define BN_MP_GROW_C #define BN_MP_INIT_C #define BN_MP_INIT_COPY_C #define BN_MP_INIT_MULTI_C #define BN_MP_INIT_SET_C #define BN_MP_INIT_SET_INT_C #define BN_MP_INIT_SIZE_C #define BN_MP_INVMOD_C #define BN_MP_INVMOD_SLOW_C #define BN_MP_IS_SQUARE_C #define BN_MP_JACOBI_C #define BN_MP_KARATSUBA_MUL_C #define BN_MP_KARATSUBA_SQR_C #define BN_MP_LCM_C #define BN_MP_LSHD_C #define BN_MP_MOD_C #define BN_MP_MOD_2D_C #define BN_MP_MOD_D_C #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C #define BN_MP_MONTGOMERY_REDUCE_C #define BN_MP_MONTGOMERY_SETUP_C #define BN_MP_MUL_C #define BN_MP_MUL_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_MULMOD_C #define BN_MP_N_ROOT_C #define BN_MP_NEG_C #define BN_MP_OR_C #define BN_MP_PRIME_FERMAT_C #define BN_MP_PRIME_IS_DIVISIBLE_C #define BN_MP_PRIME_IS_PRIME_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_PRIME_NEXT_PRIME_C #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C #define BN_MP_PRIME_RANDOM_EX_C #define BN_MP_RADIX_SIZE_C #define BN_MP_RADIX_SMAP_C #define BN_MP_RAND_C #define BN_MP_READ_RADIX_C #define BN_MP_READ_SIGNED_BIN_C #define BN_MP_READ_UNSIGNED_BIN_C #define BN_MP_REDUCE_C #define BN_MP_REDUCE_2K_C #define BN_MP_REDUCE_2K_L_C #define BN_MP_REDUCE_2K_SETUP_C #define BN_MP_REDUCE_2K_SETUP_L_C #define BN_MP_REDUCE_IS_2K_C #define BN_MP_REDUCE_IS_2K_L_C #define BN_MP_REDUCE_SETUP_C #define BN_MP_RSHD_C #define BN_MP_SET_C #define BN_MP_SET_INT_C #define BN_MP_SHRINK_C #define BN_MP_SIGNED_BIN_SIZE_C #define BN_MP_SQR_C #define BN_MP_SQRMOD_C #define BN_MP_SQRT_C #define BN_MP_SUB_C #define BN_MP_SUB_D_C #define BN_MP_SUBMOD_C #define BN_MP_TO_SIGNED_BIN_C #define BN_MP_TO_SIGNED_BIN_N_C #define BN_MP_TO_UNSIGNED_BIN_C #define BN_MP_TO_UNSIGNED_BIN_N_C #define BN_MP_TOOM_MUL_C #define BN_MP_TOOM_SQR_C #define BN_MP_TORADIX_C #define BN_MP_TORADIX_N_C #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_XOR_C #define BN_MP_ZERO_C #define BN_PRIME_TAB_C #define BN_REVERSE_C #define BN_S_MP_ADD_C #define BN_S_MP_EXPTMOD_C #define BN_S_MP_MUL_DIGS_C #define BN_S_MP_MUL_HIGH_DIGS_C #define BN_S_MP_SQR_C #define BN_S_MP_SUB_C #define BNCORE_C #endif #if defined(BN_ERROR_C) #define BN_MP_ERROR_TO_STRING_C #endif #if defined(BN_FAST_MP_INVMOD_C) #define BN_MP_ISEVEN_C #define BN_MP_INIT_MULTI_C #define BN_MP_COPY_C #define BN_MP_MOD_C #define BN_MP_SET_C #define BN_MP_DIV_2_C #define BN_MP_ISODD_C #define BN_MP_SUB_C #define BN_MP_CMP_C #define BN_MP_ISZERO_C #define BN_MP_CMP_D_C #define BN_MP_ADD_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_FAST_MP_MONTGOMERY_REDUCE_C) #define BN_MP_GROW_C #define BN_MP_RSHD_C #define BN_MP_CLAMP_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_FAST_S_MP_MUL_DIGS_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_FAST_S_MP_SQR_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_2EXPT_C) #define BN_MP_ZERO_C #define BN_MP_GROW_C #endif #if defined(BN_MP_ABS_C) #define BN_MP_COPY_C #endif #if defined(BN_MP_ADD_C) #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_ADD_D_C) #define BN_MP_GROW_C #define BN_MP_SUB_D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_ADDMOD_C) #define BN_MP_INIT_C #define BN_MP_ADD_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_AND_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_CLAMP_C) #endif #if defined(BN_MP_CLEAR_C) #endif #if defined(BN_MP_CLEAR_MULTI_C) #define BN_MP_CLEAR_C #endif #if defined(BN_MP_CMP_C) #define BN_MP_CMP_MAG_C #endif #if defined(BN_MP_CMP_D_C) #endif #if defined(BN_MP_CMP_MAG_C) #endif #if defined(BN_MP_CNT_LSB_C) #define BN_MP_ISZERO_C #endif #if defined(BN_MP_COPY_C) #define BN_MP_GROW_C #endif #if defined(BN_MP_COUNT_BITS_C) #endif #if defined(BN_MP_DIV_C) #define BN_MP_ISZERO_C #define BN_MP_CMP_MAG_C #define BN_MP_COPY_C #define BN_MP_ZERO_C #define BN_MP_INIT_MULTI_C #define BN_MP_SET_C #define BN_MP_COUNT_BITS_C #define BN_MP_ABS_C #define BN_MP_MUL_2D_C #define BN_MP_CMP_C #define BN_MP_SUB_C #define BN_MP_ADD_C #define BN_MP_DIV_2D_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_INIT_SIZE_C #define BN_MP_INIT_C #define BN_MP_INIT_COPY_C #define BN_MP_LSHD_C #define BN_MP_RSHD_C #define BN_MP_MUL_D_C #define BN_MP_CLAMP_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DIV_2_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_DIV_2D_C) #define BN_MP_COPY_C #define BN_MP_ZERO_C #define BN_MP_INIT_C #define BN_MP_MOD_2D_C #define BN_MP_CLEAR_C #define BN_MP_RSHD_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_DIV_3_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DIV_D_C) #define BN_MP_ISZERO_C #define BN_MP_COPY_C #define BN_MP_DIV_2D_C #define BN_MP_DIV_3_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DR_IS_MODULUS_C) #endif #if defined(BN_MP_DR_REDUCE_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_DR_SETUP_C) #endif #if defined(BN_MP_EXCH_C) #endif #if defined(BN_MP_EXPT_D_C) #define BN_MP_INIT_COPY_C #define BN_MP_SET_C #define BN_MP_SQR_C #define BN_MP_CLEAR_C #define BN_MP_MUL_C #endif #if defined(BN_MP_EXPTMOD_C) #define BN_MP_INIT_C #define BN_MP_INVMOD_C #define BN_MP_CLEAR_C #define BN_MP_ABS_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_REDUCE_IS_2K_L_C #define BN_S_MP_EXPTMOD_C #define BN_MP_DR_IS_MODULUS_C #define BN_MP_REDUCE_IS_2K_C #define BN_MP_ISODD_C #define BN_MP_EXPTMOD_FAST_C #endif #if defined(BN_MP_EXPTMOD_FAST_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #define BN_MP_MONTGOMERY_SETUP_C #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_MP_MONTGOMERY_REDUCE_C #define BN_MP_DR_SETUP_C #define BN_MP_DR_REDUCE_C #define BN_MP_REDUCE_2K_SETUP_C #define BN_MP_REDUCE_2K_C #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C #define BN_MP_MULMOD_C #define BN_MP_SET_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_SQR_C #define BN_MP_MUL_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_EXTEUCLID_C) #define BN_MP_INIT_MULTI_C #define BN_MP_SET_C #define BN_MP_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_C #define BN_MP_MUL_C #define BN_MP_SUB_C #define BN_MP_NEG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_FREAD_C) #define BN_MP_ZERO_C #define BN_MP_S_RMAP_C #define BN_MP_MUL_D_C #define BN_MP_ADD_D_C #define BN_MP_CMP_D_C #endif #if defined(BN_MP_FWRITE_C) #define BN_MP_RADIX_SIZE_C #define BN_MP_TORADIX_C #endif #if defined(BN_MP_GCD_C) #define BN_MP_ISZERO_C #define BN_MP_ABS_C #define BN_MP_ZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_S_MP_SUB_C #define BN_MP_MUL_2D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_GET_INT_C) #endif #if defined(BN_MP_GROW_C) #endif #if defined(BN_MP_INIT_C) #endif #if defined(BN_MP_INIT_COPY_C) #define BN_MP_COPY_C #endif #if defined(BN_MP_INIT_MULTI_C) #define BN_MP_ERR_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_INIT_SET_C) #define BN_MP_INIT_C #define BN_MP_SET_C #endif #if defined(BN_MP_INIT_SET_INT_C) #define BN_MP_INIT_C #define BN_MP_SET_INT_C #endif #if defined(BN_MP_INIT_SIZE_C) #define BN_MP_INIT_C #endif #if defined(BN_MP_INVMOD_C) #define BN_MP_ISZERO_C #define BN_MP_ISODD_C #define BN_FAST_MP_INVMOD_C #define BN_MP_INVMOD_SLOW_C #endif #if defined(BN_MP_INVMOD_SLOW_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_ISEVEN_C #define BN_MP_SET_C #define BN_MP_DIV_2_C #define BN_MP_ISODD_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_CMP_C #define BN_MP_CMP_D_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_IS_SQUARE_C) #define BN_MP_MOD_D_C #define BN_MP_INIT_SET_INT_C #define BN_MP_MOD_C #define BN_MP_GET_INT_C #define BN_MP_SQRT_C #define BN_MP_SQR_C #define BN_MP_CMP_MAG_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_JACOBI_C) #define BN_MP_CMP_D_C #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_MOD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_KARATSUBA_MUL_C) #define BN_MP_MUL_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_SUB_C #define BN_MP_ADD_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_KARATSUBA_SQR_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_SQR_C #define BN_MP_SUB_C #define BN_S_MP_ADD_C #define BN_MP_LSHD_C #define BN_MP_ADD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_LCM_C) #define BN_MP_INIT_MULTI_C #define BN_MP_GCD_C #define BN_MP_CMP_MAG_C #define BN_MP_DIV_C #define BN_MP_MUL_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_LSHD_C) #define BN_MP_GROW_C #define BN_MP_RSHD_C #endif #if defined(BN_MP_MOD_C) #define BN_MP_INIT_C #define BN_MP_DIV_C #define BN_MP_CLEAR_C #define BN_MP_ADD_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_MOD_2D_C) #define BN_MP_ZERO_C #define BN_MP_COPY_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MOD_D_C) #define BN_MP_DIV_D_C #endif #if defined(BN_MP_MONTGOMERY_CALC_NORMALIZATION_C) #define BN_MP_COUNT_BITS_C #define BN_MP_2EXPT_C #define BN_MP_SET_C #define BN_MP_MUL_2_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_MONTGOMERY_REDUCE_C) #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_MP_GROW_C #define BN_MP_CLAMP_C #define BN_MP_RSHD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_MONTGOMERY_SETUP_C) #endif #if defined(BN_MP_MUL_C) #define BN_MP_TOOM_MUL_C #define BN_MP_KARATSUBA_MUL_C #define BN_FAST_S_MP_MUL_DIGS_C #define BN_S_MP_MUL_C #define BN_S_MP_MUL_DIGS_C #endif #if defined(BN_MP_MUL_2_C) #define BN_MP_GROW_C #endif #if defined(BN_MP_MUL_2D_C) #define BN_MP_COPY_C #define BN_MP_GROW_C #define BN_MP_LSHD_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MUL_D_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MULMOD_C) #define BN_MP_INIT_C #define BN_MP_MUL_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_N_ROOT_C) #define BN_MP_INIT_C #define BN_MP_SET_C #define BN_MP_COPY_C #define BN_MP_EXPT_D_C #define BN_MP_MUL_C #define BN_MP_SUB_C #define BN_MP_MUL_D_C #define BN_MP_DIV_C #define BN_MP_CMP_C #define BN_MP_SUB_D_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_NEG_C) #define BN_MP_COPY_C #define BN_MP_ISZERO_C #endif #if defined(BN_MP_OR_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_FERMAT_C) #define BN_MP_CMP_D_C #define BN_MP_INIT_C #define BN_MP_EXPTMOD_C #define BN_MP_CMP_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_IS_DIVISIBLE_C) #define BN_MP_MOD_D_C #endif #if defined(BN_MP_PRIME_IS_PRIME_C) #define BN_MP_CMP_D_C #define BN_MP_PRIME_IS_DIVISIBLE_C #define BN_MP_INIT_C #define BN_MP_SET_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_MILLER_RABIN_C) #define BN_MP_CMP_D_C #define BN_MP_INIT_COPY_C #define BN_MP_SUB_D_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_EXPTMOD_C #define BN_MP_CMP_C #define BN_MP_SQRMOD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_NEXT_PRIME_C) #define BN_MP_CMP_D_C #define BN_MP_SET_C #define BN_MP_SUB_D_C #define BN_MP_ISEVEN_C #define BN_MP_MOD_D_C #define BN_MP_INIT_C #define BN_MP_ADD_D_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_RABIN_MILLER_TRIALS_C) #endif #if defined(BN_MP_PRIME_RANDOM_EX_C) #define BN_MP_READ_UNSIGNED_BIN_C #define BN_MP_PRIME_IS_PRIME_C #define BN_MP_SUB_D_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2_C #define BN_MP_ADD_D_C #endif #if defined(BN_MP_RADIX_SIZE_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_RADIX_SMAP_C) #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_RAND_C) #define BN_MP_ZERO_C #define BN_MP_ADD_D_C #define BN_MP_LSHD_C #endif #if defined(BN_MP_READ_RADIX_C) #define BN_MP_ZERO_C #define BN_MP_S_RMAP_C #define BN_MP_RADIX_SMAP_C #define BN_MP_MUL_D_C #define BN_MP_ADD_D_C #define BN_MP_ISZERO_C #endif #if defined(BN_MP_READ_SIGNED_BIN_C) #define BN_MP_READ_UNSIGNED_BIN_C #endif #if defined(BN_MP_READ_UNSIGNED_BIN_C) #define BN_MP_GROW_C #define BN_MP_ZERO_C #define BN_MP_MUL_2D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_REDUCE_C) #define BN_MP_REDUCE_SETUP_C #define BN_MP_INIT_COPY_C #define BN_MP_RSHD_C #define BN_MP_MUL_C #define BN_S_MP_MUL_HIGH_DIGS_C #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_MP_MOD_2D_C #define BN_S_MP_MUL_DIGS_C #define BN_MP_SUB_C #define BN_MP_CMP_D_C #define BN_MP_SET_C #define BN_MP_LSHD_C #define BN_MP_ADD_C #define BN_MP_CMP_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_2D_C #define BN_MP_MUL_D_C #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_L_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_2D_C #define BN_MP_MUL_C #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_SETUP_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_2EXPT_C #define BN_MP_CLEAR_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_REDUCE_2K_SETUP_L_C) #define BN_MP_INIT_C #define BN_MP_2EXPT_C #define BN_MP_COUNT_BITS_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_IS_2K_C) #define BN_MP_REDUCE_2K_C #define BN_MP_COUNT_BITS_C #endif #if defined(BN_MP_REDUCE_IS_2K_L_C) #endif #if defined(BN_MP_REDUCE_SETUP_C) #define BN_MP_2EXPT_C #define BN_MP_DIV_C #endif #if defined(BN_MP_RSHD_C) #define BN_MP_ZERO_C #endif #if defined(BN_MP_SET_C) #define BN_MP_ZERO_C #endif #if defined(BN_MP_SET_INT_C) #define BN_MP_ZERO_C #define BN_MP_MUL_2D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_SHRINK_C) #endif #if defined(BN_MP_SIGNED_BIN_SIZE_C) #define BN_MP_UNSIGNED_BIN_SIZE_C #endif #if defined(BN_MP_SQR_C) #define BN_MP_TOOM_SQR_C #define BN_MP_KARATSUBA_SQR_C #define BN_FAST_S_MP_SQR_C #define BN_S_MP_SQR_C #endif #if defined(BN_MP_SQRMOD_C) #define BN_MP_INIT_C #define BN_MP_SQR_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_SQRT_C) #define BN_MP_N_ROOT_C #define BN_MP_ISZERO_C #define BN_MP_ZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_RSHD_C #define BN_MP_DIV_C #define BN_MP_ADD_C #define BN_MP_DIV_2_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_SUB_C) #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_SUB_D_C) #define BN_MP_GROW_C #define BN_MP_ADD_D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_SUBMOD_C) #define BN_MP_INIT_C #define BN_MP_SUB_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_TO_SIGNED_BIN_C) #define BN_MP_TO_UNSIGNED_BIN_C #endif #if defined(BN_MP_TO_SIGNED_BIN_N_C) #define BN_MP_SIGNED_BIN_SIZE_C #define BN_MP_TO_SIGNED_BIN_C #endif #if defined(BN_MP_TO_UNSIGNED_BIN_C) #define BN_MP_INIT_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_2D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_TO_UNSIGNED_BIN_N_C) #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_TO_UNSIGNED_BIN_C #endif #if defined(BN_MP_TOOM_MUL_C) #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_2D_C #define BN_MP_COPY_C #define BN_MP_RSHD_C #define BN_MP_MUL_C #define BN_MP_MUL_2_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_DIV_3_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_TOOM_SQR_C) #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_2D_C #define BN_MP_COPY_C #define BN_MP_RSHD_C #define BN_MP_SQR_C #define BN_MP_MUL_2_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_DIV_3_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_TORADIX_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_TORADIX_N_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_UNSIGNED_BIN_SIZE_C) #define BN_MP_COUNT_BITS_C #endif #if defined(BN_MP_XOR_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_ZERO_C) #endif #if defined(BN_PRIME_TAB_C) #endif #if defined(BN_REVERSE_C) #endif #if defined(BN_S_MP_ADD_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_S_MP_EXPTMOD_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #define BN_MP_REDUCE_SETUP_C #define BN_MP_REDUCE_C #define BN_MP_REDUCE_2K_SETUP_L_C #define BN_MP_REDUCE_2K_L_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_SQR_C #define BN_MP_MUL_C #define BN_MP_SET_C #define BN_MP_EXCH_C #endif #if defined(BN_S_MP_MUL_DIGS_C) #define BN_FAST_S_MP_MUL_DIGS_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_MUL_HIGH_DIGS_C) #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_SQR_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_SUB_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BNCORE_C) #endif #ifdef LTM3 #define LTM_LAST #endif #include #include #else #define LTM_LAST #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/libtommath/tommath_superclass.h000066400000000000000000000042721225523575400226340ustar00rootroot00000000000000/* super class file for PK algos */ /* default ... include all MPI */ #define LTM_ALL /* RSA only (does not support DH/DSA/ECC) */ /* #define SC_RSA_1 */ /* For reference.... On an Athlon64 optimizing for speed... LTM's mpi.o with all functions [striped] is 142KiB in size. */ /* Works for RSA only, mpi.o is 68KiB */ #ifdef SC_RSA_1 #define BN_MP_SHRINK_C #define BN_MP_LCM_C #define BN_MP_PRIME_RANDOM_EX_C #define BN_MP_INVMOD_C #define BN_MP_GCD_C #define BN_MP_MOD_C #define BN_MP_MULMOD_C #define BN_MP_ADDMOD_C #define BN_MP_EXPTMOD_C #define BN_MP_SET_INT_C #define BN_MP_INIT_MULTI_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_TO_UNSIGNED_BIN_C #define BN_MP_MOD_D_C #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C #define BN_REVERSE_C #define BN_PRIME_TAB_C /* other modifiers */ #define BN_MP_DIV_SMALL /* Slower division, not critical */ /* here we are on the last pass so we turn things off. The functions classes are still there * but we remove them specifically from the build. This also invokes tweaks in functions * like removing support for even moduli, etc... */ #ifdef LTM_LAST #undef BN_MP_TOOM_MUL_C #undef BN_MP_TOOM_SQR_C #undef BN_MP_KARATSUBA_MUL_C #undef BN_MP_KARATSUBA_SQR_C #undef BN_MP_REDUCE_C #undef BN_MP_REDUCE_SETUP_C #undef BN_MP_DR_IS_MODULUS_C #undef BN_MP_DR_SETUP_C #undef BN_MP_DR_REDUCE_C #undef BN_MP_REDUCE_IS_2K_C #undef BN_MP_REDUCE_2K_SETUP_C #undef BN_MP_REDUCE_2K_C #undef BN_S_MP_EXPTMOD_C #undef BN_MP_DIV_3_C #undef BN_S_MP_MUL_HIGH_DIGS_C #undef BN_FAST_S_MP_MUL_HIGH_DIGS_C #undef BN_FAST_MP_INVMOD_C /* To safely undefine these you have to make sure your RSA key won't exceed the Comba threshold * which is roughly 255 digits [7140 bits for 32-bit machines, 15300 bits for 64-bit machines] * which means roughly speaking you can handle upto 2536-bit RSA keys with these defined without * trouble. */ #undef BN_S_MP_MUL_DIGS_C #undef BN_S_MP_SQR_C #undef BN_MP_MONTGOMERY_REDUCE_C #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ nqp-2013.12.1/3rdparty/sha1/000077500000000000000000000000001225523575400152355ustar00rootroot00000000000000nqp-2013.12.1/3rdparty/sha1/sha1.c000066400000000000000000000176651225523575400162540ustar00rootroot00000000000000/* SHA-1 in C By Steve Reid 100% Public Domain ----------------- Modified 7/98 By James H. Brown Still 100% Public Domain Corrected a problem which generated improper hash values on 16 bit machines Routine SHA1Update changed from void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) to void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned long len) The 'len' parameter was declared an int which works fine on 32 bit machines. However, on 16 bit machines an int is too small for the shifts being done against it. This caused the hash function to generate incorrect values if len was greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). Since the file IO in main() reads 16K at a time, any file 8K or larger would be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million "a"s). I also changed the declaration of variables i & j in SHA1Update to unsigned long from unsigned int for the same reason. These changes should make no difference to any 32 bit implementations since an int and a long are the same size in those environments. -- I also corrected a few compiler warnings generated by Borland C. 1. Added #include for exit() prototype 2. Removed unused variable 'j' in SHA1Final 3. Changed exit(0) to return(0) at end of main. ALL changes I made can be located by searching for comments containing 'JHB' ----------------- Modified 8/98 By Steve Reid Still 100% public domain 1- Removed #include and used return() instead of exit() 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net ----------------- Modified 4/01 By Saul Kravitz Still 100% PD Modified to run on Compaq Alpha hardware. ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain modified for use with stdint types, autoconf code cleanup, removed attribution comments switched SHA1Final() argument order for consistency use SHA1_ prefix for public api move public api to sha1.h ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain ----------------- Modified 12/2011 By Jonathan Worthington Still 100% public domain Strip out various test code, twiddle digest to ASCII code a bit. */ #include #include #include "sha1.h" void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]); #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ /* I got the idea of expanding during the round function from SSLeay */ /* FIXME: can we do this in an endian-proof way? */ #ifdef WORDS_BIGENDIAN #define blk0(i) block->l[i] #else #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ |(rol(block->l[i],8)&0x00FF00FF)) #endif #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]) { unsigned int a, b, c, d, e; typedef union { unsigned char c[64]; unsigned int l[16]; } CHAR64LONG16; CHAR64LONG16* block; block = (CHAR64LONG16*)buffer; /* Copy context->state[] to working vars */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; /* 4 rounds of 20 operations each. Loop unrolled. */ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); /* Add the working vars back into context.state[] */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; /* Wipe variables */ a = b = c = d = e = 0; } /* SHA1Init - Initialize new context */ void SHA1_Init(SHA1_CTX* context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } /* Run your data through this. */ void SHA1_Update(SHA1_CTX* context, const unsigned char* data, const size_t len) { size_t i, j; j = (context->count[0] >> 3) & 63; if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; context->count[1] += (len >> 29); if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1_Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1_Transform(context->state, data + i); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } /* Add padding and return the message digest. */ void SHA1_Final(SHA1_CTX* context, unsigned char digest[SHA1_DIGEST_SIZE]) { unsigned int i; unsigned char finalcount[8]; for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ } SHA1_Update(context, (unsigned char *)"\200", 1); while ((context->count[0] & 504) != 448) { SHA1_Update(context, (unsigned char *)"\0", 1); } SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ for (i = 0; i < SHA1_DIGEST_SIZE; i++) { digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } /* Wipe variables */ i = 0; memset(context->buffer, 0, 64); memset(context->state, 0, 20); memset(context->count, 0, 8); memset(finalcount, 0, 8); /* SWR */ } /* Produces a hex output of the digest. */ void SHA1_DigestToHex(const unsigned char digest[SHA1_DIGEST_SIZE], char *output) { int i,j; char *c = output; for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { for (j = 0; j < 4; j++) { sprintf(c,"%02X", digest[i*4+j]); c += 2; } } } nqp-2013.12.1/3rdparty/sha1/sha1.h000066400000000000000000000012221225523575400162370ustar00rootroot00000000000000/* public api for steve reid's public domain SHA-1 implementation */ /* this file is in the public domain */ #ifndef __SHA1_H #define __SHA1_H #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned int state[5]; unsigned int count[2]; unsigned char buffer[64]; } SHA1_CTX; #define SHA1_DIGEST_SIZE 20 void SHA1_Init(SHA1_CTX* context); void SHA1_Update(SHA1_CTX* context, const unsigned char* data, const size_t len); void SHA1_Final(SHA1_CTX* context, unsigned char digest[SHA1_DIGEST_SIZE]); void SHA1_DigestToHex(const unsigned char digest[SHA1_DIGEST_SIZE], char *output); #ifdef __cplusplus } #endif #endif /* __SHA1_H */ nqp-2013.12.1/CREDITS000066400000000000000000000027351225523575400136600ustar00rootroot00000000000000=pod Following in the steps of other open source projects that eventually take over the world, here is the partial list of people who have contributed to Rakudo and its supporting works. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are: name (N), email (E), web-address (W), description (D), GitHub username (U) and snail-mail address (S). Thanks, The NQP Team PS: Yes, this looks remarkably like the Linux CREDITS format PPS: This file is encoded in UTF-8 ---------- N: Daniel Arbelo Arrocha U: darbelo E: arbelo@gmail.com D: Minor code contributions (plumage) N: Geoff Broadwell U: japhb E: geoff@broadwell.org D: Initial design and implementation of Plumage. N: Jonathan "Duke" Leto U: leto D: Perl 6 (Rakudo Perl) developer E: jonathan@leto.net N: Jonathan Scott Duff U: perlpilot D: Perl 6 (Rakudo Perl) developer E: duff@pobox.com N: Jonathan Worthington U: jnthn D: Replacing object model with 6model, new multi-dispatcher E: jnthn@jnthn.net N: Patrick R. Michaud U: pmichaud D: Perl 6 (Rakudo Perl) lead developer, pumpking E: pmichaud@pobox.com N: Stefan O'Rear U: sorear D: Lexical persistance, POD, and other miscellaneous contributions E: stefanor@cox.net N: Stephen Weeks U: tene E: tene@allalone.org D: Assorted contributions (plumage) N: Vasily Chekalkin U: bacek D: Work on bringing Settings to NQP based on Plumage's NQPUtils. E: bacek@bacek.com =cut nqp-2013.12.1/Configure.pl000066400000000000000000000262551225523575400151210ustar00rootroot00000000000000#! perl # Copyright (C) 2009 The Perl Foundation use 5.008; use strict; use warnings; use Text::ParseWords; use Getopt::Long; use Cwd qw/abs_path cwd/; use lib "tools/lib"; use NQP::Configure qw(cmp_rev read_parrot_config gen_moar fill_template_file fill_template_text slurp system_or_die verify_install sorry gen_parrot); my %known_backends = (parrot => 1, jvm => 1, moar => 1); MAIN: { if (-r "config.default") { unshift @ARGV, shellwords(slurp('config.default')); } my $slash = $^O eq 'MSWin32' ? '\\' : '/'; my %config = (perl => $^X); $config{'nqp_config_status'} = join(' ', map { "\"$_\""} @ARGV); my $exe = $NQP::Configure::exe; my %options; GetOptions(\%options, 'help!', 'prefix=s', 'with-parrot=s', 'gen-parrot:s', 'make-install!', 'makefile-timing!', 'backends=s', 'gen-moar:s', 'moar-option=s@', 'parrot-config=s', 'parrot-option=s@'); # Print help if it's requested if ($options{'help'}) { print_help(); exit(0); } # Deprecated --parrot-config option if ($options{'parrot-config'}) { sorry "The --parrot-config option has been removed.", "Use --prefix to specify a directory in which parrot is installed."; } my $default_backend; my %backends; if ($options{backends}) { for my $be (split /,/, $options{backends}) { $be = lc $be; unless ($known_backends{$be}) { die "Unknown backend: '$be'; Known backends: " . join(', ', sort keys %known_backends) . "\n"; } $default_backend ||= $be; $backends{$be} = 1; } } if (defined $options{'gen-parrot'}) { $backends{parrot} = 1; $default_backend ||= 'parrot'; } if (defined $options{'gen-moar'}) { $backends{moar} = 1; $default_backend ||= 'moar'; } unless (%backends) { # TODO: come up with more sensible defaults $backends{parrot} = 1; $default_backend = 'parrot'; } mkdir($options{'prefix'}) if $options{'prefix'} && $^O =~ /Win32/ && !-d $options{'prefix'}; my $prefix = ($options{'prefix'} && abs_path($options{'prefix'})) || cwd().'/install'; $config{prefix} = $prefix; # Save options in config.status unlink('config.status'); if (open(my $CONFIG_STATUS, '>', 'config.status')) { print $CONFIG_STATUS "$^X Configure.pl $config{'nqp_config_status'} \$*\n"; close($CONFIG_STATUS); } $config{'makefile-timing'} = $options{'makefile-timing'}; $config{'stagestats'} = '--stagestats' if $options{'makefile-timing'}; $config{'shell'} = $^O eq 'MSWin32' ? 'cmd' : 'sh'; $config{'bat'} = $^O eq 'MSWin32' ? '.bat' : ''; $config{'cpsep'} = $^O eq 'MSWin32' ? ';' : ':'; $config{'slash'} = $slash; open my $MAKEFILE, '>', 'Makefile' or die "Cannot open 'Makefile' for writing: $!"; my @prefixes = sort map substr($_, 0, 1), keys %backends; print $MAKEFILE "\n# Makefile code generated by Configure.pl:\n"; my $launcher = substr($default_backend, 0, 1) . '-runner-default'; print $MAKEFILE "all: ", join(' ', map("$_-all", @prefixes), $launcher), "\n"; for my $t (qw/clean test qregex-test install/) { print $MAKEFILE "$t: ", join(' ', map "$_-$t", @prefixes), "\n"; } fill_template_file( 'tools/build/Makefile-common.in', $MAKEFILE, %config, ); if ($backends{parrot}) { my $with_parrot = $options{'with-parrot'}; my $gen_parrot = $options{'gen-parrot'}; my ($par_want) = split(' ', slurp('tools/build/PARROT_REVISION')); if (defined $gen_parrot) { $with_parrot = gen_parrot($par_want, %options, prefix => $prefix); } my @errors; my %par_config; if ($with_parrot) { %par_config = read_parrot_config($with_parrot) or push @errors, "Unable to read configuration from $with_parrot."; } else { %par_config = read_parrot_config("$prefix/bin/parrot$exe", "parrot$exe") or push @errors, "Unable to find parrot."; $with_parrot = fill_template_text('@bindir@/parrot@exe@', %par_config); } %config = (%config, %par_config); my $par_have = $config{'parrot::git_describe'} || ''; if ($par_have && cmp_rev($par_have, $par_want) < 0) { push @errors, "Parrot revision $par_want required (currently $par_have)."; } if (!@errors) { push @errors, verify_install([@NQP::Configure::required_parrot_files], %config); push @errors, "(Perhaps you need to 'make install', 'make install-dev',", "or install the 'devel' package for Parrot?)" if @errors; } if (@errors && !defined $gen_parrot) { push @errors, "\nTo automatically clone (git) and build a copy of Parrot $par_want,", "try re-running Configure.pl with the '--gen-parrot' option.", "Or, use '--with-parrot=' to explicitly specify the Parrot", "executable to use to build NQP."; } sorry(@errors) if @errors; print "Using $with_parrot (version $config{'parrot::git_describe'}).\n"; if ($^O eq 'MSWin32' or $^O eq 'cygwin') { $config{'dll'} = '$(PARROT_BIN_DIR)/$(PARROT_LIB_SHARED)'; $config{'dllcopy'} = '$(PARROT_LIB_SHARED)'; $config{'make_dllcopy'} = '$(PARROT_DLL_COPY) : $(PARROT_DLL)'."\n\t".'$(CP) $(PARROT_DLL) .'; } my $make = fill_template_text('@make@', %config); if ($make eq 'nmake') { system_or_die('cd 3rdparty\dyncall && Configure.bat' . ($config{'parrot::archname'} =~ /x64/ ? ' /target-x64' : '')); $config{'dyncall_build'} = 'cd 3rdparty\dyncall && nmake Nmakefile'; } else { if ($^O eq 'MSWin32') { my $configure_args = $config{'parrot::archname'} =~ /x86/ ? ' /target-x86' : ' /target-x64'; $configure_args .= $config{'parrot::cc'} eq 'gcc' ? ' /tool-gcc' : ''; system_or_die('cd 3rdparty\dyncall && Configure.bat' . $configure_args); $config{'dyncall_build'} = "cd 3rdparty/dyncall && $make BUILD_DIR=. -f Makefile.embedded mingw32"; } else { my $target_args = ''; # heuristic according to # https://github.com/perl6/nqp/issues/100#issuecomment-18523608 if ($^O eq 'darwin' && qx/ld 2>&1/ =~ /inferred architecture x86_64/) { $target_args = " --target-x64"; } system_or_die('cd 3rdparty/dyncall && sh configure' . $target_args); if ($^O eq 'netbsd') { $config{'dyncall_build'} = "cd 3rdparty/dyncall && BUILD_DIR=. $make -f BSDmakefile"; } else { $config{'dyncall_build'} = "cd 3rdparty/dyncall && BUILD_DIR=. $make"; } } } fill_template_file( 'tools/build/Makefile-Parrot.in', $MAKEFILE, %config, ); if ($^O eq 'MSWin32') { fill_template_file('src/vm/parrot/nqp.bat', 'gen/parrot/nqp_launcher', %config); } else { fill_template_file('src/vm/parrot/nqp.sh', 'gen/parrot/nqp_launcher', %config); } chmod 0755, 'gen/parrot/nqp_launcher'; } if ($backends{moar}) { my @errors; my ($moar_want) = split(' ', slurp('tools/build/MOAR_REVISION')); my $moar_path = gen_moar($moar_want, %config, %options); if (!$moar_path) { push @errors, "No suitable MoarVM (moar executable) found using the --prefix"; } sorry(@errors) if @errors; $config{'make'} = $^O eq 'MSWin32' ? 'nmake' : 'make'; $config{moar} = $moar_path; fill_template_file( 'tools/build/Makefile-Moar.in', $MAKEFILE, %config, ); } if ($backends{jvm}) { my @errors; my $got; if (!@errors) { my @jvm_info = `java -showversion 2>&1`; my $jvm_found = 0; my $jvm_ok = 0; for (@jvm_info) { if (/(?:java|jdk) version "(\d+)\.(\d+)/) { $jvm_found = 1; if ($1 > 1 || $1 == 1 && $2 >= 7) { $jvm_ok = 1; } $got = $_; last; } } if (!$jvm_found) { push @errors, "No JVM (java executable) in path; cannot continue"; } elsif (!$jvm_ok) { push @errors, "Need at least JVM 1.7 (got $got)"; } } sorry(@errors) if @errors; print "Using $got\n"; $config{'make'} = $^O eq 'MSWin32' ? 'nmake' : 'make'; $config{'runner'} = $^O eq 'MSWin32' ? 'nqp.bat' : 'nqp'; fill_template_file( 'tools/build/Makefile-JVM.in', $MAKEFILE, %config, ); } my $ext = ''; if ($^O eq 'MSWin32') { $ext = $default_backend eq 'parrot' ? '.exe' : '.bat'; } print $MAKEFILE qq[t/*/*.t: all\n\tprove -r -v --exec ./nqp$ext \$\@\n]; close $MAKEFILE or die "Error while writing to 'Makefile': $!"; my $make = fill_template_text('@make@', %config); unless ($options{'no-clean'}) { no warnings; print "Cleaning up ...\n"; if (open my $CLEAN, '-|', "$make clean") { my @slurp = <$CLEAN>; close($CLEAN); } } if ($options{'make-install'}) { system_or_die($make); system_or_die($make, 'install'); print "\nNQP has been built and installed.\n"; } else { print "You can now use '$make' to build NQP.\n"; print "After that, '$make test' will run some tests and\n"; print "'$make install' will install NQP.\n"; } exit 0; } # Print some help text. sub print_help { my $backends = join ',',keys %known_backends; print <<"END"; Configure.pl - NQP Configure General Options: --help Show this text --prefix=dir Install files in dir --backends=list Backends to use: $backends --with-parrot=path/to/bin/parrot Parrot executable to use to build NQP --gen-parrot[=branch] Download and build a copy of Parrot to use --parrot-option='--option=value' Options to pass to parrot configuration for --gen-parrot --gen-moar Download and build a copy of MoarVM to use --moar-option='--option=value' Options to pass to MoarVM configuration for --gen-moar Configure.pl also reads options from 'config.default' in the current directory. END return; } # Local Variables: # mode: cperl # cperl-indent-level: 4 # fill-column: 100 # End: # vim: expandtab shiftwidth=4: nqp-2013.12.1/LICENSE000066400000000000000000000213001225523575400136320ustar00rootroot00000000000000 The Artistic License 2.0 Copyright (c) 2000-2006, The Perl Foundation. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. Definitions "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. "You" and "your" means any person who would like to copy, distribute, or modify the Package. "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. "Source" form means the source code, documentation source, and configuration files for the Package. "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. Permission for Use and Modification Without Distribution (1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. Permissions for Redistribution of the Standard Version (2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. (3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. Distribution of Modified Versions of the Package as Source (4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under (i) the Original License or (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source (5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. (6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. Aggregating or Linking the Package (7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. (8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. Items That are Not Considered Part of a Modified Version (9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. General Provisions (10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. (11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. (12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. (13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nqp-2013.12.1/README.pod000066400000000000000000000063151225523575400142770ustar00rootroot00000000000000=head1 NQP - Not Quite Perl (6) NQP is Copyright (C) 2009-2013 by The Perl Foundation. See F for licensing details. This is "Not Quite Perl" -- a lightweight Perl 6-like environment for virtual machines. The key feature of NQP is that it's designed to be a very small environment (as compared with, say, perl6 or Rakudo) and is focused on being a high-level way to create compilers and libraries for virtual machines (such as the Parrot Virtual Machine [1], the JVM, and MoarVM [2]). Unlike a full-fledged implementation of Perl 6, NQP strives to have as small a runtime footprint as it can, while still providing a Perl 6 object model and regular expression engine for the virtual machine. [1] http://parrot.org/ [2] https://github.com/MoarVM/MoarVM =head2 Building from source To build NQP from source, you'll just need a C utility and Perl 5.8 or newer. To automatically obtain and build Parrot you may also need a git client. To obtain NQP directly from its repository: $ git clone git://github.com/perl6/nqp.git If you don't have git installed, you can get a tarball or zip of NQP from github by visiting http://github.com/perl6/nqp/tree/master and clicking "Download". Then unpack the tarball or zip. NQP can run on three different backends: Parrot, MoarVM and the Java Virtual Machine (JVM). Decide on which backends you want it to run, and configure and build it as follows: Once you have a copy of NQP, build it as follows: $ cd nqp $ perl Configure.pl --backends=moar,parrot,jvm $ make If you don't have parrot installed, you can have Configure.pl generate one for you by passing the C<--gen-parrot> option to it as well. The C step will create a "nqp" or "nqp.exe" executable in the current directory. Programs can then be run from the build directory using a command like: $ ./nqp hello.nqp By default, NQP searches for the parrot executable and installs to the directory C<./install>. You can change that with the C<--prefix> option to Configure.pl. Once built, NQP's C target will install NQP and its libraries into the Parrot installation that was used to create it. Until this step is performed, the "nqp" executable created by C above can only be reliably run from the root of NQP's build directory. After C is performed the executable can be run from any directory (as long as the Parrot installation that was used to create it remains intact). If the NQP compiler is invoked without an explicit script to run, it enters a small interactive mode that allows statements to be executed from the command line. Each line entered is treated as a separate compilation unit, however (which means that subroutines are preserved after they are defined, but variables are not). =head2 Differences from nqp-rx NQP is the successor implementation of "nqp-rx" [2]. Unlike nqp-rx, which aimed to have almost no runtime component whatsoever, this new version of NQP accepts that a minimal Perl 6 object metamodel, multidispatcher, and regular expression engine are needed on top of the underlying virtual machine. Also, nqp-rx only ran on Parrot, whereas NQP also runs on the JVM and is designed to be portable to more. [2] http://github.com/perl6/nqp-rx nqp-2013.12.1/VERSION000066400000000000000000000000121225523575400136720ustar00rootroot000000000000002013.12.1 nqp-2013.12.1/docs/000077500000000000000000000000001225523575400135615ustar00rootroot00000000000000nqp-2013.12.1/docs/6model/000077500000000000000000000000001225523575400147475ustar00rootroot00000000000000nqp-2013.12.1/docs/6model/faq.markdown000066400000000000000000000036601225523575400172670ustar00rootroot00000000000000# FAQ This document tries to collect various frequently asked questions about 6model and provides answers to them. ## My language has objects but no methods; is 6model a bad fit? Not really. You are not forced to implement methods in the meta-object to handle add_method or find_method, and of course your meta-object would thus have no storage allocated for a method table. The only wastage is that you have no usage for the method cache and v-table slots in the s-table. That means that per type (not per object instance) you'd have a couple of wasted slots, each a pointer in size. Thus on a 32-bit machine, 100 classes/types later, you've still yet to "waste" a kilobyte. ## What is a type object, and how should I use it? When you pair a meta-class and a representation together, an s-table is created along with a type object. The type-object becomes your "handle" to that pairing, and can be used to create instances of the object. In some languages (Perl 6), you would also install the type object into the namespace (package or lexpad), as the user's view of the type. However, that is not at all needed. For a prototype-based language, you probably only ever make one type object. You can just stash it somewhere and use it whenever you need to create a new instance. If new instances are always just clones anyway, then you needn't even keep hold of it, just install the initial instance you create wherever it should go and then it can be cloned from there on in. For a class based language, you'll always need to have *some* way of identifying a class to make an instance of. The type object is your handle for creating an instance. You may make a lookup table of the type objects and map instantiations of types through that table. If you install a "class object" of some kind and it is what manages the instantiation then you could have it holding the handle. How you handle it is really very dependent on how your language exposes object creation. nqp-2013.12.1/docs/6model/overview.markdown000066400000000000000000000233671225523575400203740ustar00rootroot00000000000000# Overview ## What is 6model? 6model is a framework for building implementations of object oriented features. It does not contain an implementation of classes, interfaces, roles, prototype objects and so forth. Instead, it provides you with a set of building blocks that enable you to build these kinds of features as your language needs them. To make an analogy with another part of the compiler toolkit, we don't provide a full grammar for your language, but do provide a grammar engine, quote parser, operator precedence parser and other helpful building blocks to get you started. ## 6model Workflow In general, when you want to implement the object system for your language using 6model, you will go through the following workflow. 1. Identify the kinds of object oriented types your language has and that you will need to implement. For example, in Perl 6 we have - amongst other things - classes, roles and enumerations. In Java, you'd have classes and interfaces. In JavaScript, you have prototype objects. 2. For each of them, pick a suitable in-memory representation. 6model provides some of these out of the box. In a language where you know all of the attributes an object will have "up-front", you can pick a representation that will just allocate a single piece of memory for an object and map each attribute to a slot. In a language where you can get attributes coming to exist at any point and an object is just like a hash table or dictionary, you can pick a representation where your object works just like a hash. 3. Having picked a representation - which will control how your objects are allocated and store/fetch attributes - you now implement meta-objects for each kind of object oriented type in your language. A meta-object is simply an object that responds to different events that occur in the life of a type. For example, at declaration time we create a new type, add methods, add a parent type (e.g. inheritance), add attributes and so forth. Later on we may locate methods, do dynamic type checks (e.g. is-a). Implementing a meta-object just involves writing a method for to handle each of these "events". 4. Compile the language's type declarations to calls on the meta-object. Thus it's the meta-object that decides how most aspects of a type work: whether it can accept having more than one parent (if it does at all), how it dispatches methods (if it does at all) and so forth. However, certain aspects are handled by the representation: allocation of an object, storage of attributes and boxing/unboxing. In some VMs the representation also needs to interact with the GC. Essentially, meta-object + representation = full implementation of some kind of object oriented type (e.g. a class). Usually, you will just pick an existing representation and implement the meta-object yourself. Notice this means that you can factor your implementation of OO features using OO principles. ## Representations Representations are low-level things that are closely tied to the underlying VM. They do expose a common API over all of them, however. The following operations are available on representations. * **type_object_for** takes a meta-object and creates a type object that represents the association of the provided meta-object and this representation. What you do with the type object depends on your language. You could see it as an "instantiation handle" - you use it in order to create an instance of an object with the given meta-object/representation pairing. * **instance_of** does exactly what it says - creates a new instance. You can supply it with the type object OR with any existing instance, it doesn't matter. Note that this really does just allocate space in memory for the object; it's not any kind of "high level" instantiation where attributes get pre-populated with empty containers. * **defined** basically tells you if the thing you have is a type object or an actual instance. For many languages you'll not need this. It may come in useful in some languages to distinguish static and instance method dispatch. * **get_attribute** looks up an attribute. It expects to give back an object of some kind. There are variants for native types: **get_attribute_int**, **get_attribute_num** and **get_attribute_str**. All of them expect the object to access the attribute of. You may also pass one or all of an attribute name, a class handle (for when attributes are not keyed just one name) and an index for when it's possible to access an attribute by an offset rather than just by name. What's needed varies by representation. * **bind_attribute** and its native friends are basically what you'd expect, and look largely like get_attribute apart from they take something to store in the attribute rather than doing a lookup. * **hint_for** takes an attribute name and optional a class handle and will hand back - if available - an offset that can also be used to look up the attribute. Interesting in gradual or static typing scenarios. * 6model representations may provide direct support for boxing and unboxing native types. This is exposed through [set|get]_[int|num|str] operations. Details vary by representation. ## Meta-objects A meta-object is simply an object that says how another object works. Critically, it's __just an object__. It may have attributes and it will certainly have methods. Like any other object, it also has a meta-object that says how it works. You may be tempted to start categorising objects into "normal objects" versus "meta-objects", but it's important to understand that 6model makes no distinction. A meta-object isn't any kind of special object, it's just an object that happens to be serving a particular role. Meta-objects contain methods that relate to certain events in the lifetime of a type. Let's imagine we have a really simple language where we can declare some kind of type that has methods, make instances of it and call the methods (granted, the instances are a bit useless until we add attributes). We could write (in NQP) the following. class SimpleMetaObject { has %!methods; method new_type() { my $meta-object := self.new(); return nqp::newtype($meta-object, 'HashAttrStore'); } method add_method($type, $name, $code) { %!methods{$name} := $code; } method find_method($type, $name) { %!methods{$name} } } Notice how this meta-object is just written as a normal class. Of course, the class itself has a meta-object saying how it works - it's meta-objects all the way down. The next thing to note is that we just used a hash in order to implement our method store. Creating a new type and adding a method are just methods that we include. Here's how we can use the meta-object to define a new type, and add a method. # Create a new type. my $type := SimpleMetaObject.new(); # Add a method. $type.HOW.add_method($type, 'drink', -> $self { say("mmmm...Starobrno!") }); The .HOW macro in NQP maps to the PIR get_how opcode and it is used to get hold of the meta-object. We just pass a simple lambda expression in to add_method in order to specify what happens when the method is called. Finally, we can make an instance and call the method. # Make an instance. my $obj := nqp::create($type); # Call the method. $obj.drink(); Notice that we didn't ever call our find_method method ourselves. In fact, this is the only place so far where 6model has actually given us any kind of restriction on how our meta-object should look; the names of add_method and new_type are conventions. Under the hood, 6model has gone and used the find_method method on the meta-object when we did a method call on the object. A question you may be left with is why the convention to take the type object as the first parameter in all of the methods of the meta-object. This isn't needed when doing something more "class based", but is important in a more prototype-OO-ish setting. ## Performance So far we have seen that one would tend to implement things like method dispatch and type checking by writing methods in the meta-object. This may feel a little heavyweight for an operation that is very common, and indeed it is. 6model thus provides you with the possibility to publish some "caches" that expose views of certain aspects of the meta-object in a more low-level way to the VM. Thus it is able to perform some frequent opertaions much more quickly. Of note, it is possible to publish: * A name to method cache, which is useful for dispatching methods by name. This is useful in most dynamic languages, and means that method dispatch can just be looking in a hash table. Generally this presents a flat view, with the methods from any parent types included so there is no walking required at runtime. * A v-table, which you can also thing of as an index to method cache. This is useful in static or gradually typed languages, where a method call can be mapped to looking for the method in a certain slot. Since this boils down to a (machine-level) array lookup, it's fast. * A type check cache. This is useful for doing fast type checks. It contains references to other types that the current one could be considered as "doing"/"being". Thus it is useful for is-a and does-a operations. The current 6model implementation has it being scanned linearly. This is a low-level loop over a low-level array, so it should be pretty fast, however. The word "cache" is chosen very deliberately. It's important that the meta-object knows that it is responsible for the updaing of any of the extra views of itself that it chooses to publish. Put another way, in 6model the meta-object itself is always the authoritative source. nqp-2013.12.1/docs/6model/repr-compose-protocol.markdown000066400000000000000000000102751225523575400227720ustar00rootroot00000000000000# REPR Compose Protocol In 6model, representations take responsibility for memory layout, while a meta-object is responsible for other aspects of type-ness (dispatch, type checking, etc.) Typically, meta-objects are at some point "composed" - that is, they reach a point where the definition of the type they represent is either closed or complete in some sense. Certain representations need to be (or in some cases, may be) configured. For example, a representation that does efficient storage of an object's attributes needs configuring with information about the things it should store. This configuration happens through the REPR composition protocol. The meta-object uses the nqp::composetype primitive in order to do this. The protocol is defined entirely in terms of arrays and hashes. Why? So we don't have to define a particularly complex object system in order to define an object system. :-) At the top level, a hash is always passed. Its keys indicate the configuration for a specific part of the protocol, the the values are a data structure providing the appropriate information. The rest of this documentation describes these protocols; each heading is a key that can appear in the top level hash, and what's below it indicates what should fall beneath those keys. ## attribute The value is an array with one element for each entry in the MRO, from most derived to least derived. Each element is in turn an array, consisting of 3 elements: * The type object of the type at this point in the MRO * An array of hashes, each hash describing an attribute * The immediate parents, if any, of the type object in question The hash describing an individual attribute must have the following keys: * name - provides the name of the attribute It may optionally have these keys: * type - type object specifying the type of the attribute. Note that this is used purely for the purpose of allocation. It is NOT up to the REPR to do type checks. Anything without this is assumed to be a reference type. In fact, anything that's a reference type is uninteresting in terms of this key since it just gets a reference to another object. It's native types or other compact things that can be flattened into the object body that are interesting. * box_target - if this key is present, then this type is a target for boxing or unboxing. * auto_viv_container - if this key is present then an access to an attribute that is uninitialized will cause that attribute to be set to a clone of the value under this key. If the value is a type object, the clone will not take place, since cloning a type object is meaningless. * positional_delegate - if this key is present, the given (reference type) attribute will be delegated to if the positional part of the REPR API is used with the object. This is primarily to support languages that need to reasonably efficiently provide positional things that can also be mixed in to in arbitrary ways. * associative_delegate - the same as positional_delegate, for the associative part of the REPR API. ## integer A hash that may have the following keys: * bits - the number of bits. Which sizes are supported are up to the REPR. * unsigned - if this key exists, then the stored value is unsigned. ## float A hash that may have the following keys: * bits - the number of bits. Which sizes are supported are up to the REPR. ## array A hash that may have the following keys: * type - the type of the array attributes. While all reference types are equivalent, native types will be inlined, leading to a compact array. A REPR is free to decide what types it supports, and just because it is asked to be an array of 1-bit ints in no way obligates it to use a bit of storage for each element. Again, this is just about layout and lookup, not about type checking. ## hash * valuetype - the type of the hash value. As with arrays, it's up to the REPR how or if it handles native types. Just about layout. * keytype - the type of the hash key. REPRs are likely to be restrictive here, since they need to understand the representation of the provided key well enough to hash it. This will probably mean strings and whatever REPR ObjAt in Perl 6 (or some other language's variant) has. nqp-2013.12.1/docs/bootstrapping.pod000066400000000000000000000021001225523575400171510ustar00rootroot00000000000000=head1 Bootstrapping procedure for nqp-rx NPQ-rx is a bootstrapped compiler, which means that it uses itself to compile itself. To make the first compilation possible, a compiled version of the compiler is stored in F and included in the source code repository. Also the parrot virtual machine ships the same C files. When you make changes to the compiler, eventually you need to update these I files. Here is how you proceed to update the bootstrapping files nqp-rx and parrot. At any stage, if C fails, don't go ahead with the following steps, but fix the problem first. =over =item * Make your changes, run C =item * Run C and C =item * Commit the non-bootstrap files that you modified yourself =item * Commit the bootstrap files =item * Copy the I files over to parrot: cp src/stage0/*.pir $PARROT_SRC/ext/nqp-rx/src/stage0 =item * In the parrot source, run C and commit =back References: L nqp-2013.12.1/docs/continuations.pod000066400000000000000000000154101225523575400171630ustar00rootroot00000000000000=head1 Continuations in NQP This document describes a somewhat experimental and JVM-only NQP feature: the ability to freeze and thaw stack frames for implementing unusual control flow. =head2 Interface I think that the best abstraction to what I'm trying to build here is the B (L). =over 4 =item nqp::continuationreset($tag, { ... }) Executes the argument, marking the stack for a subsequent C operation within the dynamic scope. The C<$tag> is an object which can be used later by C to find a specific reset frame. =item nqp::continuationcontrol($protect, $tag, -> $cont { ... }) Slices off the part of the evaluation stack between the current call frame and the innermost enclosing C. If C<$tag> is not null, only resets with the same tag are considered; otherwise the innermost reset will be taken regardless of tag. If there is no such reset, or if there is a non-saveable frame (aka continuation barrier) between the current position and the matching reset, an error occurs. The sliced-off part of the stack is wrapped in an NQP object and passed to the callback function; it is removed from the stack, so B to return immediately with the returned value>. C<$protect> is an integer. If it is 1, the reset will be retained on the stack while the handler is being executed; if it is 0, the reset will be removed. Other values are undefined. In no case will the matched reset be included in the captured continuation object (although an unmatched reset which is skipped over would be). Thus, C corresponds to the standard C operator, while C corresponds to the standard C operator. To simulate C and C, manually add the reset before invoking the continuation. =item nqp::continuationinvoke($cont, $inject) Pastes the saved call frames onto the current stack, such that C calls C<$inject> within the restored dynamic scope and returns its return value. Control returns to the caller when the callback to C returns, with the same value. This can be used multiple times on the same continuation. (Actually, delimited continuations are traditionally represented as functions, so this operator is implicit and unnamed. But sixmodel makes that slightly tricky.) =item nqp::continuationclone($cont) Produces a shallow clone of the passed continuation. This is presently necessary in situations where a continuation must be active twice at the same time. At present, lexical variables will remain shared but locals will not. B