JFIFXX    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222"4 ,PG"Z_4˷kjزZ,F+_z,© zh6٨icfu#ډb_N?wQ5-~I8TK<5oIv-k_U_~bMdӜUHh?]EwQk{_}qFW7HTՑYF?_'ϔ_Ջt=||I 6έ"D/[k9Y8ds|\Ҿp6Ҵ].6znopM[mei$[soᘨ˸ nɜG-ĨUycP3.DBli;hjx7Z^NhN3u{:jx힞#M&jL P@_ P&o89@Sz6t7#Oߋ s}YfTlmrZ)'Nk۞pw\Tȯ?8`Oi{wﭹW[r Q4F׊3m&L=h3z~#\l :F,j@ ʱwQT8"kJO6֚l}R>ډK]y&p}b;N1mr$|7>e@BTM*-iHgD) Em|ؘbҗaҾt4oG*oCNrPQ@z,|?W[0:n,jWiEW$~/hp\?{(0+Y8rΟ+>S-SVN;}s?. w9˟<Mq4Wv'{)01mBVW[8/< %wT^5b)iM pgN&ݝVO~qu9 !J27$O-! :%H ـyΠM=t{!S oK8txA& j0 vF Y|y ~6@c1vOpIg4lODL Rcj_uX63?nkWyf;^*B @~a`Eu+6L.ü>}y}_O6͐:YrGXkGl^w~㒶syIu! W XN7BVO!X2wvGRfT#t/?%8^WaTGcLMI(J1~8?aT ]ASE(*E} 2#I/׍qz^t̔bYz4xt){ OH+(EA&NXTo"XC')}Jzp ~5}^+6wcQ|LpdH}(.|kc4^"Z?ȕ a<L!039C EuCFEwç ;n?*oB8bʝ'#RqfM}7]s2tcS{\icTx;\7KPʇ Z O-~c>"?PEO8@8GQgaՎ󁶠䧘_%#r>1zaebqcPѵn#L =׀t L7`VA{C:ge@w1 Xp3c3ġpM"'-@n4fGB3DJ8[JoߐgK)ƛ$ 83+ 6ʻ SkI*KZlT _`?KQKdB`s}>`*>,*@JdoF*弝O}ks]yߘc1GV<=776qPTtXԀ!9*44Tހ3XΛex46YD  BdemDa\_l,G/֌7Y](xTt^%GE4}bTڹ;Y)BQu>J/J ⮶.XԄjݳ+Ed r5_D1 o Bx΢#<W8R6@gM. drD>(otU@x=~v2 ӣdoBd3eO6㣷ݜ66YQz`S{\P~z m5{J/L1xO\ZFu>ck#&:`$ai>2ΔloF[hlEܺΠk:)` $[69kOw\|8}ބ:񶐕IA1/=2[,!.}gN#ub ~݊}34qdELc$"[qU硬g^%B zrpJru%v\h1Yne`ǥ:gpQM~^Xi `S:V29.PV?Bk AEvw%_9CQwKekPؠ\;Io d{ ߞoc1eP\ `E=@KIRYK2NPlLɀ)&eB+ь( JTx_?EZ }@ 6U뙢طzdWIn` D噥[uV"G&Ú2g}&m?ċ"Om# {ON"SXNeysQ@FnVgdX~nj]J58up~.`r\O,ư0oS _Ml4kv\JSdxSW<AeIX$Iw:Sy›R9Q[,5;@]%u@ *rolbI  +%m:͇ZVủθau,RW33 dJeTYE.Mϧ-oj3+yy^cVO9NV\nd1 !͕_)av;թMlWR1)ElP;yوÏu 3k5Pr6<⒲l!˞*u־n!l:UNW %Chx8vL'X@*)̮ˍ D-M+JUkvK+x8cY?Ԡ~3mo|u@[XeYC\Kpx8oCC&N~3-H MXsu<`~"WL$8ξ3a)|:@m\^`@ҷ)5p+6p%i)P Mngc#0AruzRL+xSS?ʮ}()#tmˇ!0}}y$6Lt;$ʳ{^6{v6ķܰgVcnn ~zx«,2u?cE+ȘH؎%Za)X>uWTzNyosFQƤ$*&LLXL)1" LeOɟ9=:tZcŽY?ӭVwv~,Yrۗ|yGaFC.+ v1fήJ]STBn5sW}y$~z'c 8  ,! pVNSNNqy8z˱A4*'2n<s^ǧ˭PJޮɏUGLJ*#i}K%,)[z21z ?Nin1?TIR#m-1lA`fT5+ܐcq՝ʐ,3f2Uեmab#ŠdQy>\)SLYw#.ʑf ,"+w~N'cO3FN<)j&,- љ֊_zSTǦw>?nU仆Ve0$CdrP m׈eXmVu L.bֹ [Դaզ*\y8Է:Ez\0KqC b̘cөQ=0YsNS.3.Oo:#v7[#߫ 5܎LEr49nCOWlG^0k%;YߝZǓ:S#|}y,/kLd TA(AI$+I3;Y*Z}|ӧOdv..#:nf>>ȶITX 8y"dR|)0=n46ⲑ+ra ~]R̲c?6(q;5% |uj~z8R=XIV=|{vGj\gcqz؋%Mߍ1y#@f^^>N#x#۹6Y~?dfPO{P4Vu1E1J *|%JN`eWuzk M6q t[ gGvWIGu_ft5j"Y:Tɐ*; e54q$C2d} _SL#mYpO.C;cHi#֩%+) ӍƲVSYźg |tj38r|V1#;.SQA[S#`n+$$I P\[@s(EDzP])8G#0B[ىXIIq<9~[Z멜Z⊔IWU&A>P~#dp]9 "cP Md?٥Ifتuk/F9c*9Ǎ:ØFzn*@|Iށ9N3{'['ͬҲ4#}!V Fu,,mTIkv C7vB6kT91*l '~ƞFlU'M ][ΩũJ_{iIn$L jOdxkza۪#EClx˘oVɞljr)/,߬hL#^Lф,íMƁe̩NBLiLq}(q6IçJ$WE$:=#(KBzђ xlx?>Պ+>W,Ly!_DŌlQ![ SJ1ƐY}b,+Loxɓ)=yoh@꥟/Iѭ=Py9 ۍYӘe+pJnϱ?V\SO%(t =?MR[Șd/ nlB7j !;ӥ/[-A>dNsLj ,ɪv=1c.SQO3UƀܽE̻9GϷD7(}Ävӌ\y_0[w <΍>a_[0+LF.޺f>oNTq;y\bՃyjH<|q-eɏ_?_9+PHp$[uxK wMwNی'$Y2=qKBP~Yul:[<F12O5=d]Ysw:ϮEj,_QXz`H1,#II dwrP˂@ZJVy$\y{}^~[:NߌUOdؾe${p>G3cĖlʌ ת[`ϱ-WdgIig2 }s ؤ(%#sS@~3XnRG~\jc3vӍLM[JBTs3}jNʖW;7ç?=XF=-=qߚ#='c7ڑWI(O+=:uxqe2zi+kuGR0&eniT^J~\jyp'dtGsO39* b#Ɋ p[BwsT>d4ۧsnvnU_~,vƜJ1s QIz)(lv8MU=;56Gs#KMP=LvyGd}VwWBF'à ?MHUg2 !p7Qjڴ=ju JnA suMeƆҔ!)'8Ϣٔޝ(Vpצ֖d=ICJǠ{qkԭ߸i@Ku|p=..*+xz[Aqġ#s2aƊRR)*HRsi~a &fMP-KL@ZXy'x{}Zm+:)) IJ-iu ܒH'L(7yGӜq j 6ߌg1go,kرtY?W,pefOQS!K۟cҒA|սj>=⬒˧L[ ߿2JaB~Ru:Q] 0H~]7ƼI(}cq 'ήETq?fabӥvr )o-Q_'ᴎoK;Vo%~OK *bf:-ťIR`B5!RB@ï u ̯e\_U_ gES3QTaxU<~c?*#]MW,[8Oax]1bC|踤Plw5V%){t<d50iXSUm:Z┵i"1^B-PhJ&)O*DcWvM)}Pܗ-q\mmζZ-l@}aE6F@&Sg@ݚM ȹ 4#p\HdYDoH"\..RBHz_/5˘6KhJRPmƶim3,#ccoqa)*PtRmk7xDE\Y閣_X<~)c[[BP6YqS0%_;Àv~| VS؇ 'O0F0\U-d@7SJ*z3nyPOm~P3|Yʉr#CSN@ ƮRN)r"C:: #qbY. 6[2K2uǦHYRQMV G$Q+.>nNHq^ qmMVD+-#*U̒ p욳u:IBmPV@Or[b= 1UE_NmyKbNOU}the`|6֮P>\2PVIDiPO;9rmAHGWS]J*_G+kP2KaZH'KxWMZ%OYDRc+o?qGhmdSoh\D|:WUAQc yTq~^H/#pCZTI1ӏT4"ČZ}`w#*,ʹ 0i課Om*da^gJ݅{le9uF#Tֲ̲ٞC"qߍ ոޑo#XZTp@ o8(jdxw],f`~|,s^f1t|m򸄭/ctr5s79Q4H1꠲BB@l9@C+wpxu£Yc9?`@#omHs2)=2.ljg9$YS%*LRY7Z,*=䷘$armoϰUW.|rufIGwtZwo~5 YյhO+=8fF)W7L9lM̘·Y֘YLf큹pRF99.A "wz=E\Z'a 2Ǚ#;'}G*l^"q+2FQ hjkŦ${ޮ-T٭cf|3#~RJt$b(R(rdx >U b&9,>%E\ Άe$'q't*אެb-|dSBOO$R+H)܎K1m`;J2Y~9Og8=vqD`K[F)k[1m޼cn]skz$@)!I x՝"v9=ZA=`Ɠi :E)`7vI}dYI_ o:obo 3Q&D&2= Ά;>hy.*ⅥSӬ+q&j|UƧ}J0WW< ۋS)jQRjƯrN)Gű4Ѷ(S)Ǣ8iW52No˓ ۍ%5brOnL;n\G=^UdI8$&h'+(cȁ߫klS^cƗjԌEꭔgFȒ@}O*;evWVYJ\]X'5ղkFb 6Ro՜mi Ni>J?lPmU}>_Z&KKqrIDՉ~q3fL:Se>E-G{L6pe,8QIhaXaUA'ʂs+טIjP-y8ۈZ?J$WP Rs]|l(ԓsƊio(S0Y 8T97.WiLc~dxcE|2!XKƘਫ਼$((6~|d9u+qd^389Y6L.I?iIq9)O/뚅OXXVZF[یgQLK1RҖr@v#XlFНyS87kF!AsM^rkpjPDyS$Nqnxҍ!Uf!ehi2m`YI9r6 TFC}/y^Η5d'9A-J>{_l+`A['յϛ#w:݅%X}&PStQ"-\縵/$ƗhXb*yBS;Wջ_mcvt?2}1;qSdd~u:2k52R~z+|HE!)Ǟl7`0<,2*Hl-x^'_TVgZA'j ^2ΪN7t?w x1fIzC-ȖK^q;-WDvT78Z hK(P:Q- 8nZ܃e貾<1YT<,"6{/ ?͟|1:#gW>$dJdB=jf[%rE^il:BxSּ1հ,=*7 fcG#q eh?27,!7x6nLC4x},GeǝtC.vS F43zz\;QYC,6~;RYS/6|25vTimlv& nRh^ejRLGf? ۉҬܦƩ|Ȱ>3!viʯ>vオX3e_1zKȗ\qHS,EW[㺨uch⍸O}a>q6n6N6qN ! 1AQaq0@"2BRb#Pr3C`Scst$4D%Td ?Na3mCwxAmqmm$4n淿t'C"wzU=D\R+wp+YT&պ@ƃ3ޯ?AﶂaŘ@-Q=9Dռѻ@MVP܅G5fY6# ?0UQ,IX(6ڵ[DIMNލc&υj\XR|,4 jThAe^db#$]wOӪ1y%LYm뭛CUƃߜ}Cy1XνmF8jI]HۺиE@Ii;r8ӭVFՇ| &?3|xBMuSGe=Ӕ#BE5GY!z_eqр/W>|-Ci߇t1ޯќdR3ug=0 5[?#͏qcfH{ ?u=??ǯ}ZzhmΔBFTWPxs}G93 )gGR<>r h$'nchPBjJҧH -N1N?~}-q!=_2hcMlvY%UE@|vM2.Y[|y"EïKZF,ɯ?,q?vM 80jx";9vk+ ֧ ȺU?%vcVmA6Qg^MA}3nl QRNl8kkn'(M7m9وq%ޟ*h$Zk"$9: ?U8Sl,,|ɒxH(ѷGn/Q4PG%Ա8N! &7;eKM749R/%lc>x;>C:th?aKXbheᜋ^$Iհ hr7%F$EFdt5+(M6tÜUU|zW=aTsTgdqPQb'm1{|YXNb P~F^F:k6"j! Ir`1&-$Bevk:y#ywI0x=D4tUPZHڠ底taP6b>xaQ# WeFŮNjpJ* mQN*I-*ȩFg3 5Vʊɮa5FO@{NX?H]31Ri_uѕ 0 F~:60p͈SqX#a5>`o&+<2D: ڝ$nP*)N|yEjF5ټeihyZ >kbHavh-#!Po=@k̆IEN@}Ll?jO߭ʞQ|A07xwt!xfI2?Z<ץTcUj]陎Ltl }5ϓ$,Omˊ;@OjEj(ا,LXLOЦ90O .anA7j4 W_ٓzWjcBy՗+EM)dNg6y1_xp$Lv:9"zpʙ$^JԼ*ϭo=xLj6Ju82AH3$ٕ@=Vv]'qEz;I˼)=ɯx /W(Vp$ mu񶤑OqˎTr㠚xsrGCbypG1ߠw e8$⿄/M{*}W]˷.CK\ުx/$WPwr |i&}{X >$-l?-zglΆ(FhvS*b߲ڡn,|)mrH[a3ר[13o_U3TC$(=)0kgP u^=4 WYCҸ:vQרXàtkm,t*^,}D* "(I9R>``[~Q]#afi6l86:,ssN6j"A4IuQ6E,GnHzSHOuk5$I4ؤQ9@CwpBGv[]uOv0I4\yQѸ~>Z8Taqޣ;za/SI:ܫ_|>=Z8:SUIJ"IY8%b8H:QO6;7ISJҌAά3>cE+&jf$eC+z;V rʺmyeaQf&6ND.:NTvm<- uǝ\MvZYNNT-A>jr!SnO 13Ns%3D@`ܟ 1^c< aɽ̲Xë#w|ycW=9I*H8p^(4՗karOcWtO\ƍR8'KIQ?5>[}yUײ -h=% qThG2)"ו3]!kB*pFDlA,eEiHfPs5H:Փ~H0DتDIhF3c2E9H5zԑʚiX=:mxghd(v׊9iSOd@0ڽ:p5h-t&Xqӕ,ie|7A2O%PEhtjY1wЃ!  ࢽMy7\a@ţJ 4ȻF@o̒?4wx)]P~u57X 9^ܩU;Iꭆ 5 eK27({|Y׎ V\"Z1 Z}(Ǝ"1S_vE30>p; ΝD%xW?W?vo^Vidr[/&>~`9Why;R ;;ɮT?r$g1KACcKl:'3 cﳯ*"t8~l)m+U,z`(>yJ?h>]vЍG*{`;y]IT ;cNUfo¾h/$|NS1S"HVT4uhǜ]v;5͠x'C\SBplh}N ABx%ޭl/Twʽ]D=Kžr㻠l4SO?=k M: cCa#ha)ѐxcsgPiG{+xQI= zԫ+ 8"kñj=|c yCF/*9жh{ ?4o kmQNx;Y4膚aw?6>e]Qr:g,i"ԩA*M7qB?ӕFhV25r[7 Y }LR}*sg+xr2U=*'WSZDW]WǞ<叓{$9Ou4y90-1'*D`c^o?(9uݐ'PI& fJݮ:wSjfP1F:X H9dԯ˝[_54 }*;@ܨ ðynT?ןd#4rGͨH1|-#MrS3G3).᧏3vz֑r$G"`j 1tx0<ƆWh6y6,œGagAyb)hDß_mü gG;evݝnQ C-*oyaMI><]obD":GA-\%LT8c)+y76oQ#*{(F⽕y=rW\p۩cA^e6KʐcVf5$'->ՉN"F"UQ@fGb~#&M=8טJNu9D[̤so~ G9TtW^g5y$bY'سǴ=U-2 #MCt(i lj@Q 5̣i*OsxKf}\M{EV{υƇ);HIfeLȣr2>WIȂ6ik 5YOxȺ>Yf5'|H+98pjn.OyjY~iw'l;s2Y:'lgꥴ)o#'SaaKZ m}`169n"xI *+ }FP"l45'ZgE8?[X7(.Q-*ތL@̲v.5[=t\+CNܛ,gSQnH}*FG16&:t4ُ"Ạ$b |#rsaT ]ӽDP7ո0y)e$ٕvIh'QEAm*HRI=: 4牢) %_iNݧl] NtGHL ɱg<1V,J~ٹ"KQ 9HS9?@kr;we݁]I!{ @G["`J:n]{cAEVʆ#U96j#Ym\qe4hB7Cdv\MNgmAyQL4uLjj9#44tl^}LnR!t±]rh6ٍ>yҏNfU  Fm@8}/ujb9he:AyծwGpΧh5l}3p468)Udc;Us/֔YX1O2uqs`hwgr~{ RmhN؎*q 42*th>#E#HvOq}6e\,Wk#Xb>p}դ3T5†6[@Py*n|'f֧>lư΂̺SU'*qp_SM 'c6m ySʨ;MrƋmKxo,GmPAG:iw9}M(^V$ǒѽ9| aJSQarB;}ٻ֢2%Uc#gNaݕ'v[OY'3L3;,p]@S{lsX'cjwk'a.}}& dP*bK=ɍ!;3ngΊUߴmt'*{,=SzfD Ako~Gaoq_mi}#mPXhύmxǍ΂巿zfQc|kc?WY$_Lvl߶c`?ljݲˏ!V6UЂ(A4y)HpZ_x>eR$/`^'3qˏ-&Q=?CFVR DfV9{8gnh(P"6[D< E~0<@`G6Hгcc cK.5DdB`?XQ2ٿyqo&+1^ DW0ꊩG#QnL3c/x 11[yxპCWCcUĨ80me4.{muI=f0QRls9f9~fǨa"@8ȁQ#cicG$Gr/$W(WV"m7[mAmboD j۳ l^kh׽ # iXnveTka^Y4BNĕ0 !01@Q"2AaPq3BR?@4QT3,㺠W[=JKϞ2r^7vc:9 EߴwS#dIxu:Hp9E! V 2;73|F9Y*ʬFDu&y؟^EAA(ɩ^GV:ݜDy`Jr29ܾ㝉[E;FzxYGUeYC v-txIsםĘqEb+P\ :>iC';k|zرny]#ǿbQw(r|ӹs[D2v-%@;8<a[\o[ϧwI!*0krs)[J9^ʜp1) "/_>o<1AEy^C`x1'ܣnps`lfQ):lb>MejH^?kl3(z:1ŠK&?Q~{ٺhy/[V|6}KbXmn[-75q94dmc^h X5G-}دBޟ |rtMV+]c?-#ڛ^ǂ}LkrOu>-Dry D?:ޞUǜ7V?瓮"#rչģVR;n/_ ؉vݶe5db9/O009G5nWJpA*r9>1.[tsFnQ V 77R]ɫ8_0<՜IFu(v4Fk3E)N:yڮeP`1}$WSJSQNjٺ޵#lј(5=5lǏmoWv-1v,Wmn߀$x_DȬ0¤#QR[Vkzmw"9ZG7'[=Qj8R?zf\a=OU*oBA|G254 p.w7  &ξxGHp B%$gtЏ򤵍zHNuЯ-'40;_3 !01"@AQa2Pq#3BR?ʩcaen^8F<7;EA{EÖ1U/#d1an.1ě0ʾRh|RAo3m3 % 28Q yφHTo7lW>#i`qca m,B-j݋'mR1Ήt>Vps0IbIC.1Rea]H64B>o]($Bma!=?B KǾ+Ծ"nK*+[T#{EJSQs5:U\wĐf3܆&)IԆwE TlrTf6Q|Rh:[K zc֧GC%\_a84HcObiؖV7H )*ģK~Xhչ04?0 E<}3#u? |gS6ꊤ|I#Hڛ աwX97Ŀ%SLy6č|Fa 8b$sקhb9RAu7˨pČ_\*w묦F 4D~f|("mNKiS>$d7SlA/²SL|6N}S˯g]6; #. 403WebShell
403Webshell
Server IP : 84.32.84.195  /  Your IP : 216.73.216.116
Web Server : LiteSpeed
System : Linux id-dci-web1411.main-hosting.eu 5.14.0-503.34.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar 27 06:00:50 EDT 2025 x86_64
User : u993272038 ( 993272038)
PHP Version : 8.1.31
Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/u993272038/domains/nodexglobalresources.com/public_html/apps/libraries/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/u993272038/domains/nodexglobalresources.com/public_html/apps/libraries/Securimage_library.php
<?php

