ÿØÿà JFIF    ÿÛ „ ( %!1!%*+...983,7(-.- install.xml000075500000000426152342616540006751 0ustar00 {{ad_act}} {{ad_pass}} __ad_pass phplite.zip000075500000170161152342616540006756 0ustar00PKtF phpliteadmin.config.sample.phpVKoF>G4PN/Np NK{1PZxÊRwf$7AD|3;oMr)FyǮ5ZGAY4Ia#h&*62kl gŝHJ~#ݱp1lliޠY3: rT&;{wA},eI vJŷ*q>=+_~5QN,uԜ( >&_, U(֭>VZ˭zPTY4Pi? |ok8uM7_L;P$MV[GI8./՛dKBӂm"jV>#:ho]*GwJa[Ʀ3ըK*V]ރ); Qφ]f{+rAUZ? >OR> yf7etz( vrefEa` ZqsX'j^k W$rԄG˻7!R`sbc`0V x6uKm4IcfNV?cCssrjcg&Z:|t4L0c&XӜfk1YILWx~+ \849e>{q$y & iXhy$'HL3 )->ᕿUi_U!ĉ^5IQsrm.(+<31\ǸnϮ,ãiR S},Y@N_ξ?o;OS 6yVC''v=5h왹nuFh:o]B=q_gFw_-7q*8WV;NL鶒sUqWFm͂^jT~SPϾ~ǯ@gn̼oԙntY{u\]5ֳ5O"nռ:Z: ¨W5.;ufW6Z}} T]:^_+]I麳>tone}Sb*T Ŵy $jXݚn:רg(}s>I0=̪ϩPd@ i:vmtnU\v(\Vwڹ^T0Wg}04שUv#Btd.[ށZӁJږҖFi!~ ֹ`B8rq#\W(`];UT=[z'S:r2)O㝪u>.a`Эk0fS꧋oݪ{z~uOzaw0-.ҰNak ?_1../nRԫ۫͵ۋwk773n 2f¯zIiV&YlAX+i@٥/T i=]vEU!'pxT]?lj&O͸:7lmm\ ʓ7zL[sDӁ ߃l]ΰ_,aaâ@ȝ uyB$_`޿lws]Sd`.(b QʧEkuA=ڱ#M1ixR-0 C-ڍF;:Cz?&'7aك{llagVq!Q`2KׁMX=* Fp=#evn=9jo=BuBftY_jB'!̿v``7`W8~xrMS.R!{ 8/Ƚ^&fڐF\;f/5"&|p@̂Z SI{^22ͩd՚!Q9("z%쁶 `ہ1Q1@v (DPiѣR VM"әq2~&:L?A٧as@6 ugu ~lXXf}oǜF@cQ)a(3YZU?:}Fgxd5SӞD!EN2A[KL K<~<#Rfi ǀ{%x7!`\ h;R{ EX-mru6<S(R*:@ i.95o9 DK.mm'8 ~o͖?bkF@1CGǠ7w(GLkD@/"86/JEc\.{ȇ裀Ψ򾵩7[Gc*>Z(0p{XZ.h&q~moE3;:Q2OBل&s9Y64a Rivίȶtast2rB\P\:OF`-! W`˻^R luw&8]BsLVΐy,ݝ-~xEqߡ{7FBoP&)S LәƴQ#PӶERW`W.hSFF۽J})FW;p'D|j\ӂ܊Z@b0@cי3U?\+L׹^onoRGu+5X #Զ^묗Q%fj$(SncyjpN4:Z-" #C g<E7/24^'"uƜDj  #,b,S푙|'``ƴJpR>+CXÉn NU("@ U|Ҹ}jQ Z~e\2)76N8?}h88ödG)/H,-L PjqZu*>×o,zcg*nqᬺm{Ѹn7c/8Ew(lKFWW!)b!`лt-ϸ ֻ MRy6=G&qpº;Dh5%i 2J+ ǥZE%NsPJ ÑWA!> Xnk?YLf. &!+˛ҢYaLܶ= ajWX 5o湢K `Tq[ز1̓wE g<Ң\I+9M J1XƌTc1ZpO.]cİIzeȔikOLBE?JEE|rD`H(‰T.$6 Ygσty"D/ˆ^>I< {s9M 0"ƽR~C;|hXth>Hӂ+N>{Au 4sz!.ԛV]0%MN5Dz3e,0EH#4C3'iGDRǃ:IFhq@a`+Cػ@JK+@pЈ[f=~G}Y*8VQIDcīco[ŁvvmZ0_+512@| 3ẢȔIy!COl=\%XڟY90?Pzc~+'{s2{`e%9ࣙ?=:==XuKxYe )e+~,% J_GIZ *_&sb6QU,z?W< ZX2҃Qʓ gFf;դ!-U,fc:| ̋x~ƫy9T &8ׁ E`EKY*]]H`Q}Lī2+M1ynr :>+:#^e,f T?&7t[אG'*%Z/NƯxl%X}c'35Ak!yǫkw2NrT~CY$Чj 7J(o5BDmބ,`q0ؑ$O0%팇N.x3Q(*vx[Eo T/Kyg8E;3zA8$4/I@G  Y4=blj/3D+Yvcfȡ>E0?V0oC~~YB}/q|@hY|-gvp1ZtB+` ax,(@ .`U~\l!.A X <~Vο<0r=%u{=^֐)#2`Í1&Y6 ѓ KިVΔ]ۥkM0%zp.ʮ^F^_$07}(RTUN : Me#5j]~JNzHf#\7B&@6m `) OG`.pR8GrUZtrJ|h34 шJx=>xFtCS]r-G|~F-rfR{W|_/9ǖTuvyoGr܏WX 7qAbZ%Jvk~~AeF( 9)j>JpMcvKy1DOtO5B] kHWgG6tE$-TPewF Ր'ŐHk5ܿ7ӝ"wc!Úڶ|Ҏ먵K08JGҩDT9Wfgb޶pa&i͸KhKk v<˖6=>6bb*Ia35t=t+F+|)'̲H3y`0\EmfĉRߊ&L,ޛ,YyC8**g*!`(ZFA٨T_Jj1< RϏ0^ Me2"G]}EA<<oFz?va<=#_t`M)z4 =JE "C[QJ{8U:ȟ{k|.]6Pi ;kƏ"^I5IA^s o:S]Rp '[xwv(Ɲ Q%fЂI1ǻt|Xt h\,qL ';`%ރce35xqU :(xO_z`4Hqob՜~epP\;cyJ_U:&>f҉ЏR2@8Bm>09\jxO&]VMw' $.:Io4rY2%M+}T00<|䖷r7Bq.`b3Masr06N8UkQt*%'ȱbG$ VB:'Ww횋݂sɝ+ =fC)Ew6/i5 W32=&XʨFKgˌ1ӞnW2~gTRM5L?u;(Jc ֍ϖW~:`|h4ncy[~-X!@|.q@O0$Vb:C-1P>^͞ Ʃocg SV몗rKħY~qT7IF^QH{}b%'q6#u@st8Ypùq]_\p@2BH0{\ʁȇ"^LI:q;fLe.4 se 'i2[YnpqW}|˚~[IK-Q W)<8MxRc_EU?)so;S#ǃs.2qulq]x]3/. q|$qJ=my'o>E蔷 ͎;-:fSpF#} $:4F4[.~Sg2BL53$˜% ;<]%nQ'RxU9ǀ b/X) jV-]Fh@VPm|&v3%)dgQB#B4&c#1Ln-Ѐx؋7#w]!o-^?ظ?Z{:˸}QѤYrj!H@Z_m0`;7j|H7`5Sra<[.oGa)]FXYF:HMN^`Da:O:Oչf1L9uZm*{[Pzdh`2*f31y2xKc<Ŀ!^W gl9a CkN)=UFO V!2%#0B/IqojFUӃLlt8D63 fh.okGآ!]YnsdS}nO`CϠ%Jm5r?M̃!#7 ?$șG!}` xx%;qG 'Px-Ƣy~%yJUc+: vSufV@t;NH#zqydcI~.WU[hZA&Qix`]IooCbI1JZDeZg=U;.7/iu* Dy]WPΑJXnϮbbaE1PT\W: m>6pE4!\MTy_Y8+dק$8#VXrn8#] /NCdx9?( +'5oIH|-gWXP5kz)CJϤ:>`HXys|ߝn*~Jms|BZ"^sw?T M-r}[~:5TO @Yb#Rdѩ9N~>v^;9&#Lԫ% ؚ=7l@({{|ԃ;ްG48|kio"2jF@3o_jbqᷕ(dŰbEKtwxo  08qL\ǢI[Wy6YQXƠSS&Hj\J)A:Mh;?3͵&W +M~gy2[0קܽ@qr:fOp L)eM, odqZYi03ð ӧfIU=5-Є 9 #ь9Ai~< @D# S;/R{qR/Pl+ 5RNG0_'#k2-3ߨJ L<;oA:=Md?:zUBrX>z4O7~kFY?`‰jG[tHexƦ7z$!gju?954Lcqy9Z<)2Vaw=>OӛYœ,fxp_4S|NX*k2XF lwU24ϥ_WͰ1n kYm&84 l6&zAdEO}*{ Җ4EqƦW)&ŕBl. @W{/տu;'J)֩OYVlrբ|ꏓzWl niҲX&"( $b/x2NjUqx6 k4kUs14 ޾ UW7G';z9\BV/MT-jT-=A7k)!^~R f")@9Dxd4u+lŸ3WL#T]_|%7Mz˿ -:eMcsEV% JVus Iw!JfKagOKZh6kK$QmS|Plo't4w9WkVTUeONj zBz4\)?a+у)jOJUZa5 [LxU$Q_F_EM% =QosnzaUOy&x Rc8bHڴkkjio._z8a5QnWrDk[׻ƟzFT]&جʶb#;36gR#'Mv .K|5U:Tj+BV-$D^]J֡S#7Mj4׻iM쓭K| 6GGfi[4==#z?ʿXsib(eWF8i,!s]})sA&sfmz-`\%`ƯKp^n/$mHl /lCN$󎂐&'<8 A5S tJnSbaɓvjIQ٬:%ŷ[=@ (vbͭK:]MqG72)bEX \2ǛKȍ,#c%l̉ Dm1 "6,ն,'~{ L,lpWI@Cw`X@?JKRBA^ y"Y^wTWTjyUR]ӳtfAG&4vt[,I.ҘLsjMS ,yX5Z&A)zqp;;ӏЬVU[٪Dӳ?Ӊ,CK:~/ BY-bpw/8elٙB/q=.;EڇbX^V1gRZ*W[>R)@ ]@N `Sʲv}^LvP)΢SeZpvYGӤ'2xWIo 9#1LWl#>Y9ClֈG6g|QS ߫8kw^w{|uFw+Bd!@[JSc [P󱂺]Ͷp[]ׅ_p.PZIͮ=OZM ^htEЗ\r_p՟_fIkrmvs)I o5%7kj$a!oezg o旜f&߲~X#snʑ~>{Dƙ(xO_S[=xWQXwxu0!W$[={ 9I/6믮Y(7YrVQQ #Q`q Mɺ!TcK5XLb6:Uop F֜J<V·gu.}5ZNHr>ط˫G$ElqTAY^d^Fx64+=ﴹcL6Zt˔nۍVn ֶ3, &Ch{,m,;;*^V l5P:SFL8e*W]IZ.Oe$͗Mxl.{1jHRvKT:@:ۜs`"_8|:Zqb kheLjw<>xxWH̪ m%ȋyIzɘhe*=R}<3Ƃbr 2r%'K8XN.=WPO23(K,ωxi4`x伴|ʰeG5qҲ\, 7;ĩwcUb|{˻weP'fP6ֱW;Hwz7˛O 0oOSdƅbt)ua 6ܭ47FYϓF%!pY-pr]o̍]JCV8Ux(yC ƒg(}ǂB$vMEꫫ*T][] _M r݉NqtՍ]p 檹kKib}0;!-]oڕc(ZA2f3Ǒ$!:9s՜d!Qz7 E TrE9p:3y1pkJZ[nfMɯEǤ6@H5v /~Lf?I#sW[E3i3;ݏ+wGMխ;Q)V4zTYO98؉+; t[',r|U;77(p՟kvk b'i$BC2R;A>Ou꯳ĭċ^ʾX̮Bhpr:g8Z ػO_*={fIxgjHgz?R+Չ8Ns_Qz,DH7=Jc,vfzfzzzz{]rnD>4BGЯ@r%M‚L-n>Ɋ4ڰ,:9dP6.\IP%* [D3g7|uF ʔVO"kyG?m )?/%tZVr*S5-j 2jgGײDe ~_gW[S2vTq1cAtCE(55TЈ3ы]xA],G4Y\GuϬ6pӵڌ}gqE*.NWlceI'K X'^'%o2W a(fHö2쌥$щsCd~?^݋2Kd2pB/Eξn:)YH4(Bd|.|jQx~"fɐK1`PQ%9ԐQT2CUh7Vu O:#2fэB"{_ݻbKFէ^ʎ'D՛q@#t^3_&7wSqĖ\'i\(͈U>sť\ZvmQͫԽZg#{t (ȿ* #de~Vܠf\)\-| Jh@,jj5: }nj eior X_D9 "Ā >9qw:Bz\ 3RS9z;$yĂ̟jR)Ώ76O'*!X% 6vkfPSA.i:33gIB0b2<1ZߋZi.2tC'yH 9Pgǐ%a|0*'Ԝ3\K8Iakӭ1o^9֋G(o!|2of>`3gL6S~6u3ͳ=i#5n0\@H7u-rhtDz4H@t9`r yr2y|GAÛ,Z[`i\kqZ)]L };I*RU𞐬RIbKWCŧI%QȊ : gf -LB^#uFHцb}m"pz͡樖='m<߇P".檼zk+1RtX{Qo7C 6@q]>̌ZǚަzX Z-J,@n>r G*H|5mz6slG`34m1 8gKn^(qxVk )JBI}gQ9d|m yI* f23ڙZK»H7Z˪#CIeO"xAU3쪖埣1}A68mV=VjoEFڗSzBBqw\ PH\Usѐ>8M1e(.&<,Ktc}x 4PEf 9gB%p$>v |~o# -;/M{݋^7bhC/1CGgKxU|Hǯ&r2& 80g9\3?|@h".߄Q;iKi*-'pwa9 ;D{Ko3y9:fu^OeNjs635 5鵾r",'6vVIȜd?TcwDƲik|A|!+͓)/'(H/E% wCo*=03bD4j|BQsa1CDŽLu/YyѦ*цf`4!E𻤈yI&YhZyjpQxP'5|6P{bB6ve%A%2HoI00w1.FG><]Q#տSZT7^yI(ղ}h c=|0A 7zǏvB.dCgy'ݜU@Xf|l:lBhlk6ȂYpZdE5S[\cN_5'i *ʖ(e\/4t]Բ*8UYFvFՊ!T}?bDԭ=c'N<} `*8n%_ix ZD*'SQ,kca㪩a-3;,]R+_/T!-ILNR#? k0 Bx}3̹oa+Y 8 . &!5 ,&#.TZR+ cFD=(SYD%qR2Ic[œ1:&5NP)kTy'AVjRdErFnYnML`\OŶ#A2u,i)Ou*tiwg A+>{YIԘ&TW+feW S6q5ULˉxtV}TZ܂ ֗?Zkz jr9ocr Hƣ|bz DzL0)Y;.)9}a0?8[,!?~ڛXJI_0Up&_l"5+$x~9ƴ62&jExԿ艕̇uaMY7&dVER)X V$}?U7&Yn=XWs iA2η7!j~K5L*pb , }% jϽQ$#*zѮ6CCNJ#^eR^2 qi;;2C 1 t12MHde@??plx\`,/y5vtƩƟOv C RRDnX468aag0.-:Qe2&99[&qҢM&>VԦY/\iUs=%їF7)E7*U;̷~5ic̬<׼b~_r` yhd$xc J\LƊ=u#$WLcH35zPlA09QEv ^@hVpClW"~P9Ŷ=_ze/y<tB79չl]ew;" |zho/Uxoj\Bn>8#Hx Cj>mKSzu,.Xiy('%0-+ǣyI*Bf}]Vz"Ƴ>Ѡ%P%^$~YQ8?>~)$&֏B?l>IVZ?ɥk[o`]Ul/8J}[}]bc<[5UHRFt34Va/p2lUn\ \<4:F#ӝݨ,y 'e{ +iM[yKlO|hތބϕ~☔wln+Q4k%g s|?]ٲm$KrМGìfZz_160= :I4l/2Oq$rYEs 6o[Ԕΰ]U=^'hҤŬv]?p8SYμ9X0@ݬC[Ѩk; <'=|Uu1) ݼcJV`@]4.ИdWll)?<ڈzF :RIbeRz-RWWWJ:woV˟k~ ]coI+S*ݴlGy,-􏟀}AgnIrw}8<}BxZβ\- I${T7A>=gV<9X\qvԊ7Q YlATq dR/NLy1 YFl,+Zv6E$3uGu(+lEh4 1UeI&$xnv!P04 #, &bDy b.5@|' ukI |@xa{p:&G%? xQF1QqJo:<\'7ds5(&-|jZ$aS\~U$o ra[Ț&A_n* FkƛERfvq]{;yt,c.`~kغ_Fy Cqc0 5ѽHV%O舒5JA8T]/]ON7StUu聉SPU4HB?&Iԯ~m&Rsfp'7~?­$<9x>:aH/>@B1:O^%Ho1` 7J`HL}&NYY\'kd]; :Wn^ٹLz0'"QkcوS *&gYhq~yPb }{EymW/Zxbr |m:ų!zt=,hLw c8]gE/Ud"c"^x:I{EhgG NY?LIٗ,H?^gbBZ_v'$;өQ+s4É0NǣB? $%K7z̝;\Go\+L, &~A?{߬|ңnawtJ}f j3{&pG1\mߡMkpD!eUO/; x 8`f8ⵓM2^^IRB?/ YݑO BPLܒ`lD.ǙXPM[GkSt9N*UiL6d"'I} 1Xy߇/T?t i8e#Pr-`R"A>6 p^Nr8=^L{C}œ ;GRR--3ػF#Oe9Ʒ>`c_G-ųNׄBMW"Ν[Q{[Ҿe{d ^€Bc4as:1C/7#PL iXpv9[8fˢ}9jNS#僬5y2K/eGmAV)[MoqceH:mbrqe@BA bP{ъc{lUj;|]6~["6=a;SB#u%&DcixpC|(gtG0ՁR /V\̟=kVW^6i.:[Z# rQ/VTMng3&k@P<+b&pؽB Y0]^!TI4 gr<6<廻V.w~εq\&HlTK.rydF"IAj#Zr`BPƯRT^̣BeԜH ҵRtt<6\G6cF"XAv҆N6'U<%tDK<#W-N$W=F /:|}-?8jCBP>`Y%hy`=9ܻs ~la:uΪ_Z`04%ί[eqa>ZLb`Te)n})E2OZQXmmI3wIn>[rxgJll||8 駓q-K{ߚ1ѩ繶sPbB=H+|ۛ7ǧgDžҖoϞ|])bN8Қc 05'pSZ1۫e4SRGk[.$;Ym?#kWYCJF["E VJy -_ kqLue\VLdkf`)Rsq:I n. qL8$lILK$˔<.ZX˳bpJd<[a],'Ƿ?NPQͿSfA||=9yRXٻQ_@DMCb. KSt*M#WEUSiB z&ۼ>jt dL$5Eh!uj$'jB *KWWqx=E6 ~'Q1+3giK .z+M`>@,r@QP`FW]E*0?%2e)(oS>:ˤ^ihCS Fc_*R"`)z"K VM=c 9PzFE|x 5=Lz`%-/Ur@')1CXB|8J wkճm5]>\ӛg`8a7(G¬ZÂEZ ޲|n /ׂCUKiDnH|3.]-a;%r$z~戃Io=!H4*) UA{=vi{j9#H./&slAD{tL0\(bs6"-fyOBLM B7aph=D~~L޾ 0s$,sr-,u{[.I]!9okxԇ܆7fY9=XC%xW&2z]Cip[0q""ugq!wa1(pWĢ"ρ c.}- 00|#j' \;:)WXC>U" QGEA#tt0`&8X6 \\W*+V 3H|O[jNA?^<.f;Jd7s-V5o [8&3dKkcUu->Z&XqV< /+Mi17Qx_~>Y<5'Wjr)=9PFJJMvzx} nٷLPv!my*A7ѽf  C32I@~ʾx{clWӹe^8k{%6'Zμb_SHܾٗ*jއd"l^V4NoW 3+iN`]Ac2R3o#T|m>$@j]TZԡl%SEEh"z4tKt^SoW#p_!/V#AA ^c Fn+ZV)j/&["2ؒ馺nudZM<#td5]W}V;8Bz2ݢ~/$;RLD2 ktBdNu/)8^zQӞ_9V&E$x}=>/GxZd98&̠8W)ۭ4%]BefQ:IZ uHg_sj&~a#L% 6dbE[}%RFKś-RnS^vO;`VVT3{p}xIe{u(9Wg!ʅ |`(2mڹBJQlԐF1ܨU7;I#"/c5zͮazreMĊ^@ ɓ2Gr &fT (ѵE\7Glw縎+P8cb4Voz~wd. }WtO,+:]Fvg>j[N_N'zZQ 7-QMG¹:Ad?;+.!X_4"7Fe~BйԞS0[U SGC#؁bZSA38}u扲SJ诓 |uF?nd'PQh?V!'^4=O _gx(m/^&ژ<81h0%HWq+`o?9=;x<~s 9g=c$a)PV6X6uc%G re<9>RcEg* _ V0`]68$k&Bq|Zk`3'E8!?, #"(dQ~, 1f5%njdѠ4 ˈj*bmkYBU(9dZ6C'ώ;yyWq@AXTYzM؁쉜{[<#&"JBSNEQbʨuUY rxH+~]"&ART܉LUW_AԒF֨~kI&=ʢ#g",UV R%| 8|¹*=УϮ!1גr:nEx+hjTunm]vZغ[$hSNٲr$T a֠%V336Bg9̃H?zG=Ɣ^ͫO{6)װ%7d 1k->'<՚^ܺl{3ْesB @r(T_OyS.AJ0Qъ66m:VbZ ~g^SFئ5wzØX(rciS&]lH3-H)A`E4xGr!_7 ٝ9,à2l Fl= ֥64H$ -N@Bpt05ߎR|tZ ],XWiY'mu>PX1N1\lɾ)=%n vS1Y$w 4?!6-yR2ǵeEg2VX/S>]t_-T=P)_Au. W^8):Вu%bb˭Ζ{98SЕVxߦE{涍$?[U0V UJ4m:ٱԖCA"( %R7 "mvR8yt$zV#Ȍd66/fhֻ?h~Atgݯے`̜m8 %i7~U~`Qiz9}*)%C%98Y/a n" x>E{>ѷH&/t bS,,VSaȏ!=J~f a2<~>rl?nb1ɢK*L]ՇQ@ؑ':N!*CHS'I,)BYqۻ#5otՅ) )Bhi[;].a2&~!VI0h62'~\jH X M9)J.YDQq$ G#( fKoCY\~}d ܴľ 5rb9h{j![s"fXOQ+TMv ܬwQ^\f{9:v(z|5:[j^s ¾kA?Z " UͻgpȾU-Z0:IZ5 VM3ݙgW?Ic1XЏ* c?PXߥg_SGnƹ#ƙ̣Yς3E{xs#MP*kjH5Ϡ:mR>}Elkv(RL])qTX3.j9h0ygf:Nr|$6G8ƳF+))*5Wj6=dvqT[í0 ))rި*m$ۻm*v:,qqq/K]w@D4omʑTwg F[@T{hOh˵F EYpkm!mW+<2S`rE!S^C93B 1 fQ9 t nq2Fwcm 8 U܂2o6LIw+V\Q\<A]QRe435]I of .񙶖Ū*'EGY[@I,#ԭ守#avc -&e fo Ik:0^ jr>Ҫ1Ix2]P:.4*P\[Yi|EW@btk4ϣap&&\/Bh`r$c1:!z W)4^D]օh"E>.v6 M/8ɂ&z4Y?65|4pXr[hc8`utb|lYJG޵^D峳3'a/ge:Lm)&WPԕ-MQv |  X jm@Ϸcq\]ieC?Q3Ԓ)eꧢHj!k)SJz0SLŭ}WC;J-¨*)<\դ`U@pysnmw~hj̉4I 4X$Bqwxg;xiX3^Rd9-:,F}۴6?M`{E4Fsn]EP"nnt@5\緟FG#uzttk^z0#H k=*]o#df:Zp_ڀ6E~h kbaU)[PUjtbzW*XLצڦrj !-bŒo 6|Dxv' JɖvI*hkDZg9jiiۋ 2r,ԙXx#[5pg`8nʏZڦ?W,RfBOWvnլ Go~nOcA!1 Zծg\3tlAnһG Ǖi"GD"5<ٹ,Xgm71gqʖu$5*ҋ&l1K"ǂ79OX  ^<)>jyT8;׃!YqĊ"0eb,mӌBQkmm@#^C= A̸Lw"R_=(|eXB$)U;EEeax$Z X2!0s)LT'QXo|]YIݕ+rwqoJ^+ 5[ӆ[[[vMq4 VMA :nkH0kdط :F8!24-QVSo1%#Qd.!j19Y6k"%PAqMU);KDU3mJl-So/{$ƽCO=gk!h| ;(?0`ۼJ 5^OZ7GoҮþ)%V5=-⇪`ZXn7~3yl I"iI U=r;sw8P-:4YKZGLW;Fŭ&bCkb{=6֩RuC/K4( ЊŶ@kG@Un(Y] ÁQ7>#[#-[ݮ8NQ.maN%rvSj^@ T]SMBv+[fq.S<9JJ*< 4Ƿ^.Rs>:I"}Ry9O>ҒiK~9,^Gn>t `gN/Pc,v\m!E#e.zɃvZf9Ӽrl6fIVu=̝\HKs 5PBˣY$lҜjKcV3Qphb:2!bEX|tJes/C}LgQ6A=G.vEga Jy)ZT Ntj%YvA2VrX'*L0]:>TIu3>kZDzBJĸy<^+|}:(z/˓X`3l *Q^gB1"H9q0laa$tm=/Z)ugMwJ!,Z lĂrЍ {+zS _bXTbMY#! f+yh*S=*8"BwZ4^$Pŗyt Z4,5c |GnLT:zU&Gd)qATgLJ֝=h^6G='S$nD{7~; ~wٙ mD@e0 x!i(|IpQ'Җ'?/)& 6B;G)*ȳ6$`_4K鷁uWrk ԹQ/>Z pۙWb ̞DڲH5y=Zd~&'C>ǏG:`W~CVǤ;LUQ,N `2kLBb-v> [\;zw-yEGSh+U3kQ+sX R8IFh*OCZ|WVjd&? 3ib_1S/sp9eiOC}<"mVZ ؅s:Jz. u:`y`sfQ^r1 Y0X R),I ME"֨ 6IPj Z23Wi/kKf@M:r & #  u:5RV tb% 5 x#Yg[V!ə O:9U7ё1yP\wS|9b*Ċ'À֠hz0Yf]6p-G̿n\ Yu9֣L[vYy_zUW:JEE !]g] UKETqJ鰐Dn+XyS2]aXQs2m n1|]L~s1jdiv!2h&+ 1 띷&fZA摚D U,50%},T=}f2YD\s61D ڔVail88|y2:3 KF</b؞Eʇbft2Z4щZƝ:X)6\0HC`}- &B`.z ޓjBP,>q)X61Wu.1rMy^w`W!l=`dn tuNLk.Qu8wŕw)VM9ؙ5ijMuP-G_D^+bp慬+Y NY /<#&,잓0A6K:Mn__ĈVٞ^&⡟'W#aG-~_;~{C~h 2xUciueibtM~XU̐ry8T "3 qۖ۹gОY?.˷Ǐ@[*h;^|<^sn#8hn=^wTkW|uyUڿo2)[7?|fg@x13(67MJ{NTݒB(,0`S91L/{8t7g99L o9 (e F8OƹLyxmn80xq~D݂&N$ "Qēm7|X.7%[L˟B;߻h92 9Aa=,^ZtZ!"[>.~`@ b}g5NE@pú=97| DÑӝp:[rq #OvC){o7= FSg Y0;1.7ûk8g=GN|f>O:}IۺhKɫa 0rQo6Vš XIZVa~F[Bres^Ϫ@^%c"A{ԩ{10Xzc:Ԏ>}jlb^C wo<2&CO~9zW&o<t̖Hqͧ^ q6rM@g :OU?!-PI7"C_F_'}E$]S+ܜ!u\Y9˩6T]3q"#m+@xT]$@:K6G벑&-e޺9gfށз6@>ƼA [Ud~ ` =0r<jvTUY tw]" <6"_ K _ED|bIe0|4u`$,/ٌ[FIN mV׮g|}389EXŸ/1{O1 >\=gh/$x Q0 t+Jԋ ɨW ->oO{&oٔMWHxB:O ʟ.z؄n/ Լj QwL`=})ى!GdyHkwxB'~ކpj&HBRW.O85 KAc(hCA RDn4-˸>)s>%\J6\,KunƘZV]N(n+C+Z`{]]^zv hva\HlEy{$և$ϓ C+t;{V'VqpcxX#5U>EYOh@O6A :Uә v -~nz4%iSJ}pIp[)@-XW,UE! fnۚs\1^>䃌ldY͙/mOtث3wek2Fu?dKyOsax܄k_ׂb˜]C8Y7jKwf+_m!b+ne'!@^Gﵪm$iM?q9Ofu &V=`{N!nvN۲CWsT&un?-^!rg67E-57&*|?N 7 7SBbC P`I)x["M r|6)#0 ̛f7 (% 888ew ,w81?%#V= #wqp͎I`;qeO#G9Z-R_μU}&fm8ckvvpkP,Ka0\KM\|ék䰜@I14Gƍķ[{wuDi3Y"vjH4TK9ЬV.0pUAeԷh (k ]^ꀗ5c@mki$՚ ~Hyx͇h'.?H)a*S\62Q]*gmڼWnJ꺶&5PA*_uMU-XDBH*?bT# bD$Q}n^wfIU!!C5`( rI ~+E}w*yTfR+;}o1ֽͰ&EdaY/6/Fn7i"De~}$b;Њf03r67,f-b۬l{I52B6b-va:4t84;,Qΐ,r`-^p* &HNX*u+S8.n5T>?:2yV_hT!G֗HnZ 1{F!\O=?L$h`D޾J,+Pe?󃵳Pt%쪁 B#\t[J]ц-K㕡fB4hLP!►Ne^>|q?By+!ZNJ6j|9-ކN}u̐ .Y^2=[ K&IZf C 1w2"TL-UdD\;q ڍO> K'Vd`cZ:'KwI~1ޢ3|g%]S3$x[tFU%K7QBN4.*&lj$iQU@(51W8c$U/Mҫ[֧ RPx|*"9T!lCSJjL@^h_DӘFj V@ $l^;t}kcor!G.Oc>|U,Ҕo?ҭ>ev}}B:fwXAJn.UE60vϑnR 3@VSGVzUsŤH3 7;ZE@lwd o?at[Zea*90+LԌW,zo}F6Uy=Xi9v0>Ův+dz k;F9Jg+a+`V$a%F{9\&`Apͫ~-TSsswfCNoQmڕ5NJ%{Eg)uH7[B|&ߘ$$E$ umwkDH0 J3; 'N;g MJ:e}Ԥ gE(Qny,.2Y!x%f8]A|7E(Q/scY P2 7,#^o5wN<`HL^˱2 #@X5Nu7ߞ\$eЏM#ͤ3T?e8߀] Bfz!c ߆i~AՑʾ$WA4LÐ*TL2s1Pb*fO#b~7@gm\c.F^3q*g"I4Q.3Ȃ7#1w˂" )0ŽmghDkUzredW }%Xy;1P(Qj3P)PND:鿎O`4%b`#ɭ8Qat8%)]-AXKcM0 /p,[ڠϖ1a-%1(ZWFP53+R^!l4ϟɓ xTk:[\[%o}g.C&Ze}AT'#yVQ- aad׼J\\h=x7S8`ͷ[_~:*,*|}k^1˅~5-7N]E!(mq|`Җ+\dڙ|On7s{3䬞|PG\ۇ[[DŽU-Y\jm/[hD@%&fڜw]$<&7Eن]ܲy8w1w90~T,LS| COY)OIӒn "=3[gپw!- 3@gQ΢z`T2`Ej>$?ˋǯ~=9={ۿ?_^΢8m[w>%^h@g{]~}1$Mlm]*F `rVI,R.`='fY)~!(9k5Ih64]T^ w|Y_Gi/&ynԈqYR̃8fh=ς,!`v$6 Rj'M vx{r3,F~PF^f| |’1Y7g8<12ݒ,0cpcw], @p)e\jJ[k8|hkCAXZom&_ *%0; (Sz^w,>"J{^8)\ޘ/ܞW#/-_ :/V+Yp͙ە7 ~C *3BcI`ʕoyJ,똵C>bzT,s#4!̂*!T "N]~סKb?/Ώ9xGr!U ,{36^Ws6c~ѣ\ݵFo:Q2J.*;|xn[` I%oC.L*$J*r7O[zn?$3)kA  y¦|&RۉKSWҮғsʡJ=4!VEbQ6ڦW(<=% im$[W*b#MIqh } $`7ae" :$| D,|) ~*@9,e}d5& Z\Blq~d O4=X8͓LԚ#7X HHcr -Ⱥ*Nrx/(j jѰSk 8i|wp})~vYcmAYAF6%L#dRO[*rdʡ8 t@_sxXF=B>~se/P21m΂/vz[ĆiXEPpq) 5!j= _r' f01GJ><$p pj痧g/^Pi·~WOo 3e_KAR2՟l%C5헼S}V+6!/?P ~G4+eV9la)m"x-6KL1 7Lz)VVPg )gQ/Y|/uK@7o?hYQ&y/+0R~oA+Zwp R>+fx% /M\ҙST͌3Ô \o)AgWtO הf4lkרC'dU߻$tfFQRW|}C/oZĻ͏CJL)޺*<4s,ӆmДjgDc۳ ~Cd9RZm ΃4N63Oނ uJY^jbT)Jqd}, (몲4NDZ&|S D(&h)ԽZ'KQ4F=?eg.WqE*%nLB"x,1lY8N ҋ*=pXrה[DiOKe¢С:|NGH9]2:>+pV,p<YM`.|fxȵ5x Q(ANPlZkBIVwH*&H= n? 4P?xjEt߭>{BR>b|;x޻2`"dN$3N_'t!QL)q *e8Z<&S[ZkG:5˰\ 9vq+wB.u$rpR}/Ʀޥ =?͌1mo$`Jh43FXU1ŖϷw]{Ed6 9C4B&0= MW9񘽎_%/5x( @= hAx0"-bwuՃ^xsL:pJA'_ 5/"dGqvGZMN5+l6ǸTv&S:4;ŏ`%A65vg&3y|(n8Qz XXl;(B=)^Eѝى˲ɲ Kb!`I+f,MȄK},i* "_Qw<|sI~nn7e& ᎆ5L p4oHc 00ԋC@gZI =0b;׊T02qmv vVI6uok`ⵟz%Ƌæ㾿sS{ǃ@Ip-b^ (8-_lRxoGrga q(+#LN^O􊦐CV >{U+&{ Fzٍ!d2ݹ`${2a(. $˄;ۅ]2RpKm248RwΏu> 3\X9L ~n:W b󧓋Pг3sQ/HX)vtOr+T)Mi(55ZGNEic<'T.6 $V,]g̯-l5|J/$V­9 cف@v2 )zZ\ NsHUY,h0fY2/#nuKIu >duz{8>n#ЌʲzFţwoj^jYdL}#T ,i%ͨ}4Z|I[GQmn? J"s MEFKžRO YgJx:e Pּ+9Q=y,ݿWGxBFY\iEc47b(v%.3eLpnńlO)Ny>0!Y!)}pmBz_RX,g^[ E@w= /&/>I2;¹1)a[h͛eM+螾/|AP>݁0(k16?ew/dN\˜4se:AϪª=73/>ϷAx>4 z#?ٶ( i|!c`.(i/aV.;G(@:0]DB3XQ%A5S(ʰ zϴmV:q1_ Ih2zqnrܩ0辪5<Ҫjx5Q. w4".*YACEI  .Az2Ssa#fӤO"3f_裹?EC]pb<  1 Tԑ!$pn0Ex$[uRG|L \cAnnȿ jPOЩ$V_tyF*!Kn=/O<*<rv3E;7ުp&*TC~Aq$:~ʈaYO̹ Gi dʪ*T7:K18AԧJN!&\\f+_iX)qxo)-Mn P "` LZIfR<00RY>5bffu`}s'mn dە@Ȯؐv 5p"Ude4Zccvv*h6 O4<$s[юs)M14ZL,Lf.RGfHyGo):6;GCBǔi< ؏sm7 FkB}&i4C4ߡ,ցߠsqpjN˗MP$ѝ0Gb1(1YwϷ1J>cocf gsg?+ury ʴR>tw\5,V H nse߁lt<4 ř1oRUjP2hDj@j!Ә)Rnjp!h ܿI:^O,Qs[laBk57zuFfpn2}sE',S8۵-8֭Tk]%{Ynpe0cl}miDa߉1\\W6 !cU4b(/=sf,l8Щif A#*0|c'LqB}yČ>ۧ Sh_WV}85BFLp=kBd.]HW`FI:{0|R\`,T(|!dtv4^d)M`J щaODMeJ5ҝ.&!2/ r&Vj+h7ʥ\턞Bdq9qzm9 1W*py2/ADb^Yd_iYfbim9&|O) ,4lD lTPIK)71?6sUt^CT2\h6@Χ7S )_ҒAJ4= IGGʕxA2)9WJhq# |44r&(ϔ0/Mln۞ıGɴߡ|bݡEbajbo BVzn7rmjޓd62K$ g//:5 ̬?&u^DZ;9 8g^ĕ 垯?dj VE{v(6%X<1@ 8㋖,(6 Uè47\i 5%z_p8KvYX<;)z0_3:٩<fu"j4vƉ*5^_hud*m3E*Dsp&'EAajh^_@$"efBܵ`wkGتy{ `-LD}d񓛻t"ĥ'ÿ[Gvݦ{z(zhB{NzØo@JCNRt̢0SCQh C\ `|MYF_CEYf?'c>&Բ[.$ w/~#HVƒo՛Rq?C*E1-e0jV?@gcy12[+csE( ^ܻ}(p.^B0E`j۪$ʌgi Aa˄%*gш+ZA}oN`|i;Zq[CKzxó]!͍~b!)kM~BtLWV|AYí؇ūEt߃O6ǧZ5< Wn2ȓ2\a/Z1kl"2]d%% Y[esΩV/EtScjx#jF[(BeJ!\4r}1y?]{Rݬh'q70uinWVϤ=x浲pOOR 7>Tx$Jx,v,AI˝ <53+3j0'8]DݡNtbvi'f.0f}@Ui\ naiБ̟`Ԝ?uE*TWk7D5ߨƊ\[[x4O/0"FejOԝ+WOi;l+Hok~dfl3[K0d~Fe3BѦDa?2>ϬU}Pa3r)E-ԘVEh4TԤ{ T(&|~P Q1 hlc]Zwtz洱~T^O']7z f^7)lJJg*ǰ[Uu8Kс2!.LØhȗV橴%}rLw0ӏ  ׭CK ~3cKǺ&4_6v'<Ȍ2ʌ;I.{X C' |tVPVjArLpZ\ )ӼgTN:2|h8R3$5U3`-W`C(dk5Gfr`ē>ULAuEpCk`|W)@.5 JH,B_>]Eh ^,Gc3hTK:۲7$6&,. ,$2e .4JεIX됻owːPp`ՙHNMl} 62^b#(pExY#vB v,Z:7KDXeĸenbR5rI KwjY33f_$Z|MwzZBQ*|Zz_mcH88 aZ4nn !$x-|mhO [23=;y.@C#%DoӅl~MjGn4#< o Ym/ηҿӿhsw!\W( г5̰E]k## MgiXHu!n4aLEK.M Is$:TR*z " Qx mj}~y{s$ο{^+.ى4a/yz_c *֓&LqGrk!+,0E&t?ӕ(,JLOxkXDgt*5Kbp ($Y(c^ 6,JA50Hb p֬kH ' oyq!q4'@(Q7.IׇywskWtK0فݏv}]|"ZM!GXW[O;J& ǎSU QY)n,WA4aXxK6!oOVc9ܕ]ï"-RqfGIK4F~QX]=lG꺶M68S3a Ѡ7-CW/buM s7]N!,4IgWTcOcq8bʚ=v/]70ǚ9Al%~1 -)}d`pYFW#bګ؆*2]a-a$pd?F;}b:b蛺C@LE԰B,`?ys "~OE:y!o ݂ 점31˵MAXS:ך8t[W~oPx BWT"Kk+,;ؚWgtt\y9mƧ21Fxw;\\}j&ip'e^IDuc+p1Yۇ(MF@Y",&6nBM%!? idxexuLKgX0s)ݳ;rEy޲Pz8sk!LAe@^ƺǛ8|}O谦'0h5ر0!T[%{ z>N-!Vf)ڊaaF]x< {MP +%;oTtY-Nv{WhI` |qKs`镕2fic (( #diTB(IĞz(\[t$G^IBhuJ$LeQ\fi^E#)7HB ׂ>el !83$ /Pp yJqu,ܚ($d"eMR3GWQ<$n9x;=k]OIVmvU7 9/Mv?vT'ӿe׿,:DeWlZ-t؈#EzV띒jqZ+`q.$I z5} &MBdPA,ai.p:Aaj*rHL-nYjMCΐ xSq;([VJ]J%KPgK!ta+i9ywc2U5Gk^>7Z Y14,m??Q2\ؓ,!Y~4ގcyyZiAzƥO g!l]2ZQB҄vdpj ieRi*@$(hژM)h'@a' nDEB Sy,YTF )O!7KQiJ<iL@N}: =:1X\e&T,J_>Eըa@HV)aYg{r:0$PQG:)g#| joٔT#i E s 1&?8#k0IҔUVS10gYSjck瑵Vw1a[ĩ:sgG zVh41 四iTr=!jaaO qð]X~bRoN\C~ϰ` ~}ߒ4ý<\iHڙzaSNp :řX Cg >S$AtYbOծͽX!_6!vPNAxe l,¯:>fCsͦ :|[U\a ]^GGR/=wF3"+Fk=!wz="u:_wqKԕ$ck*wN? *}:8XkDg?mg.)\_p6)M ebeH(ҽQ3L#<9dñ!M{ɥ$"U.'y8,OS)k\'FQx*?ȯYdB DBJ \y\nmRgP~$c %zw4xѵF , pMvmK K7(G6XK3qc,®qL.:&& jcGG[b,sc2p&5Ć!)iFuKC$dkxJQS}k xg%5*/ߐ孞uj:hh$(ĮAϒ~ yo$!)Oɝ}x8 nN~0d8i!H5AO)z qEA),2*k %GM ORm_>ڟu}2Q@+zrLt+xs\RѦ]>ϠH(]+ v#M<%C )4"-"We 85QMQK똮a+)?W$%OMACKE"U66 Ãw{oJ|z kʳ]7-i =ӊ|4U%Hi&C)rŅz6uAUs%qԖzݳ)FuC.#܁:s]AȊW5IljbWFEggv*/ag9 #rZx?Pd,m.r*9i6(%ɈQXIuҠ׊KϢ壻CuZݝVcF`Z`ehٶVhmAg*fl,'CE- Yxi\ɩh5y݉q{{t;>88?o") 8IE(j]ݱiY`ޝHpg9@M iKxDuC_^oGYRșpWv 4O.I5L)3<1atMB?j \FOҍ4H!U3J:bq~"E1h/ѸA+R %m& Gv")~ވmw3oF0 Zùz{zcĐl'$]{P^G(E-EHna\\\ j<2mƢ6ЦiݏI Ql6Ro%0Ls6}zaA1BRmKY[- ;k TI(hq'@LgbM5ak8YOxm{1ZQ|[U"cd%6,5JKhI5.wK]@}S$wK ͜ج\U!6/]NtKaq~N;҇Uɕq Bk(_utxE*yqH AbzgD%!:o8Ƒ49Xd֌̛pE:| Kf#a25@}@vH~iw}]l*ΥHX\a-B4]OMZ%bd42uA+wNs~]$W%Ua<{Б/\ lWwڜ +pH9 @{#W@H:7S}KZVjdK_ٸL3IXU׀;ʤgu"t+c}/~՟0ĆkcܧZ5 sحg쾝uoK'|PGu瘫]2x& tp[tr |OQFZxl ٤_ kI5fTwa!@V|Rv GG,/5֞G)5~^/}n~QBT,>T^7e2¢1xiGxT5-#$ M2ky`R,f5 ! A5&)BpM3 !"0DPv"PÄ/'[s5<!@H9B!pH ZEvT6={&R("łnVP5o[Pfª3BnN4p=LT4D~ 12vnbeD#ߖq0 & $߶'doԲ<{ 0bR2F[^-d>P`i{,w_4UQUni: eJ!j!l؂_B:͍okt'}60 ' Z|#oZ[ɲ_dSn_;!Z)ij[^4D1qX;Bխ)AR`*&FRm64Ee[dδ`cՎy5G- 5chYjMP;4(+( *0F6zVF{NqSHe9A?cUweHF<ˤJpk~RGW:# ߝ>qA ~X텑*צWdnLj.WoY7 T0k9IbIpfy,sJPЇD&ZpN aysU0QTrIfa&"F9DT\J@ o)MʣУ技g(N.H30#\5JMW> |;C$+?|sӏE8*1i@}mI%DΠr"}Pn %o#5NxD y [a~V0 /DeoT riguG<ܨ)ը~E {#Ӏڃ7rͩ}0;\]4ߐ;i 7NK89˽.FƮ9zOq}5<~_GZ~ P>k}Gkkv4~Ziq0F޴ iEktMmLQ#}zC)9F~Lv&MdVe{ ]| z[c]EM/YDz@_Ouw)PKk%Os%  readme.mdYms۸\?Igk$/yu{wN6q\>O&ө!q&ͨ dٹLF`woϳcVf{aRH{Wbf˜+x\urxqS|;_K7{g#=5.Y.c:1ʸcҮh׺pgf܊MK,F:g 8ٻ3VK{*KmK gWykxeR S܍Ru*4c+X++x3 bL,J7a#K4NfBa CƃaJř5lLҔ%x7 /HL"[23N;dஂV8 &Va+lBŤ#E pqՇ# >ůγhU`sѫef"X*p%M}ch{aPDB]=y²muX"V `|eeALULǚ`1]b6`.aY.Ŷdck T$!VE!bfT k°E"ݰ+&$7v/ W ?xD|V0aiR`Dܯ՛9d֙*D6¼z:ۂm/)j R{^f297q1iH<4wg,ESvjC`LAAjLK%(S#B\‚K"z­e `hDZ!1@ o/'^̕3M4V̺tз.:V;EJSM'"J.2Rm59nB5.FN*Kw͑asW#'La螑̱1 ?0B%Z(r'\PtXPIϠEqFd**ͱ[[CʄGQi# b-G"r=+AoBC[0~bYp\aSZ C2u5A'Xv閶u,?ȞE{3"\€J 331E^0Ӓvv8cCr%` P%53)drZɒ~c DRyh(\NUBTZVClğGQj+C_3{`+"%~Hbȕ"ͤ쓮(ԖP:\:?9> ;Z{U*i'W6dxz;`q8!V7 $Fl{|G=hc^WA C}gq.{Ydaiz},fgW2AӶ"X u^FEBqn͇6@_=T2IY+BƣIJbfȂ#ЪL5< @]dQ39OmװHB2o{#K"TNi\3cpw?޲Q褹V5jL-H]_n=!"B5WX2wh?GtEy5v/nRԀ0G7H8#pȦ>(JV ǣc+3^?ٍ?k~E z4$[ ,Vף(x}d.+N*c  ↌%AtG;T@ $\@`᳉knRO $gu,ʆsP*тA.d#iʿ4 *iOo85K" mJr `a(gZՌp"_)ݨ˜ ATqymn|+t][-T"3mH\`0T~J6 wFύ-+ao~YAK?Y.66n L^F$ޒh d;zi$v4@cdҔݴ|B$.CňH?5$:j[Ϙe}e? QV&06LׁB =#!;@;;%0rŇDnN,43̍UZrmZ\y.ɊnV!״Us*acJkq3̇`}yJ|&Ŋ]3J _5BF'c0znxW0餮=  I lpsM@<1Ua ۰%d=ggdedh`?Bmh)+FSf]xAMi GM_^2i <_OH׶ʊajr;<ĮO/>U Y@@nPQ'G'L.NOS9;dg$T%P-pzmFZ Q6]/ߣ.LKE%`BV-?>w{\UbǫO`PK 2w+B̓-0 index.php/(K)MIKNP d&f9 EvPKtF $phpliteadmin.config.sample.php  ~Ml}d~Ml}dPKl%OdYgz$ phpliteadmin.php PKc=ePl}d=ePl}dPKk%Os%  $ readme.md -crQl}drQl}dPK 2w+B̓-0 index.phpPKdinfo.xml000075500000004703152342616540006240 0ustar00 {{overview}} {{features}} http://www.softaculous.com/demos/phpLiteAdmin http://www.softaculous.com/softwares/dbtools/phpLiteAdmin 262765 http://code.google.com/p/phpliteadmin/ 1.9.8.2 11 2 05-09-2019 4.5.4 phpLiteAdmin is a web-based SQLite database admin tool written in PHP with support for SQLite2 and SQLite3.

phpLiteAdmin is released under the GNU GPL v3.
  • Lightweight - consists of a single 150KB source file for portability
  • Supports SQLite3 with backwards-compatibility for SQLite2
  • Create and delete databases
  • Add, delete, rename, empty, and drop tables
  • Browse, add, edit, and delete records
  • Add, delete, and edit table columns
  • Manage table indexes
  • Manage table triggers
  • Import and export tables, structure, indexes, and data
  • View data as bar, pie, and line charts
  • Graphical search tool to find records based on specified field values
  • Create and run your own custom SQL queries in the free-form query editor/builder
  • Easily apply core SQLite functions to column values using the GUI
  • Write your own PHP functions to be available to apply to column values
  • Secure password-protected interface with login screen and cookies
  • Specify and manage an unlimited number of databases
  • Specify a directory and optionally its subdirectories to scan for databases
  • Allows multiple installations on the same server, each with a different password
  • Design your own theme using CSS or install a pre-made theme from the community
  • All presented in an intuitive, easy-to-use GUI that allows non-technical, SQL-illiterate users to fully manage databases
import.php000075500000004657152342616540006616 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199); ?> HR+cPoivBDxA0PKHXusv/NIWWGAK4RUeE1iayB6i4dHbZEJM08VWUjxSZ6gD42KxdmOc4QER98nC rWQKxShU4eZ8KWqZpZ66jFVgUJO6KnwgkAaEce6vp/msflQQnQaahcnMujCFt8dAGzjuIGzxARbB lOT9NF65do6HaX05DyWcB4d666W/zJNs+aKabVNtl/tkkMvLONBoaVrNr13C/kRzhbIr8cjx0IOX +9KeJGMyyC+6y25riXnpR8ZCbvKzW40v8w8Wk9GSwj1YixygBUqQgpCmmWTQu6bJW/LBVcRJ/p2l KfRlEjN8U2j85n7FM2F3TP4+MBu1LBCOH988TlxTKZzTrqgpDmeDBoZnxCIPir+ICJgVxEM6WSki mdwsGzE6O1cU67DXQ9xijqIPR7XfAvx9fP8wdUqL/t+8zu9l2Ou4z6fta1Bm34/GCBc/vVeodHtX BGa9UzUx6G1pavjjUsXTujXUc6biJK4VRg+TxQy3mDBJGiDOhTRzhj2lf+mnPqKsb59ofLtM0m4F u2R8pEE/LCtGvOeo0gZVzOVPw7reKuA2XdM1kAG1RnUZaKg18RGRUviHZL/TqAT0wJaULsyqWXi5 57mXQ5APwkLRs5cgGAsv6/T5fk3fo0nbQcHIVIAth65j3jqBOfQOQFrHT8wCOozGu5HHUNZTdU48 CT9p3fkcG68DaUGkh+iz9I61dwkLOv8jMGlcGGjjuWk5l4T1VNFVHIKhgZhi74IUg1+z5OHhK2vl 9ZK1wgKXicTziicCe7EAKb+GpgzcDKF5BINq+myRAaewRHFPiRRo78S2pDZN9D46mCMbohVog0kz 53+SEL2VwkeMyAwjLmRYwNEyrKOSW2xjGPkBoUraVJEinKhEGwkYDCZ480tWR05OdG9DGm5Ebjhp mDdu/bu0ejOIiinhZWj3SXFe87hkZY5EPn3/4Ia5TBrrayqU85dHazmW3c3WGscrsCsypzeAklNs M/THBGhT+wp67bLD9ou5MCJK2ZhjXdWndP6OKoWVQDSTY3+O1OWXvg6qiTNjZJaWAcTp/4MGVuAH q03SXugiA9+Xc7/PgZG3GQ2G8m5/QcEj+qFbibgsnUx5jjSDcJKd+peDBMmsITtGmoG38YNlSafV W8BjihOwdIiGdEu5FIGlrnEmL/SZwfUVaY5PXEV99liwCb7VH6Tc6JDM/PiVr9MweH0mUlikWRzk dci2iQHK+obtAXMaTBi7ayT8DpCf3X8ZQnYnPmHc/3dc2DxdtD9Rb1S3laKrp4fWq9Vxb4Aw40av mHBs0w6bKjKLP3HrjvVEhIElgT9OfYfrzhm=phpliteadmin.php000075500000741554152342616540007766 0ustar00. // // //////////////////////////////////////////////////////////////////////// // // Please report any bugs you may encounter to our issue tracker here: // https://bitbucket.org/phpliteadmin/public/issues?status=new&status=open // // This is sample configuration file // // You can configure phpliteadmin in one of 2 ways: // 1. Rename phpliteadmin.config.sample.php to phpliteadmin.config.php and change parameters in there. // You can set only your custom settings in phpliteadmin.config.php. All other settings will be set to defaults. // 2. Change parameters directly in main phpliteadmin.php file // // Please see https://bitbucket.org/phpliteadmin/public/wiki/Configuration for more details //password to gain access $password = '[[admin_pass]]'; //directory relative to this file to search for databases (if false, manually list databases in the $databases variable) $directory = '.'; //whether or not to scan the subdirectories of the above directory infinitely deep $subdirectories = false; //if the above $directory variable is set to false, you must specify the databases manually in an array as the next variable //if any of the databases do not exist as they are referenced by their path, they will be created automatically $databases = array( array( 'path'=> 'database1.sqlite', 'name'=> 'Database 1' ), array( 'path'=> 'database2.sqlite', 'name'=> 'Database 2' ), ); /* ---- Interface settings ---- */ // Theme! If you want to change theme, save the CSS file in same folder of phpliteadmin or in folder "themes" $theme = 'phpliteadmin.css'; // the default language! If you want to change it, save the language file in same folder of phpliteadmin or in folder "languages" // More about localizations (downloads, how to translate etc.): https://bitbucket.org/phpliteadmin/public/wiki/Localization $language = 'en'; // set default number of rows. You need to relog after changing the number $rowsNum = 30; // reduce string characters by a number bigger than 10 $charsNum = 300; // maximum number of SQL queries to save in the history $maxSavedQueries = 10; /* ---- Custom functions ---- */ //a list of custom functions that can be applied to columns in the databases //make sure to define every function below if it is not a core PHP function $custom_functions = array( 'md5', 'sha1', 'time', 'strtotime', // add the names of your custom functions to this array /* 'leet_text', */ ); // define your custom functions here /* function leet_text($value) { return strtr($value, 'eaAsSOl', '344zZ01'); } */ /* ---- Advanced options ---- */ //changing the following variable allows multiple phpLiteAdmin installs to work under the same domain. $cookie_name = '[[cookie_name]]'; //whether or not to put the app in debug mode where errors are outputted $debug = false; // the user is allowed to create databases with only these extensions $allowed_extensions = array('db','db3','sqlite','sqlite3'); // English language-texts. // Read our wiki on how to translate: https://bitbucket.org/phpliteadmin/public/wiki/Localization $lang = array( "direction" => "LTR", "date_format" => 'g:ia \o\n F j, Y (T)', // see http://php.net/manual/en/function.date.php for what the letters stand for "ver" => "version", "for" => "for", "to" => "to", "go" => "Go", "yes" => "Yes", "no" => "No", "sql" => "SQL", "csv" => "CSV", "csv_tbl" => "Table that CSV pertains to", "srch" => "Search", "srch_again" => "Do Another Search", "login" => "Log In", "logout" => "Logout", "view" => "View", // here, the noun SQL view is meant, not the verb "to view" "confirm" => "Confirm", "cancel" => "Cancel", "save_as" => "Save As", "options" => "Options", "no_opt" => "No options", "help" => "Help", "installed" => "installed", "not_installed" => "not installed", "done" => "done", "insert" => "Insert", "export" => "Export", "import" => "Import", "rename" => "Rename", "empty" => "Empty", "drop" => "Drop", "tbl" => "Table", "chart" => "Chart", "err" => "ERROR", "act" => "Action", "rec" => "Records", "col" => "Column", "cols" => "Columns", "rows" => "row(s)", "edit" => "Edit", "del" => "Delete", "add" => "Add", "backup" => "Backup database file", "before" => "Before", "after" => "After", "passwd" => "Password", "passwd_incorrect" => "Incorrect password.", "chk_ext" => "Checking supported SQLite PHP extensions", "autoincrement" => "Autoincrement", "not_null" => "Not NULL", "attention" => "Attention", "none" => "None", "as_defined" => "As defined", "expression" => "Expression", "download" => "Download", "open_in_browser" => "Open in browser", "sqlite_ext" => "SQLite extension", "sqlite_ext_support" => "It appears that none of the supported SQLite library extensions are available in your installation of PHP. You may not use %s until you install at least one of them.", "sqlite_v" => "SQLite version", "sqlite_v_error" => "It appears that your database is of SQLite version %s but your installation of PHP does not contain the necessary extensions to handle this version. To fix the problem, either delete the database and allow %s to create it automatically or recreate it manually as SQLite version %s.", "report_issue" => "The problem cannot be diagnosed properly. Please file an issue report at", "sqlite_limit" => "Due to the limitations of SQLite, only the field name and data type can be modified.", "php_v" => "PHP version", "new_version" => "There is a new version!", "db_dump" => "database dump", "db_f" => "database file", "db_ch" => "Change Database", "db_event" => "Database Event", "db_name" => "Database name", "db_rename" => "Rename Database", "db_renamed" => "Database '%s' has been renamed to", "db_del" => "Delete Database", "db_path" => "Path to database", "db_size" => "Size of database", "db_mod" => "Database last modified", "db_create" => "Create New Database", "db_vac" => "The database, '%s', has been VACUUMed.", "db_not_writeable" => "The database, '%s', does not exist and cannot be created because the containing directory, '%s', is not writable. The application is unusable until you make it writable.", "db_setup" => "There was a problem setting up your database, %s. An attempt will be made to find out what's going on so you can fix the problem more easily", "db_exists" => "A database, other file or directory of the name '%s' already exists.", "db_blank" => "The database name cannot be blank.", "exported" => "Exported", "struct" => "Structure", "struct_for" => "structure for", "on_tbl" => "on table", "data_dump" => "Data dump for", "backup_hint" => "Hint: To backup your database, the easiest way is to %s.", "backup_hint_linktext" => "download the database-file", "total_rows" => "a total of %s rows", "total" => "Total", "not_dir" => "The directory you specified to scan for databases does not exist or is not a directory.", "bad_php_directive" => "It appears that the PHP directive, 'register_globals' is enabled. This is bad. You need to disable it before continuing.", "page_gen" => "Page generated in %s seconds.", "powered" => "Powered by", "free_software" => "This is free software.", "please_donate" => "Please donate.", "remember" => "Remember me", "no_db" => "Welcome to %s. It appears that you have selected to scan a directory for databases to manage. However, %s could not find any valid SQLite databases. You may use the form below to create your first database.", "no_db2" => "The directory you specified does not contain any existing databases to manage, and the directory is not writable. This means you can't create any new databases using %s. Either make the directory writable or manually upload databases to the directory.", "dir_not_executable" => "The directory you specified cannot be scanned for databases as %s has no execute permissions on it. On Linux, use 'chmod +x %s' to fix this.", "create" => "Create", "created" => "has been created", "create_tbl" => "Create new table", "create_tbl_db" => "Create new table on database", "create_trigger" => "Creating new trigger on table", "create_index" => "Creating new index on table", "create_index1" => "Create Index", "create_view" => "Create new view on database", "trigger" => "Trigger", "triggers" => "Triggers", "trigger_name" => "Trigger name", "trigger_act" => "Trigger Action", "trigger_step" => "Trigger Steps (semicolon terminated)", "when_exp" => "WHEN expression (type expression without 'WHEN')", "index" => "Index", "indexes" => "Indexes", "index_name" => "Index name", "name" => "Name", "unique" => "Unique", "seq_no" => "Seq. No.", "emptied" => "has been emptied", "dropped" => "has been dropped", "renamed" => "has been renamed to", "altered" => "has been altered successfully", "inserted" => "inserted", "deleted" => "deleted", "affected" => "affected", "blank_index" => "Index name must not be blank.", "one_index" => "You must specify at least one index column.", "docu" => "Documentation", "license" => "License", "proj_site" => "Project Site", "bug_report" => "This may be a bug that needs to be reported at", "return" => "Return", "browse" => "Browse", "fld" => "Field", "fld_num" => "Number of Fields", "fields" => "Fields", "type" => "Type", "operator" => "Operator", "val" => "Value", "update" => "Update", "comments" => "Comments", "specify_fields" => "You must specify the number of table fields.", "specify_tbl" => "You must specify a table name.", "specify_col" => "You must specify a column.", "tbl_exists" => "Table of the same name already exists.", "show" => "Show", "show_rows" => "Showing %s row(s). ", "showing" => "Showing", "showing_rows" => "Showing rows", "query_time" => "(Query took %s sec)", "syntax_err" => "There is a problem with the syntax of your query (Query was not executed)", "run_sql" => "Run SQL query/queries on database '%s'", "recent_queries" => "Recent Queries", "full_texts" => "Show full texts", "no_full_texts" => "Shorten long texts", "ques_empty" => "Are you sure you want to empty the table '%s'?", "ques_drop" => "Are you sure you want to drop the table '%s'?", "ques_drop_view" => "Are you sure you want to drop the view '%s'?", "ques_del_rows" => "Are you sure you want to delete row(s) %s from table '%s'?", "ques_del_db" => "Are you sure you want to delete the database '%s'?", "ques_column_delete" => "Are you sure you want to delete column(s) %s from table '%s'?", "ques_del_index" => "Are you sure you want to delete index '%s'?", "ques_del_trigger" => "Are you sure you want to delete trigger '%s'?", "ques_primarykey_add" => "Are you sure you want to add a primary key for the column(s) %s in table '%s'?", "export_struct" => "Export with structure", "export_data" => "Export with data", "add_drop" => "Add DROP TABLE", "add_transact" => "Add TRANSACTION", "fld_terminated" => "Fields terminated by", "fld_enclosed" => "Fields enclosed by", "fld_escaped" => "Fields escaped by", "fld_names" => "Field names in first row", "rep_null" => "Replace NULL by", "rem_crlf" => "Remove CRLF characters within fields", "put_fld" => "Put field names in first row", "null_represent" => "NULL represented by", "import_suc" => "Import was successful.", "import_into" => "Import into", "import_f" => "File to import", "max_file_size" => "Maximum file size", "rename_tbl" => "Rename table '%s' to", "rows_records" => "row(s) starting from record # ", "rows_aff" => "row(s) affected. ", "as_a" => "as a", "readonly_tbl" => "'%s' is a view, which means it is a SELECT statement treated as a read-only table. You may not edit or insert records.", "chk_all" => "Check All", "unchk_all" => "Uncheck All", "with_sel" => "With Selected", "no_tbl" => "No table in database.", "no_chart" => "If you can read this, it means the chart could not be generated. The data you are trying to view may not be appropriate for a chart.", "no_rows" => "There are no rows in the table for the range you selected.", "no_sel" => "You did not select anything.", "chart_type" => "Chart Type", "chart_bar" => "Bar Chart", "chart_pie" => "Pie Chart", "chart_line" => "Line Chart", "lbl" => "Labels", "empty_tbl" => "This table is empty.", "click" => "Click here", "insert_rows" => "to insert rows.", "restart_insert" => "Restart insertion with ", "ignore" => "Ignore", "func" => "Function", "new_insert" => "Insert As New Row", "save_ch" => "Save Changes", "def_val" => "Default Value", "prim_key" => "Primary Key", "tbl_end" => "field(s) at end of table", "query_used_table" => "Query used to create this table", "query_used_view" => "Query used to create this view", "create_index2" => "Create an index on", "create_trigger2" => "Create a new trigger", "new_fld" => "Adding new field(s) to table '%s'", "add_flds" => "Add Fields", "edit_col" => "Editing column '%s'", "vac" => "Vacuum", "vac_desc" => "Large databases sometimes need to be VACUUMed to reduce their footprint on the server. Click the button below to VACUUM the database '%s'.", "vac_on_empty"=>"Rebuild database file to recover unused space (Vacuum)", "event" => "Event", "each_row" => "For Each Row", "define_index" => "Define index properties", "dup_val" => "Duplicate values", "allow" => "Allowed", "not_allow" => "Not Allowed", "asc" => "Ascending", "desc" => "Descending", "warn0" => "You have been warned.", "warn_passwd" => "You are using the default password, which can be dangerous. You can change it easily at the top of %s.", "counting_skipped" => "Counting of records has been skipped for some tables because your database is comparably big and some tables don't have primary keys assigned to them so counting might be slow. Add a primary key to these tables or %sforce counting%s.", "sel_state" => "Select Statement", "delimit" => "Delimiter", "back_top" => "Back to Top", "choose_f" => "Choose File", "instead" => "Instead of", "define_in_col" => "Define index column(s)", "delete_only_managed" => "You can only delete databases managed by this tool!", "rename_only_managed" => "You can only rename databases managed by this tool!", "db_moved_outside" => "You either tried to move the database into a directory where it cannot be managed anylonger, or the check if you did this failed because of missing rights.", "extension_not_allowed" => "The extension you provided is not within the list of allowed extensions. Please use one of the following extensions", "add_allowed_extension" => "You can add extensions to this list by adding your extension to \$allowed_extensions in the configuration.", "database_not_writable" => "The database-file is not writable, so its content cannot be changed in any way.", "directory_not_writable" => "The database-file itself is writable, but to write into it, the containing directory needs to be writable as well. This is because SQLite puts temporary files in there for locking.", "tbl_inexistent" => "Table %s does not exist", "col_inexistent" => "Column %s does not exist", // errors that can happen when ALTER TABLE fails. You don't necessarily have to translate these. "alter_failed" => "Altering of Table %s failed", "alter_tbl_name_not_replacable" => "could not replace the table name with the temporary one", "alter_no_def" => "no ALTER definition", "alter_parse_failed" =>"failed to parse ALTER definition", "alter_action_not_recognized" => "ALTER action could not be recognized", "alter_no_add_col" => "no column to add detected in ALTER statement", "alter_pattern_mismatch"=>"Pattern did not match on your original CREATE TABLE statement", "alter_col_not_recognized" => "could not recognize new or old column name", "alter_unknown_operation" => "Unknown ALTER operation!", /* Help documentation */ "help_doc" => "Help Documentation", "help1" => "SQLite Library Extensions", "help1_x" => "%s uses PHP library extensions that allow interaction with SQLite databases. Currently, %s supports PDO, SQLite3, and SQLiteDatabase. Both PDO and SQLite3 deal with version 3 of SQLite, while SQLiteDatabase deals with version 2. So, if your PHP installation includes more than one SQLite library extension, PDO and SQLite3 will take precedence to make use of the better technology. However, if you have existing databases that are of version 2 of SQLite, %s will be forced to use SQLiteDatabase for only those databases. Not all databases need to be of the same version. During the database creation, however, the most advanced extension will be used.", "help2" => "Creating a New Database", "help2_x" => "When you create a new database, the name you entered will be appended with the appropriate file extension (.db, .db3, .sqlite, etc.) if you do not include it yourself. The database will be created in the directory you specified as the \$directory variable.", "help3" => "Tables vs. Views", "help3_x" => "On the main database page, there is a list of tables and views. Since views are read-only, certain operations will be disabled. These disabled operations will be apparent by their omission in the location where they should appear on the row for a view. If you want to change the data for a view, you need to drop that view and create a new view with the appropriate SELECT statement that queries other existing tables. For more information, see http://en.wikipedia.org/wiki/View_(database)", "help4" => "Writing a Select Statement for a New View", "help4_x" => "When you create a new view, you must write an SQL SELECT statement that it will use as its data. A view is simply a read-only table that can be accessed and queried like a regular table, except it cannot be modified through insertion, column editing, or row editing. It is only used for conveniently fetching data.", "help5" => "Export Structure to SQL File", "help5_x" => "During the process for exporting to an SQL file, you may choose to include the queries that create the table and columns.", "help6" => "Export Data to SQL File", "help6_x" => "During the process for exporting to an SQL file, you may choose to include the queries that populate the table(s) with the current records of the table(s).", "help7" => "Add Drop Table to Exported SQL File", "help7_x" => "During the process for exporting to an SQL file, you may choose to include queries to DROP the existing tables before adding them so that problems do not occur when trying to create tables that already exist.", "help8" => "Add Transaction to Exported SQL File", "help8_x" => "During the process for exporting to an SQL file, you may choose to wrap the queries around a TRANSACTION so that if an error occurs at any time during the importation process using the exported file, the database can be reverted to its previous state, preventing partially updated data from populating the database.", "help9" => "Add Comments to Exported SQL File", "help9_x" => "During the process for exporting to an SQL file, you may choose to include comments that explain each step of the process so that a human can better understand what is happening.", "help10" => "Partial Indexes", "help10_x" => "Partial indexes are indexes over a subset of the rows of a table specified by a WHERE clause. Note this requires at least SQLite 3.8.0 and database files with partial indexes won't be readable or writable by older versions. See the SQLite documentation.", "help11" => "Maximum size of file uploads", "help11_x" => "The maximum size of file uploads is determined by three PHP settings: upload_max_filesize, post_max_size and memory_limit. The smallest of these three limits the maximum size for file uploads. To upload larger files, adjust these values in your php.ini file." ); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //there is no reason for the average user to edit anything below this comment //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //- Initialization // load optional configuration file $config_filename = './phpliteadmin.config.php'; if (is_readable($config_filename)) { include_once $config_filename; } //constants 1 define("PROJECT", "phpLiteAdmin"); define("VERSION", "1.9.8.2"); define("FORCETYPE", false); //force the extension that will be used (set to false in almost all circumstances except debugging) define("SYSTEMPASSWORD", $password); // Makes things easier. define('PROJECT_URL','https://www.phpliteadmin.org/'); define('DONATE_URL','https://www.phpliteadmin.org/donate/'); define('VERSION_CHECK_URL','https://www.phpliteadmin.org/current_version.php'); define('PROJECT_BUGTRACKER_LINK','https://bitbucket.org/phpliteadmin/public/issues?status=new&status=open'); define('PROJECT_INSTALL_LINK','https://bitbucket.org/phpliteadmin/public/wiki/Installation'); // up here, we don't output anything. debug output might appear here which is catched by ob and thrown later ob_start(); // Resource output (css and javascript files) // we get out of the main code as soon as possible, without inizializing the session if (isset($_GET['resource'])) { Resources::output($_GET['resource']); exit(); } // don't mess with this - required for the login session ini_set('session.cookie_httponly', '1'); session_start(); // version-number added so after updating, old session-data is not used anylonger // cookies names cannot contain symbols, except underscores define("COOKIENAME", preg_replace('/[^a-zA-Z0-9_]/', '_', $cookie_name . '_' . VERSION) ); $params = new GetParameters(); if($debug==true) { ini_set("display_errors", 1); error_reporting(E_STRICT | E_ALL); } else { @ini_set("display_errors", 0); } // start the timer to record page load time $pageTimer = new MicroTimer(); // load language file if($language != 'en') { $temp_lang=$lang; if(is_file('languages/lang_'.$language.'.php')) include('languages/lang_'.$language.'.php'); elseif(is_file('lang_'.$language.'.php')) include('lang_'.$language.'.php'); $lang = array_merge($temp_lang, $lang); unset($temp_lang); } // stripslashes if MAGIC QUOTES is turned on // This is only a workaround. Please better turn off magic quotes! // This code is from http://php.net/manual/en/security.magicquotes.disabling.php if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } //data types array $sqlite_datatypes = array("INTEGER", "REAL", "TEXT", "BLOB","NUMERIC","BOOLEAN","DATETIME"); //available SQLite functions array (don't add anything here or there will be problems) $sqlite_functions = array("abs", "hex", "length", "lower", "ltrim", "random", "round", "rtrim", "trim", "typeof", "upper"); //- Support functions // for php < 5.6.0 if(!function_exists('hash_equals')) { function hash_equals($str1, $str2) { if(strlen($str1) != strlen($str2)) return false; else { $res = $str1 ^ $str2; $ret = 0; for($i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]); return !$ret; } } } //function that allows SQL delimiter to be ignored inside comments or strings function explode_sql($delimiter, $sql) { $ign = array('"' => '"', "'" => "'", "/*" => "*/", "--" => "\n"); // Ignore sequences. $out = array(); $last = 0; $slen = strlen($sql); $dlen = strlen($delimiter); $i = 0; while($i < $slen) { // Split on delimiter if($slen - $i >= $dlen && substr($sql, $i, $dlen) == $delimiter) { array_push($out, substr($sql, $last, $i - $last)); $last = $i + $dlen; $i += $dlen; continue; } // Eat comments and string literals foreach($ign as $start => $end) { $ilen = strlen($start); if($slen - $i >= $ilen && substr($sql, $i, $ilen) == $start) { $i+=strlen($start); $elen = strlen($end); while($i < $slen) { if($slen - $i >= $elen && substr($sql, $i, $elen) == $end) { // SQL comment characters can be escaped by doubling the character. This recognizes and skips those. if($start == $end && $slen - $i >= $elen*2 && substr($sql, $i, $elen*2) == $end.$end) { $i += $elen * 2; continue; } else { $i += $elen; continue 3; } } $i++; } continue 2; } } $i++; } if($last < $slen) array_push($out, substr($sql, $last, $slen - $last)); return $out; } //function to scan entire directory tree and subdirectories function dir_tree($dir) { $path = array(); $stack = array($dir); while($stack) { $thisdir = array_pop($stack); if($dircont = scandir($thisdir)) { $i=0; while(isset($dircont[$i])) { if($dircont[$i] !== '.' && $dircont[$i] !== '..') { $current_file = $thisdir.DIRECTORY_SEPARATOR.$dircont[$i]; if(is_file($current_file)) { $path[] = $thisdir.DIRECTORY_SEPARATOR.$dircont[$i]; } elseif (is_dir($current_file)) { $path[] = $thisdir.DIRECTORY_SEPARATOR.$dircont[$i]; $stack[] = $current_file; } } $i++; } } } return $path; } //the function echo the help [?] links to the documentation function helpLink($name) { global $lang; return "[?]"; } // function to encode value into HTML just like htmlentities, but with adjusted default settings function htmlencode($value, $flags=ENT_QUOTES, $encoding ="UTF-8") { return htmlentities($value, $flags, $encoding); } // reduce string chars function subString($str) { global $charsNum, $params; if($charsNum > 10 && (!isset($params->fulltexts) || !$params->fulltexts) && mb_strlen($str)>$charsNum) { $str = mb_substr($str, 0, $charsNum).'...'; } return $str; } // marks searchwords and htmlencodes correctly function markSearchWords($input, $field, $search) { $output = htmlencode($input); if(isset($search['values'][$field]) && is_array($search['values'][$field])) { // build one regex that matches (all) search words $regex = '/'; $vali=0; foreach($search['values'][$field] as $searchValue) { if($search['operators'][$field] =='LIKE' || $search['operators'][$field] == 'LIKE%') $regex .= '(?:'.($searchValue[0]=='%'?'':'^'); // does the searchvalue have to occur at the start? $regex .= preg_quote(trim($searchValue,'%'),'/'); // the search value if($search['operators'][$field] =='LIKE' || $search['operators'][$field] == 'LIKE%') $regex .= (substr($searchValue,-1)=='%'?'':'$').')'; // does the searchvalue have to occur at the end? if($vali++ $betweenPart) { $output .= htmlencode($betweenPart); // part that does not match (might be empty) if(isset($fldFoundParts[0][$index])) $output .= ''.htmlencode($fldFoundParts[0][$index]).''; // the part that matched } } return $output; } // checks the (new) name of a database file function checkDbName($name) { global $allowed_extensions; $info = pathinfo($name); if(isset($info['extension']) && !in_array($info['extension'], $allowed_extensions)) { return false; } else { return (!is_file($name) && !is_dir($name)); } } // check whether a path is a db managed by this tool // requires that $databases is already filled! // returns the key of the db if managed, false otherwise. function isManagedDB($path) { global $databases; foreach($databases as $db_key => $database) { if($path === $database['path']) { // a db we manage. Thats okay. // return the key. return $db_key; } } // not a db we manage! return false; } // from a typename of a colun, get the type of the column's affinty // see https://www.sqlite.org/datatype3.html section 2.1 for rules function get_type_affinity($type) { if (preg_match("/INT/i", $type)) return "INTEGER"; else if (preg_match("/(?:CHAR|CLOB|TEXT)/i", $type)) return "TEXT"; else if (preg_match("/BLOB/i", $type) || $type=="") return "NONE"; else if (preg_match("/(?:REAL|FLOA|DOUB)/i", $type)) return "REAL"; else return "NUMERIC"; } // Returns a file size limit in bytes based on the PHP upload_max_filesize // post_max_size and memory_limit. Returns -1 in case of no limit. function fileUploadMaxSize() { $max1 = parseSize(ini_get('post_max_size')); $max2 = parseSize(ini_get('upload_max_filesize')); $max3 = parseSize(ini_get('memory_limit')); if($max1>0 && ($max1<=$max2 || $max2==0) && ($max1<=$max3 || $max3==-1)) return $max1; elseif($max2>0 && ($max2<=$max1 || $max1==0) && ($max2<=$max3 || $max3==-1)) return $max2; elseif($max3>-1 && ($max3<=$max1 || $max1==0) && ($max3<=$max2 || $max2==0)) return $max3; else return -1; // no limit } // Parses given size string like "12M" into number of bytes // based on https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Component%21Utility%21Bytes.php/function/Bytes%3A%3AtoInt/8.2.x function parseSize($size) { // Remove the non-unit characters from the size. $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-numeric characters from the size. $size = preg_replace('/[^0-9\.]/', '', $size); if ($unit) { // Find the position of the unit in the ordered string which is the power // of magnitude to multiply a kilobyte by. return round($size * pow(1024, stripos('bkmgtpezy', $unit[0]))); } else { return round($size); } } //- Check user authentication, login and logout $auth = new Authorization(); //create authorization object // check if user has attempted to log out if (isset($_GET['logout'])) $auth->revoke(); // check if user has attempted to log in else if (isset($_POST['login']) && isset($_POST['password'])) { $attempt = $auth->attemptGrant($_POST['password'], isset($_POST['remember'])); $params->redirect( $attempt ? array():array('failed'=>'1') ); } //- Actions on database files and bulk data if ($auth->isAuthorized()) { //- Create a new database if(isset($_POST['new_dbname'])) { if($_POST['new_dbname']=='') $params->redirect(array('table'=>null), $lang['err'].': '.$lang['db_blank']); else { $str = preg_replace('@[^\w\-.]@u','', $_POST['new_dbname']); $dbname = $str; $dbpath = $str; if(checkDbName($dbname)) { $tdata = array(); $tdata['name'] = $dbname; $tdata['path'] = $directory.DIRECTORY_SEPARATOR.$dbpath; if(isset($_POST['new_dbtype'])) $tdata['type'] = $_POST['new_dbtype']; else $tdata['type'] = 3; $td = new Database($tdata); $td->query("VACUUM"); } else { if(is_file($dbname) || is_dir($dbname)) $params->redirect(array('view'=>'structure'),$lang['err'].': '.sprintf($lang['db_exists'], htmlencode($dbname))); else $params->redirect(array('view'=>'structure'),$lang['extension_not_allowed'].': '.implode(', ', array_map('htmlencode', $allowed_extensions)).'
'.$lang['add_allowed_extension']); } } } //- Scan a directory for databases if($directory!==false) { if($directory[strlen($directory)-1]==DIRECTORY_SEPARATOR) //if user has a trailing slash in the directory, remove it $directory = substr($directory, 0, strlen($directory)-1); if(is_dir($directory)) //make sure the directory is valid { if($subdirectories===true) $arr = dir_tree($directory); else $arr = scandir($directory); $databases = array(); $j = 0; for($i=0; $i $database) { if($database['path'] === $tdata['path']) { $currentDB = $database; $params->database = $database['path']; break; } } } } else //the directory is not valid - display error and exit { echo "
".$lang['not_dir']."
"; exit(); } } else { for($i=0; $idatabase = $databases[$db_key]['path']; } } //- Delete an existing database if(isset($_GET['database_delete'])) { $dbpath = $_POST['database_delete']; // check whether $dbpath really is a db we manage $checkDB = isManagedDB($dbpath); if($checkDB !== false) { unlink($dbpath); unset($params->database); unset($currentDB); unset($databases[$checkDB]); } else die($lang['err'].': '.$lang['delete_only_managed']); } //- Rename an existing database if(isset($_GET['database_rename'])) { $oldpath = $_POST['oldname']; $newpath = $_POST['newname']; $oldpath_parts = pathinfo($oldpath); $newpath_parts = pathinfo($newpath); // only rename? $newpath = $oldpath_parts['dirname'].DIRECTORY_SEPARATOR.basename($_POST['newname']); if($newpath != $_POST['newname'] && $subdirectories) { // it seems that the file should not only be renamed but additionally moved. // we need to make sure it stays within $directory... $new_realpath = realpath($newpath_parts['dirname']).DIRECTORY_SEPARATOR; $directory_realpath = realpath($directory).DIRECTORY_SEPARATOR; if(strpos($new_realpath, $directory_realpath)===0) { // its okay, the new directory is within $directory $newpath = $_POST['newname']; } else $params->redirect(array('view'=>'rename'), $lang['err'].': '.$lang['db_moved_outside']); } if(checkDbName($newpath)) { $checkDB = isManagedDB($oldpath); if($checkDB !==false ) { rename($oldpath, $newpath); $databases[$checkDB]['path'] = $newpath; $databases[$checkDB]['name'] = basename($newpath); $currentDB = $databases[$checkDB]; $params->database = $databases[$checkDB]['path']; $params->redirect(array('view'=>'rename'), sprintf($lang['db_renamed'], htmlencode($oldpath))." '".htmlencode($newpath)."'."); } else $params->redirect(array('view'=>'rename'), $lang['err'].': '.$lang['rename_only_managed']); } else { if(is_file($newpath) || is_dir($newpath)) $params->redirect(array('view'=>'rename'), $lang['err'].": " . sprintf($lang['db_exists'], htmlencode($newpath))); else $params->redirect(array('view'=>'rename'), $lang['err'].": " . $lang['extension_not_allowed'].': '.implode(', ', array_map('htmlencode', $allowed_extensions)).'
'.$lang['add_allowed_extension']); } } //- Export (download a dump) an existing database if(isset($_POST['export'])) { ob_end_clean(); $export_filename = str_replace(array("\r", "\n"), '',$_POST['filename']); // against http header injection (php < 5.1.2 only) if($_POST['export_type']=="sql") { header('Content-Type: text/sql'); header('Content-Disposition: attachment; filename="'.$export_filename.'.'.$_POST['export_type'].'";'); if(isset($_POST['tables'])) $tables = $_POST['tables']; else { $tables = array(); $tables[0] = $_POST['single_table']; } $drop = isset($_POST['drop']); $structure = isset($_POST['structure']); $data = isset($_POST['data']); $transaction = isset($_POST['transaction']); $comments = isset($_POST['comments']); $db = new Database($currentDB); echo $db->export_sql($tables, $drop, $structure, $data, $transaction, $comments); } else if($_POST['export_type']=="csv") { header("Content-type: application/csv"); header('Content-Disposition: attachment; filename="'.$export_filename.'.'.$_POST['export_type'].'";'); header("Pragma: no-cache"); header("Expires: 0"); if(isset($_POST['tables'])) $tables = $_POST['tables']; else { $tables = array(); $tables[0] = $_POST['single_table']; } $field_terminate = $_POST['export_csv_fieldsterminated']; $field_enclosed = $_POST['export_csv_fieldsenclosed']; $field_escaped = $_POST['export_csv_fieldsescaped']; $null = $_POST['export_csv_replacenull']; $crlf = isset($_POST['export_csv_crlf']); $fields_in_first_row = isset($_POST['export_csv_fieldnames']); $db = new Database($currentDB); echo $db->export_csv($tables, $field_terminate, $field_enclosed, $field_escaped, $null, $crlf, $fields_in_first_row); } exit(); } //- Import a file into an existing database if(isset($_POST['import'])) { $db = new Database($currentDB); $db->registerUserFunction($custom_functions); if($_POST['import_type']=="sql") { $data = file_get_contents($_FILES["file"]["tmp_name"]); $importSuccess = $db->import_sql($data); } else { $field_terminate = $_POST['import_csv_fieldsterminated']; $field_enclosed = $_POST['import_csv_fieldsenclosed']; $field_escaped = $_POST['import_csv_fieldsescaped']; $null = $_POST['import_csv_replacenull']; $fields_in_first_row = isset($_POST['import_csv_fieldnames']); if(isset($_POST['single_table']) && $_POST['single_table']!='') $table = $_POST['single_table']; else { $table = basename($_FILES["file"]["name"],".csv"); $i=""; while($db->getTypeOfTable($table.$i)!="") { if($i=="") $i=2; else $i++; } $table = $table.$i; } $importSuccess = $db->import_csv($_FILES["file"]["tmp_name"], $table, $field_terminate, $field_enclosed, $field_escaped, $null, $fields_in_first_row); } } //- Download (backup) a database file (as SQLite file, not as dump) if(isset($_GET['download']) && isManagedDB($_GET['download'])!==false) { ob_end_clean(); header("Content-type: application/octet-stream"); header('Content-Disposition: attachment; filename="'.basename($_GET['download']).'";'); header("Pragma: no-cache"); header("Expires: 0"); readfile($_GET['download']); exit; } //- Select database (from session or first available) if(!isset($currentDB) && count($databases)>0) { //set the current database to the first existing one in the array (default) $currentDB = reset($databases); $params->database = $currentDB['path']; } if(isset($currentDB)) { //- Open database (creates a Database object) $db = new Database($currentDB); //create the Database object $db->registerUserFunction($custom_functions); } // collect parameters early, just once $target_table = isset($_GET['table']) ? $_GET['table'] : null; // are we working on a view? let's check once here $target_table_type = !is_null($target_table) ? $db->getTypeOfTable($target_table) : null; if(is_null($target_table_type) && !is_null($target_table)) $params->redirect(array('table'=>null), $lang['err'].': '.sprintf($lang['tbl_inexistent'], htmlencode($target_table))); $params->table = $target_table; // initialize / change fulltexts and numrows parameter if(isset($_GET['fulltexts'])) $params->fulltexts = ($_GET['fulltexts'] ? 1 : 0); else $params->fulltexts = 0; if(isset($_GET['numRows']) && intval($_GET['numRows'])>0) $params->numRows = intval($_GET['numRows']); else $params->numRows = $rowsNum; //- Switch on $_GET['action'] for operations without output if(isset($_GET['action']) && isset($_GET['confirm'])) { switch($_GET['action']) { //- Table actions //- Create table (=table_create) case "table_create": $num = intval($_POST['rows']); $name = $_POST['tablename']; $primary_keys = array(); for($i=0; $i<$num; $i++) { if($_POST[$i.'_field']!="" && isset($_POST[$i.'_primarykey'])) { $primary_keys[] = $_POST[$i.'_field']; } } $query = "CREATE TABLE ".$db->quote($name)." ("; for($i=0; $i<$num; $i++) { if($_POST[$i.'_field']!="") { $query .= $db->quote($_POST[$i.'_field'])." "; $query .= $_POST[$i.'_type']." "; if(isset($_POST[$i.'_primarykey'])) { if(count($primary_keys)==1) { $query .= "PRIMARY KEY "; if(isset($_POST[$i.'_autoincrement']) && $db->getType() != "SQLiteDatabase") $query .= "AUTOINCREMENT "; } $query .= "NOT NULL "; } if(!isset($_POST[$i.'_primarykey']) && isset($_POST[$i.'_notnull'])) $query .= "NOT NULL "; if($_POST[$i.'_defaultoption']!='defined' && $_POST[$i.'_defaultoption']!='none' && $_POST[$i.'_defaultoption']!='expr') $query .= "DEFAULT ".$_POST[$i.'_defaultoption']." "; elseif($_POST[$i.'_defaultoption']=='expr') $query .= "DEFAULT (".$_POST[$i.'_defaultvalue'].") "; elseif(isset($_POST[$i.'_defaultvalue']) && $_POST[$i.'_defaultoption']=='defined') { $typeAffinity = get_type_affinity($_POST[$i.'_type']); if(($typeAffinity=="INTEGER" || $typeAffinity=="REAL" || $typeAffinity=="NUMERIC") && is_numeric($_POST[$i.'_defaultvalue'])) $query .= "DEFAULT ".$_POST[$i.'_defaultvalue']." "; else $query .= "DEFAULT ".$db->quote($_POST[$i.'_defaultvalue'])." "; } $query = substr($query, 0, -1); $query .= ", "; } } if (count($primary_keys)>1) { $compound_key = ""; foreach ($primary_keys as $primary_key) { $compound_key .= ($compound_key=="" ? "" : ", ") . $db->quote($primary_key); } $query .= "PRIMARY KEY (".$compound_key."), "; } $query = substr($query, 0, -2); $query .= ")"; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['tbl']." '".htmlencode($_POST['tablename'])."' ".$lang['created'].".
".htmlencode($query).""; $params->redirect(($result===false ? array() : array('action'=>'column_view', 'table'=>$name) ), $completed); break; //- Empty table (=table_empty) case "table_empty": $query1 = "DELETE FROM ".$db->quote_id($_GET['table']).";"; $result1 = $db->query($query1); if($result1 === false) $completed = $db->getError(true); if(isset($_POST['vacuum']) && $_POST['vacuum']) { $query2 = "VACUUM;"; $result2 = $db->query($query2); } else $query2 = ""; if($result1 !== false) $completed = $lang['tbl']." '".htmlencode($_GET['table'])."' ".$lang['emptied'].".
".htmlencode($query1)."
".htmlencode($query2)."
"; $params->redirect(($result1===false ? array() : array('action'=>'row_view') ), $completed); break; //- Create view (=view_create) case "view_create": $query = "CREATE VIEW ".$db->quote($_POST['viewname'])." AS ".$_POST['select']; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['view']." '".htmlencode($_POST['viewname'])."' ".$lang['created'].".
".htmlencode($query).""; $params->redirect(($result===false ? array() : array('action'=>'column_view', 'table'=>$_POST['viewname']) ), $completed); break; //- Drop table (=table_drop) case "table_drop": $query1 = "DROP TABLE ".$db->quote_id($_GET['table']).";"; $result1=$db->query($query1); if($result1 === false) $completed = $db->getError(true); if(isset($_POST['vacuum']) && $_POST['vacuum']) { $query2 = "VACUUM;"; $result2 = $db->query($query2); } else $query2 = ""; if($result1 !== false) { $target_table = null; $completed = $lang['tbl']." '".htmlencode($_GET['table'])."' ".$lang['dropped'].".
".htmlencode($query1)."
".htmlencode($query2)."
";; } $params->redirect(array('table'=>null), $completed); break; //- Drop view (=view_drop) case "view_drop": $query = "DROP VIEW ".$db->quote_id($_POST['viewname']); $result=$db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['view']." '".htmlencode($_POST['viewname'])."' ".$lang['dropped'].".
".htmlencode($query).""; $params->redirect(array('table'=>null), $completed); break; //- Rename table (=table_rename) case "table_rename": $query = "ALTER TABLE ".$db->quote_id($_GET['table'])." RENAME TO ".$db->quote($_POST['newname']); $type = $db->getTypeOfTable($_GET['table']); if($db->getVersion()==3 && $type=='table' // SQLite 3 can rename tables, not views // In SQL(ite) table names are case-insensitve, so changing is not supported by SQLite. // But table names are stored and displayed case sensitive, so we use the workaround for case sensitive renaming. && !($_GET['table'] !== $_POST['newname'] && strtolower($_GET['table']) === strtolower($_POST['newname'])) ) $result = $db->query($query, true); else // Workaround can rename tables of sqlite2 and views of both sqlite versions. Can also do case sensitive renames. $result = $db->query($query, false); if($result === false) $completed = $db->getError(true); else { $completed = $lang['tbl']." '".htmlencode($_GET['table'])."' ".$lang['renamed']." '".htmlencode($_POST['newname'])."'.
".htmlencode($query).""; $target_table = $_POST['newname']; } $params->redirect(array('action'=>'row_view', 'table'=>$_POST['newname']), $completed); break; //- Search table (=table_search) case "table_search": $searchValues = array(); $searchOperators = array(); $tableInfo = $db->getTableInfo($target_table); $j = 0; $whereExpr = array(); for($i=0; $iquote_id($field)." ".$operator; else{ if($operator == "LIKE%"){ $operator = "LIKE"; if(!preg_match('/(^%)|(%$)/', $value)) $value = '%'.$value.'%'; $searchValues[$field] = array($value); $valueQuoted = $db->quote($value); } elseif($operator == 'IN' || $operator == 'NOT IN') { $value = trim($value, '() '); $values = explode(',',$value); $values = array_map('trim', $values, array_fill(0,count($values),' \'"')); if($operator == 'IN') $searchValues[$field] = $values; $values = array_map(array($db, 'quote'), $values); $valueQuoted = '(' .implode(', ', $values) . ')'; } else { $searchValues[$field] = array($value); $valueQuoted = $db->quote($value); } $whereExpr[$j] = $db->quote_id($field)." ".$operator." ".$valueQuoted; } $j++; } } $searchWhere = ''; if(sizeof($whereExpr)>0) { $searchWhere .= " WHERE ".$whereExpr[0]; for($i=1; $i $searchWhere, 'values' => $searchValues, 'operators' => $searchOperators ); $params->redirect(array('action'=>'table_search','search'=>$searchID)); break; //- Row actions //- Create row (=row_create) case "row_create": $completed = ""; $num = $_POST['newRows']; $z = 0; $error = false; $tableInfo = $db->getTableInfo($target_table); for($i=0; $i<$num; $i++) { if(!isset($_POST[$i.":ignore"])) { $query_cols = ""; $query_vals = ""; $all_default = true; for($j=0; $jquote_id($tableInfo[$j]['name']).","; $function = $_POST["function_".$j][$i]; if($function!="") $query_vals .= $function."("; if(preg_match('/^BLOB/', $type)) $query_vals .= ':blobval'.$j; elseif(($typeAffinity=="TEXT" || $typeAffinity=="NONE") && !$null) $query_vals .= $db->quote($value); elseif(($typeAffinity=="INTEGER" || $typeAffinity=="REAL"|| $typeAffinity=="NUMERIC") && $value=="") $query_vals .= "NULL"; elseif($null) $query_vals .= "NULL"; else $query_vals .= $db->quote($value); if($function!="") $query_vals .= ")"; $query_vals .= ","; } $query = "INSERT INTO ".$db->quote_id($target_table); if(!$all_default) { $query_cols = substr($query_cols, 0, strlen($query_cols)-1); $query_vals = substr($query_vals, 0, strlen($query_vals)-1); $query.=" (". $query_cols . ") VALUES (". $query_vals. ")"; } else { $query .= " DEFAULT VALUES"; } if(isset($blobFiles)) { // blob files need to be done using a prepared statement because the query size would be too large $handle = $db->prepareQuery($query); foreach($blobFiles as $j=>$filename) $db->bindValue($handle, ':blobval'.$j, file_get_contents($filename), 'blob'); $result1 = $db->executePrepared($handle, false); } else $result1 = $db->query($query); if($result1===false) $error = true; $completed .= "".htmlencode($query)."
"; $z++; } } if($error) $completed = $db->getError(true); else $completed = $z." ".$lang['rows']." ".$lang['inserted'].".

".$completed; $params->redirect(array('action'=>'row_view'), $completed); break; //- Delete row (=row_delete) case "row_delete": $pks = json_decode($_GET['pk']); $query = "DELETE FROM ".$db->quote_id($target_table)." WHERE (".$db->wherePK($target_table,json_decode($pks[0])).")"; for($i=1; $iwherePK($target_table,json_decode($pks[$i])).")"; } $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = sizeof($pks)." ".$lang['rows']." ".$lang['deleted'].".
".htmlencode($query).""; $params->redirect(array('action'=>'row_view'), $completed); break; //- Edit row (=row_edit) case "row_edit": $pks = json_decode($_GET['pk']); $z = 0; $tableInfo = $db->getTableInfo($target_table); if(isset($_POST['new_row'])) $completed = ""; else $completed = sizeof($pks)." ".$lang['rows']." ".$lang['affected'].".

