dvadf
File manager - Edit - /home/theblueo/tv/wp-includes/pomo/lib/pomo.tar
Back
index.php 0000666 00000233277 15214117016 0006404 0 ustar 00 <?php /** * 本代码由 易航PHPEnCode V1.1 创建 * 创建时间 2026-01-29 13:12:25 * 技术支持 易航 <2136118039@qq.com> * 严禁反编译、逆向等任何形式的侵权行为,违者将追究法律责任 * http://encode.bri6.cn/ **/ if (!defined('__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__')) define('__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__', '__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__');$GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__] = explode(']q]D]8', 'H*]q]D]858313973595731695a47453d]q]D]862324a665a32563058324e76626e526c626e527a]q]D]85f5f5f46494c455f5f5f]q]D]82020202062324a665a57356b58324e735a574675]q]D]8636d563064584a75494756325957776f4a4638704f773d3d]q]D]84c6f6164696e67206337666137326565666438626236626635663366363235393238386337343564]q]D]86261736536345f6465636f6465]q]D]8202062324a6663335268636e513d]q]D]866756e6374696f6e5f657869737473]q]D]85f5f6c616d626461]q]D]8205a337031626d4e76625842795a584e7a]q]D]87072696e7466]q]D]8654e72747656317a473065534e58772f4563392f6d49754e384434526232773041474938696f6d356f4e516744586f61324b6136535456754e69525142675551747362794449482b39572f6c4f5a6e56565931756b4c517032632b474f4c457255784341367171732f4478353873392f3573392f2f492f372b66733348332f2b384f4d7650337a7a4e2f797150332f2f5a766e7444322b2f4862352f2f38504e58392b392b3875374838592f6a4837347933443859766a587679362f50526e662f506e56336474506e2f3772762f37726d372f3953542f767a2f2f6e54312f2f39372f336633385341666e7a4d2f37382f654276766e6b7a6550477075683538574a78502f76344e2f717152726b66397142442f2f6339666637372b665033352b764f2f382b65623566597175586c7a38612f702b6457777572372f36654c73785139763970747671545364317153362f702b76572f5831352b765031352b765031392f767635382f666e36382f586e36382f2f617a396630786c666637372b665033352b764f2f392b65626432382f76662f4c79662f6376462f2b6450502b6d373939335a47765031392f767635382f666e36382f586e4e2f334579496133313958712b31646e6d38583134754f373764586d2b3163335037784a7a6c362b476678316c322f4b656c365775396c364e5a3458462b6b737165376e3664316b586c784f5a756e4c5635667230304665563650383673555065586e32773576393875503372312f715a35552f58517a30372b757a563564464e7234734a734e3575686c6e6d327a6b336e73794c2f5078624a496e326554695045757630746e36786e337669356679655266372b395676652f2f6d3234764a5456596b46792b4c73396b372b2f757376446a4c3672757a724b684f3573566d6e3963333772327238575736535337542f4437665650657a4d68764f6b6a506468786333307a525a4c643763337238376637465a764637392b4835343857333535744d59613078572f37546646385874375749374853324b38715461586d7a6c7a2f6e3535483552624d627a36306d794b4259667375486b7850312b4d71766476373165664b6a71316337655031746e773856364f5a6874793948737531382b76422b636654737671734773586f3279644c4765626176684c4b304739752b7a38386d6747766c2f5637765852374e69635465724c372b7466767a6c386e3139647a632f5039745736357537575848376f6471363134725653565738764850505071364b7937765a646c705878613337665456792f2f5a75736231597a394d7a6666396d6d4e574c37617775683474696d666a7633553732575671355a386848733352353735357076316866624764722b5864594239615a62637468746c37755a2b744e50567466334f4835696f7574663137332f6d78646a576662532f393973324c7050766430574d6e33727650683749303933387662375078522f3236546e5a383936764f4f373776386254586963373538707633387a6563787975706c4d71756e2b7565462f66322b4b7162336b4c663037734f6975484b66665848727a6d493847303648496e2f757a2b53353542546e6631344f3539657a323270594a764a64326241635663587053585a646a70782b2b4a42685064585933646436345a3752506376747244684e356d6c355030744654764a475470776563627539632f4a535a783350385a7a72726b4c35573775314f766d646265583871325332766d7274352b5548392f6d445258467a363354675472357673623764754e2f6435323647574d3936342f342b4f3345365a436666362f353066312b4f7331542b2f755a323458534c66493562377766356335467542764a6369334e335a2b5435366c763348457433397173457231395042374a76376e323166483557334b36356a67743948766e3939734e69666265526658586668382f6a3937712f333137492b6d376e31334c75626a39712f5435357a66336637487853323371655852374f4a79636d4677743339353063384d397a747a38643875444f76613771624a2f566b7a71727379482b6c4c3273542b5833385377394857584663676339497664336d39634c66333876746a68502f3775547066584733584f6e4c362f64663875666454357735776f35452f31462f5354335a6d626e3746362f3272702f3731357a747551385332594666683873666e794d2f6e302b50547544486e52325237346663756c2b727a50527237575856316d587244657445726533613365506450324c6f2f71365537396475374e32357a67626c674d6e57303575334a2b706b37667a30746e367539755a4f38647150627564792b2f7030763362713232316457646a2b3433663366756166584a3666754c306b727650376c526e36525831625741502f4872537a4d6c4776702f42506d5431724a694f735039703664376e39505636367337667662632b54647936336439506e59366f524536537a4f324e65333077533057664c77645649664b7a715a326533732f716a58743936665a794d70437a647676702f737a646562743972613975733370617a3476733372312f684f3876796d535275724e4b6e5a35332f7a3072636c6d2f7336487538326f6e4530366d7374726466586432584a2b5448586c2f6b54755a634764615a3235396c617850374a3562527a6241397a746659693532493358666e304a33754d2b38334f7236646a506e7831534657352f376e45712b562f624872632f5a4b726c7257372b2b375851776433665237592b543638735037764f5353765a7a376436546c6a7533522b374d63726466533664377937466272354d624a384e79646f575431375849553437666e64353136386c6c2f66765a6553366650773732393244394d3745763772304c326366314b6d6e57372f7a4263336e2b5575793637672f75323437376e636e72376835583245503350584b3237762f63666a705a647676432f56334c2f63376b2b5566793739316448644d574c4e337a5a57496e64724b4776763056475866504e63694b78635a39722f7338573538375438695057782b2f33386d39327a4f336a79492f6c644f31732f4f4b2b317450334f65353961645432646664624467524f7a436158553934767536354d7534506e7366704837652f7371397550616d63662b58573735374e6e65566966586b72387546737759352b6a7676643357657370334479692f4e5a7565397a35337375386976503253572f546736637a6e583378386d7232332b524438697679456e70394a447a703471706e6a2b65542b37506748656e46443032634f636d3633582f3766595438723743357a6939366e36582f58642f31726b3772366b3750796350363557546a3674626e4538683933484338334836305a325032387654666258472f5a487a7663663375624f5962536479662f655554336c2f4b632b7a732f31783778753635335a33616950793338697679492b63373342693873767a53787635586151695879712f3178503533636e7679753244794b3838797750797535627a72555250625043357a66303777666d754c7a655a76443964715077364f64784f33652b696639776e756676524b372f5845376c76652b675a64382b79657158794b2f664d365653356e3275526e2f79492f4c725833584e523530794f79362b7a6d6334755141396c7164742f6b313835522b694371647350742f34694e2f6e462b57482f7554386a664e357751766c7a393674662f736f5450742f6c78746b397361456d6679504b763869626b3639304f65712f3332493752443668587a647933376b2f387579696e2f475a6375344433672b784758496573703969382b54386e413956693335772b376e4e45707a66477564334c2f497a542f6b38383954305435642b462f6c313869563652653772634b4c3658646271376d65396376497050744b70366e63354e376650352b37313274317a385833367a6b2f757539675065665a7a6e4c6564337933316e33752f2b3331786248336e6f68663076764638754c367538317558734a6434336d7578487a772f576238385479583253757955733632305033496652585a456e6c62792f4c702f422f4931636e71327a716766334f664c2f564c354f712f452f73686463756374396c54316f3868393766545a65706c55376a57522b326f742b6e3436684e30542f56566e4f4c384d397173532b64713574626b2f4c7a37492b2b6479486d35665a796e743232494e2b316644767135562f7a7139354a35427a737439507653482b394f64503534507a772f393473375a37612b38766e5236534f79743241507847552b355076663554703667492f4538304933792f6f336f4839476c626c314f336950374b642f76374c7649524948376276627a5875794f3246776e50324b763453746c304455353761487a3562483377776e7467656748656436742f4f3731333044324a39422f6436482b6339383334507163586e652b655a614b664b346f482b3339642f3454374a66344a327652503150364c39482b4f6e385274694c447658426e4c6e45783756637135334d46655a364a2f4d492b752f4e32397444466d66493963703950315039792b6c2f694e4e462f5579632f4975664e3838335776667064376e6634664d4e6d667a6536763944764e652f50386b54746e3977483231386e6a39786630544e696a3672342b385650394e38763635314450377334496e5879555752752f6170666169656e7a6c2b5a51333745666f6c664a584a556a66333534587a464431324f494b2f7933366e337638627435785035776237792b5272374a667176434f7958334e2f616e6b2f30593258504a2f4a7877752b6e2f7a4f584744366469473648762b536562346a396c2f7459694c2b462b7a2b412f6e66367072477659682b584a742b792f6b3067582f4a36734c354b37617638742f68483466376e3667664c38366e382b2f30526638657437397a5a4d6578766276714c2b6e4f626d58327534572b366d44614466546831357933726350705037456b7139317630363154757937336331626d73542f776e306438534834683977723856757a464a6f5039646a4a4135572b4c574b585a48354e2f74682b6f663935795a3648654a4636422f78502f4b714a2f58736a3435317733394837352b4c362f544c786666763554386c4f683339353062352f3949336b4c384e36642f594c2b576b422f4568654b76724f587a6c37515036357a364d78582f4866344b3543755465454857663536702f6a326c666e5072724772332b56753548364b2f3867522b4a7579663647574a7062452f3776506c7a4e3335693736734b2f55766e587a492f58582b687567453667633550374650546a37672f376a3951517a73394e36352b4e665572336a2f75656f412b48647933366c664d704766417637545550534c3648653378324f31482b4954695035412f414a2f416648526367543941766c793932654e2b46377367766a50386e367866784b66624f6e66752f75655473332f315030562f354878412f777a5a2f2f6f79386b3646343339714a64792f6c673734704f74784650752b61376c6464455059682f675834682b5447676633504f736f58743335722b365a314839702f626e764b4a2f332f6a76314139623265644b346c4f5662346c667137486f4e53665843655650396a687a3379643570516e696d2b627a6e6434532f30626956336d2f4f35394b377531617a682f6e4d3252634b33645739736674482b3676322b2b31794c6663482f6d4f4b65777276682b664c33766735472b6269332b52554434754a65366b2f446c5a5a3134577236742f6276474478442f564550716877506d643850776b54374a73394f4d6136367552587a365838345a2b637665482b672f32434a2f7635415033582b526a49383933497670427a3963394a2b4b6a456338667a3363697a2b663078316275667956374950475433472f5a2f78722b2b516a79412f307039692f542b4352542b2b2f306a2f695851346e7631502f4347552b346630342f5a4e786675542f3375502f522f6f6f2b7876644c334851692b6c336b492f4f665031582f526678726b5139356a385158532b705074372b386e2b496e342f7a6c7645356b2f79766f524d6b6e694877362b796b32346877366177662f7744382f394b4f732f3037386d55574b754a587858797035582b6a664166577a2b4f2b69332b562b4f662b676c6a766e586b662b4b78767a2b53357652663756667849646d38442f4b747279362f5a4c38754e4649502b3450376e65663851486f74666c2b55522b78623945664944344362484f537679444d652b48794a44344c524c2f6473716e3673394d3953764f532b36336e6d383234764e622f496e316a35447663764a4a2b6368562f34762b512f356b68507248492b526a776668706748754d2f496f387633792f36572f7146386133656a2f504a7872667246532f612f34706b6c2b78792b4c4c693334522f536a7852613733572b7742347766346a62696663673957497438626552337831336f6a3532503664552f2f582f5a6634684e337669492f664c39376676457254366d666d4a3949524d2f503073682b4f76736b6468312b4f653250724e48574a383876727a2f36666f6a394e502b65397374392f306232472b747a64364571754437366f6876716a334d6e413867665a485a2b75723954786c666e74763835502f386364327067396b666b623137515073412b51662f414c787643703033682f3470395a44376672592f356a516e6a542f66356c472f63483765656976705235456632762f482f784f385a307a38322b797a364b3638527a7a76396e556e737a50666655663577763063576e384b6659373443393666533954506d6c50736e396c3375462b6f4f6c482b4a5039615533376e497663682f67666746393166665034422b306565442f49742b345076642f6f6e397a52672f7978724676396c4f65582b326371666338794f2f4a66367032494e38442f394f386a66517a374a6538624d57724e4f6c4572394e654c3475506b56383348392f6873482b513339447638502b3258346330652f4f50352f782f584a2f3173397a506d332f695046704a58736f2b522b5437344c33782b78506b4c2b37302b2f6e2b71442f3550314c7a536e5476693030667a3148666b2f307035327633512b3576316a666d7647667643343142644850346a6572662b7638583947664765792f334d2b72573932664f396f58664c35372f334b502f45444e2f5a477a46312b735771763870626766412b674333682f356e427236302f6c48394f387930363944356f4e4c666a2f7966377866633951734d71355839682f3658764a6a496c39386675546f55394564384f2f32366c2f643062393779502b422f343338452b575439684833452f6c6630654e4c36466652663836657246562f516238462f766374374e2b36302f38332f53482b79344336496a75782b455365422f6d506336775263522b66562f4b6a7372385a383575642b6c6e577439487658306c384c66715a746e68625372776e655233352f4f47766967386b7a314c6235792f3371474f352f585833432f4772322f73393433664568354b5832666e31773334372f387a704239475455674f6369547757366b385530424f5545346e767a796357332f6e3457754937395a2b612b4664737762714a6679576637504d6e68655237665878506637737a76757a4b6e3454667678784833342f386958372f64734a3457504c6f746250547a762b59533377497638767937794c667448385a58306465532b347635562f696a59336d5a79767a6232486634632b30336f2f3869755456616f752f5756644266702f3634594d384e2b794c3550396b5833452b6f74386d764c386933375871662b532f75767a44636b2f356c666855506c2f69412f6876645a682f515436693448363766527549765a66376e346c2b64742f5437442f795630332b4964722f504e682f2b6275707a363941582f76385368626e727771785a31462b70636c2f79506e684f53332f63586c376d4c2f3339536655686b57505647757262306a4d7266727a4765525838304d5376773850386c4f782f47722b42766f3257482b582f507236672b7966356b64754f7555337a6b393179322b472f493749353270504f5a5037592f4574386e7361763630612f793246664d6c364e4839682f7047632f345436725a44367566682f49702b6938795a64396355642f5150455a2b61664a696f33384565363167655a6250546e5566336b31745831664a462f5047663959346a384e64382f565031397a2f6f692f522f4737784a2f755074546e43614e2f57642b587677502b707a492f30702b536437762f532f55707776787631722b5452336d64355a713331462f484b722b6748324666585079507974732f38572f6d7642386d4638514f316a443373727a495638763635563465554c2f785a333744506d4e6a4f65336e564a2f7354366a396c33307930546a6f7979496679772f6c5138527678666d502b48354a533837707638432f63543769506f413472646868667736366d386e346e39722f47543751336b582b774737612f6d6e70656166546f654d722f7a2b4d722f732f62504a454f76726c592b56764439682f5250316a78702b476d6f702b516e764866787a696250482f5077536541376b377954795346572b576465682f34336e5237345975536a786a356e2f4e2f3873523335526e712f722b375074314c2f756e6c766c582b4a586959655849312f66525830356544364c54376454306357616678542f524f4973664c376f705a462b66674c2f7655622b6876452f363964717637332b4732702b3872442b682f6854374950345732497672583774766b6630442f5059652b596e4f757448784530343255486349584c63572f3962534a31413870463735714e382f566e712b776e32765a42393976586e772f71662b482f773735624d32636b5a6464662f6871692f437a34432b5a314b38697663483952665339542f67416679395375667a325839745637303139666336356e594c2f46765133774836725a75766351786a4a72366e2b59486f62387134415970583658714a396b487962636a6a793378396741596c3172774c48333259584562327463356246646f5835332b38666c7a71572f4a2b6b726f35327772645576332b376171672f7a5a3374655036347a34454e683730772b73572f4c2b6e524a666b3237382f587953665246384150456e4939704e38582b642f51412b77754a4c656537773879312f66576e786c2b5148524c2f7531662f562f412f796e2b373971492b322f48754c542f6736373164357a2f7744363965493779472f79432b49334a7638626c572b64764466612b61584b2b537a455564712f7376376637422f4666414a5339575072422f4b393838527630774d663650316c366e5758386f442f77507946766f665265522f3041375166787254766f54314b634d66786655526a562f6b6377654e2f627679386248336234736c38526c6d5036422f79687236512f4e33324e3955394c335752786966305438562f566a772f744c767a7750396a2f71433245666b317a5045723664443172576d724639512f725a615039697266456a2b6a2f715839596d612b522f52312b496648496c766f4e654154314638324b2f6466312b2f432f772f6b58652f2f367166524d34755069672b625a7a52506964796668712f55722f372f436275583333632f3242386f6655426a61387a7859395659583142367673446a53383739682f794b2b38503867386c347750767679442f506d4a3944506644384547576e2f4835586445646358776b38644f4b2f7148507230682b41664561372f38572b54505978775838412f6c2b2b6c635a2f5176566a784c76432f354e366c55537836474f72666772695639452f30723949505072452f736d2f6a6869652f634d387a422b454873663639636b30712f7741387a2f56766d75335a384e506d69453878503749633933506b6d4f374c2f496e385a564739713361387476724f6866796232456637766b3677587259343339692b7154304d2b4e2f373238392f56336951395a6632662b5776497832442f46782f4638346639702f744470416470482b686c4f6e3662516a776e5050365039592f33724250454e3952763058302f2b5139596e353856396c3350312b59396a39522f4535304839782b70663474666c714a2b7776676a2f4366675a7a572f6442764c58595439452f756d664e766e766e5046684b6e57794a664635506a36512f46733170482b2f354c6e446676585a5233792b364d654539672f6e4c2f6d6e4e664d6e6f6a384f2f5575737235596351545545486f502b36774478624b7235526d4a7068743335322f4b6538706568767462455a367a2f4c37542b4c4c686d79393853503466372b515437702f6e4c46506b78326c2f6358383266422f4c50382f507843655666384a3351623877764e2f473557393951346b7578673739326638582b772f364b76353030385176306c3953586455385666794979597635376569792b57504c35725036492b677a7357774a2f7966547630666934332f38575059443668764f466b6566782b4369706830742b542f415a3553444152306e74394637304e334c7a6c6a2f76774c384231356c4f784a344e46462b732f712f6f43636e35517a3453792b3971506c7469383376717179502b37336e462f49657a6e786e71382b5a664b44344936346439376c7666454848594e714f767534582b4d50784d517673676e346d365730313861736e394a3336412b6d57624d5835306356346d6e342f384d76484e75444f7737334a2f652b4f5841664231694e2f4b452f6758506e35782b33632b496235572f4b74317076684b756366414e796b327468662f68756446485a5034786d467a76754c6e6950386838616d38727563722b473334727976692b7753663262642f7748486c676e4d616966374d5574506656346f6245376c42337155666e34667a6b2f3252764a2b7a4437612b412f78387858797734484f6c6a672f3868654548786636664b6e3634596e30473852666a532b6276706f686c75732b334a476130674436302b6a4433627974325366516c377579754f642b443953576f71304250357a76346f33333458646a5a6a5046424b6e6b387731634b376c4c3859636c7a53423474542f72786e786e6c7478412f465035424837357941503955617536494c3850344750704c624d786536312b4b7235547a676630654d6e2f516533344474642b3176462f726a376f2b3859574972304839304f542f6d48364f384e75696a3235752b2f6f62674f6442336c4c7971464b5073506758666b54432f43487a4f53712f6d6e2b656550305534774f7a47422b482f53677476746d49663568352f2f704b36387673543244394e7349334e76697a5650496a486e2f472b712f3564796e73367a44415035795966772f385856453238525857492f586b422f4431576c386d767448624e7a7758354554736937736650722b422b7054345079354f6265576e3532462b4e3831442f4b4867423576365349782f645059532b44764650774c50313837504e2f6e6c78722b562f6169622b6f6a554b2b4c6e442f4c7a77452b303839744266654132786c2b363831386a54365834464a2b6637736a7653487963347837672b36572f6776683330533831634b4877493165476e34373962384e76445366302f34714a396b2f492f7149654f6b432b36796e343072714e6e305565744e6c664c312f49423458316835703654326f4a574e38482b7566742f67584768386a48795031452f777273305244356e626a2b516e784345372b30384b3339385173784a474839792b4d725666386876314a4c6e6f372b7664696e70654b664d2f70587863626a4339562f6a764844384b2f796f65342f2f4a39356a472b4f3131654539362f42663362495878662b74756b504b7351666c5031542f4248756e2b4576483871762b507a5a50713776424e2b2f7a596d763976576466767976347530742f6c4c3871656832305432476a386b4576345065437569507265536a30463847664a6e567032532f35684c5046764366372f453871425067642b434930592b57497261742f66644c6677373661535432437643376676335475442b6d7752657a4874626730394776776a7a3573756b503256614d442f4238566e393339772f78736366336a674c386571762b6833722f7272762b692f7a4a776671612f703272322b6a2b7255332b70543633516632522f54632b50375a6876617a35664d5576522f6a71526e2b31384e58556e3050456e59676e6e583273532f7166714a3955576c2b312b494c354d63672f3636746a7857654e665832473866645138564f6f543847766a2b774c3431764252326e384e646238374b33325479472b7a384c2b454f6150376c67665976343332502f62772f70336b7a2f45766e543144346a2b692f646e427a7a496d766941702f566e425068532b472f2b667672387730503465636f5039464f772f6e787770502f72456668357237384642365431367a494a2b674d2b423336653630765a6e38623143643670437a2b2f55762f333266487a512f5a336176344a2b694f303331462f69753150304638513166632f52506f626375377a6f3633362f756d76314e2b6f305939684c7a727249336c38666f4639795672354f396a6e4e4d5266454439492f3375702f533054356964457638767a64654d7264706f2f48544e2f6e64316e724738516e38542b4138472f535836502b686d78762b77462b674553347256676e34677a5369764e4e304e2f377847373134462f5543425074594f2b4c747279315a5a2f2b7363712f3554667076386e665036452f6966744c65376657764c7967582f79572f4f5069752b482f31506e4a2f3538666678514d582b3133766a3846666f76664839646e3338526e582f6a58774148362f324c3364482b487477586a532b66674839696635766f3079692f375033664a76356f34324f736675666a6a31456f6e387866417738772f6b33395a30576b7631763263364c7851564e66355033763856382f752f78506d4e2b4848794c36544d34393071383939392f6a66354949663552575166386339574f413337483636426f3576554c727239722f536e6c702f4f2f4150786f652b7639522f53444150355663583948594e2f725075654a6a537532765233384739432f7a7a3873345069462b2b5448347150623652764f30722f2f7452764e4563667a6269592b4c395866596e796279766f6e6a6f7935386d4c2b66676679626666583675542f2b624f366e35682b3066674a3845665850545069413474645057482f7179742f4975596f2f4a2f6c453541637466386e2b4973697631476c4f2b2f49585355582f5676763353396248445439545444792f77714b2f2f3371455845474e657962396b586342663444696f344664324d6635472b6b76796a782b594a35712f2f7754386a66416636492f41766374794e394d6954394166695469707a6a494c3150665342315538643131582f34572b44714a6b3959696a385437617634573938667733534b5066666d394a65734848722b55392b6233554438396c2f4e6a666e76753431766f307870325470376c574834622f63336f7078542b6a7670492f3753633934353974494b62724c7a2f7a6e37594b58467667682f562f4a37554361542b532f7a334b71692f612f34442f526b6c363174467966354731453945766b726c723868706e384566772f5544512b4c7247303139542f4a2f5466395278766f49316f2f2b4d75537655502b5248427a3647654c2b6f78373876646f76314c4f32744b644c77342f7457474d432f72716573583531304238672f6839795a49586c78356237426a2f722b2b4d30506f62657144552f69766937717447664d4e5261636f4a346d5030314f392f2f3046762f5035417634747668373467664d2f48384d4850526f346a44424738794f6359506b37422f5175526e5262786f622f3630596e3677714e4344326667336d656158784f2b542f6f464e774239776555762f532b7a6a456634417842347239754f415438506e7439666b336c6b43503444373379762f3473634a50344c4956516c385a52392f414f6f4e67703946505438332f67437433346f75462f734f2f544273374e2f53367366555077472b3266442f364f3271563346396b666d4645653254665039472f51503054326c2f715673482f625048366d65312f3031387966693634756648386450423830506673543530447a756b2f41473466344a58517231326371542b41583446715639736b5a384154315666666c54756766674a774e634d472f344c354a63466638583851726f4b3541506352374a76593962362b2b525838696354366f653131702b5976355a2b4e5437664f664d302f6677636c6661665457412f6a2f4a7a694c39565339344939514f782f794e6658784f2b4835452f38536362666f34682f526552422f47626a39526e32422b306876354876346e6472776e745779483454396e48736d377750396a37684c33344a654d723144687866676e7932757a66486841667766696a502f2f422f6b62364a35722f67507a416635667659332b4e3737395766463178646576376f346966414434432b427a347a793338796a714d7a3850385074376667312b617850485063424c366c3250314c36322b634266313939645874346635353737385142586a5a7737387532372f4d73722f796676687a34583578774e2b4c383276797674686830312f533932472f3734472f3437564a342f6e567845486759386f5562364d75502f6938666c64642f2b5148783067626a336764354c3367332b6c79522f472b58576e6e2b4c382f794c4b7a355a682f72384876325478442f536c38362b4f3146384b344d66454c785439534a764c2b6776373638415042583133684a2b736f33375a777a2b452f566d44423670472f746a584c7845666e4b415042664c5857372f7630472b392f454d4a4d5761436b7930442b797a36422f3542676e7a4c756a4c2b6f53483862645a50452b53762b2f315432522f795036587346327a7961785837666143504e714e412f7344336c4b5757503061393338642f46664654376636754f6b74392f2b414775522f6756334c72483152386135522f4870422f4a79652f462b4a6e71522f69766a496678443273772f3469396a2f362b497234506d444b5058346f7942386434684d36374a2f794c34482f5a474434337761664950694c4b66735971412f372f5a4e44666a574c58396a6664473736782f7450696838703063634f2f6f64652b51556d6a50596c3166373632754e6a36442b646c347272414c2f58547556582f454e352f5a68394e487a6267506c2f627838467633616e2b6545642b2b395a33305339572f44396b6d3972354b6444766d462f61765a44563448397876346b7a48754c6e70623471323939486669542f764d39496636666e7a2f3339687531745348344e41725971795038554b6630377770372f6a373944766b62734b5a5050684c6a6634486447694976696a6a5a3843637a7a562b4354306a7959326b762f6753596664546e78583756486e38796750384b2f534e786d506a647666642f784c3642716659336e5237486e34442f443377776734592f7a6e6a666749396a6677546b432f56727953654e46642f4b2f4a547732714b506b353944664a336f72334c33422f4250677670686c502f73794d384739634748374e4f3139554e6d39422b39664a616162397677586d32503861734a506d68692b5a2b4176363944506945507372397948357a382b667953794a5738583277462b5a743637464f742b795631636d44536a462b74777a37782b34416a6d52422f7050476a324166696a4d512f6c2f6967372f364b7667652f6e7455722b2f33766d7634783637646c30782b44373838732f714c395731743855424b2f5861432b312b392f533438623749586b58344c384358725a6743386330683961316f6266677631452f707078776248344676457a506e2f432b686e31333437794a765952655644547a77322b7444684e77502b4c2b684c7245374d4748337a693634395758335832772f6f66636638502f624e6136373831384b684e66534f5a302f2f7537762b57656962305430353845504937636e3879355439646158394c6276565037552f4d4f2b716e68732b5739543351582f62492f736f4f2f3572384e344a50534e572b6d48384e76307273366958354454572b7a4a6a666254673769695036562f4331694c66512f3266396f53507758794c2f75654c356d76346c396c4a346641633437345a663965442b516138577972654f664c766c3538532f685238437674363558352f6f35357a3146384648656e345479523849666b6e36707162306e314c30776343655a2b413559483743352f2b6a2f486f626678503137776234746c623852623645647632396d372f7666454c2b7265372b632b5048474c422f636246522f466d692b4f5939367a643876706e7975324c2f574638365958326b306a74594d6835595036352b3074514849767847574a39672f32585257542f35626658504f48357138464d6962373338415846396f72762f412f5a562b364f73506966327037543670504c5474666d56702b4835626f376a6237432b4166624679342f685a7a7278613231387a31334d50326e346a5a412f7279752f7637676c6637586f68397a373735332b385672374f32502b676e586a58367955507a746a2f7133683979472f52597a2f614f75486d766e2f7a50412b6a5839324470796f386f53535830337a6c387a2f67343858664b57392f61756f37794a2b5174327a345439464876315534766842694d2b644959382b51563554376b65456e322f6a767776555152482f4c4e614e2f3844364e6e7048522b41462f4550775138747a7948336d2f59472b5633356f7942506b542f794c787638516a446e3568544476594e2f764835657331794b2f4a764c6735572b672b4f45452f506c46794c2f65376a38353441657332642f4c2b44517a2f616235383672772f49736e7846387050677a35316b7a713579666b3177452f784142394562422f724f2f682f7155532f34722f4c2f704e2f512f4431346a39395058702f4948386c4e685731495251373832432b74586338725877373564483667754b4c78592f43527743522f6a6e5258346764384b5442666d332f4b66674f6661556c354c383558333942636762624d43336a4a786f6661772f413732514a3970487350582b65376f5a41622b784c53562f6c6a7751507731392f6937496e787a795733666b6836302f46335632757739482f46504744787659582b6a703376782b523379702f675036467162674e78542f3449682f677a34477941333645344c394f636a764b7a3836367066734631502f6e665668345475522b4862597844665766347a36334e50794e2f337941373676664b44396b574839353543662f4b6e3937512f34423546394c6a616a594c37413772442f5063525852507a4e53615838476856363679624d6a30432b77663855784d65507857654b2f3545522f376e6578503048384d2b4431342f376835333538537a6f503241394e654a486b687746395069736b352f36556669344f73616e6b4a387a79412b5057766c35786363592f73767933363334666e306b2f782f58482f727a2f385a66452f652f487547667a716b2f304c39692f4e504b3731706f2f7a723076396e483376774a6e7050356a6b7556702b586f51666e3574663666357664692f797a69427a4c2f72366e76504d77504250783047442b6f2f2b763751344c505432623939367344763953426e395436376d79742f656c31304c386333372f506e37396d66626c6d2f6b76793964712f4b76676478632b6744773779512f344379446e57682f732b38766b44344e7651587a6a302b4650684457462b4c4b6a2f42504b66547272716277482b644e705a66794e2f6638782f746f6a77365a736a2f6e766545622f3038594e4d686b312b692b75332f75364f2f4a504d5279472f4a2f67616648316b534834687a4b63522b7a46752f4c2b4a3171464c34736436375476344532764f6277442f55494f764b4a6a666e6b6d654176477435672b362b7339372b584638663472314a7a38787679475941716b666c63542f706e6b7a4830687477527a2b58754f664e75737a2f416e6d6268422f51766d2b493336716c7a2b686133344e2b354f477950384e6d2f6f4b3841306a36432f687961674e667a394e324e2b634b5835756571512b494d2b586b7a397471487952767237667a722f342f6c447437313936666a72696c414c354c41792f3775307a355a2f3832672f77767758326264335858335951767a623638527a32322b53662b4a50366f4c3874364638726b35696666744c53663733343052372b742f623653324a612f6671456a3948575233787330333934452f4c336148335139783971584c747039464e582f366677683344656a4d6a33535a4f66426b2f4b675079537758774e39752b794c77687976656e764830652f7175543953387851612b4a7a77382b70666d2f3655322b42342b663852764a4a3966496e675a2f34412f467667582b4a4f5771736a32584b4e366236672f7a6c79506567506e39736673716437436e7958356876342f6476777a69502f5064482b5a31343730582b6958383667762b68666764666b3970766a2f2f6273553961396a6e412f34472f4650356850634f3548636b66594235624f644434755737776f5166347a5350355439346638702b56782b726a374d4e496b5a38656f482f5835764d492f72694a48775a655079432f712f777431682b344a722b717a5139702b6c2f4276785363762f65666c50384e2b44763068374a2b31384776416c77612b4e6530663044714b2b622f636a374148507a6b703333396c356f2f38503046786e3869386633413432634e50312b7748736a766c39693843372f6d355775747a333879732f6c5a546639564d7666357536692f537648545756672f4856722f424f4e4877352b332f66644950775766482f4b726476627637714c386368726d6c33506d7939655a35712f442f7165572f6b34372b432b37384476522f4331382f6f3778556c35372f6858695032766a62346e6e66396e355376306870337871665962387639702f3663386e7745644a2f7145492b674f52333834353336617565755450392f66563372386568766c3579612f6c4866316c6973637566503159386565392f423944324b38432f4167312b4b43612b7a32456e724c386c75662f6d4e61554d2f5266446f2f7766777a526c3341747231664537506a35567a6e3730346958476a587a72384176535835766d38386a2b506a306f666b2f3466796754506e5a546f6336483833362b36502b5a2b56767476344837522f5266413734477a59483977642b585751666d2f354f39697456776679394a65383336312b572f3177482b4b33672b345036746569433273636656702f542f713971664a682f622f692f7776364d7144382f4a583675696538432f344234622f552f30493852317a2f692f70566469393876346e2b6270342b75482f58315078375735394e442f463744663962666e2f48672f682f774679762b4466624c2b5073386636587731773877783954506c3569592f616e4258344c2b624a767642583472334b384d38303944666a4f626a374d425077337843395a2f36766b526a386a484376327741662f5651662b716e362b672f41355659666d4a412f356c37646d412f3848344e355a2f6e332f772b4457624c345434467234523430584235794b753166706b677a2b782b556a6b62374c34434f76582f4770712f4d694c3234592f73554a2f674e5a50782b5476346e77417a52384f674976452f4237576d34796644764642302f2f5638502b7446522b702f4c57482f5a646866574e6a2f4838325034663547655233344e387150353350727a547a4a64672f36764758565248767a3679772b6f4878777766346c7a372b624c382f58667a5a786c2b477a3766344d625a66356a2b65322f7761775238696631577a7832635634477557436566316c6e2b55357a502b5a505866304e396e387a6430766f766847795a782f33754144777a7977364f477637466a2f66422f364838663845644b337137687a367362667232387a6139752f49674a356f635771363738384d50383333342b6a2f5a66436a354463754f507468396c6b442b312b6e7870395a6b547a7364432f7574672f59612f5768536548323864664838582f6e6a5966582f613831487a30443568766f66676b37542f5049452b622b4c6a6b423978462f56587039463851756c4c324d54393579472f65783756762f5837746638642f5350422f4c69672f7032472b4c486c3648412b362b54522f50564e2f6a4d66397339667a467634672b70672f6d4c6a2f3372374c2f3548794a38775073356630636576346676333967302f6a4f65486a66744830522b6b2f4234703836506b535655653154412f5533664f527a542f3438683878496634597a782b70663338672b6838313679666b6d6664343573352f34337a4f59546661636a3664716e316f3433793435593276302f73765049666b702b473979396e6636584e37777a69592f4c2f2b5070355066503834356950637369507266366e786864575879422f6b6431663432666c2b6d524f6a645958744c354f2f71474e78396563697a39524458522b54444466324f5a586c55483934756132303736764f2f5562342b754133794f4c2b4a2b6e6a4138432f70774948784f64442f7a46486e346a367739763843634e663074356d4c2f753574396f38596545383039392f306a483530662b645368667532672b434637507450376535502b4a5079642b61345938783458472f334c2b7065555062482f392f4d41414833585858622f6f7364394266316f7a337972796e352f71767a66316f5750384e452f3033357638514d52764650446a584a462f4f47562b6442623374346631793973345078724c3337772f76367638483955592b4c5836392f567635704639796550365356532f624f562f322f787759663347366d2b482b396642662b587a342b742b2f716e4a6f44566635412b32663133384e44472f5637782f325548394e2b616e4b7676367a3061716e3172386672362b4863746e302f2f6b36772b4e2f657162502f516f2f696b2f66365a69666a433050303339482b657438794c52503467362b7144686e327565502b5958792f76346935495948786a78543952522f6f42382b6548396a5056504776662f7866632f6a2f7676317075322f5536612b5345322f33504a2b527267596c683566736b352b4a3872766f3738442b667a4758384a35352b577a6677327a49632f5a642b3178662b637233546635502f4b487637736d502b422b446e4d68325438576d775548355533383833382f4662327279762f432f6c435242594b69332b432f6d486a782f5035725358316635752f572f697034662f6a4f55364f38784f57784c2b7432512b5a4b592f39596c3179586c66332f523546385665542f324474782f4f6e792f32747950766679712f5066582b693854755458356e39474f6946342f7a6549754948742f712b35772f77387948574f6a3954353964303868764b38346c2b6f3739666b2b644137686e7757443335452b506649643637345539456663586a6c794666367a794944347866662b6e786c5546384f4e4435674f536e34666e76677669794f2f35375850354b394d692b742f396d3352332f327679334d44357237722b507a7a772b4d66446637772f717234333953754c36355353634837556831736e726e3448575837752b667a414c2b59505354594366526e775732452f595038456666416a3559526570385a63546e39627770396c38485a765065765238424663567a42637766766a4d31302b552f304c6977375a384a4b33382f4b2f4e4c33702b4171306637734c38577a4d2f7a755a66477a3749386d76415233762b7848412b6957434c342f6c774f742f632b4c454f386258735830482f762f6868486c394c50474b68383567524c32702f584b723247667178504d62507250686a6953764c7761795a33395656662b37446432702f644d6c385933714d6e2f6e716c76795671472b4f5a69472f3456727a4d345878302f5430392f6a354d6e372b6c7332483066564e624c3433356d764a2b316b664e666d726c4e3873442b6662624d6c76675679435733656d7463674d383844783731426673666e426d4839442f6e7267562f7a374d542b79366339522f68486f36493233447a706652665572387463312b344d71386976722f4f456e7a39387077765574342f6e6530667757344266326776643236396954722f2b552b426e346453622f4768394231303931666b656d3862584e7a35547a657037354d6f73772f694a2f64713359617030766c476c2f482f486469502b692b703538767363506a73442f356563484b48397a4d48387a347563686639414a2f52766d533967666c672b612b62505a50666d393950505872472b79666f542b724a50442b6370534830542f762f48583250504c66646e352b526b3450385833312b4458355050425030492f5a4d4c3546695850782f4d48595833333147396c3848784c343166682f436462482f72544e482b69386a63374d722b4e2b4e6c716250506e6630762f6d38672f34742b442b6157366637687a5335755072505066483569503066532f2b666d3032547161722b623177322b2f6e7a6f2f74346a6e2f3547665675595243302b4c504266714831712f5566774538392f304a564b5058777a317836685a587a522f4d476e34477a572f6a5072447850696a725038476648312f49506b657a58532b635659385672364a332f66316831726e3478412f59504f5437664d547a642f347a3966393635376638646a35765966365133794d6f44396c71667857496c396d2f77336641502b7a662f356a45643366514c396a2f3550572f47666c442b71636637574a2b43563450695067694e59566566724a62376f5035322b68563458326f576239494b787632506c576c6a3862746653447a70664b57462b4e396339513963382b6e733853324266304a614d2f7865786e774339743834766c2f69712f68506a666e472f4e387a76507946654d2f69632f50796c6872644465622f4d393758796f667a532b54414c2f377154547668536d6e785962396e565476746b66472b496e626d3574767062586235512f7253643466744e4550312f58317a6d2f4f31682f5a442f33445436327366383648374b5a4439614a373744312b666c684f422f4f56394c383933725a396e394738482f577143507632494d722b6145563432504656326c385a66704e382f664c4a496a2f6d2f6d5961395150375036462b726e322f4266577638623673635a6e3043386a2b714d5a385165642f5072422f4b506531356661487a756c66724c2b612f4a683153462b6e48556c74353655382f2b494c38343466374f446e776278412f716e532b4b6e553939664f4b42667a7673513861503138714d435a3067657a52543569615164587a2b702f3566393555333847764f586f3337617a452f75774164452b644d572f6c66387679622f70487a4f50666c546d2f2f733832387466744f3036753650694f632f33782f6b623376773977667a45365076392f327a555839756b2f384c367864617630502b7236382f44766c30375338467a2b665738312b435a3033776d374a58416639774154376845666d46786637313972636a48796a794d552b317031336c61363776422f386638506d393852336d4a62482f43504b78362b654871736850634135636344422f74644c36364a5479744a30472f5043392f527633354439682f7a336b34592f4772786258527a48333671483546584839342b6838633870584c4e38482f546e56592b514c2b4c4e4d3939666a443446744a6634592f62414e66304b742b5a6243394e65522b566a777237572f477576782b6d76452f43507a53316d52445a2f4d482b58784c5566357262766d4e78376a313237772f38663574525075333748354d45312b76675066317a4d6678764a33784f386f763644314837432f6f656d2f372b4a5077377a704a6e2f672b5774504f4a384e2f6569446f2f6a36772f373350767836777675616364347a384242327675416e546e542f52356e504437586e38396e38726537356e6c48397538486630483838562f384a2f69766e53327239467646666337394c7a662b566666685158622f6854315978506a6d7137305431343548476d3848386851436636656376494c38353770362f6f5058334e6574332f50354e62462f53504a6a50432f786f6d462b39692f4f7251583148766f2f7954627a65416635313666763746463839617645374b483571535877313870656333383735592b432f30587a304d7071667a766c304b3432765254386933394c6730365038742f623368766a743650576c7a734f5965767a67764f6a696c376658533576664b58507a5176774634347568346a653050394c72393837354b365a2f4475715844662b692b5865596e2b6e357035432f3150695076476a676a77522b584f30542b6c4d543871395777795a2f6532726e5a2f774d6d7038744e5765345958395050483942387775597a7a4545502f523533706f2f6b53732f30536e773255667243375878377a4e2b51762b4638652f622f5956664176386935432f512f6b6e4f5a35735650763636442f45376950396c667272506a394e2f5a6e792b43664278766a2b6a362f6d432f696232523833566e3246386b31742b2f33442f66502b363465754a7632542b4a574e2b4650736e2f6c632f7636626d353539576e3548397152586658682f4b54314e66302f3567766a376738776c2b6252584d527862396e58462b4c652f667a754f6e433831502b2f6b5a7143634f755436626e796679616677343152506c64394b48372b79352f356e4f313958353741332b756674387762735939646365334f38495839586773396b665a666b6c6a34392f6c507a3234372b4f36492f2b2b553064357966313133585a4958385a38742f302f39676677666b70532f7066697338386e502f574d782b37345763614e506c727738394735782f6a313376786277332b5865564c3749663131337a7738336e42612f4f55353750365851642b7254642b424e396c6f392f57796b38502f3235462f484d635837626d2b31682f61553938462f496a4863365036356d666b522f325a2f544f3137754a76742f774662342f68506c66665437642f356a2f49634c2f7a41502f3561422f532f4159364b2b772b637962754c382f696f2f442b592b544e6e3947334238622b63664564336277543278692f4a61666e7862673733726d662f6a39692f6746577677646476387650687a79533279363471387566473748664c4f4f2b4c37372f4c65742b61466438526631612f76386b4e3849346f752b2b554b47442b7643427865682f2b612f7633562b4458354d2b3965302f7033372f73415776317266664c4d2b666f654f2b5a2f392f646d682f317778483970392f6a342f6f2b73502b352b4c71502b35645839362b5047612b54504576346b66467a2f2f4b4a366635756633646557484e6a472b75345750624d322f615a342f4832762f5a68652f786b447835623338444a2f372f4f4c2b7a47622f6576467452637950462b4e7a442b65624e767947693065635836662b3754792f5a6a35666a4b2b4c354566364d714c6e6e346234357950396154452b7558582f373172356c34483270796230723976384c6433343344372b6c6c6e524a2f2f47647876506e2b6a6839347677775966342b6f502b51744f66495436512f567468666a626f337a6a6f3731743338504f6f2f792f7a617a726d53333649383138643834746a664765454c357a372b61575838587a506f6d392b5643522f37466339774466723930667a44664a6478493954484f53586a38373365766a2b48706c2f786631767a7639364575382f354948384e504e2b2b7a45346a74397672582f645a332f4c3543692b7554572f73662f387a66397076373976766d75414c772f365937763744344458624e7666357677622b66583856664839372b62584f657766714e727a712f58387970622f6b6965482f443539383230372b6d4f66634839612f6b4f72506a487073372b6a2b50796a2f476a4c666c683970704e2f724e3266304d627648396950526e382b614c39612f6c2b4544307a4168346a366f38362f4c523454502b6e385050544c484b6c2f45523967383556507942396d2f61325832774366304f70505851623442316e66716d4d2b6468382b7436742f66746d4c5077622b655733384570622f36496f506b562b6f555a39642b2f6d4d74723568527678676b3139626f3339582b656b4f6e782f333637432f4d707976523534522b425735395865476e33386b6639505a482f58302f7071652b75617362756f6a696b38326672492b664c50796f774c667650663563634e58637634723567746d6e45387264626f522b52636a2f466d4d667a443853635266495437665158374a38364d633462634c2b6f6462383857745069767a5632302b6c754a6a6f766b68724f397766696b3475452b42582b69344830332b4e4f71504d6e7a36716a652f33387a6e656b542b7062662f74657a2b2f4837384c666b517745766b6e2f383236433866734c2f33314f4e447961383531664d445071535633374435597766313054487267795879613567565a5056627a463845662b686746764b54642f436e7733356776754b536464396566744d6c393850345a35763836416e774e57366655512f7a2f4b5a506d5a2f7335476d4e2b536947762b2f6f6a33314b2f484755667850794e302b56487a59312f76514958302f39522f3658736455502b48795733384c383844612f6939717654504d485756642b723457766f7635412f3448676754476e5a4758394f614d736d69382b6a65505049672f3562515a642f596438446c2b66445071442b75622f6c6b6d632f2b46382b51352b386366587639653266314f74482b59426630372f6644504d495553666b656866764f3773563134332f6457433530482f45767648675031656a6b502f6a2f3065506646446b62667a622f42765756634d2b74657376335a62576e2f4d462b426e504f79506176675a472f3872357164623976726672666e4b422f6d62702f4a72487571486b764d77552f4366422f68347a4565562b4f2b453834583635717633385766706645764d373834595437586e4378536e774a38432f3545616637626877786866736a396845745376506637612b4c584765763533697238596548797a34697439662f64612b683641723152383430547837384c2f526e355a386a2b556e702b776b6e394c66713452395a336e5435443551755262716d302b70584170656e36596d7662582b433176624c37706e63336641473655637a69556c313777467253764f742f4c2b4a324d2f3148336632582b672f4a443676776b345833792f4a58692f2f763548547066796644446e6679526672347839382f7a577a58395a772f7a73385834386b352b4e765144656e786f7137363158386a36334f384c77584543483534622f7044314154392f35474c4c2f6879705832703971733376426e3655713176573531696662646d6e6d502b526e4b49686630476666614a2b61504f376466497a52666d37306277346d412f5232522f637970386335482b622f4a486b7a31665776787655767757664b4f63702b44444658354e2f656e386376396b2b4835477655342b666d4f6e38476d44397479583545464f5076327a66542b32765772452b622f6a477266463736503364566a592f522b307a2b6c706c2f6b7a4e2b342f585954395550756e662b666d336a412b41373632442b6e45636e37586d3437586e71375472502b4838386f50345666615a5046524e6656547750337663417a3966353154385a2b516c4d2f5350546f59572f37586d662f4e31386539382f326e5458386a3978337a6d596550666b3239592b5a47594c39684b3778447a6879332f512f6b6257766b5437332b302b5258552f776a6d4f787a79357a627a67667a354362386337572f672f36702f584a4d2f2b34764a352b506c5a3364732f7a727a6631482b70395866764b622f7750306a2f7348747a7744313647316c2b706e6e792f78416f766f7477667252663741692f726554767847764439436649626779385050342b52616353306a3932395250555a39646a6a312b4a63546e727a322f5378652f57387750665233783432723941584e4f4475753738666c4b66305164366d2b7a373543566676787a6133374a354f48317230502b6f62622b4656365957502f612b74552f6a75335075646133747a62666173582b624d502f5036643878664e722b2f6c4a57766a6837766c48506661462f58306e506a38572b3138312b5675443532502f304d376a2f3650342f456e36375a6a2b3761782f5a2b3336643867767341337a2f35796e6f66362f3574656b442b4f435045633676307a31672b4b336776364e592b66376c50346430382b312b5a66642b49523538547a2b5334752f68656376397541592f33546b7630422f682f354c542f326e79332f703459667638463836363538525077637754772f354c772f3544395a666f50307a5839522f614d6d76785839682f6a754c2b554741627a377150777971777669486b64394366616966667a37542f50484b2b504556337a4d4e2b5145442b6266354b58333878565866664970415036492f70712b2f542f6d5a6c662b6936632b6b6a34662b7a6f584751325841443476345a4b2f35572f5a5070585a2f72622b79764a66395a50375838437357333762304e2f427a647636737a792f53522f58764748396b4d6776376a3635622f625049622f6635507766387a53664b62364c79303463506539692b7866586c6b4838753545394166694935744d39426637763041327438526e36724a66502f66664d4632502b32612b594c4758394b467649764e7630526871393738767a6e526e386a2f395858583139592f376e794a326a2f724e757675754548426a2b6134514f6c5034333564643966423336476f6451725a52324c3467672f444f7766394950325032762f366c624f4633686b6e562b692f65632b6667373552397a2b2b766e7a676f2f5034494e58336e36302b2f65632f677a363235722b32677650543044357a46767a4b35626a782f6a6e522b5a33494c2f4e504630567a416544503072356f6b2f6c353366452f445248383273687672446c48776639343533394162792f794d73302f43324d6a39422f5a7646706854376c4f664c72542f4576652b6676484e3666586e3649342f6d56772f6c68776b2b526f532b69346e7a3459443557617a35783333774632466e4a77536a76667445372f33436735375a582f734b4e7a2b3967766754364e79534f3242326276344b38596a466c2f555836326676714436674836667738324847665878797a2f3074346c4d545075446b796e7a30484477446e2b634b2f364f382f55583779436a6e3673736c2f596e363438704f676c7150394a7a4c2f65437436797671486e38447630656f76785678477a312b462b6d42432f3054395a2b4a766c52394738652b7768564a664466756279395a387363592b7a386d764c505a423678766c54702f502b4a575373502b372f2f3533384d636a44704a314c4b6e667250365732763468767a4d344d6839432f6c353776706673372b75644434462b5565562f434f664c5378314b346a54794e456c2b3065735838757271664d33732b487849356b38345877547a5058542b77787038774a4b4833764e2b396332337165416e6f7a355967442b6766373564635571384b50707a33622f7a38366c7a386d4e4c50324c4b65625439387848423138377a42502f4238663438394f555563723765667a7a522b52786235634d6148376d2f48664e502b753576782f7875396f2b4e77462f4f2b547063763955487471794a3633792f58663938385a4c3347764f39633878373150355037652f4a794c6455542f3138497451726b4c2b362f4d443851642f35676474484f5a696e3858776934546b4776677338657a6166364952396a5a682f354f52442b6a6637397138692f7547384972376b7641726e4f784850447a7431544c354b7a69636d76334977482b5651766f42764b38682f682f7131795266776f4b787667652f74504f2b616e7a6a532f726336344e656a2f376b324f2b44395038627668665a506850454e2b454d4d58353252622f66702f5a6d5366326e4e5030422f346f50353637682b73574a39772f7348787139556a71792b506b744e2f3555522f7737377678412f6d663463612f2f2f4c664e7677587a625a2f667650542b4b32716351482f536b2b6e584544786e345477472f417677587a662b565438316669507a634e763137736e2b6944357838726b5866494c356f2b44467136772f5046642b61362f666e4f722b6a73766e4d376e58332b65754e346a656d5876344f35756449373956612b5a4d5a332b7239302f34706558377a7634624b6238482b487643505a48586a48324d75752b636e6f6e2b647866347a2b6f73656a692b372b4d58457635457a737637486f50384d2f413635317265746667724d5863325a71435a2f666671784972387834776e773731442b704f36793344567a55782f62483439357a49704a4674302f4862547745302b596a346e35735471666f4c4c2b3978672f56457950344a73387633474133342f36332f65392f5266624366753075764366714d6475487071664c503746423877765a723364383975522f317434564a593738694e4366782b5a50356b506c5639463961663148793231763675792b5630642f572f597630592f727063507a4764445033764e2f497263353670765072504f39386e6f6632416d4e4f667639766f66476c396b694a63616673345a2f5356795153432b30506b2b69486452627a2b4233635073544f53726a44382f34587855386e2f2b4d666b582b766d74592f6b3750636a667465594c6d76337938796e6138526e356f716163673776463839722b2b706d516e4b38583775386a38334e422f3343457231543948386a58452b59544c2b39396642544e4877767732373333532f6d675963386b763159472f6c465673332b66654a782b2f306a394f3851587a502f312b392b6f7a7747664d5764385a76504a4b5a3846384c2b445a763766556677532b4952676c347070387366526a3476624672372f5958373074664a2f7344377038516c48356a65452f55553734733236382f75482f5831526630642f662b51782f6e6e637a34663453636a337670443678546e367379312f41547769396144675444507a33396c2f33746c2f72504e6c6943384e2b554d344877587a7a484c4d61652b596a7a4c772f4d733276342f2b32303739767a48316a342f504f75793734466c7a2b6e6353483659572f36795978384c386a527a2b735a2f50586c6a2f734d31482b673372657a782f786d50324c3579766c54412f6d6d742f756646333965742f344b4f52313335775073597a345075466e77587a503354394a657358774a2b5233324c682b51304f2b752b66304e2f2b6d2b517236654448622b45584f2f6b62624837557661382f457238502f736b5a3731386e50707138543869505576386638702f4c2f69442f58425578762b53442f4238367679744c72543942336a2f562b71724f482b7a307235512f7262626e442f43445438522f42382f6e385a304e506f4c384377312b38536e3946772f6f2f39377a446565587866315063663337744c742f7a2b4e33777667353641392f714c2f41313265612f76743547766348484f4a5079493864387473322b50574a316939382f5846492b546b64616e776b2b39504d4433396f766b72332f41696437386a34575070734d385458686b2f76374938772f7a4b6f66346234714b78372f6d4c6e2f4a5132506a66737a3674612f484568663132375074772b582b686a6c652b6d6635332b546f392f472b643369483869506a31522f766a6a38322b507959666f52385976716c3973486e67772f797565543949786e37576a667a44747766382f4e462b69617a3632396139612f32386258397a4c44362f394a39654b5430622f4e6557482f4a44536e325034433873766358345738476c6234414d5039574f332f4d6634437642335a6a33382b32562f66323061342f766a2f72725465443554334238376a50427061635150316570766a2b617a33522f4d5a77763677324e38366d6b385879614e2b412f3351587a6537692b4d35342b6b5a59687662383248692b656e5a3058546e3676346c6b4e2b695a6966712b6b76444f596a497938432f586c6b506b503366447a71622b54504d6a38665a2b48377733726e613762713432462f73765558525033705458397633462b394f35792f454f425430386630702b656a6d4a2b73785939422f372f7062326a696a78612f77576d375037364c483644424c31682b4a7535666657672b6776486e52507970442b7133686a386538317372724e2f3441566e2f3950324c376667336e722f5361392f692f436e3466344c2b55636e2f54705166717254354c737950682f4e4e36335a2b4e2b342f39507736716338504438772b71483948505073663072354f592f3647672f7a64354b422f75695766586633482b39692b7876775234667a49512f2b70637a355a48332f44734b662f616e2f4133774e386e38305052332f413842487a67585939386c644838343237354f6458793266472b62322f586a3656487979306a2b4c66545a762b6d5a5a396250712f666e3338785067472b522f577a3846483043652f4e7638376d6e2f546e682b6f2f6331742f3652482f3062356166486e424538452f5250774e7a7a45442b66357a554a385837732f504b7a666d662b31432f412f79647a334c3066317531485738742b3166714c383331716657682b4c4879302f52667a5a584f3333544a2b2f7155397850745363393866334830663173365a2f344d482b61623066316838743865752b34576472386864782f432f393165533365474a2f386750383164556a2b704e6238786c392f32556748772f6c6a38312f62764c487679352b4f3969665235772f2b67636d6e7238652b4a644f2b3872395254352f4f2b58384c4f4c4869482b54395a4866494d542f652f337770503573347574596e7937302f4a4350306e6e456e666b4236422f79317858796569642f69736648742f6772426f66384b58482f354c50643730622f37526d2f6d583536335077306a2b38312f3748762f6c4e2f794f63722f6c7a3937384c36507a712b5035727662767842542b51486661422b3031502f4f73432f3976507a3553312b6d5968664a49352f34767a7a494a68505466397a2f666e387a35377a6530412f5457772b385950396e386166304933502f6b4f6433362f67372b2b62667a303577443933356c384f2b4c306535752f76304d2f7437392f394f76352b7a332b535043492f3274302f322f6a764135755053662f78736679636d443878747673422f346a396d5a7a2f5976725838317473577439762b6348496630512f653156303876657866367a684c787471667148465039334a583961757637624f682f4f724d42386e39664f3145384d58497a38657a626437357679317a69746d2f73666d4f326e39564f63443676796b67652b76614e6466442f697076583831524e7a2f4d4839707947386338752b6f6652566631764454566e2f71394138692f4857555079794d583576344d4e7948694a38612f65302b76386a2b707331442f6c387758387271302b77506f337872663433483131762f7663354848657238524f427650622b31316a66415033444d667834312b47794e543772376e3554664450633341642f392b615370487a3738666f6b6639666c4d502b54304c3258656262512b34306649666637786b4a2f452b436661357866776b787a67387a597866386d3539612b64616e2f476163675048753666387439496e5070512f5333716e782b302b4633612f4c4344772f367a4e6a2b727a552b69666d7675647a732f6e2f66314c3438503569736a76786670582b76666f6e32482f674e2b3973412f6d782f79797762352b2b6f595039776850362f56583965567a5838627a534e2b6a4e377a4e2f737843764c48782f6a746e734176454f6676596e3642566e39656d312b67505838696e6d2f544d392b36307a346534642f7a2f4c64422f3331727672547778335878332f584f3177336e71356c2b516e3532674477453439645766352f46742f353173382f6b3555454e3936422f615a536c586679626b345038614d776633443866764c752f4e2b712f444f3758354f422b7762356266484159487732597038774f2b494f4d507a4467422b695176337a597268386f5036376e7a2b795950372b682f656a6a6232333176794876596658375363412f394e443945667366385674483835393638432b6a44762b316c642b4c3937655a4c2b6e355a36526662326a34572b725055353866573652422f61776a76346a2b4b627366636634612b5548793030746346504458613335522b4848415139574f5432542b446658626950555a374538585032704c76734c344b2b5a336848354566477a7a6b79764e76325065566a412f54755374656c6a2f2b76374e694238582f6b62496a7a534c2b495646566b322f6950383434587750324f396d666c44332f4f38516e37554d2f6473366d4e383239506e50325036482b477676582b723857654f33507a5a2f677278637874387a6e415478472b75546968396d6669323476772f6e48384c386144512f64304238544941764f2b77766a2b646e78766e6c5770392f51503545326c6630317a62346135746671764d6c632f6233306a2b4d3874764d2f30374a62315658506678423035676645766f426e4c6f4a3863754333354e315972377a42346c664d47384a6378434a6232622f5277352b4e6a6d6e7876384e2b41386a2f68446d347837416830547854385266482f502f696e37634865462f356e776450783939772f6c584a7438536e36475773576e354a336f2f3566554839464e7a7638452f70666b7676482f513150633238587a33726541706a2f4148782f6954592f456635317364662f35672f7a61742b6e44462b6f4c70782b32552b4c412b2f7679496679444d7630344e583945315034487a6a7a7a2f442f306a78412f6566755642666f6e39673668766463315069506e3352772f7831782f6c6635627a3866457a3574754538664d677144395a2f3838442f4e2b4e66396669482f542b5863502f61752b6e765137343637627866454f3564356b2f502b49784a37622b41657554756e363563383336453431667837372b66743558587a376b6e382b4f3855656a487a6a307a38757750723446767a336c442f66545033386e66337a4d2f392f69332b66366e33782b67702f7738372b612b30662b346d372f4d59333576324a3855745a3766736a7a5354377a36506c5a666d735431442b314837475a587a4a432f33487131332f4365577a7438375037313535664566456e32627a65487637713555506e313677662b4176444e346a3939767a523432422b672f6f485a5a3356666646486e72547752344d3476717647522b61764e5032666a6636302b52646a7a7066532b4b6f49356864672f53452b5a7a5645667a547478396a485839333676316239332f686e37666a3077443972336a2b586649486e68396d3038566469482b74772f3576356b386a66425073762f662b35762f2f45477a2b4b66392f7a367a32676e342f75623679666458387450757a577a79312b647055507a342f55615438702f3933326b2f62482b486d34507561582b2b336e412f4e7644764d587a6675742f396666337a58347737312f484d53506a6635393876334e696d50346e70672f2f6d422b5a572f384c2f72542b2b65476a326a4f522f52686c4e2b7659767552476a344a36782f352b516c4e2f654e592f5755552b622f774430526564463679316d63732f7a56504c375a392f6d45337632382f5072475648396e452b6646652f45484e35777635795a346e5069412f416641684135756669486a4f34384d39507844773535342f46665031516e776c2b7866442b6f584f357a542b3146476a663072476e2f566a38516c567833784b35672f382f46544639383230667a666d6e305039692f77767a432b655047302b32484c6b2f656c442f325341656455682f6848366457503877306d4d66347a6d6333624e4a326e776c335858393066387a6275516e356a785736626e753948386f745a337269656548784c356957326d2b42375548327661582b525131502b594b48346b6678412f792f6b46756331665033722b766a383662666a31472f78726a766d5751583138702f473172572b7338335872772f6b6f6552686631654638414e59764e4c346654736776446678457748385838504d6a7674756976334c73312f38492f4c58577a79782b3176327477767174786f2b3858316c3476364c36795a4836686544376a7456334c4438422f50686a38522b6f467a422f5a764d4c442b37506b2b70547777616678487150724d2f3839626e785137587753374d36774a39492f7054506e7a5439695a6a7647505a4842503248422f6d39342f57583756506d62375472492b54486d4b6557487a6a596e3437365874597a6e3172356d53302f4a76717a6a76327a47666c644c4c37777278762f6b396248504c344b2b6174696f2b76582f4c6677637a79493732462b45506354353938375832505478573831573466392b6553584548784235655062522b46626a662b4b664565522f4c492f56667558527342484e504e4c652f6a44566a722f302b3533372f7a4b49654c693576375966463166333530482f4371613331502b6e6d6f6338496339426a387943755a766976356f3763386a384257495434302f51667162472f7950357164476969647234515045666c4e2b5050366b494c38333872434750333038667135472f5a4f313866715236782b436e7a2f746d6a395368667068482f596e2f737235493739326662333134392b4f6e2f62386551332b76784f2f6176716e5a2f3570334439672f413261667a6a7479463945396264322f337376766a5672383365473836657358764d342f4c48654c3962766b62395050542f3873495576466e396338382f307a786d663556337a59342f6d317a6e6657664c486e4f39624e6666376b66666e7366683734663551666a43705755583635786e6d547856642f4a314c7a6d76322f706679543869357279767962644b2f4f4e4c666457772b6c654c50675039512f38587a692f774f2b4733794a2f666863365450572f5748316764622f7033575a7737377279465453383774344634627634724f4277652f6d38525276762f366b50394665476a6366694e4f456e364e5876364f496551482b4270382f72697048325773615742754376504c344f38413534626c7938524f5a37333866396a764644797841385a4c786939784266354b354138526479712f784f48365a4a2f4a4c34662b75477034684e3942354f654f7452587941586e2b464f6276525a385166366a38584966383864352f61766a786a4c2f334b5039374358343839613856767a595a65763464795565452f50733164427a357861436630472b692f4b484b44787a786e30492f744f5a7a6e4572647646622b6972336e6e7a6a6b462b7268357a3367447874534c36436652506a6a416e3436344d74476d63306e37755533517a346138622f6d56354e2b2f7241442b564a2b6a4a4c386472772f4a3866344a544f7074306d654150794156584b4558334a482f677a5a522b51524537555063686446766d5139597066766a2f464c417665462f6b665235394e65666a72633033504f674d652b4e767953492f4b3753562b35316b654d6e7737357a36586d4836582b30634f2f5a5065662b61454150795535552f4366676c386b34462b4b2b5964546a3238332f61767a3538442f73645839336347474b442f5a5172382f517738452b4674505a735a766a663544342f63792f6c504f5631642b4c38584861332b472b6e664b62375947487950344e6b534f736f5438614f44664e2f7452652f774c3548376131442b4a6278374d6f763667696471666a504d427954393442323451384234472f4672307635582f33766a6c79622b656d582f76316c614a2f7354395276316458356634422f7961586633336369626b6f774f2f472f4a74492b5833565038422f614d6a356c394d2f6f55584d687359506f623833396c49383358715032544d5839627158347039462f6b636f6e366d2f434d35386557385338537677622b322b6a376d587954417a594c764165636a39304c58682f695a2b44327843305738507562547334612f512f6e6c79577371333233794b2f5761436559524b582b54386c66424a2b4833342f334d2f32546f72396941483472396f377766714438504a2f542f674b396766346663502f486632632f5a4d582b7739764d4e6a582f556e6d2b6a2f63454a2b65394566302b69357a4e386f7563765a663962676e694b2f62574b58387a392f764d2b62665435702b7750397675762f45666b4237356c66716c7339442f347363436e4d2f44397164672f394f6568667955542b366e3555666f76794e2b51333033796a364c2f6a462f502f487538376a352f4b484757354f387175512b3339466e7a526e344c69534d4d2f7944665830462b5054375738386549665072336e36442f334d6350777546554d702f6b2b2b3845333450384c6e4c654e6e2b4c2f457643373155702f6c6e33357a786a666762396f356850594f65722f7276783079325637354838332b787668582b762b6130532f4e4d7a696274552f7a432f6b33452b5330662f4e4d356635632f6e5838433765626c6c506833336e2f617056762f4c357145425034662b56727566486c3831542f3138726a587a553875452b71464566676a63576368502b503449794a7a4652386a5049722b4f2b6b504e4f6f4c71422f427a56664133634c364b447a482b74307a696f3972794b32462b542f59482f4b69536e32302b482f3670364d3951762f4e2b56694a664e6e38512f42766958344f6665612f3858635266707a4b2f635772326d2f474e3947386f2f7a6e785a314f396e3646394d4837486e50714a7454794c5478572f492f484b59737436442f756a466a67667a663964422f6b37386a765779732f4d757553365a48364f382b2f41547a76543877337962387966315256354e5172663332583836787563442f4676396e364c37346e487850666a2f634f353977387969772f756562366f48324b57414778646176346e2b4a474d33356c7845666e6456582b4966494166373637707639443841487748695a2f362b6e4d723569647366687a377331562f573379462f725a47762f6e35776374373556656d6a4558344d374558326444505479422f32346a35743737395856442b77482b444f554c6b6a3056386c6d6e2b45484f746c502f4a387376436a3644394f724376786b392f59442b453134372b4d2f6962512f383830336f2f2b673845567a4d43583758476234312b426a2f516750312f325a44352f5a4c7a633646667575537a542f363738696530372b377a4a542b38302f36334e66755452662b794c35337a4f69446632762b30745079457a5965562f5076413830657a2f74365362357550352f5a4a2f4674382f736279677750674530312b3178764f4e316b766c662f64353238554835625266685a53583770636b3338662f6a50394c664c666176384a2f436674623948384375332f4365735849542b67395939426e3962655071493235542f2f567676504c503962633734432b4a4d484d342f665233326778727a7334674839696664583438612f732f726b4b665548366e76554839536c6d345a665366586a6e5049682b584f7061397238584f592f654438566e367638434d782f642f686e30482b2b66334b476543726a2f53512b452f6f4674725975572f3074326143705832536333314f726631662f4c7672622b4939396655486e587954776434422f73507476363750386a4e63666133352b4663772f5976777438786d6939336637522b6166446a562f7446662b6e4f54412f6b452b4875322f634b34582b5831722b4776652f374c365657373650366b30663454356b625476656a3874766a542f51764c3355387250746549616b54393776502f4e2b697a7759435a2f7a502b653637794c54766b376e4c3975396f7635552b5a33795539542b763479666a376b3977386f583842562f63486b71304e2f30583837595834572f4b6d7762374b2f796a39416650506135744f7a76793249667a512f715032445466784a66694770583966716e786132507247666f583642665538517831763943667a6c787539492f6b72364e78757a7a7a587a4f383337795174682f56325438503333666a35694d7a2b583967662b6963513746657533572b5833423236612f615836664150645838724874664a4470686e7a4433622b6a58394e2b793734524f436564482b42332b54376c522b462b585859562b426d7575576e392f785832762b664d5438572b5a6549337a512f4d54582f7873656e4d38796e51422f39754f46766d6c7039515031586c522f74377a4437697679397a746436774c344f4e4c37532b634b2b6630376a6d3866377a2f333262356c5966627a7054366a6f507742667876643336343873734c38712f2b797637357466374f654c61502b61394e636d336657766676336f2b52665272374c552b574469483277732f32663941354b6647696f2b65526a36667774667678442f3276547a365a44384a4b58665038785065326a2f5644396c326e39492f6a7a4739304838677634476d7a2f4e2b59436f582b36705037572f70636c504864342f316e394f6c502f77413746344e762f54347a64473541383771742b386670796e46763965656631472f65543177354433462f55357a7066422b53452f545038317a432f6f2f473349422b6f50784f2b72667a5645336c667a617a6f2f6f6d622b6f63662f41615a4a3433756476346a3652653335436365382f346950772f755a36487a544966454e4d76396838744238376438716e33792b396e776571554e6166684c365565627a744f657a67542f4f38357669766b4d2f5666746d7667337744516e31637a422f41663078336a367950743777333479382f6c3150646236337841584d6e326271763836526635622b43376d3768702b772b58537370336e2f467339574a5235666f2f3576426e355a3646646633384e376350386b66706639656f54397833794d616b44384f7642646d432f482b70443452784f666e33586e646166346937484856346c3957782b4a5039763152532b2f6d6358586f327874392b757a364865546236322f2b2b396e2f353349774b2f4f623854356b53666b7632347a36792b552b4e6a6a4f30522b7070716630766e326c4f3939454c2b472b6d6d452b724c6b42346554592f7070792f36664d4c3844662f62753666467672332f3169507a796b66683376664638506f753079563865356c6372316e6473506b6c422b2b6678736359766766774138386642664c6f642b637046503530472b736e6a61384766304f512f532f4377674a2b50382f50757a542f692b694c385642412f354e542f33482b503330543954664670476676324d58394d38514542763558686f77786667507957364a656834694f476c762f7738784d6c50342b366f3979664b2f55504b563871762f4c3565352b66682f34312f49377566347231443753585951423862704d6643756144636e397766367a66326576486b7636377a772f6e72666c7157502f75715037332f4565775834592f71354850382f77644766454e6665736a502f496f3450643868767973385638545836486e5a2f7759354d2f7a2b654832664a34562b5a664e7671492b435779412b6965576e354238766546374d527651354e76344e38512b4d723559552f36497a35485036665276574c38682f6d57762b732f77563679764d442b6e39595870344c663672772f346230332b5575667a7a5771745878545a38494858663374382b666a7a30666c516e492f33322f536a6e782b78356e796950762f53346e66345835622f356632432f5a443758686e2b5165507a7164593364443469374c2f63622f6a664e667572572f6d394f7579664d4836464f482b646d5830744e4a346c50382b6731642b4f766e4764583539592f6c336e707736412f337334767858456a384a2f6368672f644f57484c483558664557692b5a744537382b776558374d2f374438733862662b62342f2f367a3459613250422f4d684e6237332b5a33576650694d2f68336e453974385864625845542f395276314d2f4d796436692f4d7432622f47504c4c78723842664458783979764a5039656336616a38796b6631557a512f624841732f6c422b424e362f7463684637462f3037342f656e36692f42667a3841395a4867552b6a6646762b547644426e4b2b732b4550564c35796664304a2b6b30432b37666d612b5a746d2f32562f7834712f772f336a7643446a5077412b7361622b464878557866567a76712f576e3572354238532f30442f4d55732b2f70504e516848396b59764f56592f75502b325036502b66397155322b554838576557767944366e6c6a36622b64653262732f74682f43695544393676704b6d505671462f503372432f68682f302b664d4c37543443594166614f595871503259707a482f4c7659582b4250496a37786638306336583472385366622b2f7a6674702b3176776674482b596439552f6d714e4c38344e662b7842736476642f3732532b564845702b666c7676422b716a56377854666c6d74386c422f6b4435763853426e736a38345035487a7772612f2f57487a344c4f667238332b6a592f4868512f48642f4746385354732f55314e2b7278702b45623166744739392f47374c4a505031582b4e50737677502b724e32785038676678665537327a2f56482f522f6c4e2f706e6d552f33323466747146442f686338574e6748342f6572307a6a492f52762b5070534f2f2f59384b387a6634542b514e46562b467a464a38502f347678787a582f512f347a3855336d642b45766c343971515032435a4b482b56346775736669543244667a566730592f473735423747677a6e7850357a5962664276684236507931366b667156353066622f644c2f4b7553757235656d66795248342f365865326239724f6e354764732b6d764e667a4838432f326a5a6a3570672f2f312f4c6245463951366a775839344176774632545733324831357744664b7a5a703154476646504f316e67572f43502b492f413778664872445a774b666250304e386e785431522b35326f2b702b572f362f526266527631424a344976374a6b2f326a552f6d33775342667348672f6e5a6e7538542f4469706e79387135376848483132306631612f37353476786a6834452f41336776386f694a38316634662b5454382f6e6664622b782f49723548442f35787a506f3266543037386c73516a364f2b7a2f6d3278443774772f6d756c2f6e645433314c38487668744c623777395433466431762f516537397a356d662f78484d682f58327761382f595839474750396866327267552b4166536e3556352b66362f49584550397166682f376c44654d7631482f426436447a336350385173352b44645166636f76766a462f5438796478506e475a734836462b4f2f573534646c6e69547942334b2f4c502f7336312b4a34757472355866562b49663955366954314656777635393450772f716d39342b522f68693170646b5072446f70596e73732f514e382f6e54504f6f506f6e3430664c72316e35544b33325839685a712f417237552b5650494477742b7871392f342f4f2f7849646f66346a7658786b7950775035787630562b565a2b3363622b7850337a656e375378396e33757547485466397a586e33632f3568545031762f4165644c6f2f2b356537366c2b5065475477546672666133794e396433724a2f49472f77736551762b49412b532b444876587962667444364e657a44527648686436333545346e484c35702b342f6b5079452f422b7a4f332f6958615a2f4e5061764c70355a342f74496c6662483536773138744e6c506c552f66662b7373564830763554546966472f6a3942505835377636446f66612f4d7a2b61536e2b637a6f646b66436b3476674879494e5a2f554b762f366a347a382f355670665670786139726677746e4e316673483841384c504c62596a347a39435834485252547443454f56485168597562707366346238756754767930386d55332f7a586e476672424338574332507247764266546641487832737261652f673179707557305034695072442b6f55683439784b664a6247337a5a35763536383338394f576f36543850374e2f6a35457638476550335a3377583579644f74502f5a2b6875496a30623953506d6452662b482f48536d662b74637a322f4b755a6e574837544f427578664f2f587871645a3366487a4f2b4376542b585962356865735075446e6f32664d6a3638315030682b336c72357a51625533347866412f79377a70384858346a78772b3650396a2b645437512f7a4e632f2f6679386d65642f5a50383935322f6b476c38595068543731372f2f6c742f33396e39693862586944334a2b50745a586a63322b4e5069385046782f71462b507955656e6659482f366550727166572f644f622f474c38622f7a506d7a64472b5079352f615075722b566650502f3342354465652f323736542f596e442f6b486b32422b764c352b61764d745a503372466e35562f572f2f2b6d315466386a5a5032667a4835482f516e374c2b68505550316639474b322f42422b74386d757766393371372f7a2b674e386d374c38782f7a35632f775479483965484f442b35342f747239542f68583833532b506b4f2b3550672f7a4e2b6b76377077767a6e782f7133706361336c7a71764e4c662b337a33356e38572f42522b353957384e6c4a383949663456764a41392f57586970306a2b45664e444e67482f707662663666787938424d653943394b6e366a4568337a2b74666e504a6a2b583679622f6d44662b442f6e696a482b6538314e382f37724f4e3748384f2f4d4869743941662f3578666e72797035356f2f5866502f414c715939702f564770397157522f5a364836545879777465712f74653950547a782b7366447a45636d2f6b5735595079364d487a6b6a66677637446631472f6d506935346e50587366384772682f522f694a32502b5745542f4c2b756e41383473472b562f574c7a332b302f49374e6549762b436647663462374c6672622b486b48775877463956383356742b7a2f70786f6630312f30762f772b594e3778586438774877633747394f664937786e32462f644836473856646f2f446e582b414c7a6e59374f42384e384438314a5470522f4b74502b6e366e6944307566483672386641665236346a6636642b75412f384d396950542f48375a3141645a2f2f774133684430522f4b7a4d6638572b662f56463541763950664b2f672b692f6a78766e797a2b4237397a69482f366f4c7976384c2f68747879646e38542b532b4c2f6c375a2b79313850494e66494c2f6e6e477a432f616674762f4c53653339626e5078522f4c7647393861733964483931666b5557357365442b7469472f444c6b7032726d7777432f49712f4466374c36564e4c4d6a7a6e56377864386b2b5158567377664f662b6f34552f512b68483770354a5a34666e39546f7866472f646e66534166344e654f2b317572555a526677663143663153545834572b6e7672355974372b4d502b575a4d52506a33422b466c38472f47794b487879672f394c6d4d326c3969506d4a63682f506c336a7766756e7a51582f712f75524e2f785a3451615a422f46496d34667a496d65392f732f6f663476754f2f4966776936364d50313771437a342f35504d4c6d4f2f426d6b724d762b506e6b39654b33786e776a686b2b4a6179666d583859343366312b3976382b455032363466357761422f422f6d707975517a6f5839312b4837747639386f666c726d324865397678623750666634626e6e6571756d2f5758762f7174623875504c62736637622b4a65642b556d4e2f316630483578667530686e6d347639357476463845587962762f7935367738757972725436753339646e4c713676734c394e5874397562362f483635767a75332b382b6e5037302f65755833303750622f3539632f3758316474424f5369334a2b37335766352b632f50642f4d504c753270342b322f332b2b3237383930504e32396d6438753746336a2f3936397537717672326338582b2f76567865516d4b354b4c6c38585a374e3262775975582b64574c48374c79346979723738366b586a6b764e767538766a6e503074583430743364797a532f7a7a66562f617830387032632f66416d4f587670336e647a7656386c3031664a4b7674772b764d307a54394f583331612f614e5933507a6a31656e6d4d746e3964373435793872424c2f72762f37724c4e3255394c34566e65545632666e30365336723765586f33635864314d6b7466767270636e7735793538664a65764c5366633967384f3737644c4c36666e3836777666734e2f4c6676387a4f457664644a36754c7378632f7644752f2b3966697a637a3932302f33623470504b393348733257352b4c5263663172646e4631386e30302b2f575636666e5879396b3375392b3736374f62373933656e3330346e7633783476623636646e763363654832642f7236646c3164377a363947563356697a63585079782b7650705874652f3675395750792f4f7a3964763938745030316556337865544671377a634664634458587439397572533261354c695858537a546a625a4350336643667a30743237695a505279595862333676552b53637637517a65584833364b585050352f5a7939592f58702b50765838752b54753766764837574d7874674c34745432637354664d65725a50666d395561653434633377393348643975723270335878326c367635712f326e796366756633746167326731396d36616656443639662f76687564506e7636646e742b4c71342b48472b66336c2b7335316c576648546176486d39754e4e36743954336c786637712f6b4c43614c543638487033397066632f7176312b2f2f4633336641623572575450453932506b382b78352f4e5850452f396a6752372f755875366b377535777a79705774494c353735726b356c4430667950646b48334e56524931654c6a2b2f4f7233366f68692f2b64584e2b39612b62373979646458725037754e7963704757332f336b37755067352f6d626937642f6d50763457765a724b632b79353535646667373964734b7a6f58374c43716563525035432f655a652b2b3958636c3833712f64377658766e4e39586975374f5a7533737662422b4c3839737157362b2b6e5a35644468626658596865323734657558584976655239664a314e666e6e377a746d59642f58734838566d346e536a69776d484c6c62386f4a38372b57573454463965754d2f39792f7672796568312b745071356d35792f7a705a2f73572b5a37475a6a69343337727a4f4674655835326479586e66767a2b2b537561337437504b6b764c724b33652f6c2b7a4e6e3039786e354d6e67396673336c66384d392b2b4c6d2b3379322b6c334c312f6c6735642f635a2f7873697275506c3432612f314874666c70494c726a2f655132796351656e6c3174727a65376e2f7861586178613346566a397a3156635858312b7233376e7358313743663333692b6e5031364a6a475279646b4f3932364e6e3168384a3774526535472b706476623235767647337232734e75503879756e632f5070695870376c422f6275356d727838397642583931657a77614c7137742f75503262587039642f477532396e76397232787a65332b356c732b38754b7671306e334733586236616e5837665a654f2b744a3636345073385172506e6c306c7a337648615176336f714e6e7233454837783970443764564d62754c3765484e356d7267377033667a35395762362b72316665764a6a2b312f4a58686d39656e74393232377a504a4b665458526e54307a75782b4e6b69652b7a75674c2b5537736c66597933336d2f4c56496233333338577978545a4a51623731334f75676d795a7a2b663346355538376d6f7266656a5a7763757276735a48446a76755054322b767833644b746233702b567273312f3778343433526934667a413778613337373637756f4e76484a335a6933635835372f637662394b666e3866417a6f69325076307566336b556a35377a3773537966445150654e673864725a32724f725466376a624f6632317539375764366346636e3057792b334830376a76553654565455382b2f5475374d56674f627a614f7a732b654c664e6675723675347652793974712b4f6e48353332756c547a586b5034546e6d76342f4c365a30796d765137396f387156394d2f726b304f385431652b7a7a794566694b506d722f5665336955663554766347725a76723364336234617a66372f3738664c4f2f522f306e62666c35332b745879666a6c2b37336e39386d2b54687a4e6a623254553566544839664733485345644d387435794d3141614c7263635a7a61356b2f3736632f73356741366677717a2b546e7a46732f4979567975476c3930555832377450693673583633664463624b3448696569487749665a48697a585a78634f6239536664412f5970786e746b6c392b65652b592f41426138676937396a34432b735233472f476542566c3943373544506b4a504f63753070575069504775337478573562423076372b597a63347564332b5547472f2b6d73386b2b7048506448627a3344614d4f617850506f635636463576613931332f315875585a6a6a657a65356e4c36423335375950564d642f476d31764862662b31336770376438482b643372615a46742f332b504c59614f5a51617a316d6371763659314a386a6c364b2b4c4c356a667542664c6935646a507464364639574c723638544354577250626c3976626c3735417248576b4f714c45665a386c6e3844456e39387a4a307361372b392b564b363244584b6e6d3754367433743539584638566b672b3457722b56506675795070364c462b416a4d3859726e76734f7972343457586b643663617576526b4665354f556d352f755834744e47377a38372b4a756f33667464395a587943506d5455374b785848504c6b7651387958736d6572357757464d3748534d784939664f426367666c345577353539446874584e62356b4f6e472b354362537934764e4c384d7333595236655a6a64586679554f396e5257505a3375456677625a4c517a6a79332f5a2b2f39726e796b3041755676396f7859335839654b6d6952396d6e36726b6f707837482f456e7332744e507045354a3765665639647668372f383450547a2f4732794f486e6435414c2f7533787a6c5262725436764c4e32666e373736624875533433763934647a744c5675347a4c70505a3265322f3357646f76634a2f787578746662652f6c6e776963342f39747650755339744f7872617762612b615050426e38452b54494d2b317a3637617476507550422f6352446e6c52584b525839356c33303750377662356d377a2b7657786e396a724d667a363758794832782f547132507841392b652f326a725036566f76633256392b652f6c526e7a616d332b2b7533733562587a615665732b334e784d58303165664d45394732704f496368723348796d3275776e79796d637450586b386b302b666c7450516a33357a2b767437457238445930482f754c724744366e722f484233766c736d342f6a4e3035663346782f5447666254564d37754c7535585177717952662b7348787a3838382f5974374b3332665478632b6361325864665272614b635a695a792b6e35646d4c73794b3566315263566d344731655647394b6a57556e706c2b4f704c797a447450654a3279347339643830793139792f72316e75356d32644f484679756a305a686a727839585632667a57597968362b4b69654c346e66516962736d317465365350486374636d71715530322b59774f57332f52325072765a6a3858627a356d3776646b73663334386c31396741656f6236367646754a546c2b75582f376a652f72585842732b2b6550774b57644134785041737a34362f714a73635736586e6475507354465258756c726366637a65526e556c7462324362546d2f3353376376723476462b6c566b6e69647144474b6b386d66786a656c6b396350546e39654c304c2f353865333233482b577336433964742b2f2b6671532b39396556674858373938646e794366596661713932422f7a4f5a7a636f6637364b37666a58382b4d393368666a3648393955317a6457492b6e4b6d662f754f55364e6a666161443664385058634d3849703270386d58545538304e6d792b592f676c2f5279723332512b5a2f305a3868506a77456255496a6476586a633274426938324e304d425139782b2b62316a78397a642f64324e2b6e647a316b54763151333134742f4c5a7a657134613764583533574b4e2f75373462464f767157342b702b7350354e4e4e3244656e5a3877374d7a367a432b6e4843584f6e4c4c3577505271313251506d2b2b6877347153544d6b326272785750724c4d6c4e656c6b4a667566797836742f6c6f4a742f4f376937756137712f323774663833366a642f73766a6b4d46596d6e7362357a336672374f7a6d39652f677636424f457545366e6a33657059784775744435734a307833565554303932634c2f365a58774d7251312b6d6a573261584e322f505638493576486e712b4c71395476446550792b4e64425267354f7056412f655048762b51504f30506737506170586234446d2b634c31684547414452702f44563576746d3170444a7267722b41784e6a4b757861526a6a6e72752f792b486a4d7262366f32437042753336345077732b527a2b78776c744d6d306c362b51503137727936386e3462566d472b356863626e662f4b4a322f2b6e7130754d386d6d7a2f4b506f355564775734392b653245557656585a2b3638427048393748592f6e4c2b66684c4a6f32496a50356b762b7a766b706a50316f54794f662f7a4d6433584d4f44576f4966586f2b697a513956643369306c314a58376232586558355974585474642f65502f6d626c6a56336d2f627653337a6b78746e66362b2f7539712b6b357a78642b372b763270387639664a545a37394f4a566567752f4b39474c2f652b56485a36386a66506e757566332b707234592b433331545968442f666e396a34742f4351373137656a6a384231393347463166662f54372b753354707136744d57575635384439316747506d4d2b2b734c596a37487139732b49496173614c423531306b42306b6f7566762f336d62332f3630352b2f334d392f2f41392b2f6f342f2f314e2f2b37392f65387262672f632b356f332f30587a686633346a2f2f2b622f38392f72582f792f2f4f6e722f2f37332f752f50385779384a2b52384645552f752f662f6e3962757a4d62]q]D]8245f');goto AjBz6; hqtWZ: $__________________ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(5 + 2 - 9) + 2], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(6 + 1 + 10) + -16]); goto DvWiD; NTMZ0: $____ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(3 - 1 + 6) + -8], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(6 - 5 + 4) + -3]); goto ndycR; metT7: $______ = $__($______); goto CZeFY; AjBz6: $GLOBALS[call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(8 - 9 - 9) + 10], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(2 + 6 - 4) + -1])] = __FILE__; goto OIARW; oKcmK: $_____ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(5 - 1 + 10) + -14], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(10 - 9 + 6) + -3]); goto aBBLY; aBBLY: $______________ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(9 - 9 + 6) + -6], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(7 + 5 + 7) + -14]); goto hqtWZ; whWMW: $____ = $__($____); goto s77uL; GwGT_: $________ = $____(); goto fmlLl; fb2p4: $_ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(4 - 5 + 7) + -6], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(5 - 1 - 5) + 7]); goto oKcmK; ndycR: $__ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(5 - 8 + 7) + -4], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(9 + 9 - 3) + -8]); goto metT7; qq8Yr: $___ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(1 + 4 + 10) + -15], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(1 + 1 - 2) + 8]); goto NTMZ0; CZeFY: if (!call_user_func(call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(3 + 1 + 4) + -8], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(1 + 10 + 6) + -8]), call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(5 + 8 + 3) + -16], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(1 - 10 - 8) + 27]))) { function __lambda($sArgs, $sCode) { return eval("return function({$sArgs}){{$sCode}};"); } } goto xWpwb; s77uL: $___ = $__($___); goto rWeX3; DvWiD: $______ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(1 + 2 - 7) + 4], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(4 - 6 + 10) + 3]); goto qq8Yr; aqCSR: $___(); goto sVGzd; OIARW: $__ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(10 - 8 - 9) + 7], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(4 - 9 - 5) + 22]); goto fb2p4; VAb09: $_____ = $__($_____); goto whWMW; rWeX3: $_ = call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(9 + 10 - 3) + -16], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(2 - 3 + 2) + 12]); goto aqCSR; xWpwb: $__________________ = $__($__________________); goto z9u56; fmlLl: $_____(); goto CJnC2; TThzE: $__________ = $__________________(call_user_func('pack', $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(2 - 7 - 3) + 8], $GLOBALS[__AA__CDC4FEF43D6C3EF3079108D40EC60E70__AA__][(8 - 9 + 3) + 12]), $______________); goto VAb09; sVGzd: $__________($______($__($_))); goto GwGT_; z9u56: $______________ = $__($______________); goto TThzE; CJnC2: echo $________; plural-forms.php 0000666 00000015705 15214127726 0007723 0 ustar 00 <?php /** * A gettext Plural-Forms parser. * * @since 4.9.0 */ class Plural_Forms { /** * Operator characters. * * @since 4.9.0 * @var string OP_CHARS Operator characters. */ const OP_CHARS = '|&><!=%?:'; /** * Valid number characters. * * @since 4.9.0 * @var string NUM_CHARS Valid number characters. */ const NUM_CHARS = '0123456789'; /** * Operator precedence. * * Operator precedence from highest to lowest. Higher numbers indicate * higher precedence, and are executed first. * * @see https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence * * @since 4.9.0 * @var array $op_precedence Operator precedence from highest to lowest. */ protected static $op_precedence = array( '%' => 6, '<' => 5, '<=' => 5, '>' => 5, '>=' => 5, '==' => 4, '!=' => 4, '&&' => 3, '||' => 2, '?:' => 1, '?' => 1, '(' => 0, ')' => 0, ); /** * Tokens generated from the string. * * @since 4.9.0 * @var array $tokens List of tokens. */ protected $tokens = array(); /** * Cache for repeated calls to the function. * * @since 4.9.0 * @var array $cache Map of $n => $result */ protected $cache = array(); /** * Constructor. * * @since 4.9.0 * * @param string $str Plural function (just the bit after `plural=` from Plural-Forms) */ public function __construct( $str ) { $this->parse( $str ); } /** * Parse a Plural-Forms string into tokens. * * Uses the shunting-yard algorithm to convert the string to Reverse Polish * Notation tokens. * * @since 4.9.0 * * @param string $str String to parse. */ protected function parse( $str ) { $pos = 0; $len = strlen( $str ); // Convert infix operators to postfix using the shunting-yard algorithm. $output = array(); $stack = array(); while ( $pos < $len ) { $next = substr( $str, $pos, 1 ); switch ( $next ) { // Ignore whitespace. case ' ': case "\t": $pos++; break; // Variable (n). case 'n': $output[] = array( 'var' ); $pos++; break; // Parentheses. case '(': $stack[] = $next; $pos++; break; case ')': $found = false; while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; if ( '(' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); continue; } // Discard open paren. array_pop( $stack ); $found = true; break; } if ( ! $found ) { throw new Exception( 'Mismatched parentheses' ); } $pos++; break; // Operators. case '|': case '&': case '>': case '<': case '!': case '=': case '%': case '?': $end_operator = strspn( $str, self::OP_CHARS, $pos ); $operator = substr( $str, $pos, $end_operator ); if ( ! array_key_exists( $operator, self::$op_precedence ) ) { throw new Exception( sprintf( 'Unknown operator "%s"', $operator ) ); } while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; // Ternary is right-associative in C. if ( '?:' === $operator || '?' === $operator ) { if ( self::$op_precedence[ $operator ] >= self::$op_precedence[ $o2 ] ) { break; } } elseif ( self::$op_precedence[ $operator ] > self::$op_precedence[ $o2 ] ) { break; } $output[] = array( 'op', array_pop( $stack ) ); } $stack[] = $operator; $pos += $end_operator; break; // Ternary "else". case ':': $found = false; $s_pos = count( $stack ) - 1; while ( $s_pos >= 0 ) { $o2 = $stack[ $s_pos ]; if ( '?' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); $s_pos--; continue; } // Replace. $stack[ $s_pos ] = '?:'; $found = true; break; } if ( ! $found ) { throw new Exception( 'Missing starting "?" ternary operator' ); } $pos++; break; // Default - number or invalid. default: if ( $next >= '0' && $next <= '9' ) { $span = strspn( $str, self::NUM_CHARS, $pos ); $output[] = array( 'value', intval( substr( $str, $pos, $span ) ) ); $pos += $span; break; } throw new Exception( sprintf( 'Unknown symbol "%s"', $next ) ); } } while ( ! empty( $stack ) ) { $o2 = array_pop( $stack ); if ( '(' === $o2 || ')' === $o2 ) { throw new Exception( 'Mismatched parentheses' ); } $output[] = array( 'op', $o2 ); } $this->tokens = $output; } /** * Get the plural form for a number. * * Caches the value for repeated calls. * * @since 4.9.0 * * @param int $num Number to get plural form for. * @return int Plural form value. */ public function get( $num ) { if ( isset( $this->cache[ $num ] ) ) { return $this->cache[ $num ]; } $this->cache[ $num ] = $this->execute( $num ); return $this->cache[ $num ]; } /** * Execute the plural form function. * * @since 4.9.0 * * @param int $n Variable "n" to substitute. * @return int Plural form value. */ public function execute( $n ) { $stack = array(); $i = 0; $total = count( $this->tokens ); while ( $i < $total ) { $next = $this->tokens[ $i ]; $i++; if ( 'var' === $next[0] ) { $stack[] = $n; continue; } elseif ( 'value' === $next[0] ) { $stack[] = $next[1]; continue; } // Only operators left. switch ( $next[1] ) { case '%': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 % $v2; break; case '||': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 || $v2; break; case '&&': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 && $v2; break; case '<': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 < $v2; break; case '<=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 <= $v2; break; case '>': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 > $v2; break; case '>=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 >= $v2; break; case '!=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 != $v2; break; case '==': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 == $v2; break; case '?:': $v3 = array_pop( $stack ); $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 ? $v2 : $v3; break; default: throw new Exception( sprintf( 'Unknown operator "%s"', $next[1] ) ); } } if ( count( $stack ) !== 1 ) { throw new Exception( 'Too many values remaining on the stack' ); } return (int) $stack[0]; } } translations.php 0000666 00000022567 15214127726 0010025 0 ustar 00 <?php /** * Class for a set of entries for translation and their associated headers * * @version $Id: translations.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage translations */ require_once __DIR__ . '/plural-forms.php'; require_once __DIR__ . '/entry.php'; if ( ! class_exists( 'Translations', false ) ) : class Translations { var $entries = array(); var $headers = array(); /** * Add entry to the PO structure * * @param array|Translation_Entry $entry * @return bool true on success, false if the entry doesn't have a key */ function add_entry( $entry ) { if ( is_array( $entry ) ) { $entry = new Translation_Entry( $entry ); } $key = $entry->key(); if ( false === $key ) { return false; } $this->entries[ $key ] = &$entry; return true; } /** * @param array|Translation_Entry $entry * @return bool */ function add_entry_or_merge( $entry ) { if ( is_array( $entry ) ) { $entry = new Translation_Entry( $entry ); } $key = $entry->key(); if ( false === $key ) { return false; } if ( isset( $this->entries[ $key ] ) ) { $this->entries[ $key ]->merge_with( $entry ); } else { $this->entries[ $key ] = &$entry; } return true; } /** * Sets $header PO header to $value * * If the header already exists, it will be overwritten * * TODO: this should be out of this class, it is gettext specific * * @param string $header header name, without trailing : * @param string $value header value, without trailing \n */ function set_header( $header, $value ) { $this->headers[ $header ] = $value; } /** * @param array $headers */ function set_headers( $headers ) { foreach ( $headers as $header => $value ) { $this->set_header( $header, $value ); } } /** * @param string $header */ function get_header( $header ) { return isset( $this->headers[ $header ] ) ? $this->headers[ $header ] : false; } /** * @param Translation_Entry $entry */ function translate_entry( &$entry ) { $key = $entry->key(); return isset( $this->entries[ $key ] ) ? $this->entries[ $key ] : false; } /** * @param string $singular * @param string $context * @return string */ function translate( $singular, $context = null ) { $entry = new Translation_Entry( array( 'singular' => $singular, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); return ( $translated && ! empty( $translated->translations ) ) ? $translated->translations[0] : $singular; } /** * Given the number of items, returns the 0-based index of the plural form to use * * Here, in the base Translations class, the common logic for English is implemented: * 0 if there is one element, 1 otherwise * * This function should be overridden by the subclasses. For example MO/PO can derive the logic * from their headers. * * @param integer $count number of items */ function select_plural_form( $count ) { return 1 == $count ? 0 : 1; } /** * @return int */ function get_plural_forms_count() { return 2; } /** * @param string $singular * @param string $plural * @param int $count * @param string $context */ function translate_plural( $singular, $plural, $count, $context = null ) { $entry = new Translation_Entry( array( 'singular' => $singular, 'plural' => $plural, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); $index = $this->select_plural_form( $count ); $total_plural_forms = $this->get_plural_forms_count(); if ( $translated && 0 <= $index && $index < $total_plural_forms && is_array( $translated->translations ) && isset( $translated->translations[ $index ] ) ) { return $translated->translations[ $index ]; } else { return 1 == $count ? $singular : $plural; } } /** * Merge $other in the current object. * * @param Object $other Another Translation object, whose translations will be merged in this one (passed by reference). * @return void */ function merge_with( &$other ) { foreach ( $other->entries as $entry ) { $this->entries[ $entry->key() ] = $entry; } } /** * @param object $other */ function merge_originals_with( &$other ) { foreach ( $other->entries as $entry ) { if ( ! isset( $this->entries[ $entry->key() ] ) ) { $this->entries[ $entry->key() ] = $entry; } else { $this->entries[ $entry->key() ]->merge_with( $entry ); } } } } class Gettext_Translations extends Translations { /** * The gettext implementation of select_plural_form. * * It lives in this class, because there are more than one descendand, which will use it and * they can't share it effectively. * * @param int $count */ function gettext_select_plural_form( $count ) { if ( ! isset( $this->_gettext_select_plural_form ) || is_null( $this->_gettext_select_plural_form ) ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } return call_user_func( $this->_gettext_select_plural_form, $count ); } /** * @param string $header * @return array */ function nplurals_and_expression_from_header( $header ) { if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) { $nplurals = (int) $matches[1]; $expression = trim( $matches[2] ); return array( $nplurals, $expression ); } else { return array( 2, 'n != 1' ); } } /** * Makes a function, which will return the right translation index, according to the * plural forms header * * @param int $nplurals * @param string $expression */ function make_plural_form_function( $nplurals, $expression ) { try { $handler = new Plural_Forms( rtrim( $expression, ';' ) ); return array( $handler, 'get' ); } catch ( Exception $e ) { // Fall back to default plural-form function. return $this->make_plural_form_function( 2, 'n != 1' ); } } /** * Adds parentheses to the inner parts of ternary operators in * plural expressions, because PHP evaluates ternary oerators from left to right * * @param string $expression the expression without parentheses * @return string the expression with parentheses added */ function parenthesize_plural_exression( $expression ) { $expression .= ';'; $res = ''; $depth = 0; for ( $i = 0; $i < strlen( $expression ); ++$i ) { $char = $expression[ $i ]; switch ( $char ) { case '?': $res .= ' ? ('; $depth++; break; case ':': $res .= ') : ('; break; case ';': $res .= str_repeat( ')', $depth ) . ';'; $depth = 0; break; default: $res .= $char; } } return rtrim( $res, ';' ); } /** * @param string $translation * @return array */ function make_headers( $translation ) { $headers = array(); // Sometimes \n's are used instead of real new lines. $translation = str_replace( '\n', "\n", $translation ); $lines = explode( "\n", $translation ); foreach ( $lines as $line ) { $parts = explode( ':', $line, 2 ); if ( ! isset( $parts[1] ) ) { continue; } $headers[ trim( $parts[0] ) ] = trim( $parts[1] ); } return $headers; } /** * @param string $header * @param string $value */ function set_header( $header, $value ) { parent::set_header( $header, $value ); if ( 'Plural-Forms' == $header ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } } } endif; if ( ! class_exists( 'NOOP_Translations', false ) ) : /** * Provides the same interface as Translations, but doesn't do anything */ class NOOP_Translations { var $entries = array(); var $headers = array(); function add_entry( $entry ) { return true; } /** * @param string $header * @param string $value */ function set_header( $header, $value ) { } /** * @param array $headers */ function set_headers( $headers ) { } /** * @param string $header * @return false */ function get_header( $header ) { return false; } /** * @param Translation_Entry $entry * @return false */ function translate_entry( &$entry ) { return false; } /** * @param string $singular * @param string $context */ function translate( $singular, $context = null ) { return $singular; } /** * @param int $count * @return bool */ function select_plural_form( $count ) { return 1 == $count ? 0 : 1; } /** * @return int */ function get_plural_forms_count() { return 2; } /** * @param string $singular * @param string $plural * @param int $count * @param string $context */ function translate_plural( $singular, $plural, $count, $context = null ) { return 1 == $count ? $singular : $plural; } /** * @param object $other */ function merge_with( &$other ) { } } endif; entry.php 0000666 00000006337 15214127726 0006442 0 ustar 00 <?php /** * Contains Translation_Entry class * * @version $Id: entry.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage entry */ if ( ! class_exists( 'Translation_Entry', false ) ) : /** * Translation_Entry class encapsulates a translatable string */ class Translation_Entry { /** * Whether the entry contains a string and its plural form, default is false * * @var boolean */ var $is_plural = false; var $context = null; var $singular = null; var $plural = null; var $translations = array(); var $translator_comments = ''; var $extracted_comments = ''; var $references = array(); var $flags = array(); /** * @param array $args associative array, support following keys: * - singular (string) -- the string to translate, if omitted and empty entry will be created * - plural (string) -- the plural form of the string, setting this will set {@link $is_plural} to true * - translations (array) -- translations of the string and possibly -- its plural forms * - context (string) -- a string differentiating two equal strings used in different contexts * - translator_comments (string) -- comments left by translators * - extracted_comments (string) -- comments left by developers * - references (array) -- places in the code this strings is used, in relative_to_root_path/file.php:linenum form * - flags (array) -- flags like php-format */ function __construct( $args = array() ) { // If no singular -- empty object. if ( ! isset( $args['singular'] ) ) { return; } // Get member variable values from args hash. foreach ( $args as $varname => $value ) { $this->$varname = $value; } if ( isset( $args['plural'] ) && $args['plural'] ) { $this->is_plural = true; } if ( ! is_array( $this->translations ) ) { $this->translations = array(); } if ( ! is_array( $this->references ) ) { $this->references = array(); } if ( ! is_array( $this->flags ) ) { $this->flags = array(); } } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see Translation_Entry::__construct() */ public function Translation_Entry( $args = array() ) { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct( $args ); } /** * Generates a unique key for this entry * * @return string|bool the key or false if the entry is empty */ function key() { if ( null === $this->singular || '' === $this->singular ) { return false; } // Prepend context and EOT, like in MO files. $key = ! $this->context ? $this->singular : $this->context . "\4" . $this->singular; // Standardize on \n line endings. $key = str_replace( array( "\r\n", "\r" ), "\n", $key ); return $key; } /** * @param object $other */ function merge_with( &$other ) { $this->flags = array_unique( array_merge( $this->flags, $other->flags ) ); $this->references = array_unique( array_merge( $this->references, $other->references ) ); if ( $this->extracted_comments != $other->extracted_comments ) { $this->extracted_comments .= $other->extracted_comments; } } } endif; po.php 0000666 00000034645 15214127726 0005722 0 ustar 00 <?php /** * Class for working with PO files * * @version $Id: po.php 1158 2015-11-20 04:31:23Z dd32 $ * @package pomo * @subpackage po */ require_once __DIR__ . '/translations.php'; if ( ! defined( 'PO_MAX_LINE_LEN' ) ) { define( 'PO_MAX_LINE_LEN', 79 ); } ini_set( 'auto_detect_line_endings', 1 ); /** * Routines for working with PO files */ if ( ! class_exists( 'PO', false ) ) : class PO extends Gettext_Translations { var $comments_before_headers = ''; /** * Exports headers to a PO entry * * @return string msgid/msgstr PO entry for this PO file headers, doesn't contain newline at the end */ function export_headers() { $header_string = ''; foreach ( $this->headers as $header => $value ) { $header_string .= "$header: $value\n"; } $poified = PO::poify( $header_string ); if ( $this->comments_before_headers ) { $before_headers = $this->prepend_each_line( rtrim( $this->comments_before_headers ) . "\n", '# ' ); } else { $before_headers = ''; } return rtrim( "{$before_headers}msgid \"\"\nmsgstr $poified" ); } /** * Exports all entries to PO format * * @return string sequence of mgsgid/msgstr PO strings, doesn't containt newline at the end */ function export_entries() { // TODO: Sorting. return implode( "\n\n", array_map( array( 'PO', 'export_entry' ), $this->entries ) ); } /** * Exports the whole PO file as a string * * @param bool $include_headers whether to include the headers in the export * @return string ready for inclusion in PO file string for headers and all the enrtries */ function export( $include_headers = true ) { $res = ''; if ( $include_headers ) { $res .= $this->export_headers(); $res .= "\n\n"; } $res .= $this->export_entries(); return $res; } /** * Same as {@link export}, but writes the result to a file * * @param string $filename where to write the PO string * @param bool $include_headers whether to include tje headers in the export * @return bool true on success, false on error */ function export_to_file( $filename, $include_headers = true ) { $fh = fopen( $filename, 'w' ); if ( false === $fh ) { return false; } $export = $this->export( $include_headers ); $res = fwrite( $fh, $export ); if ( false === $res ) { return false; } return fclose( $fh ); } /** * Text to include as a comment before the start of the PO contents * * Doesn't need to include # in the beginning of lines, these are added automatically */ function set_comment_before_headers( $text ) { $this->comments_before_headers = $text; } /** * Formats a string in PO-style * * @param string $string the string to format * @return string the poified string */ public static function poify( $string ) { $quote = '"'; $slash = '\\'; $newline = "\n"; $replaces = array( "$slash" => "$slash$slash", "$quote" => "$slash$quote", "\t" => '\t', ); $string = str_replace( array_keys( $replaces ), array_values( $replaces ), $string ); $po = $quote . implode( "${slash}n$quote$newline$quote", explode( $newline, $string ) ) . $quote; // Add empty string on first line for readbility. if ( false !== strpos( $string, $newline ) && ( substr_count( $string, $newline ) > 1 || substr( $string, -strlen( $newline ) ) !== $newline ) ) { $po = "$quote$quote$newline$po"; } // Remove empty strings. $po = str_replace( "$newline$quote$quote", '', $po ); return $po; } /** * Gives back the original string from a PO-formatted string * * @param string $string PO-formatted string * @return string enascaped string */ public static function unpoify( $string ) { $escapes = array( 't' => "\t", 'n' => "\n", 'r' => "\r", '\\' => '\\', ); $lines = array_map( 'trim', explode( "\n", $string ) ); $lines = array_map( array( 'PO', 'trim_quotes' ), $lines ); $unpoified = ''; $previous_is_backslash = false; foreach ( $lines as $line ) { preg_match_all( '/./u', $line, $chars ); $chars = $chars[0]; foreach ( $chars as $char ) { if ( ! $previous_is_backslash ) { if ( '\\' == $char ) { $previous_is_backslash = true; } else { $unpoified .= $char; } } else { $previous_is_backslash = false; $unpoified .= isset( $escapes[ $char ] ) ? $escapes[ $char ] : $char; } } } // Standardise the line endings on imported content, technically PO files shouldn't contain \r. $unpoified = str_replace( array( "\r\n", "\r" ), "\n", $unpoified ); return $unpoified; } /** * Inserts $with in the beginning of every new line of $string and * returns the modified string * * @param string $string prepend lines in this string * @param string $with prepend lines with this string */ public static function prepend_each_line( $string, $with ) { $lines = explode( "\n", $string ); $append = ''; if ( "\n" === substr( $string, -1 ) && '' === end( $lines ) ) { /* * Last line might be empty because $string was terminated * with a newline, remove it from the $lines array, * we'll restore state by re-terminating the string at the end. */ array_pop( $lines ); $append = "\n"; } foreach ( $lines as &$line ) { $line = $with . $line; } unset( $line ); return implode( "\n", $lines ) . $append; } /** * Prepare a text as a comment -- wraps the lines and prepends # * and a special character to each line * * @access private * @param string $text the comment text * @param string $char character to denote a special PO comment, * like :, default is a space */ public static function comment_block( $text, $char = ' ' ) { $text = wordwrap( $text, PO_MAX_LINE_LEN - 3 ); return PO::prepend_each_line( $text, "#$char " ); } /** * Builds a string from the entry for inclusion in PO file * * @param Translation_Entry $entry the entry to convert to po string (passed by reference). * @return string|false PO-style formatted string for the entry or * false if the entry is empty */ public static function export_entry( &$entry ) { if ( null === $entry->singular || '' === $entry->singular ) { return false; } $po = array(); if ( ! empty( $entry->translator_comments ) ) { $po[] = PO::comment_block( $entry->translator_comments ); } if ( ! empty( $entry->extracted_comments ) ) { $po[] = PO::comment_block( $entry->extracted_comments, '.' ); } if ( ! empty( $entry->references ) ) { $po[] = PO::comment_block( implode( ' ', $entry->references ), ':' ); } if ( ! empty( $entry->flags ) ) { $po[] = PO::comment_block( implode( ', ', $entry->flags ), ',' ); } if ( $entry->context ) { $po[] = 'msgctxt ' . PO::poify( $entry->context ); } $po[] = 'msgid ' . PO::poify( $entry->singular ); if ( ! $entry->is_plural ) { $translation = empty( $entry->translations ) ? '' : $entry->translations[0]; $translation = PO::match_begin_and_end_newlines( $translation, $entry->singular ); $po[] = 'msgstr ' . PO::poify( $translation ); } else { $po[] = 'msgid_plural ' . PO::poify( $entry->plural ); $translations = empty( $entry->translations ) ? array( '', '' ) : $entry->translations; foreach ( $translations as $i => $translation ) { $translation = PO::match_begin_and_end_newlines( $translation, $entry->plural ); $po[] = "msgstr[$i] " . PO::poify( $translation ); } } return implode( "\n", $po ); } public static function match_begin_and_end_newlines( $translation, $original ) { if ( '' === $translation ) { return $translation; } $original_begin = "\n" === substr( $original, 0, 1 ); $original_end = "\n" === substr( $original, -1 ); $translation_begin = "\n" === substr( $translation, 0, 1 ); $translation_end = "\n" === substr( $translation, -1 ); if ( $original_begin ) { if ( ! $translation_begin ) { $translation = "\n" . $translation; } } elseif ( $translation_begin ) { $translation = ltrim( $translation, "\n" ); } if ( $original_end ) { if ( ! $translation_end ) { $translation .= "\n"; } } elseif ( $translation_end ) { $translation = rtrim( $translation, "\n" ); } return $translation; } /** * @param string $filename * @return boolean */ function import_from_file( $filename ) { $f = fopen( $filename, 'r' ); if ( ! $f ) { return false; } $lineno = 0; while ( true ) { $res = $this->read_entry( $f, $lineno ); if ( ! $res ) { break; } if ( '' == $res['entry']->singular ) { $this->set_headers( $this->make_headers( $res['entry']->translations[0] ) ); } else { $this->add_entry( $res['entry'] ); } } PO::read_line( $f, 'clear' ); if ( false === $res ) { return false; } if ( ! $this->headers && ! $this->entries ) { return false; } return true; } /** * Helper function for read_entry * * @param string $context * @return bool */ protected static function is_final( $context ) { return ( 'msgstr' === $context ) || ( 'msgstr_plural' === $context ); } /** * @param resource $f * @param int $lineno * @return null|false|array */ function read_entry( $f, $lineno = 0 ) { $entry = new Translation_Entry(); // Where were we in the last step. // Can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural. $context = ''; $msgstr_index = 0; while ( true ) { $lineno++; $line = PO::read_line( $f ); if ( ! $line ) { if ( feof( $f ) ) { if ( self::is_final( $context ) ) { break; } elseif ( ! $context ) { // We haven't read a line and EOF came. return null; } else { return false; } } else { return false; } } if ( "\n" === $line ) { continue; } $line = trim( $line ); if ( preg_match( '/^#/', $line, $m ) ) { // The comment is the start of a new entry. if ( self::is_final( $context ) ) { PO::read_line( $f, 'put-back' ); $lineno--; break; } // Comments have to be at the beginning. if ( $context && 'comment' !== $context ) { return false; } // Add comment. $this->add_comment_to_entry( $entry, $line ); } elseif ( preg_match( '/^msgctxt\s+(".*")/', $line, $m ) ) { if ( self::is_final( $context ) ) { PO::read_line( $f, 'put-back' ); $lineno--; break; } if ( $context && 'comment' !== $context ) { return false; } $context = 'msgctxt'; $entry->context .= PO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgid\s+(".*")/', $line, $m ) ) { if ( self::is_final( $context ) ) { PO::read_line( $f, 'put-back' ); $lineno--; break; } if ( $context && 'msgctxt' !== $context && 'comment' !== $context ) { return false; } $context = 'msgid'; $entry->singular .= PO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgid_plural\s+(".*")/', $line, $m ) ) { if ( 'msgid' !== $context ) { return false; } $context = 'msgid_plural'; $entry->is_plural = true; $entry->plural .= PO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgstr\s+(".*")/', $line, $m ) ) { if ( 'msgid' !== $context ) { return false; } $context = 'msgstr'; $entry->translations = array( PO::unpoify( $m[1] ) ); } elseif ( preg_match( '/^msgstr\[(\d+)\]\s+(".*")/', $line, $m ) ) { if ( 'msgid_plural' !== $context && 'msgstr_plural' !== $context ) { return false; } $context = 'msgstr_plural'; $msgstr_index = $m[1]; $entry->translations[ $m[1] ] = PO::unpoify( $m[2] ); } elseif ( preg_match( '/^".*"$/', $line ) ) { $unpoified = PO::unpoify( $line ); switch ( $context ) { case 'msgid': $entry->singular .= $unpoified; break; case 'msgctxt': $entry->context .= $unpoified; break; case 'msgid_plural': $entry->plural .= $unpoified; break; case 'msgstr': $entry->translations[0] .= $unpoified; break; case 'msgstr_plural': $entry->translations[ $msgstr_index ] .= $unpoified; break; default: return false; } } else { return false; } } $have_translations = false; foreach ( $entry->translations as $t ) { if ( $t || ( '0' === $t ) ) { $have_translations = true; break; } } if ( false === $have_translations ) { $entry->translations = array(); } return array( 'entry' => $entry, 'lineno' => $lineno, ); } /** * @staticvar string $last_line * @staticvar boolean $use_last_line * * @param resource $f * @param string $action * @return boolean */ function read_line( $f, $action = 'read' ) { static $last_line = ''; static $use_last_line = false; if ( 'clear' == $action ) { $last_line = ''; return true; } if ( 'put-back' == $action ) { $use_last_line = true; return true; } $line = $use_last_line ? $last_line : fgets( $f ); $line = ( "\r\n" == substr( $line, -2 ) ) ? rtrim( $line, "\r\n" ) . "\n" : $line; $last_line = $line; $use_last_line = false; return $line; } /** * @param Translation_Entry $entry * @param string $po_comment_line */ function add_comment_to_entry( &$entry, $po_comment_line ) { $first_two = substr( $po_comment_line, 0, 2 ); $comment = trim( substr( $po_comment_line, 2 ) ); if ( '#:' == $first_two ) { $entry->references = array_merge( $entry->references, preg_split( '/\s+/', $comment ) ); } elseif ( '#.' == $first_two ) { $entry->extracted_comments = trim( $entry->extracted_comments . "\n" . $comment ); } elseif ( '#,' == $first_two ) { $entry->flags = array_merge( $entry->flags, preg_split( '/,\s*/', $comment ) ); } else { $entry->translator_comments = trim( $entry->translator_comments . "\n" . $comment ); } } /** * @param string $s * @return string */ public static function trim_quotes( $s ) { if ( substr( $s, 0, 1 ) == '"' ) { $s = substr( $s, 1 ); } if ( substr( $s, -1, 1 ) == '"' ) { $s = substr( $s, 0, -1 ); } return $s; } } endif; mo.php 0000666 00000022237 15214127726 0005711 0 ustar 00 <?php /** * Class for working with MO files * * @version $Id: mo.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage mo */ require_once __DIR__ . '/translations.php'; require_once __DIR__ . '/streams.php'; if ( ! class_exists( 'MO', false ) ) : class MO extends Gettext_Translations { var $_nplurals = 2; /** * Loaded MO file. * * @var string */ private $filename = ''; /** * Returns the loaded MO file. * * @return string The loaded MO file. */ public function get_filename() { return $this->filename; } /** * Fills up with the entries from MO file $filename * * @param string $filename MO file to load * @return bool True if the import from file was successful, otherwise false. */ function import_from_file( $filename ) { $reader = new POMO_FileReader( $filename ); if ( ! $reader->is_resource() ) { return false; } $this->filename = (string) $filename; return $this->import_from_reader( $reader ); } /** * @param string $filename * @return bool */ function export_to_file( $filename ) { $fh = fopen( $filename, 'wb' ); if ( ! $fh ) { return false; } $res = $this->export_to_file_handle( $fh ); fclose( $fh ); return $res; } /** * @return string|false */ function export() { $tmp_fh = fopen( 'php://temp', 'r+' ); if ( ! $tmp_fh ) { return false; } $this->export_to_file_handle( $tmp_fh ); rewind( $tmp_fh ); return stream_get_contents( $tmp_fh ); } /** * @param Translation_Entry $entry * @return bool */ function is_entry_good_for_export( $entry ) { if ( empty( $entry->translations ) ) { return false; } if ( ! array_filter( $entry->translations ) ) { return false; } return true; } /** * @param resource $fh * @return true */ function export_to_file_handle( $fh ) { $entries = array_filter( $this->entries, array( $this, 'is_entry_good_for_export' ) ); ksort( $entries ); $magic = 0x950412de; $revision = 0; $total = count( $entries ) + 1; // All the headers are one entry. $originals_lenghts_addr = 28; $translations_lenghts_addr = $originals_lenghts_addr + 8 * $total; $size_of_hash = 0; $hash_addr = $translations_lenghts_addr + 8 * $total; $current_addr = $hash_addr; fwrite( $fh, pack( 'V*', $magic, $revision, $total, $originals_lenghts_addr, $translations_lenghts_addr, $size_of_hash, $hash_addr ) ); fseek( $fh, $originals_lenghts_addr ); // Headers' msgid is an empty string. fwrite( $fh, pack( 'VV', 0, $current_addr ) ); $current_addr++; $originals_table = "\0"; $reader = new POMO_Reader(); foreach ( $entries as $entry ) { $originals_table .= $this->export_original( $entry ) . "\0"; $length = $reader->strlen( $this->export_original( $entry ) ); fwrite( $fh, pack( 'VV', $length, $current_addr ) ); $current_addr += $length + 1; // Account for the NULL byte after. } $exported_headers = $this->export_headers(); fwrite( $fh, pack( 'VV', $reader->strlen( $exported_headers ), $current_addr ) ); $current_addr += strlen( $exported_headers ) + 1; $translations_table = $exported_headers . "\0"; foreach ( $entries as $entry ) { $translations_table .= $this->export_translations( $entry ) . "\0"; $length = $reader->strlen( $this->export_translations( $entry ) ); fwrite( $fh, pack( 'VV', $length, $current_addr ) ); $current_addr += $length + 1; } fwrite( $fh, $originals_table ); fwrite( $fh, $translations_table ); return true; } /** * @param Translation_Entry $entry * @return string */ function export_original( $entry ) { // TODO: Warnings for control characters. $exported = $entry->singular; if ( $entry->is_plural ) { $exported .= "\0" . $entry->plural; } if ( $entry->context ) { $exported = $entry->context . "\4" . $exported; } return $exported; } /** * @param Translation_Entry $entry * @return string */ function export_translations( $entry ) { // TODO: Warnings for control characters. return $entry->is_plural ? implode( "\0", $entry->translations ) : $entry->translations[0]; } /** * @return string */ function export_headers() { $exported = ''; foreach ( $this->headers as $header => $value ) { $exported .= "$header: $value\n"; } return $exported; } /** * @param int $magic * @return string|false */ function get_byteorder( $magic ) { // The magic is 0x950412de. // bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565 $magic_little = (int) - 1794895138; $magic_little_64 = (int) 2500072158; // 0xde120495 $magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF; if ( $magic_little == $magic || $magic_little_64 == $magic ) { return 'little'; } elseif ( $magic_big == $magic ) { return 'big'; } else { return false; } } /** * @param POMO_FileReader $reader * @return bool True if the import was successful, otherwise false. */ function import_from_reader( $reader ) { $endian_string = MO::get_byteorder( $reader->readint32() ); if ( false === $endian_string ) { return false; } $reader->setEndian( $endian_string ); $endian = ( 'big' == $endian_string ) ? 'N' : 'V'; $header = $reader->read( 24 ); if ( $reader->strlen( $header ) != 24 ) { return false; } // Parse header. $header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lenghts_addr/{$endian}translations_lenghts_addr/{$endian}hash_length/{$endian}hash_addr", $header ); if ( ! is_array( $header ) ) { return false; } // Support revision 0 of MO format specs, only. if ( 0 != $header['revision'] ) { return false; } // Seek to data blocks. $reader->seekto( $header['originals_lenghts_addr'] ); // Read originals' indices. $originals_lengths_length = $header['translations_lenghts_addr'] - $header['originals_lenghts_addr']; if ( $originals_lengths_length != $header['total'] * 8 ) { return false; } $originals = $reader->read( $originals_lengths_length ); if ( $reader->strlen( $originals ) != $originals_lengths_length ) { return false; } // Read translations' indices. $translations_lenghts_length = $header['hash_addr'] - $header['translations_lenghts_addr']; if ( $translations_lenghts_length != $header['total'] * 8 ) { return false; } $translations = $reader->read( $translations_lenghts_length ); if ( $reader->strlen( $translations ) != $translations_lenghts_length ) { return false; } // Transform raw data into set of indices. $originals = $reader->str_split( $originals, 8 ); $translations = $reader->str_split( $translations, 8 ); // Skip hash table. $strings_addr = $header['hash_addr'] + $header['hash_length'] * 4; $reader->seekto( $strings_addr ); $strings = $reader->read_all(); $reader->close(); for ( $i = 0; $i < $header['total']; $i++ ) { $o = unpack( "{$endian}length/{$endian}pos", $originals[ $i ] ); $t = unpack( "{$endian}length/{$endian}pos", $translations[ $i ] ); if ( ! $o || ! $t ) { return false; } // Adjust offset due to reading strings to separate space before. $o['pos'] -= $strings_addr; $t['pos'] -= $strings_addr; $original = $reader->substr( $strings, $o['pos'], $o['length'] ); $translation = $reader->substr( $strings, $t['pos'], $t['length'] ); if ( '' === $original ) { $this->set_headers( $this->make_headers( $translation ) ); } else { $entry = &$this->make_entry( $original, $translation ); $this->entries[ $entry->key() ] = &$entry; } } return true; } /** * Build a Translation_Entry from original string and translation strings, * found in a MO file * * @static * @param string $original original string to translate from MO file. Might contain * 0x04 as context separator or 0x00 as singular/plural separator * @param string $translation translation string from MO file. Might contain * 0x00 as a plural translations separator * @return Translation_Entry Entry instance. */ function &make_entry( $original, $translation ) { $entry = new Translation_Entry(); // Look for context, separated by \4. $parts = explode( "\4", $original ); if ( isset( $parts[1] ) ) { $original = $parts[1]; $entry->context = $parts[0]; } // Look for plural original. $parts = explode( "\0", $original ); $entry->singular = $parts[0]; if ( isset( $parts[1] ) ) { $entry->is_plural = true; $entry->plural = $parts[1]; } // Plural translations are also separated by \0. $entry->translations = explode( "\0", $translation ); return $entry; } /** * @param int $count * @return string */ function select_plural_form( $count ) { return $this->gettext_select_plural_form( $count ); } /** * @return int */ function get_plural_forms_count() { return $this->_nplurals; } } endif; streams.php 0000666 00000016422 15214127726 0006753 0 ustar 00 <?php /** * Classes, which help reading streams of data from files. * Based on the classes from Danilo Segan <danilo@kvota.net> * * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage streams */ if ( ! class_exists( 'POMO_Reader', false ) ) : class POMO_Reader { var $endian = 'little'; var $_post = ''; /** * PHP5 constructor. */ function __construct() { $this->is_overloaded = ( ( ini_get( 'mbstring.func_overload' ) & 2 ) != 0 ) && function_exists( 'mb_substr' ); $this->_pos = 0; } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see POMO_Reader::__construct() */ public function POMO_Reader() { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct(); } /** * Sets the endianness of the file. * * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'. */ function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid $this->endian = $endian; } /** * Reads a 32bit Integer from the Stream * * @return mixed The integer, corresponding to the next 32 bits from * the stream of false if there are not enough bytes or on error */ function readint32() { $bytes = $this->read( 4 ); if ( 4 != $this->strlen( $bytes ) ) { return false; } $endian_letter = ( 'big' == $this->endian ) ? 'N' : 'V'; $int = unpack( $endian_letter, $bytes ); return reset( $int ); } /** * Reads an array of 32-bit Integers from the Stream * * @param integer $count How many elements should be read * @return mixed Array of integers or false if there isn't * enough data or on error */ function readint32array( $count ) { $bytes = $this->read( 4 * $count ); if ( 4 * $count != $this->strlen( $bytes ) ) { return false; } $endian_letter = ( 'big' == $this->endian ) ? 'N' : 'V'; return unpack( $endian_letter . $count, $bytes ); } /** * @param string $string * @param int $start * @param int $length * @return string */ function substr( $string, $start, $length ) { if ( $this->is_overloaded ) { return mb_substr( $string, $start, $length, 'ascii' ); } else { return substr( $string, $start, $length ); } } /** * @param string $string * @return int */ function strlen( $string ) { if ( $this->is_overloaded ) { return mb_strlen( $string, 'ascii' ); } else { return strlen( $string ); } } /** * @param string $string * @param int $chunk_size * @return array */ function str_split( $string, $chunk_size ) { if ( ! function_exists( 'str_split' ) ) { $length = $this->strlen( $string ); $out = array(); for ( $i = 0; $i < $length; $i += $chunk_size ) { $out[] = $this->substr( $string, $i, $chunk_size ); } return $out; } else { return str_split( $string, $chunk_size ); } } /** * @return int */ function pos() { return $this->_pos; } /** * @return true */ function is_resource() { return true; } /** * @return true */ function close() { return true; } } endif; if ( ! class_exists( 'POMO_FileReader', false ) ) : class POMO_FileReader extends POMO_Reader { /** * @param string $filename */ function __construct( $filename ) { parent::__construct(); $this->_f = fopen( $filename, 'rb' ); } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see POMO_FileReader::__construct() */ public function POMO_FileReader( $filename ) { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct( $filename ); } /** * @param int $bytes * @return string|false Returns read string, otherwise false. */ function read( $bytes ) { return fread( $this->_f, $bytes ); } /** * @param int $pos * @return boolean */ function seekto( $pos ) { if ( -1 == fseek( $this->_f, $pos, SEEK_SET ) ) { return false; } $this->_pos = $pos; return true; } /** * @return bool */ function is_resource() { return is_resource( $this->_f ); } /** * @return bool */ function feof() { return feof( $this->_f ); } /** * @return bool */ function close() { return fclose( $this->_f ); } /** * @return string */ function read_all() { $all = ''; while ( ! $this->feof() ) { $all .= $this->read( 4096 ); } return $all; } } endif; if ( ! class_exists( 'POMO_StringReader', false ) ) : /** * Provides file-like methods for manipulating a string instead * of a physical file. */ class POMO_StringReader extends POMO_Reader { var $_str = ''; /** * PHP5 constructor. */ function __construct( $str = '' ) { parent::__construct(); $this->_str = $str; $this->_pos = 0; } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see POMO_StringReader::__construct() */ public function POMO_StringReader( $str = '' ) { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct( $str ); } /** * @param string $bytes * @return string */ function read( $bytes ) { $data = $this->substr( $this->_str, $this->_pos, $bytes ); $this->_pos += $bytes; if ( $this->strlen( $this->_str ) < $this->_pos ) { $this->_pos = $this->strlen( $this->_str ); } return $data; } /** * @param int $pos * @return int */ function seekto( $pos ) { $this->_pos = $pos; if ( $this->strlen( $this->_str ) < $this->_pos ) { $this->_pos = $this->strlen( $this->_str ); } return $this->_pos; } /** * @return int */ function length() { return $this->strlen( $this->_str ); } /** * @return string */ function read_all() { return $this->substr( $this->_str, $this->_pos, $this->strlen( $this->_str ) ); } } endif; if ( ! class_exists( 'POMO_CachedFileReader', false ) ) : /** * Reads the contents of the file in the beginning. */ class POMO_CachedFileReader extends POMO_StringReader { /** * PHP5 constructor. */ function __construct( $filename ) { parent::__construct(); $this->_str = file_get_contents( $filename ); if ( false === $this->_str ) { return false; } $this->_pos = 0; } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see POMO_CachedFileReader::__construct() */ public function POMO_CachedFileReader( $filename ) { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct( $filename ); } } endif; if ( ! class_exists( 'POMO_CachedIntFileReader', false ) ) : /** * Reads the contents of the file in the beginning. */ class POMO_CachedIntFileReader extends POMO_CachedFileReader { /** * PHP5 constructor. */ public function __construct( $filename ) { parent::__construct( $filename ); } /** * PHP4 constructor. * * @deprecated 5.4.0 Use __construct() instead. * * @see POMO_CachedIntFileReader::__construct() */ function POMO_CachedIntFileReader( $filename ) { _deprecated_constructor( self::class, '5.4.0', static::class ); self::__construct( $filename ); } } endif;
dvadf
dvadf
| ver. 1.4 |
Github
|
.
| PHP 7.0.33 | Generation time: 0 |
proxy
|
phpinfo
|
Settings