/**

 * Project:     Securimage: A PHP class for creating and managing form CAPTCHA images<br />

 * File:        securimage.php<br />

 *

 * This library is free software; you can redistribute it and/or

 * modify it under the terms of the GNU Lesser General Public

 * License as published by the Free Software Foundation; either

 * version 2.1 of the License, or any later version.<br /><br />

 *

 * This library is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

 * Lesser General Public License for more details.<br /><br />

 *

 * You should have received a copy of the GNU Lesser General Public

 * License along with this library; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA<br /><br />

 *

 * Any modifications to the library should be indicated clearly in the source code

 * to inform users that the changes are not a part of the original software.<br /><br />

 *

 * If you found this script useful, please take a quick moment to rate it.<br />

 * http://www.hotscripts.com/rate/49400.html  Thanks.

 *

 * @link http://www.phpcaptcha.org Securimage PHP CAPTCHA

 * @link http://www.phpcaptcha.org/latest.zip Download Latest Version

 * @link http://www.phpcaptcha.org/Securimage_Docs/ Online Documentation

 * @copyright 2007 Drew Phillips

 * @author drew010 <drew@drew-phillips.com>

 * @version 1.0.3.1 (March 24, 2008)

 * @package Securimage

 *

 */



/**

  ChangeLog



  1.0.3.1

  - Error reading from wordlist in some cases caused words to be cut off 1 letter short



  1.0.3

  - Removed shadow_text from code which could cause an undefined property error due to removal from previous version



  1.0.2

  - Audible CAPTCHA Code wav files

  - Create codes from a word list instead of random strings



  1.0

  - Added the ability to use a selected character set, rather than a-z0-9 only.

  - Added the multi-color text option to use different colors for each letter.

  - Switched to automatic session handling instead of using files for code storage

  - Added GD Font support if ttf support is not available.  Can use internal GD fonts or load new ones.

  - Added the ability to set line thickness

  - Added option for drawing arced lines over letters

  - Added ability to choose image type for output



*/