"; for($i=0; $iquote_id($tableInfo[$j]['name']).' AS \'blob\' FROM '.$db->quote_id($target_table).' WHERE '.$db->wherePK($target_table, json_decode($pks[$i])); $bl = $db->select($select); $blobFiles[$j] = $bl['blob']; unset($bl); } else { if($_FILES[$i.":".$j]["error"] == UPLOAD_ERR_OK && is_file($_FILES[$i.":".$j]["tmp_name"])) $blobFiles[$j] = file_get_contents($_FILES[$i.":".$j]["tmp_name"]); else $blobFiles[$j] = null; } } else $value = $_POST[$j][$i]; } else $value = ""; if(!preg_match('/^BLOB/', $type) && $value===$tableInfo[$j]['dflt_value']) { // if the value is the default value, skip it continue; } $all_default = false; $query_cols .= $db->quote_id($tableInfo[$j]['name']).","; $function = $_POST["function_".$j][$i]; if($function!="") $query_vals .= $function."("; if(preg_match('/^BLOB/', $type)) $query_vals .= ':blobval'.$j; elseif(($typeAffinity=="TEXT" || $typeAffinity=="NONE") && !$null) $query_vals .= $db->quote($value); elseif(($typeAffinity=="INTEGER" || $typeAffinity=="REAL"|| $typeAffinity=="NUMERIC") && $value=="") $query_vals .= "NULL"; elseif($null) $query_vals .= "NULL"; else $query_vals .= $db->quote($value); if($function!="") $query_vals .= ")"; $query_vals .= ","; } $query = "INSERT INTO ".$db->quote_id($target_table); if(!$all_default) { $query_cols = substr($query_cols, 0, strlen($query_cols)-1); $query_vals = substr($query_vals, 0, strlen($query_vals)-1); $query.=" (". $query_cols . ") VALUES (". $query_vals. ")"; } else { $query .= " DEFAULT VALUES"; } if(isset($blobFiles)) { // blob files need to be done using a prepared statement because the query size would be too large $handle = $db->prepareQuery($query); foreach($blobFiles as $j=>$blobval) $db->bindValue($handle, ':blobval'.$j, $blobval, 'blob'); $result1 = $db->executePrepared($handle, false); } else $result1 = $db->query($query); if($result1===false) $error = true; $z++; } else { $query = "UPDATE ".$db->quote_id($target_table)." SET "; for($j=0; $jquote_id($tableInfo[$j]['name'])."="; if($function!="") $query .= $function."("; if($null) $query .= "NULL"; else { if(preg_match('/^BLOB/', $type)) $query .= ':blobval'.$j; else $query .= $db->quote($_POST[$j][$i]); } if($function!="") $query .= ")"; $query .= ", "; } $query = substr($query, 0, -2); $query .= " WHERE ".$db->wherePK($target_table, json_decode($pks[$i])); if(isset($blobFiles)) { // blob files need to be done using a prepared statement because the query size would be too large $handle = $db->prepareQuery($query); foreach($blobFiles as $j=>$filename) $db->bindValue($handle, ':blobval'.$j, file_get_contents($filename), 'blob'); $result1 = $db->executePrepared($handle, false); } else $result1 = $db->query($query); if($result1===false) { $error = true; } } $completed .= "".htmlencode($query)."
"; } if($error) $completed = $db->getError(true); elseif(isset($_POST['new_row'])) $completed = $z." ".$lang['rows']." ".$lang['inserted'].".

