diff options
Diffstat (limited to 'includes/specials/SpecialVersion.php')
-rw-r--r-- | includes/specials/SpecialVersion.php | 303 |
1 files changed, 213 insertions, 90 deletions
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 101823db..0331f056 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -29,15 +29,15 @@ * @ingroup SpecialPage */ class SpecialVersion extends SpecialPage { - + protected $firstExtOpened = false; protected static $extensionTypes = false; - + protected static $viewvcUrls = array( 'svn+ssh://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', 'http://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', - # Doesn't work at the time of writing but maybe some day: + # Doesn't work at the time of writing but maybe some day: 'https://svn.wikimedia.org/viewvc/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', ); @@ -49,30 +49,33 @@ class SpecialVersion extends SpecialPage { * main() */ public function execute( $par ) { - global $wgOut, $wgSpecialVersionShowHooks, $wgContLang; - + global $wgOut, $wgSpecialVersionShowHooks, $wgRequest; + $this->setHeaders(); $this->outputHeader(); $wgOut->allowClickjacking(); - $wgOut->addHTML( Xml::openElement( 'div', - array( 'dir' => $wgContLang->getDir() ) ) ); - $text = + $text = $this->getMediaWikiCredits() . $this->softwareInformation() . $this->getExtensionCredits(); if ( $wgSpecialVersionShowHooks ) { $text .= $this->getWgHooks(); } - + $wgOut->addWikiText( $text ); $wgOut->addHTML( $this->IPInfo() ); - $wgOut->addHTML( '</div>' ); + + if ( $wgRequest->getVal( 'easteregg' ) ) { + if ( $this->showEasterEgg() ) { + // TODO: put something interesting here + } + } } /** * Returns wiki text showing the license information. - * + * * @return string */ private static function getMediaWikiCredits() { @@ -113,7 +116,7 @@ class SpecialVersion extends SpecialPage { /** * Returns wiki text showing the third party software versions (apache, php, mysql). - * + * * @return string */ static function softwareInformation() { @@ -136,14 +139,14 @@ class SpecialVersion extends SpecialPage { <th>" . wfMsg( 'version-software-product' ) . "</th> <th>" . wfMsg( 'version-software-version' ) . "</th> </tr>\n"; - + foreach( $software as $name => $version ) { $out .= "<tr> <td>" . $name . "</td> - <td>" . $version . "</td> + <td class=\"ltr\">" . $version . "</td> </tr>\n"; } - + return $out . Xml::closeElement( 'table' ); } @@ -163,8 +166,8 @@ class SpecialVersion extends SpecialPage { $version = "$wgVersion (r{$info['checkout-rev']})"; } else { $version = $wgVersion . ' ' . - wfMsg( - 'version-svn-revision', + wfMsg( + 'version-svn-revision', isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', $info['checkout-rev'] ); @@ -173,7 +176,7 @@ class SpecialVersion extends SpecialPage { wfProfileOut( __METHOD__ ); return $version; } - + /** * Return a wikitext-formatted string of the MediaWiki version with a link to * the SVN revision if available. @@ -183,16 +186,16 @@ class SpecialVersion extends SpecialPage { public static function getVersionLinked() { global $wgVersion, $IP; wfProfileIn( __METHOD__ ); - + $info = self::getSvnInfo( $IP ); - + if ( isset( $info['checkout-rev'] ) ) { $linkText = wfMsg( 'version-svn-revision', isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', $info['checkout-rev'] ); - + if ( isset( $info['viewvc-url'] ) ) { $version = "$wgVersion [{$info['viewvc-url']} $linkText]"; } else { @@ -201,7 +204,7 @@ class SpecialVersion extends SpecialPage { } else { $version = $wgVersion; } - + wfProfileOut( __METHOD__ ); return $version; } @@ -209,13 +212,13 @@ class SpecialVersion extends SpecialPage { /** * Returns an array with the base extension types. * Type is stored as array key, the message as array value. - * + * * TODO: ideally this would return all extension types, including * those added by SpecialVersionExtensionTypes. This is not possible * since this hook is passing along $this though. - * + * * @since 1.17 - * + * * @return array */ public static function getExtensionTypes() { @@ -225,44 +228,46 @@ class SpecialVersion extends SpecialPage { 'parserhook' => wfMsg( 'version-parserhooks' ), 'variable' => wfMsg( 'version-variables' ), 'media' => wfMsg( 'version-mediahandlers' ), + 'antispam' => wfMsg( 'version-antispam' ), 'skin' => wfMsg( 'version-skins' ), + 'api' => wfMsg( 'version-api' ), 'other' => wfMsg( 'version-other' ), ); - + wfRunHooks( 'ExtensionTypes', array( &self::$extensionTypes ) ); } - + return self::$extensionTypes; } - + /** * Returns the internationalized name for an extension type. - * + * * @since 1.17 - * + * * @param $type String - * + * * @return string */ public static function getExtensionTypeName( $type ) { $types = self::getExtensionTypes(); return isset( $types[$type] ) ? $types[$type] : $types['other']; } - + /** * Generate wikitext showing extensions name, URL, author and description. * * @return String: Wikitext */ function getExtensionCredits() { - global $wgExtensionCredits, $wgExtensionFunctions, $wgParser, $wgSkinExtensionFunctions; + global $wgExtensionCredits, $wgExtensionFunctions, $wgParser; - if ( !count( $wgExtensionCredits ) && !count( $wgExtensionFunctions ) && !count( $wgSkinExtensionFunctions ) ) { + if ( !count( $wgExtensionCredits ) && !count( $wgExtensionFunctions ) ) { return ''; } $extensionTypes = self::getExtensionTypes(); - + /** * @deprecated as of 1.17, use hook ExtensionTypes instead. */ @@ -271,25 +276,25 @@ class SpecialVersion extends SpecialPage { $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), wfMsg( 'version-extensions' ) ) . Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) ); - // Make sure the 'other' type is set to an array. + // Make sure the 'other' type is set to an array. if ( !array_key_exists( 'other', $wgExtensionCredits ) ) { $wgExtensionCredits['other'] = array(); } - + // Find all extensions that do not have a valid type and give them the type 'other'. foreach ( $wgExtensionCredits as $type => $extensions ) { if ( !array_key_exists( $type, $extensionTypes ) ) { $wgExtensionCredits['other'] = array_merge( $wgExtensionCredits['other'], $extensions ); } } - + // Loop through the extension categories to display their extensions in the list. foreach ( $extensionTypes as $type => $message ) { if ( $type != 'other' ) { $out .= $this->getExtensionCategory( $type, $message ); } } - + // We want the 'other' type to be last in the list. $out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] ); @@ -309,36 +314,32 @@ class SpecialVersion extends SpecialPage { $out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n"; } - if( count( $fhooks = $wgParser->getFunctionHooks() ) ) { + $fhooks = $wgParser->getFunctionHooks(); + if( count( $fhooks ) ) { $out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ), 'parser-function-hooks' ); $out .= '<tr><td colspan="4">' . $this->listToText( $fhooks ) . "</td></tr>\n"; } - if ( count( $wgSkinExtensionFunctions ) ) { - $out .= $this->openExtType( wfMsg( 'version-skin-extension-functions' ), 'skin-extension-functions' ); - $out .= '<tr><td colspan="4">' . $this->listToText( $wgSkinExtensionFunctions ) . "</td></tr>\n"; - } - $out .= Xml::closeElement( 'table' ); - + return $out; } - + /** * Creates and returns the HTML for a single extension category. - * + * * @since 1.17 - * + * * @param $type String * @param $message String - * + * * @return string */ protected function getExtensionCategory( $type, $message ) { - global $wgExtensionCredits; - + global $wgExtensionCredits; + $out = ''; - + if ( array_key_exists( $type, $wgExtensionCredits ) && count( $wgExtensionCredits[$type] ) > 0 ) { $out .= $this->openExtType( $message, 'credits-' . $type ); @@ -350,7 +351,7 @@ class SpecialVersion extends SpecialPage { } return $out; - } + } /** * Callback to sort extensions by type. @@ -368,14 +369,14 @@ class SpecialVersion extends SpecialPage { /** * Creates and formats the creidts for a single extension and returns this. - * + * * @param $extension Array - * + * * @return string */ function getCreditsForExtension( array $extension ) { $name = isset( $extension['name'] ) ? $extension['name'] : '[no name]'; - + if ( isset( $extension['path'] ) ) { $svnInfo = self::getSvnInfo( dirname($extension['path']) ); $directoryRev = isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : null; @@ -393,10 +394,10 @@ class SpecialVersion extends SpecialPage { } else { $mainLink = $name; } - + if ( isset( $extension['version'] ) ) { - $versionText = '<span class="mw-version-ext-version">' . - wfMsg( 'version-version', $extension['version'] ) . + $versionText = '<span class="mw-version-ext-version">' . + wfMsg( 'version-version', $extension['version'] ) . '</span>'; } else { $versionText = ''; @@ -412,22 +413,19 @@ class SpecialVersion extends SpecialPage { # Make description text. $description = isset ( $extension['description'] ) ? $extension['description'] : ''; - + if( isset ( $extension['descriptionmsg'] ) ) { # Look for a localized description. $descriptionMsg = $extension['descriptionmsg']; - + if( is_array( $descriptionMsg ) ) { $descriptionMsgKey = $descriptionMsg[0]; // Get the message key array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only array_map( "htmlspecialchars", $descriptionMsg ); // For sanity - $msg = wfMsg( $descriptionMsgKey, $descriptionMsg ); + $description = wfMsg( $descriptionMsgKey, $descriptionMsg ); } else { - $msg = wfMsg( $descriptionMsg ); + $description = wfMsg( $descriptionMsg ); } - if ( !wfEmptyMsg( $descriptionMsg, $msg ) && $msg != '' ) { - $description = $msg; - } } if ( $svnText !== false ) { @@ -438,12 +436,12 @@ class SpecialVersion extends SpecialPage { $extNameVer = "<tr> <td colspan=\"2\"><em>$mainLink $versionText</em></td>"; } - + $author = isset ( $extension['author'] ) ? $extension['author'] : array(); $extDescAuthor = "<td>$description</td> - <td>" . $this->listToText( (array)$author, false ) . "</td> + <td>" . $this->listAuthors( $author, false ) . "</td> </tr>\n"; - + return $extNameVer . $extDescAuthor; } @@ -466,11 +464,12 @@ class SpecialVersion extends SpecialPage { <th>" . wfMsg( 'version-hook-subscribedby' ) . "</th> </tr>\n"; - foreach ( $myWgHooks as $hook => $hooks ) + foreach ( $myWgHooks as $hook => $hooks ) { $ret .= "<tr> <td>$hook</td> <td>" . $this->listToText( $hooks ) . "</td> </tr>\n"; + } $ret .= Xml::closeElement( 'table' ); return $ret; @@ -487,13 +486,13 @@ class SpecialVersion extends SpecialPage { $out .= '<tr class="sv-space">' . Html::element( 'td', $opt ) . "</tr>\n"; } $this->firstExtOpened = true; - + if( $name ) { $opt['id'] = "sv-$name"; } $out .= "<tr>" . Xml::element( 'th', $opt, $text ) . "</tr>\n"; - + return $out; } @@ -509,11 +508,29 @@ class SpecialVersion extends SpecialPage { } /** + * Return a formatted unsorted list of authors + * + * @param $authors mixed: string or array of strings + * @return String: HTML fragment + */ + function listAuthors( $authors ) { + $list = array(); + foreach( (array)$authors as $item ) { + if( $item == '...' ) { + $list[] = wfMsg( 'version-poweredby-others' ); + } else { + $list[] = $item; + } + } + return $this->listToText( $list, false ); + } + + /** * Convert an array of items into a list for display. * * @param $list Array of elements to display * @param $sort Boolean: whether to sort the items in $list - * + * * @return String */ function listToText( $list, $sort = true ) { @@ -538,29 +555,31 @@ class SpecialVersion extends SpecialPage { * * @param $list Mixed: will convert an array to string if given and return * the paramater unaltered otherwise - * + * * @return Mixed */ - static function arrayToString( $list ) { - if( is_array( $list ) && count( $list ) == 1 ) + public static function arrayToString( $list ) { + if( is_array( $list ) && count( $list ) == 1 ) { $list = $list[0]; + } if( is_object( $list ) ) { $class = get_class( $list ); return "($class)"; } elseif ( !is_array( $list ) ) { return $list; } else { - if( is_object( $list[0] ) ) + if( is_object( $list[0] ) ) { $class = get_class( $list[0] ); - else + } else { $class = $list[0]; + } return "($class, {$list[1]})"; } } /** - * Get an associative array of information about a given path, from its .svn - * subdirectory. Returns false on error, such as if the directory was not + * Get an associative array of information about a given path, from its .svn + * subdirectory. Returns false on error, such as if the directory was not * checked out with subversion. * * Returned keys are: @@ -608,7 +627,7 @@ class SpecialVersion extends SpecialPage { } } } - + return false; } @@ -616,26 +635,26 @@ class SpecialVersion extends SpecialPage { if ( count( $lines ) < 11 ) { return false; } - + $info = array( 'checkout-rev' => intval( trim( $lines[3] ) ), 'url' => trim( $lines[4] ), 'repo-url' => trim( $lines[5] ), 'directory-rev' => intval( trim( $lines[10] ) ) ); - + if ( isset( self::$viewvcUrls[$info['repo-url']] ) ) { - $viewvc = str_replace( - $info['repo-url'], + $viewvc = str_replace( + $info['repo-url'], self::$viewvcUrls[$info['repo-url']], $info['url'] ); - + $viewvc .= '/?pathrev='; $viewvc .= urlencode( $info['checkout-rev'] ); $info['viewvc-url'] = $viewvc; } - + return $info; } @@ -643,12 +662,12 @@ class SpecialVersion extends SpecialPage { * Retrieve the revision number of a Subversion working directory. * * @param $dir String: directory of the svn checkout - * + * * @return Integer: revision number as int */ public static function getSvnRevision( $dir ) { $info = self::getSvnInfo( $dir ); - + if ( $info === false ) { return false; } elseif ( isset( $info['checkout-rev'] ) ) { @@ -658,4 +677,108 @@ class SpecialVersion extends SpecialPage { } } + function showEasterEgg() { + $rx = $rp = $xe = ''; + $alpha = array("", "kbQW", "\$\n()"); + $beta = implode( "', '", $alpha); + $juliet = 'echo $delta + strrev($foxtrot) - $alfa + $wgVersion . base64_decode($bravo) * $charlie'; + for ( $i = 1; $i <= 4; $i++ ) { + $rx .= '([^j]*)J'; + $rp .= "+(\\$i)"; + } + + $rx = "/$rx/Sei"; + $O = substr("$alpha')", 1); + for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) { + $rx[$i-1] = strtolower( $rx[$i-1] ); + } + $ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*"; + $ry = "/$ry/Sei"; + $O = substr("$beta')", 1); + preg_match_all('/(?<=\$)[[:alnum:]]*/',substr($juliet, 0, $i<<1), $charlie); + foreach( $charlie[0] as $bravo ) { + $$bravo =& $xe; + } + $xe = 'xe=<<<mo/./hfromowoxv=<<<m +쵍潅旅왎캎𐺆ߨ趥䲀쫥Ꝍ螃䤎꤯溃櫅褡䞠⽬✡栠迤⾏쾃줏袏浣।궇䬃꼁꿤𘐧 +윥桯䦎䵎Ꞅ涁쭀讀撠蝠讄伣枮ⵇ𐡃𐭏沢𞴏⠤쳯蒣䮎컡豣ۅ⦇𐫁漅蛁꼤从楆 +⥀䡦沢⠬輁䲯좡梇䟇伄육较촅䥃要迯쟠꺃ⶥ栆궀撠満ꐣ좧𐠅𐠧讇輤亀➏欣첡쮧⽬ +氀쮧跧𐫥䪀⬬⾅ⵏ괬ত櫤䭀楦괥챣楀귧읠죯쒡ۅ䳄䤄괬躏譇䮄搥䯄津䶮⾅𐫅 +𐴂௧쮯궣輥ߡ亀氀诤⿅諃⫤䮣⦬죄椎貧ඇ쿇亏跤⦌术থۏ仆䛇枡䪄곁謠ⶏⶃ䞣 +궥螏蝁ꤣ⟬极涇𞴧伢ଅ즡⡌浣䯇쿃ⳇ궏ས⢃曦⦥蛧갠컡楧𘬧袏⦏⢠䳠챤⽧⬣⼀潧⭅椤 +軁종쵃䬆꤇溎楯곡⢡꾥첥쫧Ⱨ균檏辀䭮⡄𐞯쿁䱤𐠠柅迠웏⾅豠𐡀𐡅䱀轡⾯쥃⥁溆 +䢣䞮柄ꠌⶡ𐳣蛤椏✠귬ຄ䶃毥𞡯桥ꐥ❣쳀⡧𖥢꽧죄തޥ歠ແ위䯎撯쬁䮣浅 +쾇泮𐢁켄䦯꾯迡曎䢦쿣杦궯⡀䤦䷢𐭢쟁쯯⧤蟯䡏氇𞢣蝤궧ߢ𐭆䛃찃쭣沠 +䴃𐣣䣎𐺃ꥅ轃⣄蟧⦡蟃毣洇䞎Ҡ潄仆𐲃철䢤俎譯泠쮄␥栏쾯ⳏ짡⥡߂ކ澥䲀ⵀ +ⵡ✬輄䱀굡榏❡첄⦄ꡥⶣ𞡤⺁ݣ𐢅⤡꿄蝡ⴄ贁氃ޅ짣߁𐫄ۥ𐱅欤 +梢蝡柧䥏仏撣𐳣𞠅좇蒣䰤྅࿂ಇ濤䞦쮅沮潁좤澅杣棦ꤤ洯𐳃콅궧쭠 +桎䝆겡쭄겯䥂ⶀ⽬䠇쳄❬Ⰼ䐦⿌웃𒿠첏𐛡浣涆⢤অ䭎갣䴮⡃꤯죠䰀쬯༄䫏 +𐱂ꢅ䬦賧유辇➥佃仮귣젏⭅ꢡ각컄⒤⻠讁涅䠃跥袏佄𐳇泄껧棇满གྷ輤괅❥겠 +𒐧䣂ꤏ襃伎襡웅걯䳣켁쭄洠컥❅⿏亂쯅⢁𐠦诤꣏辀𖥢椯겇毣濢➠ +䮮浥겁沣졣䜦泇歏𐾄搯曯柆ۇۇ䞀泆武況꽌𐧢ꝅ軀⬠쾣𞡀榧𞣏Ⱡ䠦Ⲥ쿇䬄貃柅涢 +갏⼁𐿧ݏౠ𐿣褀涡༅䮄➇ꝣݥ䡏䯎梢輇ꤠ䫣䵀ण漂⢡軀௦襁쫇⾡濧沤 +䜇伢ۇ汧첏䤎잤䛯Ⰱ俇ꢧ殂궏榮ޣ涂氏滦즤蜀⠥𐺏쐣⾏껬콇漯Ꝡ柦櫇읁梠仇장滦⟠꿯 +쮁搥櫢𐫣ꠏ椥𐛤誅栮朥迣⺄ඇ⿏䬂쾏⫠⒧✏궇襤⡁濃Ⱐ歯䛠쮠𞟤컃𞢯⬣濡䦣 +衏貣柂森챏ಇ고蟄䤏젯⫯楀䞄䳣쮅궤轧껯𐪃潇ބ浣𐬀蝤⽧쐣쾇➣𐡦䮠䤣𐠄 +Ꝡ𐾁蠤䬦覯搦⥯쥏梂걯ⵁ೦챁躄轡䢦𐝂財䲧𐦁䬎첁棏␣౦잧棆젥襁젃䤏⢏榀ⵁ +螅赡𒿯ⶣ赧꾤濁涆𐴂ॡ䳦ߢ赁䯇䢃ꠌ泄柠泡찇𐛢䪂𐝢櫇漥⟤淣ഡ䳮த谀ཡ +➁血꽧蟧辧게⻣쳏ഡ䠄杮죃汦諤య毠蝅𐦄謄殯䳀ⳏ쟇ආ잏𐿡䳃ۂ䝇䦇⥌켏쥯춏 +𖽢𐳃𐿧𐝢䥦棇潡⥄歡찁朆⻠䤆𖤧漢ꡅ⽄쾠衏䤣অ䤣𐡡𐢏䞦ߣ裏 +ཅۄ춁䲃欆귬𐺀诀滁䝃챃첥꺏쫅䱮અ견Ф𐫁佣澢쿏⽅侮榅𐾄य쥏蜏䣣 +𐫏쵥➤跡殃䰣䯤읤ⴏ굄⥇줡걬০켃𜼧첣䜂찃궀谀Ɽ伎䢮ꤥ⾣𐭁沅䬇䧠𐱇 +沀濡ठ쟠𐺅ꐣ𐴂躄佇⦇毄计賀䢎澡䲄캀䟣褀蠤൯棏蜃澄❧⾥撦⽬ⶥ𐪄யބ躄 +䬎챯⽯䬎Ꞅ굥𐢂⠥䝧朄࿏웥꽬གྷ浅⦁❬𐺆侢栦⧠궠ඦ趤谥此𐲂𐬃軠𐞦 +蛄俧袥补榏읠⤁⠀豇俢쮯꤇➏𐴁ⶤ涮찣읁榠跣⦅ໃಆ䵣谠ꢯ⡧淯柤궡✠䮎괯❅朎 +⥅웣䯮첀꒤𐣠쭏洀蛡楆ൡ䮮ү氠𐜏濆䜢䷯潣歃䷯웁쭄椥䟂➅ૡༀ䭧ܣ죅ए軯䧣 +Ⱔ䐢⬥檂䠮⫤䛠꜡䛆讠✠꿏欣蠡켏豣譄𞣇춣䠃䰠撦朅䮄榦溃貀䶇⾁澡䲮榀 +𐪄䢆侄朦꜇ཏ췧꺁枠櫧桠괬枇ꜯ곇𐰂𘜧𐦄컡濦汥줠𞲡輀𐠣쥇⣃𞴏䳂⟤漇쯣껃𐾀衃 +쯇𐝄浥洄楠৯춥蒧⾯𐫆༂ꤌ毮䤆⺄༠०袀䢂죃ⴣ𐿯梇溄毦螄櫤쳃栅満걌毠ⱌ꒧䢆 +ꥁ泎仧궀辯諯웅津趃অ꿏伏캁⠃𐦂ꝣ䛂贤济杧𐝁撠䱤殥歡躇楄꒧꽧䡣쵧𐱆ꜯ위 +ཀ谠諃𐬃軅␥贠撣߅꽤⠥ಡ𐝀궥윁Ⰴܯ즡歎ⵅഏ蝁구ꝧ܅䱦껡䛦߅蒯俧콣梧䛠ꡇ +ݧ웥Т⬠䬦榀𐢂貤謣䱦⒡췧濇⧣⤀좯殧줤⣀楏楎굏ݤ滁ۇ𘐧䒯Ⰰҡ䰦椯❏ +趯𐣯豀쵅춀⳥䷠읡ۯ⺄ۅ䶏춤枂櫅ۅ𞥅䱃䭣汮澃𞢃谥ⵤ구콡曤𞣏ই߂읅蠠䞦ꞇⲏ諧 +趯첏䬎𐡏李겠⥇曢汥浆欠躅𐦁𞲯谡袧襃棧𞡡蟀侠찇챠쪇洠܀쯤䝇螏蜏俄⼀ལ +谥촯䲦⥁ඤ𐐧⤃궅༡褡䭏毆濆⧡蛣Ф蠏ݤ賯꜁溅⡡ߡ䮄榆䵄求謥𐐧Ꞁ쯏⧡貇䛇䐢撦袥 +쮇䫀দ굯⻤襇줅⬅ہఠ⻀쒠䫆𐡅梄梯輤䥣읏⤄ⶡ诃䮢譡ߤ枤櫥伦袠ꢃ쳀裣䰄 +槥淠䯃ඏ⒯𞠣椦泮汣赃潥ദ䰏쮡蝏毁䶂䦧档䪂쟀𐿯졇웄䳎汀𐫣 +漠ꐡଥ认꽡𐭏⦄梎આ枀䠦楇쒤ꞃꤡⴅꞅඅҡ氣즤裀櫁༦𐳃쳣𐡯桧权굁죁 +짤𖤧蟃澀𞲯ߏ⣣⬁Ⱔ졥潆ꐡ⽤웁浥𐫄棆갤濧⼣겅쬄൧젣此潆⻯䜃꤯궠쮥𘬧曀⿅譅槣䞂 +䝎ꡏ䰀梥⾬ܡ𞠥𞺃䢮આ䧮쮃誅櫆죯诠䵀䯀跥⻥䤆Ⰰ꜄棧枃⻇థ誃࿇贄𞡣欎⽡ +𞲄⬏杇𐠅𐱃𞢤➁𐢄꒥즏亀쭁漆첁殎쮁滠𐠥榯⡀䮆䣠준讥䶇⪅껃泃楀갠複撮 +✡𐭢ແ쫃⽤規䥇沁轁𐡅ಢ䧮椁⬇𐤁𞡯杅武楥歎䟄溇䯢迃䪎䳤满ଅⱇ쭀ಥ𞥄䥆⧥좃 +유栤༡𐰃俇Ⰵ殇蠄⽏⾠܇澄⡤䪎榮Я견濂賣쮠仠䝮䶢𐫆ݏ襅褥찯𞤤ݥ象侯쵇궥𞠃윀웧 +殀蛡⫥亃觯潥蠀补ⴄ觧𐡇𐾆ꐯ䡣췡潏⻯⾁諏య꿧䱠찥ꞅ⪃콄즯쳣覧Ⲅ쐯⬃ඤ겤 +ⵃ蟥谣轇䛂𐮄佀߁氣榡桇䷯觠椄챥ꠌ蒯꜌䭤➡侦䣤䲀쥁⒤𐦄Ꝭ䢮ꡌ歡䝯䢣괯⥀ +줣०殣⟄趥좠洦ꢬ装䠆曧➁𒿧椃䠀𞡅𖼧䳇ງ줄ধⰬ覠ꝃ殣涡䳠귥⫤覯𞲡༦ +䢦쥥줤ꡤড젃ಧꢥ諤ඥ枅줄躀ఏ䦎졯譄➇仄䰏蛏촡䞣춅涧⡄滀ଢ䮇每𘠧侇澀ꐡ杣 +槧߅䶠윥귡귧⤯ཆ裁毧⬤蝧첀⭁潤䝎池殤Ҡ䝯ཁ쟧氢귡𒿯ꥄ⭌䜇ۥ +ꝡ棄⣏ꤥ০쮁桧𐐧ⴤꠡ軅衄䠦ߤ܅ⲃଢ蛄溎椀𞠀䛃𞡣𞟣澅䧤⡇贤⫌쪄ށ朣 +⻏켅⼡𐲀잠௧𞥀౧䦤ས誇漎譠迄䦂䳇正계楧ޅ✬棅쭯诠枢䥮䭆楆컧ଆ +➬అ䤦誃𐠅𐿤䟀洀⡤滤𞥇즀𐠁⼃䰎溄꽅웇✡䲀⡏ܣ讣⼤覄䡇అ蝀⥌侧껄Ꝭ流贀 +漁쒤첧죏곡⣃趃賄撠।읠ⶌ⾥춧쒡쿀䵯毁涠⣡ꡄ䢀満棃䡯𐛣୯䳯ⵡୡ䥃❇⠅䣆杧𐳃 +귧覀漎𞴁𞤡ཇ䰦𞲣❃歆콣꿇朏𞢄Ꝍ𞡅賡曏꼃꼬ಇ𞴯资榎쮯輤ॡ䜎⦌𐠏⡃쳁࿀ +쯣껧쪃椃쐡⟤߇웅䱧䛣𐳤쮀䠏꽣⠣쟣𞢅ദ洅촥컇쵡ꞅ䠆⒥涯䐢ⴅ쮤꺅 +𞥇컠ⳁ漃𐲃윇诤겣𞥄伣䜠⻇𞡀修꜡䳎❄켇꽡쭄洂꜠Ⰳ쵅𐬂梀櫯䜯꜡䛣༏杇⪀캄⼌ +条𐳄没ⳅ➏첡❬侯캅检𞡧棡䥧𐳃𐝁ཧ謏𐫇讄枥첡쾀欎육웠𐭤୯濧譁챤䶢껤 +쒤𐾂辧褡⼣䳃␠豁ߡ櫦极ⶠઇꝠ𐭤沣棁柄𐳂䠯楅곅⼣⥃ༀ螡ߥ柤褣曠沧꒬ +𐴃䵂䲇蠀𐿧䲇ඦ⺁커謁컁漢䠀调ⲃ䢢ބ辅毡갯䤣椦𞲯१輯𘜧𐳅⽄䴆ଦ +䱠䒮諃ఏ𐠡桦谁𐡁쥡浣譀⫌쮥ꢅ컁曅ꥅଏ찀汅ೡ谠䬀𞴡䢠쳀⡏ߠߠඅ겧淤 +쥣每譄꼠쫁쭥讥ॡ쿇ஆ伃⫠汇䜢衯楥济俏极撮쬅蜏⧤蛥쮁⥃것ஃ줠䣇迅泆⤯𐧣 +萠泎ଡ蠄涣త⾏⻌䝧ༀ榮ү𐳃歂浅ꡥ첤⬇유讏欤俤잧⡌ⱁ춥氤𐠧修流쫤䵆𞠃܀웣 +곧萡ꠀ걁𞟠认쮀谥잡佮𞺏軡⾁쮯ߡ⧯쟡䰆⽀굇촤认䵄輥𞲇䡮侢朆쬣搢⽃濃⣧柁༢ +⼅ॠ軀浯ܡ컡谤ඤ曢⧠짠컠꿡𐺀곌濂ণ웧⾡栅䞠괬ܤ䦄伏曀了ཡ榧䭦⛃衧濠읥 +쵁𐛣⪅蜤𞤁装고쳅⻁ݣ䳆ৠ䐦ऄ⫏쿧䜎𐿣젡귧棥櫁쿣泯俣佦⾥朦潏ꢤꙧ𐺆ڦՈ췥 +췧䙭䶍澥쨯쵥Ⱕ쵥䗌쵍潅旅暬Ոⵤ旆줭젠ৡ쮠┢潧贮跣쓄䔭⽇𞴥ꔥ䓭 +₎챍澥엇곭贇Ԇ쬡쩯䘠䯃湁Ո꽤엇ꔭ₎谥䗌쳭䙭䟍◎쳭䙍侭쾇쵤蓄䕍췥췧䓭◎쳭 +䒭ߏ䓭亭è청䙭侭䷤擏䕍췤⽇䐍䕍ⵤ摆位ཧ暬è춍찤ⲥ䙭䔭è谥䗌첍䙭䟍◎䕍 +엎ߏ◎첍⒬䓭亭è效𐱅궤◄虬䶭侄䗌꾄쓅䕍췥췧╂旄◌첍旌藂꾄쓅䕍ⵤ檦첍旌暬è效 +꽤엇虬䕍𐱅궤⚤è챍澥엇춍찤ⲥ₎찭䙭侭쾇൧蓇䕍꽤엇暬೨藅䗌ⳇ查䗌찭䓭䙭䔭 +枅ද➥赏ⵯඏ춥쟅ⵅ쟥螥ⴅ춯䟏췯淯䴏ꗍ旌₆效ꡁ桁⪣꼭ⱅ졣쓀暬è +줭젠ৡ쮠┢꽠跮쵅䭀𞡀䗌è斈쳮𞴤侭ට潅暅汤津࿄𞴥ⶎ澥쑏肌惨澈漥쵤 +趤굄䶍澥쨯Ⱕ쵥䗌찭䓭䓭䐍è惨Э薎è擨₎ +mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo'; + + $haystack = preg_replace($ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet); + return preg_replace( $rx, $rp, $haystack ); + } } |