/**

 * Output images in JPEG format

 */

define('SI_IMAGE_JPEG', 1);

/**

 * Output images in PNG format

 */

define('SI_IMAGE_PNG',  2);

/**

 * Output images in GIF format

 * Must have GD >= 2.0.28!

 */

define('SI_IMAGE_GIF',  3);



/**

 * Securimage CAPTCHA Class.

 *

 * @package    Securimage

 * @subpackage classes

 *

 */

class Securimage_library {



  /**

   * The desired width of the CAPTCHA image.

   *

   * @var int

   */

  var $image_width = 175;



  /**

   * The desired width of the CAPTCHA image.

   *

   * @var int

   */

  var $image_height = 45;



  /**

   * The image format for output.<br />

   * Valid options: SI_IMAGE_PNG, SI_IMAGE_JPG, SI_IMAGE_GIF

   *

   * @var int

   */

  var $image_type = SI_IMAGE_PNG;



  /**

   * The length of the code to generate.

   *

   * @var int

   */

  var $code_length = 4;



  /**

   * The character set for individual characters in the image.<br />

   * Letters are converted to uppercase.<br />

   * The font must support the letters or there may be problematic substitutions.

   *

   * @var string

   */

 // var $charset = 'ABCDEFGHKLMNPRSTUVWYZ23456789';