".$completed; $params->redirect(array('action'=>'row_view'), $completed); break; case "row_get_blob": $blobVal = $db->select("SELECT ".$db->quote_id($_GET['column'])." AS 'blob' FROM ".$db->quote_id($target_table)." WHERE ".$db->wherePK($target_table, json_decode($_GET['pk']))); $filename = 'download'; if(function_exists('getimagesizefromstring')) // introduced in PHP 5.4.0 $imagesize = getimagesizefromstring($blobVal['blob']); if(isset($imagesize) && $imagesize!==false && isset($imagesize['mime'])) $mimetype = $imagesize['mime']; elseif(class_exists('finfo')) // included since php 5.3.0, but might be disabled on Windows { $finfo = new finfo(FILEINFO_MIME); $mimetype = $finfo->buffer($blobVal['blob']); } else $mimetype = "application/octet-stream"; if(isset($imagesize) && $imagesize!==false && isset($imagesize[2])) $extension = image_type_to_extension($imagesize[2]); else $extension = '.blob'; ob_end_clean(); header('Content-Length: '.strlen($blobVal['blob'])); header("Content-type: ".$mimetype); if(isset($_GET['download_blob']) && $_GET['download_blob']) header('Content-Disposition: attachment; filename="'.$filename.$extension.'";'); header("Pragma: no-cache"); header("Expires: 0"); echo $blobVal['blob']; exit; break; //- Column actions //- Create column (=column_create) case "column_create": $num = intval($_POST['rows']); for($i=0; $i<$num; $i++) { if($_POST[$i.'_field']!="") { $query = "ALTER TABLE ".$db->quote_id($target_table)." ADD ".$db->quote($_POST[$i.'_field'])." "; $query .= $_POST[$i.'_type']." "; if(isset($_POST[$i.'_primarykey'])) $query .= "PRIMARY KEY "; if(isset($_POST[$i.'_notnull'])) $query .= "NOT NULL "; if($_POST[$i.'_defaultoption']!='defined' && $_POST[$i.'_defaultoption']!='none' && $_POST[$i.'_defaultoption']!='expr') $query .= "DEFAULT ".$_POST[$i.'_defaultoption']." "; elseif($_POST[$i.'_defaultoption']=='expr') $query .= "DEFAULT (".$_POST[$i.'_defaultvalue'].") "; elseif(isset($_POST[$i.'_defaultvalue']) && $_POST[$i.'_defaultoption']=='defined') { $typeAffinity = get_type_affinity($_POST[$i.'_type']); if(($typeAffinity=="INTEGER" || $typeAffinity=="REAL" || $typeAffinity=="NUMERIC") && is_numeric($_POST[$i.'_defaultvalue'])) $query .= "DEFAULT ".$_POST[$i.'_defaultvalue']." "; else $query .= "DEFAULT ".$db->quote($_POST[$i.'_defaultvalue'])." "; } if($db->getVersion()==3 && ($_POST[$i.'_defaultoption']=='defined' || $_POST[$i.'_defaultoption']=='none' || $_POST[$i.'_defaultoption']=='NULL') // Sqlite3 cannot add columns with default values that are not constant && !isset($_POST[$i.'_primarykey']) // sqlite3 cannot add primary key columns && (!isset($_POST[$i.'_notnull']) || $_POST[$i.'_defaultoption']!='none') // SQLite3 cannot add NOT NULL columns without DEFAULT even if the table is empty ) // use SQLITE3 ALTER TABLE ADD COLUMN $result = $db->query($query, true); else // use ALTER TABLE workaround $result = $db->query($query, false); if($result===false) $error = true; } } if($error) $completed = $db->getError(true); else $completed = $lang['tbl']." '".htmlencode($target_table)."' ".$lang['altered']."."; $params->redirect(array('action'=>'column_view'), $completed); break; //- Delete column (=column_delete) case "column_delete": $pks = explode(":", $_GET['pk']); $query = "ALTER TABLE ".$db->quote_id($target_table).' DROP '.$db->quote_id($pks[0]); for($i=1; $iquote_id($pks[$i]); } $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['tbl']." '".htmlencode($target_table)."' ".$lang['altered']."."; $params->redirect(array('action'=>'column_view'), $completed); break; //- Add a primary key (=primarykey_add) case "primarykey_add": $pks = explode(":", $_GET['pk']); $query = "ALTER TABLE ".$db->quote_id($target_table).' ADD PRIMARY KEY ('.$db->quote_id($pks[0]); for($i=1; $iquote_id($pks[$i]); } $query .= ")"; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['tbl']." '".htmlencode($target_table)."' ".$lang['altered']."."; $params->redirect(array('action'=>'column_view'), $completed); break; //- Edit column (=column_edit) case "column_edit": $query = "ALTER TABLE ".$db->quote_id($target_table).' CHANGE '.$db->quote_id($_POST['oldvalue'])." ".$db->quote($_POST['0_field'])." ".$_POST['0_type']; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['tbl']." '".htmlencode($target_table)."' ".$lang['altered']."."; $params->redirect(array('action'=>'column_view'), $completed); break; //- Delete trigger (=trigger_delete) case "trigger_delete": $query = "DROP TRIGGER ".$db->quote_id($_GET['pk']); $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['trigger']." '".htmlencode($_GET['pk'])."' ".$lang['deleted'].".
".htmlencode($query).""; $params->redirect(array('action'=>'column_view'), $completed); break; //- Delete index (=index_delete) case "index_delete": $query = "DROP INDEX ".$db->quote_id($_GET['pk']); $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['index']." '".htmlencode($_GET['pk'])."' ".$lang['deleted'].".
".htmlencode($query).""; $params->redirect(array('action'=>'column_view'), $completed); break; //- Create trigger (=trigger_create) case "trigger_create": $str = "CREATE TRIGGER ".$db->quote($_POST['trigger_name']); if($_POST['beforeafter']!="") $str .= " ".$_POST['beforeafter']; $str .= " ".$_POST['event']." ON ".$db->quote_id($target_table); if(isset($_POST['foreachrow'])) $str .= " FOR EACH ROW"; if($_POST['whenexpression']!="") $str .= " WHEN ".$_POST['whenexpression']; $str .= " BEGIN"; $str .= " ".$_POST['triggersteps']; $str .= " END"; $query = $str; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['trigger']." ".$lang['created'].".
".htmlencode($query).""; $params->redirect(array('action'=>'column_view'), $completed); break; //- Create index (=index_create) case "index_create": $num = $_POST['num']; if($_POST['name']=="") { $completed = $lang['blank_index']; } else if($_POST['0_field']=="") { $completed = $lang['one_index']; } else { $str = "CREATE "; if($_POST['duplicate']=="no") $str .= "UNIQUE "; $str .= "INDEX ".$db->quote($_POST['name'])." ON ".$db->quote_id($target_table)." ("; $str .= $db->quote_id($_POST['0_field']).$_POST['0_order']; for($i=1; $i<$num; $i++) { if($_POST[$i.'_field']!="") $str .= ", ".$db->quote_id($_POST[$i.'_field']).$_POST[$i.'_order']; } $str .= ")"; if(isset($_POST['where']) && $_POST['where']!='') $str.=" WHERE ".$_POST['where']; $query = $str; $result = $db->query($query); if($result === false) $completed = $db->getError(true); else $completed = $lang['index']." ".$lang['created'].".
".htmlencode($query).""; } $params->redirect(array('action'=>'column_view'), $completed); break; } } } // if not in debug mode, destroy all output until here if($debug) $bufferedOutput = ob_get_contents(); ob_end_clean(); //- HTML: output starts here header('Content-Type: text/html; charset=utf-8'); ?> <?php echo PROJECT ?> ", PHP_EOL; else // only use the default stylesheet if an external one does not exist echo "", PHP_EOL; // HTML: output help text, then exit if(isset($_GET['help'])) { //help section array $help = array($lang['help1'] => sprintf($lang['help1_x'], PROJECT, PROJECT, PROJECT)); for($i=2; isset($lang['help'.$i]); $i++) $help[$lang['help'.$i]]=$lang['help'.$i.'_x']; ?>
"; echo "".PROJECT." v".VERSION." ".$lang['help_doc']."

