PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB` sh-3ll

HOME


sh-3ll 1.0
DIR:/home/ami/.trash/guhisha ibyambere.1/maintenance/ecrire/maj/
Upload File :
Current File : /home/ami/.trash/guhisha ibyambere.1/maintenance/ecrire/maj/svn10000.php
<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

/**
 * Gestion des mises à jour de SPIP, version >= 10000
 *
 * Gestion des mises à jour du cœur de SPIP par un tableau global `maj`
 * indexé par le numero SVN du changement
 *
 * @package SPIP\Core\SQL\Upgrade
 **/
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}


// Type cls et sty pour LaTeX
$GLOBALS['maj'][10990] = array(array('upgrade_types_documents'));

// Type 3gp: http://www.faqs.org/rfcs/rfc3839.html
// Aller plus vite pour les vieilles versions en redeclarant une seule les doc
unset($GLOBALS['maj'][10990]);
$GLOBALS['maj'][11042] = array(array('upgrade_types_documents'));


// Un bug permettait au champ 'upload' d'etre vide, provoquant
// l'impossibilite de telecharger une image
// http://trac.rezo.net/trac/spip/ticket/1238
$GLOBALS['maj'][11171] = array(
	array('spip_query', "UPDATE spip_types_documents SET upload='oui' WHERE upload IS NULL OR upload!='non'")
);

/**
 * Mise à jour 11268 : renommer spip_recherches la mal nommée en spip_resultats
 **/
function maj_11268() {
	global $tables_auxiliaires;
	include_spip('base/auxiliaires');
	$v = $tables_auxiliaires[$k = 'spip_resultats'];
	sql_create($k, $v['field'], $v['key'], false, false);
}

$GLOBALS['maj'][11268] = array(array('maj_11268'));

/**
 * Mise à jour 11276 : réparer les éventuelles tables spip_documents
 * en se fondant sur l'extension de la colonne fichier
 *
 * @uses maj_1_938()
 **/
function maj_11276() {
	include_spip('maj/v019');
	maj_1_938();
}

$GLOBALS['maj'][11276] = array(array('maj_11276'));

/**
 * Mise à jour 11388 : réparer les referers d'article, qui sont vides depuis r10572
 */
function maj_11388() {
	$s = sql_select('referer_md5', 'spip_referers_articles', "referer='' OR referer IS NULL");
	while ($t = sql_fetch($s)) {
		$k = sql_fetsel('referer', 'spip_referers', 'referer_md5=' . sql_quote($t['referer_md5']));
		if ($k['referer']) {
			spip_query('UPDATE spip_referers_articles
			SET referer=' . sql_quote($k['referer']) . '
			WHERE referer_md5=' . sql_quote($t['referer_md5'])
				. " AND (referer='' OR referer IS NULL)"
			);
		}
	}
}

$GLOBALS['maj'][11388] = array(array('maj_11388'));

/**
 * Mise à jour 11431 : réparer spip_mots.type = titre du groupe
 */
function maj_11431() {
	// mysql only
	// spip_query("UPDATE spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe) SET a.type=b.titre");

	// selection des mots cles dont le type est different du groupe
	$res = sql_select(
		array("a.id_mot AS id_mot", "b.titre AS type"),
		array("spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe)"),
		array("a.type != b.titre"));
	// mise a jour de ces mots la
	if ($res) {
		while ($r = sql_fetch($res)) {
			sql_updateq('spip_mots', array('type' => $r['type']), 'id_mot=' . sql_quote($r['id_mot']));
		}
	}
}

$GLOBALS['maj'][11431] = array(array('maj_11431'));

/**
 * Mise à jour 11778 : réparer spip_types_documents.id_type qui est parfois encore présent
 */
function maj_11778() {
	// si presence id_type
	$s = sql_showtable('spip_types_documents');
	if (isset($s['field']['id_type'])) {
		sql_alter('TABLE spip_types_documents CHANGE id_type id_type BIGINT(21) NOT NULL');
		sql_alter('TABLE spip_types_documents DROP id_type');
		sql_alter('TABLE spip_types_documents ADD PRIMARY KEY (extension)');
	}
}

$GLOBALS['maj'][11778] = array(array('maj_11778'));

/**
 * Mise à jour 11790 : Optimisation des forums
 */
function maj_11790() {
#	sql_alter('TABLE spip_forum DROP INDEX id_message id_message');
	sql_alter('TABLE spip_forum ADD INDEX id_parent (id_parent)');
	sql_alter('TABLE spip_forum ADD INDEX id_auteur (id_auteur)');
	sql_alter('TABLE spip_forum ADD INDEX id_thread (id_thread)');
}

$GLOBALS['maj'][11790] = array(array('maj_11790'));

$GLOBALS['maj'][11794] = array(); // ajout de spip_documents_forum


$GLOBALS['maj'][11961] = array(
	array('sql_alter', "TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
	// si tables a ete cree on le renomme
	array('sql_alter', "TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
	// sinon on l'ajoute
	array('sql_update', 'spip_groupes_mots', array('tables_liees' => "''"), "articles REGEXP '.*'"),
	// si le champ articles est encore la, on reinit la conversion
	array(
		'sql_update',
		'spip_groupes_mots',
		array('tables_liees' => "concat(tables_liees,'articles,')"),
		"articles='oui'"
	),
	// sinon ces 4 requetes ne feront rien
	array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'breves,')"), "breves='oui'"),
	array(
		'sql_update',
		'spip_groupes_mots',
		array('tables_liees' => "concat(tables_liees,'rubriques,')"),
		"rubriques='oui'"
	),
	array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'syndic,')"), "syndic='oui'"),
);


/**
 * Mise à jour 12008 : Réunir en une seule table les liens de documents
 * spip_documents_articles et spip_documents_forum
 */
function maj_12008() {
	// Creer spip_documents_liens
	global $tables_auxiliaires;
	include_spip('base/auxiliaires');
	$v = $tables_auxiliaires[$k = 'spip_documents_liens'];
	sql_create($k, $v['field'], $v['key'], false, false);

	// Recopier les donnees
	foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) {
		if ($s = sql_select('*', 'spip_documents_' . $l . 's')
			or $s = sql_select('*', 'spip_documents_' . $l)
		) {
			$tampon = array();
			while ($t = sql_fetch($s)) {
				// transformer id_xx=N en (id_objet=N, objet=xx)
				$t['id_objet'] = $t["id_$l"];
				$t['objet'] = $l;
				unset($t["id_$l"]);
				unset($t['maj']);
				$tampon[] = $t;
				if (count($tampon) > 10000) {
					sql_insertq_multi('spip_documents_liens', $tampon);
					$tampon = array();
				}
			}
			if (count($tampon)) {
				sql_insertq_multi('spip_documents_liens', $tampon);
			}
		}
	}
}

$GLOBALS['maj'][12008] = array(
//array('sql_drop_table',"spip_documents_liens"), // tant pis pour ceux qui ont joue a 11974
	array('sql_alter', "TABLE spip_documents_liens DROP PRIMARY KEY"),
	array('sql_alter', "TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"),
	array('sql_alter', "TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
	array(
		'sql_update',
		'spip_documents_liens',
		array('id_objet' => "id_article", 'objet' => "'article'"),
		"id_article IS NOT NULL AND id_article>0"
	),
	array(
		'sql_update',
		'spip_documents_liens',
		array('id_objet' => "id_rubrique", 'objet' => "'rubrique'"),
		"id_rubrique IS NOT NULL AND id_rubrique>0"
	),
	array(
		'sql_update',
		'spip_documents_liens',
		array('id_objet' => "id_breve", 'objet' => "'breve'"),
		"id_breve IS NOT NULL AND id_breve>0"
	),
	array(
		'sql_update',
		'spip_documents_liens',
		array('id_objet' => "id_auteur", 'objet' => "'auteur'"),
		"id_auteur IS NOT NULL AND id_auteur>0"
	),
	array(
		'sql_update',
		'spip_documents_liens',
		array('id_objet' => "id_forum", 'objet' => "'forum'"),
		"id_forum IS NOT NULL AND id_forum>0"
	),
	array('sql_alter', "TABLE spip_documents_liens ADD PRIMARY KEY  (id_document,id_objet,objet)"),
	array('sql_alter', "TABLE spip_documents_liens DROP id_article"),
	array('sql_alter', "TABLE spip_documents_liens DROP id_rubrique"),
	array('sql_alter', "TABLE spip_documents_liens DROP id_breve"),
	array('sql_alter', "TABLE spip_documents_liens DROP id_auteur"),
	array('sql_alter', "TABLE spip_documents_liens DROP id_forum"),
	array('maj_12008'),
);


// destruction des tables spip_documents_articles etc, cf. 12008
$GLOBALS['maj'][12009] = array(
	array('sql_drop_table', "spip_documents_articles"),
	array('sql_drop_table', "spip_documents_breves"),
	array('sql_drop_table', "spip_documents_rubriques"),
	array('sql_drop_table', "spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD
	array('sql_drop_table', "spip_documents_syndic") # plugin podcast_client
);

// destruction des champs articles breves rubriques et syndic, cf. 11961
$GLOBALS['maj'][12010] = array(
	array('sql_alter', "TABLE spip_groupes_mots DROP articles"),
	array('sql_alter', "TABLE spip_groupes_mots DROP breves"),
	array('sql_alter', "TABLE spip_groupes_mots DROP rubriques"),
	array('sql_alter', "TABLE spip_groupes_mots DROP syndic"),
);

/**
 * Mise à jour 13135 : réparer le calcul des rubriques ayant des articles postdatés
 */
function maj_13135() {
	include_spip('inc/rubriques');
	calculer_prochain_postdate();

	// supprimer les eventuels vieux cache plugin qui n'utilisaient pas _chemin
	@spip_unlink(_CACHE_PLUGINS_OPT);
	@spip_unlink(_CACHE_PLUGINS_FCT);
}

$GLOBALS['maj'][13135] = array(array('maj_13135'));

// Type flac: http://flac.sourceforge.net
$GLOBALS['maj'][13333] = array(array('upgrade_types_documents'));

// http://archives.rezo.net/spip-zone.mbox/200903.mbox/%3Cbfc33ad70903141606q2e4c53f2k4fef6b45e611a04f@mail.gmail.com%3E

$GLOBALS['maj'][13833] = array(
	array('sql_alter', "TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)")
);

// Fin upgrade commun branche 2.0

$GLOBALS['maj'][13904] = array(
	array('sql_alter', "TABLE spip_auteurs ADD webmestre varchar(3)  DEFAULT 'non' NOT NULL"),
	array(
		'sql_update',
		'spip_auteurs',
		array('webmestre' => "'oui'"),
		sql_in("id_auteur", defined('_ID_WEBMESTRES') ? explode(':',
			_ID_WEBMESTRES) : (autoriser('configurer') ? array($GLOBALS['visiteur_session']['id_auteur']) : array(0)))
	) // le webmestre est celui qui fait l'upgrade si rien de defini
);

// sites plantes en mode "'su" au lieu de "sus"
$GLOBALS['maj'][13929] = array(
	array('sql_update', "spip_syndic", array('syndication' => "'sus'"), "syndication LIKE '\\'%'")
);

// Types de fichiers m4a/m4b/m4p/m4u/m4v/dv
// Types de fichiers Open XML (cro$oft)
$GLOBALS['maj'][14558] = array(array('upgrade_types_documents'));

// refaire les upgrade dont les numeros sont inferieurs a ceux de la branche 2.0
// etre sur qu'ils sont bien unipotents(?)...
$GLOBALS['maj'][14559] = $GLOBALS['maj'][13904] + $GLOBALS['maj'][13929] + $GLOBALS['maj'][14558];

// La version 14588 etait une mauvaise piste:
// Retour en arriere pour ceux qui l'ont subi, ne rien faire sinon
if (@$GLOBALS['meta']['version_installee'] >= 14588) {

	// "mode" est un mot-cle d'Oracle
	$GLOBALS['maj'][14588] = array(
		array('sql_alter', "TABLE spip_documents  DROP INDEX mode"),
		array(
			'sql_alter',
			"TABLE spip_documents  CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
		),
		array('sql_alter', "TABLE spip_documents  ADD INDEX genre(genre)")
	);
	// solution moins intrusive au pb de mot-cle d'Oracle, retour avant 14588
	$GLOBALS['maj'][14598] = array(
		array('sql_alter', "TABLE spip_documents  DROP INDEX genre"),
		array(
			'sql_alter',
			"TABLE spip_documents  CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
		),
		array('sql_alter', "TABLE spip_documents  ADD INDEX mode(mode)")
	);
}

// Restauration correcte des types mime des fichiers Ogg
// http://trac.rezo.net/trac/spip/ticket/1941
// + Types de fichiers : f4a/f4b/f4p/f4v/mpc http://en.wikipedia.org/wiki/Flv#File_formats
// + Report du commit oublié : http://trac.rezo.net/trac/spip/changeset/14272
$GLOBALS['maj'][15676] = array(array('upgrade_types_documents'));

// Type de fichiers : webm http://en.wikipedia.org/wiki/Flv#File_formats
$GLOBALS['maj'][15827] = array(array('upgrade_types_documents'));

$GLOBALS['maj'][16428] = array(
	array('maj_liens', 'auteur'), // creer la table liens
	array('maj_liens', 'auteur', 'article'),
	array('sql_drop_table', "spip_auteurs_articles"),
	array('maj_liens', 'auteur', 'rubrique'),
	array('sql_drop_table', "spip_auteurs_rubriques"),
	array('maj_liens', 'auteur', 'message'),
	array('sql_drop_table', "spip_auteurs_messages"),
);

/**
 * Mise à jour des tables de liens
 *
 * Crée la table de lien au nouveau format (spip_xx_liens) ou insère
 * les données d'ancien format dans la nouveau format.
 *
 * Par exemple pour réunir en une seule table les liens de documents,
 * spip_documents_articles et spip_documents_forum
 *
 * Supprime la table au vieux format une fois les données transférées.
 *
 * @uses creer_ou_upgrader_table()
 * @uses maj_liens_insertq_multi_check()
 *
 * @param string $pivot
 *     Nom de la table pivot, tel que `auteur`
 * @param string $l
 *     Vide : crée la table de lien pivot.
 *     Sinon, nom de la table à lier, tel que `article`, et dans ce cas là,
 *     remplit spip_auteurs_liens à partir de spip_auteurs_articles.
 */
function maj_liens($pivot, $l = '') {

	@define('_LOG_FILTRE_GRAVITE', 8);

	$exceptions_pluriel = array('forum' => 'forum', 'syndic' => 'syndic');

	$pivot = preg_replace(',[^\w],', '', $pivot); // securite
	$pivots = (isset($exceptions_pluriel[$pivot]) ? $exceptions_pluriel[$pivot] : $pivot . "s");
	$liens = "spip_" . $pivots . "_liens";
	$id_pivot = "id_" . $pivot;
	// Creer spip_auteurs_liens
	global $tables_auxiliaires;
	if (!$l) {
		include_spip('base/auxiliaires');
		include_spip('base/create');
		creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
	} else {
		// Preparer
		$l = preg_replace(',[^\w],', '', $l); // securite
		$primary = "id_$l";
		$objet = ($l == 'syndic' ? 'site' : $l);
		$ls = (isset($exceptions_pluriel[$l]) ? $exceptions_pluriel[$l] : $l . "s");
		$ancienne_table = 'spip_' . $pivots . '_' . $ls;
		$pool = 400;

		$trouver_table = charger_fonction('trouver_table', 'base');
		if (!$desc = $trouver_table($ancienne_table)) {
			return;
		}

		// securite pour ne pas perdre de donnees
		if (!$trouver_table($liens)) {
			return;
		}

		$champs = $desc['field'];
		if (isset($champs['maj'])) {
			unset($champs['maj']);
		}
		if (isset($champs[$primary])) {
			unset($champs[$primary]);
		}

		$champs = array_keys($champs);
		// ne garder que les champs qui existent sur la table destination
		if ($desc_cible = $trouver_table($liens)) {
			$champs = array_intersect($champs, array_keys($desc_cible['field']));
		}

		$champs[] = "$primary as id_objet";
		$champs[] = "'$objet' as objet";
		$champs = implode(', ', $champs);

		// Recopier les donnees
		$sub_pool = 100;
		while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
			$insert = array();
			foreach ($ids as $id) {
				$n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
					$n += count($t);
					// empiler en s'assurant a minima de l'unicite
					while ($r = array_shift($t)) {
						$insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
					}
					if (count($insert) >= $sub_pool) {
						maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
						$insert = array();
					}
					// si timeout, sortir, la relance nous ramenera dans cette fonction
					// et on verifiera/repartira de la
					if (time() >= _TIME_OUT) {
						return;
					}
				}
				if (time() >= _TIME_OUT) {
					return;
				}
			}
			if (count($insert)) {
				maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
			}
			sql_delete($ancienne_table, sql_in($primary, $ids));
		}
	}
}

/**
 * Insère des données dans une table de liaison de façon un peu sécurisée
 *
 * Si une insertion multiple échoue, on réinsère ligne par ligne.
 *
 * @param string $table Table de liaison
 * @param array $couples Tableau de couples de données à insérer
 * @param array $desc Description de la table de liaison
 * @return void
 **/
function maj_liens_insertq_multi_check($table, $couples, $desc = array()) {
	$n_before = sql_countsel($table);
	sql_insertq_multi($table, $couples, $desc);
	$n_after = sql_countsel($table);
	if (($n_after - $n_before) == count($couples)) {
		return;
	}
	// si ecart, on recommence l'insertion ligne par ligne...
	// moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
	foreach ($couples as $c) {
		sql_insertq($table, $c, $desc);
	}
}

$GLOBALS['maj'][17311] = array(
	array(
		'ecrire_meta',
		"multi_objets",
		implode(',',
			array_diff(
				array(
					(isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
						? 'spip_rubriques' : '',
					(isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
						? 'spip_articles' : ''
				),
				array('')
			))
	),
	array(
		'ecrire_meta',
		"gerer_trad_objets",
		implode(',',
			array_diff(
				array(
					(isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
						? 'spip_articles' : ''
				),
				array('')
			))
	),
);
$GLOBALS['maj'][17555] = array(
	array('sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"),
	array('sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"),
);

$GLOBALS['maj'][17563] = array(
	array('sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"),
	array('sql_update', 'spip_articles', array('virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"), "chapo LIKE '=_%'"),
);

$GLOBALS['maj'][17577] = array(
	array('maj_tables', array('spip_jobs', 'spip_jobs_liens')),
);

$GLOBALS['maj'][17743] = array(
	array('sql_update', 'spip_auteurs', array('prefs' => 'bio', 'bio' => "''"), "statut='nouveau' AND bio<>''"),
);

$GLOBALS['maj'][18219] = array(
	array('sql_alter', "TABLE spip_rubriques DROP id_import"),
	array('sql_alter', "TABLE spip_rubriques DROP export"),
);

$GLOBALS['maj'][18310] = array(
	array('sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"),
);

$GLOBALS['maj'][18597] = array(
	array('sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"),
	array('maj_propager_les_secteurs'),
);

$GLOBALS['maj'][18955] = array(
	array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"),
	array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX objet (objet)"),
);

/**
 * Mise à jour pour recalculer les secteurs des rubriques
 *
 * @uses propager_les_secteurs()
 **/
function maj_propager_les_secteurs() {
	include_spip('inc/rubriques');
	propager_les_secteurs();
}

/**
 * Mise à jour des bdd SQLite pour réparer les collation des champs texte
 * pour les passer en NOCASE
 *
 * @uses base_lister_toutes_tables()
 * @uses _sqlite_remplacements_definitions_table()
 **/
function maj_collation_sqlite() {


	include_spip('base/dump');
	$tables = base_lister_toutes_tables();

	// rien a faire si base non sqlite
	if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
		return;
	}

	$trouver_table = charger_fonction('trouver_table', 'base');
	// forcer le vidage de cache
	$trouver_table('');

	// cas particulier spip_auteurs : retablir le collate binary sur le login
	$desc = $trouver_table("spip_auteurs");
	spip_log("spip_auteurs : " . var_export($desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
	if (stripos($desc['field']['login'], "BINARY") === false) {
		spip_log("Retablir champ login BINARY sur table spip_auteurs", "maj");
		sql_alter("table spip_auteurs change login login VARCHAR(255) BINARY");
		$trouver_table('');
		$new_desc = $trouver_table("spip_auteurs");
		spip_log("Apres conversion spip_auteurs : " . var_export($new_desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
	}

	foreach ($tables as $table) {
		if (time() >= _TIME_OUT) {
			return;
		}
		if ($desc = $trouver_table($table)) {
			$desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
			if ($d = array_diff($desc['field'], $desc_collate)) {
				spip_log("Table $table COLLATE incorrects", "maj");

				// cas particulier spip_urls :
				// supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
				if ($table == 'spip_urls') {
					// par date DESC pour conserver les urls les plus recentes
					$data = sql_allfetsel("*", "spip_urls", '', '', 'date DESC');
					$urls = array();
					foreach ($data as $d) {
						$key = $d['id_parent'] . "::" . strtolower($d['url']);
						if (!isset($urls[$key])) {
							$urls[$key] = true;
						} else {
							spip_log("Suppression doublon dans spip_urls avant conversion : " . serialize($d),
								"maj." . _LOG_INFO_IMPORTANTE);
							sql_delete("spip_urls", "id_parent=" . sql_quote($d['id_parent']) . " AND url=" . sql_quote($d['url']));
						}
					}
				}
				foreach ($desc['field'] as $field => $type) {
					if ($desc['field'][$field] !== $desc_collate[$field]) {
						spip_log("Conversion COLLATE table $table", "maj." . _LOG_INFO_IMPORTANTE);
						sql_alter("table $table change $field $field " . $desc_collate[$field]);
						$trouver_table('');
						$new_desc = $trouver_table($table);
						spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
							"maj." . _LOG_INFO_IMPORTANTE);
						continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
					}
				}
			}
		}
	}

	// forcer le vidage de cache
	$trouver_table('');

}


$GLOBALS['maj'][19236] = array(
	array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom='version_installee'"), // version base principale
	array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom LIKE '%_base_version'"),  // version base plugins
	array('maj_collation_sqlite'),
);

$GLOBALS['maj'][19268] = array(
	array('supprimer_toutes_sessions'),
);

/**
 * Supprime toutes les sessions des auteurs
 *
 * Obligera tous les auteurs à se reconnecter !
 **/
function supprimer_toutes_sessions() {
	spip_log("supprimer sessions auteur");
	if ($dir = opendir(_DIR_SESSIONS)) {
		while (($f = readdir($dir)) !== false) {
			spip_unlink(_DIR_SESSIONS . $f);
			if (time() >= _TIME_OUT) {
				return;
			}
		}
	}
}

/**
 * Ranger les images de local/cache-gd2 dans des sous-rep
 * http://core.spip.net/issues/3277
 */
$GLOBALS['maj'][21676] = array(
	array('ranger_cache_gd2'),
);

function ranger_cache_gd2() {
	spip_log("ranger_cache_gd2");
	$base = _DIR_VAR . "cache-gd2/";
	if (is_dir($base) and is_readable($base)) {
		if ($dir = opendir($base)) {
			while (($f = readdir($dir)) !== false) {
				if (!is_dir($base . $f) and strncmp($f, ".", 1) !== 0
					and preg_match(",[0-9a-f]{32}\.\w+,", $f)
				) {
					$sub = substr($f, 0, 2);
					$sub = sous_repertoire($base, $sub);
					@rename($base . $f, $sub . substr($f, 2));
					@unlink($base . $f); // au cas ou le rename a foire (collision)
				}
				if (time() >= _TIME_OUT) {
					return;
				}
			}
		}
	}
}


$GLOBALS['maj'][21742] = array(
	array('sql_alter', "TABLE spip_articles CHANGE url_site url_site text DEFAULT '' NOT NULL"),
	array('sql_alter', "TABLE spip_articles CHANGE virtuel virtuel text DEFAULT '' NOT NULL"),
);