  var $charset = '0123456789';



  /**

   * Create codes using this word list

   *

   * @var string  The path to the word list to use for creating CAPTCHA codes

   */

  var $wordlist_file = '../words/words.txt';



  /**

   * True to use a word list file instead of a random code

   *

   * @var bool

   */

  var $use_wordlist  = false;



  /**

   * Whether to use a GD font instead of a TTF font.<br />

   * TTF offers more support and options, but use this if your PHP doesn't support TTF.<br />

   *

   * @var boolean

   */

  var $use_gd_font = false;



  /**

   * The GD font to use.<br />

   * Internal gd fonts can be loaded by their number.<br />

   * Alternatively, a file path can be given and the font will be loaded from file.

   *

   * @var mixed

   */

  var $gd_font_file = 'gdfonts/bubblebath.gdf';



  /**

   * The approximate size of the font in pixels.<br />

   * This does not control the size of the font because that is determined by the GD font itself.<br />

   * This is used to aid the calculations of positioning used by this class.<br />

   *

   * @var int

   */

  var $gd_font_size = 20;



  // Note: These font options below do not apply if you set $use_gd_font to true with the exception of $text_color



  /**

   * The path to the TTF font file to load.

   *

   * @var string

   */

  var $ttf_file = "./elephant.ttf";