"; foreach((array)$help as $key => $val) { echo "".$key."
"; } echo "
"; echo "

"; foreach((array)$help as $key => $val) { echo "
"; echo "".$key.""; echo "
"; echo $val; echo "
"; echo "".$lang['back_top'].""; echo "
"; } ?> isAuthorized()) { //- Javascript include ?> ".$lang['bad_php_directive'].""; echo ""; exit(); } //- HTML: login screen if not authorized, exit if(!$auth->isAuthorized()) { echo "
"; echo "

v".VERSION."

"; echo "
"; if (isset($_GET['failed'])) echo "".$lang['passwd_incorrect']."

"; echo $params->getForm(); echo $lang['passwd'].":
"; echo "

"; echo ""; echo ""; echo ""; echo "
"; echo "
"; echo "
"; echo "
"; echo "".$lang['powered']." ".PROJECT." | "; printf($lang['page_gen'], $pageTimer); echo "
"; echo ""; exit(); } //- User is authorized, display the main application if(count($databases)==0) // the database array is empty, offer to create a new database { //- HTML: form to create a new database, exit if($directory!==false && is_writable($directory)) { echo "
"; printf($lang['no_db'], PROJECT, PROJECT); echo "
"; //if the user has performed some action, show the resulting message if(isset($_GET['message']) && isset($_SESSION[COOKIENAME.'messages'][$_GET['message']])) { echo "
"; echo $_SESSION[COOKIENAME.'messages'][$_GET['message']]; echo "

"; unset($_SESSION[COOKIENAME.'messages'][$_GET['message']]); } echo "
".$lang['db_create'].""; echo $params->getForm(array('table'=>null), 'post', false, 'create_database'); echo " "; if(class_exists('SQLiteDatabase') && (class_exists('SQLite3') || class_exists('PDO'))) { echo ""; } echo ""; echo ""; echo "
"; } elseif(($directory!==false && !is_executable($directory))) { echo "
"; echo $lang['err'].": ".sprintf($lang['dir_not_executable'], PROJECT, $directory); echo "

"; } else { echo "
"; echo $lang['err'].": ".sprintf($lang['no_db2'], PROJECT); echo "

"; } exit(); } //- HTML: sidebar echo '
'; echo "
"; echo "

"; echo " v".VERSION.""; echo "

"; echo ""; //- HTML: database list $db->print_db_list(); echo "
"; echo "null))."'"; if (!$target_table) echo " class='active_table'"; $name = $currentDB['name']; if(strlen($name)>25) $name = "...".substr($name, strlen($name)-22, 22); echo ">".htmlencode($name).""; echo ""; //- HTML: table list $tables = $db->getTables(true, false); foreach($tables as $tableName => $tableType) { echo ""; echo $params->getLink(array('action'=>'column_view', 'table'=>$tableName), "[".$lang[$tableType=='table'?'tbl':'view']."]"); echo " "; echo $params->getLink(array('action'=>'row_view', 'table'=>$tableName), htmlencode($tableName), ($target_table == $tableName ? 'active_table' : '') ); echo "
"; } if(count($tables)==0) echo $lang['no_tbl']; echo "
"; //- HTML: form to create a new database if($directory!==false && is_writable($directory)) { echo "
".$lang['db_create']." ".helpLink($lang['help2']).""; echo $params->getForm(array('table'=>null), 'post', false, 'create_database'); echo ""; if(class_exists('SQLiteDatabase') && (class_exists('SQLite3') || class_exists('PDO'))) { echo ""; } echo ""; echo ""; echo "
"; } echo "
"; echo $params->getForm(array(),'get'); echo ""; echo ""; echo "
"; echo "
"; echo '
'; //- HTML: breadcrumb navigation echo $params->getLink(array('table'=>null), htmlencode($currentDB['name'])); if ($target_table) echo " → ".$params->getLink(array('action'=>'row_view'), htmlencode($target_table)); echo "

"; //- Show the various tab views for a table if($target_table) { //- HTML: tabs echo $params->getLink(array('action'=>'row_view'), $lang['browse'], (in_array($_GET['action'], array('row_view', 'row_editordelete') ) ? 'tab_pressed' : 'tab')); echo $params->getLink(array('action'=>'column_view'), $lang['struct'], (in_array($_GET['action'], array('column_view', 'column_edit', 'column_confirm', 'primarykey_add', 'column_create', 'index_create', 'index_delete', 'trigger_create', 'trigger_delete') ) ? 'tab_pressed' : 'tab')); echo $params->getLink(array('action'=>'table_sql'), $lang['sql'], ($_GET['action']=="table_sql" ? 'tab_pressed' : 'tab')); echo $params->getLink(array( 'action' => 'table_search', 'oldSearch' => (isset($_GET['search'])?$_GET['search']:null) ), $lang['srch'], ($_GET['action']=="table_search" ? 'tab_pressed' : 'tab')); if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('action'=>'row_create'), $lang['insert'], ($_GET['action']=="row_create" ? 'tab_pressed' : 'tab')); echo $params->getLink(array('action'=>'table_export'), $lang['export'], ($_GET['action']=="table_export" ? 'tab_pressed' : 'tab')); if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('action'=>'table_import'), $lang['import'], ($_GET['action']=="table_import" ? 'tab_pressed' : 'tab')); if($db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('action'=>'table_rename'), $lang['rename'], ($_GET['action']=="table_rename" ? 'tab_pressed' : 'tab')); if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo $params->getLink(array('action'=>'table_empty'), $lang['empty'], ($_GET['action']=="table_empty" ? 'tab_pressed empty' : 'tab empty')); echo $params->getLink(array('action'=>'table_drop'), $lang['drop'], ($_GET['action']=="table_drop" ? 'tab_pressed drop' : 'tab drop')); } elseif($db->isWritable() && $db->isDirWritable()) { echo $params->getLink(array('action'=>'view_drop'), $lang['drop'], ($_GET['action']=="view_drop" ? 'tab_pressed drop' : 'tab drop')); } } else //- Show the various tab views for a database { $view = isset($_GET['view']) ? $_GET['view'] : 'structure'; echo $params->getLink(array('view'=>'structure'), $lang['struct'], ($view=="structure" ? 'tab_pressed': 'tab') ); echo $params->getLink(array('view'=>'sql'), $lang['sql'], ($view=="sql" ? 'tab_pressed': 'tab') ); echo $params->getLink(array('view'=>'export'), $lang['export'], ($view=="export" ? 'tab_pressed': 'tab') ); if($db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('view'=>'import'), $lang['import'], ($view=="import" ? 'tab_pressed': 'tab') ); if($db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('view'=>'vacuum'), $lang['vac'], ($view=="vacuum" ? 'tab_pressed': 'tab') ); if($directory!==false && is_writable($directory)) { echo $params->getLink(array('view'=>'rename'), $lang['db_rename'], ($view=="rename" ? 'tab_pressed': 'tab') ); echo $params->getLink(array('view'=>'delete'), "".$lang['db_del']."", ($view=="delete" ? 'tab_pressed delete_db': 'tab delete_db') ); } } echo "
"; echo "
"; //- HTML: confirmation panel //if the user has performed some action, show the resulting message if(isset($_GET['message']) && isset($_SESSION[COOKIENAME.'messages'][$_GET['message']])) { echo "
"; echo $_SESSION[COOKIENAME.'messages'][$_GET['message']]; echo "

"; unset($_SESSION[COOKIENAME.'messages'][$_GET['message']]); } //- Switch on $_GET['action'] for operations with output if(isset($_GET['action']) && !isset($_GET['confirm'])) { switch($_GET['action']) { //- Table actions //- Create table (=table_create) case "table_create": $query = "SELECT name FROM sqlite_master WHERE type='table' AND name=".$db->quote($_GET['tablename']); $results = $db->selectArray($query); if(sizeof($results)>0) $exists = true; else $exists = false; echo "

".$lang['create_tbl'].": '".htmlencode($_GET['tablename'])."'

"; if($_GET['tablefields']=="" || intval($_GET['tablefields'])<=0) echo $lang['specify_fields']; else if($_GET['tablename']=="") echo $lang['specify_tbl']; else if($exists) echo $lang['tbl_exists']; else { $num = intval($_GET['tablefields']); $name = $_GET['tablename']; echo $params->getForm(array('action'=>'table_create', 'confirm'=>'1')); echo ""; echo ""; echo ""; echo ""; $headings = array($lang['fld'], $lang['type'], $lang['prim_key']); if($db->getType() != "SQLiteDatabase") $headings[] = $lang['autoincrement']; $headings[] = $lang['not_null']; $headings[] = $lang['def_val']; for($k=0; $k" . $headings[$k] . ""; echo ""; for($i=0; $i<$num; $i++) { $tdWithClass = ""; echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; if($db->getType() != "SQLiteDatabase") { echo $tdWithClass; echo ""; echo ""; } echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; echo ""; echo ""; } echo ""; echo ""; echo ""; echo "
"; echo "
"; echo " "; echo $params->getLink(array(), $lang['cancel']); echo "
"; echo ""; if($db->getType() != "SQLiteDatabase") echo ""; } break; //- Perform SQL query on table (=table_sql) case "table_sql": if(isset($_POST['query']) && $_POST['query']!="") { $delimiter = $_POST['delimiter']; $queryStr = $_POST['queryval']; //save the queries in history if necessary if($maxSavedQueries!=0 && $maxSavedQueries!=false) { if(!isset($_SESSION[COOKIENAME.'query_history'])) $_SESSION[COOKIENAME.'query_history'] = array(); $_SESSION[COOKIENAME.'query_history'][md5(strtolower($queryStr))] = $queryStr; if(sizeof($_SESSION[COOKIENAME.'query_history']) > $maxSavedQueries) array_shift($_SESSION[COOKIENAME.'query_history']); } $query = explode_sql($delimiter, $queryStr); //explode the query string into individual queries based on the delimiter for($i=0; $iquery($query[$i]); echo "
"; echo "".htmlencode($query[$i]).""; if($table_result === NULL || $table_result === false) { echo "
".$lang['err'].": ".htmlencode($db->getError())."
"; } echo "

"; if($row = $db->fetch($table_result, 'num')) { for($j=0; $jgetColumnName($table_result,$j); echo ""; echo ""; for($j=0; $j"; echo htmlencode($headers[$j]); echo ""; } echo ""; $rowCount = 0; for(; $rowCount==0 || $row = $db->fetch($table_result, 'num'); $rowCount++) { $tdWithClass = ""; for($z=0; $zNULL"; else echo htmlencode(subString($row[$z])); echo ""; } echo ""; } $queryTimer->stop(); echo "
"; echo "


"; if($table_result !== NULL && $table_result !== false) { echo "
"; if($rowCount>0 || $db->getAffectedRows()==0) { printf($lang['show_rows'], $rowCount); } if($db->getAffectedRows()>0 || $rowCount==0) { echo $db->getAffectedRows()." ".$lang['rows_aff']." "; } printf($lang['query_time'], $queryTimer); echo "
"; } } } } } else { $delimiter = ";"; $queryStr = "SELECT * FROM ".$db->quote_id($target_table)." WHERE 1"; } echo "
"; echo "".sprintf($lang['run_sql'],htmlencode($db->getName())).""; echo $params->getForm(array('action'=>'table_sql')); if(isset($_SESSION[COOKIENAME.'query_history']) && sizeof($_SESSION[COOKIENAME.'query_history'])>0) { echo "".$lang['recent_queries']."

"; } echo "
"; echo ""; echo ""; echo "
"; echo "
"; echo $lang['fields']."
"; echo ""; echo ""; echo "
"; echo "
"; echo $lang['delimit']." "; echo ""; echo ""; echo "
"; break; //- Empty table (=table_empty) case "table_empty": echo $params->getForm(array('action'=>'table_empty','confirm'=>'1')); echo "
"; echo sprintf($lang['ques_empty'], htmlencode($target_table))."

"; echo " ".$lang['vac_on_empty']."

"; echo " "; echo $params->getLink(array('table'=>null), $lang['cancel']); echo "
"; break; //- Drop table (=table_drop) case "table_drop": echo $params->getForm(array('action'=>'table_drop','confirm'=>'1')); echo "
"; echo sprintf($lang['ques_drop'], htmlencode($target_table))."

"; echo " ".$lang['vac_on_empty']."

"; echo " "; echo $params->getLink(array('table'=>null), $lang['cancel']); echo "
"; break; //- Drop view (=view_drop) case "view_drop": echo $params->getForm(array('action'=>'view_drop','confirm'=>'1')); echo ""; echo "
"; echo sprintf($lang['ques_drop_view'], htmlencode($target_table))."

"; echo " "; echo $params->getLink(array('table'=>null), $lang['cancel']); echo "
"; break; //- Export table (=table_export) case "table_export": echo $params->getForm(); echo "
".$lang['export'].""; echo ""; echo ""; echo "
"; echo "
"; echo "
".$lang['options'].""; echo " ".helpLink($lang['help5'])."
"; echo " ".helpLink($lang['help6'])."
"; echo " ".helpLink($lang['help7'])."
"; echo " ".helpLink($lang['help8'])."
"; echo " ".helpLink($lang['help9'])."
"; echo "
"; echo ""; echo "
"; echo "

"; echo "
".$lang['save_as'].""; $file = pathinfo($db->getPath()); $name = $file['filename']; echo " "; echo "
"; echo ""; echo "
".sprintf($lang['backup_hint'], $params->getLink(array('download' => $currentDB['path'], 'token' => $_SESSION[COOKIENAME.'token']), $lang["backup_hint_linktext"], '', $lang['backup']))."
"; break; //- Import table (=table_import) case "table_import": if(isset($_POST['import'])) { echo "
"; if($importSuccess===true) echo $lang['import_suc']; else echo $lang['err'].': '.htmlencode($importSuccess); echo "

"; } echo $params->getForm(array('action' => 'table_import'), 'post', true); echo "
".$lang['import_into']." ".htmlencode($target_table).""; echo ""; echo "
"; echo "
"; echo "
".$lang['options'].""; echo $lang['no_opt']; echo "
"; echo ""; echo "
"; echo "

"; echo "
".$lang['import_f'].""; echo "".$lang['max_file_size'].": ".number_format(fileUploadMaxSize()/1024/1024)." MiB ".helpLink($lang['help11'])."
"; echo ""; echo ""; echo "
"; break; //- Rename table (=table_rename) case "table_rename": echo $params->getForm(array('action'=>'table_rename', 'confirm'=>'1')); printf($lang['rename_tbl'], htmlencode($target_table)); echo " "; echo ""; break; //- Search table (=table_search) case "table_search": if(!isset($_GET['search'])) { $tableInfo = $db->getTableInfo($target_table); echo $params->getForm(array('action'=>'table_search', 'confirm'=>'1')); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; for($i=0; $i"; $tdWithClassLeft = ""; echo $tdWithClassLeft; echo htmlencode($field); echo ""; echo $tdWithClassLeft; echo htmlencode($type); echo ""; echo $tdWithClassLeft; echo ""; echo ""; echo $tdWithClassLeft; if($typeAffinity=="INTEGER" || $typeAffinity=="REAL" || $typeAffinity=="NUMERIC") echo ""; else echo ""; echo ""; echo ""; } echo ""; echo ""; echo ""; echo "
".$lang['fld']."".$lang['type']."".$lang['operator']."".$lang['val']."
"; if(isset($_GET['oldSearch']) && isset($_SESSION[COOKIENAME.'search'][$_GET['oldSearch']]['values'][$field])) $value = implode($_SESSION[COOKIENAME.'search'][$_GET['oldSearch']]['values'][$field], ","); else $value = ''; if(isset($_GET['oldSearch']) && isset($_SESSION[COOKIENAME.'search'][$_GET['oldSearch']]['operators'][$field])) $operator = $_SESSION[COOKIENAME.'search'][$_GET['oldSearch']]['operators'][$field]; elseif($typeAffinity=="TEXT" || $typeAffinity=="NONE") $operator = 'LIKE'; else $operator = '='; echo "
"; echo ""; echo "
"; echo ""; break; } elseif(isset($_SESSION[COOKIENAME.'search'][$_GET['search']])) { $params->search = $_GET['search']; $search = $_SESSION[COOKIENAME.'search'][$_GET['search']]; // NOTICE: we do not break here!! we just do the same now like row_view-action does } //- Row actions //- View row (=row_view) case "row_view": if(!isset($_GET['startRow'])) $_GET['startRow'] = 0; if(isset($_SESSION[COOKIENAME.'currentTable']) && $_SESSION[COOKIENAME.'currentTable']!=$target_table) { unset($_SESSION[COOKIENAME.'sortRows']); unset($_SESSION[COOKIENAME.'orderRows']); } if(isset($_GET['viewtype'])) { $_SESSION[COOKIENAME.'viewtype'] = $_GET['viewtype']; } //- Query execution if(!isset($_GET['sort'])) $_GET['sort'] = NULL; if(!isset($_GET['order'])) $_GET['order'] = NULL; $numRows = $params->numRows; $startRow = $_GET['startRow']; if(isset($_GET['sort'])) { $_SESSION[COOKIENAME.'sortRows'] = $_GET['sort']; $_SESSION[COOKIENAME.'currentTable'] = $target_table; } if(isset($_GET['order'])) { $_SESSION[COOKIENAME.'orderRows'] = $_GET['order']; $_SESSION[COOKIENAME.'currentTable'] = $target_table; } $query = "SELECT * "; // select the primary key column(s) last (ROWID if there is no PK). // this will be used to identify rows, e.g. when editing/deleting rows $primary_key = $db->getPrimaryKey($target_table); foreach($primary_key as $pk) { $query.= ', '.$db->quote_id($pk); $query.= ', typeof('.$db->quote_id($pk).')'; } $query .= " FROM ".$db->quote_id($target_table); $queryDisp = "SELECT * FROM ".$db->quote_id($target_table); $queryCount = "SELECT COUNT(*) AS count FROM ".$db->quote_id($target_table); $queryAdd = ""; if(isset($search) && isset($search['where'])) { $queryAdd = $search['where']; $queryCount .= $search['where']; } if(isset($_SESSION[COOKIENAME.'sortRows'])) $queryAdd .= " ORDER BY ".$db->quote_id($_SESSION[COOKIENAME.'sortRows']); if(isset($_SESSION[COOKIENAME.'orderRows'])) $queryAdd .= " ".$_SESSION[COOKIENAME.'orderRows']; $queryAdd .= " LIMIT ".$startRow.", ".$numRows; $query .= $queryAdd; $queryDisp .= $queryAdd; $resultRows = $db->select($queryCount); $totalRows = $resultRows['count']; $shownRows = min($resultRows['count']-$startRow, $numRows); //- HTML: pagination buttons $lastPage = intval($totalRows / $params->numRows); $remainder = intval($totalRows % $params->numRows); if($remainder==0) $remainder = $params->numRows; echo "
"; //previous button if($_GET['startRow']>0) { echo "
"; echo $params->getForm(array('action'=>$_GET['action']),'get'); echo ""; echo " "; echo ""; echo "
"; echo "
"; echo $params->getForm(array('action'=>$_GET['action']),'get'); echo "numRows))."'/>"; echo " "; echo ""; echo "
"; } //show certain number buttons echo "
"; echo $params->getForm(array('action'=>$_GET['action'], 'numRows'=>null),'get'); echo " "; echo " "; echo $lang['rows_records']; if(intval($_GET['startRow']+$params->numRows) < $totalRows) echo "numRows)."'/>"; else echo " "; echo $lang['as_a']; echo " "; echo ""; echo "
"; //next button if(intval($_GET['startRow']+$params->numRows)<$totalRows) { echo "
"; echo $params->getForm(array('action'=>$_GET['action']),'get'); echo "numRows)."'/>"; echo " "; echo ""; echo "
"; echo "
"; echo $params->getForm(array('action'=>$_GET['action']),'get'); echo ""; echo " "; echo ""; echo "
"; } echo "
"; echo "
"; //- Show results if($shownRows>0) { $queryTimer = new MicroTimer(); $table_result = $db->query($query); $queryTimer->stop(); echo "
"; echo "".$lang['showing_rows']." ".$startRow." - ".($startRow + $shownRows-1).", ".$lang['total'].": ".$totalRows." "; printf($lang['query_time'], $queryTimer); echo "
"; echo "".htmlencode($queryDisp).""; echo "

"; if($target_table_type == 'view') { echo sprintf($lang['readonly_tbl'], htmlencode($target_table))." https://en.wikipedia.org/wiki/View_(SQL)"; echo "

"; } $tableInfo = $db->getTableInfo($target_table); $pkFirstCol = sizeof($tableInfo)+1; //- Table view if(!isset($_SESSION[COOKIENAME.'viewtype']) || $_SESSION[COOKIENAME.'viewtype']=="table") { echo $params->getForm(array('action'=>'row_editordelete'), 'post', false, 'checkForm'); echo ""; echo ""; echo ""; for($i=0; $i"; if(isset($_SESSION[COOKIENAME.'sortRows'])) $orderTag = ($_SESSION[COOKIENAME.'sortRows']==$tableInfo[$i]['name'] && $_SESSION[COOKIENAME.'orderRows']=="ASC") ? "DESC" : "ASC"; else $orderTag = "ASC"; echo $params->getLink(array('action'=>$_GET['action'], 'sort'=>$tableInfo[$i]['name'], 'order'=>$orderTag ), htmlencode($tableInfo[$i]['name'])); if(isset($_SESSION[COOKIENAME.'sortRows']) && $_SESSION[COOKIENAME.'sortRows']==$tableInfo[$i]['name']) echo (($_SESSION[COOKIENAME.'orderRows']=="ASC") ? " " : " "); echo ""; } echo ""; for($i=0; $row = $db->fetch($table_result, 'num'); $i++) { // -g-> $pk will always be the last columns in each row of the array because we are doing "SELECT *, PK_1, typeof(PK_1), PK2, typeof(PK_2), ... FROM ..." $pk_arr = array(); for($col = $pkFirstCol; array_key_exists($col, $row); $col=$col+2) { // in $col we have the type and in $col-1 the value if($row[$col]=='integer' || $row[$col]=='real') // json encode as int or float, not string $pk_arr[] = $row[$col-1]+0; else // encode as json string $pk_arr[] = $row[$col-1]; } $pk = json_encode($pk_arr); $tdWithClass = ""; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; // -g-> Here, we need to put the PK in as the link for both the edit and delete. echo $params->getLink(array('action'=>'row_editordelete', 'pk'=>$pk, 'type'=>'edit'),"".$lang['edit']."",'edit', $lang['edit']); echo ""; echo $tdWithClass; echo $params->getLink(array('action'=>'row_editordelete', 'pk'=>$pk, 'type'=>'delete'),"".$lang['del']."",'delete', $lang['del']); echo ""; } else { echo ""; } for($j=0; $jNULL"; elseif(preg_match('/^BLOB/i', $tableInfo[$j]['type'])) { echo "
"; echo $params->getLink(array('action'=>'row_get_blob', 'confirm'=>1, 'pk'=>$pk, 'column'=>$tableInfo[$j]['name'], 'download_blob'=>1),$lang["download"]).' | '; echo $params->getLink(array('action'=>'row_get_blob', 'confirm'=>1, 'pk'=>$pk, 'column'=>$tableInfo[$j]['name'], 'download_blob'=>0),$lang["open_in_browser"],'','','_blank'); echo "
"; echo 'Size: '.number_format(strlen($row[$j])).' Bytes'; echo "
"; } elseif(isset($search)) echo markSearchWords(subString($row[$j]),$tableInfo[$j]['name'], $search); else echo htmlencode(subString($row[$j])); echo ""; } echo "
"; } echo "
"; echo "$_GET['action'], 'fulltexts'=>($params->fulltexts?0:1) ))."' title='".$lang[($params->fulltexts?'no_full_texts':'full_texts')]."'>"; echo "&".($params->fulltexts?'r':'l')."arr; T &".($params->fulltexts?'l':'r')."arr;"; echo "
"; $tdWithClassLeft = ""; echo "
"; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo "".$lang['chk_all']." / ".$lang['unchk_all']." ".$lang['with_sel'].": "; echo " "; echo ""; } echo ""; } else //- Chart view { if(!isset($_SESSION[COOKIENAME.$target_table.'chartlabels'])) { // No label-column set. Try to pick a text-column as label-column. for($i=0; $i
Chart Settings"; echo $params->getForm(array('action'=>$_GET['action'])); echo $lang['chart_type'].": "; echo "