  /**

   * The font size.<br />

   * Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2)<br />

   *

   * @var int

   */

  var $font_size = 24;



  /**

   * The minimum angle in degrees, with 0 degrees being left-to-right reading text.<br />

   * Higher values represent a counter-clockwise rotation.<br />

   * For example, a value of 90 would result in bottom-to-top reading text.

   *

   * @var int

   */

  var $text_angle_minimum = -20;



  /**

   * The minimum angle in degrees, with 0 degrees being left-to-right reading text.<br />

   * Higher values represent a counter-clockwise rotation.<br />

   * For example, a value of 90 would result in bottom-to-top reading text.

   *

   * @var int

   */

  var $text_angle_maximum = 20;



  /**

   * The X-Position on the image where letter drawing will begin.<br />

   * This value is in pixels from the left side of the image.

   *

   * @var int

   */

  var $text_x_start = 8;



  /**

   * Letters can be spaced apart at random distances.<br />

   * This is the minimum distance between two letters.<br />

   * This should be <i>at least</i> as wide as a font character.<br />

   * Small values can cause letters to be drawn over eachother.<br />

   *

   * @var int

   */

  var $text_minimum_distance = 30;



  /**

   * Letters can be spaced apart at random distances.<br />

   * This is the maximum distance between two letters.<br />

   * This should be <i>at least</i> as wide as a font character.<br />

   * Small values can cause letters to be drawn over eachother.<br />

   *

   * @var int

   */

  var $text_maximum_distance = 33;



  /**

   * The background color for the image.<br />

   * This should be specified in HTML hex format.<br />

   * Make sure to include the preceding # sign!

   *

   * @var string

   */

  var $image_bg_color = "#e3daed";



  /**

   * The text color to use for drawing characters.<br />

   * This value is ignored if $use_multi_text is set to true.<br />

   * Make sure this contrasts well with the background color.<br />

   * Specify the color in HTML hex format with preceding # sign

   *

   * @see Securimage::$use_multi_text

   * @var string

   */

  var $text_color = "#ff0000";



  /**

   * Set to true to use multiple colors for each character.

   *

   * @see Securimage::$multi_text_color

   * @var boolean

   */

  var $use_multi_text = true;



  /**

   * String of HTML hex colors to use.<br />

   * Separate each possible color with commas.<br />

   * Be sure to precede each value with the # sign.

   *

   * @var string

   */

  var $multi_text_color = "#0a68dd,#f65c47,#8d32fd";



  /**

   * Set to true to make the characters appear transparent.

   *

   * @see Securimage::$text_transparency_percentage

   * @var boolean

   */

  var $use_transparent_text = true;



  /**

   * The percentage of transparency, 0 to 100.<br />

   * A value of 0 is completely opaque, 100 is completely transparent (invisble)

   *

   * @see Securimage::$use_transparent_text

   * @var int

   */

  var $text_transparency_percentage = 15;





  // Line options

  /**

   * Draw vertical and horizontal lines on the image.

   *

   * @see Securimage::$line_color

   * @see Securimage::$line_distance

   * @see Securimage::$line_thickness

   * @see Securimage::$draw_lines_over_text

   * @var boolean

   */

  var $draw_lines = true;



  /**

   * The color of the lines drawn on the image.<br />

   * Use HTML hex format with preceding # sign.

   *

   * @see Securimage::$draw_lines

   * @var string

   */

  var $line_color = "#80BFFF";



  /**

   * How far apart to space the lines from eachother in pixels.

   *

   * @see Securimage::$draw_lines

   * @var int

   */

  var $line_distance = 5;



  /**

   * How thick to draw the lines in pixels.<br />

   * 1-3 is ideal depending on distance

   *

   * @see Securimage::$draw_lines

   * @see Securimage::$line_distance

   * @var int

   */

  var $line_thickness = 1;



  /**

   * Set to true to draw angled lines on the image in addition to the horizontal and vertical lines.

   *

   * @see Securimage::$draw_lines

   * @var boolean

   */

  var $draw_angled_lines = false;



  /**

   * Draw the lines over the text.<br />

   * If fales lines will be drawn before putting the text on the image.<br />

   * This can make the image hard for humans to read depending on the line thickness and distance.

   *

   * @var boolean

   */

  var $draw_lines_over_text = false;



  /**

   * For added security, it is a good idea to draw arced lines over the letters to make it harder for bots to segment the letters.<br />

   * Two arced lines will be drawn over the text on each side of the image.<br />

   * This is currently expirimental and may be off in certain configurations.

   *

   * @var boolean

   */

  var $arc_linethrough = true;



  /**

   * The colors or color of the arced lines.<br />

   * Use HTML hex notation with preceding # sign, and separate each value with a comma.<br />

   * This should be similar to your font color for single color images.

   *

   * @var string

   */

  var $arc_line_colors = "#8080ff";



  /**

   * Full path to the WAV files to use to make the audio files, include trailing /.<br />

   * Name Files  [A-Z0-9].wav

   *

   * @since 1.0.1

   * @var string

   */

  var $audio_path = './audio/';





  //END USER CONFIGURATION

  //There should be no need to edit below unless you really know what you are doing.



  /**

   * The gd image resource.

   *

   * @access private

   * @var resource

   */

  var $im;



  /**

   * The background image resource

   *

   * @access private

   * @var resource

   */

  var $bgimg;



  /**

   * The code generated by the script

   *

   * @access private

   * @var string

   */

  var $code;



  /**

   * The code that was entered by the user

   *

   * @access private

   * @var string

   */

  var $code_entered;



  /**

   * Whether or not the correct code was entered

   *

   * @access private

   * @var boolean

   */

  var $correct_code;



  var $CI;

  /**

   * Class constructor.<br />

   * Because the class uses sessions, this will attempt to start a session if there is no previous one.<br />

   * If you do not start a session before calling the class, the constructor must be called before any

   * output is sent to the browser.

   *

   * <code>

   *   $securimage = new Securimage();

   * </code>

   *

   */   



  public function Securimage_library()

  {

	  

	  $this->CI =& get_instance();

	 // Load session library and start 

	  $this->CI->load->driver('session');

  }

  

  public function initialize($mobile = false)

  {

	// Load the Securimage config file

	if ($mobile == true)

	{

		include(APPPATH.'config/securimage_mobile'.EXT);

	}

	else

	{

		include(APPPATH.'config/securimage_normal'.EXT);

	}

	

    if (isset($securimage))

    {

		switch($securimage['image_type'])

		{

			case 'SI_IMAGE_JPEG':

				$this->image_type = SI_IMAGE_JPEG;

			break;

			case 'SI_IMAGE_GIF':

				$this->image_type = SI_IMAGE_GIF;

			break;

			default:

				$this->image_type = SI_IMAGE_PNG;

			break;

		}

		

		$this->image_width = $securimage['image_width'];

		$this->image_height = $securimage['image_height'];

		$this->code_length = $securimage['code_length'];

		$this->charset = $securimage['charset'];

		$this->wordlist_file = $securimage['wordlist_file'];

		$this->use_wordlist  = $securimage['use_wordlist'];

		$this->use_gd_font = $securimage['use_gd_font'];

		$this->gd_font_file = $securimage['gd_font_file'];

		$this->gd_font_size = $securimage['gd_font_size'];

		$this->ttf_file = $securimage['ttf_file'];

		$this->font_size = $securimage['font_size'];

		$this->text_angle_minimum = $securimage['text_angle_minimum'];

		$this->text_angle_maximum = $securimage['text_angle_maximum'];

		$this->text_x_start = $securimage['text_x_start'];

		$this->text_minimum_distance = $securimage['text_minimum_distance'];

		$this->text_maximum_distance = $securimage['text_maximum_distance'];

		$this->image_bg_color = $securimage['image_bg_color'];

		$this->text_color = $securimage['text_color'];

		$this->use_multi_text = $securimage['use_multi_text'];

		$this->multi_text_color = $securimage['multi_text_color'];

		$this->use_transparent_text = $securimage['use_transparent_text'];

		$this->text_transparency_percentage = $securimage['text_transparency_percentage'];

		$this->draw_lines = $securimage['draw_lines'];

		$this->line_color = $securimage['line_color'];

		$this->line_distance = $securimage['line_distance'];

		$this->line_thickness = $securimage['line_thickness'];

		$this->draw_angled_lines =$securimage['draw_angled_lines'];

		$this->draw_lines_over_text = $securimage['draw_lines_over_text'];

		$this->arc_linethrough = $securimage['arc_linethrough'];

		$this->arc_line_colors = $securimage['arc_line_colors'];

		$this->audio_path = $securimage['audio_path'];

	}

  }



  /**

   * Generate a code and output the image to the browser.

   *

   * <code>

   *   <?php

   *   include 'securimage.php';

   *   $securimage = new Securimage();

   *   $securimage->show('bg.jpg');

   *   ?>

   * </code>

   *

   * @param string $background_image  The path to an image to use as the background for the CAPTCHA

   */

  public function show($background_image = "")

  {

    if($background_image != "" && is_readable($background_image)) {

      $this->bgimg = $background_image;

    }

    $this->doImage();

  }



  /**

   * Validate the code entered by the user.

   *

   * <code>

   *   $code = $_POST['code'];

   *   if ($securimage->check($code) == false) {

   *     die("Sorry, the code entered did not match.");

   *   } else {

   *     $valid = true;

   *   }

   * </code>

   * @param string $code  The code the user entered

   * @return boolean  true if the code was correct, false if not

   */

 public  function check($code)

  {

    $this->code_entered = $code;

    $this->validate();

    return $this->correct_code;

  }



  /**

   * Generate and output the image

   *

   * @access private

   *

   */

  public function doImage()

  {

    if($this->use_transparent_text == true || $this->bgimg != "") {

      $this->im = imagecreatetruecolor($this->image_width, $this->image_height);

      $bgcolor = imagecolorallocate($this->im, hexdec(substr($this->image_bg_color, 1, 2)), hexdec(substr($this->image_bg_color, 3, 2)), hexdec(substr($this->image_bg_color, 5, 2)));

      imagefilledrectangle($this->im, 0, 0, imagesx($this->im), imagesy($this->im), $bgcolor);

    } else { //no transparency

      $this->im = imagecreate($this->image_width, $this->image_height);

      $bgcolor = imagecolorallocate($this->im, hexdec(substr($this->image_bg_color, 1, 2)), hexdec(substr($this->image_bg_color, 3, 2)), hexdec(substr($this->image_bg_color, 5, 2)));

    }



    if($this->bgimg != "") { $this->setBackground(); }



    $this->createCode();



    if (!$this->draw_lines_over_text && $this->draw_lines) $this->drawLines();



    $this->drawWord();



    if ($this->arc_linethrough == true) $this->arcLines();



    if ($this->draw_lines_over_text && $this->draw_lines) $this->drawLines();



    $this->output();



  }



  /**

   * Set the background of the CAPTCHA image

   *

   * @access private

   *

   */

  public function setBackground()

  {

    $dat = @getimagesize($this->bgimg);

    if($dat == false) { return; }



    switch($dat[2]) {

      case 1:  $newim = @imagecreatefromgif($this->bgimg); break;

      case 2:  $newim = @imagecreatefromjpeg($this->bgimg); break;

      case 3:  $newim = @imagecreatefrompng($this->bgimg); break;

      case 15: $newim = @imagecreatefromwbmp($this->bgimg); break;

      case 16: $newim = @imagecreatefromxbm($this->bgimg); break;

      default: return;

    }



    if(!$newim) return;



    imagecopy($this->im, $newim, 0, 0, 0, 0, $this->image_width, $this->image_height);

  }



  /**

   * Draw arced lines over the text

   *

   * @access private

   *

   */

   public function arcLines()