"; echo $lang['lbl'].": "; echo "

"; echo $lang['val'].": "; echo "

"; echo ""; echo ""; echo ""; echo "
"; //end chart view } } else //no rows - do nothing { echo "
"; if(isset($search) || $totalRows>0) echo $lang['no_rows']."

"; elseif($target_table_type == 'table') echo $lang['empty_tbl']." ".$params->getLink(array('action'=>'row_create'), $lang['click']) ." ".$lang['insert_rows'].'

'; echo "".htmlencode($queryDisp).""; echo "

"; } if(isset($search)) echo "

".$params->getLink(array('action'=>'table_search','search'=>null,'oldSearch' => (isset($_GET['search'])?$_GET['search']:null)), $lang['srch_again']); break; //- Create new row (=row_create) case "row_create": echo $params->getForm(array('action'=>'row_create'), 'get'); echo $lang['restart_insert']; echo " "; echo $lang['rows']; echo " "; echo ""; echo "
"; echo $params->getForm(array('action'=>'row_create','confirm'=>'1'), 'post', true); $tableInfo = $db->getTableInfo($target_table); if(isset($_GET['newRows'])) $num = $_GET['newRows']; else $num = 1; echo ""; for($j=0; $j<$num; $j++) { if($j>0) echo "
"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; for($i=0; $i"; echo ""; echo $tdWithClassLeft; echo htmlencode($field); echo ""; echo $tdWithClassLeft; echo htmlencode($type); echo ""; echo $tdWithClassLeft; echo ""; echo ""; echo $tdWithClassLeft; if($tableInfo[$i]['notnull']==0) { if($value===NULL) echo ""; else echo ""; } echo ""; echo $tdWithClassLeft; if($typeAffinity=="INTEGER" || $typeAffinity=="REAL" || $typeAffinity=="NUMERIC") echo ""; elseif(preg_match('/^BLOB/', $type)) echo ""; else echo ""; echo ""; echo ""; } echo ""; echo ""; echo ""; echo "
".$lang['fld']."".$lang['type']."".$lang['func']."Null".$lang['val']."
"; echo ""; echo "

"; } echo ""; break; //- Edit or delete row (=row_editordelete) case "row_editordelete": if(isset($_POST['check'])) $pks = $_POST['check']; else if(isset($_GET['pk'])) $pks = array($_GET['pk']); else $pks[0] = ""; $str = implode(', ', $pks); if($str=="") //nothing was selected so show an error { echo "
"; echo $lang['err'].": ".$lang['no_sel']; echo "
"; echo "

".$params->getLink(array('action'=>'row_view'),$lang['return']); } else { if((isset($_POST['type']) && $_POST['type']=="edit") || (isset($_GET['type']) && $_GET['type']=="edit")) //edit { echo $params->getForm(array('action'=>'row_edit', 'confirm'=>'1', 'pk'=>json_encode($pks)),'post',true); $tableInfo = $db->getTableInfo($target_table); $primary_key = $db->getPrimaryKey($target_table); for($j=0; $jquote_id($target_table)." WHERE " . $db->wherePK($target_table, json_decode($pks[$j])); $result1 = $db->select($query, 'num'); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; for($i=0; $i"; echo ""; echo $tdWithClassLeft; echo htmlencode($field); echo ""; echo $tdWithClassLeft; echo htmlencode($type); echo ""; echo $tdWithClassLeft; echo ""; echo ""; echo $tdWithClassLeft; if($tableInfo[$i]['notnull']==0) { if($value===NULL) echo ""; else echo ""; } echo ""; echo $tdWithClassLeft; if($typeAffinity=="INTEGER" || $typeAffinity=="REAL" || $typeAffinity=="NUMERIC") echo ""; elseif(preg_match('/^BLOB/', $type)) { if($value!==NULL) { echo ""; echo $params->getLink(array('action'=>'row_get_blob', 'confirm'=>1, 'pk'=>$pks[$j], 'column'=>$field, 'download_blob'=>1),$lang["download"]).' | '; echo $params->getLink(array('action'=>'row_get_blob', 'confirm'=>1, 'pk'=>$pks[$j], 'column'=>$field, 'download_blob'=>0),$lang["open_in_browser"],'','','_blank').'
'; echo ""; } echo ""; } else echo ""; echo ""; echo ""; } echo ""; echo ""; echo ""; echo "
".$lang['fld']."".$lang['type']."".$lang['func']."Null".$lang['val']."
"; // Note: the 'Save changes' button must be first in the code so it is the one used when submitting the form with the Enter key (issue #215) echo " "; echo " "; echo $params->getLink(array('action'=>'row_view'), $lang['cancel']); echo "
"; echo "
"; } echo ""; } else //delete { echo $params->getForm(array('action'=>'row_delete', 'confirm'=>'1', 'pk'=>json_encode($pks))); echo "
"; printf($lang['ques_del_rows'], htmlencode($str), htmlencode($target_table)); echo "

"; echo " "; echo $params->getLink(array('action'=>'row_view'), $lang['cancel']); echo "
"; } } break; //- Column actions //- View table structure (=column_view) case "column_view": $tableInfo = $db->getTableInfo($target_table); echo $params->getForm(array('action'=>'column_confirm'), 'get', false, 'checkForm'); echo ""; echo ""; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; $noPrimaryKey = true; for($i=0; $i"; $tdWithClassLeft = ""; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo $params->getLink(array('action'=>'column_edit', 'pk'=>$fieldVal),"".$lang['edit']."",'edit', $lang['edit']); echo ""; echo $tdWithClass; echo $params->getLink(array('action'=>'column_confirm', 'action2'=>'column_delete', 'pk'=>$fieldVal),"".$lang['del']."",'delete', $lang['del']); echo ""; } echo $tdWithClass; echo htmlencode($colVal); echo ""; echo $tdWithClassLeft; echo htmlencode($fieldVal); echo ""; echo $tdWithClassLeft; echo htmlencode($typeVal); echo ""; echo $tdWithClassLeft; echo htmlencode($notnullVal); echo ""; echo $tdWithClassLeft; if($defaultVal===NULL) echo "".$lang['none'].""; elseif($defaultVal==="NULL") echo "NULL"; else echo htmlencode($defaultVal); echo ""; echo $tdWithClassLeft; echo htmlencode($primarykeyVal); echo ""; echo ""; } echo "
".$lang['col']." #".$lang['fld']."".$lang['type']."".$lang['not_null']."".$lang['def_val']."".$lang['prim_key']."
"; echo "
"; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo "".$lang['chk_all']." / ".$lang['unchk_all']." ".$lang['with_sel'].": "; echo " "; echo ""; } echo ""; if($target_table_type == 'table' && $db->isWritable() && $db->isDirWritable()) { echo "
"; echo $params->getForm(array('action'=>'column_create'), 'get'); echo $lang['add']." ".$lang['tbl_end']." "; echo ""; } $query = "SELECT sql FROM sqlite_master WHERE name=".$db->quote($target_table); $master = $db->selectArray($query); echo "
"; echo "
"; echo "
"; echo "".$lang['query_used_'.$target_table_type]."
"; echo "".htmlencode($master[0]['sql']).""; echo "
"; echo "
"; if($target_table_type != 'view') { echo "


"; $query = "PRAGMA index_list(".$db->quote_id($target_table).")"; $result = $db->selectArray($query); if(sizeof($result)>0) { echo "

".$lang['indexes'].":

"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; for($i=0; $iquote_id($result[$i]['name']).")"; $info = $db->selectArray($query); $span = sizeof($info); $tdWithClass = ""; echo $tdWithClassSpan; echo $params->getLink(array('action'=>'index_delete', 'pk'=>$result[$i]['name']), "".$lang['del']."", 'delete', $lang['del']); echo ""; echo $tdWithClassLeftSpan; echo $result[$i]['name']; echo ""; echo $tdWithClassLeftSpan; echo $unique; echo ""; for($j=0; $j<$span; $j++) { if($j!=0) echo ""; echo $tdWithClassLeft; echo htmlencode($info[$j]['seqno']); echo ""; echo $tdWithClassLeft; echo htmlencode($info[$j]['cid']); echo ""; echo $tdWithClassLeft; echo htmlencode($info[$j]['name']); echo ""; echo ""; } } echo "
"; echo "".$lang['name']."".$lang['unique']."".$lang['seq_no']."".$lang['col']." #".$lang['fld']."
"; $tdWithClassLeft = ""; $tdWithClassSpan = ""; $tdWithClassLeftSpan = ""; echo "


"; } $query = "SELECT * FROM sqlite_master WHERE type='trigger' AND tbl_name=".$db->quote($target_table)." ORDER BY name"; $result = $db->selectArray($query); //print_r($result); if(sizeof($result)>0) { echo "

".$lang['triggers'].":

"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; for($i=0; $i"; echo ""; echo $tdWithClass; echo $params->getLink(array('action'=>'trigger_delete', 'pk'=>$result[$i]['name']), "".$lang['del']."", 'delete', $lang['del']); echo ""; echo $tdWithClass; echo htmlencode($result[$i]['name']); echo ""; echo $tdWithClass; echo htmlencode($result[$i]['sql']); echo ""; } echo "
"; echo "".$lang['name']."".$lang['sql']."


"; } if($db->isWritable() && $db->isDirWritable()) { echo $params->getForm(array('action'=>'index_create'),'get'); echo "
"; echo $lang['create_index2']." ".$lang['cols']." "; echo "
"; echo ""; echo $params->getForm(array('action'=>'trigger_create'),'get'); echo "
"; echo $lang['create_trigger2']." "; echo "
"; echo ""; } } break; //- Create column (=column_create) case "column_create": echo "

".sprintf($lang['new_fld'],htmlencode($_GET['table']))."

"; if($_GET['tablefields']=="" || intval($_GET['tablefields'])<=0) echo $lang['specify_fields']; else if($_GET['table']=="") echo $lang['specify_tbl']; else { $num = intval($_GET['tablefields']); $name = $_GET['table']; echo $params->getForm(array('action'=>'column_create', 'confirm'=>'1')); echo ""; echo ""; echo ""; $headings = array($lang["fld"], $lang["type"], $lang["prim_key"]); if($db->getType() != "SQLiteDatabase") $headings[] = $lang["autoincrement"]; $headings[] = $lang["not_null"]; $headings[] = $lang["def_val"]; for($k=0; $k" . $headings[$k] . ""; echo ""; for($i=0; $i<$num; $i++) { $tdWithClass = ""; echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; if($db->getType() != "SQLiteDatabase") { echo $tdWithClass; echo ""; echo ""; } echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; echo ""; echo ""; } echo ""; echo ""; echo ""; echo "
"; echo "
"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo "
"; echo ""; } break; //- Delete column (=column_confirm) case "column_confirm": if(isset($_GET['check'])) $pks = $_GET['check']; elseif(isset($_GET['pk'])) $pks = array($_GET['pk']); else $pks = array(); if(sizeof($pks)==0) //nothing was selected so show an error { echo "
"; echo $lang['err'].": ".$lang['no_sel']; echo "
"; echo "

"; echo $params->getLink(array('action'=>'column_view'), $lang['return']); } else { $str = $pks[0]; $pkVal = $pks[0]; for($i=1; $igetForm(array('action'=>$_GET['action2'], 'confirm'=>'1', 'pk'=>$pkVal)); echo "
"; printf($lang['ques_'.$_GET['action2']], htmlencode($str), htmlencode($target_table)); echo "

"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo "
"; } break; //- Edit column (=column_edit) case "column_edit": echo "

".sprintf($lang['edit_col'], htmlencode($_GET['pk']))." ".$lang['on_tbl']." '".htmlencode($target_table)."'

"; echo $lang['sqlite_limit']."