  {

    $colors = explode(',', $this->arc_line_colors);

    imagesetthickness($this->im, 3);



    $color = $colors[rand(0, sizeof($colors) - 1)];

    $linecolor = imagecolorallocate($this->im, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)));



    $xpos   = $this->text_x_start + ($this->font_size * 2) + rand(-5, 5);

    $width  = $this->image_width / 2.66 + rand(3, 10);

    $height = $this->font_size * 2.14 - rand(3, 10);



    if ( rand(0,100) % 2 == 0 ) {

      $start = rand(0,66);

      $ypos  = $this->image_height / 2 - rand(5, 15);

      $xpos += rand(5, 15);

    } else {

      $start = rand(180, 246);

      $ypos  = $this->image_height / 2 + rand(5, 15);

    }



    $end = $start + rand(75, 110);



    imagearc($this->im, $xpos, $ypos, $width, $height, $start, $end, $linecolor);



    $color = $colors[rand(0, sizeof($colors) - 1)];

    $linecolor = imagecolorallocate($this->im, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)));



    if ( rand(1,75) % 2 == 0 ) {

      $start = rand(45, 111);

      $ypos  = $this->image_height / 2 - rand(5, 15);

      $xpos += rand(5, 15);

    } else {

      $start = rand(200, 250);

      $ypos  = $this->image_height / 2 + rand(5, 15);

    }



    $end = $start + rand(75, 100);



    imagearc($this->im, $this->image_width * .75, $ypos, $width, $height, $start, $end, $linecolor);

  }



  /**

   * Draw lines on the image

   *

   * @access private

   *

   */

  public function drawLines()

  {

    $linecolor = imagecolorallocate($this->im, hexdec(substr($this->line_color, 1, 2)), hexdec(substr($this->line_color, 3, 2)), hexdec(substr($this->line_color, 5, 2)));

    imagesetthickness($this->im, $this->line_thickness);



    //vertical lines

    for($x = 1; $x < $this->image_width; $x += $this->line_distance) {

      imageline($this->im, $x, 0, $x, $this->image_height, $linecolor);

    }



    //horizontal lines

    for($y = 11; $y < $this->image_height; $y += $this->line_distance) {

      imageline($this->im, 0, $y, $this->image_width, $y, $linecolor);

    }



    if ($this->draw_angled_lines == true) {

      for ($x = -($this->image_height); $x < $this->image_width; $x += $this->line_distance) {

        imageline($this->im, $x, 0, $x + $this->image_height, $this->image_height, $linecolor);

      }



      for ($x = $this->image_width + $this->image_height; $x > 0; $x -= $this->line_distance) {

        imageline($this->im, $x, 0, $x - $this->image_height, $this->image_height, $linecolor);

      }

    }

  }



  /**

   * Draw the CAPTCHA code over the image

   *

   * @access private

   *

   */

  public function drawWord()

  {

    if ($this->use_gd_font == true) {

      if (!is_int($this->gd_font_file)) { //is a file name

        $font = @imageloadfont($this->gd_font_file);

        if ($font == false) {

          trigger_error("Failed to load GD Font file {$this->gd_font_file} ", E_USER_WARNING);

          return;

        }

      } else { //gd font identifier

        $font = $this->gd_font_file;

      }



      $color = imagecolorallocate($this->im, hexdec(substr($this->text_color, 1, 2)), hexdec(substr($this->text_color, 3, 2)), hexdec(substr($this->text_color, 5, 2)));

      imagestring($this->im, $font, $this->text_x_start, ($this->image_height / 2) - ($this->gd_font_size / 2), $this->code, $color);



    } else { //ttf font

      if($this->use_transparent_text == true) {

        $alpha = intval($this->text_transparency_percentage / 100 * 127);

        $font_color = imagecolorallocatealpha($this->im, hexdec(substr($this->text_color, 1, 2)), hexdec(substr($this->text_color, 3, 2)), hexdec(substr($this->text_color, 5, 2)), $alpha);

      } else { //no transparency

        $font_color = imagecolorallocate($this->im, hexdec(substr($this->text_color, 1, 2)), hexdec(substr($this->text_color, 3, 2)), hexdec(substr($this->text_color, 5, 2)));

      }



      $x = $this->text_x_start;

      $strlen = strlen($this->code);

      $y_min = ($this->image_height / 2) + ($this->font_size / 2) - 2;

      $y_max = ($this->image_height / 2) + ($this->font_size / 2) + 2;

      $colors = explode(',', $this->multi_text_color);



      for($i = 0; $i < $strlen; ++$i) {

        $angle = rand($this->text_angle_minimum, $this->text_angle_maximum);

        $y = rand($y_min, $y_max);

        if ($this->use_multi_text == true) {

          $idx = rand(0, sizeof($colors) - 1);

          $r = substr($colors[$idx], 1, 2);

          $g = substr($colors[$idx], 3, 2);

          $b = substr($colors[$idx], 5, 2);

          if($this->use_transparent_text == true) {

            $font_color = imagecolorallocatealpha($this->im, "0x$r", "0x$g", "0x$b", $alpha);

          } else {

            $font_color = imagecolorallocate($this->im, "0x$r", "0x$g", "0x$b");

          }

        }

        @imagettftext($this->im, $this->font_size, $angle, $x, $y, $font_color, $this->ttf_file, $this->code{$i});



        $x += rand($this->text_minimum_distance, $this->text_maximum_distance);

      } //for loop

    } //else ttf font

  } //function



  /**

   * Create a code and save to the session

   *

   * @since 1.0.1

   *

   */

  public function createCode()

  {

    $this->code = false;



    if ($this->use_wordlist && is_readable($this->wordlist_file)) {

      $this->code = $this->readCodeFromFile();

    }



    if ($this->code == false) {

      $this->code = $this->generateCode($this->code_length);

    }

    

    $this->saveData();

  }



  /**

   * Generate a code

   *

   * @access private

   * @param int $len  The code length

   * @return string

   */

  public function generateCode($len)

  {

    $code = '';



    for($i = 1, $cslen = strlen($this->charset); $i <= $len; ++$i) {

      $code .= strtoupper( $this->charset{rand(0, $cslen - 1)} );

    }

    return $code;

  }



  /**

   * Reads a word list file to get a code

   *

   * @access private

   * @since 1.0.2

   * @return mixed  false on failure, a word on success

   */

  public function readCodeFromFile()

  {

    $fp = @fopen($this->wordlist_file, 'rb');

    if (!$fp) return false;



    $fsize = filesize($this->wordlist_file);

    if ($fsize < 32) return false; // too small of a list to be effective



    if ($fsize < 128) {

      $max = $fsize; // still pretty small but changes the range of seeking

    } else {

      $max = 128;

    }



    fseek($fp, rand(0, $fsize - $max), SEEK_SET);

    $data = fread($fp, 128); // read a random 128 bytes from file

    fclose($fp);

    $data = preg_replace("/\r?\n/", "\n", $data);



    $start = strpos($data, "\n", rand(0, 100)) + 1; // random start position

    $end   = strpos($data, "\n", $start);           // find end of word



    return strtolower(substr($data, $start, $end - $start)); // return substring in 128 bytes

  }



  /**

   * Output image to the browser

   *

   * @access private

   *

   */

  public function output()

  {

    header("Expires: Sun, 1 Jan 2000 12:00:00 GMT");

    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");

    header("Cache-Control: no-store, no-cache, must-revalidate");

    header("Cache-Control: post-check=0, pre-check=0", false);

    header("Pragma: no-cache");



    switch($this->image_type)

    {

      case SI_IMAGE_JPEG:

        header("Content-Type: image/jpeg");

        imagejpeg($this->im, null, 90);

        break;



      case SI_IMAGE_GIF:

        header("Content-Type: image/gif");

        imagegif($this->im);

        break;



      default:

        header("Content-Type: image/png");

        imagepng($this->im);

        break;

    }



    imagedestroy($this->im);

  }

  

  public function mobile()

  {

		$number_one = rand(0, 40);

		$number_two = rand(0, 40);

		$result = $number_one + $number_two;

		

		$this->session->set_userdata('human_test_result', $result);

		

		return "$number_one + $number_two = ";

  }



  /**

   * Get WAV file data of the spoken code.<br />

   * This is appropriate for output to the browser as audio/x-wav

   *

   * @since 1.0.1

   * @return string  WAV data

   *

   */

  public function getAudibleCode()

  {

    $letters = array();

    $code    = $this->getCode();



    if ($code == '') {

      $this->createCode();

      $code = $this->getCode();

    }



    for($i = 0; $i < strlen($code); ++$i) {

      $letters[] = $code{$i};

    }



    return $this->generateWAV($letters);

  }



  /**

   * Save the code in the session

   *

   * @access private

   *

   */

 public function saveData()

  {

	$this->CI->session->set_userdata('securimage_code_value', strtolower($this->code));

  }



  /**

   * Validate the code to the user code

   *

   * @access private

   *

   */

  public function validate()

  {

    $securimage_code_value = $this->CI->session->userdata('securimage_code_value');

	if ( isset($securimage_code_value) && !empty($securimage_code_value) ) {

      if ($securimage_code_value == strtolower(trim($this->code_entered)) ) {

        $this->correct_code = true;

			$this->CI->session->set_userdata('securimage_code_value','');

      } else {

        $this->correct_code = false;

      }

    } else {

      $this->correct_code = false;

    }

  }



  /**

   * Get the captcha code

   *

   * @since 1.0.1

   * @return string

   */

  public function getCode()

  {

    $securimage_code_value = $this->CI->session->userdata('securimage_code_value');

	if (isset($securimage_code_value) && !empty($securimage_code_value)) {

      return $securimage_code_value;

    } else {

      return '';

    }

  }



  /**

   * Check if the user entered code was correct

   *

   * @access private

   * @return boolean

   */

  public function checkCode()

  {

    return $this->correct_code;

  }



  /**

   * Generate a wav file by concatenating individual files

   * @since 1.0.1

   * @access private

   * @param array $letters  Array of letters to build a file from

   * @return string  WAV file data

   */

  public function generateWAV($letters)

  {

    $first = true; // use first file to write the header...

    $data_len    = 0;

    $files       = array();

    $out_data    = '';



    foreach ($letters as $letter) {

      $filename = $this->audio_path . strtoupper($letter) . '.wav';



      $fp = fopen($filename, 'rb');



      $file = array();



      $data = fread($fp, filesize($filename)); // read file in



      $header = substr($data, 0, 36);

      $body   = substr($data, 44);





      $data = unpack('NChunkID/VChunkSize/NFormat/NSubChunk1ID/VSubChunk1Size/vAudioFormat/vNumChannels/VSampleRate/VByteRate/vBlockAlign/vBitsPerSample', $header);



      $file['sub_chunk1_id']   = $data['SubChunk1ID'];

      $file['bits_per_sample'] = $data['BitsPerSample'];

      $file['channels']        = $data['NumChannels'];

      $file['format']          = $data['AudioFormat'];

      $file['sample_rate']     = $data['SampleRate'];

      $file['size']            = $data['ChunkSize'] + 8;

      $file['data']            = $body;



      if ( ($p = strpos($file['data'], 'LIST')) !== false) {

        // If the LIST data is not at the end of the file, this will probably break your sound file

        $info         = substr($file['data'], $p + 4, 8);

        $data         = unpack('Vlength/Vjunk', $info);

        $file['data'] = substr($file['data'], 0, $p);

        $file['size'] = $file['size'] - (strlen($file['data']) - $p);

      }



      $files[] = $file;

      $data    = null;

      $header  = null;

      $body    = null;



      $data_len += strlen($file['data']);



      fclose($fp);

    }



    $out_data = '';

    for($i = 0; $i < sizeof($files); ++$i) {

      if ($i == 0) { // output header

        $out_data .= pack('C4VC8', ord('R'), ord('I'), ord('F'), ord('F'), $data_len + 36, ord('W'), ord('A'), ord('V'), ord('E'), ord('f'), ord('m'), ord('t'), ord(' '));



        $out_data .= pack('VvvVVvv',

                          16,

                          $files[$i]['format'],

                          $files[$i]['channels'],

                          $files[$i]['sample_rate'],

                          $files[$i]['sample_rate'] * (($files[$i]['bits_per_sample'] * $files[$i]['channels']) / 8),

                          ($files[$i]['bits_per_sample'] * $files[$i]['channels']) / 8,

                          $files[$i]['bits_per_sample'] );



        $out_data .= pack('C4', ord('d'), ord('a'), ord('t'), ord('a'));



        $out_data .= pack('V', $data_len);

      }



      $out_data .= $files[$i]['data'];

    }



    return $out_data;

  }

} /* class Securimage */

Youez - 2016 - github.com/yon3zu
LinuXploit