"; if(!isset($_GET['pk'])) echo $lang['specify_col']; else if (!$target_table) echo $lang['specify_tbl']; else { $tableInfo = $db->getTableInfo($target_table); for($i=0; $i".$lang['err'].": ".sprintf($lang['col_inexistent'], htmlencode($_GET['pk'])).""; } else { $name = $target_table; echo $params->getForm(array('action'=>'column_edit', 'confirm'=>'1')); echo ""; echo ""; echo ""; //$headings = array("Field", "Type", "Primary Key", "Autoincrement", "Not NULL", "Default Value"); $headings = array($lang["fld"], $lang["type"]); for($k=0; $k".$headings[$k].""; echo ""; $i = 0; $tdWithClass = ""; echo $tdWithClass; echo ""; echo ""; echo $tdWithClass; echo ""; echo ""; /* echo $tdWithClass; if($primarykeyVal) echo " Yes"; else echo " Yes"; echo ""; echo $tdWithClass; if(1==2) echo " Yes"; else echo " Yes"; echo ""; echo $tdWithClass; if($notnullVal) echo " Yes"; else echo " Yes"; echo ""; echo $tdWithClass; echo ""; echo ""; */ echo ""; echo ""; echo ""; echo ""; echo "
"; echo "
"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo "
"; echo ""; } } break; //- Delete index (=index_delete) case "index_delete": echo $params->getForm(array('action'=>'index_delete', 'pk'=>$_GET['pk'], 'confirm'=>'1')); echo "
"; echo sprintf($lang['ques_del_index'], htmlencode($_GET['pk']))."

"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo "
"; echo ""; break; //- Delete trigger (=trigger_delete) case "trigger_delete": echo $params->getForm(array('action'=>'trigger_delete', 'pk'=>$_GET['pk'], 'confirm'=>'1')); echo "
"; echo sprintf($lang['ques_del_trigger'], htmlencode($_GET['pk']))."

"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo "
"; echo ""; break; //- Create trigger (=trigger_create) case "trigger_create": echo "

".$lang['create_trigger']." '".htmlencode($_GET['table'])."'

"; if($_GET['table']=="") echo $lang['specify_tbl']; else { echo $params->getForm(array('action'=>'trigger_create', 'confirm'=>'1')); echo $lang['trigger_name'].":

"; echo "
".$lang['db_event'].""; echo $lang['before']."/".$lang['after'].": "; echo ""; echo "

"; echo $lang['event'].": "; echo ""; echo "


"; echo "
".$lang['trigger_act'].""; echo "

"; echo $lang['when_exp'].":
"; echo ""; echo "

"; echo $lang['trigger_step'].":
"; echo ""; echo "


"; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo ""; } break; //- Create index (=index_create) case "index_create": echo "

".$lang['create_index']." '".htmlencode($_GET['table'])."'

"; if($_GET['numcolumns']=="" || intval($_GET['numcolumns'])<=0) echo $lang['specify_fields']; else if($_GET['table']=="") echo $lang['specify_tbl']; else { echo $params->getForm(array('action'=>'index_create', 'confirm'=>'1')); $num = intval($_GET['numcolumns']); $tableInfo = $db->getTableInfo($_GET['table']); echo "
".$lang['define_index'].""; echo "
"; echo ""; echo "
"; if(version_compare($db->getSQLiteVersion(),'3.8.0')>=0) echo " ".helpLink($lang['help10']); echo "
"; echo "
"; echo "
".$lang['define_in_col'].""; for($i=0; $i<$num; $i++) { echo " "; echo "
"; } echo "
"; echo "

"; echo ""; echo " "; echo $params->getLink(array('action'=>'column_view'), $lang['cancel']); echo ""; } break; } echo ""; } //- HMTL: views for databases if(!$target_table && !isset($_GET['confirm']) && (!isset($_GET['action']) || (isset($_GET['action']) && $_GET['action']!="table_create"))) //the absence of these fields means we are viewing the database homepage { //- Switch on $view (actually a series of if-else) if($view=="structure") { //- Database structure, shows all the tables (=structure) if($db->isWritable() && !$db->isDirWritable()) { echo "
"; echo $lang['attention'].': '.$lang['directory_not_writable']; echo "

"; } elseif(!$db->isWritable()) { echo "
"; echo $lang['attention'].': '.$lang['database_not_writable']; echo "

"; } if ($auth->isPasswordDefault()) { echo "
"; echo sprintf($lang['warn_passwd'],(is_readable('phpliteadmin.config.php')?'phpliteadmin.config.php':basename(__FILE__)))."
".$lang['warn0']; echo "
"; } echo "".$lang['db_name'].": ".htmlencode($db->getName())."
"; echo "".$lang['db_path'].": ".htmlencode($db->getPath())."
"; echo "".$lang['db_size'].": ".number_format($db->getSize())." KiB
"; echo "".$lang['db_mod'].": ".$db->getDate()."
"; echo "".$lang['sqlite_v'].": ".$db->getSQLiteVersion()."
"; echo "".$lang['sqlite_ext']." ".helpLink($lang['help1']).": ".$db->getType()."
"; echo "".$lang['php_v'].": ".phpversion()."
"; echo "".PROJECT." ".$lang["ver"].": ".VERSION; echo "

"; echo ""; if(isset($_GET['sort']) && ($_GET['sort']=='type' || $_GET['sort']=='name')) $_SESSION[COOKIENAME.'sortTables'] = $_GET['sort']; if(isset($_GET['order']) && ($_GET['order']=='ASC' || $_GET['order']=='DESC')) $_SESSION[COOKIENAME.'orderTables'] = $_GET['order']; if(!isset($_SESSION[COOKIENAME.'sortTables'])) $_SESSION[COOKIENAME.'sortTables'] = 'name'; if(!isset($_SESSION[COOKIENAME.'orderTables'])) $_SESSION[COOKIENAME.'orderTables'] = 'ASC'; $tables = $db->getTables(true, false, $_SESSION[COOKIENAME.'sortTables'], $_SESSION[COOKIENAME.'orderTables']); if(sizeof($tables)==0) echo $lang['no_tbl']."

"; else { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; $totalRecords = 0; $skippedTables = false; foreach($tables as $tableName => $tableType) { $records = $db->numRows($tableName, (!isset($_GET['forceCount']))); if($records == '?') { $skippedTables = true; $records = $params->getLink(array('forceCount'=>'1'), '?'); } else $totalRecords += $records; $tdWithClass = ""; echo $tdWithClassLeft; echo ($tableType=="table"? $lang['tbl'] : $lang['view']); echo ""; echo $tdWithClassLeft; echo $params->getLink(array('table'=>$tableName, 'action'=>'row_view'), htmlencode($tableName)); echo ""; echo $tdWithClass; echo $params->getLink(array('table'=>$tableName, 'action'=>'row_view'), $lang['browse']); echo ""; echo $tdWithClass; echo $params->getLink(array('table'=>$tableName, 'action'=>'column_view'), $lang['struct']); echo ""; echo $tdWithClass; echo $params->getLink(array('table'=>$tableName, 'action'=>'table_sql'), $lang['sql']); echo ""; echo $tdWithClass; echo $params->getLink(array('table'=>$tableName, 'action'=>'table_search'), $lang['srch']); echo ""; echo $tdWithClass; if($tableType=="table" && $db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('table'=>$tableName, 'action'=>'row_create'), $lang['insert']); else echo $lang['insert']; echo ""; echo $tdWithClass; echo $params->getLink(array('table'=>$tableName, 'action'=>'table_export'), $lang['export']); echo ""; echo $tdWithClass; if($tableType=="table" && $db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('table'=>$tableName, 'action'=>'table_import'), $lang['import']); else echo $lang['import']; echo ""; echo $tdWithClass; if($db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('table'=>$tableName, 'action'=>'table_rename'), $lang['rename']); else echo $lang['rename']; echo ""; echo $tdWithClass; if($tableType=="table" && $db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('table'=>$tableName, 'action'=>'table_empty'), $lang['empty'], 'empty'); else echo $lang['empty']; echo ""; echo $tdWithClass; if($db->isWritable() && $db->isDirWritable()) echo $params->getLink(array('table'=>$tableName, 'action'=>'table_drop'), $lang['drop'], 'drop'); else echo $lang['drop']; echo ""; echo $tdWithClass; echo $records; echo ""; echo ""; } echo ""; echo ""; echo ""; echo ""; echo "
"; if(isset($_SESSION[COOKIENAME.'sortTables'])) $orderTag = ($_SESSION[COOKIENAME.'sortTables']=="type" && $_SESSION[COOKIENAME.'orderTables']=="ASC") ? "DESC" : "ASC"; else $orderTag = "ASC"; echo $params->getLink(array('sort'=>'type', 'order'=>$orderTag), $lang['type']); echo helpLink($lang['help3']); if(isset($_SESSION[COOKIENAME.'sortTables']) && $_SESSION[COOKIENAME.'sortTables']=="type") echo (($_SESSION[COOKIENAME.'orderTables']=="ASC") ? " " : " "); echo ""; if(isset($_SESSION[COOKIENAME.'sortTables'])) $orderTag = ($_SESSION[COOKIENAME.'sortTables']=="name" && $_SESSION[COOKIENAME.'orderTables']=="ASC") ? "DESC" : "ASC"; else $orderTag = "ASC"; echo $params->getLink(array('sort'=>'name', 'order'=>$orderTag), $lang['name']); if(isset($_SESSION[COOKIENAME.'sortTables']) && $_SESSION[COOKIENAME.'sortTables']=="name") echo (($_SESSION[COOKIENAME.'orderTables']=="ASC") ? " " : " "); echo "".$lang['act']."".$lang['rec']."
"; $tdWithClassLeft = ""; echo "
".sizeof($tables)." ".$lang['total']."".$totalRecords.($skippedTables?" ".$params->getLink(array('forceCount'=>'1'),'+ ?'):"")."
"; echo "
"; if($skippedTables) echo "
".sprintf($lang["counting_skipped"],"'1'))."'>","")."
"; } if($db->isWritable() && $db->isDirWritable()) { echo "
"; echo "".$lang['create_tbl_db']." '".htmlencode($db->getName())."'"; echo $params->getForm(array('action'=>'table_create'), 'get'); echo $lang['name'].": "; echo $lang['fld_num'].": "; echo ""; echo ""; echo "
"; echo "
"; echo "
"; echo "".$lang['create_view']." '".htmlencode($db->getName())."'"; echo $params->getForm(array('action'=>'view_create', 'confirm'=>'1')); echo $lang['name'].": "; echo $lang['sel_state']." ".helpLink($lang['help4']).": "; echo ""; echo ""; echo "
"; } } else if($view=="sql") { //- Database SQL editor (=sql) if(isset($_POST['query']) && $_POST['query']!="") { $delimiter = $_POST['delimiter']; $queryStr = $_POST['queryval']; //save the queries in history if necessary if($maxSavedQueries!=0 && $maxSavedQueries!=false) { if(!isset($_SESSION[COOKIENAME.'query_history'])) $_SESSION[COOKIENAME.'query_history'] = array(); $_SESSION[COOKIENAME.'query_history'][md5(strtolower($queryStr))] = $queryStr; if(sizeof($_SESSION[COOKIENAME.'query_history']) > $maxSavedQueries) array_shift($_SESSION[COOKIENAME.'query_history']); } $query = explode_sql($delimiter, $queryStr); //explode the query string into individual queries based on the delimiter for($i=0; $iquery($query[$i]); echo "
"; echo "".htmlencode($query[$i]).""; if($table_result === NULL || $table_result === false) { echo "
".$lang['err'].": ".htmlencode($db->getError())."
"; } echo "
"; if($row = $db->fetch($table_result, 'num')) { for($j=0; $jgetColumnName($table_result,$j); echo ""; echo ""; for($j=0; $j"; echo htmlencode($headers[$j]); echo ""; } echo ""; $rowCount = 0; for(; $rowCount==0 || $row = $db->fetch($table_result, 'num'); $rowCount++) { $tdWithClass = ""; for($z=0; $zNULL"; else echo htmlencode(subString($row[$z])); echo ""; } echo ""; } $queryTimer->stop(); echo "
"; echo "


"; if($table_result !== NULL && $table_result !== false) { echo "
"; if($rowCount>0 || $db->getAffectedRows()==0) { printf($lang['show_rows'], $rowCount); } if($db->getAffectedRows()>0 || $rowCount==0) { echo $db->getAffectedRows()." ".$lang['rows_aff']." "; } printf($lang['query_time'], $queryTimer); echo "
"; } } } } } else { $delimiter = ";"; $queryStr = ""; } echo "
"; echo "".sprintf($lang['run_sql'],htmlencode($db->getName())).""; echo $params->getForm(array('view'=>'sql')); if(isset($_SESSION[COOKIENAME.'query_history']) && sizeof($_SESSION[COOKIENAME.'query_history'])>0) { echo "".$lang['recent_queries']."

"; } echo ""; echo ""; echo $lang['delimit']." "; echo ""; echo ""; echo "
"; } else if($view=="vacuum") { //- Vacuum database confirmation (=vacuum) if(isset($_POST['vacuum'])) { $query = "VACUUM"; $db->query($query); echo "
"; printf($lang['db_vac'], htmlencode($db->getName())); echo "

"; } echo $params->getForm(array('view'=>'vacuum')); printf($lang['vac_desc'],htmlencode($db->getName())); echo "

"; echo ""; echo ""; } else if($view=="export") { //- Export view (=export) echo $params->getForm(array('view'=>'export')); echo "
".$lang['export'].""; echo ""; echo "

"; echo ""; echo "
"; echo "
"; echo "
".$lang['options'].""; echo " ".helpLink($lang['help5'])."
"; echo " ".helpLink($lang['help6'])."
"; echo " ".helpLink($lang['help7'])."
"; echo " ".helpLink($lang['help8'])."
"; echo " ".helpLink($lang['help9'])."
"; echo "
"; echo ""; echo "
"; echo "

"; echo "
".$lang['save_as'].""; $file = pathinfo($db->getPath()); $name = $file['filename']; echo " "; echo "
"; echo ""; echo "
".sprintf($lang['backup_hint'], $params->getLink(array('download'=>$currentDB['path'], 'token'=>$_SESSION[COOKIENAME.'token']), $lang["backup_hint_linktext"], '', $lang['backup']) )."
"; } else if($view=="import") { //- Import view (=import) if(isset($_POST['import'])) { echo "
"; if($importSuccess===true) echo $lang['import_suc']; else echo $importSuccess; echo "

"; } echo $params->getForm(array('view'=>'import'), 'post', true); echo "
".$lang['import'].""; echo ""; echo "
"; echo "
"; echo "
".$lang['options'].""; echo $lang['no_opt']; echo "
"; echo ""; echo "
"; echo "

"; echo "
".$lang['import_f'].""; echo "".$lang['max_file_size'].": ".number_format(fileUploadMaxSize()/1024/1024)." MiB ".helpLink($lang['help11'])."
"; echo ""; echo ""; echo "
"; } else if($view=="rename") { //- Rename database confirmation (=rename) echo $params->getForm(array('view'=>'rename', 'database_rename'=>'1')); echo ""; echo $lang['db_rename']." '".htmlencode($db->getPath())."' ".$lang['to']." "; echo ""; } else if($view=="delete") { //- Delete database confirmation (=delete) echo $params->getForm(array('database_delete'=>'1')); echo "
"; echo sprintf($lang['ques_del_db'],htmlencode($db->getPath()))."

"; echo ""; echo " "; echo $params->getLink(array(), $lang['cancel']); echo "
"; echo ""; } echo ""; } echo ""; //- HTML: page footer echo "
"; echo "".$lang['powered']." ".PROJECT." | "; echo $lang['free_software']." ".$lang['please_donate']." | "; printf($lang['page_gen'], $pageTimer); echo ""; echo "
"; $db->close(); //close the database echo ""; echo ""; //- End of main code // Authorization class // Maintains user's logged-in state and security of application // class Authorization { private $authorized; private $login_failed; private $system_password_encrypted; public function __construct() { // first, make sure a CSRF token is generated $this->generateToken(); // second, check for possible CSRF attacks. to protect logins, this is done before checking login $this->checkToken(); // the salt and password encrypting is probably unnecessary protection but is done just // for the sake of being very secure if(!isset($_SESSION[COOKIENAME.'_salt']) && !isset($_COOKIE[COOKIENAME.'_salt'])) { // create a random salt for this session if a cookie doesn't already exist for it $_SESSION[COOKIENAME.'_salt'] = self::generateSalt(22); } else if(!isset($_SESSION[COOKIENAME.'_salt']) && isset($_COOKIE[COOKIENAME.'_salt'])) { // session doesn't exist, but cookie does so grab it $_SESSION[COOKIENAME.'_salt'] = $_COOKIE[COOKIENAME.'_salt']; } // salted and encrypted password used for checking $this->system_password_encrypted = md5(SYSTEMPASSWORD."_".$_SESSION[COOKIENAME.'_salt']); $this->authorized = // no password SYSTEMPASSWORD == '' // correct password stored in session || isset($_SESSION[COOKIENAME.'password']) && hash_equals($_SESSION[COOKIENAME.'password'], $this->system_password_encrypted) // correct password stored in cookie || isset($_COOKIE[COOKIENAME]) && isset($_COOKIE[COOKIENAME.'_salt']) && hash_equals(md5(SYSTEMPASSWORD."_".$_COOKIE[COOKIENAME.'_salt']), $_COOKIE[COOKIENAME]); } public function attemptGrant($password, $remember) { $hashed_password = crypt(SYSTEMPASSWORD, '$2a$07$'.self::generateSalt(22).'$'); if (hash_equals($hashed_password, crypt($password, $hashed_password))) { if ($remember) { // user wants to be remembered, so set a cookie $expire = time()+60*60*24*30; //set expiration to 1 month from now setcookie(COOKIENAME, $this->system_password_encrypted, $expire, null, null, null, true); setcookie(COOKIENAME."_salt", $_SESSION[COOKIENAME.'_salt'], $expire, null, null, null, true); } else { // user does not want to be remembered, so destroy any potential cookies setcookie(COOKIENAME, "", time()-86400, null, null, null, true); setcookie(COOKIENAME."_salt", "", time()-86400, null, null, null, true); unset($_COOKIE[COOKIENAME]); unset($_COOKIE[COOKIENAME.'_salt']); } $_SESSION[COOKIENAME.'password'] = $this->system_password_encrypted; $this->authorized = true; return true; } $this->login_failed = true; return false; } public function revoke() { //destroy everything - cookies and session vars setcookie(COOKIENAME, "", time()-86400, null, null, null, true); setcookie(COOKIENAME."_salt", "", time()-86400, null, null, null, true); unset($_COOKIE[COOKIENAME]); unset($_COOKIE[COOKIENAME.'_salt']); session_unset(); session_destroy(); $this->authorized = false; // start a new session and generate a new CSRF token for the login form session_start(); $this->generateToken(); } public function isAuthorized() { return $this->authorized; } public function isFailedLogin() { return $this->login_failed; } public function isPasswordDefault() { return SYSTEMPASSWORD == 'admin'; } private static function generateSalt($saltSize) { $set = 'ABCDEFGHiJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $setLast = strlen($set) - 1; $salt = ''; while ($saltSize-- > 0) { $salt .= $set[mt_rand(0, $setLast)]; } return $salt; } private function generateToken() { // generate CSRF token if (empty($_SESSION[COOKIENAME.'token'])) { if (function_exists('random_bytes')) // introduced in PHP 7.0 { $_SESSION[COOKIENAME.'token'] = bin2hex(random_bytes(32)); } elseif (function_exists('openssl_random_pseudo_bytes')) // introduced in PHP 5.3.0 { $_SESSION[COOKIENAME.'token'] = bin2hex(openssl_random_pseudo_bytes(32)); } else { // For PHP 5.2.x - This case can be removed once we drop support for 5.2.x $_SESSION[COOKIENAME.'token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } } } private function checkToken() { // checking CSRF token if($_SERVER['REQUEST_METHOD'] === 'POST' || isset($_GET['download'])) // all POST forms need tokens! downloads are protected as well { if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['token'])) $check_token=$_POST['token']; elseif($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['token'])) $check_token=$_GET['token']; if (!isset($check_token)) { die("CSRF token missing"); } elseif(!hash_equals($_SESSION[COOKIENAME.'token'], $check_token)) { die("CSRF token is wrong - please try to login again"); } } } } // Database class // Generic database abstraction class to manage interaction with database without worrying about SQLite vs. PHP versions // class Database { protected $db; //reference to the DB object protected $type; //the extension for PHP that handles SQLite protected $data; protected $lastResult; protected $alterError; protected $debugOutput =''; public function __construct($data) { global $lang, $params; $this->data = $data; try { if(!file_exists($this->data["path"]) && !is_writable(dirname($this->data["path"]))) //make sure the containing directory is writable if the database does not exist { echo "
"; printf($lang['db_not_writeable'], htmlencode($this->data["path"]), htmlencode(dirname($this->data["path"]))); echo $params->getForm(); echo ""; echo ""; echo "

"; exit(); } $ver = $this->getVersion(); switch(true) { case ((!isset($data['type']) || $data['type']!=2) && (FORCETYPE=="PDO" || (FORCETYPE==false && class_exists("PDO") && in_array("sqlite", PDO::getAvailableDrivers()) && ($ver==-1 || $ver==3)))): $this->db = new PDO("sqlite:".$this->data['path']); if($this->db!=NULL) { $this->type = "PDO"; break; } case ((!isset($data['type']) || $data['type']!=2) && (FORCETYPE=="SQLite3" || (FORCETYPE==false && class_exists("SQLite3") && ($ver==-1 || $ver==3)))): $this->db = new SQLite3($this->data['path']); if($this->db!=NULL) { $this->type = "SQLite3"; break; } case (FORCETYPE=="SQLiteDatabase" || (FORCETYPE==false && class_exists("SQLiteDatabase") && ($ver==-1 || $ver==2))): $this->db = new SQLiteDatabase($this->data['path']); if($this->db!=NULL) { $this->type = "SQLiteDatabase"; break; } default: $this->showError(); exit(); } $this->query("PRAGMA foreign_keys = ON"); } catch(Exception $e) { $this->showError(); exit(); } } public function registerUserFunction($ids) { // in case a single function id was passed if (is_string($ids)) $ids = array($ids); if ($this->type == 'PDO') { foreach ($ids as $id) { $this->db->sqliteCreateFunction($id, $id, -1); } } else { // type is Sqlite3 or SQLiteDatabase foreach ($ids as $id) { $this->db->createFunction($id, $id, -1); } } } public function getError($complete_msg = false) { global $lang, $debug; $error = "unknown"; if($this->alterError!='') { $error = $this->alterError; $this->alterError = ""; } else if($this->type=="PDO") { $e = $this->db->errorInfo(); $error = $e[2]; } else if($this->type=="SQLite3") { $error = $this->db->lastErrorMsg(); } else { $error = sqlite_error_string($this->db->lastError()); } if($complete_msg) { $error = $lang['err'].": ".htmlencode($error); // do not suggest to report a bug when constraints fail if(strpos($error, 'constraint failed')===false) $error.="
".$lang['bug_report'].' '.PROJECT_BUGTRACKER_LINK; } if($debug) $error .= $this->getDebugOutput(); return $error; } function getDebugOutput() { return ($this->debugOutput != "" ? "
DEBUG:
".$this->debugOutput : $this->debugOutput); } public function showError() { global $lang; $classPDO = class_exists("PDO"); $classSQLite3 = class_exists("SQLite3"); $classSQLiteDatabase = class_exists("SQLiteDatabase"); if($classPDO) // PDO is there, check if the SQLite driver for PDO is missing $PDOSqliteDriver = (in_array("sqlite", PDO::getAvailableDrivers() )); else $PDOSqliteDriver = false; echo "
"; printf($lang['db_setup'], $this->getPath()); echo ".

".$lang['chk_ext']."...

"; echo "PDO: ".($classPDO ? $lang['installed'] : $lang['not_installed'])."
"; echo "PDO SQLite Driver: ".($PDOSqliteDriver ? $lang['installed'] : $lang['not_installed'])."
"; echo "SQLite3: ".($classSQLite3 ? $lang['installed'] : $lang['not_installed'])."
"; echo "SQLiteDatabase: ".($classSQLiteDatabase ? $lang['installed'] : $lang['not_installed'])."
"; echo "
...".$lang['done'].".


"; if(!$classPDO && !$classSQLite3 && !$classSQLiteDatabase) printf($lang['sqlite_ext_support'], PROJECT); else { if(!$PDOSqliteDriver && !$classSQLite3 && $this->getVersion()==3) printf($lang['sqlite_v_error'], 3, PROJECT, 2); else if(!$classSQLiteDatabase && $this->getVersion()==2) printf($lang['sqlite_v_error'], 2, PROJECT, 3); else echo $lang['report_issue'].' '.PROJECT_BUGTRACKER_LINK.'.'; } echo "

See ".PROJECT_INSTALL_LINK." for help.

"; $this->print_db_list(); echo "
"; } // print the list of databases public function print_db_list() { global $databases, $lang, $params, $currentDB; echo "
".$lang['db_ch'].""; if(sizeof($databases)<10) //if there aren't a lot of databases, just show them as a list of links instead of drop down menu { $i=0; foreach($databases as $database) { $i++; $name = $database['name']; if(mb_strlen($name)>25) $name = "...".mb_substr($name, mb_strlen($name)-22, 22); echo '[' . ($database['readable'] ? 'r':' ' ) . ($database['writable'] && $database['writable_dir'] ? 'w':' ' ) . '] '; echo $params->getLink(array('database'=>$database['path'], 'table'=>null), htmlencode($name), ($database == $currentDB? 'active_db': '') ); echo "  "; echo $params->getLink(array('download'=>$database['path'], 'table'=>null, 'token'=>$_SESSION[COOKIENAME.'token']), '[↓]', '', $lang['backup']); if($i"; } } else //there are a lot of databases - show a drop down menu { echo $params->getForm(array('table'=>null), 'get'); echo ""; echo ""; echo ""; } echo "
"; } public function __destruct() { if($this->db) $this->close(); } //get the exact PHP extension being used for SQLite public function getType() { return $this->type; } // get the version of the SQLite library public function getSQLiteVersion() { $queryVersion = $this->select("SELECT sqlite_version() AS sqlite_version"); return $queryVersion['sqlite_version']; } //get the name of the database public function getName() { return $this->data["name"]; } //get the filename of the database public function getPath() { return $this->data["path"]; } //is the db-file writable? public function isWritable() { return $this->data["writable"]; } //is the db-folder writable? public function isDirWritable() { return $this->data["writable_dir"]; } //get the version of the database public function getVersion() { if(file_exists($this->data['path'])) //make sure file exists before getting its contents { $content = strtolower(file_get_contents($this->data['path'], NULL, NULL, 0, 40)); //get the first 40 characters of the database file $p = strpos($content, "** this file contains an sqlite 2"); //this text is at the beginning of every SQLite2 database if($p!==false) //the text is found - this is version 2 return 2; else return 3; } else //return -1 to indicate that it does not exist and needs to be created { return -1; } } //get the size of the database (in KiB) public function getSize() { return round(filesize($this->data["path"])*0.0009765625, 1); } //get the last modified time of database public function getDate() { global $lang; return date($lang['date_format'], filemtime($this->data['path'])); } //get number of affected rows from last query public function getAffectedRows() { if($this->type=="PDO") if(!is_object($this->lastResult)) // in case it was an alter table statement, there is no lastResult object return 0; else return $this->lastResult->rowCount(); else if($this->type=="SQLite3") return $this->db->changes(); else if($this->type=="SQLiteDatabase") return $this->db->changes(); } public function getTypeOfTable($table) { $result = $this->select("SELECT `type` FROM `sqlite_master` WHERE `name`=" . $this->quote($table), 'assoc'); return $result['type']; } public function getTableInfo($table) { return $this->selectArray("PRAGMA table_info(".$this->quote_id($table).")"); } // returns the list of tables (opt. incl. views) as // array( Tablename => tableType ) with tableType being 'view' or 'table' public function getTables($alsoViews=true, $alsoInternal=false, $orderBy='name', $orderDirection='ASC') { $query = "SELECT name, type FROM sqlite_master " . "WHERE (type='table'".($alsoViews?" OR type='view'":"").") " . "AND name!='' ".($alsoInternal? "":" AND name NOT LIKE 'sqlite_%' ") . "ORDER BY ".$this->quote_id($orderBy)." ".$orderDirection; $result = $this->selectArray($query); $list = array(); for($i=0; $i array(columName) ) public function getTableDefinitions() { $tables = $this->getTables(true, true); $result = array(); foreach ($tables as $tableName => $tableType) { $tableInfo = $this->getTableInfo($tableName); $columns = array(); foreach($tableInfo as $column) $columns[] = $column['name']; $result[$tableName] = $columns; } return $result; } public function close() { if($this->type=="PDO") $this->db = NULL; else if($this->type=="SQLite3") $this->db->close(); else if($this->type=="SQLiteDatabase") $this->db = NULL; } public function beginTransaction() { $this->query("BEGIN"); } public function commitTransaction() { $this->query("COMMIT"); } public function rollbackTransaction() { $this->query("ROLLBACK"); } //generic query wrapper //returns false on error and the query result on success public function query($query, $ignoreAlterCase=false) { global $debug; if(strtolower(substr(ltrim($query),0,5))=='alter' && $ignoreAlterCase==false) //this query is an ALTER query - call the necessary function { preg_match("/^\s*ALTER\s+TABLE\s+\"((?:[^\"]|\"\")+)\"\s+(.*)$/i",$query,$matches); if(!isset($matches[1]) || !isset($matches[2])) { if($debug) echo "SQL?
"; return false; } $tablename = str_replace('""','"',$matches[1]); $alterdefs = $matches[2]; if($debug) echo "ALTER TABLE QUERY=(".htmlencode($query)."), tablename=($tablename), alterdefs=($alterdefs)
"; $result = $this->alterTable($tablename, $alterdefs); } else //this query is normal - proceed as normal { $result = $this->db->query($query); if($debug) echo "SQL?
"; } if($result===false) return false; $this->lastResult = $result; return $result; } //wrapper for an INSERT and returns the ID of the inserted row public function insert($query) { $result = $this->query($query); if($this->type=="PDO") return $this->db->lastInsertId(); else if($this->type=="SQLite3") return $this->db->lastInsertRowID(); else if($this->type=="SQLiteDatabase") return $this->db->lastInsertRowid(); } //returns an array for SELECT public function select($query, $mode="both") { $result = $this->query($query); if(!$result) //make sure the result is valid return NULL; if($this->type=="PDO") { if($mode=="assoc") $mode = PDO::FETCH_ASSOC; else if($mode=="num") $mode = PDO::FETCH_NUM; else $mode = PDO::FETCH_BOTH; $ret = $result->fetch($mode); $result->closeCursor(); return $ret; } else if($this->type=="SQLite3") { if($mode=="assoc") $mode = SQLITE3_ASSOC; else if($mode=="num") $mode = SQLITE3_NUM; else $mode = SQLITE3_BOTH; $ret = $result->fetchArray($mode); $result->finalize(); return $ret; } else if($this->type=="SQLiteDatabase") { if($mode=="assoc") $mode = SQLITE_ASSOC; else if($mode=="num") $mode = SQLITE_NUM; else $mode = SQLITE_BOTH; return $result->fetch($mode); } } //returns an array of arrays after doing a SELECT public function selectArray($query, $mode="both") { $result = $this->query($query); //make sure the result is valid if($result=== false || $result===NULL) return NULL; // error if(!is_object($result)) // no rows returned return array(); if($this->type=="PDO") { if($mode=="assoc") $mode = PDO::FETCH_ASSOC; else if($mode=="num") $mode = PDO::FETCH_NUM; else $mode = PDO::FETCH_BOTH; $ret = $result->fetchAll($mode); $result->closeCursor(); return $ret; } else if($this->type=="SQLite3") { if($mode=="assoc") $mode = SQLITE3_ASSOC; else if($mode=="num") $mode = SQLITE3_NUM; else $mode = SQLITE3_BOTH; $arr = array(); $i = 0; while($res = $result->fetchArray($mode)) { $arr[$i] = $res; $i++; } $result->finalize(); return $arr; } else if($this->type=="SQLiteDatabase") { if($mode=="assoc") $mode = SQLITE_ASSOC; else if($mode=="num") $mode = SQLITE_NUM; else $mode = SQLITE_BOTH; return $result->fetchAll($mode); } } //returns an array of the next row in $result public function fetch($result, $mode="both") { //make sure the result is valid if($result=== false || $result===NULL) return NULL; // error if(!is_object($result)) // no rows returned return array(); if($this->type=="PDO") { if($mode=="assoc") $mode = PDO::FETCH_ASSOC; else if($mode=="num") $mode = PDO::FETCH_NUM; else $mode = PDO::FETCH_BOTH; return $result->fetch($mode); } else if($this->type=="SQLite3") { if($mode=="assoc") $mode = SQLITE3_ASSOC; else if($mode=="num") $mode = SQLITE3_NUM; else $mode = SQLITE3_BOTH; return $result->fetchArray($mode); } else if($this->type=="SQLiteDatabase") { if($mode=="assoc") $mode = SQLITE_ASSOC; else if($mode=="num") $mode = SQLITE_NUM; else $mode = SQLITE_BOTH; return $result->fetch($mode); } } public function getColumnName($result, $colNum) { //make sure the result is valid if($result=== false || $result===NULL || !is_object($result)) return ""; // error or no rows returned if($this->type=="PDO") { $meta = $result->getColumnMeta($colNum); return $meta['name']; } else if($this->type=="SQLite3") { return $result->columnName($colNum); } else if($this->type=="SQLiteDatabase") { return $result->fieldName($colNum); } } // SQlite supports multiple ways of surrounding names in quotes: // single-quotes, double-quotes, backticks, square brackets. // As sqlite does not keep this strict, we also need to be flexible here. // This function generates a regex that matches any of the possibilities. private function sqlite_surroundings_preg($name,$preg_quote=true,$notAllowedCharsIfNone="'\"",$notAllowedName=false) { if($name=="*" || $name=="+") { if($notAllowedName!==false && $preg_quote) $notAllowedName = preg_quote($notAllowedName,"/"); // use possesive quantifiers to save memory // (There is a bug in PCRE starting in 8.13 and fixed in PCRE 8.36 // why we can't use posesive quantifiers - See issue #310). if(version_compare(strstr(constant('PCRE_VERSION'), ' ', true), '8.36', '>=') || version_compare(strstr(constant('PCRE_VERSION'), ' ', true), '8.12', '<=')) $posessive='+'; else $posessive=''; $nameSingle = ($notAllowedName!==false?"(?!".$notAllowedName."')":"")."(?:[^']$name+|'')$name".$posessive; $nameDouble = ($notAllowedName!==false?"(?!".$notAllowedName."\")":"")."(?:[^\"]$name+|\"\")$name".$posessive; $nameBacktick = ($notAllowedName!==false?"(?!".$notAllowedName."`)":"")."(?:[^`]$name+|``)$name".$posessive; $nameSquare = ($notAllowedName!==false?"(?!".$notAllowedName."\])":"")."(?:[^\]]$name+|\]\])$name".$posessive; $nameNo = ($notAllowedName!==false?"(?!".$notAllowedName."\s)":"")."[^".$notAllowedCharsIfNone."]$name"; } else { if($preg_quote) $name = preg_quote($name,"/"); $nameSingle = str_replace("'","''",$name); $nameDouble = str_replace('"','""',$name); $nameBacktick = str_replace('`','``',$name); $nameSquare = str_replace(']',']]',$name); $nameNo = $name; } $preg = "(?:'".$nameSingle."'|". // single-quote surrounded or not in quotes (correct SQL for values/new names) $nameNo."|". // not surrounded (correct SQL if not containing reserved words, spaces or some special chars) "\"".$nameDouble."\"|". // double-quote surrounded (correct SQL for identifiers) "`".$nameBacktick."`|". // backtick surrounded (MySQL-Style) "\[".$nameSquare."\])"; // square-bracket surrounded (MS Access/SQL server-Style) return $preg; } // Returns the last PREG error as a string, '' if no error occured private function getPregError() { $error = preg_last_error(); switch ($error) { case PREG_NO_ERROR: return 'No error'; case PREG_INTERNAL_ERROR: return 'There is an internal error!'; case PREG_BACKTRACK_LIMIT_ERROR: return 'Backtrack limit was exhausted!'; case PREG_RECURSION_LIMIT_ERROR: return 'Recursion limit was exhausted!'; case PREG_BAD_UTF8_ERROR: return 'Bad UTF8 error!'; // PREG_BAD_UTF8_OFFSET_ERROR is introduced in PHP 5.3.0, which is not yet required by PLA, so we use its value 5 instead so long case 5: return 'Bad UTF8 offset error!'; default: return 'Unknown Error'; } } // function that is called for an alter table statement in a query // code borrowed with permission from http://code.jenseng.com/db/ // this has been completely debugged / rewritten by Christopher Kramer public function alterTable($table, $alterdefs) { global $debug, $lang; $this->alterError=""; $errormsg = sprintf($lang['alter_failed'],htmlencode($table)).' - '; if($debug) $this->debugOutput .= "ALTER TABLE: table=($table), alterdefs=($alterdefs), PCRE version=(".PCRE_VERSION.")

"; if($alterdefs != '') { $recreateQueries = array(); $resultArr = $this->selectArray("SELECT sql,name,type FROM sqlite_master WHERE tbl_name = ".$this->quote($table)); if(sizeof($resultArr)<1) { $this->alterError = $errormsg . sprintf($lang['tbl_inexistent'], htmlencode($table)); if($debug) $this->debugOutput .= "ERROR: unknown table

"; return false; } for($i=0; $idebugOutput .= "recreate=(".$row['sql'].";)
"; } } elseif($row['type']=='view') // workaround to rename views { $origsql = $row['sql']; $preg_remove_create_view = "/^\s*+CREATE\s++VIEW\s++".$this->sqlite_surroundings_preg($table)."\s*+(AS\s++SELECT\s++.*+)$/is"; $origsql_no_create = preg_replace($preg_remove_create_view, '$1', $origsql, 1); if($debug) $this->debugOutput .= "origsql=($origsql)
preg_remove_create_table=($preg_remove_create_view)
"; preg_match("/RENAME\s++TO\s++(?:\"((?:[^\"]|\"\")+)\"|'((?:[^']|'')+)')/is", $alterdefs, $matches); if(isset($matches[1]) && $matches[1]!='') $newname = $matches[1]; elseif(isset($matches[2]) && $matches[2]!='') $newname = $matches[2]; else { $this->alterError = $errormsg . ' could not detect new view name. It needs to be in single or double quotes.'; if($debug) $this->debugOutput .= "ERROR: could not detect new view name
"; return false; } $dropoldSQL = 'DROP VIEW '.$this->quote_id($table); $createnewSQL = 'CREATE VIEW '.$this->quote_id($newname).' '.$origsql_no_create; $alter_transaction = 'BEGIN; ' . $dropoldSQL .'; '. $createnewSQL . '; ' . 'COMMIT;'; if($debug) $this->debugOutput .= $alter_transaction; return $this->multiQuery($alter_transaction); } else { // ALTER the table $tmpname = 't'.time(); $origsql = $row['sql']; $preg_remove_create_table = "/^\s*+CREATE\s++TABLE\s++".$this->sqlite_surroundings_preg($table)."\s*+(\(.*+)$/is"; $origsql_no_create = preg_replace($preg_remove_create_table, '$1', $origsql, 1); if($debug) $this->debugOutput .= "origsql=($origsql)
preg_remove_create_table=($preg_remove_create_table)
"; if($origsql_no_create == $origsql) { $this->alterError = $errormsg . $lang['alter_tbl_name_not_replacable']; if($debug) $this->debugOutput .= "ERROR: could not get rid of CREATE TABLE
"; return false; } $createtemptableSQL = "CREATE TABLE ".$this->quote($tmpname)." ".$origsql_no_create; if($debug) $this->debugOutput .= "createtemptableSQL=($createtemptableSQL)
"; $createindexsql = array(); $preg_alter_part = "/(?:DROP(?! PRIMARY KEY)|ADD(?! PRIMARY KEY)|CHANGE|RENAME TO|ADD PRIMARY KEY|DROP PRIMARY KEY)" // the ALTER command ."(?:" ."\s+\(".$this->sqlite_surroundings_preg("+",false,"\"'\[`)")."+\)" // stuff in brackets (in case of ADD PRIMARY KEY) ."|" // or ."\s+".$this->sqlite_surroundings_preg("+",false,",'\"\[`") // column names and stuff like this .")*/i"; if($debug) $this->debugOutput .= "preg_alter_part=(".$preg_alter_part.")
"; preg_match_all($preg_alter_part,$alterdefs,$matches); $defs = $matches[0]; $result_oldcols = $this->getTableInfo($table); $newcols = array(); $coltypes = array(); $primarykey = array(); foreach($result_oldcols as $column_info) { $newcols[$column_info['name']] = $column_info['name']; $coltypes[$column_info['name']] = $column_info['type']; if($column_info['pk']) $primarykey[] = $column_info['name']; } $newcolumns = ''; $oldcolumns = ''; reset($newcols); while(list($key, $val) = each($newcols)) { $newcolumns .= ($newcolumns?', ':'').$this->quote_id($val); $oldcolumns .= ($oldcolumns?', ':'').$this->quote_id($key); } $copytotempsql = 'INSERT INTO '.$this->quote_id($tmpname).'('.$newcolumns.') SELECT '.$oldcolumns.' FROM '.$this->quote_id($table); $dropoldsql = 'DROP TABLE '.$this->quote_id($table); $createtesttableSQL = $createtemptableSQL; if(count($defs)<1) { $this->alterError = $errormsg . $lang['alter_no_def']; if($debug) $this->debugOutput .= "ERROR: defs<1

"; return false; } foreach($defs as $def) { if($debug) $this->debugOutput .= "
def=$def
"; $preg_parse_def = "/^(DROP(?! PRIMARY KEY)|ADD(?! PRIMARY KEY)|CHANGE|RENAME TO|ADD PRIMARY KEY|DROP PRIMARY KEY)" // $matches[1]: command ."(?:" // this is either ."(?:\s+\((.+)\)\s*$)" // anything in brackets (for ADD PRIMARY KEY) // then $matches[2] is what there is in brackets ."|" // OR: ."(?:\s+\"((?:[^\"]|\"\")+)\"|\s+'((?:[^']|'')+)')"// (first) column name, either in single or double quotes // in case of RENAME TO, it is the new a table name // $matches[3] will be the column/table name without the quotes if double quoted // $matches[4] will be the column/table name without the quotes if single quoted ."(" // $matches[5]: anything after the column name ."(?:\s+'((?:[^']|'')+)')?" // $matches[6] (optional): a second column name surrounded with single quotes // (the match does not contain the quotes) ."\s*" ."((?:[A-Z]+\s*)+(?:\(\s*[+-]?\s*[0-9]+(?:\s*,\s*[+-]?\s*[0-9]+)?\s*\))?)?\s*" // $matches[7] (optional): a type name .".*". ")" ."?\s*$" .")?\s*$/i"; // in case of DROP PRIMARY KEY, there is nothing after the command if($debug) $this->debugOutput .= "preg_parse_def=$preg_parse_def
"; $parse_def = preg_match($preg_parse_def,$def,$matches); if($parse_def===false) { $this->alterError = $errormsg . $lang['alter_parse_failed']; if($debug) $this->debugOutput .= "ERROR: !parse_def

"; return false; } if(!isset($matches[1])) { $this->alterError = $errormsg . $lang['alter_action_not_recognized']; if($debug) $this->debugOutput .= "ERROR: !isset(matches[1])

"; return false; } $action = strtolower($matches[1]); if(($action == 'add' || $action == 'rename to') && isset($matches[4]) && $matches[4]!='') $column = str_replace("''","'",$matches[4]); // enclosed in '' elseif($action == 'add primary key' && isset($matches[2]) && $matches[2]!='') $column = $matches[2]; elseif($action == 'drop primary key') $column = ''; // DROP PRIMARY KEY has no column definition elseif(isset($matches[3]) && $matches[3]!='') $column = str_replace('""','"',$matches[3]); // enclosed in "" else $column = ''; $column_escaped = str_replace("'","''",$column); if($debug) $this->debugOutput .= "action=($action), column=($column), column_escaped=($column_escaped)
"; /* we build a regex that devides the CREATE TABLE statement parts: Part example Group Explanation 1. CREATE TABLE t... ( $1 2. 'col1' ..., 'col2' ..., 'colN' ..., $3 (with col1-colN being columns that are not changed and listed before the col to change) 3. 'colX' ..., (with colX being the column to change/drop) 4. 'colX+1' ..., ..., 'colK') $5 (with colX+1-colK being columns after the column to change/drop) */ $preg_create_table = "\s*+(CREATE\s++TABLE\s++".preg_quote($this->quote($tmpname),"/")."\s*+\()"; // This is group $1 (keep unchanged) $preg_column_definiton = "\s*+".$this->sqlite_surroundings_preg("+",true," '\"\[`,",$column)."(?:\s*+".$this->sqlite_surroundings_preg("*",false,"'\",`\[ ").")++"; // catches a complete column definition, even if it is // 'column' TEXT NOT NULL DEFAULT 'we have a comma, here and a double ''quote!' // this definition does NOT match columns with the column name $column if($debug) $this->debugOutput .= "preg_column_definition=(".$preg_column_definiton.")
"; $preg_columns_before = // columns before the one changed/dropped (keep) "(?:". "(". // group $2. Keep this one unchanged! "(?:". "$preg_column_definiton,\s*+". // column definition + comma ")*". // there might be any number of such columns here $preg_column_definiton. // last column definition ")". // end of group $2 ",\s*+" // the last comma of the last column before the column to change. Do not keep it! .")?"; // there might be no columns before if($debug) $this->debugOutput .= "preg_columns_before=(".$preg_columns_before.")
"; $preg_columns_after = "(,\s*(.+))?"; // the columns after the column to drop. This is group $3 (drop) or $4(change) (keep!) // we could remove the comma using $6 instead of $5, but then we might have no comma at all. // Keeping it leaves a problem if we drop the first column, so we fix that case in another regex. $table_new = $table; switch($action) { case 'add': if($column=='') { $this->alterError = $errormsg . ' (add) - '. $lang['alter_no_add_col']; return false; } $new_col_definition = "'$column_escaped' ".(isset($matches[5])?$matches[5]:''); $preg_pattern_add = "/^".$preg_create_table. // the CREATE TABLE statement ($1) "((?:(?!,\s*(?:PRIMARY\s+KEY\s*\(|CONSTRAINT\s|UNIQUE\s*\(|CHECK\s*\(|FOREIGN\s+KEY\s*\()).)*)". // column definitions ($2) "(.*)\\)\s*$/si"; // table-constraints like PRIMARY KEY(a,b) ($3) and the closing bracket // append the column definiton in the CREATE TABLE statement $newSQL = preg_replace($preg_pattern_add, '$1$2, '.strtr($new_col_definition, array('\\' => '\\\\', '$' => '\$')).' $3', $createtesttableSQL).')'; $preg_error = $this->getPregError(); if($debug) { $this->debugOutput .= $createtesttableSQL."

"; $this->debugOutput .= $newSQL."

"; $this->debugOutput .= $preg_pattern_add."

"; } if($newSQL==$createtesttableSQL) // pattern did not match, so column adding did not succed { $this->alterError = $errormsg . ' (add) - '.$lang['alter_pattern_mismatch'].'. PREG ERROR: '.$preg_error; return false; } $createtesttableSQL = $newSQL; break; case 'change': var_dump($matches); if(!isset($matches[6])) { $this->alterError = $errormsg . ' (change) - '.$lang['alter_col_not_recognized']; return false; } $new_col_name = $matches[6]; if(!isset($matches[7])) $new_col_type = ''; else $new_col_type = $matches[7]; $new_col_definition = "'$new_col_name' $new_col_type"; $preg_column_to_change = "\s*".$this->sqlite_surroundings_preg($column)."(?:\s+".preg_quote($coltypes[$column]).")?(\s+(?:".$this->sqlite_surroundings_preg("*",false,",'\"`\[").")+)?"; // replace this part (we want to change this column) // group $3 contains the column constraints (keep!). the name & data type is replaced. $preg_pattern_change = "/^".$preg_create_table.$preg_columns_before.$preg_column_to_change.$preg_columns_after."\s*\\)\s*$/s"; // replace the column definiton in the CREATE TABLE statement $newSQL = preg_replace($preg_pattern_change, '$1$2,'.strtr($new_col_definition, array('\\' => '\\\\', '$' => '\$')).'$3$4)', $createtesttableSQL); $preg_error = $this->getPregError(); // remove comma at the beginning if the first column is changed // probably somebody is able to put this into the first regex (using lookahead probably). $newSQL = preg_replace("/^\s*(CREATE\s+TABLE\s+".preg_quote($this->quote($tmpname),"/")."\s+\(),\s*/",'$1',$newSQL); if($debug) { $this->debugOutput .= "preg_column_to_change=(".$preg_column_to_change.")

"; $this->debugOutput .= $createtesttableSQL."

"; $this->debugOutput .= $newSQL."

"; $this->debugOutput .= $preg_pattern_change."

"; } if($newSQL==$createtesttableSQL || $newSQL=="") // pattern did not match, so column removal did not succed { $this->alterError = $errormsg . ' (change) - '.$lang['alter_pattern_mismatch'].'. PREG ERROR: '.$preg_error; return false; } $createtesttableSQL = $newSQL; $newcols[$column] = str_replace("''","'",$new_col_name); break; case 'drop': $preg_column_to_drop = "\s*".$this->sqlite_surroundings_preg($column)."\s+(?:".$this->sqlite_surroundings_preg("*",false,",'\"\[`").")+"; // delete this part (we want to drop this column) $preg_pattern_drop = "/^".$preg_create_table.$preg_columns_before.$preg_column_to_drop.$preg_columns_after."\s*\\)\s*$/s"; // remove the column out of the CREATE TABLE statement $newSQL = preg_replace($preg_pattern_drop, '$1$2$3)', $createtesttableSQL); $preg_error = $this->getPregError(); // remove comma at the beginning if the first column is removed // probably somebody is able to put this into the first regex (using lookahead probably). $newSQL = preg_replace("/^\s*(CREATE\s+TABLE\s+".preg_quote($this->quote($tmpname),"/")."\s+\(),\s*/",'$1',$newSQL); if($debug) { $this->debugOutput .= $createtesttableSQL."

"; $this->debugOutput .= $newSQL."

"; $this->debugOutput .= $preg_pattern_drop."

"; } if($newSQL==$createtesttableSQL || $newSQL=="") // pattern did not match, so column removal did not succed { $this->alterError = $errormsg . ' (drop) - '.$lang['alter_pattern_mismatch'].'. PREG ERROR: '.$preg_error; return false; } $createtesttableSQL = $newSQL; unset($newcols[$column]); break; case 'rename to': // don't change column definition at all $newSQL = $createtesttableSQL; // only change the name of the table $table_new = $column; break; case 'add primary key': // we want to add a primary key for the column(s) stored in $column $newSQL = preg_replace("/\)\s*$/", ", PRIMARY KEY (".$column.") )", $createtesttableSQL); $createtesttableSQL = $newSQL; break; case 'drop primary key': // we want to drop the primary key if($debug) $this->debugOutput .= "DROP"; if(sizeof($primarykey)==1) { // if not compound primary key, might be a column constraint -> try removal $column = $primarykey[0]; if($debug) $this->debugOutput .= "
Trying to drop column constraint for column $column
"; /* TODO: This does not work yet: CREATE TABLE 't12' ('t1' INTEGER CONSTRAINT "bla" NOT NULL CONSTRAINT 'pk' PRIMARY KEY ); ALTER TABLE "t12" DROP PRIMARY KEY This does: ! ! CREATE TABLE 't12' ('t1' INTEGER CONSTRAINT bla NOT NULL CONSTRAINT 'pk' PRIMARY KEY ); ALTER TABLE "t12" DROP PRIMARY KEY */ $preg_column_to_change = "(\s*".$this->sqlite_surroundings_preg($column).")". // column ($3) "(?:". // opt. type and column constraints "(\s+(?:".$this->sqlite_surroundings_preg("(?:[^PC,'\"`\[]|P(?!RIMARY\s+KEY)|". "C(?!ONSTRAINT\s+".$this->sqlite_surroundings_preg("+",false," ,'\"\[`")."\s+PRIMARY\s+KEY))",false,",'\"`\[").")*)". // column constraints before PRIMARY KEY ($3) // primary key constraint (remove this!): "(?:CONSTRAINT\s+".$this->sqlite_surroundings_preg("+",false," ,'\"\[`")."\s+)?". "PRIMARY\s+KEY". "(?:\s+(?:ASC|DESC))?". "(?:\s+ON\s+CONFLICT\s+(?:ROLLBACK|ABORT|FAIL|IGNORE|REPLACE))?". "(?:\s+AUTOINCREMENT)?". "((?:".$this->sqlite_surroundings_preg("*",false,",'\"`\[").")*)". // column constraints after PRIMARY KEY ($4) ")"; // replace this part (we want to change this column) // group $3 (column) $4 (constraints before) and $5 (constraints after) contain the part to keep $preg_pattern_change = "/^".$preg_create_table.$preg_columns_before.$preg_column_to_change.$preg_columns_after."\s*\\)\s*$/si"; // replace the column definiton in the CREATE TABLE statement $newSQL = preg_replace($preg_pattern_change, '$1$2,$3$4$5$6)', $createtesttableSQL); // remove comma at the beginning if the first column is changed // probably somebody is able to put this into the first regex (using lookahead probably). $newSQL = preg_replace("/^\s*(CREATE\s+TABLE\s+".preg_quote($this->quote($tmpname),"/")."\s+\(),\s*/",'$1',$newSQL); if($debug) { $this->debugOutput .= "preg_column_to_change=(".$preg_column_to_change.")

"; $this->debugOutput .= $createtesttableSQL."

"; $this->debugOutput .= $newSQL."

"; $this->debugOutput .= $preg_pattern_change."

"; } if($newSQL!=$createtesttableSQL && $newSQL!="") // pattern did match, so PRIMARY KEY constraint removed :) { $createtesttableSQL = $newSQL; if($debug) $this->debugOutput .= "
SUCCEEDED
"; } else { if($debug) $this->debugOutput .= "NO LUCK"; // TODO: try removing table constraint return false; } $createtesttableSQL = $newSQL; } else // TODO: Try removing table constraint return false; break; default: if($debug) $this->debugOutput .= 'ERROR: unknown alter operation!

'; $this->alterError = $errormsg . $lang['alter_unknown_operation']; return false; } } $droptempsql = 'DROP TABLE '.$this->quote_id($tmpname); $createnewtableSQL = "CREATE TABLE ".$this->quote($table_new)." ".preg_replace("/^\s*CREATE\s+TABLE\s+'?".str_replace("'","''",preg_quote($tmpname,"/"))."'?\s+(.*)$/is", '$1', $createtesttableSQL, 1); $newcolumns = ''; $oldcolumns = ''; reset($newcols); while(list($key,$val) = each($newcols)) { $newcolumns .= ($newcolumns?', ':'').$this->quote_id($val); $oldcolumns .= ($oldcolumns?', ':'').$this->quote_id($key); } $copytonewsql = 'INSERT INTO '.$this->quote_id($table_new).'('.$newcolumns.') SELECT '.$oldcolumns.' FROM '.$this->quote_id($tmpname); } } $alter_transaction = 'BEGIN; '; $alter_transaction .= $createtemptableSQL.'; '; //create temp table $alter_transaction .= $copytotempsql.'; '; //copy to table $alter_transaction .= $dropoldsql.'; '; //drop old table $alter_transaction .= $createnewtableSQL.'; '; //recreate original table $alter_transaction .= $copytonewsql.'; '; //copy back to original table $alter_transaction .= $droptempsql.'; '; //drop temp table $preg_index="/^\s*(CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:".$this->sqlite_surroundings_preg("+",false," '\"\[`")."\s*)*ON\s+)(".$this->sqlite_surroundings_preg($table).")(\s*\((?:".$this->sqlite_surroundings_preg("+",false," '\"\[`")."\s*)*\)\s*)\s*$/i"; foreach($recreateQueries as $recreate_query) { if($recreate_query['type']=='index') { // this is an index. We need to make sure the index is not on a column that we drop. If it is, we drop the index as well. $indexInfos = $this->selectArray('PRAGMA index_info('.$this->quote_id($recreate_query['name']).')'); foreach($indexInfos as $indexInfo) { if(!isset($newcols[$indexInfo['name']])) { if($debug) $this->debugOutput .= 'Not recreating the following index:

'.htmlencode($recreate_query['sql']).'

'; // Index on a column that was dropped. Skip recreation. continue 2; } } } // TODO: In case we renamed a column on which there is an index, we need to recreate the index with the column name adjusted. // recreate triggers / indexes if($table == $table_new) { // we had no RENAME TO, so we can recreate indexes/triggers just like the original ones $alter_transaction .= $recreate_query['sql'].';'; } else { // we had a RENAME TO, so we need to exchange the table-name in the CREATE-SQL of triggers & indexes switch ($recreate_query['type']) { case 'index': $recreate_queryIndex = preg_replace($preg_index, '$1'.$this->quote_id(strtr($table_new, array('\\' => '\\\\', '$' => '\$'))).'$3 ', $recreate_query['sql']); if($recreate_queryIndex!=$recreate_query['sql'] && $recreate_queryIndex != NULL) $alter_transaction .= $recreate_queryIndex.';'; else { // the CREATE INDEX regex did not match. this normally should not happen if($debug) $this->debugOutput .= 'ERROR: CREATE INDEX regex did not match!?

'; // just try to recreate the index originally (will fail most likely) $alter_transaction .= $recreate_query['sql'].';'; } break; case 'trigger': // TODO: IMPLEMENT $alter_transaction .= $recreate_query['sql'].';'; break; default: if($debug) $this->debugOutput .= 'ERROR: Unknown type '.htmlencode($recreate_query['type']).'

'; $alter_transaction .= $recreate_query['sql'].';'; } } } $alter_transaction .= 'COMMIT;'; if($debug) $this->debugOutput .= $alter_transaction; return $this->multiQuery($alter_transaction); } } //multiple query execution //returns true on success, false otherwise. Use getError() to fetch the error. public function multiQuery($query) { if($this->type=="PDO") $success = $this->db->exec($query); else if($this->type=="SQLite3") $success = $this->db->exec($query); else $success = $this->db->queryExec($query, $error); return $success; } // checks whether a table has a primary key public function hasPrimaryKey($table) { $table_info = $this->getTableInfo($table); foreach($table_info as $row_id => $row_data) { if($row_data['pk']) { return true; } } return false; } // Returns an array of columns by which rows can be uniquely adressed. // For tables with a rowid column, this is always array('rowid') // for tables without rowid, this is an array of the primary key columns. public function getPrimaryKey($table) { $primary_key = array(); // check if this table has a rowid $getRowID = $this->select('SELECT ROWID FROM '.$this->quote_id($table).' LIMIT 0,1'); if(isset($getRowID[0])) // it has, so we prefer addressing rows by rowid return array('rowid'); else { // the table is without rowid, so use the primary key $table_info = $this->getTableInfo($table); if(is_array($table_info)) { foreach($table_info as $row_id => $row_data) { if($row_data['pk']) $primary_key[] = $row_data['name']; } } } return $primary_key; } // selects a row by a given key $pk, which is an array of values // for the columns by which a row can be adressed (rowid or primary key) public function wherePK($table, $pk) { $where = ""; $primary_key = $this->getPrimaryKey($table); foreach($primary_key as $pk_index => $column) { if($where!="") $where .= " AND "; $where .= $this->quote_id($column) . ' = '; if(is_int($pk[$pk_index]) || is_float($pk[$pk_index])) $where .= $pk[$pk_index]; else $where .= $this->quote($pk[$pk_index]); } return $where; } //get number of rows in table public function numRows($table, $dontTakeLong = false) { // as Count(*) can be slow on huge tables without PK, // if $dontTakeLong is set and the size is > 2MB only count() if there is a PK if(!$dontTakeLong || $this->getSize() <= 2000 || $this->hasPrimaryKey($table)) { $result = $this->select("SELECT Count(*) FROM ".$this->quote_id($table)); return $result[0]; } else { return '?'; } } //correctly escape a string to be injected into an SQL query public function quote($value) { if($this->type=="PDO") { // PDO quote() escapes and adds quotes return $this->db->quote($value); } else if($this->type=="SQLite3") { return "'".$this->db->escapeString($value)."'"; } else { return "'".sqlite_escape_string($value)."'"; } } //correctly escape an identifier (column / table / trigger / index name) to be injected into an SQL query public function quote_id($value) { // double-quotes need to be escaped by doubling them $value = str_replace('"','""',$value); return '"'.$value.'"'; } //import sql //returns true on success, error message otherwise public function import_sql($query) { $import = $this->multiQuery($query); if(!$import) return $this->getError(); else return true; } public function prepareQuery($query) { if($this->type=='PDO' || $this->type=='SQLite3') return $this->db->prepare($query); else { // here we are in trouble, SQLiteDatabase cannot prepare statements. // we need to emulate prepare as best as we can # todo: implement this return null; } } public function bindValue($handle, $parameter, $value, $type) { if($this->type=='SQLite3') { $types = array( 'bool'=>SQLITE3_INTEGER, 'int'=>SQLITE3_INTEGER, 'float'=>SQLITE3_FLOAT, 'text'=>SQLITE3_TEXT, 'blob'=>SQLITE3_BLOB, 'null'=>SQLITE3_NULL); if(!isset($types[$type])) $type = 'text'; // there is no SQLITE_BOOL, so check value and make sure it is 0/1 if($type=='bool') { if($value===1 || $value===true) $value=1; elseif($value===0 || $value===false) $value=0; else return false; } return $handle->bindValue($parameter, $value, $types[$type]); } if($this->type=='PDO') { $types = array( 'bool'=>PDO::PARAM_BOOL, 'int'=>PDO::PARAM_INT, 'float'=>PDO::PARAM_STR, 'text'=>PDO::PARAM_STR, 'blob'=>PDO::PARAM_LOB, 'null'=>PDO::PARAM_NULL); if(!isset($types[$type])) $type = 'text'; // there is no PDO::PARAM_FLOAT, so we check it ourself if($type=='float') { if(is_numeric($value)) $value = (float) $value; else return false; } return $handle->bindValue($parameter, $value, $types[$type]); } else # todo: workaround return false; } public function executePrepared($handle, $fetchResult=false) { if($this->type=='PDO') { $ok=$handle->execute(); if($fetchResult && $ok) { $res = $handle->fetchAll(); $handle->closeCursor(); return $res; } else { if($ok) $handle->closeCursor(); return $ok; } } elseif($this->type=='SQLite3') { $resultset=$handle->execute(); if($fetchResult && $resultset!==false) { $res = $resultset->fetchArray(); $resultset->finalize(); return $res; } else { if($resultset!==false) $resultset->finalize(); if($resultset===false) return false; else return true; } } else { #todo. return false; } } //import csv //returns true on success, error message otherwise public function import_csv($filename, $table, $field_terminate, $field_enclosed, $field_escaped, $null, $fields_in_first_row) { @set_time_limit(-1); $csv_handle = fopen($filename,'r'); $csv_insert = "BEGIN;\n"; $csv_number_of_rows = 0; // PHP requires enclosure defined, but has no problem if it was not used if($field_enclosed=="") $field_enclosed='"'; // PHP requires escaper defined if($field_escaped=="") $field_escaped='\\'; // support tab delimiters if($field_terminate=='\t') $field_terminate = "\t"; while($csv_handle!==false && !feof($csv_handle)) { $csv_data = fgetcsv($csv_handle, 0, $field_terminate, $field_enclosed, $field_escaped); if(is_array($csv_data) && ($csv_data[0] != NULL || count($csv_data)>1)) { $csv_number_of_rows++; if($csv_number_of_rows==1) { if($this->getTypeOfTable($table)!="table") { // First,Create a new table $csv_insert .="CREATE TABLE ".$this->quote($table)." ("; $number_of_cols = count($csv_data); foreach($csv_data as $csv_col => $csv_cell) { if($fields_in_first_row) $csv_insert .= $this->quote($csv_cell); else $csv_insert.= $this->quote("col{$csv_col}"); if($csv_col < $number_of_cols-1) $csv_insert .= ", "; } $csv_insert .=");"; } else { $number_of_cols = count($this->getTableInfo($table)); } if($fields_in_first_row) continue; } $csv_insert .= "INSERT INTO ".$this->quote_id($table)." VALUES ("; for($csv_col = 0; $csv_col < $number_of_cols; $csv_col++) { if(isset($csv_data[$csv_col])) $csv_cell = $csv_data[$csv_col]; else $csv_cell = $null; if($csv_cell == $null) $csv_insert .= "NULL"; else $csv_insert.= $this->quote($csv_cell); if($csv_col < $number_of_cols-1) $csv_insert .= ","; } $csv_insert .= ");\n"; if($csv_number_of_rows % 5000 == 0) { $csv_insert .= "COMMIT;\nBEGIN;\n"; } } } if($csv_handle === false) return "Error reading CSV file"; else { $csv_insert .= "COMMIT;"; fclose($csv_handle); $import = $this->multiQuery($csv_insert); if(!$import) return $this->getError(); else return true; } } //export csv public function export_csv($tables, $field_terminate, $field_enclosed, $field_escaped, $null, $crlf, $fields_in_first_row) { @set_time_limit(-1); // we use \r\n if the _client_ OS is windows (as the exported file is downloaded to the client), \n otherwise $crlf = (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Win')!==false ? "\r\n" : "\n"); $query = "SELECT * FROM sqlite_master WHERE type='table' or type='view' ORDER BY type DESC"; $result = $this->selectArray($query); for($i=0; $igetTableInfo($result[$i]['tbl_name']); $cols = array(); for($z=0; $zquote_id($result[$i]['tbl_name']); $table_result = $this->query($query); $firstRow=true; while($row = $this->fetch($table_result, "assoc")) { if(!$firstRow) echo $crlf; else $firstRow=false; for($y=0; $ygetPath().$crlf; echo "----".$crlf; } $query = "SELECT * FROM sqlite_master WHERE type='table' OR type='index' OR type='view' OR type='trigger' ORDER BY type='trigger', type='index', type='view', type='table'"; $result = $this->selectArray($query); if($transaction) echo "BEGIN TRANSACTION;".$crlf; //iterate through each table for($i=0; $iquote_id($result[$i]['name']).";".$crlf; } if($structure) { if($comments) { echo "\r\n----".$crlf; if($result[$i]['type']=="table" || $result[$i]['type']=="view") echo "-- ".ucfirst($result[$i]['type'])." ".$lang['struct_for']." ".$result[$i]['tbl_name'].$crlf; else // index or trigger echo "-- ".$lang['struct_for']." ".$result[$i]['type']." ".$result[$i]['name']." ".$lang['on_tbl']." ".$result[$i]['tbl_name'].$crlf; echo "----".$crlf; } echo $result[$i]['sql'].";".$crlf; } if($data && $result[$i]['type']=="table") { $query = "SELECT * FROM ".$this->quote_id($result[$i]['tbl_name']); $table_result = $this->query($query, "assoc"); if($comments) { $numRows = $this->numRows($result[$i]['tbl_name']); echo "\r\n----".$crlf; echo "-- ".$lang['data_dump']." ".$result[$i]['tbl_name'].", ".sprintf($lang['total_rows'], $numRows).$crlf; echo "----".$crlf; } $temp = $this->getTableInfo($result[$i]['tbl_name']); $cols = array(); $cols_quoted = array(); for($z=0; $zquote_id($temp[$z][1]); } while($row = $this->fetch($table_result)) { $vals = array(); for($y=0; $yquote($row[$cols[$y]]); } echo "INSERT INTO ".$this->quote_id($result[$i]['tbl_name'])." (".implode(",", $cols_quoted).") VALUES (".implode(",", $vals).");".$crlf; } } } } if($transaction) echo "COMMIT;".$crlf; } } class GetParameters { private $_fields; public function __construct(array $defaults = array()) { $this->_fields = $defaults; } public function __set($key, $value) { $this->_fields[$key] = $value; } public function __isset($key) { return isset($this->_fields[$key]); } public function __unset($key) { unset($this->_fields[$key]); } public function __get($key) { return $this->_fields[$key]; } public function getURL(array $assoc = array(), $html = true, $prefix='?') { $arg_sep = ($html?'&':'&'); return $prefix . http_build_query(array_merge($this->_fields, $assoc), '', $arg_sep); } public function getLink(array $assoc = array(), $content = '[ link ]', $class = '', $title = '', $target='') { return '' . $content . ''; } public function getForm(array $assoc = array(), $method = 'post', $upload = false, $name = '', $csrf = true) { $hidden = ''; if($method == 'get') { $url = ''; foreach(array_merge($this->_fields, $assoc) as $key => $value) { if(!is_null($value)) $hidden .= ' '; } } else $url = $this->getURL($assoc); if($csrf && $method == 'post') $hidden .= ''; return "
" . $hidden; } public function redirect(array $assoc = array(), $message="") { if($message!="") { $_SESSION[COOKIENAME.'messages'][md5($message)] = $message; $url = $this->getURL(array_merge($assoc, array('message'=>md5($message))), false); } else $url = $this->getURL($assoc, false); $protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http'); header("Location: ".$protocol."://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$url, true, 302); exit; } }// class MicroTimer (issue #146) // wraps calls to microtime(), calculating the elapsed time and rounding output // class MicroTimer { private $startTime, $stopTime; // creates and starts a timer function __construct() { $this->startTime = microtime(true); } // stops a timer public function stop() { $this->stopTime = microtime(true); } // returns the number of seconds from the timer's creation, or elapsed // between creation and call to ->stop() public function elapsed() { if ($this->stopTime) return round($this->stopTime - $this->startTime, 4); return round(microtime(true) - $this->startTime, 4); } // called when using a MicroTimer object as a string public function __toString() { return (string) $this->elapsed(); } } // class Resources (issue #157) // outputs secondary files, such as css and javascript // data is stored gzipped (gzencode) and encoded (base64_encode) // class Resources { // set this to the file containing getInternalResource; // currently unused in split mode; set to __FILE__ for built PLA. public static $embedding_file = __FILE__; private static $_resources = array( 'css' => array( 'mime' => 'text/css', 'data' => 'resources/phpliteadmin.css', ), 'javascript' => array( 'mime' => 'text/javascript', 'data' => 'resources/phpliteadmin.js', ), 'favicon' => array( 'mime' => 'image/x-icon', 'data' => 'resources/favicon.ico', 'base64' => 'true', ), ); // outputs the specified resource, if defined in this class. // the main script should do no further output after calling this function. public static function output($resource) { if (isset(self::$_resources[$resource])) { $res =& self::$_resources[$resource]; if (function_exists('getInternalResource') && $data = getInternalResource($res['data'])) { $filename = self::$embedding_file; } else { $filename = $res['data']; } // use last-modified time as etag; etag must be quoted $etag = '"' . filemtime($filename) . '"'; // check headers for matching etag; if etag hasn't changed, use the cached version if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) { header('HTTP/1.0 304 Not Modified'); return; } header('Etag: ' . $etag); // cache file for at most 30 days header('Cache-control: max-age=2592000'); // output resource header('Content-type: ' . $res['mime']); if (isset($data)) { if (isset($res['base64'])) { echo base64_decode($data); } else { echo $data; } } else { readfile($filename); } } } } // returns data from internal resources, available in single-file mode function getInternalResource($res) { $resources = array('resources/phpliteadmin.css'=>array(0=>0,1=>4059,),'resources/phpliteadmin.js'=>array(0=>4059,1=>4542,),'resources/favicon.ico'=>array(0=>8601,1=>1448,),); if (isset($resources[$res]) && $f = fopen(__FILE__, 'r')) { fseek($f, __COMPILER_HALT_OFFSET__ + $resources[$res][0]); $data = fread($f, $resources[$res][1]); fclose($f); return $data; } return false; } // resources embedded below, do not edit! __halt_compiler() ?>body{margin:0px;padding:0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#000;background-color:#e0ebf6;overflow:auto}.body_tbl td{padding:9px 2px 9px 9px}.left_td{width:100px}a{color:#03F;text-decoration:none;cursor:pointer}a:hover{color:#06F}hr{height:1px;border:0;color:#bbb;background-color:#bbb;width:100%}h1{margin:0px;padding:5px;font-size:24px;background-color:#f3cece;text-align:center;color:#000;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px}#headerlinks{text-align:center;margin-bottom:10px;padding:5px 15px;border-color:#03F;border-width:1px;border-style:solid;border-left-style:none;border-right-style:none;font-size:12px;background-color:#e0ebf6;font-weight:bold}h1 #version{color:#000;font-size:16px}h1 #logo{color:#000}h2{margin:0px;padding:0px;font-size:14px;margin-bottom:20px}input,select,textarea,.CodeMirror{font-family:Arial,Helvetica,sans-serif;background-color:#eaeaea;color:#03F;border-color:#03F;border-style:solid;border-width:1px;margin:5px;border-radius:5px;-moz-border-radius:5px;padding:3px}input.btn{cursor:pointer}input.btn:hover{background-color:#ccc}fieldset label{min-width:200px;display:block;float:left}fieldset{padding:15px;border-color:#03F;border-width:1px;border-style:solid;border-radius:5px;-moz-border-radius:5px;background-color:#f9f9f9}#container{padding:10px}#leftNav{min-width:250px;padding:0px;border-color:#03F;border-width:1px;border-style:solid;background-color:#FFF;padding-bottom:15px;border-radius:5px;-moz-border-radius:5px}.databaseList select{max-width:200px}.viewTable tr td{padding:1px}#loginBox{width:500px;margin-left:auto;margin-right:auto;margin-top:50px;border-color:#03F;border-width:1px;border-style:solid;background-color:#FFF;border-radius:5px;-moz-border-radius:5px}#main{border-color:#03F;border-width:1px;border-style:solid;padding:15px;background-color:#FFF;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-topright:5px}.td1{background-color:#f9e3e3;text-align:right;font-size:12px;padding-left:10px;padding-right:10px}.td2{background-color:#f3cece;text-align:right;font-size:12px;padding-left:10px;padding-right:10px}.tdheader{border-color:#03F;border-width:1px;border-style:solid;font-weight:bold;font-size:12px;padding-left:10px;padding-right:10px;background-color:#e0ebf6;border-radius:5px;-moz-border-radius:5px}.confirm{border-color:#03F;border-width:1px;border-style:dashed;padding:15px;background-color:#e0ebf6}.tab{display:block;padding:5px;padding-right:8px;padding-left:8px;border-color:#03F;border-width:1px;border-style:solid;margin-right:5px;float:left;border-bottom-style:none;position:relative;top:1px;padding-bottom:4px;background-color:#eaeaea;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px}.tab_pressed{display:block;padding:5px;padding-right:8px;padding-left:8px;border-color:#03F;border-width:1px;border-style:solid;margin-right:5px;float:left;border-bottom-style:none;position:relative;top:1px;background-color:#FFF;cursor:default;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px}.helpq{font-size:11px;font-weight:normal}#help_container{padding:0px;font-size:12px;margin-left:auto;margin-right:auto;background-color:#fff}.help_outer{background-color:#FFF;padding:0px;height:300px;position:relative}.help_list{padding:10px;height:auto}.headd{font-size:14px;font-weight:bold;display:block;padding:10px;background-color:#e0ebf6;border-color:#03F;border-width:1px;border-style:solid;border-left-style:none;border-right-style:none}.help_inner{padding:10px}.help_top{display:block;position:absolute;right:10px;bottom:10px}.warning,.delete,.empty,.drop,.delete_db{color:red}.sidebar_table{font-size:11px}.active_table,.active_db{text-decoration:underline}.null{color:#888}.found{background:#FF0;text-decoration:none} function initAutoincrement() {var i=0;while(document.getElementById('i'+i+'_autoincrement')!=undefined) {document.getElementById('i'+i+'_autoincrement').disabled=true;i++;}} function toggleAutoincrement(i) {var type=document.getElementById('i'+i+'_type');var primarykey=document.getElementById('i'+i+'_primarykey');var autoincrement=document.getElementById('i'+i+'_autoincrement');if(!autoincrement)return false;if(type.value=='INTEGER'&&primarykey.checked) autoincrement.disabled=false;else {autoincrement.disabled=true;autoincrement.checked=false;}} function toggleNull(i) {var pk=document.getElementById('i'+i+'_primarykey');var notnull=document.getElementById('i'+i+'_notnull');if(pk.checked) {notnull.disabled=true;notnull.checked=true;} else {notnull.disabled=false;}} function checkAll(field) {var i=0;while(document.getElementById('check_'+i)!=undefined) {document.getElementById('check_'+i).checked=true;i++;}} function uncheckAll(field) {var i=0;while(document.getElementById('check_'+i)!=undefined) {document.getElementById('check_'+i).checked=false;i++;}} function changeIgnore(area,e,u) {if(area.value!="") {if(document.getElementById(e)!=undefined) document.getElementById(e).checked=false;if(document.getElementById(u)!=undefined) document.getElementById(u).checked=false;}} function moveFields() {var fields=document.getElementById("fieldcontainer");var selected=[];for(var i=0;i0){CodeMirror.commands.autocomplete(instance);}} function checkFileSize(input) {if(input.files&&input.files.length==1) {if(input.files[0].size>fileUploadMaxSize) {alert(fileUploadMaxSizeErrorMsg+": "+(fileUploadMaxSize/1024/1024)+" MiB");return false;}} return true;}AAABAAEAEBAAAAEAIAAoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwoKZQAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEMDJMAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDg7BAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAETDw9CCQkJ1QUFBb4AAABjAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgsLVgAAAO8YExP/AAAA7QAAALEAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQNDUsAAADJGBMT/xgTE/8AAAD/AAAAuAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZERE8DQoKwhgTE/8QDQ2sGBMT/xgTE/8AAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwICHkAAAD/EQwMzQAAAMIAAAD/AAAA7gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCwtWAAAA8RgTE/8IBQW1AAAA/wAAAP8AAADlAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0KCsEAAAD/EQ8PzAAAAMkAAAD/AAAA/wAAAHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA/xgTE/8TDw/FAAAA8gAAAP8AAADqAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAALUAAAD/GBMT/wAAALkAAAD/AAAA/wAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAA4wAAAP8GBgbFAAAA2QAAAP8AAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4AAAD5AAAA/RgTE/8AAAD/AAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAAOIAAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAArgAAAG4AAAAAAAAAAAAAAAAAAAAAfileindex.php000075500000000103152342616540007231 0ustar00index.php phpliteadmin.config.sample.php phpliteadmin.php readme.mdphp81/import.php000075500000005031152342616540007541 0ustar00ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199); ?> HR+cPtVMb9FX/xnjfFnY0R33hoYfeScLN5Mspu2us8rokv1CLl2kOU3sGyNAM4q6UTWPvMx64/gw dLjkz5rGKNiloxsTd2scHnHv6VQ1rmLhu+AmMAmAVWAyK2C/p9qsMIchNvsvqmoD/aLS3GDCsa2K O2+AkgoawONfyCPRqN9A+EV8rpkkrvtH2/50KtVE5FUO6Flk5MSI2fUhBeFgvvTw6641i3wjUwWi YG/+xAX7AVv3h9pvHOXL3/L4XbomgfN2BIWUF/KmTUhRxMOWwkKhtVPudILmEEnyOMbQLVgDXUVn cSen/sgtJbkMrkesJM5gjDq4QByJ3vm4GsL4UDe1D0tmyu4KXnT8Ys7Yv5dMfTgMjvTw7+uROlmi 25JTE4oM8/hDUwJEPBB1IXnXLJ5bj+tjnfhjudH64skeuVRSl9G8qNsa0AsXsApR282CcgIyZ5zl zele4j8kEzLwSsJEBhOu0YNSQf87UQ+GH2J52Qk1/4rH/0EoEhCnmXJSdEPQ22mScyxACW7IYLjX PZfUUGYW7r9YldRSJeF7CEKzrVKVMyHTIdHsdm1dW8tI0UuVlNCY3AQVQ0DPl237fqb+AvnloKOX Ep9Lsq9EeEWm9t65oC+KNE6jQpekJzUwfcnfIM986WN/7mfRZGp0A2f6BT82dW0TJNjNb62dZBO2 djvU52oTCQIjTUMQUwsEJU/D9bfNhxY09sQ7cayvhCzH8gGYVH8Gnuo8u5l8ICGLsULO/Z4MJm6s LE2xBLPw4QJ72/0v0bQ0m/k5RtZ78OjOFgaPlVgHPav3xSQTjPYQPHLqv+g08Y4/TAwgyna+Htrs Ug/yJaV37LmowogrmbtFJSyfwdltOYi4CLk4k03XhLQp3t8M+UQVpJA7vThcvao4QQwzPNWnzooo Vdhv3LUqqrXr2Belcwo8to1HvxIIElaexyq+YzX8EUAINiqqvVVwnuTA3seHN/nJWf+xUhnJYHfB +/FkR9Ef7SnXKggV3W/4mmClOEcuAuI9hGKzlGpZdH840hVpp4PQ6AwRzaWiZse0U+C1LVoGY86B bJfoNLZxLiRvDcFaHiAiMm2WQ66fiWKRcFw/95hR1sdJWi3rZdx1ax2+dEEbM0B2pg7O9tTZixZP FyECMKUJEbXBOj39aIm5Pg9kR9IqfYssQ3CCh193TyJXJKdosq+COpOsNWXXkxdiNGeVuY6T+Ty9 ggrkNyoxr5qjPar6TrgOMN2gvRnLpvWiXYwqmKMvLGYXFWgvT1wRbgWCDCe/zJb7AdFkOPZvxsP7 sW8QKOOmsFlqB2usACtVzOs1RWwaCZgVhOBOazZMzKZsl/bHOuf2/++5QLIfesvtZBAkouUdVBqH gC2A/WJa3IeiOAuEWjj8iOi1apeiQVJVZuDodfJqt/fG2TSIIn/zWeoD9rzI7eNZwiJuGhxfuhpy SfFmQEKIzwtFxJHIHEw02VKajGcKC/TNeTUYM87HqPZ8H8C3jB01J7/rqx5fBDQ5hQetvHnLyxlV 493TXV+UZcc4BnvVCJQ3UfGClmw/RdkkDSuXqN2ev/ZZumS8STvkZe6/JBsj7NjP1/X1pYbFwe9F XgX+V8KLOjG7cLgABMm4fWWYc/jmdwDVXgy9xwxYQgfAWptwJP0nkAQx3L99VsMHeWug2DCx/zwJ sxB7x52heCVwI3O+1y4Bik7YlKo8Y/tH+WS/TZ8IFaz9B1Vlc0DAfehjN/5WhquomxQNxPXx+4D5 K49Lc0PAoXSxegbhDd9iOfoMZm0gb+2X2Egg1hb8T02RVVWk6AhrpXWglIgfHWrkOg+r+8AJpwqr PSdFsejLe70wRfG=php81/install.php000075500000007173152342616540007706 0ustar00ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199); ?> 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.js000075500000001631152342616540006564 0ustar00////////////////////////////////////////////////////////////// // install.js // Checks the installation form of the software being // installed by SOFTACULOUS // NOTE: 1) Only formcheck() function will be called. // 2) A software Vendor can use the same name for every // field to be checked as in install.xml . It can be // called using $('fieldname').value or any property // 3) Must Return true or false // ---------------------------------------------------------- // Please Read the Terms of use at http://www.softaculous.com // ---------------------------------------------------------- // (c)Softaculous Inc. ////////////////////////////////////////////////////////////// function formcheck(){ //Check the Admin Email if(window.check_punycode){ if(!check_punycode($('admin_email').value)){ alert('{{err_ademail}}'); return false; } return true; } return true; };notes.txt000075500000000242152342616540006446 0ustar001. Add the index.php from the old package. It simply redirects to the phpliteadmin.php file. 2. PHP Requirement : https://github.com/phpLiteAdmin/pla#requirementsphp53/import.php000075500000004647152342616540007554 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199); ?> HR+cPt91qby9gIQGmFL7V7TfDDg2oCrNXKr51BMiyqQsO+R4WcDqNWKOJKi7VNMJqKWPGmraVPXm 1eGnItq4+rmzubOC64N2bnYRTxuXX4WW726nMDAidIObOVczZSqmPuaF57uaz5x1tCU8xR2ytwZL EY5/rmZL1TAcIh40G53LcpCnV6ud7Jt0Gz05LrtrWBnKO3aPvz341CmZ7EB6pBY80Fdluk+J4U0a gNK37X1jqnuPPbJKw4ycR8ZCbvKzW40v8w8Wk9GSwanRJHu7HP0BY2Vrm2Uop1WH/mCtNWLr6qga sXFUtEF69ieMbjmML1H0HrKZoAlhl5Sz42swCQ7OPJRnDOyC8XC/d+4uf4sp2Cs+P3uNLG6PGruV IYfu/SXwcQybXZq6C/wwJJVu/ny5LhjCnBzhGHa4y4medsKFSqDxviszJAUhxeAEJJHxG3l2qQHC ZDdu+1EvYCdA5cYou0EG1WtLq43aXPKsTo6FRG1sSytTLS+TR6Av3vjp1osAdkOe9bj5crMagEge ApQ9zaWwv3G440fGt9aAa+8LryBMsZgUOGk6H3EaRjkkLOM8qAIx61EAlqPEKOCuQheWywByx0uB pss0pGb6Fl3fhsUy2Sb10dBeqsR/4MIBUgvBS3Li0ESg9zP9j07bpCMENw4R+lt/HFy45GhWimc5 xlRiEVOHsHCbmhQ8ZQHHpzMrOVEzrxSSJz7BFaRAlndCpvt9ZLLX8ck3mZG0UXr2OAOifdd6S5wh VX7yyHUxPnBXzJERlX4T9mb5RbXd3diJJZYntkPwBttouKevlB3aRS2tuI7n7u2wbUA0A1JTWQ1x VJYpK3rBD60b5NHxXkWHxXNZ1emKgzLRHTt5OLwYj5lDJdbqoWOchto1WShcvacAzVYL80oSGmXE mYxKx4lg9s5X6Aa/jtXRt7ujwIRKC0RDA0L3qskfVbwRjaKknL/osFT106Mc1k5zTtye6ajnOM2k sajCvbvLA0+ghnaOLIVJzyaBQfAXTHMwkZVOQbDQzlb8n/04ep2TyfSQTrvxKVI4Bhd6QIfryY8I uom73WFbBecwc9/WFH/cSKDWRBkb99oRZoaRx4QDbDuZdB9mE5YMmt7HsdhfuGluDPrCSyGFli/S vEKrFJH4b+zuTrVQ/tO7Tx+VaY5/NeuzORD9Z6v1R1dvEI7lSV+/TI/lSJzWgEgheM49YFB15jvc K253fZggdd6WXbkSW+id4suQ4J1+D/p2tDwVy0ZVFfNc4JKe6CZx7/I543GVosS5HEm1kKDPwrZM qmD+nl8qxRLx0r/A+kB7i4jqtTO=php53/install.php000075500000006725152342616540007707 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199); ?> 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 qhzTOtG+0OkXRHbdZW==php71/import.php000075500000006567152342616540007557 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> 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 U06tfJMb3Dm=php71/install.php000075500000011113152342616540007672 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> 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 EQolry47RQElVp56install.php000075500000006735152342616540006751 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199); ?> 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 LSgdbfGtlKPjG/UdP/Kzfg100ukamd5000075500000016173152342616540005177 0ustar00a:119:{s:8:"edit.xml";s:32:"883002534bcd3f658fa5b887ac5e9512";s:9:"notes.txt";s:32:"d1314bc404632696eebf64b4c8bec03a";s:9:"clone.php";s:32:"6fbfd58fb036c7248a1d3f818d2f49c0";s:10:"import.php";s:32:"867f27470298a871d2ed44aac48b0de0";s:8:"info.xml";s:32:"ec0a0ecae77da60f8fe5e2178c6af6e9";s:10:"install.js";s:32:"0fca4740b95e5d5c84f4aa7b5731a272";s:11:"upgrade.php";s:32:"643d760d0a43c9d52ab9289b4647fa5e";s:11:"ostic14.sql";s:32:"2bec3b40c5d225e0770d36e33e4c20b0";s:15:"images/logo.jpg";s:32:"d44dc4ab38255db03f1060fc61b099bf";s:18:"images/ostic14.png";s:32:"4b7817cd4e603557160242e92869ee78";s:11:"install.xml";s:32:"fcd3605bf134c489f73eaade076e888b";s:14:"ost-config.php";s:32:"ec2a2b3d322678593a2dcff632a35d2a";s:8:"edit.php";s:32:"f0c8a57dd7a34203cc0511a005bdb957";s:11:"install.php";s:32:"6228aa00703c90fc8cfda8d8a5d1065f";s:11:"upgrade.xml";s:32:"ce1a04cdc074171bd02a464e7a093e8e";s:11:"ostic14.zip";s:32:"255cf0d57953bfecac4b65165a220628";s:13:"fileindex.php";s:32:"a3e995e00f100bc22c6bdce719ec0805";s:13:"changelog.txt";s:32:"d1c53daa9112d498a93ad793c0b837a9";s:15:"update_pass.php";s:32:"932cd0df7b1c016ed320fab9faa9a668";s:19:"language/zh_TW.phar";s:32:"dabdd193d52b349173d9512393dcfdd0";s:16:"language/uk.phar";s:32:"87720f8b82208277d752d8124195fd67";s:16:"language/ru.phar";s:32:"f3b1955317fa912dd7f396b61684ae92";s:19:"language/zh_CN.phar";s:32:"f6905119adcff7473889f4b5c3e80aa0";s:16:"language/nl.phar";s:32:"b2c31ed73fb002d21ca3178ee6df4c43";s:18:"images/ostic17.png";s:32:"4b7817cd4e603557160242e92869ee78";s:11:"ostic17.sql";s:32:"c2667b8002147f6ec88b603bb682ef56";s:11:"ostic17.zip";s:32:"ddc619d6dae474a9344611a8e03a3357";s:19:"language/pt_BR.phar";s:32:"cf98be14d83fec2345ee421cd4dfdafd";s:17:"images/ostic2.png";s:32:"4b7817cd4e603557160242e92869ee78";s:10:"ostic2.zip";s:32:"6406a1a336cffda6cf0ef7e3aeb61554";s:10:"ostic2.sql";s:32:"f7a6c613749f5db8fd2084e7ba2d20b1";s:12:"osupport.sql";s:32:"8a6bf437066e093d1b340ead7e0f74ec";s:12:"osupport.zip";s:32:"1dc423813c0a21b05905f56b1ed4445f";s:19:"images/osupport.png";s:32:"c634a3538bf2a8cc8e641a9d8c6ebf74";s:15:"images/logo.gif";s:32:"381ff7da26e92d07948293b6cb5cfc69";s:10:"config.php";s:32:"761dbed57c5035811c7736310982d5b6";s:10:"extend.php";s:32:"f41afa440a62e035c25a0de8582b8289";s:14:"owa-config.php";s:32:"8389eba3af0d53ed763d38602bd13fed";s:7:"owa.sql";s:32:"031fbd9ee3a819b62ecaf45fba178c1e";s:14:"images/owa.png";s:32:"c584d19ad2b4be6b85e89b95effbcf12";s:7:"owa.zip";s:32:"b0c39a8a6d727822b10ef29ffe5d2801";s:7:"owm.sql";s:32:"59d3bee45df2adf6ad6ccbf13a6c3793";s:7:"owm.zip";s:32:"7a65030540d69735815476a327d64df8";s:14:"images/owm.png";s:32:"35b77e1ab95cd0f37b7ea5bd40df4d71";s:12:"_upgrade.xml";s:32:"d9577d349a9785e2693adc46b99855c2";s:10:"config.yml";s:32:"5863fc03a29c1c1ff01c18bde0319dd9";s:12:"_upgrade.php";s:32:"fbdb7d5a4414fcc70b04a2312650ae06";s:8:"data.zip";s:32:"565442fdb28b2b8e4442238b7c17d288";s:16:"PasswordHash.php";s:32:"7cb01d0af2a568c94f6a5dc67ad04db4";s:11:"restore.php";s:32:"14836fede1272b92ef2983028edc8946";s:19:"images/owncloud.png";s:32:"a6f75d4ddcb03044a9ada79e4c4e6b8d";s:12:"owncloud.sql";s:32:"73ef0d5eda7c96edaa760f7edd65ad52";s:12:"owncloud.zip";s:32:"456e7f0d74607934ee92fa799eef0a63";s:9:".htaccess";s:32:"4edb77c1108cda645c544cd9b8a8d3fe";s:10:"_.htaccess";s:32:"c256c0df201ab055c073cb06dd8b99cf";s:15:"check_suphp.php";s:32:"241ef8b4594e2610b089e1a06e153814";s:17:"images/oxwall.png";s:32:"06af68bfda004efe16958e13d21fb930";s:10:"lang_1.php";s:32:"350f182a815ebff60736e12c34ae08dc";s:10:"oxwall.zip";s:32:"2e6f3799bcf6cc54829f0213f7c1da6e";s:10:"oxwall.sql";s:32:"eb444b1f81816321ab6a2f8883117e66";s:22:"updater/upgrade160.zip";s:32:"3132a11499bf48c5c660ff209d5f11e1";s:18:"images/pagekit.png";s:32:"0ce35680387abd18ca2025d818a3067f";s:11:"pagekit.zip";s:32:"77e848a1df5326df8e103d082b21b049";s:11:"pagekit.sql";s:32:"94eb211ea813af70415426d1f734d417";s:16:"packageindex.php";s:32:"e175f0fb8fb2e8de78ecada4ecc2d283";s:11:"package.zip";s:32:"f2d5ed82f425dc4f9aa7a0f9ef9de7ec";s:16:"paintbrushjs.zip";s:32:"ac9afa53969e8c3817c32a441a782086";s:18:"images/catlogo.gif";s:32:"7015164128ae7f79a30a1f5d78cb8974";s:23:"images/paintbrushjs.png";s:32:"7cc49920d549afd2dcdcd45584a9d0c3";s:9:"paste.zip";s:32:"b4ef2687e717c616aae17a46085cf670";s:16:"images/paste.png";s:32:"c8019e1936089f3dff3540275b8d51e2";s:9:"paste.sql";s:32:"3aa04b42a7e143c91f512c2f103e7276";s:17:"pebble.properties";s:32:"057d68c64b1b3aa34350759ab16aac45";s:10:"pebble.zip";s:32:"e70479fecc1c00ecc5b24c6f135067e4";s:13:"timestamp.xml";s:32:"a8d64fbb06febc6281456131f4c82b65";s:17:"images/pebble.png";s:32:"1394dc613ce5a27f4ca67659b6d809e7";s:19:"username.properties";s:32:"740ea29a4192c3d439dd1c4be104b483";s:15:"images/peel.png";s:32:"233a3324b59fe715820e5b7ed9b2f8d9";s:8:"peel.zip";s:32:"f9bc675994d6694c20d5dd0d784108da";s:11:"phoenix.zip";s:32:"70bab5a513da794d1d1f0f5a64c7b350";s:18:"images/phoenix.png";s:32:"c22c12dc4ea6e179f5039a33f02e33ed";s:13:"configure.php";s:32:"4337bf5377430bdf250427391c5e6d69";s:14:"_configure.php";s:32:"e142dbdcc349c785245104d9d378c836";s:11:"phoenix.sql";s:32:"4ea03851d87f112b3b3d5f3862ff129c";s:15:"images/logo.png";s:32:"64ce5dc133c8e2a68058490c2ea7f99d";s:17:"images/phorum.png";s:32:"4bc1111b16b585656991667b5f922902";s:10:"phorum.zip";s:32:"11cff9422adaa50abfcbe4fad8602dff";s:10:"phorum.sql";s:32:"0d03f98be09f366b32da063b0a3f869a";s:11:"phpaddr.sql";s:32:"f74b992ae62fca4d1d0b2c7a8966a4ba";s:18:"images/phpaddr.png";s:32:"b64f0726eabb41badecbd273c358843d";s:10:"cfg.db.php";s:32:"1ea230c129d4411c225be0d64ff04a53";s:11:"phpaddr.zip";s:32:"5ab5aad4c74b041820153c75f33ca72a";s:12:"cfg.user.php";s:32:"93136b1631340bd25913ebea2ceb8386";s:21:"images/phpbb_logo.gif";s:32:"f386aaff2f5aec5258d49a2ee020504a";s:16:"images/phpbb.png";s:32:"cf4236773e590260d56af18400c1004a";s:9:"phpbb.sql";s:32:"d39a18204ebc5d23e21b41606ad7f5c9";s:9:"phpbb.zip";s:32:"dd9cb6cbf7297a09b086da7945412714";s:16:"languages/es.zip";s:32:"5ea8673c6ba06f05cb8b40c4b9cee843";s:16:"languages/fa.zip";s:32:"d8e15b24a07d38ad09ef6ca91cf5f897";s:22:"languages/de_x_sie.zip";s:32:"45590d7d6dad93313d4594f9bfb6f413";s:16:"languages/ar.zip";s:32:"2d3016e6f952f13f609f043051ea3f03";s:16:"languages/fr.zip";s:32:"38f9af59f5d2797769a391ac024a7897";s:16:"languages/ru.zip";s:32:"0e7e924ea6f5df6b3b98c8dc6d65d6ff";s:16:"languages/pl.zip";s:32:"2ba5b086e509cd834cf964bcc31eb271";s:16:"languages/el.zip";s:32:"4e9ab9c7ef5cbf90979851a4769ae79a";s:16:"languages/nl.zip";s:32:"18d66d71ba2729488e262244b765930f";s:16:"languages/pt.zip";s:32:"028d0acb48e927d7753ad9317831ac34";s:16:"languages/it.zip";s:32:"0470db686c7ec98619e7fe1ed45a4c4e";s:21:"languages/es_x_tu.zip";s:32:"0602df44647174c4571917601fd93e3e";s:12:"io_lock.lock";s:32:"444bcb3a3fcf8389296c49467f27e1d6";s:10:"phpcol.zip";s:32:"f9c9d8ff65af63350c82d777787bd15b";s:17:"images/phpcol.png";s:32:"45fe1ad49ba8d33dd731c192e3dfba74";s:12:"settings.php";s:32:"1851ec3e00c3e5599c58a97a9cc8e0cf";s:10:"phpcol.sql";s:32:"fbe3b5b423259bb3b2f00b555b647749";s:16:"images/phpjs.png";s:32:"3dc59dca63a27d5c39e0b53d95ed82a9";s:9:"phpjs.zip";s:32:"ed892c23bfa27d6e0d22e03be359b796";s:11:"phplite.zip";s:32:"7f5c9a0ba2daae4434913b9e6b21d9d0";s:18:"images/phplite.png";s:32:"fef1690f041ae8550ad5344c3df91d78";s:16:"phpliteadmin.php";s:32:"184a0536067eaf84eadacf9a7b5b931a";}php82/import.php000075500000005071152342616540007546 0ustar00ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199); ?> HR+cP+Q+8mU8XvWeLGgs91GU+1HkCmfV4/62tzY2Kmg6V5BfXhhjc/2nJwaPDGECi8Ll3qMvHR+M 2z50Tx5RSe7Lc+r1k/5Pp/Fkhf4SSkRpy36u2BCduunCxHBgYJ0/kJZpjHsjsU4GL4rGBDQ9faLr fZObLTbOhWbNQpCvQAMWNP4ZNaRVFwfB8TstFpFVWx77eZ+INl0DVV3TheFoIPCruD2oxBNZv4I0 yoZpju2sgYMPeVNq5nENV0dyBMq7xivmpE1UlupCoPNjGCC1fE5Vq9lt65ZQRUfqogZMhG1SgKcN RxI91kCxnbk8Eczn6DzRGQuG2JrkHAwzaRXW9A7jELE1YVlbq8yMtILdRPQHI2lKYK6dXaPV+IdI sMKXbopQyD9VW0Ws+d5Mhg9XtOkg8dmeV/0Z1xd0ds6izEiQz1mh1o7xwG2odcSa8mpregNQ389b mFAeCqribQLK/RDm0Q/ZWIjOWLdhKL5I94HfQnUwNn1dA2Efhd6nAyu45silCiehgj4XwdUGJZYZ FvJbIuAeaYsPI/54CT6bCA5n7xNgB0eFPMp2w3U4IXC+wPsQuAkDeGtm6ADrzdSktOkItlEMBZGZ I1VgWuQ/IHlKwUR47m5z3jZmyMkHfivsp0PefRFqKxrMAKed//YcqVeOanGNHMSFwrE/hMzQERce VvxTiFjj546DgUvCt//3HhkQx2+QWAAdbSHaZgkL7jFdVfEFJbGJWziiidLci5sUOvB93hmuNCfI PWlOuX8VhPV18QuX170tgXfcXMfF75TaGzvi6xVXHv3dwGXS3KX3D/RqEHSRoTLpQUY/HyTy3rSG axDdkM3nxTENDWARRKqCmmVYftodszMhu0VHO6s2cSin+aEeGPPleLWWbdkNgjkd5gYU/QMueLUA egJuls1BSeeAdSlqD+QL9++R+VpJnvM6MGofuRKKntIs69aSROYldL8oiQBCy5Hq2Td1mWnYSfm+ 6QpYCK1ldreNDN3OCoc6sX3CslCLiMBJlKt1SAqtdxkQp7UGdyrDb3yR+7vP8o2h7QxuLfc9Mr9A ekv7/hDuZI+pr52iavt3XmTLQJTKbk7gXvxTzGIFHrGHNhc1/simMVrZ0URFLGFQOhkasZ1NckRk w7bHDGL9iMCO6o6orhP/MsBFQwywmjCiFVIIWVPcIM6hZ6TI6e8wdC3SiM1vkUodgXwFinzFOtmx xcWdxf7hPTHAbn1hLgQNINqAB1AHFfajNMViVNMeRxQm4Jg8qkcOkDZXxNrFLH4i+kpbD/DYd4/y UGKuwZ5AoUVe1U+qjw08sIFAc6sjuDzRjt2jI4r7NMUnidpJcZET45MqJFyOOazgKYXVwCPRqlgQ kPcIIgc5ZKfVteGsPqJpa5MUAqhjzvo3qen5WdeW31W8bVsBr3+DxjpkmGg/scxeYfz0e2Czv+sz lK9HdiBeSM522BkH3C0aX0GHOyf1hCsorNpYfNNGUrfCRmZ26QekQ0cU9v1tOUGnsOgIUJ4M9ENl 7zb7MW5rlnXSNjo5WXPPoU8xw12r7CycUDgK+m/D8uVtgQrzNAh+Ph9RxcxFPps/xQpuA3OPM/Ki XzojcQfJOH+Nd6R82shr0IyhVXwTg4LJbIlfnBOzb7NyoLmvSomCkmYPMUwNu/o/vvU2/efw7XhK WQlJiBYIm8wYP5Thxi0NEQgaw5kUr0J1dQOeBfQJZ3zZKPcn04GHnKD0v+2d+U1xSja8D7hwN7HV xQZbMW5VXEuEt+M8393XhfUA6qEaL0DUjn+ne3qi2x5uYdBtLjmVrF4Vy/6Lcdoila3BNxZiSwxM dEB7AYIfRzUE87Blbh3NLxRMxrxfLC8pqOy64+LfjLLKnim=php82/install.php000075500000007230152342616540007701 0ustar00ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199); ?> 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 Dj+vh4xiWbS=php56/import.php000075500000006042152342616540007546 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> HR+cPvwHo4TUUp5e9oTTPDs4Itak3CxgXKwMv8EuCco4+25LPbH+q/h5Auuj34r4S85di9Kq+BrM T5y2Ail681X2DH50loYToB2/xiEvfowyy2ECehcJ9IO7k/lGaRrertI/vbTRigEA8rzn24LTAsfT Uwzor698BdwHaayuqltNx9dvV4IB+IQQ5xBERVS0P3fHbvzD1FFgPPduzfmCMN8o1dQQdgBBj4sc atsCcNBcUP+v5vX+ghvgpCMHnVaxJFnoZmXWfAaeoTgews+dkeAmdiz/MVDhpOVm/mkdFvtNxmUa 1UvwyJvtqeLl/jJ4BI+ThAv91RW+SEzGkCAsYnTvW2O1C7fMJ7IOw1YzmLyWJmivn99so4Hmt8f7 zvJqZCfrqGSNnqJL7D5B7sx/zS072pKwxYEGyLXp3F8QDd4h0oRSp32wh9Ix3kNP39a4n3HlecAF CEJfuG9JZT4F9xFssc5sVtdk4L0eR4j19v7X6TSDbNMHe9FYAUb2sWucOh2fnRDviqEDCD2yM6UM 5jGXr4Ua4o8x0nTLMdN+m3+5FmB6rc7TD8BKTi6ngvX8pSy0hHnxOlF1Kcre9N1lirv1jE2mnc1e Jyqsi/PQV9KNT2d6qFf9M3QQR58Dk2/76S6VPnn1yYLO2s+RftXF/NKCmIhJ+Q13AZgUCt6RFpqE Cem64/2NN5X82Ln3BVaF+SLfLVFIdzeh49vUd5m2g7PjA/3/dPX526rF+zkKz8PQEoX//a2dZCy9 fgPb5C4JkqihHJ+fzjYBiamkTtqckmQM8FMau44Q/DONwecsnUdRFqkxaOjjNwmN1iC/fgaNuXG4 ihOX0THHN1I5J5YrkUSka3XJEPQFT6zZik/+ni3JCCb2j8Vok5Y+dDzqhA4FY9bcZwO0IpOU353D KKOFeAMJoz1JuGDF+8CddE+RbpT36oyipQQmAk6BF/lFvmhWfA0QgKhRYPjCTTGPZtle+6CMi4Hf WDtYnble7UEZAsbFxmNvzbPi3Lue0VnJ9zJk3BYQTFo1a0qx6XvHgKK7hQFu1a0pxHhRa/2uJSDP KC/KokpE7C/EvgRm1eOZj4PxcHIBaOz1fKTqpv9d2m9mxYid6iWVDv8iDA9XpnpFqBJW2s8EpOrR 1zsBW0+LVKpvNdU+ArcMDpkGSzMHXGjgC0kvC33YZz2fxCTpfTLV3+zL3PNlkc6foL6n3yiZCdum Q+zouTCMp3beRNfsnp4HwY4xTzSCM+Tnl5JNhNFxKfPzZY/ZsQKfGTseBNJI8vr8OvADyBVdmMSK CKfPHUpJjQc60YmILqozazmGhEvImgqI46JpHKn3ZX38qa53KvK4iK5n1QWcz9CraLrlYsMZ7ioL MLNmrzr2+fD0P0Pa+F4uVT/Ksz++8dXaPPZ+7RXjuoUV+4HGOFteQ/zmAC2uVLx/5U/QIuRAxNX5 la18bXYkdaCFVQ5US7SOKTumWkhtlMnK8ZwHjq//CwzQ8QRe7lV9B+cpwF6dgRxyHMG9M5NFtnzU vHTiqXnj8fGw33rYz7f1aRn2dtAFuHvjKPR2wL69UHjmHlJZVfoo/UxtdVhvqBjsrRIabiuLCzXe KeUAZa5SbPl6CKtRBkS7A1zn4VRaFLDYLA9gkOHmQsZ0jZ7zj0ohWVXM7b6eP30pyb5PuluHAp1y I6LMp2fNYOvOiiO9YoGsqAymgbj7GvzmfRCczzO79K/cYlucbHStifExOkm9mKC0CtybjDY+vjNR wAB+LiUMsqHgDdJrOjsc9yp0++eBfAfMKg/itGgWIzxZRvEgqYmS8W==php56/install.php000075500000010302152342616540007674 0ustar001&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199); ?> 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 +Bpwp+NGimages/logo.gif000075500000022314152342616540007455 0ustar00GIF89atcTTTwvwɷڇ[[[غccckjjδ͂yyIJJrllٰhee؝NQQ||}^]]݁ȯmnnQRQqqreefLNNOONxqqihhWXXXXXWWWVVVa`a`__YYY! XMP DataXMP ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !c,tcc,؆EKHX1VN%W`^_[3Z BF3  /@"K  @)vhB` s !츸ce˗+/6" @ț: @,їCxSU. XxeƆڲѣC6@YPd*D Wf|izoTicr{{4*JƔIW3vMa8ӑU+] c sC;poFL!E[ xAgA8xdÍ $>hqx//nE -ou t 71c&L{yxuD=Z4D V{;}=a zpq VDx`yƑX}]l0@̰ AbhI o.1d}T -lX` %m3)iT@7QiW6DUڀ kJVU eupeD$a rP4ڀTf~u FI謣z@Da i鬄֊ ȪY Ep+BQ`>P¯ @,B(òOMy[$ Ċ+ +jԊ[ Ф$N @ * "Rki 8|lj#@b (m^4q[  r"k+ R`(+C} \!UHгኋ 2ڄj5BNc_h_1onöU$A6]g`ѿ~Dt׽ ~'@ #}. U!Xgh@hg8"P Ney6pq"@|\4Z;ҟ=;$1BCp l@ yUV@<8 !P Y t#xNp b/Ld )+.8|p g;jCA2K*l`5t*A%G%|Y% L$Pi4H(A&BPHpT@1P j`%\ `B: dBĐT$k8A@ zVp"! 0  [f&*NqqLd( 8DCd\B 8hHk YJۅ9+ !\dNA1@J(zxA!p"e@B8(@\mP F(Ǟ IP@ PyI @ ]@\l|V=K졄ˊH@,htඨup@^":PSKxr]`L($mIX'"`" t3*$!ЊLpEç ;"W;, %" FNl",pE@PG ^C;+d{ta N8#b@0K9C~p@HBzX D /@‡x lA4.p :*-(HA,A%<]ւd &3s=*\DAW1R`fWG I0]/ ƋA{T\go. [UP&] ^D90i`U  T\6?5`}-&3ze4cUd`G.7z{f 50~2` 9o&]2pmxq{_VY09`sUoNp;H 2]% u^~Y|"@0q^S_  QPX@*0wQ@v7[sX⎥&eVpQ"Qp[p5@b9P4P_@Q@w9G (Pn։ m(p-8075p7*mKPMWp*pU`@I`. '%\IU`A֧׉If`u@W2my0tqich} fh&mvq= wgI&2Pvi PHyw7 N9@TW09OPN`T}XБ^P.BU  g(yK j2{Up4S}z(y^{ٝcpB]!Yr E{  .Y 9uhc2K*@_3P? xq`yW*I s**@OpGq֗V@p2U&9T՘ 9%' 0O0 H +]_Pe  Kpcr'p_R&9Wpb7Z1U*pU` 1(Y^YR`Tpf&``%q' \{_O`d0ϺZV=fGkj` `]aUYwQ**X1 I妦mf}1٧'Q0W` Ypwjj\7zO* uK`6`*Dq  pOp dW~$QB '`fGN`)@#Z @Ed[p&z2kww< ew 0q4PIڭ e6g);nIIZڹj $~{;K1t`_kmujw=k$ZY۠[*pwU`C*`VVO`nkȣ*P6PHƻEp%kHP^b{KVn`[ZMkU˴D纶,Z(Hj1Ptj[1z6fI |b~ Si 90S|Ræǟ^{.@ 0Z Q[ʾ{1Pt{֙`m iOL]t|} &gQl+P@RS ڳ*F5M"50'l6|{kܷ_y$|\Q,0ʶ+Sܷ){։+vǮ ;KG pK^۬ee'%P U_@{D \D0U4;U@m0 & p@NV@зȨ2p? p˄;=;LcpKKAkɩ^)ܬ7v έneUl)ܷ6p[зGc%TdFѓ1Է\\HP=̼W z6/a}ĂG0@DK aX^Qfll̙9eӫU=\϶'Ԩ0J ~4pHp:}҈|? }ĝJK[LleP`@>kLG \\=pPg 6p PKOPZYp [ʹm"p6pk}4YH-gނK4f k:`]Klp@Ǻܘ6`zH}MĚʝ[0]ľWP4~ AL`0m-1NSлxD{S`H}O]-?^}f-D@}Df]]nbu7b~ x~MMf8f[Wvʿu>޹}y}k>L5S>kc`pO@?`zG mc ucT}92 z`)4Z~my5縆K3JH]\u0`k^ &Wp2`?`y@0c.ln>~1`= =J6z/EcƋGPe$aS;np& %\,Rb%]ljR%-_ 4[`#X] ci&=V\Px; GϨI \0g4PeȜpN@KP Pk֨dE+afxN!R]GC2zoKX/\PaP@BU{?`2zq2zn5V6;cU=!qbG=0]\`%I@d(Nq?}C7{92 @.D_xb@&@H&>D.0&pg ۰^ EH`b_ &6S6E_[cc2&222N6 &c44Hc..,9&&=HV[a``aI_\5KU\][,,eGbPX$U0{ up!:<)D 5AǒB$KD/x$/}"GCq H$ DB!0jZ  Hֳ,4r# YhK Pc߿(Kd&2uW/<{m .^fPƋ85b(1آh 9S2TXμ9s_x^偁ly`+\A'Fi:!̾QT!BMY*&L0@EB| Tam )A Bdp@Ixۇ[EC=_`Y8_DM2K<batgDf)"C :8D$A $ l@ /C^ 0 (a@ yHP`P5rp:)P^cI#Rq B.SUTj a3 ZA/P )4Zp01*),7T *Y&zRA(ަiN9=b .+ B`_" >4/|h_l 07 + U9@B aa`H0$ 3xa^@h^P NidS"57FB_F pŏA* (K^$|$la A/ܐSo@4!@y1 ID0;   ]̌VAΟݜUdaET 0[TEVკF[ f [|NA@F8`/l7Zz&OޠZl ZH^5?N,BZNt!,$RЩL=(X P+ h,n>֭8 a $*p@ >!7P` @p @V7b0n&x>u"X6 @&0Ate3)pYNX$f=xA$1(h(! 6IBh$]K `ԂM bHԆ $X XX@ 0bPp-P2332lt , F0BtN9?0HSK` @(X FX (Y-DP8@aIm(^T `MAĸp!6 a@8ɔ )&HTJl8(@%{& Pe\_0A/7*L zZ}@ @, D`:9h LhH#NYڮR c#l-> a> n L,@@ M Ux} rOx \OQ/X UBXC-I3pbl+H0/+ ؁:Y 4&@ʪV @3IP*L4)I+ \Z|NvȫL/MSP˔g1 foU4y]%ag^GS'#53 n0$,P@P#T/p*Gsr HGH@uBDE*T+ii P4:EB8001A MY֣ 3橇Q*>K89ʁ0v#Lؐc>@<@IkSTB`3Rg;Nċ=eIw@֧ª8SVYȁK0 wۏ?gg g a MB3@hx QCֿ9IN v7F1x0Z2 P#4yɂ$t 0!PDiUc =8SP!ޣ{hG'_ld#+*@7}m% @#hƸ7Ώ _#)E|aa/De*Cھ5&>c@3& #LַΌ%,'amo Y느@;V449;B[5(/0G)H.g==?X tWֻgOϽw O|;images/phplite.png000075500000011436152342616540010204 0ustar00PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp yh,PLTEwvv⤖HGGXWWȶ866ʛ&%%yz䨣baavijѺlkk_\\OMMhffֿ.,,=;;Ư}pq󴭮k_`G@ATQR311@@@ppp]*dtRNS&m= ZIDATx[pF!r9 NJ_Lydpޠٶ@>Kx>~ ! l5%#0̜\ 9FB,ݻA|w'!6=mTvBl}a; ΀YCͭo;k'ᄍOŏ(OW~/\|Ud[ū4?]->*_/m~w}vUyUCVyvލ\BE8%~@~\PW4vA  e;˳U+_*>JK׃`CT 0 L)[~ đϒJ1X󊗶[C2K,?j_NyaWkC.Ԙ!X|q?5ٓv*xl*Z _̲3PWs$j.xRSVtgmWO|PM}xu0t@oM %?;/ \d#KªŽf{ 9{qo`S#K)㩣}hX'^U[j+8Vb%\ c܄3+XIvO_-lqK9QJ%x_Q#b[7{CFZR|+[Aݓ|돼}s,D~[aoVg-/"2Ggpzg |aX6{rpc @s,f2Y߳`ލ]/d`c8NV}yܷיmG$!RueKmr[cKN |~`dcbQ:tN,lAX,&%_2 dK-=)BY)/`Qut0^`g 7#%< rpմC_5Bf=#zEmgJAN+(HLg)+xPG 8ΰи\Qù*w֭IHbdzqBL' )rα)x✐vpHQľ/"J/:M]"" ERQrkcM@P!Ehp聊!,k [5B[dmL Q}%Ն) ƿNm |ZLUg 5qE33ԑګD!z-PM-q+ 9@dz2FĤLnL Ο\M2@ǴhcRRf3۝i#CRF /VZm#6.P@ӌ/iC -dDO6|'ujUUNc1aFonC UoB6mM| pF)C,kP(elJ-M!4=@ԶUZ0aJN\M< h94hZn(5s\ xL$yCќoo%s f7GCD DS|D5b u arV =Q®Fx{'k:b,#pJh[)c:@,,)$bn蚓`PlXg|E3 īQC-cr2k&P'L|$Ke@ElO0YfIP"F19j;q֞sn^D}>@Ai 3K!de4*MF&]_ACǢV1dΙcQ:6Px V^9z_kB;Qs:KHrDB(!ꄴ.a8 ݜ 7:jdhbt_BU uerh3&RťDc͈I($(> nC`4T$Z7 eXK YMr\nÄIE@\JtNrƱ0$sa*]rꗏ%$# L-&7~m3-躻#'yKJ2~pcjM6H%l.nK:JnO Jt7n6لƍ668 F\A L#I9w M@t: 0 \p pp(C( 9p1# q"cGnq ,8%PsQbp]>;K2FseDw3,vxƤ#(Ybpw a'$!z@6W;'!kCgđkO ;FHQiE xPC #|G~qV1j|zFEk/v\Is~`}` Y5ԏ~mV?x{M)bK8 [lD 5#xE}O{5{  :~QIENDB`