Merge "Limit the Title backlink cache to two instances."
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 11 Sep 2012 06:22:44 +0000 (06:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 11 Sep 2012 06:22:44 +0000 (06:22 +0000)
200 files changed:
.jshintignore
.jshintrc
RELEASE-NOTES-1.20
docs/hooks.txt
docs/language.txt
includes/Article.php
includes/Block.php
includes/CacheHelper.php
includes/EditPage.php
includes/Exception.php
includes/GlobalFunctions.php
includes/IP.php
includes/ImagePage.php
includes/OutputPage.php
includes/Sanitizer.php
includes/Skin.php
includes/SkinTemplate.php
includes/StreamFile.php
includes/Timestamp.php
includes/Title.php
includes/WikiPage.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiFormatBase.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiQuery.php
includes/db/DatabaseMysql.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/MysqlUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/logging/LogEventsList.php
includes/media/Bitmap.php
includes/media/Bitmap_ClientOnly.php
includes/media/DjVu.php
includes/media/FormatMetadata.php
includes/media/ImageHandler.php
includes/media/SVG.php
includes/normal/RandomTest.php
includes/objectcache/BagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/parser/Parser.php
includes/parser/Parser_LinkHooks.php
includes/search/SearchEngine.php
includes/specials/SpecialLog.php
includes/specials/SpecialTags.php
includes/specials/SpecialWhatlinkshere.php
includes/upload/UploadFromChunks.php
languages/classes/LanguageKk.php
languages/classes/LanguageWa.php
languages/messages/MessagesAce.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAst.php
languages/messages/MessagesBar.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBr.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHil.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesLb.php
languages/messages/MessagesMai.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesNah.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSe.php
languages/messages/MessagesSh.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesTa.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hant.php
maintenance/archives/patch-cat_hidden.sql [new file with mode: 0644]
maintenance/archives/upgradeLogging.php
maintenance/backup.inc
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/cleanupTable.inc
maintenance/dev/includes/router.php
maintenance/dumpIterator.php
maintenance/importDump.php
maintenance/language/alltrans.php
maintenance/language/checkDupeMessages.php
maintenance/language/countMessages.php
maintenance/language/date-formats.php
maintenance/language/digit2html.php
maintenance/language/dumpMessages.php
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerData.php
maintenance/purgeStaleMemcachedText.php [deleted file]
maintenance/rebuildImages.php
maintenance/refreshImageCount.php [deleted file]
maintenance/renderDump.php
maintenance/sql.php
maintenance/sqlite/archives/patch-cat_hidden.sql [new file with mode: 0644]
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/upgrade1_5.php
resources/Resources.php
resources/jquery/images/spinner-large.gif [new file with mode: 0644]
resources/jquery/images/spinner.gif
resources/jquery/jquery.arrowSteps.js
resources/jquery/jquery.autoEllipsis.js
resources/jquery/jquery.checkboxShiftClick.js
resources/jquery/jquery.client.js
resources/jquery/jquery.expandableField.js
resources/jquery/jquery.highlightText.js
resources/jquery/jquery.js
resources/jquery/jquery.mwExtension.js
resources/jquery/jquery.placeholder.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.qunit.css
resources/jquery/jquery.qunit.js
resources/jquery/jquery.spinner.css
resources/jquery/jquery.spinner.js
resources/jquery/jquery.textSelection.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.titleblacklist.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.user.js
skins/common/preview.js
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/maintenance/backupTextPassTest.php
thumb.php

index 45f2da7..026eaaa 100644 (file)
@@ -16,6 +16,6 @@ resources/jquery/jquery.xmldom.js
 resources/jquery.effects
 resources/jquery.tipsy
 resources/jquery.ui
-resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
+resources/mediawiki.libs
 tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
 tests/jasmine/lib/jasmine-1.0.1/jasmine.js
index 4cf86b8..b86ceb5 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -26,5 +26,5 @@
        "jquery": true,
 
        "nomen": true,
-       "onevar": false
+       "onevar": true
 }
index ab374fd..ce40066 100644 (file)
@@ -65,9 +65,9 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35685) api.php URL and other entry point URLs are now listed on
   Special:Version
 * Edit notices can now be translated.
-* jQuery upgraded to 1.8.1
+* jQuery upgraded to 1.7.2
 * jQuery UI upgraded to 1.8.23.
-* (bug 35705) QUnit upgraded from v1.2.0 to v1.9.0.
+* QUnit upgraded from v1.2.0 to v1.10.0.
 * (bug 37604) jquery.cookie upgraded to 2011 version.
 * (bug 22887) Add warning and tracking category for preprocessor errors
 * (bug 31704) Allow selection of associated namespace on the watchlist
@@ -99,6 +99,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   replacement, and so on.
 * (bug 34678) Added InternalParseBeforeSanitize hook which gets called during Parser's
   internalParse method just before the parser removes unwanted/dangerous HTML tags.
+* Added new hook AfterFinalPageOutput to allow modifications to buffered page output before sent
+  to the client.
 * (bug 36783) Implement jQuery Promise interface in mediawiki.api module.
 * Make dates in sortable tables sort according to the page content language
   instead of the site content language
@@ -141,6 +143,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   with auto-hide, multi-message support, and message replacement tags.
 * jquery.messageBox which appears to be unused by both core and extensions has
   been removed.
+* (bug 34939) made link parsking insensitive ([HttP://])
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -229,10 +232,14 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   PCRE is compiled without support for unicode properties.
 * (bug 30390) Suggested file name on Special:Upload should not contain
   illegal characters.
-* (bug 27111) Cascading foreign file repos now fetch shared descriptions properly.
 * EXIF below sea level GPS altitude data is now shown correctly.
 * (bug 39284) jquery.tablesorter should not consider "."" or "?"" to be a currency.
 * (bug 39273) "Show changes" should not be incorrectly displayed in the Live Preview state.
+* Made body-content lang attribute honor the variant language when it is set.
+* (bug 36761) "Mark pages as visited" now submits previously established filter options.
+* (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
+* (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
+* (bug 32552) Drop unused database field cat_hidden from table category.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
@@ -249,7 +256,6 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 34927) Output media_type for list=filearchive.
 * (bug 28814) add properties to output of action=parse.
 * (bug 33224) add variants of content language to meta=siteinfo.
-* (bug 36761) "Mark pages as visited" now submits previously established filter options.
 * (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached.
 * The paraminfo module now also contains result properties for most modules.
 * (bug 32348) Allow descending order for list=alllinks.
@@ -270,8 +276,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 38904) prop=revisions&rvstart=... no longer blows up when continuing.
 * (bug 39032) ApiQuery generates help in constructor.
 * (bug 11142) Improve file extension blacklist error reporting in API upload.
-* (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
-* (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
+* (bug 39665) Cache AllowedGenerator array so it doesn't autoload all query classes
+  on every request.
 
 === Languages updated in 1.20 ===
 
index 7844aaf..6105367 100644 (file)
@@ -290,6 +290,12 @@ $revCount: Number of revisions in the XML file
 $sRevCount: Number of sucessfully imported revisions
 $pageInfo: associative array of page information
 
+'AfterFinalPageOutput': Nearly at the end of OutputPage::output() but
+before OutputPage::sendCacheControl() and final ob_end_flush() which
+will send the buffered output to the client. This allows for last-minute
+modification of the output within the buffer by using ob_get_clean().
+$output: The OutputPage object where output() was called
+
 'AjaxAddScript': Called in output page just before the initialisation
 of the javascript ajax engine. The hook is only called when ajax
 is enabled ( $wgUseAjax = true; ).
@@ -314,6 +320,13 @@ $body: Body of the message
 Use this to extend core API modules.
 &$module: Module object
 
+'APICheckCanExecute': Called during ApiMain::checkCanExecute. Use to
+further authenticate and authorize API clients before executing the
+module. Return false and set a message to cancel the request.
+$module: Module object
+$user: Current user
+&$message: API usage message to die with
+
 'APIEditBeforeSave': before saving a page with api.php?action=edit,
 after processing request parameters. Return false to let the request
 fail, returning an error message or an <edit result="Failure"> tag
@@ -1703,6 +1716,11 @@ in the $searchEngine->namespaces array.
 $query : Original query.
 &$parsed : Resultant query with the prefixes stripped.
 
+'SearchResultInitFromTitle': Set the revision used when displaying a page in
+search results.
+$title : Current Title object being displayed in search results.
+&$id: Revision ID (default is false, for latest)
+
 'SearchableNamespaces': An option to modify which namespaces are searchable.
 &$arr : Array of namespaces ($nsId => $name) which will be used.
 
index 1df9881..42a6027 100644 (file)
@@ -1,21 +1,5 @@
 language.txt
 
-The Language object handles all readable text produced by the software. The most
-used function is getMessage(), usually called with the wrapper function wfMsg()
-which calls that method on the global language object. It just returns a piece
-of text given a text key. It is recommended that you use each key only
-once--bits of text in different contexts that happen to be identical in English
-may not be in other languages, so it's better to add new keys than to reuse them
-a lot. Likewise, if there is text that gets combined with things like names and
-titles, it is better to put markers like "$1" inside a piece of text and use
-str_replace() than to compose such messages in code, because their order may
-change in other languages too.
+The Language object handles all readable text produced by the software.
 
-While the system is running, there will be one global language object, which
-will be a subtype of Language. The methods in these objects will return the
-native text requested if available, otherwise they fall back to sending English
-text (which is why the LanguageEn object has no code at all--it just inherits
-the English defaults of the Language base class).
-
-The names of the namespaces are also contained in the language object, though
-the numbers are fixed.
+See http://www.mediawiki.org/wiki/Localisation#General_use_.28for_developers.29
index a3fb747..bec5f14 100644 (file)
@@ -1243,7 +1243,7 @@ class Article extends Page {
 
                if ( $appendSubtitle ) {
                        $out = $this->getContext()->getOutput();
-                       $out->appendSubtitle( wfMessage( 'redirectpagesub' )->escaped() );
+                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->escaped() );
                }
 
                // the loop prepends the arrow image before the link, so the first case needs to be outside
index 6e8f9f3..732699d 100644 (file)
@@ -1002,41 +1002,6 @@ class Block {
                return wfGetDB( DB_SLAVE )->getInfinity();
        }
 
-       /**
-        * Convert a DB-encoded expiry into a real string that humans can read.
-        *
-        * @param $encoded_expiry String: Database encoded expiry time
-        * @return Html-escaped String
-        * @deprecated since 1.18; use $wgLang->formatExpiry() instead
-        */
-       public static function formatExpiry( $encoded_expiry ) {
-               wfDeprecated( __METHOD__, '1.18' );
-
-               global $wgContLang;
-               static $msg = null;
-
-               if ( is_null( $msg ) ) {
-                       $msg = array();
-                       $keys = array( 'infiniteblock', 'expiringblock' );
-
-                       foreach ( $keys as $key ) {
-                               $msg[$key] = wfMessage( $key )->escaped();
-                       }
-               }
-
-               $expiry = $wgContLang->formatExpiry( $encoded_expiry, TS_MW );
-               if ( $expiry == wfGetDB( DB_SLAVE )->getInfinity() ) {
-                       $expirystr = $msg['infiniteblock'];
-               } else {
-                       global $wgLang;
-                       $expiredatestr = htmlspecialchars( $wgLang->date( $expiry, true ) );
-                       $expiretimestr = htmlspecialchars( $wgLang->time( $expiry, true ) );
-                       $expirystr = wfMsgReplaceArgs( $msg['expiringblock'], array( $expiredatestr, $expiretimestr ) );
-               }
-
-               return $expirystr;
-       }
-
        /**
         * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
         * ("24 May 2034"), into an absolute timestamp we can put into the database.
index 8199cb4..ac46fc4 100644 (file)
@@ -143,10 +143,18 @@ class CacheHelper implements ICacheHelper {
         * Function that gets called when initialization is done.
         *
         * @since 1.20
-        * @var function
+        * @var callable
         */
        protected $onInitHandler = false;
 
+       /**
+        * Elements to build a cache key with.
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $cacheKey = array();
+
        /**
         * Sets if the cache should be enabled or not.
         *
@@ -338,8 +346,13 @@ class CacheHelper implements ICacheHelper {
         * @since 1.20
         *
         * @return string
+        * @throws MWException
         */
        protected function getCacheKeyString() {
+               if ( $this->cacheKey === array() ) {
+                       throw new MWException( 'No cache key set, so cannot obtain or save the CacheHelper values.' );
+               }
+
                return call_user_func_array( 'wfMemcKey', $this->cacheKey );
        }
 
index f9bba19..55c65f6 100644 (file)
@@ -2459,7 +2459,7 @@ HTML
                wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) );
 
                return "<div id=\"editpage-copywarn\">\n" .
-                       call_user_func_array( "wfMsgNoTrans", $copywarnMsg ) . "\n</div>";
+                       call_user_func_array( 'wfMessage', $copywarnMsg )->plain() . "\n</div>";
        }
 
        protected function showStandardInputs( &$tabindex = 2 ) {
@@ -2489,7 +2489,7 @@ HTML
                $edithelpurl = Skin::makeInternalOrExternalUrl( wfMessage( 'edithelppage' )->inContentLanguage()->text() );
                $edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
                        wfMessage( 'edithelp' )->escaped() . '</a> ' .
-                       wfMessage( 'newwindow' )->escaped();
+                       wfMessage( 'newwindow' )->parse();
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
                $wgOut->addHTML( "      <span class='editHelp'>{$edithelp}</span>\n" );
                $wgOut->addHTML( "</div><!-- editButtons -->\n</div><!-- editOptions -->\n" );
index a131cca..714f73e 100644 (file)
@@ -240,7 +240,6 @@ class MWException extends Exception {
                        }
 
                        echo "</body></html>\n";
-                       die( 1 );
                }
        }
 
@@ -639,7 +638,7 @@ class MWExceptionHandler {
                                if ( $cmdLine ) {
                                        self::printError( $message );
                                } else {
-                                       self::escapeEchoAndDie( $message );
+                                       echo nl2br( htmlspecialchars( $message ) ) . "\n";
                                }
                        }
                } else {
@@ -653,7 +652,7 @@ class MWExceptionHandler {
                        if ( $cmdLine ) {
                                self::printError( $message );
                        } else {
-                               self::escapeEchoAndDie( $message );
+                               echo nl2br( htmlspecialchars( $message ) ) . "\n";
                        }
                }
        }
@@ -674,17 +673,6 @@ class MWExceptionHandler {
                }
        }
 
-       /**
-        * Print a message after escaping it and converting newlines to <br>
-        * Use this for non-command line failures.
-        *
-        * @param $message string Failure text
-        */
-       private static function escapeEchoAndDie( $message ) {
-               echo nl2br( htmlspecialchars( $message ) ) . "\n";
-               die(1);
-       }
-
        /**
         * Exception handler which simulates the appropriate catch() handling:
         *
index 0a60518..4080e46 100644 (file)
@@ -786,6 +786,9 @@ function wfParseUrl( $url ) {
                return false;
        }
 
+       // parse_url() incorrectly handles schemes case-sensitively. Convert it to lowercase.
+       $bits['scheme'] = strtolower( $bits['scheme'] );
+
        // most of the protocols are followed by ://, but mailto: and sometimes news: not, check for it
        if ( in_array( $bits['scheme'] . '://', $wgUrlProtocols ) ) {
                $bits['delimiter'] = '://';
@@ -1539,8 +1542,6 @@ function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true
 /**
  * Replace message parameter keys on the given formatted output.
  *
- * @deprecated since 1.18
- *
  * @param $message String
  * @param $args Array
  * @return string
@@ -2401,7 +2402,6 @@ define( 'TS_ISO_8601_BASIC', 9 );
 /**
  * Get a timestamp string in one of various formats
  *
- * @deprecated
  * @param $outputtype Mixed: A timestamp in one of the supported formats, the
  *                    function will autodetect which format is supplied and act
  *                    accordingly.
index 1828249..10c707e 100644 (file)
@@ -714,6 +714,7 @@ class IP {
         * @return String: valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
+               $addr = preg_replace( '/\%.*/','', $addr ); // remove zone info (bug 35738)
                if ( self::isValid( $addr ) ) {
                        return $addr;
                }
index fdc2061..c7afb76 100644 (file)
@@ -94,47 +94,10 @@ class ImagePage extends Article {
        /**
         * Handler for action=render
         * Include body text only; none of the image extras
-        * However, also include the shared description text
-        * so that cascading ForeignAPIRepo's work.
-        *
-        * @note This uses a div with the class "mw-shared-image-desc"
-        *    as opposed to the id "mw-shared-image-desc" since the text
-        *    from here may be cascadingly transcluded to other shared
-        *    repos, and we want all ids to be unique. On normal
-        *    view, the outermost shared description will still have
-        *    the id.
-        *
-        * This also differs from normal view in that "shareddescriptionfollows"
-        * message is not shown. I was not sure if it was appropriate to
-        * add that message here.
         */
        public function render() {
-               $out = $this->getContext()->getOutput();
-                $this->loadFile();
-
-                $descText = $this->mPage->getFile()->getDescriptionText();
-
-               $out->setArticleBodyOnly( true );
-
-               if ( !$descText ) {
-                       // If no description text, just do standard action=render
-                       parent::view();
-               } else {
-                       if ( $this->mPage->getID() !== 0 ) {
-                               // Local description exists. We need to output both
-                               parent::view();
-                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
-                       } else {
-                               // We don't want to output both a "noarticletext" message and the shared
-                               // description, so don't call parent::view().
-                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
-                               // Since we did not call parent::view(), have to call some methods it
-                               // normally takes care of. (Not that it matters much since skin not displayed)
-                               $out->setArticleFlag( true );
-                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $this->mPage->doViewUpdates( $this->getContext()->getUser() );
-                       }
-               }
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               parent::view();
        }
 
        public function view() {
@@ -190,7 +153,7 @@ class ImagePage extends Article {
                if ( $this->mPage->getID() ) {
                        # NS_FILE is in the user language, but this section (the actual wikitext)
                        # should be in page content language
-                       $pageLang = $this->getTitle()->getPageLanguage();
+                       $pageLang = $this->getTitle()->getPageViewLanguage();
                        $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
                                'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
@@ -209,7 +172,7 @@ class ImagePage extends Article {
                        if ( !$fol->isDisabled() ) {
                                $out->addWikiText( $fol->plain() );
                        }
-                       $out->addHTML( '<div id="shared-image-desc" class="mw-shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
                }
 
                $this->closeShowImage();
index 351c6fa..2c32c6a 100644 (file)
@@ -1990,6 +1990,9 @@ class OutputPage extends ContextSource {
                        wfProfileOut( 'Output-skin' );
                }
 
+               // This hook allows last minute changes to final overall output by modifying output buffer
+               wfRunHooks( 'AfterFinalPageOutput', array( $this ) );
+
                $this->sendCacheControl();
                ob_end_flush();
                wfProfileOut( __METHOD__ );
@@ -3545,7 +3548,7 @@ $templates
         *
         * Is equivalent to:
         *
-        *    $wgOut->addWikiText( "<div class='error'>\n" . wfMsgNoTrans( 'some-error' ) . "\n</div>" );
+        *    $wgOut->addWikiText( "<div class='error'>\n" . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
         * The newline after opening div is needed in some wikitext. See bug 19226.
         *
@@ -3562,7 +3565,6 @@ $templates
                                $args = $spec;
                                $name = array_shift( $args );
                                if ( isset( $args['options'] ) ) {
-                                       $options = $args['options'];
                                        unset( $args['options'] );
                                        wfDeprecated(
                                                'Adding "options" to ' . __METHOD__ . ' is no longer supported',
@@ -3573,7 +3575,7 @@ $templates
                                $args = array();
                                $name = $spec;
                        }
-                       $s = str_replace( '$' . ( $n + 1 ), wfMessage( $name, $args )->plain(), $s );
+                       $s = str_replace( '$' . ( $n + 1 ), $this->msg( $name, $args )->plain(), $s );
                }
                $this->addWikiText( $s );
        }
index a0c77da..734c4ec 100644 (file)
@@ -1026,7 +1026,7 @@ class Sanitizer {
 
                # Stupid hack
                $encValue = preg_replace_callback(
-                       '/(' . wfUrlProtocols() . ')/',
+                       '/((?i)' . wfUrlProtocols() . ')/',
                        array( 'Sanitizer', 'armorLinksCallback' ),
                        $encValue );
                return $encValue;
index 00eb5e8..968f215 100644 (file)
@@ -1063,7 +1063,7 @@ abstract class Skin extends ContextSource {
         * @return String URL
         */
        static function makeInternalOrExternalUrl( $name ) {
-               if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $name ) ) {
+               if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $name ) ) {
                        return $name;
                } else {
                        return self::makeUrl( $name );
@@ -1227,7 +1227,7 @@ abstract class Skin extends ContextSource {
                                                $text = $line[1];
                                        }
 
-                                       if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $link ) ) {
+                                       if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $link ) ) {
                                                $href = $link;
 
                                                // Parser::getExternalLinkAttribs won't work here because of the Namespace things
index d3502e9..bda4395 100644 (file)
@@ -400,7 +400,7 @@ class SkinTemplate extends Skin {
                if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
                        in_array( $request->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) &&
                        ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) {
-                       $pageLang = $title->getPageLanguage();
+                       $pageLang = $title->getPageViewLanguage();
                        $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
                        $realBodyAttribs['dir'] = $pageLang->getDir();
                        $realBodyAttribs['class'] = 'mw-content-'.$pageLang->getDir();
@@ -1153,7 +1153,7 @@ class SkinTemplate extends Skin {
                        if ( $revid ) {
                                $nav_urls['permalink'] = array(
                                        'text' => $this->msg( 'permalink' )->text(),
-                                       'href' => $out->getTitle()->getLocalURL( "oldid=$revid" )
+                                       'href' => $this->getTitle()->getLocalURL( "oldid=$revid" )
                                );
                        }
 
@@ -1181,9 +1181,8 @@ class SkinTemplate extends Skin {
                                'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
                        );
 
-                       $logPage = SpecialPage::getTitleFor( 'Log' );
                        $nav_urls['log'] = array(
-                               'href' => $logPage->getLocalUrl( array( 'user' => $rootUser ) )
+                               'href' => self::makeSpecialUrlSubpage( 'Log', $rootUser )
                        );
 
                        if ( $this->getUser()->isAllowed( 'block' ) ) {
index e7f7811..95c69a2 100644 (file)
@@ -79,8 +79,6 @@ class StreamFile {
        public static function prepareForStream(
                $path, $info, $headers = array(), $sendErrors = true
        ) {
-               global $wgLanguageCode;
-
                if ( !is_array( $info ) ) {
                        if ( $sendErrors ) {
                                header( 'HTTP/1.0 404 Not Found' );
@@ -121,9 +119,6 @@ class StreamFile {
                        return false;
                }
 
-               header( "Content-Disposition: inline;filename*=utf-8'$wgLanguageCode'" .
-                       urlencode( basename( $path ) ) );
-
                // Send additional headers
                foreach ( $headers as $header ) {
                        header( $header );
index 41665bc..c9ba8d9 100644 (file)
@@ -61,6 +61,7 @@ class MWTimestamp {
         * The actual timestamp being wrapped. Either a DateTime
         * object or a string with a Unix timestamp depending on
         * PHP.
+        * @var string|DateTime
         */
        private $timestamp;
 
@@ -68,7 +69,7 @@ class MWTimestamp {
         * Make a new timestamp and set it to the specified time,
         * or the current time if unspecified.
         *
-        * @param $timestamp Timestamp to set, or false for current time
+        * @param $timestamp bool|string Timestamp to set, or false for current time
         */
        public function __construct( $timestamp = false ) {
                $this->setTimestamp( $timestamp );
@@ -77,17 +78,17 @@ class MWTimestamp {
        /**
         * Set the timestamp to the specified time, or the current time if unspecified.
         *
-        * Parse the given timestamp into either a DateTime object or a Unix teimstamp,
+        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
         * and then store it.
         *
-        * @param $ts Timestamp to store, or false for now
+        * @param $ts string|bool Timestamp to store, or false for now
+        * @throws TimestampException
         */
        public function setTimestamp( $ts = false ) {
-               $uts = 0;
                $da = array();
                $strtime = '';
 
-               if ( !$ts ) { // We want to catch 0, '', null... but not date strings starting with a letter.
+               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) { // We want to catch 0, '', null... but not date strings starting with a letter.
                        $uts = time();
                        $strtime = "@$uts";
                } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
@@ -98,7 +99,6 @@ class MWTimestamp {
                        # TS_MW
                } elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) {
                        # TS_UNIX
-                       $uts = $ts;
                        $strtime = "@$ts"; // http://php.net/manual/en/datetime.formats.compound.php
                } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
                        # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
@@ -140,14 +140,14 @@ class MWTimestamp {
                        try {
                                $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
                        } catch(Exception $e) {
-                               throw new TimestampException( __METHOD__ . 'Invalid timestamp format.' );
+                               throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
                        }
                } else {
                        $final = strtotime( $strtime );
                }
 
                if( $final === false ) {
-                       throw new TimestampException( __METHOD__ . 'Invalid timestamp format.' );
+                       throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
                }
                $this->timestamp = $final;
        }
@@ -158,7 +158,8 @@ class MWTimestamp {
         * Convert the internal timestamp to the specified format and then
         * return it.
         *
-        * @param $style Output format for timestamp
+        * @param $style int Constant Output format for timestamp
+        * @throws TimestampException
         * @return string The formatted timestamp
         */
        public function getTimestamp( $style = TS_UNIX ) {
@@ -166,7 +167,7 @@ class MWTimestamp {
                        throw new TimestampException( __METHOD__ . ' : Illegal timestamp output type.' );
                }
 
-               if( is_object( $this->timestamp ) ) {
+               if( is_object( $this->timestamp  ) ) {
                        // DateTime object was used, call DateTime::format.
                        $output = $this->timestamp->format( self::$formats[$style] );
                } elseif( TS_UNIX == $style ) {
@@ -217,6 +218,9 @@ class MWTimestamp {
                }
        }
 
+       /**
+        * @return string
+        */
        public function __toString() {
                return $this->getTimestamp();
        }
index 98961f8..1b5e21d 100644 (file)
@@ -4432,6 +4432,11 @@ class Title {
                        'rd_title' => $this->getDBkey(),
                        'rd_from = page_id'
                );
+               if ( $this->isExternal() ) {
+                       $where['rd_interwiki'] = $this->getInterwiki();
+               } else {
+                       $where[] = 'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL';
+               }
                if ( !is_null( $ns ) ) {
                        $where['page_namespace'] = $ns;
                }
@@ -4526,9 +4531,9 @@ class Title {
        }
 
        /**
-        * Get the language in which the content of this page is written.
-        * Defaults to $wgContLang, but in certain cases it can be e.g.
-        * $wgLang (such as special pages, which are in the user language).
+        * Get the language in which the content of this page is written in
+        * wikitext. Defaults to $wgContLang, but in certain cases it can be
+        * e.g. $wgLang (such as special pages, which are in the user language).
         *
         * @since 1.18
         * @return Language
@@ -4553,4 +4558,29 @@ class Title {
                wfRunHooks( 'PageContentLanguage', array( $this, &$pageLang, $wgLang ) );
                return wfGetLangObj( $pageLang );
        }
+
+       /**
+        * Get the language in which the content of this page is written when
+        * viewed by user. Defaults to $wgContLang, but in certain cases it can be
+        * e.g. $wgLang (such as special pages, which are in the user language).
+        *
+        * @since 1.20
+        * @return Language
+        */
+       public function getPageViewLanguage() {
+               $pageLang = $this->getPageLanguage();
+               // If this is nothing special (so the content is converted when viewed)
+               if ( !$this->isSpecialPage()
+                       && !$this->isCssOrJsPage() && !$this->isCssJsSubpage()
+                       && $this->getNamespace() !== NS_MEDIAWIKI
+               ) {
+                       // If the user chooses a variant, the content is actually
+                       // in a language whose code is the variant code.
+                       $variant = $pageLang->getPreferredVariant();
+                       if ( $pageLang->getCode() !== $variant ) {
+                               $pageLang = Language::factory( $variant );
+                       }
+               }
+               return $pageLang;
+       }
 }
index 1021767..74772f2 100644 (file)
@@ -2406,9 +2406,9 @@ class WikiPage extends Page implements IDBAccessObject {
                $target = Revision::newFromId( $s->rev_id );
                if ( empty( $summary ) ) {
                        if ( $from == '' ) { // no public user name
-                               $summary = wfMessage( 'revertpage-nouser' )->inContentLanguage()->text();
+                               $summary = wfMessage( 'revertpage-nouser' );
                        } else {
-                               $summary = wfMessage( 'revertpage' )->inContentLanguage()->text();
+                               $summary = wfMessage( 'revertpage' );
                        }
                }
 
@@ -2418,7 +2418,11 @@ class WikiPage extends Page implements IDBAccessObject {
                        $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
                        $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
                );
-               $summary = wfMsgReplaceArgs( $summary, $args );
+               if( $summary instanceof Message ) {
+                       $summary = $summary->params( $args )->inContentLanguage()->text();
+               } else {
+                       $summary = wfMsgReplaceArgs( $summary, $args );
+               }
 
                # Truncate for whole multibyte characters.
                $summary = $wgContLang->truncate( $summary, 255 );
index 6c21306..9e5cd99 100644 (file)
@@ -478,7 +478,7 @@ class InfoAction extends FormlessAction {
         */
        protected function addRow( $table, $name, $value ) {
                return $table . Html::rawElement( 'tr', array(),
-                       Html::rawElement( 'td', array(), $name ) .
+                       Html::rawElement( 'td', array( 'valign' => 'top' ), $name ) .
                        Html::rawElement( 'td', array(), $value )
                );
        }
index 1e62766..875a381 100644 (file)
@@ -1401,10 +1401,9 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( isset( self::$messageMap[$key] ) ) {
-                       return array( 'code' =>
-                       wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
-                               'info' =>
-                               wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
+                       return array(
+                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
+                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
                        );
                }
 
index 54c90a6..8ad9b8c 100644 (file)
@@ -271,7 +271,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                // identify URLs
                $protos = wfUrlProtocolsWithoutProtRel();
                // This regex hacks around bug 13218 (&quot; included in the URL)
-               $text = preg_replace( "#(($protos).*?)(&quot;)?([ \\'\"<>\n]|&lt;|&gt;|&quot;)#", '<a href="\\1">\\1</a>\\3\\4', $text );
+               $text = preg_replace( "#(((?i)$protos).*?)(&quot;)?([ \\'\"<>\n]|&lt;|&gt;|&quot;)#", '<a href="\\1">\\1</a>\\3\\4', $text );
                // identify requests to api.php
                $text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
                if ( $this->mHelp ) {
index 2a94a65..35febd9 100644 (file)
@@ -761,6 +761,12 @@ class ApiMain extends ApiBase {
                                $this->dieReadOnly();
                        }
                }
+
+               // Allow extensions to stop execution for arbitrary reasons.
+               $message = false;
+               if( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
+                       $this->dieUsageMsg( $message );
+               }
        }
 
        /**
index 55148b1..9d73562 100644 (file)
@@ -75,6 +75,7 @@ class ApiMove extends ApiBase {
                }
 
                // Move the page
+               $toTitleExists = $toTitle->exists();
                $retval = $fromTitle->moveTo( $toTitle, true, $params['reason'], !$params['noredirect'] );
                if ( $retval !== true ) {
                        $this->dieUsageMsg( reset( $retval ) );
@@ -84,13 +85,20 @@ class ApiMove extends ApiBase {
                if ( !$params['noredirect'] || !$user->isAllowed( 'suppressredirect' ) ) {
                        $r['redirectcreated'] = '';
                }
+               if( $toTitleExists ) {
+                       $r['moveoverredirect'] = '';
+               }
 
                // Move the talk page
                if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
+                       $toTalkExists = $toTalk->exists();
                        $retval = $fromTalk->moveTo( $toTalk, true, $params['reason'], !$params['noredirect'] );
                        if ( $retval === true ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
+                               if( $toTalkExists ) {
+                                       $r['talkmoveoverredirect'] = '';
+                               }
                        } else {
                                // We're not gonna dieUsage() on failure, since we already changed something
                                $parsed = $this->parseMsg( reset( $retval ) );
@@ -231,6 +239,7 @@ class ApiMove extends ApiBase {
                                'to' => 'string',
                                'reason' => 'string',
                                'redirectcreated' => 'boolean',
+                               'moveoverredirect' => 'boolean',
                                'talkfrom' => array(
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
@@ -239,6 +248,7 @@ class ApiMove extends ApiBase {
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
                                ),
+                               'talkmoveoverredirect' => 'boolean',
                                'talkmove-error-code' => array(
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
index 7823e2f..554aae5 100644 (file)
@@ -47,55 +47,55 @@ class ApiQuery extends ApiBase {
        private $params, $redirects, $convertTitles, $iwUrl;
 
        private $mQueryPropModules = array(
+               'categories' => 'ApiQueryCategories',
+               'categoryinfo' => 'ApiQueryCategoryInfo',
+               'duplicatefiles' => 'ApiQueryDuplicateFiles',
+               'extlinks' => 'ApiQueryExternalLinks',
+               'images' => 'ApiQueryImages',
+               'imageinfo' => 'ApiQueryImageInfo',
                'info' => 'ApiQueryInfo',
-               'revisions' => 'ApiQueryRevisions',
                'links' => 'ApiQueryLinks',
                'iwlinks' => 'ApiQueryIWLinks',
                'langlinks' => 'ApiQueryLangLinks',
-               'images' => 'ApiQueryImages',
-               'imageinfo' => 'ApiQueryImageInfo',
+               'pageprops' => 'ApiQueryPageProps',
+               'revisions' => 'ApiQueryRevisions',
                'stashimageinfo' => 'ApiQueryStashImageInfo',
                'templates' => 'ApiQueryLinks',
-               'categories' => 'ApiQueryCategories',
-               'extlinks' => 'ApiQueryExternalLinks',
-               'categoryinfo' => 'ApiQueryCategoryInfo',
-               'duplicatefiles' => 'ApiQueryDuplicateFiles',
-               'pageprops' => 'ApiQueryPageProps',
        );
 
        private $mQueryListModules = array(
+               'allcategories' => 'ApiQueryAllCategories',
                'allimages' => 'ApiQueryAllImages',
-               'allpages' => 'ApiQueryAllPages',
                'alllinks' => 'ApiQueryAllLinks',
-               'allcategories' => 'ApiQueryAllCategories',
+               'allpages' => 'ApiQueryAllPages',
                'allusers' => 'ApiQueryAllUsers',
                'backlinks' => 'ApiQueryBacklinks',
                'blocks' => 'ApiQueryBlocks',
                'categorymembers' => 'ApiQueryCategoryMembers',
                'deletedrevs' => 'ApiQueryDeletedrevs',
                'embeddedin' => 'ApiQueryBacklinks',
+               'exturlusage' => 'ApiQueryExtLinksUsage',
                'filearchive' => 'ApiQueryFilearchive',
                'imageusage' => 'ApiQueryBacklinks',
                'iwbacklinks' => 'ApiQueryIWBacklinks',
                'langbacklinks' => 'ApiQueryLangBacklinks',
                'logevents' => 'ApiQueryLogEvents',
+               'protectedtitles' => 'ApiQueryProtectedTitles',
+               'querypage' => 'ApiQueryQueryPage',
+               'random' => 'ApiQueryRandom',
                'recentchanges' => 'ApiQueryRecentChanges',
                'search' => 'ApiQuerySearch',
                'tags' => 'ApiQueryTags',
                'usercontribs' => 'ApiQueryContributions',
+               'users' => 'ApiQueryUsers',
                'watchlist' => 'ApiQueryWatchlist',
                'watchlistraw' => 'ApiQueryWatchlistRaw',
-               'exturlusage' => 'ApiQueryExtLinksUsage',
-               'users' => 'ApiQueryUsers',
-               'random' => 'ApiQueryRandom',
-               'protectedtitles' => 'ApiQueryProtectedTitles',
-               'querypage' => 'ApiQueryQueryPage',
        );
 
        private $mQueryMetaModules = array(
+               'allmessages' => 'ApiQueryAllMessages',
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
-               'allmessages' => 'ApiQueryAllMessages',
        );
 
        private $mSlaveDB = null;
@@ -111,7 +111,8 @@ class ApiQuery extends ApiBase {
                parent::__construct( $main, $action );
 
                // Allow custom modules to be added in LocalSettings.php
-               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
+               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules,
+                       $wgMemc, $wgAPICacheHelpTimeout;
                self::appendUserModules( $this->mQueryPropModules, $wgAPIPropModules );
                self::appendUserModules( $this->mQueryListModules, $wgAPIListModules );
                self::appendUserModules( $this->mQueryMetaModules, $wgAPIMetaModules );
@@ -120,8 +121,22 @@ class ApiQuery extends ApiBase {
                $this->mListModuleNames = array_keys( $this->mQueryListModules );
                $this->mMetaModuleNames = array_keys( $this->mQueryMetaModules );
 
+               // Get array of query generators from cache if present
+               $key = wfMemcKey( 'apiquerygenerators', SpecialVersion::getVersion( 'nodb' ) );
+
+               if ( $wgAPICacheHelpTimeout > 0 ) {
+                       $cached = $wgMemc->get( $key );
+                       if ( $cached ) {
+                               $this->mAllowedGenerators = $cached;
+                               return;
+                       }
+               }
                $this->makeGeneratorList( $this->mQueryPropModules );
                $this->makeGeneratorList( $this->mQueryListModules );
+
+               if ( $wgAPICacheHelpTimeout > 0 ) {
+                       $wgMemc->set( $key, $this->mAllowedGenerators, $wgAPICacheHelpTimeout );
+               }
        }
 
        /**
index faa09ad..7f389da 100644 (file)
@@ -203,7 +203,13 @@ class DatabaseMysql extends DatabaseBase {
                wfSuppressWarnings();
                $row = mysql_fetch_object( $res );
                wfRestoreWarnings();
-               if( $this->lastErrno() ) {
+
+               $errno = $this->lastErrno();
+               // Unfortunately, mysql_fetch_object does not reset the last errno.
+               // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+               // these are the only errors mysql_fetch_object can cause.
+               // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+               if( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
@@ -221,7 +227,13 @@ class DatabaseMysql extends DatabaseBase {
                wfSuppressWarnings();
                $row = mysql_fetch_array( $res );
                wfRestoreWarnings();
-               if ( $this->lastErrno() ) {
+
+               $errno = $this->lastErrno();
+               // Unfortunately, mysql_fetch_array does not reset the last errno.
+               // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+               // these are the only errors mysql_fetch_object can cause.
+               // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+               if( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
index e59a13b..6b25982 100644 (file)
@@ -1105,17 +1105,27 @@ abstract class FileBackend {
        }
 
        /**
-        * Build a Content-Disposition header value per RFC 6266
+        * Build a Content-Disposition header value per RFC 6266.
         *
         * @param $type string One of (attachment, inline)
         * @param $filename string Suggested file name (should not contain slashes)
         * @return string
         * @since 1.20
         */
-       final public static function makeContentDisposition( $type, $filename ) {
+       final public static function makeContentDisposition( $type, $filename = '' ) {
+               $parts = array();
+
                $type = strtolower( $type );
-               $type = in_array( $type, array( 'inline', 'attachment' ) ) ? $type : 'inline';
-               return "$type; filename*=UTF-8''" . rawurlencode( basename( $filename ) );
+               if ( !in_array( $type, array( 'inline', 'attachment' ) ) ) {
+                       throw new MWException( "Invalid Content-Disposition type '$type'." );
+               }
+               $parts[] = $type;
+
+               if ( strlen( $filename ) ) {
+                       $parts[] = "filename*=UTF-8''" . rawurlencode( basename( $filename ) );
+               }
+
+               return implode( ';', $parts );
        }
 
        /**
index 5771560..083dfea 100644 (file)
@@ -292,8 +292,14 @@ abstract class FileBackendStore extends FileBackend {
                // Try to lock the source files for the scope of this function
                $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
-                       // Actually do the concatenation
+                       // Actually do the file concatenation...
+                       $start_time = microtime( true );
                        $status->merge( $this->doConcatenate( $params ) );
+                       $sec = microtime( true ) - $start_time;
+                       if ( !$status->isOK() ) {
+                               wfDebugLog( 'FileOperation', get_class( $this ) . " failed to concatenate " .
+                                       count( $params['srcs'] ) . " file(s) [$sec sec]" );
+                       }
                }
 
                wfProfileOut( __METHOD__ . '-' . $this->name );
index 88727e4..2cedb62 100644 (file)
@@ -162,6 +162,24 @@ class SwiftFileBackend extends FileBackendStore {
                return false;
        }
 
+       /**
+        * @param $disposition string Content-Disposition header value
+        * @return string Truncated Content-Disposition header value to meet Swift limits
+        */
+       protected function truncDisp( $disposition ) {
+               $res = '';
+               foreach ( explode( ';', $disposition ) as $part ) {
+                       $part = trim( $part );
+                       $new  = ( $res === '' ) ? $part : "{$res};{$part}";
+                       if ( strlen( $new ) <= 255 ) {
+                               $res = $new;
+                       } else {
+                               break; // too long; sigh
+                       }
+               }
+               return $res;
+       }
+
        /**
         * @see FileBackendStore::doCreateInternal()
         * @return Status
@@ -212,7 +230,7 @@ class SwiftFileBackend extends FileBackendStore {
                        }
                        // Set the Content-Disposition header if requested
                        if ( isset( $params['disposition'] ) ) {
-                               $obj->headers['Content-Disposition'] = $params['disposition'];
+                               $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $obj->write_async( $params['content'] );
@@ -302,7 +320,7 @@ class SwiftFileBackend extends FileBackendStore {
                        }
                        // Set the Content-Disposition header if requested
                        if ( isset( $params['disposition'] ) ) {
-                               $obj->headers['Content-Disposition'] = $params['disposition'];
+                               $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                wfSuppressWarnings();
@@ -392,7 +410,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
                        $hdrs = array(); // source file headers to override with new values
                        if ( isset( $params['disposition'] ) ) {
-                               $hdrs['Content-Disposition'] = $params['disposition'];
+                               $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -471,7 +489,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
                        $hdrs = array(); // source file headers to override with new values
                        if ( isset( $params['disposition'] ) ) {
-                               $hdrs['Content-Disposition'] = $params['disposition'];
+                               $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -1005,6 +1023,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $output = fopen( 'php://output', 'wb' );
                        $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
                        $obj->stream( $output, $this->headersFromParams( $params ) );
+               } catch ( NoSuchObjectException $e ) {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
                }
@@ -1218,6 +1238,19 @@ class SwiftFileBackend extends FileBackendStore {
                return $this->conn;
        }
 
+       /**
+        * Close the connection to the Swift proxy
+        *
+        * @return void
+        */
+       protected function closeConnection() {
+               if ( $this->conn ) {
+                       $this->conn->close(); // close active cURL handles in CF_Http object
+                       $this->sessionStarted = 0;
+                       $this->connContainerCache->clear();
+               }
+       }
+
        /**
         * Get the cache key for a container
         *
@@ -1331,6 +1364,7 @@ class SwiftFileBackend extends FileBackendStore {
                }
                if ( $e instanceof InvalidResponseException ) { // possibly a stale token
                        $this->srvCache->delete( $this->getCredsCacheKey( $this->auth->username ) );
+                       $this->closeConnection(); // force a re-connect and re-auth next time
                }
                wfDebugLog( 'SwiftBackend',
                        get_class( $e ) . " in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
index b738898..5032bf6 100644 (file)
@@ -54,7 +54,7 @@ class TempFSFile extends FSFile {
                                fclose( $newFileHandle );
                                break; // got it
                        }
-                       if ( $attempt >= 15 ) {
+                       if ( $attempt >= 5 ) {
                                wfProfileOut( __METHOD__ );
                                return null; // give up
                        }
index 30d6825..a31b148 100644 (file)
@@ -696,7 +696,7 @@ class FileRepo {
        /**
         * Store a file to a given destination.
         *
-        * @param $srcPath String: source FS path, storage path, or virtual URL
+        * @param $srcPath String: source file system path, storage path, or virtual URL
         * @param $dstZone String: destination zone
         * @param $dstRel String: destination relative path
         * @param $flags Integer: bitwise combination of the following flags:
@@ -841,7 +841,7 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for copying generated thumbnails into the repo.
         *
-        * @param $src string File system path
+        * @param $src string Source file system path, storage path, or virtual URL
         * @param $dst string Virtual URL or storage path
         * @param $disposition string|null Content-Disposition if given and supported
         * @return FileRepoStatus
@@ -883,22 +883,24 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for copying generated thumbnails into the repo.
         *
+        * All path parameters may be a file system path, storage path, or virtual URL.
         * When "dispositions" are given they are used as Content-Disposition if supported.
         *
-        * @param $pairs Array List of tuples (file system path, virtual URL/storage path, disposition)
+        * @param $triples Array List of (source path, destination path, disposition)
         * @return FileRepoStatus
         */
-       public function quickImportBatch( array $pairs ) {
+       public function quickImportBatch( array $triples ) {
                $status = $this->newGood();
                $operations = array();
-               foreach ( $pairs as $pair ) {
-                       list ( $src, $dst ) = $pair;
+               foreach ( $triples as $triple ) {
+                       list( $src, $dst ) = $triple;
+                       $src = $this->resolveToStoragePath( $src );
                        $dst = $this->resolveToStoragePath( $dst );
                        $operations[] = array(
-                               'op'          => 'store',
+                               'op'          => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
                                'src'         => $src,
                                'dst'         => $dst,
-                               'disposition' => isset( $pair[2] ) ? $pair[2] : null
+                               'disposition' => isset( $triple[2] ) ? $triple[2] : null
                        );
                        $status->merge( $this->initDirectory( dirname( $dst ) ) );
                }
@@ -1014,12 +1016,12 @@ class FileRepo {
 
        /**
         * Copy or move a file either from a storage path, virtual URL,
-        * or FS path, into this repository at the specified destination location.
+        * or file system path, into this repository at the specified destination location.
         *
         * Returns a FileRepoStatus object. On success, the value contains "new" or
         * "archived", to indicate whether the file was new with that name.
         *
-        * @param $srcPath String: the source FS path, storage path, or URL
+        * @param $srcPath String: the source file system path, storage path, or URL
         * @param $dstRel String: the destination relative path
         * @param $archiveRel String: the relative path where the existing file is to
         *        be archived, if there is one. Relative to the public zone root.
index 4cc47f0..3b0ea14 100644 (file)
@@ -943,7 +943,7 @@ abstract class File {
                                }
                        } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
                                // Copy the thumbnail from the file system into storage...
-                               $disposition = FileBackend::makeContentDisposition( 'inline', $this->name );
+                               $disposition = $this->getThumbDisposition( $thumbName );
                                $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
                                if ( $status->isOK() ) {
                                        $thumb->setStoragePath( $thumbPath );
@@ -968,6 +968,19 @@ abstract class File {
                return is_object( $thumb ) ? $thumb : false;
        }
 
+       /**
+        * @param $thumbName string Thumbnail name
+        * @return string Content-Disposition header value
+        */
+       function getThumbDisposition( $thumbName ) {
+               $fileName = $this->name; // file name to suggest
+               $thumbExt = FileBackend::extensionFromPath( $thumbName );
+               if ( $thumbExt != '' && $thumbExt !== $this->getExtension() ) {
+                       $fileName .= ".$thumbExt";
+               }
+               return FileBackend::makeContentDisposition( 'inline', $fileName );
+       }
+
        /**
         * Hook into transform() to allow migration of thumbnail files
         * STUB
@@ -1000,7 +1013,8 @@ abstract class File {
                        $path = '/common/images/icons/' . $icon;
                        $filepath = $wgStyleDirectory . $path;
                        if ( file_exists( $filepath ) ) { // always FS
-                               return new ThumbnailImage( $this, $wgStylePath . $path, 120, 120 );
+                               $params = array( 'width' => 120, 'height' => 120 );
+                               return new ThumbnailImage( $this, $wgStylePath . $path, false, $params );
                        }
                }
                return null;
index 75b9d45..695c4e9 100644 (file)
@@ -1154,7 +1154,9 @@ class LocalFile extends File {
                $logId = $log->addEntry( $action, $descTitle, $comment, array(), $user );
 
                wfProfileIn( __METHOD__ . '-edit' );
-               if ( $descTitle->exists() ) {
+               $exists = $descTitle->exists();
+
+               if ( $exists ) {
                        # Create a null revision
                        $latest = $descTitle->getLatestRevID();
                        $nullRevision = Revision::newNullRevision(
@@ -1169,8 +1171,15 @@ class LocalFile extends File {
                                wfRunHooks( 'NewRevisionFromEditComplete', array( $wikiPage, $nullRevision, $latest, $user ) );
                                $wikiPage->updateRevisionOn( $dbw, $nullRevision );
                        }
-                       $dbw->update( 'logging', array( 'log_page' => $descTitle->getArticleID() ), array( 'log_id' => $logId ), __METHOD__ );
+               }
+
+               # Commit the transaction now, in case something goes wrong later
+               # The most important thing is that files don't get lost, especially archives
+               # NOTE: once we have support for nested transactions, the commit may be moved
+               #       to after $wikiPage->doEdit has been called.
+               $dbw->commit( __METHOD__ );
 
+               if ( $exists ) {
                        # Invalidate the cache for the description page
                        $descTitle->invalidateCache();
                        $descTitle->purgeSquid();
@@ -1180,16 +1189,18 @@ class LocalFile extends File {
                        # Squid and file cache for the description page are purged by doEdit.
                        $status = $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
 
-                       if ( isset( $status->value['revision'] ) ) {
-                               $dbw->update( 'logging', array( 'log_page' => $status->value['revision']->getPage() ), array( 'log_id' => $logId ), __METHOD__ );
+                       if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
+                               $dbw->begin();
+                               $dbw->update( 'logging',
+                                       array( 'log_page' => $status->value['revision']->getPage() ),
+                                       array( 'log_id' => $logId ),
+                                       __METHOD__
+                               );
+                               $dbw->commit(); // commit before anything bad can happen
                        }
                }
                wfProfileOut( __METHOD__ . '-edit' );
 
-               # Commit the transaction now, in case something goes wrong later
-               # The most important thing is that files don't get lost, especially archives
-               $dbw->commit( __METHOD__ );
-
                # Save to cache and purge the squid
                # We shall not saveToCache before the commit since otherwise
                # in case of a rollback there is an usable file from memcached
index d93dba6..bd55cb4 100644 (file)
@@ -213,6 +213,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
                        array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
                        array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
+                       array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
                );
        }
 
index 9ba9eab..bc5fcac 100644 (file)
@@ -92,6 +92,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
                        array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
                        array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
+                       array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
                );
        }
 
index 0d5ea57..2f46ff0 100644 (file)
@@ -376,7 +376,7 @@ class WebInstaller extends Installer {
                $args = func_get_args();
                array_shift( $args );
                $args = array_map( 'htmlspecialchars', $args );
-               $msg = wfMsgReal( $msg, $args, false, false, false );
+               $msg = wfMessage( $msg, $args )->useDatabase( false )->plain();
                $this->output->addHTML( $this->getErrorBox( $msg ) );
        }
 
@@ -655,7 +655,7 @@ class WebInstaller extends Installer {
                $args = func_get_args();
                array_shift( $args );
                $args = array_map( 'htmlspecialchars', $args );
-               $text = wfMsgReal( $msg, $args, false, false, false );
+               $text = wfMessage( $msg, $args )->useDatabase( false )->plain();
                $html = $this->parse( $text, true );
 
                return "<div class=\"mw-help-field-container\">\n" .
@@ -685,7 +685,7 @@ class WebInstaller extends Installer {
                $args = func_get_args();
                array_shift( $args );
                $html = '<div class="config-message">' .
-                       $this->parse( wfMsgReal( $msg, $args, false, false, false ) ) .
+               $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
                        "</div>\n";
                $this->output->addHTML( $html );
        }
index 6016641..4de1a97 100644 (file)
@@ -166,7 +166,7 @@ class LogEventsList extends ContextSource {
                        $query[$queryKey] = $hideVal;
 
                        $link = Linker::linkKnown(
-                               $this->getDisplayTitle(),
+                               $this->getTitle(),
                                $messages[$hideVal],
                                array(),
                                $query
index 8a4b943..99ac854 100644 (file)
@@ -167,8 +167,11 @@ class BitmapHandler extends ImageHandler {
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       return new ThumbnailImage( $image, $dstUrl, $scalerParams['clientWidth'],
-                               $scalerParams['clientHeight'], false );
+                       $params = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       return new ThumbnailImage( $image, $dstUrl, false, $params );
                }
 
                # Try to make a target path for the thumbnail
@@ -220,8 +223,11 @@ class BitmapHandler extends ImageHandler {
                } elseif ( $mto ) {
                        return $mto;
                } else {
-                       return new ThumbnailImage( $image, $dstUrl, $scalerParams['clientWidth'],
-                               $scalerParams['clientHeight'], $dstPath );
+                       $params = array(
+                               'width' => $scalerParams['clientWidth'],
+                               'height' => $scalerParams['clientHeight']
+                       );
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
        }
 
@@ -258,14 +264,17 @@ class BitmapHandler extends ImageHandler {
         * client side
         *
         * @param $image File File associated with this thumbnail
-        * @param $params array Array with scaler params
+        * @param $scalerParams array Array with scaler params
         * @return ThumbnailImage
         *
         * @todo fixme: no rotation support
         */
-       protected function getClientScalingThumbnailImage( $image, $params ) {
-               return new ThumbnailImage( $image, $image->getURL(),
-                       $params['clientWidth'], $params['clientHeight'], null );
+       protected function getClientScalingThumbnailImage( $image, $scalerParams ) {
+               $params = array(
+                       'width' => $scalerParams['clientWidth'],
+                       'height' => $scalerParams['clientHeight']
+               );
+               return new ThumbnailImage( $image, $image->getURL(), null, $params );
        }
 
        /**
index 8cb5138..63af255 100644 (file)
@@ -52,7 +52,6 @@ class BitmapHandler_ClientOnly extends BitmapHandler {
                if ( !$this->normaliseParams( $image, $params ) ) {
                        return new TransformParameterError( $params );
                }
-               return new ThumbnailImage( $image, $image->getURL(), $params['width'], 
-                       $params['height'], $image->getLocalRefPath() );
+               return new ThumbnailImage( $image, $image->getURL(), $image->getLocalRefPath(), $params );
        }
 }
index ea4888a..84672e0 100644 (file)
@@ -157,7 +157,12 @@ class DjVuHandler extends ImageHandler {
                }
 
                if ( $flags & self::TRANSFORM_LATER ) {
-                       return new ThumbnailImage( $image, $dstUrl, $width, $height, $dstPath, $page );
+                       $params = array(
+                               'width' => $width,
+                               'height' => $height,
+                               'page' => $page
+                       );
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
@@ -192,7 +197,12 @@ class DjVuHandler extends ImageHandler {
                                        wfHostname(), $retval, trim($err), $cmd ) );
                        return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
                } else {
-                       return new ThumbnailImage( $image, $dstUrl, $width, $height, $dstPath, $page );
+                       $params = array(
+                               'width' => $width,
+                               'height' => $height,
+                               'page' => $page
+                       );
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
        }
 
index 35305d1..843c1fa 100644 (file)
@@ -100,14 +100,20 @@ class FormatMetadata {
                                ) {
                                        continue;
                                }
-                               $tags[$tag] = intval( $h[0] / $h[1] )
+                               $tags[$tag] = str_pad( intval( $h[0] / $h[1] ), 2, '0', STR_PAD_LEFT )
                                        . ':' . str_pad( intval( $m[0] / $m[1] ), 2, '0', STR_PAD_LEFT )
                                        . ':' . str_pad( intval( $s[0] / $s[1] ), 2, '0', STR_PAD_LEFT );
 
-                               $time = wfTimestamp( TS_MW, '1971:01:01 ' . $tags[$tag] );
-                               // the 1971:01:01 is just a placeholder, and not shown to user.
-                               if ( $time && intval( $time ) > 0 ) {
-                                       $tags[$tag] = $wgLang->time( $time );
+                               try {
+                                       $time = wfTimestamp( TS_MW, '1971:01:01 ' . $tags[$tag] );
+                                       // the 1971:01:01 is just a placeholder, and not shown to user.
+                                       if ( $time && intval( $time ) > 0 ) {
+                                               $tags[$tag] = $wgLang->time( $time );
+                                       }
+                               } catch ( TimestampException $e ) {
+                                       // This shouldn't happen, but we've seen bad formats
+                                       // such as 4-digit seconds in the wild.
+                                       // leave $tags[$tag] as-is
                                }
                                continue;
                        }
index 65757c9..6175907 100644 (file)
@@ -189,11 +189,9 @@ abstract class ImageHandler extends MediaHandler {
                        return false;
                }
                $url = $script . '&' . wfArrayToCGI( $this->getScriptParams( $params ) );
-               $page = isset( $params['page'] ) ? $params['page'] : false;
 
                if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
-                       return new ThumbnailImage( $image,
-                               $url, $params['width'], $params['height'], false, $page );
+                       return new ThumbnailImage( $image, $url, false, $params );
                }
        }
 
index a9d1758..55fa554 100644 (file)
@@ -117,7 +117,7 @@ class SvgHandler extends ImageHandler {
                $physicalHeight = $params['physicalHeight'];
 
                if ( $flags & self::TRANSFORM_LATER ) {
-                       return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
@@ -128,7 +128,7 @@ class SvgHandler extends ImageHandler {
                $srcPath = $image->getLocalRefPath();
                $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
                if( $status === true ) {
-                       return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                } else {
                        return $status; // MediaTransformError
                }
index d96cb09..23471e9 100644 (file)
@@ -57,10 +57,6 @@ function donorm( $str ) {
        return rtrim( utf8_normalize( $str . "\x01", UtfNormal::UNORM_NFC ), "\x01" );
 }
 
-function wfMsg($x) {
-       return $x;
-}
-
 function showDiffs( $a, $b ) {
        $ota = explode( "\n", str_replace( "\r\n", "\n", $a ) );
        $nta = explode( "\n", str_replace( "\r\n", "\n", $b ) );
index 57029a8..7bbaff9 100644 (file)
@@ -167,19 +167,18 @@ abstract class BagOStuff {
         * Increase stored value of $key by $value while preserving its TTL
         * @param $key String: Key to increase
         * @param $value Integer: Value to add to $key (Default 1)
-        * @return null if lock is not possible else $key value increased by $value
-        * @return integer
+        * @return integer|bool New value or false on failure
         */
        public function incr( $key, $value = 1 ) {
                if ( !$this->lock( $key ) ) {
-                       return null;
+                       return false;
                }
-
-               $value = intval( $value );
-
-               if ( ( $n = $this->get( $key ) ) !== false ) {
-                       $n += $value;
-                       $this->set( $key, $n ); // exptime?
+               $n = $this->get( $key );
+               if ( $this->isInteger( $n ) ) { // key exists?
+                       $n += intval( $value );
+                       $this->set( $key, max( 0, $n ) ); // exptime?
+               } else {
+                       $n = false;
                }
                $this->unlock( $key );
 
@@ -220,7 +219,7 @@ abstract class BagOStuff {
        }
 
        /**
-        * Convert an optionally absolute expiry time to a relative time. If an 
+        * Convert an optionally absolute expiry time to a relative time. If an
         * absolute time is specified which is in the past, use a short expiry time.
         *
         * @param $exptime integer
index 264aed7..36ced49 100644 (file)
@@ -70,7 +70,7 @@ class DBABagOStuff extends BagOStuff {
         */
        protected function decode( $blob ) {
                if ( !is_string( $blob ) ) {
-                       return array( null, 0 );
+                       return array( false, 0 );
                } else {
                        return array(
                                unserialize( substr( $blob, 11 ) ),
@@ -111,7 +111,7 @@ class DBABagOStuff extends BagOStuff {
 
        /**
         * @param $key string
-        * @return mixed|null|string
+        * @return mixed
         */
        public function get( $key ) {
                wfProfileIn( __METHOD__ );
@@ -120,7 +120,7 @@ class DBABagOStuff extends BagOStuff {
                $handle = $this->getReader();
                if ( !$handle ) {
                        wfProfileOut( __METHOD__ );
-                       return null;
+                       return false;
                }
 
                $val = dba_fetch( $key, $handle );
@@ -129,13 +129,13 @@ class DBABagOStuff extends BagOStuff {
                # Must close ASAP because locks are held
                dba_close( $handle );
 
-               if ( !is_null( $val ) && $expiry && $expiry < time() ) {
+               if ( $val !== false && $expiry && $expiry < time() ) {
                        # Key is expired, delete it
                        $handle = $this->getWriter();
                        dba_delete( $key, $handle );
                        dba_close( $handle );
                        wfDebug( __METHOD__ . ": $key expired\n" );
-                       $val = null;
+                       $val = false;
                }
 
                wfProfileOut( __METHOD__ );
@@ -182,7 +182,7 @@ class DBABagOStuff extends BagOStuff {
                        return false;
                }
 
-               $ret = dba_delete( $key, $handle );
+               $ret = !dba_exists( $key, $handle ) || dba_delete( $key, $handle );
                dba_close( $handle );
 
                wfProfileOut( __METHOD__ );
@@ -243,18 +243,18 @@ class DBABagOStuff extends BagOStuff {
                }
 
                list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
-               if ( !is_null( $value ) ) {
+               if ( $value !== false ) {
                        if ( $expiry && $expiry < time() ) {
                                # Key is expired, delete it
                                dba_delete( $key, $handle );
                                wfDebug( __METHOD__ . ": $key expired\n" );
-                               $value = null;
+                               $value = false;
                        } else {
                                $value += $step;
                                $blob = $this->encode( $value, $expiry );
 
                                $ret = dba_replace( $key, $blob, $handle );
-                               $value = $ret ? $value : null;
+                               $value = $ret ? $value : false;
                        }
                }
 
@@ -262,7 +262,7 @@ class DBABagOStuff extends BagOStuff {
 
                wfProfileOut( __METHOD__ );
 
-               return is_null( $value ) ? false : (int)$value;
+               return ( $value === false ) ? false : (int)$value;
        }
 
        function keys() {
index 8e9444a..de55de0 100644 (file)
@@ -207,7 +207,7 @@ class Parser {
        public function __construct( $conf = array() ) {
                $this->mConf = $conf;
                $this->mUrlProtocols = wfUrlProtocols();
-               $this->mExtLinkBracketedRegex = '/\[((' . $this->mUrlProtocols . ')'.
+               $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')'.
                        self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
@@ -1187,7 +1187,7 @@ class Parser {
                        '!(?:                           # Start cases
                                (<a[ \t\r\n>].*?</a>) |     # m[1]: Skip link text
                                (<.*?>) |                   # m[2]: Skip stuff inside HTML elements' . "
-                               (\\b(?:$prots)$urlChar+) |  # m[3]: Free external links" . '
+                               (\\b(?i:$prots)$urlChar+) |  # m[3]: Free external links" . '
                                (?:RFC|PMID)\s+([0-9]+) |   # m[4]: RFC or PMID, capture number
                                ISBN\s+(\b                  # m[5]: ISBN, capture number
                                        (?: 97[89] [\ \-]? )?   # optional 13-digit ISBN prefix
@@ -1853,7 +1853,7 @@ class Parser {
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
                        # should be external links.
-                       if ( preg_match( '/^(?:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
+                       if ( preg_match( '/^(?i:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
                                $s .= $prefix . '[[' . $line ;
                                wfProfileOut( __METHOD__."-misc" );
                                continue;
@@ -2090,7 +2090,7 @@ class Parser {
         * @return String: less-or-more HTML with NOPARSE bits
         */
        function armorLinks( $text ) {
-               return preg_replace( '/\b(' . $this->mUrlProtocols . ')/',
+               return preg_replace( '/\b((?i)' . $this->mUrlProtocols . ')/',
                        "{$this->mUniqPrefix}NOPARSE$1", $text );
        }
 
@@ -5095,8 +5095,8 @@ class Parser {
                                                                $paramName = 'no-link';
                                                                $value = true;
                                                                $validated = true;
-                                                       } elseif ( preg_match( "/^$prots/", $value ) ) {
-                                                               if ( preg_match( "/^($prots)$chars+$/u", $value, $m ) ) {
+                                                       } elseif ( preg_match( "/^(?i)$prots/", $value ) ) {
+                                                               if ( preg_match( "/^((?i)$prots)$chars+$/u", $value, $m ) ) {
                                                                        $paramName = 'link-url';
                                                                        $this->mOutput->addExternalLink( $value );
                                                                        if ( $this->mOptions->getExternalLinkTarget() ) {
@@ -5622,7 +5622,7 @@ class Parser {
                # @todo FIXME: Not tolerant to blank link text
                # I.E. [http://www.mediawiki.org] will render as [1] or something depending
                # on how many empty links there are on the page - need to figure that out.
-               $text = preg_replace( '/\[(?:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
+               $text = preg_replace( '/\[(?i:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
 
                # Parse wikitext quotes (italics & bold)
                $text = $this->doQuotes( $text );
index 9555bdb..6bcc324 100644 (file)
@@ -226,7 +226,7 @@ class Parser_LinkHooks extends Parser {
                # Don't allow internal links to pages containing
                # PROTO: where PROTO is a valid URL protocol; these
                # should be external links.
-               if( preg_match('/^\b(?:' . wfUrlProtocols() . ')/', $titleText) ) {
+               if( preg_match('/^\b(?i:' . wfUrlProtocols() . ')/', $titleText) ) {
                        wfProfileOut( __METHOD__ );
                        return $wt;
                }
index b505592..2ccb6d3 100644 (file)
@@ -756,8 +756,10 @@ class SearchResult {
        protected function initFromTitle( $title ) {
                $this->mTitle = $title;
                if ( !is_null( $this->mTitle ) ) {
+                       $id = false;
+                       wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
                        $this->mRevision = Revision::newFromTitle(
-                               $this->mTitle, false, Revision::READ_NORMAL );
+                               $this->mTitle, $id, Revision::READ_NORMAL );
                        if ( $this->mTitle->getNamespace() === NS_FILE )
                                $this->mImage = wfFindFile( $this->mTitle );
                }
index 8ab0976..7800e56 100644 (file)
@@ -33,7 +33,7 @@ class SpecialLog extends SpecialPage {
        /**
         * List log type for which the target is a user
         * Thus if the given target is in NS_MAIN we can alter it to be an NS_USER
-        * Title user instead. 
+        * Title user instead.
         */
        private $typeOnUser = array(
                'block',
@@ -47,7 +47,7 @@ class SpecialLog extends SpecialPage {
 
        public function execute( $par ) {
                global $wgLogRestrictions;
-               
+
                $this->setHeaders();
                $this->outputHeader();
 
@@ -65,7 +65,7 @@ class SpecialLog extends SpecialPage {
 
                // Set values
                $opts->fetchValuesFromRequest( $this->getRequest() );
-               if ( $par ) {
+               if ( $par !== null ) {
                        $this->parseParams( $opts, (string)$par );
                }
 
index c895dae..4036ebb 100644 (file)
@@ -69,7 +69,7 @@ class SpecialTags extends SpecialPage {
                }
 
                $newRow = '';
-               $newRow .= Xml::tags( 'td', null, Xml::element( 'tt', null, $tag ) );
+               $newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
 
                $disp = ChangeTags::tagDescription( $tag );
                $disp .= ' ';
index 5d6a112..f135649 100644 (file)
@@ -163,7 +163,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                        'rd_from = page_id',
                        'rd_namespace' => $target->getNamespace(),
                        'rd_title' => $target->getDBkey(),
-                       '(rd_interwiki is NULL) or (rd_interwiki = \'\')'
+                       'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
                )));
 
                if( $fetchlinks ) {
index 54a68af..0542bba 100644 (file)
@@ -61,35 +61,35 @@ class UploadFromChunks extends UploadFromFile {
                return true;
        }
        /**
-        * Calls the parent stashFile and updates the uploadsession table to handle "chunks" 
+        * Calls the parent stashFile and updates the uploadsession table to handle "chunks"
         *
         * @return UploadStashFile stashed file
         */
        public function stashFile() {
-               // Stash file is the called on creating a new chunk session: 
+               // Stash file is the called on creating a new chunk session:
                $this->mChunkIndex = 0;
                $this->mOffset = 0;
                // Create a local stash target
                $this->mLocalFile = parent::stashFile();
-               // Update the initial file offset ( based on file size ) 
+               // Update the initial file offset ( based on file size )
                $this->mOffset = $this->mLocalFile->getSize();
                $this->mFileKey = $this->mLocalFile->getFileKey();
 
                // Output a copy of this first to chunk 0 location:
                $status = $this->outputChunk( $this->mLocalFile->getPath() );
 
-               // Update db table to reflect initial "chunk" state 
+               // Update db table to reflect initial "chunk" state
                $this->updateChunkStatus();
                return $this->mLocalFile;
        }
 
        /**
         * Continue chunk uploading
-        */     
+        */
        public function continueChunks( $name, $key, $webRequestUpload ) {
                $this->mFileKey = $key;
                $this->mUpload = $webRequestUpload;
-               // Get the chunk status form the db: 
+               // Get the chunk status form the db:
                $this->getChunkStatus();
 
                $metadata = $this->stash->getMetadata( $key );
@@ -105,7 +105,7 @@ class UploadFromChunks extends UploadFromFile {
         * @return FileRepoStatus
         */
        public function concatenateChunks() {
-               wfDebug( __METHOD__ . " concatenate {$this->mChunkIndex} chunks:" . 
+               wfDebug( __METHOD__ . " concatenate {$this->mChunkIndex} chunks:" .
                        $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                // Concatenate all the chunks to mVirtualTempPath
@@ -125,10 +125,10 @@ class UploadFromChunks extends UploadFromFile {
                // Concatenate the chunks at the temp file
                $status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
                if( !$status->isOk() ){
-                       return $status; 
+                       return $status;
                }
                // Update the mTempPath and mLocalFile
-               // ( for FileUpload or normal Stash to take over )  
+               // ( for FileUpload or normal Stash to take over )
                $this->mTempPath = $tmpPath; // file system path
                $this->mLocalFile = parent::stashFile();
 
@@ -149,16 +149,16 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        /**
-        * Returns the virtual chunk location:  
+        * Returns the virtual chunk location:
         * @param $index
         * @return string
         */
        function getVirtualChunkLocation( $index ){
-               return $this->repo->getVirtualUrl( 'temp' ) . 
+               return $this->repo->getVirtualUrl( 'temp' ) .
                                '/' .
-                               $this->repo->getHashPath( 
+                               $this->repo->getHashPath(
                                        $this->getChunkFileKey( $index )
-                               ) . 
+                               ) .
                                $this->getChunkFileKey( $index );
        }
 
@@ -173,20 +173,20 @@ class UploadFromChunks extends UploadFromFile {
        public function addChunk( $chunkPath, $chunkSize, $offset ) {
                // Get the offset before we add the chunk to the file system
                $preAppendOffset = $this->getOffset();
-               
+
                if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize()) {
                        $status = Status::newFatal( 'file-too-large' );
                } else {
                        // Make sure the client is uploading the correct chunk with a matching offset.
                        if ( $preAppendOffset == $offset ) {
-                               // Update local chunk index for the current chunk   
+                               // Update local chunk index for the current chunk
                                $this->mChunkIndex++;
                                $status = $this->outputChunk( $chunkPath );
                                if( $status->isGood() ){
-                                       // Update local offset: 
+                                       // Update local offset:
                                        $this->mOffset = $preAppendOffset + $chunkSize;
-                                       // Update chunk table status db         
-                                       $this->updateChunkStatus();             
+                                       // Update chunk table status db
+                                       $this->updateChunkStatus();
                                }
                        } else {
                                $status = Status::newFatal( 'invalid-chunk-offset' );
@@ -196,16 +196,16 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        /**
-        * Update the chunk db table with the current status: 
+        * Update the chunk db table with the current status:
         */
        private function updateChunkStatus(){
-               wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" . 
+               wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
                                        $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                $dbw = $this->repo->getMasterDb();
                $dbw->update(
                        'uploadstash',
-                       array( 
+                       array(
                                'us_status' => 'chunks',
                                'us_chunk_inx' => $this->getChunkIndex(),
                                'us_size' => $this->getOffset()
@@ -219,12 +219,12 @@ class UploadFromChunks extends UploadFromFile {
         * Get the chunk db state and populate update relevant local values
         */
        private function getChunkStatus(){
-               // get Master db to avoid race conditions. 
+               // get Master db to avoid race conditions.
                // Otherwise, if chunk upload time < replag there will be spurious errors
                $dbw = $this->repo->getMasterDb();
                $row = $dbw->selectRow(
-                       'uploadstash', 
-                       array( 
+                       'uploadstash',
+                       array(
                                'us_chunk_inx',
                                'us_size',
                                'us_path',
@@ -241,7 +241,7 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        /**
-        * Get the current Chunk index 
+        * Get the current Chunk index
         * @return Integer index of the current chunk
         */
        private function getChunkIndex(){
@@ -252,8 +252,8 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        /**
-        * Gets the current offset in fromt the stashedupload table 
-        * @return Integer current byte offset of the chunk file set 
+        * Gets the current offset in fromt the stashedupload table
+        * @return Integer current byte offset of the chunk file set
         */
        private function getOffset(){
                if ( $this->mOffset !== null ){
@@ -272,11 +272,12 @@ class UploadFromChunks extends UploadFromFile {
        private function outputChunk( $chunkPath ){
                // Key is fileKey + chunk index
                $fileKey = $this->getChunkFileKey();
-               
-               // Store the chunk per its indexed fileKey: 
+
+               // Store the chunk per its indexed fileKey:
                $hashPath = $this->repo->getHashPath( $fileKey );
-               $storeStatus = $this->repo->store( $chunkPath, 'temp', "$hashPath$fileKey" );
-               
+               $storeStatus = $this->repo->quickImport( $chunkPath,
+                       $this->repo->getZonePath( 'temp' ) . "/{$hashPath}{$fileKey}" );
+
                // Check for error in stashing the chunk:
                if ( ! $storeStatus->isOK() ) {
                        $error = $storeStatus->getErrorsArray();
index de0f4ff..d3d487f 100644 (file)
@@ -443,20 +443,6 @@ class LanguageKk extends LanguageKk_cyrl {
                $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
        }
 
-       /**
-        * Work around for right-to-left direction support in kk-arab and kk-cn
-        *
-        * @return bool
-        */
-       function isRTL() {
-               $variant = $this->getPreferredVariant();
-               if ( $variant == 'kk-arab' || $variant == 'kk-cn' ) {
-                       return true;
-               } else {
-                       return parent::isRTL();
-               }
-       }
-
        /**
         * It fixes issue with ucfirst for transforming 'i' to 'İ'
         *
index 8a4aca6..9e90c7f 100644 (file)
@@ -58,7 +58,9 @@ class LanguageWa extends Language {
         */
        function date( $ts, $adj = false, $format = true, $tc = false ) {
                $ts = wfTimestamp( TS_MW, $ts );
-               if ( $adj ) { $ts = $this->userAdjust( $ts, $tc ); }
+               if ( $adj ) {
+                       $ts = $this->userAdjust( $ts, $tc );
+               }
                $datePreference = $this->dateFormat( $format );
 
                # ISO (YYYY-mm-dd) format
index 7803258..c243fa0 100644 (file)
@@ -336,7 +336,7 @@ $messages = array(
 'history_short' => 'Atra u likôt',
 'updatedmarker' => 'geuubah yoh seunaweue keuneulheueh lon phon kon',
 'printableversion' => 'Seunalén citak',
-'permalink' => 'Hubông teutap',
+'permalink' => 'Neuhubông teutap',
 'print' => 'Rakam',
 'view' => 'Beuet',
 'edit' => 'Andam',
@@ -354,13 +354,13 @@ $messages = array(
 'unprotectthispage' => 'Gantoe neulindông ôn nyoë',
 'newpage' => 'Ôn barô',
 'talkpage' => 'Peugah haba bhah ôn nyoë',
-'talkpagelinktext' => 'Peugah haba',
+'talkpagelinktext' => 'Marit',
 'specialpage' => 'Ôn kusuih',
 'personaltools' => 'Alat droë',
 'postcomment' => 'Beunagi baro',
 'articlepage' => 'Eu ôn asoë',
 'talk' => 'Peugah haba',
-'views' => 'Leumah',
+'views' => 'Ôn',
 'toolbox' => 'Plôk alat',
 'userpage' => 'Eu on ureueng nguy',
 'projectpage' => 'Eu ôn buët',
@@ -376,7 +376,7 @@ $messages = array(
 'lastmodifiedat' => 'Ôn nyoë keuneulheuëh geu’ubah bak $2, $1.',
 'viewcount' => 'On nyoe ka geusaweue {{PLURAL:$1|sigo|$sigo}}.<br />',
 'protectedpage' => 'Ôn teupeulindông',
-'jumpto' => 'Langsông u:',
+'jumpto' => 'Lansông u:',
 'jumptonavigation' => 'navigasi',
 'jumptosearch' => 'mita',
 'pool-timeout' => 'Liwat watee preh gunci',
@@ -408,7 +408,7 @@ $messages = array(
 
 'versionrequired' => 'Peureulee MediaWiki versi $1',
 
-'retrievedfrom' => 'Meurumpok nibak "$1"',
+'retrievedfrom' => 'Geurumpok nibak "$1"',
 'youhavenewmessages' => 'Droëneuh   na $1 ($2).',
 'newmessageslink' => 'peusan barô',
 'newmessagesdifflink' => 'neuubah keuneulheuëh',
@@ -642,7 +642,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'searchprofile-images-tooltip' => 'Mita beureukaih',
 'searchprofile-everything-tooltip' => 'Mita ban dum ôn asoë (rôh ôn marit)',
 'searchprofile-advanced-tooltip' => 'Mita bak ruweueng nan meupat-pat',
-'search-result-size' => '$1 ({{PLURAL:$2|1 kata|$2 kata}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 narit|$2 narit}})',
 'search-result-category-size' => '{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})',
 'search-redirect' => '(peuninah $1)',
 'search-section' => '(bagian $1)',
@@ -732,7 +732,7 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'recentchangeslinked-to' => 'Peuleumah neu’ubah nibak ôn-ôn nyang meusambông ngön ôn nyang geubri',
 
 # Upload
-'upload' => 'Peutamong',
+'upload' => 'Peutamong beureukaih',
 'uploadbtn' => 'Peutamong beureukah',
 'uploadlogpage' => 'Log peutamöng',
 'filedesc' => 'Ehtisa',
@@ -932,7 +932,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 # Namespace form on various pages
 'namespace' => 'Ruweuëng nan:',
 'invert' => 'Peubalék peuniléh',
-'blanknamespace' => '(Utama)',
+'blanknamespace' => '(Keuë)',
 
 # Contributions
 'contributions' => 'Peuneugöt',
@@ -955,7 +955,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'sp-contributions-submit' => 'Mita',
 
 # What links here
-'whatlinkshere' => 'Hubông balék',
+'whatlinkshere' => 'Neuhubông balék',
 'whatlinkshere-title' => 'Ôn nyang na hubông u $1',
 'whatlinkshere-page' => 'Ôn:',
 'linkshere' => "Ôn-ôn nyoë meuhubông u '''[[:$1]]''':",
@@ -1033,10 +1033,10 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 'tooltip-pt-preferences' => 'Atô',
 'tooltip-pt-watchlist' => 'Dapeuta ôn nyang lôn kalön',
 'tooltip-pt-mycontris' => 'Dapeuta peuneugöt Droëneuh',
-'tooltip-pt-login' => 'Droën geupeusaran keu tamong log, bahpih nyan hana geupeuwajéb.',
+'tooltip-pt-login' => 'Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.',
 'tooltip-pt-logout' => 'Teubiët',
 'tooltip-ca-talk' => 'Peugah haba ôn asoë',
-'tooltip-ca-edit' => 'Andam ôn nyoë. Nguy tumbôy euë dilèë yôh goh lom keumeubah.',
+'tooltip-ca-edit' => 'Droëneuh jeuët neuandam ôn nyoë. Neunguy tumbôy eu dilèë yôh goh neukeubah.',
 'tooltip-ca-addsection' => 'Puphôn beunagi barô',
 'tooltip-ca-viewsource' => 'Ôn nyoë geupeulindông.
 Droëneuh cit jeuët neu’eu nèjih.',
@@ -1046,24 +1046,24 @@ Droëneuh cit jeuët neu’eu nèjih.',
 'tooltip-ca-move' => 'Peupinah ôn nyoë',
 'tooltip-ca-watch' => 'Peutamah ôn nyoë u dapeuta kalön Droëneuh',
 'tooltip-ca-unwatch' => 'Sampôh ôn nyoë nibak dapeuta keunalön Droëneuh',
-'tooltip-search' => 'Mita lam {{SITENAME}} nyoë',
+'tooltip-search' => 'Mita {{SITENAME}}',
 'tooltip-search-go' => 'Mita saboh ôn ngon nan nyang peureuséh lagèë nyoë meunyo na',
 'tooltip-search-fulltext' => 'Mita ôn nyang na asoë lagèë nyoë',
 'tooltip-p-logo' => 'Saweuë Ôn Keuë',
 'tooltip-n-mainpage' => 'Jak u Ôn Keuë',
 'tooltip-n-mainpage-description' => 'Saweuë Ôn Keuë',
-'tooltip-n-portal' => 'Bhah buët, peuë nyang jeuët neupeulaku, pat tamita sipeuë hay',
-'tooltip-n-currentevents' => 'Mita beurita nyang paléng barô',
+'tooltip-n-portal' => 'Bhaih buët, peuë nyang jeuët neupeulaku, pat tamita sipeuë hay',
+'tooltip-n-currentevents' => 'Mita haba barô',
 'tooltip-n-recentchanges' => 'Dapeuta nyang ban meu’ubah lam wiki.',
 'tooltip-n-randompage' => 'Peuleumah beurangkari ôn',
 'tooltip-n-help' => 'Bak mita bantu.',
-'tooltip-t-whatlinkshere' => 'Dapeuta mandum ôn wiki nyang na hubông u ôn nyoë',
+'tooltip-t-whatlinkshere' => 'Dapeuta ban dum ôn wiki nyang na neuhubông u ôn nyoë',
 'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na hubông u ôn nyoë',
 'tooltip-feed-rss' => 'Umpeuën RSS keu ôn nyoë',
 'tooltip-feed-atom' => 'Umpeuën Atom keu ôn nyoë',
 'tooltip-t-contributions' => 'Eu dapeuta nyang ka geutuléh lé ureuëng nguy nyoë',
 'tooltip-t-emailuser' => 'Kirém surat-e u ureuëng nguy nyoë',
-'tooltip-t-upload' => 'Peutamong gamba atawa beureukah alat',
+'tooltip-t-upload' => 'Peutamong beureukaih',
 'tooltip-t-specialpages' => 'Dapeuta ban dum ôn kusuih',
 'tooltip-t-print' => 'Seunalén citak ôn nyoë',
 'tooltip-t-permalink' => '
index b85ee8c..eb47ce2 100644 (file)
@@ -1417,8 +1417,9 @@ $1",
 'revdelete-only-restricted' => 'خطأ إخفاء العنصر المؤرخ $2, $1: لا تستطيع تنحية العناصر من عرض الإداريين بدون أن تحدد أيضا إحدى خيارات التنحية الأخرى.',
 'revdelete-reason-dropdown' => '* أسباب حذف عامة
 ** خرق لحقوق النشر
-** معلومات شخصية غير ملائمة
-**معلومات تشهيرية محتملة',
+** تعليق أو معلومات شخصية غير ملائمة
+** اسم مستخدم غير ملائم
+** معلومات تشهيرية محتملة',
 'revdelete-otherreason' => 'سبب آخر/إضافي:',
 'revdelete-reasonotherlist' => 'سبب آخر',
 'revdelete-edit-reasonlist' => 'عدل أسباب الحذف',
@@ -2648,8 +2649,8 @@ $UNWATCHURL
 'protect-title' => 'ضبط مستوى الحماية ل"$1"',
 'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
-'protect-badnamespace-title' => 'Ù\85ساحة Ø¥Ø³Ù\85 ØºÙ\8aر Ù\85Ø­Ù\85Ù\8aØ©',
-'protect-badnamespace-text' => 'لا يمكن حماية الصفحات الموجودة في مساحة الإسم',
+'protect-badnamespace-title' => 'Ù\86طاÙ\82 Ù\84ا Ù\8aØ­Ù\85Ù\89',
+'protect-badnamespace-text' => 'صفحات هذا النطاق لا يمكن حمايتها',
 'protect-legend' => 'تأكيد الحماية',
 'protectcomment' => 'السبب:',
 'protectexpiry' => 'تنتهي في:',
@@ -3158,7 +3159,7 @@ $1',
 'import-error-edit' => 'الصفحة "$1" لم يتم استيرادها لأنه لا يمكن لك تحريرها.',
 'import-error-create' => 'الصفحة "$1" لم يتم استيرادها لأنه لا يمكن لك استحداثها أصلا.',
 'import-error-interwiki' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
-'import-error-special' => 'تعذر Ø£Ø³ØªÙ\8aراد Ø§Ù\84صÙ\81حة "$1" Ù\84Ø£Ù\86Ù\87ا ØªÙ\86تÙ\85Ù\8a Ø¥Ù\84Ù\89 Ù\85ساحة Ø¥Ø³Ù\85 Ø®Ø§ØµØ© Øªمنع الصفحات.',
+'import-error-special' => 'صÙ\81حة "$1" Ù\84Ù\85 ØªØ³ØªÙ\88رد Ù\84Ø£Ù\86Ù\87ا ØªÙ\86تÙ\85Ù\8a Ø¥Ù\84Ù\89 Ù\86طاÙ\82 Ø®Ø§Øµ Ù\8aمنع الصفحات.',
 'import-error-invalid' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها غير صحيح.',
 'import-options-wrong' => 'خطأ {{PLURAL:$2|خيار|خيارات}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'إن عنوان الصفحة الجذر المعطاة هي ذات عنوان غير صالح.',
@@ -3340,7 +3341,7 @@ $1',
 'pageinfo-authors' => 'عدد المؤلفين المختلفين',
 'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال  $1 يوم/أيام)',
 'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
-'pageinfo-restriction' => 'حماية الصفحة (<code>$1</code>)',
+'pageinfo-restriction' => 'حماية الصفحة ($1)',
 'pageinfo-magic-words' => 'السحرية {{PLURAL:$1|الكلمة|الكلمات}} ($1)',
 'pageinfo-hidden-categories' => 'مخفية {{PLURAL:$1|فئة|فئات}} ($1)',
 'pageinfo-templates' => 'متضمنة {{PLURAL:$1|قالب|قوالب}} ($1)',
@@ -4136,7 +4137,7 @@ $5
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])',
-'timezone-utc' => 'باÙ\84تÙ\88Ù\82Ù\8aت Ø§Ù\84عاÙ\84Ù\85Ù\8a',
+'timezone-utc' => 'ت Ø¹ Ù\85',
 
 # Core parser functions
 'unknown_extension_tag' => 'وسم امتداد غير معروف "$1"',
index 3a31cc2..147d19a 100644 (file)
@@ -1136,6 +1136,7 @@ $1',
 'mywatchlist' => 'ܪ̈ܗܝܬܝ',
 'watchlistfor2' => 'ܕ $1 $2',
 'nowatchlist' => 'ܠܝܬ ܠܟ ܡܕܡ ܒܪ̈ܗܝܬܐ ܕܝܠܟ',
+'watchlistanontext' => '$1 ܠܚܙܝܐ ܐܘ ܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ.',
 'watchnologin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
 'watchnologintext' => 'ܐܠܨܐ ܕܬܗܘܐ [[Special:UserLogin|ܥܠܝܠܐ]] ܠܫܚܠܦܬܐ ܕܪ̈ܗܝܬܟ.',
 'addwatch' => 'ܐܘܣܦ ܥܠ ܪ̈ܗܝܬܝ',
index 44d6dee..8cb86de 100644 (file)
@@ -2917,7 +2917,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'pageinfo-authors' => "Númberu total d'autores distintos",
 'pageinfo-recent-edits' => "Númberu d'ediciones recientes (nos caberos $1)",
 'pageinfo-recent-authors' => "Númberu d'autores distintos recientes",
-'pageinfo-restriction' => 'Proteición de la páxina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Proteición de la páxina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Pallabra máxica|Pallabres máxiques}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Plantía incluída|Plantíes incluíes}} ($1)',
index c6f313c..f9ffd92 100644 (file)
@@ -652,7 +652,7 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'lineno' => 'Zeiln $1:',
 'compareselectedversions' => 'Gwöde Versionen vagleichen',
 'editundo' => 'ryckgängig',
-'diff-multi' => '({{PLURAL:$1|A dazwischenliegerte Versión|$1 dazwischenliegende Versiónen}} vohram {{PLURAL:$2|Benutzer|$2 Benutzern}} {{PLURAL:$1|werd|wern}} néd åzoagt)',
+'diff-multi' => '({{PLURAL:$1|A dazwischenliegerte Versión|$1 dazwischenliegende Versiónen}} {{PLURAL:$2|vohram Benutzer|vo $2 Benutzern}} {{PLURAL:$1|werd|wern}} néd åzoagt)',
 
 # Search results
 'searchresults' => 'Suachergebniss',
index de1217d..3de6c84 100644 (file)
@@ -1177,7 +1177,9 @@ $1",
 'revdelete-only-restricted' => 'Памылка хаваньня запісаў элемэнтаў $2, $1: Вы ня можаце схаваць запісы ад прагляду адміністратарамі бяз выбару адной зь іншых наладаў хаваньня.',
 'revdelete-reason-dropdown' => '* Агульныя прычыны выдаленьня
 ** Парушэньне аўтарскіх правоў
-** Інфармацыя, якая парушае прыватнасьць',
+** Інфармацыя, якая парушае прыватнасьць
+** Недапушчальнае імя ўдзельніка
+** Патэнцыйна паклёпніцкія зьвесткі',
 'revdelete-otherreason' => 'Іншая/дадатковая прычына:',
 'revdelete-reasonotherlist' => 'Іншая прычына',
 'revdelete-edit-reasonlist' => 'Рэдагаваць прычыны выдаленьня',
@@ -3033,7 +3035,7 @@ $1',
 'pageinfo-authors' => 'Колькасьць аўтараў',
 'pageinfo-recent-edits' => 'Колькасьць апошніх рэдагаваньняў (за $1)',
 'pageinfo-recent-authors' => 'Колькасьць апошніх аўтараў',
-'pageinfo-restriction' => 'Стан аховы (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Стан аховы ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магічнае слова|Магічныя словы}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
index 79348e7..40735c9 100644 (file)
@@ -558,9 +558,9 @@ $1',
 'dberrortext' => 'Възникна синтактична грешка при заявка към базата данни.
 Това може да означава грешка в софтуера.
 Последната заявка към базата данни беше:
-<blockquote><tt>$1</tt></blockquote>
-при функцията „<tt>$2</tt>“.
-MySQL върна грешка „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+при функцията „<code>$2</code>“.
+Базата от данни върна грешка „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Възникна синтактична грешка при заявка към базата данни.
 Последната заявка към базата данни беше:
 „$1“
@@ -1054,7 +1054,7 @@ $2
 'rev-deleted-text-permission' => "Тази версия на страницата е била '''изтрита'''.
 Допълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].",
 'rev-deleted-text-unhide' => "Тази версия на страницата е била '''изтрита'''.
-Допълнителна информация може се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].
+Допълнителна информация може се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].
 Като администратор на сайта вие можете да [$1 прегледате тази редакция], ако желаете да продължите.",
 'rev-suppressed-text-unhide' => "Тази версия на страницата е била '''прикрита'''.
 Допълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на прикриванията].
@@ -1076,7 +1076,7 @@ $2
 ато администратор на сайта, вие можете да [$1 прегледате тази разликова препратка], ако желаете да продължите.",
 'rev-deleted-diff-view' => "Една от версиите на тази разлика е била '''изтрита'''.
 Можете да видите тази разлика; възможно е да има повече информация в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
-'rev-suppressed-diff-view' => "Ð\95дна Ð¾Ñ\82 Ñ\80едакÑ\86ииÑ\82е Ð¾Ñ\82 Ñ\82ази Ñ\80азлика Ð¼ÐµÐ¶Ð´Ñ\83 Ð²ÐµÑ\80Ñ\81ииÑ\82е Ð±ÐµÑ\88е '''прикрита'''.
+'rev-suppressed-diff-view' => "Ð\95дна Ð¾Ñ\82 Ñ\80едакÑ\86ииÑ\82е Ð¾Ñ\82 Ñ\82ази Ñ\80азлика Ð¼ÐµÐ¶Ð´Ñ\83 Ð²ÐµÑ\80Ñ\81ииÑ\82е Ðµ Ð±Ð¸Ð»Ð° '''прикрита'''.
 Като администратор, можете да видите тази разлика; повече подробности има в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневника за прикриванията].",
 'rev-delundel' => 'показване/скриване',
 'rev-showdeleted' => 'показване',
@@ -1146,7 +1146,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'Дневник на прикриванията',
 'suppressionlogtext' => 'По-долу е посочен списък на изтривания и блокирания, свързан със съдържание, скрито от администраторите.
\97а Ñ\82екÑ\83Ñ\89иÑ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\8f Ð¸ Ð·Ð°Ð±Ñ\80ани, Ð²Ð¸Ð¶Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\82е IP Ð°Ð´Ñ\80еÑ\81и]].',
\97а Ñ\82екÑ\83Ñ\89иÑ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\8f Ð¸ Ð·Ð°Ð±Ñ\80ани, Ð²Ð¸Ð¶Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\8fÑ\82а]].',
 
 # History merging
 'mergehistory' => 'Сливане на редакционни истории',
@@ -1947,6 +1947,7 @@ $1',
 'wantedpages' => 'Желани страници',
 'wantedpages-badtitle' => 'Невалидно заглавие в резултатното множество: $1',
 'wantedfiles' => 'Желани файлове',
+'wantedfiletext-nocat' => 'Следните файлове се използват, но не съществуват. Възможно е да са включени файлове от външни хранилища, въпреки че съществуват. Всички такива случаи на възможна фалшива тревога ще бъдат показвани <del>зачеркнати</del>.',
 'wantedtemplates' => 'Желани шаблони',
 'mostlinked' => 'Най-препращани страници',
 'mostlinkedcategories' => 'Най-препращани категории',
@@ -2852,6 +2853,7 @@ $1',
 'spambot_username' => 'Спамочистач',
 'spam_reverting' => 'Връщане на последната версия, несъдържаща препратки към $1',
 'spam_blanking' => 'Всички версии, съдържащи препратки към $1, изчистване',
+'spam_deleting' => 'Всички версии съдържат препратки към $1, изтриване',
 
 # Info page
 'pageinfo-title' => 'Информация за "$1"',
@@ -2859,12 +2861,13 @@ $1',
 'pageinfo-header-edits' => 'Редакции',
 'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдабащи',
+'pageinfo-redirects-name' => 'Пренасочвания към тази страница',
 'pageinfo-subpages-name' => 'Подстраници на тази страница',
 'pageinfo-lastuser' => 'Последeн редактор',
 'pageinfo-lasttime' => 'Дата на последнoто редактиране',
 'pageinfo-edits' => 'Общ брой редакции',
 'pageinfo-authors' => 'Брой на отделни автори',
-'pageinfo-magic-words' => 'Вълшебни думички ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Класика',
index 63f32bf..8f3ccf6 100644 (file)
@@ -442,6 +442,10 @@ $1',
 'youhavenewmessages' => "$1 zo ganeoc'h ($2).",
 'newmessageslink' => 'Kemennoù nevez',
 'newmessagesdifflink' => "Diforc'hioù e-keñver ar stumm kent",
+'youhavenewmessagesfromusers' => '$1 ho peus eus {{PLURAL:$3|un implijer all|$3 implijer}} ($2).',
+'youhavenewmessagesmanyusers' => ' $1 ho peus implijerien a-leizh  ($2).',
+'newmessageslinkplural' => "{{PLURAL:$1ur c'hemennad nevez|kemennadoù nevez}}",
+'newmessagesdifflinkplural' => '{{PLURAL:$1|kemennad diwezhañ|kemennadoù diwezhañ}}',
 'youhavenewmessagesmulti' => "Kemennoù nevez zo ganeoc'h war $1",
 'editsection' => 'kemmañ',
 'editold' => 'kemmañ',
@@ -591,6 +595,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'remembermypassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
 'securelogin-stick-https' => 'Chom kevreet da HTTPS goude bezañ bet kevreet',
 'yourdomainname' => 'Ho tomani',
+'password-change-forbidden' => "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
 'externaldberror' => "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
 'login' => 'Kevreañ',
 'nav-login-createaccount' => 'Krouiñ ur gont pe kevreañ',
@@ -832,6 +837,8 @@ Gallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù a
 'noarticletext-nopermission' => 'N\'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.
 Gallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,
 pe <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>.',
+'missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
+Gallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 'userpage-userdoesnotexist' => 'N\'eo ket enrollet ar gont "<nowiki>$1</nowiki>". Merkit ma fell deoc\'h krouiñ/kemmañ ar bajenn-mañ.',
 'userpage-userdoesnotexist-view' => 'N\'eo ket enrollet ar gont implijer "$1".',
 'blocked-notice-logextract' => "Stanket eo an implijer-mañ evit poent.
@@ -952,6 +959,7 @@ A-gostez eo bet lezet an arventenn-se.',
 'expansion-depth-exceeded-warning' => "Pajenn a ya dreist d'an donder astenn",
 'parser-unstrip-loop-warning' => "Detektet ez eus bet ul lagadenn n'haller ket divontañ",
 'parser-unstrip-recursion-limit' => "Aet dreist d'ar vevenn rekurziñ n'haller ket divontañ : $1",
+'converter-manual-rule-error' => 'Fazi dinodet  er reolenn cheñch yezh dre zorn',
 
 # "Undo" feature
 'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
@@ -1136,6 +1144,8 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'editundo' => 'dizober',
 'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
+'difference-missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.
+Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 
 # Search results
 'searchresults' => "Disoc'hoù enklask",
@@ -1402,6 +1412,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'right-writeapi' => 'Ober gant an API evit kemmañ ar wiki',
 'right-delete' => 'Diverkañ pajennoù',
 'right-bigdelete' => 'Diverkañ pajennoù dezho un hir a istor',
+'right-deletelogentry' => 'Dilemel hag assevel monedoù dibar eus ar renabl',
 'right-deleterevision' => 'Diverkañ ha diziverkañ stummoù zo eus ur pajenn',
 'right-deletedhistory' => 'Gwelet anvioù an istorioù diverket hep diskouez an destenn stag outo',
 'right-deletedtext' => "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
@@ -1831,6 +1842,7 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 'uploadnewversion-linktext' => 'Kargañ ur stumm nevez eus ar restr-mañ',
 'shared-repo-from' => 'eus $1',
 'shared-repo' => 'ur sanailh rannet',
+'upload-disallowed-here' => "Siwazh, ne c'hallit ket erlec'hiañ ar skeudenn-mañ",
 
 # File reversion
 'filerevert' => 'Disteuler $1',
@@ -1938,6 +1950,7 @@ Diskoulmet eo bet an enmontoù <del>barrennet</del>.',
 'nbytes' => '$1 {{PLURAL:$1|eizhbit|eizhbit}}',
 'ncategories' => '
 $1 {{PLURAL:$1|rummad|rummad}}',
+'ninterwikis' => ' {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|liamm|liamm}}',
 'nmembers' => '$1 {{PLURAL:$1|elfenn|elfenn}}',
 'nrevisions' => '$1 {{PLURAL:$1|stumm|stumm}}',
@@ -2114,6 +2127,8 @@ Gallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]
 ha bezañ merket ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù]]
 evit gallout kas ur postel d'un implijer all.",
 'emailuser' => "Kas ur postel d'an implijer-mañ",
+'emailuser-title-target' => "Kas ur postel d'an {{PLURAL:$1|an implijer-mañ|an implijerez-mañ}}",
+'emailuser-title-notarget' => "Kas ur postel d'un implijer",
 'emailpage' => 'Postel implijer',
 'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an implijer-mañ.
 E maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
@@ -2773,6 +2788,7 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
 'import-error-interwiki' => 'Ne vez ket enporzhiet ar bajenn "$1" rak miret eo an anv evit liammoù diavaez (etrewiki).',
 'import-error-special' => 'Ne vez ket enporzhiet ar bajenn "$1" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.',
 'import-error-invalid' => 'Ne vez ket enporzhiet ar bajenn "$1" rak direizh eo hec\'h anv.',
+'import-options-wrong' => '{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => 'Log an enporzhiadennoù',
@@ -2921,11 +2937,34 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 
 # Info page
 'pageinfo-title' => 'Titouroù evit "$1"',
+'pageinfo-header-basic' => 'Titouroù diazez',
 'pageinfo-header-edits' => 'Kemmoù',
+'pageinfo-header-restrictions' => 'Gwarez ar bajenn',
+'pageinfo-header-properties' => 'Perzhioù ar bajenn',
+'pageinfo-display-title' => 'Titl diskwelet',
+'pageinfo-default-sort' => "Alc'hwez rummañ dre ziouer",
+'pageinfo-length' => 'Ment ar bajenn (en oktedoù)',
+'pageinfo-article-id' => 'Niverenn ar bajenn',
+'pageinfo-robot-policy' => 'Statud al lusker klask',
+'pageinfo-robot-index' => "A c'haller menegeriñ",
+'pageinfo-robot-noindex' => "Ne c'haller ket menegeriñ",
 'pageinfo-views' => 'Niver a weladennoù',
 'pageinfo-watchers' => 'Niver a dud o heuliañ',
+'pageinfo-redirects-name' => 'Adkas war-zu ar bajenn-mañ',
+'pageinfo-subpages-name' => 'Ispajennoù eus ar bajenn-mañ',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|kasadur|kasadurioù}}; $3 {{PLURAL:$3|nann kasaduri|nann kasadurioù}})',
+'pageinfo-firstuser' => 'Krouer ar bajenn',
+'pageinfo-firsttime' => 'Deiziad krouiñ ar bajenn',
+'pageinfo-lastuser' => 'Kontroller diwezhañ',
+'pageinfo-lasttime' => "Deiziad ar c'hemm diwezhañ",
 'pageinfo-edits' => 'Niver a gemmoù',
 'pageinfo-authors' => 'Niver a aozerien disheñvel',
+'pageinfo-recent-edits' => 'Niver a gemmoù nevez (er $1 diwezhañ)',
+'pageinfo-recent-authors' => "Niver a aozerien nevez a-ziforc'h",
+'pageinfo-restriction' => 'Gwareziñ ar bajenn ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Ger hud |Gerioù hud}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Rumm kuzh|Rummoù kuzh}} ($1)',
+'pageinfo-templates' => "{{PLURAL:$1|Patrom endalc'het|Patromoù endalc'het}} ($1)",
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -2980,6 +3019,7 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'file-info-size-pages' => '$1 × $2 piksel, ment ar restr : $3, seurt MIME : $4, $5 {{PLURAL:$5|pajenn|pajenn}}',
 'file-nohires' => "N'haller ket gwellaat ar pizhder.",
 'svg-long-desc' => 'restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3',
+'svg-long-desc-animated' => 'Restr SVG bev, ment $1 × $2 piksel, ment ar restr: $3',
 'show-big-image' => 'Pizhder leun',
 'show-big-image-preview' => 'Ment ar rakweled-mañ : $1.',
 'show-big-image-other' => '{{PLURAL:$2|pizhder all|pizhderioù all}} : $1.',
@@ -2989,6 +3029,8 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'file-info-png-looped' => "e kelc'h",
 'file-info-png-repeat' => 'lennet $1 {{PLURAL:$1|wezh|gwezh}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|skeudenn|skeudenn}}',
+'file-no-thumb-animation' => 'Evezhiadenn: En abeg  da vevennoù teknikel ne vo ket bevaet skeudennoùigoù ar restr-mañ',
+'file-no-thumb-animation-gif' => 'Evezhiadenn: En abeg  da vevennoù teknikel ne vo ket bevaet ar skeudennoù GIF uhel o diarunusted evel homañ.',
 
 # Special:NewFiles
 'newimages' => 'Roll ar restroù nevez',
@@ -3809,7 +3851,7 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'api-error-file-too-large' => "Ar restr hoc'h eus roet a oa re vras.",
 'api-error-filename-tooshort' => 'Re verr eo anv ar restr.',
 'api-error-filetype-banned' => 'Difennet eo ar seurt restroù',
-'api-error-filetype-banned-type' => "'''N'eo ket $1 {{PLURAL:$4|ur seurt restr aotreet|seurtoù restroù aotreet}}. $2 eo {{PLURAL:$3|ar seurt restroù|ar seurtoù restroù}} degemeret.",
+'api-error-filetype-banned-type' => "N'eo ket $1{{PLURAL:$4|ur seurt restr aotreet | seurtoù restroù aotreet}}. $2 zo {{PLURAL:$3|ar seurt restroù|ar seurtoù restroù}} degemeret.?",
 'api-error-filetype-missing' => "Un astenn a vank d'ar restr.",
 'api-error-hookaborted' => "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
 'api-error-http' => "Fazi diabarzh : dibosupl kevreañ d'ar servijer.",
index aef2dc4..b7d1060 100644 (file)
@@ -10,6 +10,7 @@
  * @author Abastillas
  * @author Dosmiin Barsbold
  * @author Jordz
+ * @author Mirzali
  * @author Palang hernan
  * @author Reedy
  * @author לערי ריינהארט
@@ -456,7 +457,7 @@ Ayaw kalimot sa pag-usab sa imong [[Special:Preferences|{{SITENAME}} mga prepere
 'loginprompt' => 'Kinahanglang naka-enable ang mga koki aron ikaw maka-log-in sa {{SITENAME}}.',
 'userlogin' => 'Rehistro / Dayon',
 'logout' => 'Biya',
-'userlogout' => 'Biya',
+'userlogout' => 'Bıveciye',
 'notloggedin' => 'Wala ka pa masulod',
 'nologin' => "Wala pay akawnt? '''$1'''.",
 'nologinlink' => 'Paghimo og akawnt',
index 6b75f91..8c02b3f 100644 (file)
@@ -794,12 +794,11 @@ $2
 'userpage-userdoesnotexist' => 'هەژماری بەکارهێنەری "<nowiki>$1</nowiki>" تۆمار نەکراوە.<br />
 گەر دەتەوێ ئەم لاپەڕە درووست‌کەی یان دەستکاری بکەی تکایە تاقی‌بکەوە .',
 'userpage-userdoesnotexist-view' => 'ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.',
-'clearyourcache' => "'''ئاگاداری:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.
+'clearyourcache' => "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.
 * '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)
 * '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)
 * '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە
-* '''Konqueror:''' کرتە بکە لەسەر ''Reload'' یان دوگمەی ''F5'' لێبدە
-* '''Opera:''' کاشەکە لە ڕێگەی ''Tools → Preferences'' بسڕەوە.",
+* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
 'usercssyoucanpreview' => "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
 'userjsyoucanpreview' => "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
 'usercsspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی CSS به‌کارهێنه‌ریه‌که‌ت ده‌که‌ی.'''
@@ -963,9 +962,9 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 'rev-deleted-event' => '(لۆگی کردەوە سڕایەوە)',
 'rev-deleted-text-permission' => "ئەم پیاچوونەوەی پەڕەیە '''سڕاوەتەوە'''.
 وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
-'rev-deleted-text-unhide' => "پێداچوونەوەی ئەم لاپەڕە '''سڕدراوەتەوە'''.<br />
\84Û\95Ù\88اÙ\86Û\95Û\8cÛ\95 Ù\88ردÛ\95کارÛ\8c Ø³Û\95بارÛ\95ت Ø¨Û\95Ù\88Û\95 Ù\84Û\8eرÛ\95دا Ø¯Û\95ست Ú©Û\95Ù\88Û\8e : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\84Û\86Ú¯Û\8c Ø¨Û\95رگرÛ\8c]<br />
-وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم پێداچوونەوە] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
+'rev-deleted-text-unhide' => "ئەم پیاچوونەوەی پەڕەیە '''سڕراوەتەوە'''.
\88ردÛ\95کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\84Û\95 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ù\84Û\86Ú¯Û\8c Ø³Ú\95Û\8cÙ\86Û\95Ù\88Û\95]دا Ø¯Û\95دÛ\86زرÛ\8eتÛ\95Ù\88Û\95.
+ھێشتا دەتوانی [$1 ئەم پیاچوونەوەیە ببینی] ئەگەر دەتەوێ پێشتر بڕۆی.",
 'rev-suppressed-text-unhide' => "پێداچوونەوی ئەم لاپەڕە '''بەرگری''' لێ‌کراوە.
 لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].
 وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم پێداچوونەوە] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
@@ -1037,8 +1036,9 @@ $1",
 'revdelete-only-restricted' => 'ھەڵە لە شاردنەوەی بابەتی ڕێکەوتی $2ی $1: ناتوانی لە بینینی بابەتەکان لە لایەن بەڕێوبەرانەوە بەرگری بکەیت، مەگەر یەکێکی تر لە ھەڵبژاردەکانی بەرچاوکەوتن ھەڵبژێریت.',
 'revdelete-reason-dropdown' => '*ھۆکارە باوەکانی سڕینەوە
 ** لادان لە مافی لەبەرگرتنەوە
-** زانیارە تاکەکەسییە نابەجێیەکان
-** Potentially libelous information',
+** بۆچوون یان زانیاریی تاکەکەسیی نەشیاو
+** ناوی بەکارھێنەریی نەشیاو
+** زانیارییەک کە دەتوانێ بوختاناوی بێت',
 'revdelete-otherreason' => 'ھۆکاری تر/زیاتر:',
 'revdelete-reasonotherlist' => 'هۆکاری دیکە',
 'revdelete-edit-reasonlist' => 'دەستکاریی ھۆکارەکانی سڕینەوە',
@@ -1046,8 +1046,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'لۆگی بەرگری‌کردن',
-'suppressionlogtext' => 'لە خوارەوە لیستێک لە سڕاوە و بەرگری‌کراوانەی وا ناوەڕۆکیان لە چاو بەڕێوبەران داشاردراوە دەبینیت.
¨Û\86 Ø¯Û\8cتÙ\86Û\8c Ø¦Û\95Ù\88 Ø¨Û\95رگرÛ\8cاÙ\86Û\95Û\8c Ø¦Û\8eستا Ù\84Û\95 Ú©Ø§Ø±Ø¯Ø§Û\8cÛ\95 Ú\86اÙ\88 Ù\84Û\95 [[Special:IPBlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95رگرÛ\8c Ø¦Ø§Û\8câ\80\8cÙ¾Û\8c]] Ø¨Ú©Û\95.',
+'suppressionlogtext' => 'خوارەوە لیستێکی سڕینەوەکان و بەربەستنەکانە کە ناوەرۆکێکی شاراوە لە بەڕێوبەرانیان ھەیە.
³Û\95Û\8cرÛ\8c [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÙ\86]] Ø¨Ú©Û\95 Ø¨Û\86 Ù\84Û\8cستÛ\8c Ø¦Û\95Ù\88 Ø¨Û\95رگرÛ\8c Ù\88 Ø¨Û\95ربÛ\95ستÙ\86اÙ\86Û\95 Ø¦Û\8eستا Ù\84Û\95کارداÙ\86.',
 
 # History merging
 'mergehistory' => 'یەک‌خستنی مێژووەکانی لاپەڕە',
@@ -1244,7 +1244,7 @@ $1",
 'prefs-emailconfirm-label' => 'پشتڕاست کردنەوەی ئیمەیل:',
 'prefs-textboxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن',
 'youremail' => 'ئیمەیل:',
-'username' => 'ناوی به‌كارهێنه‌ر:',
+'username' => 'ناوی به‌کارھێنەر:',
 'uid' => 'ژمارەی بەکارھێنەر:',
 'prefs-memberingroups' => 'ئەندامی {{PLURAL:$1|گرووپی|گرووپەکانی}}:',
 'prefs-registration' => 'کاتی خۆتۆمارکردن:',
@@ -1285,12 +1285,12 @@ $1",
 
 # User rights
 'userrights' => 'بەڕێوەبردنی مافەکانی بەکارھێنەر',
-'userrights-lookup-user' => 'بەڕێوەبردنی گرووپەکانی بەکارهێنەران',
+'userrights-lookup-user' => 'بەڕێوەبردنی گرووپەکانی بەکارھێنەر',
 'userrights-user-editname' => 'ناوی بەکارهێنەرێک بنووسە:',
-'editusergroup' => 'گرووپەکانی بەکارهێنەر بگۆڕە',
+'editusergroup' => 'گرووپەکانی بەکارھێنەر دەستکاری بکە',
 'editinguser' => "گۆڕینی مافەکانی بەکارهێنەر '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => 'دەستکاری کردنی گرووپەکانی بەکارهێنەران',
-'saveusergroups' => 'گرÙ\88Ù\88Ù¾Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95راÙ\86 پاشەکەوت بکە',
+'userrights-editusergroup' => 'دەستکاریی گرووپەکانی بەکارهێنەر',
+'saveusergroups' => 'گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر پاشەکەوت بکە',
 'userrights-groupsmember' => 'ئەندامە لە:',
 'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە بگۆڕیت:
 * چوارچێوەی نیشان‌کراو مانای ئەوەیە لەو گرووپەدا هەیە.
@@ -1307,7 +1307,7 @@ $1",
 # Groups
 'group' => 'گرووپ:',
 'group-user' => 'بەکارهێنەران',
-'group-autoconfirmed' => 'بەکارھێنەرە خۆکار پەسندکراوەکان',
+'group-autoconfirmed' => 'بەکارھێنەرانی پەسندکراوی خۆگەڕ',
 'group-bot' => 'بۆتەکان',
 'group-sysop' => 'بەڕێوبەران',
 'group-bureaucrat' => 'بورووکراتەکان',
@@ -1315,14 +1315,14 @@ $1",
 'group-all' => '(هەموو)',
 
 'group-user-member' => '{{GENDER:$1|بەکارھێنەر}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|بەکارھێنەری خۆکار پەسەندکراو}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|بەکارھێنەرانی پەسندکراوی خۆگەڕ}}',
 'group-bot-member' => 'بۆت',
 'group-sysop-member' => '{{GENDER:$1|بەڕێوبەر}}',
 'group-bureaucrat-member' => '{{GENDER:$1|بورووکرات}}',
 'group-suppress-member' => '{{GENDER:$1|چاودێر}}',
 
 'grouppage-user' => '{{ns:project}}:بەکارھێنەران',
-'grouppage-autoconfirmed' => '{{ns:project}}:بەکارهێنەرانی خۆکار-بڕواکراو',
+'grouppage-autoconfirmed' => '{{ns:project}}:بەکارھێنەرانی پەسندکراوی خۆگەڕ',
 'grouppage-bot' => '{{ns:project}}:بۆتەکان',
 'grouppage-sysop' => '{{ns:project}}:بەڕێوبەران',
 'grouppage-bureaucrat' => '{{ns:project}}:بورووکراتەکان',
@@ -1930,7 +1930,7 @@ $1',
 'newuserlogpagetext' => 'ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Ù\85اÙ\81Û\95کاÙ\86Û\8c Ú¯Ø±Ù\88Ù\88Ù¾Û\95 Ø¨Û\95کارھÛ\8eÙ\86Û\95رÛ\8cÛ\8cÛ\95کاÙ\86',
+'listgrouprights' => 'Ù\85اÙ\81Û\95کاÙ\86Û\8c Ú¯Ø±Ù\88Ù\88Ù¾Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر',
 'listgrouprights-summary' => 'ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
 لێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە مافە تاکەکەسیەکان.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">مافی دراوە</span>
@@ -2179,9 +2179,8 @@ $UNWATCHURL
 'undeletepagetext' => 'ئەم {{PLURAL:$1|سڕاوەتەوە|$1 لاپەڕە سڕاونەتەوە}} بەڵام لەبەر ئەوەی لە ئەرشیڤ‌دا هەن هێشتا دەتوانی بیانهێنیتەوە.
 ئەرشیڤ چەن‌وەخت جارێ لە کاتی دیاری‌کراودا خاوێن‌دەکرێتەوە.',
 'undelete-fieldset-title' => 'هێنانەوەی پێداچوونەوەکان',
-'undeleteextrahelp' => "بۆ هێنانەوەی هەموو مێژووی لاپەڕەیەک، تەواوی چوارچێوەکانی نیشان‌کردن بەتاڵ بهێڵەوە و کرتە بکە سەر '''''هێنانەوە'''''.
-بۆ ئەنجامی گەڕانەوەیەکی هەڵبژاردوو، چوارچێوەی بەرامبەر ئەو پێداچوونەوی دەتەوێ بیهێنیتەوە، نیشان‌بکە و  کرتە بکە سەر '''''هێنانەوە'''''.
-کرتەکردن سەر '''''بردنەوە نووک''''' ئەبێتە هۆی سڕینەوەی شوێنی بۆچوونەکان و بەتاڵ بوونەوەی چوارچێوەکان.",
+'undeleteextrahelp' => "بۆ هێنانەوەی سەرانسەری مێژووی پەڕەیەک، گشت بۆکسەکان ھەڵنەبژێردراو بھێڵەوە و کلیک بکە لەسەر '''''{{int:undeletebtn}}'''''.
+بۆ ئەنجامدانی ھێنانەوەیەکی بژاردەیی، بۆکسەکانی پەیوەندیدار بەو پیاچوونەوانە دەبێ بھێنرێنەوە ھەڵبژێرە و کلیک بکە لەسەر  '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}} ئەرشیڤ‌کرا',
 'undeletehistory' => 'ئەگەر لاپەڕەیەک بهێنیتەوە، هەموو پێداچوونەوەکانی دەگەڕێنەوە بۆ لاپەڕەی مێژوو.
 ئەگەر لە کاتی سڕاوەبوون، لاپەڕەیەک هەر بەو ناوە درووست‌کرابێت، پێداچوونەوە هێنراوەکان لە لاپەڕەی مێژووی کۆن‌دا نیشان ئەدرێت.',
@@ -2305,8 +2304,8 @@ $1',
 'ipb-change-block' => 'دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە',
 'badipaddress' => 'ناونیشانی ئای‌پی نەگونجاو',
 'blockipsuccesssub' => 'بەربەست کردن سەرکەوتوو بوو',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بەربەستکراوە.<br />
¨Û\86 Ø¯Û\8cتÙ\86Û\8c Ø¨Û\95ربÛ\95ستâ\80\8cکراÙ\88Û\95کاÙ\86Ø\8c Ú\86اÙ\88 Ù\84Û\95 [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÛ\8c Ø¦Ø§Û\8câ\80\8cÙ¾Û\8c]] Ø¨Ú©Û\95.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بەربەستکراوە.<br />
³Û\95Û\8cرÛ\8c [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÙ\86]] Ø¨Ú©Û\95 Ø¨Û\86 Ø¨Û\8cÙ\86Û\8cÙ\86Û\95Ù\88Û\95Û\8c Ø¨Û\95ربÛ\95ستÙ\86Û\95کاÙ\86.',
 'ipb-edit-dropdown' => 'دەستکاری هۆکارەکانی بەربەست',
 'ipb-unblock-addr' => 'لە بەربەست‌دەرهێنانی $1',
 'ipb-unblock' => 'لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی',
@@ -2343,9 +2342,9 @@ $1',
 'blocklogpage' => 'لۆگی بەربەستن',
 'blocklogentry' => '[[$1]] ئاستەنگ کرا بۆ ماوەی $2 $3',
 'reblock-logentry' => 'دۆخی ئاستەنگ کردنی [[$1]]  بۆ گۆڕدرا بۆ ماوەی $2 $3',
-'blocklogtext' => 'ئÛ\95Ù\85Û\95 Ù\84Û\86Ú¯Û\8c Ú©Ø±Ø¯Û\95Ù\88Û\95کاÙ\86Û\8c Ø¨Û\95ربÛ\95ستâ\80\8cکراÙ\86 Û\8cا Ù\84ابردÙ\86Û\8c Ø¨Û\95ربÛ\95ستÛ\8c Ø¨Û\95کارÙ\87ێنەرە.
¨Û\95ربÛ\95ستâ\80\8cکراÙ\86Û\8c Ø®Û\86کارÛ\8c Ø¦Ø§Û\8câ\80\8cÙ¾Û\8c Ù\84Û\95Ù\85 Ù\84Û\8cستÛ\95دا Ù\86Û\95Ù\87اتÙ\88ون.
¨Û\86 Ø¯Û\8cتÙ\86Û\8c Ø¦Û\95Ù\88 Ø¨Û\95ربÛ\95ستاÙ\86Û\95 Ø¦Û\8eستÛ\95 Ù\84Û\95 Ø¦Ø§Ø±Ø§Ø¯Ø§Ù\86 Ú\86اÙ\88 Ù\84Û\95 [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÛ\8c Ø¦Ø§Û\8câ\80\8cÙ¾Û\8c]] Ø¨Ú©Û\95.',
+'blocklogtext' => 'ئÛ\95Ù\85Û\95 Ù\84Û\86Ú¯Û\8eÚ©Û\8c Ú©Ø±Ø¯Û\95Ù\88Û\95کاÙ\86Û\8c Ø¨Û\95ربÛ\95ستÙ\86 Û\8cاÙ\86 Ù\84ابردÙ\86Û\8c Ø¨Û\95ربÛ\95ستÙ\86Û\8c Ø¨Û\95کارھێنەرە.
¦Û\95Ù\88 Ø¦Ø§Û\8cÙ¾Û\8c Ø¦Û\95درÛ\95ساÙ\86Û\95 Ø®Û\86کاراÙ\86Û\95 Ø¨Û\95ربستکراÙ\88Ù\86 Ø¨Û\95 Ú\95Û\8cز Ù\86Û\95کراون.
³Û\95Û\8cرÛ\8c [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÙ\86]] Ø¨Ú©Û\95 Ø¨Û\86 Ø¨Û\8cÙ\86Û\8cÙ\86Û\8c Ø¦Û\95Ù\88 Ø¨Û\95رگرÛ\8c Ù\88 Ø¨Û\95ربÛ\95ستÙ\86اÙ\86Û\95 Ø¦Û\8eستا Ù\84Û\95 Ø¨Û\95رکارداÙ\86.',
 'unblocklogentry' => 'بەربەستنی "$1" بەتاڵ کرا',
 'block-log-flags-anononly' => 'تەنها بەکارهێنەرە نەناسراوەکان',
 'block-log-flags-nocreate' => 'دروستکردنی ھەژمار ناچالاککراوە',
@@ -2681,13 +2680,20 @@ $1',
 # Info page
 'pageinfo-title' => 'زانیاری بۆ «$1»',
 'pageinfo-header-basic' => 'زانیاریی سەرەتایی',
-'pageinfo-header-edits' => 'دەستکاریەکان',
+'pageinfo-header-edits' => 'مێژووی دەستکاری',
+'pageinfo-header-restrictions' => 'پاراستنی پەڕە',
+'pageinfo-header-properties' => 'تایبەتمەندییەکانی پەڕە',
 'pageinfo-display-title' => 'ناونیشان نیشانبدە',
 'pageinfo-article-id' => 'زنجیرەی پەڕە',
 'pageinfo-views' => 'ژمارەی بینینەکان',
-'pageinfo-watchers' => 'ژمارەی چاودێران',
+'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
+'pageinfo-redirects-name' => 'ڕەوانەکردنەکان بۆ ئەم پەڕەیە',
+'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
 'pageinfo-firstuser' => 'دروستکەری پەڕە',
-'pageinfo-edits' => 'ژمارەی دەستکارییەکان',
+'pageinfo-firsttime' => 'ڕێکەوتی دروستکردنی پەڕە',
+'pageinfo-lastuser' => 'دوایین دەستکاریکەر',
+'pageinfo-lasttime' => 'ڕێکەوتی دوایین دەستکاری',
+'pageinfo-edits' => 'ژمارەی سەرجەمی دەستکارییەکان',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -2816,12 +2822,14 @@ $1',
 'exif-saturation' => 'تێربوون',
 'exif-gpslatitude' => 'پانی',
 'exif-gpslongitude' => 'درێژی',
+'exif-gpstimestamp' => 'کاتی GPS (سەعاتی ئەتۆمی)',
 'exif-gpsmeasuremode' => 'جۆری پێوان',
 'exif-gpsdop' => 'وردی پێوان',
 'exif-gpsspeedref' => 'یەکەی خێرایی',
 'exif-gpsspeed' => 'خێرایی وەرگری GPS',
 'exif-gpstrack' => 'ئاڕاستەی جوڵان',
 'exif-gpsimgdirection' => 'ئاڕاستەی وێنە',
+'exif-gpsareainformation' => 'ناوی ناوچەی GPS',
 'exif-gpsdatestamp' => 'ڕێکەوتی GPS',
 'exif-objectname' => 'سەردێری کورت',
 'exif-headline' => 'سەردێر',
@@ -2850,6 +2858,8 @@ $1',
 
 'exif-exposureprogram-1' => 'دەستکار',
 
+'exif-subjectdistance-value' => '$1 مەتر',
+
 'exif-meteringmode-0' => 'نەزانراو',
 'exif-meteringmode-1' => 'تێکڕا',
 'exif-meteringmode-5' => 'شێوە',
@@ -2949,6 +2959,8 @@ $1',
 'exif-gpsdestdistance-m' => 'میل',
 'exif-gpsdestdistance-n' => 'میکی دەریایی',
 
+'exif-gpsdop-good' => 'چاک ($1)',
+
 'exif-dc-date' => 'ڕۆژ(ەکان)',
 'exif-dc-publisher' => 'بڵاوکار',
 'exif-dc-relation' => 'میدیای پەیوەندیدار',
@@ -2961,8 +2973,11 @@ $1',
 'exif-iimcategory-sci' => 'زانست و تەکنۆلۆژیا',
 'exif-iimcategory-soi' => 'بابەتە کۆمەڵایەتییەکان',
 'exif-iimcategory-spo' => 'وەرزشەکان',
+'exif-iimcategory-wea' => 'کەش و ھەوا',
 
 'exif-urgency-normal' => 'ئاسایی ($1)',
+'exif-urgency-low' => 'کەم ($1)',
+'exif-urgency-high' => 'زۆر ($1)',
 
 # External editor support
 'edit-externally' => 'دەستکاریی ئەم پەڕەیە بکە بە بەکارھێنانی پڕۆگرامێکی دەرەکی',
@@ -3204,7 +3219,7 @@ $5
 * <span class="mw-specialpagerestricted">پەڕە تایبەتە بەرگری‌لێکراوەکان.</span>',
 'specialpages-group-maintenance' => 'ڕاپۆرتەکانی چاکسازی',
 'specialpages-group-other' => 'پەڕە تایبەتەکانی دیکە',
-'specialpages-group-login' => 'چوونەژوورەوە / ناونووسین',
+'specialpages-group-login' => 'چوونەژوورەوە / دروستکردنی ھەژمار',
 'specialpages-group-changes' => 'دوایین گۆڕانکارییەکان و ڕەشنووسەکان',
 'specialpages-group-media' => 'ڕاپۆرتەکان و بارکردنەکانی میدیا',
 'specialpages-group-users' => 'بەکارھێنەران و مافەکان',
@@ -3299,7 +3314,7 @@ $5
 # API errors
 'api-error-filename-tooshort' => 'ناوی پەڕگەکە زۆر کورتە.',
 'api-error-filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|جۆرە پەڕگەی ڕێگە پێ‌نەدراوە‌|جۆرە پەڕگە ڕێگە پێ‌نەدراوە‌کانن}}. $2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە کە ڕێگەی|پەڕگانەیە کە ڕێگەیان}} پێ‌دراوە.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|جۆرە پەڕگەیەکی ڕێگەپێدراو نییە|جۆرە پەڕگە ڕێگەپێدراوەکان نین}}. {{PLURAL:$3|جۆرە پەڕگەی ڕێگەپێدراو ئەمەیە|جۆرە پەڕگەکانی ڕێگەپێدراو ئەمانەن}}:  $2.',
 'api-error-unclassified' => 'ھەڵەیەکی نەزانراو ڕوویداوە.',
 'api-error-unknown-code' => 'ھەڵەی نەزانراو: «$1».',
 'api-error-unknownerror' => 'ھەڵەی نەزانراو: «$1».',
index 2276e87..bd82570 100644 (file)
@@ -1272,7 +1272,8 @@ Prohlédněte si protokolovací záznamy.',
 'revdelete-only-restricted' => 'Chyba skrývání položky z $2 $1: Nemůžete položky pouze skrýt před správci, aniž byste současně vybrali i některou z dalších možností utajení.',
 'revdelete-reason-dropdown' => '*Obvyklé důvody smazání
 ** Porušení autorských práv
-** Nevhodné osobní údaje
+** Nevhodné komentáře nebo osobní údaje
+** Nevhodné uživatelské jméno
 ** Potenciálně pomlouvačné údaje',
 'revdelete-otherreason' => 'Jiný/další důvod:',
 'revdelete-reasonotherlist' => 'Jiný důvod',
@@ -3132,7 +3133,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-authors' => 'Celkový počet různých autorů',
 'pageinfo-recent-edits' => 'Počet nedávných ($1) editací',
 'pageinfo-recent-authors' => 'Nedávný počet různých autorů',
-'pageinfo-restriction' => 'Zámek stránky (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Zámek stránky ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Kouzelné slovo|Kouzelná slova}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá|Skryté}} kategorie ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Použitá šablona|Použité šablony}} ($1)',
index b63aa15..8860d97 100644 (file)
@@ -1025,7 +1025,9 @@ Edrychwch ar y logiau er mwyn cael rhagor o wybodaeth.",
 'revdelete-only-restricted' => "Cafwyd gwall wrth guddio'r eitem dyddiedig $2, $1: ni allwch guddio eitemau o olwg gweinyddwyr heb ar yr un pryd ddewis un o'r opsiynau eraill i gyfyngu ar y gallu i weld.",
 'revdelete-reason-dropdown' => '*Rhesymau cyffredin dros ddileu
 ** Torri hawlfraint
-** Gwybodaeth bersonol anaddas',
+** Gwybodaeth bersonol anaddas neu sylw anaddas
+** Enw defnydiwr anaddas
+** Gwybodaeth a allai fod yn enllibus',
 'revdelete-otherreason' => 'Rheswm arall:',
 'revdelete-reasonotherlist' => 'Rheswm arall',
 'revdelete-edit-reasonlist' => 'Golygu rhestr y rhesymau dros ddileu',
@@ -1765,6 +1767,7 @@ Mae modd golygu'r disgrifiad ohoni ar ei [$2 thudalen disgrifio] fan honno.",
 'shared-repo-from' => 'oddi ar $1',
 'shared-repo' => 'storfa cyfrannol',
 'shared-repo-name-wikimediacommons' => 'Comin Wikimedia',
+'upload-disallowed-here' => "Yn anffodus ni allwch drosysgrifo'r ddelwedd hon.",
 
 # File reversion
 'filerevert' => 'Gwrthdroi $1',
@@ -2727,7 +2730,7 @@ Mae ffolder dros dro yn eisiau.',
 'import-error-special' => 'Ni fewnforiwyd y dudalen "$1" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i\'w cael.',
 'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
 'import-options-wrong' => '{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>',
-'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y wraidd-dudalen, yn caniatau is-dudalennau.',
+'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y brif dudalen y mewnforir iddi, yn caniatau is-dudalennau.',
 
 # Import log
 'importlogpage' => 'Lòg mewnforio',
@@ -2857,12 +2860,15 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-views' => 'Nifer yr ymweliadau',
 'pageinfo-watchers' => 'Nifer gwylwyr y dudalen',
 'pageinfo-redirects-name' => "Nifer yr ailgyfeiriadau i'r dudalen hon",
+'pageinfo-subpages-name' => "Nifer yr is-dudalennau i'r dudalen hon",
 'pageinfo-firstuser' => 'Y defnyddiwr a ddechreuodd y dudalen',
 'pageinfo-firsttime' => "Dyddiad dechrau'r dudalen",
 'pageinfo-lastuser' => 'Y golygydd diweddaraf',
 'pageinfo-lasttime' => 'Dyddiad y golygiad diweddaraf',
 'pageinfo-edits' => 'Cyfanswm y golygiadau',
 'pageinfo-authors' => 'Cyfanswm yr awduron gwahanol',
+'pageinfo-magic-words' => '{{PLURAL:$1|Gair|Gair|Geiriau}} hud ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categori|Categori|Categorïau}} cudd ($1)',
 
 # Skin names
 'skinname-standard' => 'Safonol',
index 522ef8b..ac3ed2b 100644 (file)
@@ -1097,9 +1097,11 @@ Du har ikke adgang til det.',
 'revdelete-concurrent-change' => 'Fejl under modificering af objekt dateret $1 klokken $2: Dens status ser ud til at være blevet ændret af en, imens du prøvede at modificere den.
 Se venligst loglisterne.',
 'revdelete-only-restricted' => 'Fejl under skjulning af objekt dateret $2, $1: Du kan ikke skjule objekter for administratorerne uden at vælge en alternativ indstilling.',
-'revdelete-reason-dropdown' => '* Almindelige sletningsårsager
-** Overtrædelse af ophavsret
-** Upassende personlige oplysninger',
+'revdelete-reason-dropdown' => '* Almindelige begrundelser for sletning
+** Overtrædelse af ophavsretten
+** Upassende kommentar eller personlige oplysninger
+** Upassende brugernavn
+** Oplysninger, der muligvis er injuriende',
 'revdelete-otherreason' => 'Anden/yderligere årsag:',
 'revdelete-reasonotherlist' => 'Anden årsag',
 'revdelete-edit-reasonlist' => 'Rediger sletningsårsager',
@@ -2740,6 +2742,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 'import-interwiki-templates' => 'Inkluder alle skabeloner',
 'import-interwiki-submit' => 'Importer',
 'import-interwiki-namespace' => 'Importer til navnerum:',
+'import-interwiki-rootpage' => 'Destinationens stamside (valgfri):',
 'import-upload-filename' => 'Filnavn:',
 'import-comment' => 'Kommentar:',
 'importtext' => "Eksportér filen fra kilde-wiki'en ved hjælp af [[Special:Export|eksporterings værktøjet]], gem den på din harddisk og upload den her.",
@@ -2904,6 +2907,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-header-edits' => 'Redigeringshistorik',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
 'pageinfo-header-properties' => 'Sideegenskaber',
+'pageinfo-display-title' => 'Vist sidetitel',
 'pageinfo-default-sort' => 'Standardsorteringsnøgle',
 'pageinfo-length' => 'Sidelængde (i bytes)',
 'pageinfo-article-id' => 'Side-ID',
@@ -2915,11 +2919,15 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-redirects-name' => 'Omdirigeringer til denne side',
 'pageinfo-subpages-name' => 'Undersider til denne side',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|der ikke er en omdirigering|der ikke er omdirigeringer}})',
+'pageinfo-firstuser' => 'Brugeren, der oprettede siden',
 'pageinfo-firsttime' => 'Dato for oprettelsen af siden',
+'pageinfo-lastuser' => 'Brugeren, der senest har redigeret siden',
 'pageinfo-lasttime' => 'Dato for seneste redigering',
 'pageinfo-edits' => 'Samlet antal redigeringer',
 'pageinfo-authors' => 'Det samlede antal forskellige forfattere',
-'pageinfo-restriction' => 'Sidebeskyttelse (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-recent-edits' => 'Antallet af nylige redigeringer (i løbet af de seneste $1)',
+'pageinfo-recent-authors' => 'Antallet af bidragydere, der har redigeret siden for nyligt',
+'pageinfo-restriction' => 'Sidebeskyttelse ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Transkluderet skabelon|Transkluderede skabeloner}} ($1)',
index 3cca140..e9e63a9 100644 (file)
@@ -931,7 +931,7 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
 'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen deines Benutzerkontos zu erhalten.',
 'passwordreset-legend' => 'Passwort zurücksetzen',
 'passwordreset-disabled' => 'Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein}}',
+'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
@@ -1317,7 +1317,9 @@ Bitte prüfe die Logbücher.',
 'revdelete-only-restricted' => 'Fehler beim Verstecken des Eintrags vom $1, $2 Uhr: Du kannst keinen Eintrag vor Administratoren verstecken, ohne eine der anderen Ansichtsoptionen gewählt zu haben.',
 'revdelete-reason-dropdown' => '*Allgemeine Löschgründe
 ** Urheberrechtsverletzung
-** Unangebrachte persönliche Informationen',
+** Unangebrachte Kommentare oder persönliche Informationen
+** Unangebrachter Benutzername
+** Potentiell beleidigende Informationen',
 'revdelete-otherreason' => 'Anderer/ergänzender Grund:',
 'revdelete-reasonotherlist' => 'Anderer Grund',
 'revdelete-edit-reasonlist' => 'Löschgründe bearbeiten',
@@ -1678,8 +1680,8 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 # User rights log
 'rightslog' => 'Rechte-Logbuch',
 'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
-'rightslogentry' => 'änderte die Benutzerrechte für „$1“ von „$2“ auf „$3“',
-'rightslogentry-autopromote' => 'wurde automatisch von „$2“ nach „$3“ zugeordnet',
+'rightslogentry' => 'änderte die Benutzerrechte für „$1“ von „$2“ zu „$3“',
+'rightslogentry-autopromote' => 'wurde automatisch von „$2“ zu „$3“ zugeordnet',
 'rightsnone' => '(–)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2975,7 +2977,7 @@ Alle Transwiki-Import-Aktionen werden im [[Special:Log/import|Import-Logbuch]] p
 'import-interwiki-source' => 'Quell-Wiki/-Seite:',
 'import-interwiki-history' => 'Alle Versionen dieser Seite importieren',
 'import-interwiki-templates' => 'Alle Vorlagen einschließen',
-'import-interwiki-submit' => 'Import',
+'import-interwiki-submit' => 'Importieren',
 'import-interwiki-namespace' => 'Zielnamensraum:',
 'import-interwiki-rootpage' => 'Zielstammseite (optional):',
 'import-upload-filename' => 'Dateiname:',
@@ -3189,7 +3191,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-authors' => 'Gesamtzahl unterschiedlicher Autoren',
 'pageinfo-recent-edits' => 'Anzahl der kürzlich erfolgten Bearbeitungen (innerhalb von $1)',
 'pageinfo-recent-authors' => 'Anzahl der unterschiedlichen Autoren',
-'pageinfo-restriction' => 'Seitenschutz (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Seitenschutz ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisches Wort|Magische Wörter}} ($1)',
 'pageinfo-hidden-categories' => 'Versteckte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
 'pageinfo-templates' => 'Eingebundene {{PLURAL:$1|Vorlage|Vorlagen}} ($1)',
index 9d4272e..6b14116 100644 (file)
@@ -439,11 +439,11 @@ $messages = array(
 
 'about' => 'Heqa',
 'article' => 'Wesiqe',
-'newwindow' => '(Teqa da newi de abêno)',
-'cancel' => 'Bıterkne',
+'newwindow' => '(zerreyê teqeyê newey de beno a)',
+'cancel' => 'Bıtexelne',
 'moredotdotdot' => 'Vêşêri...',
 'mypage' => 'Pela mı',
-'mytalk' => 'Werênayışi',
+'mytalk' => 'Werênayışê mı',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Pusula',
 'and' => '&#32;u',
@@ -470,7 +470,7 @@ $messages = array(
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Tarixi bımocne',
-'vector-view-view' => 'Bıwanên',
+'vector-view-view' => 'Bıwanê',
 'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Kerdeni',
 'namespaces' => 'Cayê namey',
@@ -549,7 +549,7 @@ $1',
 'currentevents-url' => 'Project:Veng u vac',
 'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
-'edithelp' => 'Seni vurneyêno?',
+'edithelp' => 'Peştdariya vurnayışi',
 'edithelppage' => 'Help:Pela seni vurniyêna',
 'helppage' => 'Help:Estêni',
 'mainpage' => 'Pela Seri',
@@ -610,7 +610,7 @@ $1',
 'sort-ascending' => 'Ratnayışê Zeydnayışi',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Pele',
+'nstab-main' => 'Per',
 'nstab-user' => 'Pela Karberi',
 'nstab-media' => 'Pela Medya',
 'nstab-special' => 'Pela xısusiye',
@@ -741,7 +741,7 @@ Hesabê şıma biyo a.
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
 'logout' => 'Veciyayış',
-'userlogout' => 'Bıveciyên',
+'userlogout' => 'Bıveciye',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
@@ -877,7 +877,7 @@ Parola vêrdiye: $2',
 'changeemail-newemail' => 'E-posta adresiyo newe:',
 'changeemail-none' => '(Çıno)',
 'changeemail-submit' => 'E-postay xo bıvurne',
-'changeemail-cancel' => 'Bıterkne',
+'changeemail-cancel' => 'Bıtexelne',
 
 # Edit page toolbar
 'bold_sample' => 'Çapo qalınd',
@@ -902,13 +902,13 @@ Parola vêrdiye: $2',
 # Edit pages
 'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Vurnayışo werdı',
+'minoredit' => 'Eno yew vurnayışo qıckeko',
 'watchthis' => 'Ena pele seyr ke',
-'savearticle' => 'Peler qeyd ke',
+'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
-'showpreview' => 'Verqayti bıvin',
+'showpreview' => 'Verqayti bımocne',
 'showlivepreview' => 'Verqayto cıwın',
-'showdiff' => 'Vurnayışa bıvin',
+'showdiff' => 'Vurnayışan bımocne',
 'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
 'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
 'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
@@ -1108,7 +1108,7 @@ Taye şabloni zerre pel de nêmociyayeni.',
 Sebebo ke terefê $3 ra diyao ''$2''",
 
 # History pages
-'viewpagelogs' => 'Qe ena pele logan bevinin',
+'viewpagelogs' => 'Heq dê ena perer qeydan bıvinên',
 'nohistory' => 'Verê vurnayışanê na pele çıniyo.',
 'currentrev' => 'Halo nıkayên',
 'currentrev-asof' => 'Revizyonanê peniyan, tarixê $1',
@@ -1226,9 +1226,11 @@ resayişê şıma çino.',
 'revdelete-concurrent-change' => '$2 $1 no çi wexta ke vuriya xeta da: wina aseno ke wexta şıma vurnayiş kerdene o enate de yewna te vurnayiş kerdo.
 rocaneyan kontrol bıkere.',
 'revdelete-only-restricted' => 'Xetawa ke maddeyanê rocanê $2, $1ine nımnena: şıma nêşenê maddeyanê ke terefê idarekeran ra nêdiyaeyan, bê weçinıtışê tercihanê vêniyaoğanê binan ra zi yewi, çap kerê.',
-'revdelete-reason-dropdown' => '*sebebê hewna kerdışi umumi
-** ihlalê telifi
-** malumatê şexsiyo ke munasib niye',
+'revdelete-reason-dropdown' => '*Sebebê besternayış de umumi
+** İhlalê telifi
+** Malumatê şexsiyo ke munasib niye
+** Nameyo xırab
+** Malumatê iftira çekerdışi',
 'revdelete-otherreason' => 'ê bini/sebebê bini',
 'revdelete-reasonotherlist' => 'sebebê bini',
 'revdelete-edit-reasonlist' => 'sebebê hewna kerdışani bıvurn',
@@ -1311,7 +1313,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchprofile-project' => 'Pelê yardım u projey',
 'searchprofile-images' => 'Multimedya',
 'searchprofile-everything' => 'Hemi',
-'searchprofile-advanced' => 'Reverşiyoğî',
+'searchprofile-advanced' => 'Raverşiyaye',
 'searchprofile-articles-tooltip' => '$1 de bigêre',
 'searchprofile-project-tooltip' => '$1 de bigêre',
 'searchprofile-images-tooltip' => 'Dosya cı geyr',
@@ -1327,7 +1329,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-interwiki-default' => '$1 neticeyan:',
 'search-interwiki-more' => '(hona)',
 'search-mwsuggest-enabled' => 'ebe teklifan',
-'search-mwsuggest-disabled' => 'teklifi çıniyê',
+'search-mwsuggest-disabled' => 'weşenayışi çıniyê',
 'search-relatedarticle' => 'Eqreba',
 'mwsuggest-disable' => 'Tewsiyay AJAXi bıgê',
 'searcheverything-enable' => 'cayê nameyê hemi de bigêre',
@@ -1361,7 +1363,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 
 # Preferences page
 'preferences' => 'Tercihi',
-'mypreferences' => 'Tercihi',
+'mypreferences' => 'Tercihê mı',
 'prefs-edits' => 'Amarê vurnayışan:',
 'prefsnologin' => 'Şıma cıkewtış nêvıraşto',
 'prefsnologintext' => 'Şıma gani be <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} cikewte]</span> ke tercihanê karberi xo eyar bıkerê.',
@@ -1557,7 +1559,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-delete' => 'Pele bestere',
 'right-bigdelete' => 'Pelanê be tarixanê dergan bestere',
 'right-deletelogentry' => 'besternayış u mebesternayışa re qeyde definayışê xısusi',
-'right-deleterevision' => 'Vurnayışê xısusiyê ke ê pelanê, inan bestere ya peyser bia',
+'right-deleterevision' => 'Vurnayışê xısusiyê ke ê pelanê, inan bestere ya zi peyser bia',
 'right-deletedhistory' => 'Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan',
 'right-deletedtext' => 'Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke',
 'right-browsearchive' => 'Bıgeyre pelanê eserıtiyan',
@@ -2050,7 +2052,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-header-users' => 'Îstatistiksê karberî',
 'statistics-header-hooks' => 'Îstatistiksê binî',
 'statistics-articles' => 'Pelanê tedesteyî',
-'statistics-pages' => 'Peli',
+'statistics-pages' => 'Peri',
 'statistics-pages-desc' => 'Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.',
 'statistics-files' => 'Dosyayê bar biye',
 'statistics-edits' => 'Amarê vurnayîşî ke wextê {{SITENAME}} ronayîşî ra',
@@ -2188,7 +2190,7 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 'allnotinnamespace' => 'Pelanê hemî ($1 cayênameyî de niyo)',
 'allpagesprev' => 'Verên',
 'allpagesnext' => 'ver şo',
-'allpagessubmit' => 'Biya',
+'allpagessubmit' => 'Şo',
 'allpagesprefix' => 'herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:',
 'allpagesbadtitle' => 'pel o ke şıma kewenî cı, nameyê no peli de gıreyê zıwanan u wikiyi re elaqa esto, ê ra cıkewtış qebul niyo. ya zi sernameyan de karakterê qedexeyi tede esto.',
 'allpages-bad-ns' => '{{SITENAME}} keyepel de wina "$1" yew nameyê cayi çino.',
@@ -2269,7 +2271,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'emailuser' => 'Ena karberi rê mesac bırse',
 'emailuser-title-target' => 'Na E-postaya {{GENDER:$1|karberi}}ya',
 'emailuser-title-notarget' => 'E-postaya karberi',
-'emailpage' => 'karberi re e-mail bışaw',
+'emailpage' => 'karberi re e-posta bırışê',
 'emailpagetext' => 'no/na karberi re e-posta erşawıtışi de şıma pê forma cêrıni eşkeni kar bıkerî.
 [[Special:Preferences|tercihanê şıma ye karberi]] de adresa e-posta ya ke şıma dayo, na adres qısmê adresa e-postayi de "From (kam ra)" asena, no sebebi ra gırewtox/e eşkeno/a direk cewab bıdo şıma.',
 'usermailererror' => 'xizmetê e-postayi xeta da:',
@@ -2303,7 +2305,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 
 # Watchlist
 'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Listey seyrkerdışi',
+'mywatchlist' => 'Lista mına seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
@@ -2553,14 +2555,14 @@ $1',
 'namespace' => 'Cayê namey:',
 'invert' => 'Bê weçineni ê bina peyser biya',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Pineyê cadê naman',
+'namespace_association' => 'Cayê nameyanê elaqadaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
 # Contributions
 'contributions' => 'İştiraqê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'Pêşteni',
+'mycontris' => 'İştıraqê mı',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(ser)',
@@ -2588,7 +2590,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 # What links here
 'whatlinkshere' => 'Çı tiyay rê gırê beno',
 'whatlinkshere-title' => 'Peleye ke  "$1" re gre biyê',
-'whatlinkshere-page' => 'Pele:',
+'whatlinkshere-page' => 'Per:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
 'nolinkshere' => "Yew pel zi '''[[:$1]]''' rê link nibeno.",
 'nolinkshere-ns' => "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
@@ -3090,7 +3092,7 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-authors' => 'Amarina nuştekaran pêro',
 'pageinfo-recent-edits' => 'Amariya vurnayışan ($1 ra nata)',
 'pageinfo-recent-authors' => 'Amarina nuştekaran pêro',
-'pageinfo-restriction' => 'Xısusiyetê pela (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Xısusiyetê pela ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
 'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
@@ -3817,7 +3819,7 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
 # Multipage image navigation
 'imgmultipageprev' => '← peleyê verin',
 'imgmultipagenext' => 'pela badê cû →',
-'imgmultigo' => 'Şı!',
+'imgmultigo' => 'Şo!',
 'imgmultigoto' => 'Şo pela da $1',
 
 # Table pager
index 1caeafa..7fa2743 100644 (file)
@@ -1051,7 +1051,9 @@ Pšosym pśeglědaj protokole.',
 'revdelete-only-restricted' => 'Zmólka pśi chowanju zapiska wót $2, $1; njamóžoš zapiski pśed wócami administratorow  pódtłocyś, mimo až teke wuběraš jadnu z drugich wiźobnosćowych opcijow.',
 'revdelete-reason-dropdown' => '*Zwucone pśicyny za wulašowanje
 ** Pśestupjenje awtorskego pšawa
-** Njegóźece se wósobinske informacije',
+** Njegóźece se komentary abo wósobinske informacije
+** Njegóźece se wužywarske mě
+** Potencielnje kśiwźece informacije',
 'revdelete-otherreason' => 'Druga/pśidatna pśicyna:',
 'revdelete-reasonotherlist' => 'Druga pśicyna',
 'revdelete-edit-reasonlist' => 'Pśicyny za lašowanje wobźěłaś',
@@ -2874,7 +2876,7 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-authors' => 'Cełkowna licba wšakich awtorow',
 'pageinfo-recent-edits' => 'Licba nejnowšych změnow (za zachadnych $1)',
 'pageinfo-recent-authors' => 'Nejnowša licba rozdźělnych awtorow',
-'pageinfo-restriction' => 'Šćit boka (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Šćit boka ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Zapśěgnjona pśedłoga|Zapśěgnjonej pśedłoze|Zapśěgnjone pśedłogi|Zapśěgnjone pśedłogi}} ($1)',
index 385ae47..d51332b 100644 (file)
@@ -616,6 +616,10 @@ $1',
 'youhavenewmessages' => 'Έχετε $1 ($2).',
 'newmessageslink' => 'νέα μηνύματα',
 'newmessagesdifflink' => 'τελευταία αλλαγή',
+'youhavenewmessagesfromusers' => 'Έχετε $1 από {{PLURAL:$3|ένα άλλο χρήστη|$3 χρήστες}} ($2).',
+'youhavenewmessagesmanyusers' => 'Έχετε $1 από πολλούς χρήστες ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ένα νέο μήνυμα|νέα μηνύματα}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|τελευταία αλλαγή|τελευταίες αλλαγές}}',
 'youhavenewmessagesmulti' => 'Έχετε νέα μηνύματα στο $1',
 'editsection' => 'επεξεργασία',
 'editold' => 'επεξεργασία',
@@ -736,6 +740,8 @@ $2',
 'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου " $1 " επειδή το αποθετήριο αρχείων " $2 " είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
 
 Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: " $3 ".',
+'exception-nologin' => 'Δεν έχετε συνδεθεί.',
+'exception-nologin-text' => 'Αυτή η σελίδα ή η ενέργεια απαιτεί να είστε {{GENDER:|συνδεμένος|συνδεμένη}} στο wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
@@ -2239,6 +2245,8 @@ $1',
 μια έγκυρη ηλεκτρονική διεύθυνση στις [[Special:Preferences|Προτιμήσεις]]
 για να στείλετε e-mail σε άλλους χρήστες.',
 'emailuser' => 'Στείλτε μήνυμα σε αυτό τον χρήστη',
+'emailuser-title-target' => 'Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη',
+'emailuser-title-notarget' => 'Αποστολή e-mail σε χρήστη',
 'emailpage' => 'Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείο στο χρήστη',
 'emailpagetext' => 'Συπληρώνοντας την παρακάτω φόρμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου στις [[Special:Preferences|προτιμήσεις χρήστη]]. Αυτή θα εμφανιστεί ως διεύθυνση αποστολέα του μηνύματος, ούτως ώστε ο παραλήπτης να μπορέσει να σας απαντήσει.',
 'usermailererror' => 'Σφάλμα ηλεκτρονικού ταχυδρομείου:',
@@ -2386,6 +2394,8 @@ $UNWATCHURL
 'rollback' => 'Επαναφορά επεξεργασιών',
 'rollback_short' => 'Επαναφορά',
 'rollbacklink' => 'Επαναφορά στην προηγούμενη',
+'rollbacklinkcount' => 'Επαναφορά $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}',
+'rollbacklinkcount-morethan' => 'επαναφορά περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}',
 'rollbackfailed' => 'Η επαναφορά απέτυχε.',
 'cantrollback' => 'Δεν είναι δυνατή η αναίρεση αυτής της αλλαγής, πρόκειται για την αρχική ενέργεια δημιουργίας της σελίδας.',
 'alreadyrolled' => 'Αδύνατον να αναιρεθεί η τελευταία αλλαγή της σελίδας [[:$1]] από το χρήστη ([[User:$2|$2]] ([[User talk:$2|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), διότι κάποιος έχει ήδη αναιρέσει την αλλαγή ή έχει αλλάξει εκ νέου τη σελίδα.
@@ -3044,7 +3054,14 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Πληροφορίες για "$1"',
-'pageinfo-header-edits' => 'Επεξεργασίες',
+'pageinfo-header-basic' => 'Βασικές πληροφορίες',
+'pageinfo-header-edits' => 'Ιστορικό επεξεργασίας',
+'pageinfo-header-restrictions' => 'Προστασία σελίδας',
+'pageinfo-header-properties' => 'Ιδιότητες σελίδας',
+'pageinfo-display-title' => 'Εμφάνιση τίτλου',
+'pageinfo-default-sort' => 'Προεπιλεγμένο κλειδί ταξινόμησης',
+'pageinfo-length' => 'Μήκος σελίδας (σε bytes)',
+'pageinfo-article-id' => 'Αναγνωριστικό σελίδας',
 'pageinfo-views' => 'Αριθμός προβολών',
 'pageinfo-watchers' => 'Αριθμός παρατηρητών',
 'pageinfo-edits' => 'Αριθμός επεξεργασιών',
index 515a433..fc8b319 100644 (file)
@@ -1647,7 +1647,8 @@ Please check the logs.',
 'revdelete-only-restricted'   => 'Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.',
 'revdelete-reason-dropdown'   => '*Common delete reasons
 ** Copyright violation
-** Inappropriate personal information
+** Inappropriate comment or personal information
+** Inappropriate username
 ** Potentially libelous information',
 'revdelete-otherreason'       => 'Other/additional reason:',
 'revdelete-reasonotherlist'   => 'Other reason',
@@ -3762,7 +3763,7 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-authors'             => 'Total number of distinct authors',
 'pageinfo-recent-edits'        => 'Recent number of edits (within past $1)',
 'pageinfo-recent-authors'      => 'Recent number of distinct authors',
-'pageinfo-restriction'         => 'Page protection (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction'         => 'Page protection ({{lcfirst:$1}})',
 'pageinfo-magic-words'         => 'Magic {{PLURAL:$1|word|words}} ($1)',
 'pageinfo-hidden-categories'   => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
 'pageinfo-templates'           => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
index f838269..b01b0d9 100644 (file)
@@ -3096,6 +3096,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-title' => 'Informoj por "$1"',
 'pageinfo-header-basic' => 'Baza informo',
 'pageinfo-header-edits' => 'Historio de redaktoj',
+'pageinfo-article-id' => 'Paĝa identigo',
 'pageinfo-robot-index' => 'Indeksebla',
 'pageinfo-robot-noindex' => 'Ne indeksebla',
 'pageinfo-views' => 'Nombro de rigardoj',
index c36b38e..bd7ae6c 100644 (file)
@@ -1288,7 +1288,8 @@ No tiene acceso a él.',
 'revdelete-only-restricted' => 'Error ocultando el item de fecha $2, $1: no puedes suprimir elementos de vista de los administradores sin seleccionar asímismo una de las otras opciones de visibilidad.',
 'revdelete-reason-dropdown' => '*Razones de borrado comunes
 ** Violación a los derechos de autor
-** Información personal inapropiada
+** Comentario o información personal inapropiados
+** Nombre de usuario inapropiado
 ** Información potencialmente injuriosa o calumniante',
 'revdelete-otherreason' => 'Otra/adicional razón:',
 'revdelete-reasonotherlist' => 'Otra razón',
@@ -3175,7 +3176,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-authors' => 'Número total de autores distintos',
 'pageinfo-recent-edits' => 'Número de ediciones recientes (en los últimos $1)',
 'pageinfo-recent-authors' => 'Número de autores distintos recientes',
-'pageinfo-restriction' => 'Protección de la página (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protección de la página ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|plantilla incluida|plantillas incluidas}} ($1)',
index 276121a..af1d974 100644 (file)
@@ -721,7 +721,7 @@ Sinu konto on loodud.
 'gotaccount' => "Kui sul on juba konto, '''$1'''.",
 'gotaccountlink' => 'logi sisse',
 'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
-'createaccountmail' => 'e-posti teel',
+'createaccountmail' => 'E-posti teel',
 'createaccountreason' => 'Põhjus:',
 'badretype' => 'Sisestatud paroolid ei lange kokku.',
 'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
@@ -1194,9 +1194,11 @@ Sul ei ole sellele ligipääsu.',
 'revdelete-concurrent-change' => 'Tõrge üksuse kuupäevaga $2, kell $1 muutmisel: paistab, et keegi teine on selle olekut sel ajal muutnud, kui sina seda muuta üritasid.
 Palun vaata logisid.',
 'revdelete-only-restricted' => 'Ei õnnestu varjata üksust seisuga $1, kell $2: Seda üksust ei saa administraatorite eest varjata, valimata seejuures ka ühte muudest nähtavussuvanditest.',
-'revdelete-reason-dropdown' => '*Tavalised kustutamise põhjused
+'revdelete-reason-dropdown' => '*Peamised kustutamise põhjused
 ** Autoriõiguste rikkumine
-** Kohatud eraelulised andmed',
+** Kohatu märkus või isiklik info
+** Kohatu kasutajanimi
+** Potentsiaalne halvustav informatsioon',
 'revdelete-otherreason' => 'Muu või täiendav põhjus:',
 'revdelete-reasonotherlist' => 'Muu põhjus',
 'revdelete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
@@ -3047,7 +3049,7 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-authors' => 'Erinevate autorite koguarv',
 'pageinfo-recent-edits' => 'Viimaste redigeerimiste arv (viimase $1 jooksul)',
 'pageinfo-recent-authors' => 'Erinevate viimaste toimetajate arv',
-'pageinfo-restriction' => 'Lehekülje kaitse (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Lehekülje kaitse ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Võlusõna|Võlusõnad}} ($1)',
 'pageinfo-hidden-categories' => 'Peidetud {{PLURAL:$1|kategooria|kategooriad}} ($1)',
 'pageinfo-templates' => 'Kasutatud {{PLURAL:$1|mall|mallid}} ($1)',
index 6cf366f..1bd57fe 100644 (file)
@@ -432,37 +432,37 @@ $imageFiles = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'زÛ\8cر Ù¾Û\8cÙ\88Ù\86دÙ\87ا Ø®Ø· Ú©Ø´Û\8cدÙ\87 Ø´Ù\88د',
+'tog-underline' => 'خط Ú©Ø´Û\8cدÙ\86 Ø²Û\8cر Ù¾Û\8cÙ\88Ù\86دÙ\87ا:',
 'tog-justify' => 'بندها تمام‌چین نمایش یابند',
 'tog-hideminor' => 'تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند',
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های نهگبانی‌شده از فهرست صفحه‌های تازه پنهان شوند',
 'tog-extendwatchlist' => 'گسترش فهرست پی‌گیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها',
-'tog-usenewrc' => 'گروه تغییرات بر پایه صفحه در تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
+'tog-usenewrc' => 'گروه‌بندی تغییرات بر پایه صفحه در تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
 'tog-numberheadings' => 'شماره‌گذاری خودکار عنوان‌ها',
 'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد (نیازمند جاوااسکریپت)',
 'tog-editondblclick' => 'ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
 'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
-'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش‌ها فعال باشد (نیازمند جاوااسکریپت)',
+'tog-editsectiononrightclick' => 'امکان ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش (نیازمند جاوااسکریپت)',
 'tog-showtoc' => 'فهرست مندرجات نمایش یابد (برای صفحه‌های دارای بیش از ۳ عنوان)',
-'tog-rememberpassword' => 'گذرواژهٔ من (حداکثر $1 روز) در این مرورگر به خاطر سپرده شود',
-'tog-watchcreations' => 'صفحه‌هایی که می‌سازم و پرونده‌هایی را که بارگذاری می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchdefault' => 'صفحه‌ها و پرونده‌هایی را که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchmoves' => 'صفحه‌ها و پرونده‌هایی را که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchdeletion' => 'صفحه‌ها و پرونده‌هایی را که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-rememberpassword' => 'گذرواژهٔ من (حداکثر $1 {{PLURAL:$1|روز|روز}}) در این مرورگر به خاطر سپرده شود',
+'tog-watchcreations' => 'صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchdefault' => 'صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchmoves' => 'صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchdeletion' => 'صفحه‌ها و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-minordefault' => 'همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد',
 'tog-previewontop' => 'پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد',
 'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش نمایش یابد',
 'tog-nocache' => 'حافظهٔ نهانی مرورگر از کار انداخته شود',
-'tog-enotifwatchlistpages' => 'اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد برای من نامه‌ای فرستاده شود',
-'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من رایانامه فرستاده شود',
+'tog-enotifwatchlistpages' => 'اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من نامه‌ای فرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود',
 'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من نامه‌ای فرستاده شود',
 'tog-enotifrevealaddr' => 'نشانی رایانامهٔ من در رایانامه‌های اطلاع‌رسانی نمایش یابد',
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
-'tog-externaleditor' => 'استفاده از ویرایشگر خارجی به‌طور پیش‌فرض (فقط برای کاربران پیشرفته. نیازمند تنظیمات ویژه در رایانهٔ‌تان است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-externaldiff' => 'استفاده از تفاوت‌گیر (diff) خارجی به‌طور پیش‌فرض (فقط برای کاربران پیشرفته. نیازمند تنظیمات ویژه در رایانهٔ‌تان است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
+'tog-externaleditor' => 'استفاده از ویرایشگر خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
+'tog-externaldiff' => 'استفاده از تفاوت‌گیر (diff) خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
 'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» فعال باشد',
 'tog-uselivepreview' => 'استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
 'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
@@ -576,7 +576,7 @@ $messages = array(
 'qbbrowse' => 'مرور',
 'qbedit' => 'ویرایش',
 'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'بافت',
+'qbpageinfo' => 'محتوا',
 'qbmyoptions' => 'صفحه‌های من',
 'qbspecialpages' => 'صفحه‌های ویژه',
 'faq' => 'پرسش‌های متداول',
@@ -757,27 +757,27 @@ $1',
 'dberrortext' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
 دلیل این مشکل می‌تواند ایرادی در نرم‌افزار باشد.
 آخرین درخواست که برای پایگاه داده فرستاد شد این بود:
-<blockquote style="direction:ltr;"><code>$1</code></blockquote>
-این درخواست از درون عملگر «<span class="ltr"><code>$2</code></span>» فرستاده شد.
+<blockquote class="mw-content-ltr"><code>$1</code></blockquote>
+این درخواست از درون عملگر «<span class="mw-content-ltr"><code>$2</code></span>» فرستاده شد.
 پایگاه داده این خطا را بازگرداند:
-<div class="ltr"><samp>$3: $4</samp></div>',
+<div class="mw-content-ltr"><samp>$3: $4</samp></div>',
 'dberrortextcl' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
 آخرین درخواستی که برای پایگاه داده فرستاد شد این بود:
-<div class="ltr">$1</div>
-این درخواست از درون عملگر «<span class="ltr">$2</span>» فرستاده شد.
+<div class="mw-content-ltr">$1</div>
+این درخواست از درون عملگر «<span class="mw-content-ltr">$2</span>» فرستاده شد.
 پایگاه داده این خطا را بازگرداند:
-<div class="ltr">$3: $4</div>',
-'laggedslavemode' => "'''Ù\87شدار:''' ØµÙ\81Ø­Ù\87 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø´Ø§Ù\85Ù\84 Ø¨Ù\87â\80\8cرÙ\88زرساÙ\86Û\8câ\80\8cÙ\87اÛ\8c Ø§Ø®Û\8cر Ø±Ø§ نشود.",
+<div class="mw-content-ltr">$3: $4</div>',
+'laggedslavemode' => "'''Ù\87شدار:''' ØµÙ\81Ø­Ù\87 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø¨Ù\87â\80\8cرÙ\88زرساÙ\86Û\8câ\80\8cÙ\87اÛ\8c Ø§Ø®Û\8cر Ø±Ø§ Ø´Ø§Ù\85Ù\84 نشود.",
 'readonly' => 'پایگاه داده قفل شد',
 'enterlockreason' => 'دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد',
-'readonlytext' => 'پاÛ\8cگاÙ\87 Ø¯Ø§Ø¯Ù\87 Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± ØªØºÛ\8cÛ\8cرات Ù\88 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\82Ù\81Ù\84 Ø´Ø¯Ù\87â\80\8cاستØ\8c احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.
+'readonlytext' => 'پاÛ\8cگاÙ\87 Ø¯Ø§Ø¯Ù\87 Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± ØªØºÛ\8cÛ\8cرات Ù\88 Ø§Û\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\82Ù\81Ù\84 Ø´Ø¯Ù\87â\80\8cاستØ\9b Ø§Û\8cÙ\86 Ù\88ضعÛ\8cت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.
 
 مدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1',
 'missing-article' => 'پایگاه داده متن صفحهٔ با نام «$1» $2 را که باید پیدا می‌کرد نیافت.
 
 این مشکل معمولاً به علت دنبال‌کردن یک پیوند تفاوت تاریخ‌گذشته یا تاریخچهٔ صفحه‌ای که حذف شده‌است، رخ می‌دهد.
 
-در غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشید.
+در غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشد.
 لطفاً این مشکل را با ذکر نشانی اینترنتی به یکی از [[Special:ListUsers/sysop|مدیران]] گزارش دهید.',
 'missingarticle-rev' => '(شمارهٔ نسخه: $1)',
 'missingarticle-diff' => '(تفاوت: $1، $2)',
@@ -798,7 +798,7 @@ $1',
 'cannotdelete' => 'امکان حذف صفحه یا تصویر «$1» وجود ندارد.
 ممکن است قبلاً فرد دیگری آن را حذف کرده باشد.',
 'cannotdelete-title' => 'نمی‌توان صفحهٔ «$1» را حذف کرد',
-'delete-hook-aborted' => 'ویرایش توسط قلاب لغو شد.
+'delete-hook-aborted' => 'حذف توسط قلاب لغو شد.
 توضیحی در این مورد داده نشد.',
 'badtitle' => 'عنوان بد',
 'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.
@@ -811,15 +811,15 @@ $1',
 تابع: $1<br />
 پرس‌وجو: $2',
 'viewsource' => 'نمایش مبدأ',
-'viewsource-title' => 'Ù\85شاÙ\87دÙ\87Ù\94 Ù\85Ù\86بع برای $1',
+'viewsource-title' => 'Ù\86Ù\85اÛ\8cØ´ Ù\85بدأ برای $1',
 'actionthrottled' => 'جلوی عمل شما گرفته شد',
 'actionthrottledtext' => 'به منظور جلوگیری از انتشار اسپم، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.
 لطفاً پس از چند دقیقه دوباره تلاش کنید.',
-'protectedpagetext' => 'اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø¨Ø±Ø§Û\8c Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ù\88Û\8cراÛ\8cØ´ Ù\82Ù\81Ù\84 شده‌است.',
+'protectedpagetext' => 'اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø¨Ø±Ø§Û\8c Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ù\88Û\8cراÛ\8cØ´ Ù\85حاÙ\81ظت شده‌است.',
 'viewsourcetext' => 'می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:',
 'viewyourtext' => "می‌توانید کد مبدأ '''ویرایش‌هایتان''' در این صفحه را ببینید و کپی کنید:",
-'protectedinterface' => 'اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø§Ø±Ø§Ø¦Ù\87â\80\8cدÙ\87Ù\86دÙ\87Ù\94 Ù\85تÙ\86Û\8c Ø¨Ø±Ø§Û\8c Ù\88اسط Ú©Ø§Ø±Ø¨Ø± Ø§Û\8cÙ\86 Ù\86رÙ\85â\80\8cاÙ\81زار Ø§Ø³Øª Ù\88 Ø¨Ù\87 Ù\85Ù\86ظÙ\88ر Ù¾Û\8cØ´Ú¯Û\8cرÛ\8c Ø§Ø² Ø®Ø±Ø§Ø¨Ú©Ø§Ø±Û\8c Ù\82Ù\81Ù\84 شده‌است.',
-'editinginterface' => "'''هشدار:''' صفحه‌ای را که ویرایش می‌کنید شامل متنیاست که در واسط کاربر این نرم‌افزار به کار رفته‌است.
+'protectedinterface' => 'اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø§Ø±Ø§Ø¦Ù\87â\80\8cدÙ\87Ù\86دÙ\87Ù\94 Ù\85تÙ\86Û\8c Ø¨Ø±Ø§Û\8c Ù\88اسط Ú©Ø§Ø±Ø¨Ø± Ø§Û\8cÙ\86 Ù\86رÙ\85â\80\8cاÙ\81زار Ø§Ø³Øª Ù\88 Ø¨Ù\87 Ù\85Ù\86ظÙ\88ر Ù¾Û\8cØ´Ú¯Û\8cرÛ\8c Ø§Ø² Ø®Ø±Ø§Ø¨Ú©Ø§Ø±Û\8c Ù\85حاÙ\81ظت شده‌است.',
+'editinginterface' => "'''هشدار:''' صفحه‌ای را که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
 تغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.
 برای ترجمه لطفاً از [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] (پروژهٔ ترجمهٔ مدیاویکی) استفاده کنید.",
 'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
@@ -831,13 +831,13 @@ $2',
 'ns-specialprotected' => 'صفحه‌های ویژه غیر قابل ویرایش هستند.',
 'titleprotected' => "این عنوان توسط [[User:$1|$1]] در برابر ایجاد محافظت شده‌است.
 دلیل ارائه‌شده این است: «''$2''».",
-'filereadonlyerror' => "تغییر پرونده «$1» ممکن نیست چون مخزن پرونده «$2» در حالت فقط خواندنی قرار دارد.
+'filereadonlyerror' => 'تغییر پرونده «$1» ممکن نیست چون مخزن پرونده «$2» در حالت فقط خواندنی قرار دارد.
 
-مدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  ''$3''.",
+مدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  «$3».',
 'invalidtitle-knownnamespace' => 'عنوان نامعتبر با فضای نام «$2» و متن «$3»',
 'invalidtitle-unknownnamespace' => 'عنوان نامعتبر با فضای نام ناشناختهٔ شمارهٔ $1 و متن «$2»',
 'exception-nologin' => 'به سامانه وارد نشده‌اید',
-'exception-nologin-text' => 'در Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c Ø§Ù\86جاÙ\85 Ø§Û\8cÙ\86 Ø¹Ù\85Ù\84 نیازمند وارد شدن به سیستم  است.',
+'exception-nologin-text' => 'دسترسÛ\8c Ø¨Ù\87 Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Û\8cا Ø§Ù\86جاÙ\85 Ø§Û\8cÙ\86 Ø¹Ù\85Ù\84 Ø¯Ø± Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c نیازمند وارد شدن به سیستم  است.',
 
 # Virus scanner
 'virus-badscanner' => "پیکربندی بد: پویشگر ویروس ناشناخته: ''$1''",
@@ -1382,7 +1382,8 @@ $1",
 'revdelete-only-restricted' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: شما نمی‌توانید موارد را از دید مدیران پنهان کنید مگر آن که یکی دیگر از گزینه‌های پنهان‌سازی را نیز انتخاب کنید.',
 'revdelete-reason-dropdown' => '*دلایل متداول حذف
 ** نقض حق تکثیر
-** اطلاعات فردی نامناسب
+** اظهار نظر یا اطلاعات فردی نامناسب
+** نام کاربری نامناسب
 ** اطلاعات به طور بالقوه افتراآمیز',
 'revdelete-otherreason' => 'دلیل دیگر/اضافی:',
 'revdelete-reasonotherlist' => 'دلیل دیگر',
@@ -3266,7 +3267,7 @@ $1',
 'pageinfo-authors' => 'تعداد کلی نویسندگان یکتا',
 'pageinfo-recent-edits' => 'شماره ویرایش‌های اخیر (در $1 گذشته)',
 'pageinfo-recent-authors' => 'تعداد نویسندگان یکتای اخیر',
-'pageinfo-restriction' => 'محافظت صفحه ( <code>{{lcfirst:$1}}</code> )',
+'pageinfo-restriction' => 'محافظت صفحه ( {{lcfirst:$1}} )',
 'pageinfo-magic-words' => '{{PLURAL:$1|حرف|حروف}} جادویی ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
 'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)',
index 68e4cfa..b9d63d7 100644 (file)
@@ -969,7 +969,6 @@ Alla on viimeisin estolokin tapahtuma:',
 * '''Firefox ja Safari:''' Napsauta ''Shift''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5'' tai ''Ctrl-R'' (''⌘-R'' Macilla)
 * '''Google Chrome:''' Paina ''Ctrl-Shift-R'' (''⌘-Shift-R'' Macilla)
 * '''Internet Explorer:''' Napsauta ''Ctrl''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5''
-* '''Konqueror''': Napsauta ''Päivitä'' tai paina ''F5''
 * '''Opera:''' Tyhjennä välimuisti: ''Tools→Preferences''",
 'usercssyoucanpreview' => 'Voit testata uutta CSS:ää ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.',
 'userjsyoucanpreview' => 'Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.',
@@ -1119,7 +1118,7 @@ Kokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.',
 'rev-deleted-comment' => '(muokkausyhteenveto poistettu)',
 'rev-deleted-user' => '(käyttäjänimi poistettu)',
 'rev-deleted-event' => '(lokitapahtuma poistettu)',
-'rev-deleted-user-contribs' => '[käyttäjänimi tai IP-osoite poistettu – muokkaus piilotettu muokkauksista]',
+'rev-deleted-user-contribs' => '[käyttäjänimi tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]',
 'rev-deleted-text-permission' => "Tämä versio sivusta on '''poistettu'''.
 Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
 'rev-deleted-text-unhide' => "Tämä versio sivusta on '''poistettu'''.
@@ -2044,6 +2043,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|tavu|tavua}}',
 'ncategories' => '$1 {{PLURAL:$1|luokka|luokkaa}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki-linkki|interwiki-linkkiä}}',
 'nlinks' => '$1 {{PLURAL:$1|linkki|linkkiä}}',
 'nmembers' => '$1 {{PLURAL:$1|jäsen|jäsentä}}',
 'nrevisions' => '$1 {{PLURAL:$1|muutos|muutosta}}',
@@ -2072,6 +2072,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'mostlinkedtemplates' => 'Viitatuimmat mallineet',
 'mostcategories' => 'Luokitelluimmat sivut',
 'mostimages' => 'Viitatuimmat tiedostot',
+'mostinterwikis' => 'Sivut joilla on eniten kielilinkkejä',
 'mostrevisions' => 'Muokatuimmat sivut',
 'prefixindex' => 'Kaikki sivut katkaisuhaulla',
 'prefixindex-namespace' => 'Kaikki sivut etuliitteellä (nimiavaruus $1)',
@@ -2218,6 +2219,8 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'mailnologin' => 'Lähettäjän osoite puuttuu',
 'mailnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
 'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
+'emailuser-title-target' => 'Lähetä sähköpostia tälle {{GENDER:$1|käyttäjälle}}',
+'emailuser-title-notarget' => 'Lähetä sähköpostia käyttäjälle',
 'emailpage' => 'Lähetä sähköpostia käyttäjälle',
 'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
 'usermailererror' => 'Postitus palautti virheen:',
@@ -3007,11 +3010,18 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Info page
 'pageinfo-title' => 'Tietoja sivusta $1',
-'pageinfo-header-edits' => 'Muokkaukset',
+'pageinfo-header-basic' => 'Perustiedot',
+'pageinfo-header-edits' => 'Muokkaushistoria',
+'pageinfo-header-restrictions' => 'Sivun suojaus',
+'pageinfo-header-properties' => 'Sivun ominaisuudet',
 'pageinfo-views' => 'Katselukertojen määrä',
-'pageinfo-watchers' => 'Tarkkailijoiden lukumäärä',
-'pageinfo-edits' => 'Muokkausten lukumäärä',
-'pageinfo-authors' => 'Eri tekijöiden lukumäärä',
+'pageinfo-watchers' => 'Sivun tarkkailijoiden lukumäärä',
+'pageinfo-redirects-name' => 'Sivulle johtavat ohjaukset',
+'pageinfo-subpages-name' => 'Sivun alasivut',
+'pageinfo-firstuser' => 'Sivun luoja',
+'pageinfo-lastuser' => 'Viimeisin muokkaaja',
+'pageinfo-edits' => 'Muokkausten kokonaismäärä',
+'pageinfo-authors' => 'Sivun eri muokkaajien kokonaismäärä',
 
 # Skin names
 'skinname-standard' => 'Perus',
index 5b1f34a..59df7ce 100644 (file)
@@ -1284,7 +1284,7 @@ Vérifiez les journaux.',
 'revdelete-only-restricted' => 'Erreur lors de la suppression de l’entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs sans également sélectionner des autres options de suppression.',
 'revdelete-reason-dropdown' => '* Raisons courantes de suppression :
 ** Violation des droits d’auteurs ;
-** Renseignements personnels inappropriés ;
+** Commentaires ou renseignements personnels inappropriés ;
 ** Informations potentiellement diffamatoires.',
 'revdelete-otherreason' => 'Autre raison / raison supplémentaire :',
 'revdelete-reasonotherlist' => 'Autre raison',
@@ -3181,7 +3181,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'pageinfo-authors' => "Nombre total d'auteurs distincts",
 'pageinfo-recent-edits' => 'Nombre de modifications récentes (dans les derniers $1)',
 'pageinfo-recent-authors' => "Nombre d'auteurs distincts récents",
-'pageinfo-restriction' => 'Protection de la page (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protection de la page ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
@@ -4088,8 +4088,8 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
 'logentry-move-move_redir' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection',
 'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
-'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme contrôlée',
-'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme contrôlée',
+'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme relue',
+'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme relue',
 'logentry-newusers-newusers' => '$1 a créé un compte utilisateur',
 'logentry-newusers-create' => '$1 a créé son compte utilisateur',
 'logentry-newusers-create2' => '$1 a créé un compte utilisateur $3',
index 83428da..1c1bc9a 100644 (file)
@@ -1168,8 +1168,10 @@ Non ten acceso a el.',
 Por favor, comprobe os rexistros.',
 'revdelete-only-restricted' => 'Erro ao agochar o elemento con data do $1 ás $2: Non pode eliminar elementos da vista dos administradores sen tamén seleccionar algunha das outras opcións de visibilidade.',
 'revdelete-reason-dropdown' => '* Motivos frecuentes para borrar
-** Violación dos dereitos de autor
-** Información persoal inapropiada',
+** Violación dos dereitos de autoría
+** Comentario inapropiado ou información persoal
+** Nome de usuario inapropiado
+** Información potencialmente difamatoria',
 'revdelete-otherreason' => 'Outro motivo:',
 'revdelete-reasonotherlist' => 'Outro motivo',
 'revdelete-edit-reasonlist' => 'Editar os motivos de borrado',
@@ -1686,7 +1688,7 @@ Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
 Isto pode deberse a un erro ortográfico no seu nome.
 Por favor, verifique se realmente quere cargar este ficheiro.',
 'windows-nonascii-filename' => 'Este wiki non soporta os nomes de ficheiros con caracteres especiais.',
-'fileexists' => 'Xa existe un ficheiro con ese nome. Por favor, comprobe <strong>[[:$1]]</strong> se non está seguro de querer cambialo.
+'fileexists' => 'Xa existe un ficheiro con ese nome. Por favor, comprobe "<strong>[[:$1]]</strong>" se non está seguro de querer cambialo.
 [[$1|thumb]]',
 'filepageexists' => 'A páxina de descrición deste ficheiro xa foi creada en <strong>[[:$1]]</strong>, pero polo de agora non existe ningún ficheiro con este nome.
 O resumo que escribiu non aparecerá na páxina de descrición.
@@ -3073,7 +3075,7 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-authors' => 'Número total de autores distintos',
 'pageinfo-recent-edits' => 'Número de edicións recentes (durante os últimos $1)',
 'pageinfo-recent-authors' => 'Número de autores distintos recentes',
-'pageinfo-restriction' => 'Protección da páxina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protección da páxina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Palabra máxica|Palabras máxicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría agochada|Categorías agochadas}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modelo incluído|Modelos incluídos}} ($1)',
index 271cb56..d1a0703 100644 (file)
@@ -140,7 +140,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Vum Fäldhieter aagluegti Änderige in dr „Letschte Änderige“ usblände',
 'tog-newpageshidepatrolled' => 'Aagluegti Syten uf dr Lischt „Neiji Syte“ verstecke',
 'tog-extendwatchlist' => 'Beobachtungslischte erwytere go alli Änderige aazeige, nit numme di letschte',
-'tog-usenewrc' => 'Erwytereti «letschti Änderige» (brucht JavaScript)',
+'tog-usenewrc' => 'Sytebezogeni Gruppierig bi dr «letschte Änderige» un uf dr Beobachtigslischte  (brucht JavaScript)',
 'tog-numberheadings' => 'Überschrifte outomatisch numeriere',
 'tog-showtoolbar' => 'Editier-Wärchzüüg aazeige',
 'tog-editondblclick' => 'Syte ändere mit Doppelklick i d Syte (JavaScript)',
@@ -148,17 +148,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Einzelni Absätz ändere mit Rächtsclick (Javascript)',
 'tog-showtoc' => 'Inhaltsverzeichnis aazeige bi Artikle mit meh als drei Überschrifte',
 'tog-rememberpassword' => 'Mit däm Browser duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
-'tog-watchcreations' => 'Sälber gmachti Sytene beobachte',
-'tog-watchdefault' => 'Vo dir nöi gmachti oder verändereti Syte beobachte',
-'tog-watchmoves' => 'Sälber verschobeni Sytene beobachte',
-'tog-watchdeletion' => 'Sälber glöschti Sytene beobachte',
+'tog-watchcreations' => 'Sälber gmachti Sytene un uffegladeni Dateie automatisch  beobachte',
+'tog-watchdefault' => 'Sälber gändereti Syte un Dateie automatisch beobachte',
+'tog-watchmoves' => 'Sälber verschobeni Sytene un Dateie automatisch beobachte',
+'tog-watchdeletion' => 'Sälber gleschti Sytene un Dateie automatisch beobachte',
 'tog-minordefault' => 'Alli dyni Änderigen als «chlyni Änderige» markiere',
 'tog-previewontop' => 'Vorschou vor em Editierfänschter aazeige',
 'tog-previewonfirst' => 'Vorschou aazeige bim erschten Editiere',
 'tog-nocache' => 'Syte-Cache vum Browser deaktiviere',
-'tog-enotifwatchlistpages' => 'Benachrichtigungsmails by Änderigen a Wiki-Syte',
+'tog-enotifwatchlistpages' => 'Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due',
 'tog-enotifusertalkpages' => 'Benachrichtigungsmails bi Änderigen a dyne Benutzersyte',
-'tog-enotifminoredits' => 'Benachrichtigungsmail ou bi chlyne Sytenänderige',
+'tog-enotifminoredits' => 'Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke',
 'tog-enotifrevealaddr' => 'Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt',
 'tog-shownumberswatching' => 'Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)',
 'tog-oldsig' => 'Vorschau vu dr Unterschrift:',
@@ -452,9 +452,9 @@ Alli verfiegbare Spezialsyte sin in dr [[Special:SpecialPages|Lischt vu Spezials
 'dberrortext' => 'S isch e Datebankfähler ufträtte.
 Dr Grund cha ne e Programmierfähler syy.
 Di letscht Datebankabfrog isch
-<blockquote><tt>$1</tt></blockquote>
-us dr Funktion „<tt>$2</tt>“ gsi.
-D Datebank het dr Fähler „<tt>$3: $4</tt>“ gmäldet.',
+<blockquote><code>$1</code></blockquote>
+us dr Funktion „<code>$2</code>“ gsi.
+D Datebank het dr Fähler „<samp>$3: $4</samp>“ gmäldet.',
 'dberrortextcl' => 'S het e Syntaxfähler gee in dr Abfrog vu dr Datebank.
 Di letscht Datebankabfrog isch
 „$1“
@@ -543,7 +543,7 @@ Vergiss nid, dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] aazpasse.',
 'yourdomainname' => 'Dyyni Domäne',
 'externaldberror' => 'Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.',
 'login' => 'Aamälde',
-'nav-login-createaccount' => 'Aamälde / Konto aaleege',
+'nav-login-createaccount' => 'Aamälde / Konto aalege',
 'loginprompt' => '<small>Für di bir {{SITENAME}} aazmälde, muesch Cookies erloube!</small>',
 'userlogin' => 'Aamälde/Konto aalege',
 'userloginnocreate' => 'Aamälde',
@@ -783,12 +783,11 @@ oder <span class="plainlinks">in dr zuegherige [{{fullurl:{{#special:Log}}|page=
 'userpage-userdoesnotexist-view' => 'S Benutzerkonto „$1“ isch nit registriert.',
 'blocked-notice-logextract' => 'Dää Benutzer isch zur Zyt gsperrt.
 As Information chunnt do ne aktuälle Uuszug us em Benutzersperr-Logbuech:',
-'clearyourcache' => "'''Hinweis:''' Noch em Spycheremuesch no dr Browser-Zwischespycher lääre go d Änderige sää.
+'clearyourcache' => "'''Hiiwys:''' Noch em Spycheremuesch no dr Browser-Zwischespycher lääre go d Änderige sää.
 * '''Firefox/ Safari:''' ''Umschaltig'' drucken un glychzytig ''Aktualisiere'' aaklicken oder entwäder ''Strg+F5'' oder ''Strg+R'' (''Befehlstaste-R'' uf em Mac) drucke
 * '''Google Chrome:''' ''Umschaltig+Strg+R'' (''Befählstaschte-R'' uf em Mac) drucke
 * '''Internet Explorer:''' ''Strg+F5'' drucken oder ''Strg'' drucken un glychzytig ''Aktualisiere'' aaklicke
-* '''Opera:''' ''Extra → Internetspure lesche … → Individuäll Uuswahl → Dr komplett Cache lesche''
-* '''Konqueror:''' ''Aktualisiere'' aaklicken oder ''F5'' drucke",
+* '''Opera:''' ''Extra → Internetspure lesche … → Individuäll Uuswahl → Dr komplett Cache lesche''",
 'usercssyoucanpreview' => "'''Tipp:''' Nimm dr „{{int:showpreview}}”-Chnopf, zum Dyy nej CSS vor em Spichere z teschte.",
 'userjsyoucanpreview' => "'''Tipp:''' „Nimm dr {{int:showpreview}}”-Chnopf, zum Dyy nej JS vor em Spichere z teschte.",
 'usercsspreview' => "== Vorschau vu Dyynem Benutzer-CSS. ==
@@ -1363,7 +1362,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'right-ipblock-exempt' => 'Uusnahm vu IP-Sperrine, Autoblock und Rangesperre',
 'right-proxyunbannable' => 'Uusnahm vu automatische Proxysperrine',
 'right-unblockself' => 'Sich sälber entsperre',
-'right-protect' => 'Syteschutzstatus ändere',
+'right-protect' => 'Syteschutzstatus änderen un gschitzti Syte bearbeite',
 'right-editprotected' => 'Gschitzti Syte bearbeite (ohni Kaskadeschutz)',
 'right-editinterface' => 'Benutzerinterface bearbeite',
 'right-editusercssjs' => 'Bearbeite vu CSS- und JS-Dateie vu andere Benutzer',
@@ -1843,7 +1842,9 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
 
 'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
 'disambiguationspage' => 'Template:Begriffsklärig',
-'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.<br />E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.<br />Link us Namensryym wäre do nit ufglischtet.',
+'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.
+
+E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.',
 
 'doubleredirects' => 'Doppleti Wyterleitige (Redirects)',
 'doubleredirectstext' => 'Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.
@@ -2791,7 +2792,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 
 # Info page
 'pageinfo-title' => 'Informatione zue „$1“',
-'pageinfo-header-edits' => 'Bearbeitunge',
+'pageinfo-header-edits' => 'Bearbeitige',
 'pageinfo-views' => 'Aazahl Sytenufruef',
 'pageinfo-watchers' => 'Aazahl vu Beobachter',
 'pageinfo-edits' => 'Aazahl Bearbeitige',
@@ -3506,7 +3507,7 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 * <span class="mw-specialpagecached">Gecachti Spezialsyte (dr Inhalt ist villicht veraltet.)</span>',
 'specialpages-group-maintenance' => 'Wartigslischte',
 'specialpages-group-other' => 'Andri Spezialsyte',
-'specialpages-group-login' => 'Aamälde',
+'specialpages-group-login' => 'Aamälde/Konto aalege',
 'specialpages-group-changes' => 'D letschte Änderige un Logbüecher',
 'specialpages-group-media' => 'Medie',
 'specialpages-group-users' => 'Benutzer un Rächt',
index 2c878b1..9fc12fa 100644 (file)
@@ -1286,7 +1286,8 @@ $1",
 'revdelete-only-restricted' => 'שגיאה בהסתרת הפריט מתאריך $2, $1: אין באפשרותכם להסתיר פרטים מצפיית מפעילי מערכת בלי לבחור גם באחת מאפשרויות ההסתרה האחרות.',
 'revdelete-reason-dropdown' => '* סיבות מחיקה נפוצות
 ** הפרת זכויות יוצרים
-** חשיפת מידע אישי
+** תקציר עריכה או מידע אישי לא הולמים
+** שם משתמש לא הולם
 ** מידע שעלול להיות לשון הרע',
 'revdelete-otherreason' => 'סיבה אחרת/נוספת:',
 'revdelete-reasonotherlist' => 'סיבה אחרת',
@@ -3188,7 +3189,7 @@ $1',
 'pageinfo-authors' => 'המספר הכולל של כותבים שונים',
 'pageinfo-recent-edits' => 'מספר העריכות לאחרונה ($1)',
 'pageinfo-recent-authors' => 'מספר הכותבים הייחודיים לאחרונה',
-'pageinfo-restriction' => 'הגנה על הדף (<code>$1</code>)',
+'pageinfo-restriction' => 'הגנה על הדף ($1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|מילת קסם|מילות קסם}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
index 9da7764..e34ebfd 100644 (file)
@@ -24,7 +24,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Taguon ang mga nabantayan nga na islan na nga bag-o lang gin obra',
 'tog-newpageshidepatrolled' => 'Taguon ang mga nabantayan  nga pahina sa bag-ong lista sang mga pahina',
 'tog-extendwatchlist' => 'Palaparon ang watchlist para makita ang tanan nga mga na-islan, indi lang man sa pinaka bag-o',
-'tog-usenewrc' => 'Gamiton ang ginpanami nga bag-o lang gid nga na-islan (nagakilanlan JavaScript)',
+'tog-usenewrc' => 'Grupohon ang mga pagbag-o kada panid sa bag-o lang gid na ilisan kag sa ginabantayan (nagakilanlan sang JavaScript)',
 'tog-numberheadings' => 'Auto-numero heading',
 'tog-showtoolbar' => 'Ipakita ang edit toolbar (nagakilanlan JavaScript)',
 'tog-editondblclick' => 'Islan ang pahina kung i-doble klik mo (nagakilanlan JavaScript)',
@@ -32,17 +32,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)',
 'tog-showtoc' => 'Ipakita ang sinulatan sang nagabug-os (para sang mga panid nga may yara sang masobra sa 3 nga pangolohan)',
 'tog-rememberpassword' => 'Dumdumon ang akon password sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
-'tog-watchcreations' => 'Idugang ang mga panid nga akon pagahimoon sa akon ginabantayan',
-'tog-watchdefault' => 'Idugang ang mga panid nga akon gina-ilisan sa akon ginabantayan',
-'tog-watchmoves' => 'Idugang ang mga panid nga akon pagasaylohon sa akon ginabantayan',
-'tog-watchdeletion' => 'Idugang ang mga panid nga akon pagadulaon sa akon ginabantayan',
+'tog-watchcreations' => 'Magdugang sang mga panid nga akon buhaton kag mga hilera nga akon igapasaka sa akon mga ginabantayan',
+'tog-watchdefault' => 'Idugang ang mga panid kag hilera nga akon ginbag-o sa akon mga ginabantayan',
+'tog-watchmoves' => 'Idugang ang mga panid kag hilera nga akon ginsaylo sa akon mga ginabantayan',
+'tog-watchdeletion' => 'Idugang ang mga panid kag hilera nga akon dulaon sa akon mga ginabantayan',
 'tog-minordefault' => 'Markahan dayon ang tanan nga diyutay nga pag-ilis',
 'tog-previewontop' => 'Ipakita ang preview bag-o ang kahon sang pag-ilis',
 'tog-previewonfirst' => 'Ipakita ang preview sa pinaka-una nga pag-ilis',
 'tog-nocache' => 'Untaton ang kina-iya sang brawser nga magtago sang panid',
-'tog-enotifwatchlistpages' => 'Padal-i ako sang e-mail kon ang panid nga akon ginabantayan paga-ilisan',
+'tog-enotifwatchlistpages' => 'Padal-i ako sang e-mail kon ang panid kag hilera nga akon ginabantayan paga-ilisan',
 'tog-enotifusertalkpages' => 'Padal-i ako sang e-mail kon paga-ilisan ang akon panid sang pag-hisayranay',
-'tog-enotifminoredits' => 'Padal-i man ako sang e-mail kon may diyutay nga pag-ilis sa akon mga panid',
+'tog-enotifminoredits' => 'Padal-i man ako sang e-mail kon may diyutay nga pag-ilis sa akon mga panid kag hilera',
 'tog-enotifrevealaddr' => 'Ipakita ang akon e-mail adres sa mga e-mail nga nagapahibalo',
 'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
 'tog-oldsig' => 'Nagapabilin nga pirma:',
@@ -281,6 +281,10 @@ Lantawa ang [[Special:Version|panid sang mga bersiyon]].',
 'youhavenewmessages' => 'Ikaw may $1 ($2).',
 'newmessageslink' => 'mga bag-ong mensahe',
 'newmessagesdifflink' => 'nagligad nga ginbag-o',
+'youhavenewmessagesfromusers' => 'May yara ka sang $1 halin sa {{PLURAL:$3|lain nga manuggamit|$3 mga manuggamit}} ($2).',
+'youhavenewmessagesmanyusers' => 'May yara ka sang $1 halin sa madamo nga manuggamit ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|isa ka bag-o nga mensahe|bag-o nga mga mensahe}}',
+'newmessagesdifflinkplural' => 'pinaka-ulihi nga {{PLURAL:$1|pagbag-o|mga pagbag-o}}',
 'youhavenewmessagesmulti' => 'May mga bag-ong mensahe ka sa $1',
 'editsection' => 'ilisan',
 'editold' => 'ilisan',
@@ -333,11 +337,11 @@ May lista sang mga nagaka-igo nga mga espesyal nga mga panid sa [[Special:Specia
 'error' => 'Sala/Eror',
 'databaseerror' => 'May sala sa database',
 'dberrortext' => 'May sala sa syntax sang pagpangita sa database.
-Ini nagakahulogan nga basi may sapat-sapat sa software.
-Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
-<blockquote><tt>$1</tt></blockquote>
-nga halin sa buluhaton nga "<tt>$2</tt>".
-Ang database nagbalik sang sala/eror nga "<tt>$3: $4</tt>".',
+Ini nagakahulogan nga basi may sapat-sapat/bug sa software.
+Ang pinaka-ulihe nga pagtilaw sa pagpangita sa database amo ang:
+<blockquote><code>$1</code></blockquote>
+nga halin sa buluhaton nga "<code>$2</code>".
+Ang database nagbalik sang sala/eror nga "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'May sala sa syntax sang pagpangita sa database.
 Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
 "$1"
@@ -373,22 +377,27 @@ Palihog isugid sa [[Special:ListUsers/sysop|administrador]], kag i-lista ang iya
 'badarticleerror' => 'Ang ini nga hulag indi pwede mabuhat sa sini nga panid.',
 'cannotdelete' => 'Ang panid ukon hilera nga "$1" indi mahimo nga pagapanason.
 Mahimo nga napanas na ini sang iban.',
+'cannotdelete-title' => 'Indi mahimo nga dulaon ang panid nga "$1"',
+'delete-hook-aborted' => 'Ang pag-ilis gin-untat sang taga.
+Wala ini naghatag sang ano man nga eksplenasyon.',
 'badtitle' => 'Malain nga titulo',
 'badtitletext' => 'Ang ginapangayo mo nga titulo ka pahina ay sala, blangko, ukon indi ensakto ang pagtabid sang inter-lengwahe o inter-wiki na titulo.
 Siguro may-ara ini sang isa ukon madamo nga karakter nga indi ginabaton kag ginagamit sa titulo.',
-'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o. May maksimum nga {{PLURAL:$1|isa ka resulta nga|$1 mga resulta nga}} ara sa nakatago nga datos.',
+'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1. May maksimum nga {{PLURAL:$4|isa ka resulta nga|$4 mga resulta nga}} ara sa nakatago nga datos.',
 'querypage-no-updates' => 'Ang mga pagbag-o sa sini nga panid karon ginpa-untat.
 Ang datos nga yari diri indi pagliwaton.',
 'wrong_wfQuery_params' => 'Indi insakto nga mga parametro sa wfQuery()<br />
 Kapuslanan: $1<br />
 Pagpamangkot: $2',
 'viewsource' => 'Lantawon ang ginhalinan',
+'viewsource-title' => 'Lantawon ang ginhalinan sang $1',
 'actionthrottled' => 'Ang paghulag ginpunggan',
 'actionthrottledtext' => 'Bilang pagpangontra sa span, ginalimitahan ka sa pagbuhat sang sini nga paghulag sa tuman ka damo nga beses sa malip-ot nga tinion, kag naglapaw ka na sa sini nga patakaran.
 Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
 'protectedpagetext' => 'Ang ini nga panid ginpangapinan agod to mapunggan ang pag-ilis sini.',
 'viewsourcetext' => 'Mahimo mo nga makita kag makopya ang ginhalinan sang sini nga panid:',
+'viewyourtext' => "Mahimo mo nga makita kag makopya ang ginhalinan sang '''imo mga pagbag-o''' sa sini nga panid:",
 'protectedinterface' => 'Ang ini nga panid nagahatag sang mga teksto sang interface para sa software, kag ginapangapinan agod indi maabuso.',
 'editinginterface' => "'''Pahibalo:''' Naga-ilis ka sang panid nga ginagamit sa paghatag sang mga teksto sang interface para sa software.
 Ang mga pagbag-o sang sini nga panid maga-apekto sa hitsura sang interface sang panid sang manug-gamit sang iban.
@@ -402,6 +411,13 @@ $2',
 'ns-specialprotected' => 'Ang mga espesyal nga panid indi mahimo nga paga-ilisan.',
 'titleprotected' => 'Ang ini nga titulo ginpangapinan batok sa pagbuhat ni [[User:$1|$1]].
 Ang iya rason amo ang "\'\'$2\'\'".',
+'filereadonlyerror' => 'Indi mahimo nga ma-ilisan ang hilera nga "$1" tungod kay ang gintaguan sang mga hilera nga "$2" ara sa estado nga mahimo lang mabasa.
+
+Ang administrador nga nag-kandado sini naghatag sang paathag nga: "$3".',
+'invalidtitle-knownnamespace' => 'Sala ang titulo sang may ngalanligwa nga "$2" kag taksto nga "$3"',
+'invalidtitle-unknownnamespace' => 'Sala nga titulo nga may wala mahibaluan nga ngalanligwa nga numero nga $1 kag teksto nga "$2"',
+'exception-nologin' => 'Wala naka-sulod',
+'exception-nologin-text' => 'Ang ini nga panid ukon tikang nagakinahanglan nga ikaw nakasulod/log-in sa sini nga wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Malain nga konpigurasyon: wala makilal-an nga manuglantaw sang virus: ''$1''",
@@ -422,6 +438,7 @@ Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pag
 'remembermypassword' => 'Dumdumon ang akon pagsulod sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
 'securelogin-stick-https' => 'Magpabilin nga nakatakod sa HTTPS pagkatapos magsulod',
 'yourdomainname' => 'Imo dominyo',
+'password-change-forbidden' => 'Indi ka mahimo nga makailis sang pasword sa sini nga wiki.',
 'externaldberror' => 'Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.',
 'login' => 'Mag sulod',
 'nav-login-createaccount' => 'Magsulod / maghimo account',
@@ -501,6 +518,7 @@ Wala pa sang e-mail nga ipadala diri para sa bisan ano sa masunod nga mga katung
 'invalidemailaddress' => 'Ang e-mail adres indi mabaton tungod kay nagagwa nga sala ang iya plastar.
 Palihog butang sang ginplastar sing maayo nga adres ukon panason nal lang ang lugar.',
 'cannotchangeemail' => 'Ang mga e-mail adres indi mahimo nga ilisan sa sini nga wiki.',
+'emaildisabled' => 'Ang ini nga lugar indi makapadala sang mga e-mail.',
 'accountcreated' => 'Nahimo na ang akawnt',
 'accountcreatedtext' => 'Ang akawnt sang manug-gamit nga $1 nahimo na.',
 'createaccount-title' => 'Pagbuhat sang akawnt para sa {{SITENAME}}',
@@ -682,17 +700,20 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} islan ini nga pahina]</span>.',
 'noarticletext-nopermission' => 'Wala subong sang teksto ang ini nga panid.
 Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga panid]] sa iban man nga panid,
 ukon <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs]</span>.',
+'missing-revision' => 'Ang ini nga pag-ilis nga #$1 sang panid nga ginhinanglan nga "{{PAGENAME}}" wala naga-eksister.
+
+Ini kalabanan ginabuhat sang nagasunod nga wala na mabag-o nga link sang hisayranay sa isa ka panid nga gindula na.
+Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 'userpage-userdoesnotexist' => 'Ang akawnt sang manuggamit nga "<nowiki>$1</nowiki>" wala pa marehistro.
 Palihog tsek kon luyag mo nga himuon/ilisan ang ini nga panid.',
 'userpage-userdoesnotexist-view' => 'Ang akawnt sang manuggamit nga "$1" wala pa marehistro.',
 'blocked-notice-logextract' => 'Ang ini nga manuggamit ginapunggan karon.
 Ang pinaka-ulihi nga log sa pagpuggong yara sa idalom para mahibaluan nimo:',
 'clearyourcache' => "'''Tandaan:''' Pagkatapos nga tiponon, mahimo nga kinahanglan mo pa nga i-baipas ang cache sang imo brawser agod makita ang mga pagbag-o.
-* '''Firefox / Safari:''' pinduton sing madugay ang ''Shift'' samtang ginapitik ang ''Reload'', ukon pinduton ang ''Ctrl-F5'' ukon ''Ctrl-R'' (''Command-R'' sa Mac)
-* '''Google Chrome:''' pinduton ang ''Ctrl-Shift-R'' (''Command-Shift-R'' sa Mac)
+* '''Firefox / Safari:''' pinduton sing madugay ang ''Shift'' samtang ginapitik ang ''Reload'', ukon pinduton ang ''Ctrl-F5'' ukon ''Ctrl-R'' (''-R'' sa Mac)
+* '''Google Chrome:''' pinduton ang ''Ctrl-Shift-R'' (''-Shift-R'' sa Mac)
 * '''Internet Explorer:''' pinduton sing madugay ang ''Ctrl'' samtang ginapitik ''Refresh'', ukon pinduton ang ''Ctrl-F5''
-* '''Konqueror:''' pitikon ang ''Reload'' ukon pinduton ang ''F5''
-* '''Opera:''' hawanon ang  cache sa ''Tools → Preferences''",
+* '''Opera:''' Tan-awon ang  cache sa ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Pagbulig:''' Gamiton ang \"{{int:showpreview}}\" nga tulom-ukon agod matilawan ang imo bag-o nga CSS bag-o magtipon.",
 'userjsyoucanpreview' => "'''Pagbulig:''' Gamiton ang \"{{int:showpreview}}\" nga tulom-ukon agod matilawan ang imo bag-o nga JavaScript bag-o magtipon.",
 'usercsspreview' => "'''Tandai nga ginalantaw mo pa lang ang imo CSS sang manuggamit.'''
@@ -709,6 +730,7 @@ Sa mga pahungod nga mga panid nga .css and .js magamit sang titulo nga may gagma
 'note' => "'''Pansinon:'''",
 'previewnote' => "'''Tandaan nga prebyu lamang ini.'''
 Wala pa nabutang ang imo nga ginbag-o!",
+'continue-editing' => 'Padayunon ang pagbag-o',
 'previewconflict' => 'Ang ini nga paglantaw nagapakita sang mga teksto nga yara sa may ibabaw ayon nga amo man ang magagwa kon luyag mo na ini nga pagatiponon.',
 'session_fail_preview' => "'''Nagapangayo kami sang pasaylo! Indi namon ma-proseso ang imo pag-ilis tungod sa pagkadula sang datos sang sesyon.'''
 Palihog tilawi liwat.
@@ -724,6 +746,7 @@ Ang pag-ilis wala ginbaton agod to nga malikawan ang kalainan sang mga teksto sa
 Ini nagakatabo kon kaisa kon nagagamit ka sang nakabase sa web nga serbisyo proxy nga madamo sing lusot.",
 'edit_form_incomplete' => "'''Ang iban nga bahin sang formas sa pag-ilis wala nakalab-ot sa serber; palihog verificar kon ang imo pag-ilis santo man sa gihapon kag tilawi liwat.'''",
 'editing' => 'Gina-islan $1',
+'creating' => 'Ginabuhat ang $1',
 'editingsection' => 'Gina-Islan $1 (seksiyon)',
 'editingcomment' => 'Gina-islan ang $1 (bag-o nga bahin)',
 'editconflict' => 'May pagpamatok sa pag-ilis: $1',
@@ -747,7 +770,7 @@ Naga promisa ka man sa amon nga ikaw mismo ang nagsulat sina, o ginkopya mo ini
 Kon indi mo luyag nga ang imo sinulatan paga-ilisan nga wala sin kaluoy, ginapangabay nga indi mo ina diri pag-ipasa.<br />
 Ikam man nagasumpa sa amon karon nga ikaw mismo ang nagsulat sini, ukon ginkopya mo ini sa pampubliko nga domain ukon kaparehas nga libre nga ginkuhaan (palihog lantaw sang $1 sa mga detalye).
 '''Indi magpadala sang mga na kapirayt nga mga inubrahan nga wala sing lisensya!'''",
-'longpageerror' => "'''Eror: Ang teksto nga imo ginpasa may kalabaon nga $1, nga mas malaba pa sang ginpasugtan nga labing malaba nga $2.'''
+'longpageerror' => "'''Eror: Ang teksto nga imo ginpasa may kalabaon nga {{PLURAL:$1|isa ka kilobayt|$1 ka mga kilobayt}}, nga mas malaba pa sang ginpasugtan nga labing malaba nga {{PLURAL:$2|isa ka kilobayt|$2 ka mga kilobayt}}.'''
 Indi ini matipon.",
 'readonlywarning' => "'''Phibalo: Ang database ginkandaduhan para sa pagpabilin, gani indi ka mahimo nga magtipon sang imo mga pag-ilis subong.'''
 Mahimo nga maluyagon ikaw nga mag-utod-kag-tapik sang teksto sa isa kag hilera sang teksto kag ini pagatipon mo sa lain nga tinion.
@@ -790,6 +813,7 @@ Ini nagapakita nga gindula na.',
 'edit-no-change' => 'Ang imo pag-ilis ginpabayaan lamang, kay wala sang pagbag-o nga natabo sa teksto.',
 'edit-already-exists' => 'Indi mahimo ang bag-o nga panid.
 Naga-eksister na ini.',
+'defaultmessagetext' => 'Teksto sang mensahe nga wala pa ma-ilisan',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Pahibalo:''' Ang ini nga panid may yara sang madamo nga mahal nga pagtawag sang kapusalanan parser.
@@ -805,6 +829,13 @@ Ang ini nga pagbinaisay wala na gin-upod pa.",
 'parser-template-loop-warning' => 'Ang natiktikan nga pagpukot: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ang ginalimitahan nga rekursyon sang templeyt nalab-ot na ($1)',
 'language-converter-depth-warning' => 'Ang ginalimitahan nga kadalumon sa pag-ilis sang hambalanon nalab-ot na ($1)',
+'node-count-exceeded-category' => 'Mga panid kon diin ang pag-isip sang node nagsobra',
+'node-count-exceeded-warning' => 'Ang panid nagsobra na sa pag-isip sang node',
+'expansion-depth-exceeded-category' => 'Mga panid kon diin ang kadalumon sang pagpalapad nagsobra na',
+'expansion-depth-exceeded-warning' => 'Ang panid nagsobra na sa kadalumon sang pagpalapad',
+'parser-unstrip-loop-warning' => 'May loop nga unstrip nga nakita',
+'parser-unstrip-recursion-limit' => 'Naglapaw ka na sa ginapasugtan nga pagliwat-liwat ($1)',
+'converter-manual-rule-error' => 'May sala nga nakita sa mano-mano nga pagsulunsan sa pagbadbad sang lenggwahe',
 
 # "Undo" feature
 'undo-success' => 'Ang pag-ilis indi mahuman.
@@ -943,6 +974,7 @@ Palihog sekyar sang mga logs.',
 'revdelete-reason-dropdown' => '*Masami nga rason sang pagdula
 ** Paglapas sang kinamatarong-kontra-pagkopya
 ** Indi nagakadapat nga impormasyon pangkaugalingon
+** Indi nagakadapat nga gamit-pangalan
 ** Mahimo nagapangguba-kinamatarong nga impormasyon',
 'revdelete-otherreason' => 'Iban/dugang nga rason:',
 'revdelete-reasonotherlist' => 'Iban nga rason',
@@ -952,7 +984,7 @@ Palihog sekyar sang mga logs.',
 # Suppression log
 'suppressionlog' => 'Log sang pagkakas',
 'suppressionlogtext' => 'Sa idalom isa ka lista sang mga gindula kag pagpugong nga naga-dala sang mga unod nga gintago halin sa mga administrador.
-Lantawa ang [[Special:BlockList|lista sang mga ginpunggan nga IP]] para sa lista sang mga naga-eksister nga pagdula kag pagpugong.',
+Lantawa ang [[Special:BlockList|lista sang mga ginpunggan]] para sa lista sang mga naga-eksister nga pagdula kag pagpugong.',
 
 # History merging
 'mergehistory' => 'Isugpon ang mga kasaysayan sang panid',
@@ -986,7 +1018,9 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 'mergelogpagetext' => 'Sa dalom isa ka lista sang mga pinaka-ulihe nga pagsugpon sang isa ka kasaysayan sang panid sa isa pa gid.',
 
 # Diffs
-'history-title' => 'Rebisyon sang historya sa "$1"',
+'history-title' => 'Rebisyon sang hisayranay sa "$1"',
+'difference-title' => 'Kinalain sang mga pagbag-o sa "$1"',
+'difference-title-multipage' => 'Kinalain sang mga panid nga "$1" kag "$2"',
 'difference-multipage' => '(Kinala-in sang mga panid)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
@@ -994,6 +1028,10 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 'editundo' => 'bawi-on ang pag ilis',
 'diff-multi' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang {{PLURAL:$2|isa ka manuggamit|$2 ka mga manuggamit}} nga wala ginpakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang masobra $2 ka {{PLURAL:$2|manuggamit|mga manuggamit}} nga wala ginpakita)',
+'difference-missing-revision' => 'May {{PLURAL:$2|isa ka pagbag-o|$2 ka mga pagbag-o}} san sini nga kinalain ($1) ang wala makita.
+
+Ini kalabanan ginabuhat sang nagasunod nga wala na mabag-o nga link sang isa ka panid nga gindula na.
+Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 
 # Search results
 'searchresults' => 'Resulta sang Pagpangita',
@@ -1084,11 +1122,12 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 'prefs-beta' => 'Mga kaupod sang Beta',
 'prefs-datetime' => 'Petsa kag oras',
 'prefs-labs' => 'Mga kaupod sang Labs',
+'prefs-user-pages' => 'Mga panid sang manuggamit',
 'prefs-personal' => 'Profayl sang manuggamit',
 'prefs-rc' => 'Mga Bag-o nga Inislan',
 'prefs-watchlist' => 'Lista sang mga ginabantayan',
 'prefs-watchlist-days' => 'Mga adlaw nga ipakita sa lista sang ginabantayan:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Indi magtaas sa $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'prefs-watchlist-edits' => 'Ang pinakataas nga beses sang pag-ilis nga ipakita sa ginpalawig nga lista sang ginabantayan:',
 'prefs-watchlist-edits-max' => 'Pinakataas nga numero: 1000',
 'prefs-watchlist-token' => 'Token sang lista sang ginabantayan:',
@@ -1168,6 +1207,11 @@ Ini indi dapat nga magsobra sa $1 {{PLURAL:$1|ka karakter|ka mga karakter}} ang
 'gender-female' => 'Babayi',
 'prefs-help-gender' => '',
 'email' => 'E-mail',
+'prefs-help-realname' => 'Ang matood-tood nga pangalan mahimo nga indi gamiton.
+Kon imo ini luyag nga ihatag, ini gamiton sa paghatag sing pagkilala sa imo nga gin-ubra.',
+'prefs-help-email' => 'Ang adres sang e-mail mahimo nga indi ihatag, apang kinahanglan ini sa pagliwat sang paswod, kon matabo nga imo ini malipatan.',
+'prefs-help-email-others' => 'Mahimo mo man pilion nga ma-kontak ka sang iban paagi sa e-mail paagi sa isa ka link sa imo manuggamit ukon gina-hisayranay nga panid.
+Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'prefs-help-email-required' => 'Kinahanglan ang imo e-mail',
 'prefs-signature' => 'pirma',
 
index b7c2b96..07685cf 100644 (file)
@@ -1048,7 +1048,9 @@ Prošu přepruwuj protokole.',
 'revdelete-only-restricted' => 'Zmylk při chowanju zapiska wot $2, $1; njemóžeš zapiski před wočemi administratorow potłóčić, bjez toho zo wuběraš tež jednu z druhich widźomnosćowych opcijow.',
 'revdelete-reason-dropdown' => '*Zwučene přičiny za wušmórnjenje
 ** Přeńdźenje awtorskeho prawa
-** Njepřihódne wosobinske informacije',
+** Njepřihódne komentary abo wosobinske informacije
+** Njepřihódne wužiwarske mjeno
+** Potencielnje ranjace informacije',
 'revdelete-otherreason' => 'Druha/přidatna přičina:',
 'revdelete-reasonotherlist' => 'Druha přičina',
 'revdelete-edit-reasonlist' => 'Přičiny za wušmórnjenje wobdźěłać',
@@ -1409,7 +1411,7 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 # User rights log
 'rightslog' => 'Protokol zrjadowanja wužiwarskich prawow',
 'rightslogtext' => 'To je protokol změnow wužiwarskich prawow.',
-'rightslogentry' => 'skupinowe čłonstwo za $1 z $2 na $3 změnjene',
+'rightslogentry' => 'změni skupinske čłonstwo za $1 z $2 do $3',
 'rightslogentry-autopromote' => 'je so awtomatisce wot $2 do $3 změnił',
 'rightsnone' => '(ničo)',
 
@@ -2870,7 +2872,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-authors' => 'Cyłkowna ličba rozdźělnych awtorow',
 'pageinfo-recent-edits' => 'Ličba najnowšich změnow (za zańdźenych $1)',
 'pageinfo-recent-authors' => 'Najnowša ličba rozdźělnych awtorow',
-'pageinfo-restriction' => 'Škit strony (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Škit strony ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Zapřijata předłoha|Zapřijatej předłoze|Zapřijate předłohi|Zapřijate předłohi}} ($1)',
index 6832d26..ec5d002 100644 (file)
@@ -573,12 +573,12 @@ További információkat a [[Special:Version|verzióinformációs lapon]] talál
 
 'ok' => 'OK',
 'retrievedfrom' => 'A lap eredeti címe: „$1”',
-'youhavenewmessages' => 'Új üzenet vár $1! (Az üzenetet $2.)',
-'newmessageslink' => 'a vitalapodon',
-'newmessagesdifflink' => 'külön is megtekintheted',
+'youhavenewmessages' => '$1 a vitalapodon! ($2 külön is megtekintheted.)',
+'newmessageslink' => 'új üzenet vár',
+'newmessagesdifflink' => 'az utolsó üzenetet',
 'youhavenewmessagesmanyusers' => '$1ed van több szerkesztőtől ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|egy|$1}} új üzenet',
-'newmessagesdifflinkplural' => 'utolsó {{PLURAL:$1|egy|$1}} változtatás',
+'newmessageslinkplural' => '{{PLURAL:$1|Új üzenet vár|Új üzenetek várnak}}',
+'newmessagesdifflinkplural' => 'Az utolsó {{PLURAL:$1|változtatást|változtatásokat}}',
 'youhavenewmessagesmulti' => 'Új üzenetet vár a(z) $1 wikin',
 'editsection' => 'szerkesztés',
 'editold' => 'szerkesztés',
@@ -2783,7 +2783,7 @@ Kérlek, válassz egy másik nevet.',
 
 Az átnevezés céljaként megadott „[[:$1]]” szócikk már létezik.  Ha az átnevezést végre akarod hajtani, ezt a lapot törölni kell.  Valóban ezt szeretnéd?',
 'delete_and_move_confirm' => 'Igen, töröld a lapot',
-'delete_and_move_reason' => 'Törölve, hogy legyen hely átmozgatni [[$1]] lapot.',
+'delete_and_move_reason' => 'átnevezendő lap célneve felszabadítva „[[$1]]” számára',
 'selfmove' => 'A cikk jelenlegi címe megegyezik azzal, amire át szeretnéd mozgatni. Egy szócikket saját magára mozgatni nem lehet.',
 'immobile-source-namespace' => 'A(z) „$1” névtér lapjai nem nevezhetőek át',
 'immobile-target-namespace' => 'A(z) „$1” névtérbe nem mozgathatsz át lapokat',
@@ -3881,8 +3881,8 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'revdelete-unrestricted' => 'felfedett az adminisztrátoroknak',
 'logentry-move-move' => '$1 átnevezte a(z) $3 lapot a következő névre: $4',
 'logentry-move-move-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül',
-'logentry-move-move_redir' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítással',
-'logentry-move-move_redir-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül',
+'logentry-move-move_redir' => '$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva',
+'logentry-move-move_redir-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva, átirányítás nélkül',
 'logentry-patrol-patrol' => '$1 a(z) $3 lap $4 változatát ellenőrzöttnek jelölte',
 'logentry-patrol-patrol-auto' => '$1 a(z) $3 lap $4 változatát automatikusan ellenőrzöttnek jelölte',
 'logentry-newusers-newusers' => '$1 létrehozott egy felhasználói fiókot',
index 738b529..135cc86 100644 (file)
@@ -3023,7 +3023,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-authors' => 'Numero total de autores distincte',
 'pageinfo-recent-edits' => 'Numero de modificationes recente (intra le ultime $1)',
 'pageinfo-recent-authors' => 'Numero de autores distincte recente',
-'pageinfo-restriction' => 'Protection del pagina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protection del pagina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
index ff96cb3..cd02b48 100644 (file)
@@ -600,6 +600,10 @@ $1',
 'youhavenewmessages' => 'Anda mempunyai $1 ($2).',
 'newmessageslink' => 'pesan baru',
 'newmessagesdifflink' => 'perubahan terakhir',
+'youhavenewmessagesfromusers' => 'Anda memiliki $1 dari {{PLURAL:$3||}}pengguna lain ($2).',
+'youhavenewmessagesmanyusers' => 'Anda memiliki $1 dari pengguna lain ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1||}}pesan baru',
+'newmessagesdifflinkplural' => '{{PLURAL:$1||}}perubahan terakhir',
 'youhavenewmessagesmulti' => 'Anda mendapat beberapa pesan baru pada $1',
 'editsection' => 'sunting',
 'editold' => 'sunting',
@@ -2005,7 +2009,7 @@ Mungkin Anda ingin menyunting keterangan pada [$2 halaman deskripsi berkas] di s
 
 # MIME search
 'mimesearch' => 'Pencarian MIME',
-'mimesearch-summary' => 'Halaman ini menyediakan fasilitas menyaring berkas berdasarkan tipe MIME nya. Masukkan: contenttype/subtype, misalnya <code>image/jpeg</code>.',
+'mimesearch-summary' => 'Halaman ini menyediakan fasilitas menyaring berkas berdasarkan tipe MIME-nya. Masukkan: contenttype/subtype, misalnya <code>image/jpeg</code>.',
 'mimetype' => 'Tipe MIME:',
 'download' => 'unduh',
 
index abbcd8c..4379259 100644 (file)
@@ -298,6 +298,10 @@ $1',
 'youhavenewmessages' => 'Addaanka ti $1 ($2).',
 'newmessageslink' => 'dagiti baro a mensahe',
 'newmessagesdifflink' => 'naudi a sinukatan',
+'youhavenewmessagesfromusers' => 'Adda $1 manipud {{PLURAL:$3|ti sabali nga agar-aramat|$3 kadagiti sabsabali nga agar-aramat}} ($2).',
+'youhavenewmessagesmanyusers' => 'Adda $1 fmanipud kadagiti adu nga agar-aramat ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|baro a mensahem|dagiti baro a mensahem}}',
+'newmessagesdifflinkplural' => 'kinaudi {{PLURAL:$1|a sinukatan|a sinuksukatan}}',
 'youhavenewmessagesmulti' => 'Adda dagiti baro a mensahem iti $1',
 'editsection' => 'urnosen',
 'editold' => 'urnosen',
@@ -349,12 +353,12 @@ Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialP
 # General errors
 'error' => 'Biddut',
 'databaseerror' => 'Biddut iti database',
-'dberrortext' => 'Adda biddut ti database ti  gramatika na a panagsapul.
+'dberrortext' => 'Adda napasamak a biddut ti nakaibatayan ti datos a panagsapul ti gramatika.
 Adda ngata  kiteb iti software.
-Ti kinaudia a panagpadas ti panagsapul ti database ket:
-<blockquote><tt>$1</tt></blockquote>
-naggapu ti uneg ti pamay-an "<tt>$2</tt>".
-Ti database ket nangipatulod ti biddut "<tt>$3: $4</tt>".',
+Ti kinaudi a panagpadas ti panagsapul ti nakaibatayan ti datos ket:
+<blockquote><code>$1</code></blockquote>
+naggapu ti uneg ti pamay-an "<code>$2</code>".
+Ti nakaibatayan ti datos ket nangipatulod ti biddut "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Adda biddut ti database ti  gramatika a panagsapul.
 Ti kinaudi a panagsapul ti database ket:
 "$1"
@@ -452,6 +456,7 @@ Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENA
 'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
 'securelogin-stick-https' => 'Agyan ka a nakasilpo iti HTTPS no nakastrekka',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
+'password-change-forbidden' => 'Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.',
 'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo a ruar a pakabilangan.',
 'login' => 'Sumrek',
 'nav-login-createaccount' => 'Sumrek / agaramid ti pakabilangan',
@@ -712,16 +717,19 @@ wenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid
 Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] iti sabsabali a pampanid,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbirukka],
 wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk ka kadagiti maikabagian a listaan]</span>.',
+'missing-revision' => 'Ti panagbalbaliw ti #$1 tipanid a nanaganan ti "{{PAGENAME}}" ket awan.
+
+Daytoy ket kadawyan agapuanan babaen ti samaganad a panilpo ti baak a pakasaritaan iti maysa a panid a naikkaten.
+Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].',
 'userpage-userdoesnotexist' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro. 
 Pangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.',
 'userpage-userdoesnotexist-view' => 'Ti pakabilangan ni agar-aramat "$1" ket saan a nakarehistro.',
 'blocked-notice-logextract' => 'Agdama a naserraan daytoy nga agar-aramat.
 Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:',
-'clearyourcache' => "'''Pakaammo:''' No nalpas ka nga agidulin, kuma ket masapul nga ipalabas ti cahe ti pinagbasabasam tapno makita dagiti sinukatam.
+'clearyourcache' => "'''Pakaammo:''' No nalpaskan nga agiduldulin, kuma ket masapul nga ipalabas ti cahe ti pinagbasabasam tapno makita dagiti sinukatam.
 * '''Firefox / Safari:''' Tenglen ti ''Sukatan'' bayat nga agtakla ti ''Ikarga manen'', wenno itakla ti ''Ctrl-F5'' wenno''Ctrl-R'' (''⌘-R'' Mac)
 * '''Google Chrome:''' Itakla ti ''Ctrl-Shift-R'' (''⌘-Shift-R'' iti Mac)
 * '''Internet Explorer:''' Tenglen ti ''Ctrl'' bayat nga agtakla ti ''Ipasaradiwa'', wenno itakla ti ''Ctrl-F5''
-* '''Konqueror:''' Itakla ti ''Ikarga manen'' wenno itakla ti ''F5''
 * '''Opera:''' Dalusan ti cache iti ''Ramramit → Kakaykayatan''",
 'usercssyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a CSS sakbay nga idulinmo.",
 'userjsyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a JavaScript sakbay nga idulinmo.",
@@ -845,6 +853,7 @@ Dagitoy a panagpalawag  ket naikkaten.",
 'expansion-depth-exceeded-warning' => 'Ti panid ket nasurokanna ti kauneg ti panagpadakkel',
 'parser-unstrip-loop-warning' => 'Adda  nakita a di-naukisan a silo',
 'parser-unstrip-recursion-limit' => 'Ti di-naukisan a panagsumro manen a patingga ket nasurokan ($1)',
+'converter-manual-rule-error' => 'Adda biddut a naduktalan idiay manual nga alagaden ti panagbalbaliw ti pagsasao',
 
 # "Undo" feature
 'undo-success' => 'Ti panag-urnos ket saan a maisubli.
@@ -1033,6 +1042,10 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 'editundo' => 'ibabawi',
 'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtennga a panangbalbaliw}} babaen {{PLURAL:$2|ti agararamat|dagiti $2 nga agararamat}} ti saan a naipakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtengnga a panangbalbaliw}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} a saan a naipakita)',
+'difference-missing-revision' => '{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.
+
+Daytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a panilpo tipaggiddiatan ti maysa a panid a naikkaten.
+Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].',
 
 # Search results
 'searchresults' => 'Dagiti nagbanagan ti panagbiruk',
@@ -1306,6 +1319,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-writeapi' => 'Panagusar ti panagsurat nga API',
 'right-delete' => 'Ikkaten dagiti panid',
 'right-bigdelete' => 'Ikkaten dagiti panid nga adda dagiti dakkel a pakasaritaanna',
+'right-deletelogentry' => 'Ikkaten ken isubli ti panagikkat dagiti naisangsangayan a naikabil ti listaan',
 'right-deleterevision' => 'Ikkaten ken ipasubli dagiti nainagan a pinagbaliwan ti panid',
 'right-deletedhistory' => 'Kitaen dagiti naikabil a pakasaritaan, nga awan kaniada kadagiti nairaman a testo',
 'right-deletedtext' => 'Kitaen dagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti binaliwan',
@@ -1730,6 +1744,7 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 'uploadnewversion-linktext' => 'Mangipan ti kabarbaro a bersion iti daytoy a papeles',
 'shared-repo-from' => 'Naggapo iti $1',
 'shared-repo' => 'iti pagbingbingayan a nagikabilan',
+'upload-disallowed-here' => 'Daksanggasat a saanmo a mabalin a suratan manen daytoy nga imahen.',
 
 # File reversion
 'filerevert' => 'Isubli ti $1',
@@ -1811,9 +1826,10 @@ Laglagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkate
 
 'disambiguations' => 'Dagiti panid a nakasilpo kadagiti panangilawlawag',
 'disambiguationspage' => 'Template:Panangilawlawag',
-'disambiguations-text' => "Dagiti sumaganad a panid ket nakasilpo iti '''panangilawlawag a panid'''.
-Ngem agpasilpo da kuma ti husto a topiko.<br />
-Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo idiay [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Dagiti sumaganad a panid ket aglaon ti saan a basbasit ngem maysa a panilpo iti '''panangilawlawag a panid'''.
+Dagitoy ket mabalinno a nasken nga isilpo kadagiti embes a nasaysayaat a panid.<br />
+Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo idiay
+ [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Dagiti namindua a naibaw-ing',
 'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
@@ -1839,6 +1855,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|a byte|kadagiti byte}}',
 'ncategories' => '$1 {{PLURAL:$1|a kategoria|kadagiti kategoria}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|dagiti interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|a panilpo|kadagiti panilpo}}',
 'nmembers' => '$1 {{PLURAL:$1|a kameng|kadagiti kameng}}',
 'nrevisions' => '$1 {{PLURAL:$1|a panagbalbaliw|kadagiti panagbalbaliw}}',
@@ -1867,6 +1884,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'mostlinkedtemplates' => 'Dagiti plantilia a kaaduan iti nakasilpo',
 'mostcategories' => 'Dagiti panid a kaaduan kadagiti kategoria',
 'mostimages' => 'Dagiti papeles a kaaduan iti nakasilpo',
+'mostinterwikis' => 'Dagiti panid a kaaduan kadagiti interwiki',
 'mostrevisions' => 'Dagiti artikulo a kaaduan ti pannakabalbaliwna',
 'prefixindex' => 'Dagiti amin a panid nga adda ti pasaruno na',
 'prefixindex-namespace' => 'Amin a panid nga addaan ti pasaruno ($1 nagan ti luglugar)',
@@ -2012,6 +2030,8 @@ Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a m
 'mailnologin' => 'Awan ti pagipatulodan a pagtaengan',
 'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga e-surat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti e-surat kadagiti sabsabali nga agar-aramat.',
 'emailuser' => 'E-suratan daytoy nga agar-aramat',
+'emailuser-title-target' => 'E-suratam daytoy nga {{GENDER:$1|agar-aramat}}',
+'emailuser-title-notarget' => 'E-suratan ti agar-aramat',
 'emailpage' => 'E-suratan ti agar-aramat',
 'emailpagetext' => 'Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe daytoy nga agar-aramat.
 Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
@@ -2158,6 +2178,8 @@ agal-aluad ka a mangrugi.',
 'rollback' => 'Isubli dagiti panag-urnos',
 'rollback_short' => 'Isubli',
 'rollbacklink' => 'isubli',
+'rollbacklinkcount' => 'agisubli ti $1 {{PLURAL:$1|nga inurnos|nga inururnos}}',
+'rollbacklinkcount-morethan' => 'agisubli ti ad-adu ngem $1 {{PLURAL:$1|nga inurnos|nga inururnos}}',
 'rollbackfailed' => 'Napaay ti panangisubli',
 'cantrollback' => 'Saan a maisubli ti panagurnos;
 ti naudi a nakaaramid ket iti laeng nagsurat daytoy a panid..',
@@ -2665,6 +2687,7 @@ Amin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pi
 'import-interwiki-templates' => 'Ikabil amin dagiti plantilia',
 'import-interwiki-submit' => 'Agala',
 'import-interwiki-namespace' => 'Pangipanan ti nagan ti lugar:',
+'import-interwiki-rootpage' => 'Papanan a ramut ti panid (mapili):',
 'import-upload-filename' => 'Nagan ti papeles:',
 'import-comment' => 'Komentario:',
 'importtext' => 'Pangngaasi nga ipanmo ti papeles a naggapu iti nagtaudan a wiki nga agusar ti [[Special:Export|agipan]].',
@@ -2700,6 +2723,9 @@ Pangngaasi ta padasem manen.',
 'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
 'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
 'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
+'import-options-wrong' => 'Saan nga husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Ti naited a ramut ti panid ket imbalido a titulo.',
+'import-rootpage-nosubpage' => 'Ti nagan ti lugar ti "$1" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.',
 
 # Import log
 'importlogpage' => 'Alaen ti listaan',
@@ -2817,11 +2843,34 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 
 # Info page
 'pageinfo-title' => 'Pakaammo para iti "$1"',
-'pageinfo-header-edits' => 'Dagiti inurnos',
+'pageinfo-header-basic' => 'Kangrunaan a pakaammuan',
+'pageinfo-header-edits' => 'Pakasaritaan ti inurnos',
+'pageinfo-header-restrictions' => 'Panagsalaknib ti panid',
+'pageinfo-header-properties' => 'Tagtagikua ti panid',
+'pageinfo-display-title' => 'Iparang ti titulo',
+'pageinfo-default-sort' => 'Kasisigud a kangrunaan a panagilasin',
+'pageinfo-length' => 'Kaatiddog ti panid (kadagiti bytes)',
+'pageinfo-article-id' => 'ID ti panid',
+'pageinfo-robot-policy' => 'Kasasaad ti panagbiruk a makina',
+'pageinfo-robot-index' => 'Mabalin a maipasurotan',
+'pageinfo-robot-noindex' => 'Saan a mabalin a maipasurotan',
 'pageinfo-views' => 'Bilang dagiti panagkita',
-'pageinfo-watchers' => 'Bilang dagiti agbuybuya',
-'pageinfo-edits' => 'Bilang dagiti inurnos:',
-'pageinfo-authors' => 'Ti bilang dagiti sabsabali a mannurat',
+'pageinfo-watchers' => 'Bilang dagiti agbuybuya ti panid',
+'pageinfo-redirects-name' => 'Maibaw-ing ti daytoy a panid',
+'pageinfo-subpages-name' => 'Apo dagiti panid ti daytoy a panid',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})',
+'pageinfo-firstuser' => 'Nagpartuat ti panid',
+'pageinfo-firsttime' => 'Petsa a panakapartuat ti panid',
+'pageinfo-lastuser' => 'Kinaudi a nagurnos',
+'pageinfo-lasttime' => 'Petsa ti kinaudi a panag-urnos',
+'pageinfo-edits' => 'Dagup a bilang dagiti inurnos',
+'pageinfo-authors' => 'Dagup a bilang dagiti naisangsangayn a mannurat',
+'pageinfo-recent-edits' => 'Itay nabiit a bilang dagiti inurnos (ti uneg ti napalabas ti $1)',
+'pageinfo-recent-authors' => 'Itay nabiit a bilang dagiti naisangsangayan a mannurat',
+'pageinfo-restriction' => 'Panagsalaknib ti panid ({{lcfirst:$1}})',
+'pageinfo-magic-words' => 'Salamangka  {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
+'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
+'pageinfo-templates' => 'Nailak-am  {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -2865,6 +2914,7 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'file-info-size-pages' => '$1 × $2 dagiti piksel, kadakkel ti papeles: $3, kita ti MIME: $4, $5 {{PLURAL:$5|panid|pampanid}}',
 'file-nohires' => 'Awan ti mabalin a nangatngato a resolusion.',
 'svg-long-desc' => 'SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
+'svg-long-desc-animated' => 'Naanimado nga SVG a papeles, babassit ngem  $1 × $2 pixels, kadakkel ti papeles: $3',
 'show-big-image' => 'Sibubukel a resolusion',
 'show-big-image-preview' => 'Kadakkel na daytoy a pagpadas: $1.',
 'show-big-image-other' => 'Sabali  {{PLURAL:$2|a resolusion|kadagiti resolusion}}: $1.',
@@ -2874,6 +2924,8 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'file-info-png-looped' => 'nasiluan',
 'file-info-png-repeat' => 'pinaayayam ti $1 {{PLURAL:$1|a beses|a beses}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}',
+'file-no-thumb-animation' => "'''Paammo: Gapu kadagiti teknikal a panakaipatingga, dagiti bassit a ladawan ti daytoy a papeles ket saanto a maanimado.'''",
+'file-no-thumb-animation-gif' => "'''Paammo: Gapu kadagiti teknikal a panakaipatingga, dagiti bassit a ladawan ti nangato a resolusion dagiti  GIF nga imahen a kas daytoy ket saanto a maanimado.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria dagiti kabarbaro a papeles',
@@ -3536,7 +3588,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 * <span class="mw-specialpagecached">Cached nga espesial a pampanid (baka nagpaso).</span>',
 'specialpages-group-maintenance' => 'Dagiti pagsimpa a padamag',
 'specialpages-group-other' => 'Sabsabali pay nga espesial a pampanid',
-'specialpages-group-login' => 'Sumrek / agrehistro',
+'specialpages-group-login' => 'Sumrek / agaramid ti pakabilangan',
 'specialpages-group-changes' => 'Kaudian a sinukatan ken listaan',
 'specialpages-group-media' => 'Dagiti padamag ti media ken panag-ipan',
 'specialpages-group-users' => 'Dagiti agar-aramat ken karkarbengan',
@@ -3676,7 +3728,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'api-error-file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
 'api-error-filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
 'api-error-filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
-'api-error-filetype-banned-type' => 'Ti $1 {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubusan{{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
+'api-error-filetype-banned-type' => 'Ti $1 {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubusan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
 'api-error-filetype-missing' => 'Ti papeles ket agkurang ti pagpa-atiddog.',
 'api-error-hookaborted' => 'Ti panagbabaro a pinadasmo ket napasardeng iti pangpa-atiddog a kawit.',
 'api-error-http' => 'Kinauneg a biddut: Saan a makaikabit idiay server.',
index a97ec76..a7b899c 100644 (file)
@@ -1167,9 +1167,10 @@ $1",
 'revdelete-no-change' => "'''Attenzione:''' l'oggetto con data $1 $2 aveva già le impostazioni di visibilità richieste.",
 'revdelete-concurrent-change' => "Impossibile modificare l'oggetto con data $1 $2 in quanto il suo stato è stato modificato da un altro utente mentre se ne tentava la modifica.",
 'revdelete-only-restricted' => "Errore nel nascondere l'oggetto datato $1, $2: non è possibile nascondere gli oggetti alla vista degli amministratori senza selezionare almeno un'altra delle opzioni di rimozione.",
-'revdelete-reason-dropdown' => '*Motivazioni più comuni per la cancellazione
+'revdelete-reason-dropdown' => '* Motivazioni più comuni per la cancellazione
 ** Violazione di copyright
-** Informazioni personali inappropriate
+** Commenti o informazioni personali inappropriate
+** Nome utente inappropriato
 ** Informazione potenzialmente diffamatoria',
 'revdelete-otherreason' => 'Altra motivazione o motivazione aggiuntiva:',
 'revdelete-reasonotherlist' => 'Altra motivazione',
@@ -3017,7 +3018,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-authors' => 'Numero totale di autori diversi',
 'pageinfo-recent-edits' => 'Numero di modifiche recenti (negli ultimi $1)',
 'pageinfo-recent-authors' => 'Numero di autori diversi recenti',
-'pageinfo-restriction' => 'Protezione della pagina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protezione della pagina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
 'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}}  ($1)',
index 611f21a..fcdaec2 100644 (file)
@@ -364,7 +364,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'リンクの下線',
+'tog-underline' => 'リンクの下線:',
 'tog-justify' => '段落に均等割り付けを設定',
 'tog-hideminor' => '最近の更新に細部の編集を表示しない',
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
@@ -391,8 +391,8 @@ $messages = array(
 'tog-enotifminoredits' => 'ページやファイルへの細部の編集でもメールを受け取る',
 'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示',
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
-'tog-oldsig' => '既存の署名',
-'tog-fancysig' => '署名をウィキ文として扱う(自動リンクなし)',
+'tog-oldsig' => '既存の署名:',
+'tog-fancysig' => '署名をウィキ文として扱う (自動リンクなし)',
 'tog-externaleditor' => '既定で編集に外部アプリケーションを使用(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-externaldiff' => '差分表示に外部アプリケーションを使用(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
@@ -483,7 +483,7 @@ $messages = array(
 'hidden-category-category' => '隠しカテゴリ',
 'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の {{PLURAL:$1|$1 下位カテゴリ}}を表示しています。}}',
 'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ|&#32;$1 下位カテゴリ}}が含まれています。',
-'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の {{PLURAL:$1|$1 ページ}}を表示しています。}}',
+'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の $1 ページを表示しています。}}',
 'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ|&#32;$1 ページ}}が含まれています。',
 'category-file-count' => '{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}',
 'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル|&#32;$1 ファイル}}が含まれています。',
@@ -578,7 +578,7 @@ $messages = array(
 'categorypage' => 'カテゴリのページを表示',
 'viewtalkpage' => '議論を表示',
 'otherlanguages' => '他言語版',
-'redirectedfrom' => '($1から転送)',
+'redirectedfrom' => '($1から転送)',
 'redirectpagesub' => 'リダイレクトページ',
 'lastmodifiedat' => 'このページが最後に更新されたのは $1 $2 です。',
 'viewcount' => 'このページは {{PLURAL:$1|$1 回}}アクセスされました。',
@@ -625,7 +625,7 @@ $1',
 
 'ok' => 'OK',
 'retrievedfrom' => '「$1」から取得',
-'youhavenewmessages' => '$1があります($2)。',
+'youhavenewmessages' => '$1があります ($2)。',
 'newmessageslink' => '新着メッセージ',
 'newmessagesdifflink' => '最終更新の差分',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|他の利用者|$3 人の利用者}}からの$1があります ($2)。',
@@ -683,14 +683,14 @@ URL を間違って入力したか、正しくないリンクをたどった可
 # General errors
 'error' => 'エラー',
 'databaseerror' => 'データベース エラー',
-'dberrortext' => 'データベースクエリーの構文エラーが発生しました。
+'dberrortext' => 'データベース クエリの構文エラーが発生しました。
 ソフトウェアにバグがある可能性があります。
-最後に実行を試みたクエリー:
+最後に実行を試みたクエリ:
 <blockquote><code>$1</code></blockquote>
 (関数「<code>$2</code>」内)。
 データベースはエラー「<samp>$3:$4</samp>」を返しました。',
-'dberrortextcl' => 'データベースクエリーの構文エラーが発生しました。
-最後に実行を試みたクエリー:
+'dberrortextcl' => 'データベース クエリの構文エラーが発生しました。
+最後に実行を試みたクエリ:
 「$1」
 (関数「$2」内)。
 データベースはエラー「$3:$4」を返しました',
@@ -700,14 +700,14 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'readonlytext' => 'データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。
 
 データベースをロックした管理者による説明は以下の通りです:$1',
-'missing-article' => 'æ±\82ã\82\81ã\82\89れたページ「$1」$2 の本文がデータベース内で見つかりませんでした。
+'missing-article' => 'æ\8c\87å®\9aã\81\95れたページ「$1」$2 の本文がデータベース内で見つかりませんでした。
 
 通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。
 
 それ以外の操作でこのメッセージが表示された場合、ソフトウェアのバグである可能性があります。
-[[Special:ListUsers/sysop|管理者]]までそのURLを添えてお知らせください。',
-'missingarticle-rev' => '(版番号:$1)',
-'missingarticle-diff' => '(差分:$1、$2)',
+[[Special:ListUsers/sysop|管理者]]までその URL を添えてお知らせください。',
+'missingarticle-rev' => '(版番号: $1)',
+'missingarticle-diff' => '(差分: $1, $2)',
 'readonly_lag' => 'データベースはスレーブのデータベースサーバーがマスターに同期するまで自動的にロックされています',
 'internalerror' => '内部エラー',
 'internalerror_info' => '内部エラー:$1',
@@ -734,9 +734,9 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'perfcachedts' => '以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。',
 'querypage-no-updates' => 'ページの更新は無効になっています。
 以下のデータの更新は現在行われていません。',
-'wrong_wfQuery_params' => 'wfQuery()に正しくないパラメーターが渡されました<br />
-関数$1<br />
-クエリー:$2',
+'wrong_wfQuery_params' => 'wfQuery() のパラメーターが無効です<br />
+関数$1<br />
+クエリ$2',
 'viewsource' => 'ソースを表示',
 'viewsource-title' => '$1のソースを表示',
 'actionthrottled' => '操作が速度規制されました',
@@ -749,7 +749,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'editinginterface' => "'''警告:'''ソフトウェアのインターフェイスの文章として使用しているページを編集しています。
 このページの変更は他の利用者のユーザーインターフェイスの外観に影響します。
 翻訳する場合、MediaWiki のローカライズプロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] の使用を検討してください。",
-'sqlhidden' => '(SQLクエリー非表示)',
+'sqlhidden' => '(SQL クエリ非表示)',
 'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で読み込まれているため、編集できないように保護されています:
 $2',
 'namespaceprotected' => "'''$1'''名前空間にあるページを編集する権限がありません。",
@@ -777,12 +777,12 @@ $2',
 'welcomecreation' => '== ようこそ、$1 さん! ==
 アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
-'yourname' => '利用者名',
-'yourpassword' => 'パスワード',
-'yourpasswordagain' => 'パスワード再入力',
+'yourname' => '利用者名:',
+'yourpassword' => 'パスワード:',
+'yourpasswordagain' => 'パスワード再入力:',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
-'yourdomainname' => 'ドメイン',
+'yourdomainname' => 'ドメイン:',
 'password-change-forbidden' => 'このウィキではパスワードを変更できません。',
 'externaldberror' => '外部の認証データベースでエラーが発生したか、または外部アカウント情報の更新が許可されていません。',
 'login' => 'ログイン',
@@ -835,7 +835,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'password-login-forbidden' => 'この利用者名とパスワードの使用は禁止されています。',
 'mailmypassword' => '新しいパスワードをメールで送信',
 'passwordremindertitle' => '{{SITENAME}}の仮パスワード通知',
-'passwordremindertext' => '誰か(おそらくあなた)がIPアドレス$1から{{SITENAME}}($4)のログイン用パスワードの再発行を申請しました。
+'passwordremindertext' => '誰か(おそらくあなた)がIPアドレス$1から{{SITENAME}} ($4) のログイン用パスワードの再発行を申請しました。
 利用者「$2」の仮パスワードが作成され「$3」に設定されました。
 もしあなたがこの申請をしたのであれば、ログインして新しいパスワードを決めてください。
 この仮パスワードは {{PLURAL:$5|$5 日間}}で有効期限が切れます。
@@ -900,7 +900,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'resetpass-submit-cancel' => '中止',
 'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが正しくありません。
 パスワードを既に変更した、または新しい仮パスワードを依頼した可能性があります。',
-'resetpass-temp-password' => '仮パスワード',
+'resetpass-temp-password' => '仮パスワード:',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
@@ -908,11 +908,11 @@ Cookieを有効にしていることを確認して、このページを再読
 'passwordreset-legend' => 'パスワードの再設定',
 'passwordreset-disabled' => 'パスワードの再設定は、このウィキでは無効になっています。',
 'passwordreset-pretext' => '{{PLURAL:$1||下記のデータのいずれか 1 つを入力してください}}',
-'passwordreset-username' => '利用者名',
-'passwordreset-domain' => 'ドメイン',
+'passwordreset-username' => '利用者名:',
+'passwordreset-domain' => 'ドメイン:',
 'passwordreset-capture' => '送信されるメールの内容を表示しますか?',
 'passwordreset-capture-help' => 'このボックスにチェックを入れると、利用者に送信されるメールの内容(仮パスワードを含む)をあなたも閲覧できます。',
-'passwordreset-email' => 'メールアドレス',
+'passwordreset-email' => 'メールアドレス:',
 'passwordreset-emailtitle' => '{{SITENAME}}上のアカウントの詳細',
 'passwordreset-emailtext-ip' => 'どなたか(おそらくあなた、IP アドレス $1)が {{SITENAME}} ($4) での
 あなたのアカウントの詳細情報を送信するよう申請しました。
@@ -1049,6 +1049,10 @@ IP アドレスは複数の利用者で共有されている場合がありま
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]するか、
 [{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>することができます。',
 'noarticletext-nopermission' => '現在このページには内容がありません。他のページに含まれる[[Special:Search/{{PAGENAME}}|このページ名を検索]]するか、もしくは<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連記録を検索]</span>することができます。',
+'missing-revision' => '「{{PAGENAME}}」というページの版番号 $1 の版は存在しません。
+
+通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 
+詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。',
 'userpage-userdoesnotexist' => '「$1」という利用者アカウントは登録されていません。
 このページの作成/編集が適切かご確認ください。',
 'userpage-userdoesnotexist-view' => '利用者アカウント「$1」は登録されていません。',
@@ -1188,7 +1192,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
 'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
-'undo-summary' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による第$1版を取り消し',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による版 $1 を取り消し',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'アカウントを作成できません',
@@ -1315,7 +1319,8 @@ $1",
 'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:あなたが変更しようとしている間に、他の誰かが変更したようです。
 記録を確認してください。',
 'revdelete-only-restricted' => '$1$2の項目の版指定削除に失敗しました:他の閲覧レベルの選択肢のうちどれかをさらに選択しなければ、管理者から項目を秘匿できません。',
-'revdelete-reason-dropdown' => '*よくある削除理由
+'revdelete-reason-dropdown' => '
+*よくある削除理由
 ** 著作権侵害
 ** 名誉毀損のおそれ
 ** 非公開個人情報',
@@ -1330,7 +1335,7 @@ $1",
 現在操作できる追放とブロックの一覧については[[Special:BlockList|ブロックの一覧]]を参照してください。',
 
 # History merging
-'mergehistory' => 'ページ履歴の統合',
+'mergehistory' => 'ページ履歴の統合',
 'mergehistory-header' => 'このページでは、ある元ページの履歴を新しいページに統合できます。
 この変更を行ってもページの履歴の連続性が確実に保たれるようにしてください。',
 'mergehistory-box' => '2ページの過去の版を統合する:',
@@ -1371,6 +1376,10 @@ $1",
 'editundo' => '取り消し',
 'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超える利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
+'difference-missing-revision' => '指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。
+
+通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 
+詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。',
 
 # Search results
 'searchresults' => '検索結果',
@@ -1407,8 +1416,8 @@ $1",
 'search-result-size' => '$1({{PLURAL:$2|$2単語}})',
 'search-result-category-size' => '{{PLURAL:$1|$1件}}({{PLURAL:$2|$2下位カテゴリ}}、{{PLURAL:$3|$3ファイル}})',
 'search-result-score' => '関連度:$1%',
-'search-redirect' => '($1からのリダイレクト)',
-'search-section' => '($1の節)',
+'search-redirect' => '($1からのリダイレクト)',
+'search-section' => '($1の節)',
 'search-suggest' => 'もしかして:$1',
 'search-interwiki-caption' => '姉妹プロジェクト',
 'search-interwiki-default' => '$1の結果:',
@@ -1428,10 +1437,10 @@ $1",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
 'powersearch-legend' => '高度な検索',
-'powersearch-ns' => '名前空間を指定して検索',
+'powersearch-ns' => '名前空間を指定して検索:',
 'powersearch-redir' => 'リダイレクトを表示',
-'powersearch-field' => '検索対象',
-'powersearch-togglelabel' => 'チェックを入れる',
+'powersearch-field' => '検索対象',
+'powersearch-togglelabel' => 'チェックを入れる:',
 'powersearch-toggleall' => 'すべて',
 'powersearch-togglenone' => 'すべて外す',
 'search-external' => '外部検索',
@@ -1451,7 +1460,7 @@ $1",
 # Preferences page
 'preferences' => '個人設定',
 'mypreferences' => '個人設定',
-'prefs-edits' => '編集回数',
+'prefs-edits' => '編集回数:',
 'prefsnologin' => 'ログインしていません',
 'prefsnologintext' => '個人設定を変更するためには<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ログイン]</span>する必要があります。',
 'changepassword' => 'パスワードの変更',
@@ -1515,32 +1524,32 @@ $1",
 'allowemail' => '他の利用者からのメールを受け取る',
 'prefs-searchoptions' => '検索設定',
 'prefs-namespaces' => '名前空間',
-'defaultns' => 'または次の名前空間のみを検索:',
+'defaultns' => '指定した名前空間のみを検索:',
 'default' => '既定',
 'prefs-files' => 'ファイル',
 'prefs-custom-css' => 'カスタムCSS',
 'prefs-custom-js' => 'カスタムJS',
-'prefs-common-css-js' => '全外装に共通のCSSとJavaScript:',
+'prefs-common-css-js' => 'すべての外装に共通のCSSとJavaScript:',
 'prefs-reset-intro' => 'このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。
 この操作は取り消せません。',
-'prefs-emailconfirm-label' => 'メール確認:',
+'prefs-emailconfirm-label' => 'メールアドレスの確認:',
 'prefs-textboxsize' => '編集画面の大きさ',
-'youremail' => 'メールアドレス',
-'username' => '利用者名',
-'uid' => '利用者ID:',
-'prefs-memberingroups' => '所属する{{PLURAL:$1|グループ}}:',
-'prefs-registration' => '登録日時',
-'yourrealname' => '本名',
-'yourlanguage' => '使用言語',
-'yourvariant' => 'コンテンツ言語変種',
+'youremail' => 'メールアドレス:',
+'username' => '利用者名:',
+'uid' => '利用者 ID:',
+'prefs-memberingroups' => '所属{{PLURAL:$1|グループ}}:',
+'prefs-registration' => '登録日時:',
+'yourrealname' => '本名:',
+'yourlanguage' => '使用言語:',
+'yourvariant' => 'コンテンツ言語変種:',
 'prefs-help-variant' => 'このウィキのコンテンツに表示に使用したい言語変種または正書法。',
-'yournick' => '新しい署名',
+'yournick' => '新しい署名:',
 'prefs-help-signature' => 'トークページ上での発言には「<nowiki>~~~~</nowiki>」と付けて署名すべきです。これは自分の署名に時刻印を付けたものに変換されます。',
 'badsig' => '署名用のソースが正しくありません。
 HTMLタグを見直してください。',
 'badsiglength' => '署名が長すぎます。
 $1 {{PLURAL:$1|文字}}以下である必要があります。',
-'yourgender' => '性別',
+'yourgender' => '性別:',
 'gender-unknown' => '未指定',
 'gender-male' => '男',
 'gender-female' => '女',
@@ -1625,23 +1634,23 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-createtalk' => '議論ページを作成',
 'right-createaccount' => '新しい利用者アカウントを作成',
 'right-minoredit' => '細部の編集の印を付ける',
-'right-move' => 'ã\83\9aã\83¼ã\82¸ã\81®移動',
+'right-move' => 'ã\83\9aã\83¼ã\82¸ã\82\92移動',
 'right-move-subpages' => '下位ページを含めてページを移動',
 'right-move-rootuserpages' => '利用者ページ本体を移動',
-'right-movefile' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®移動',
+'right-movefile' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82\92移動',
 'right-suppressredirect' => 'リダイレクトを残さずにページを移動',
 'right-upload' => 'ファイルをアップロード',
 'right-reupload' => '既存のファイルに上書き',
 'right-reupload-own' => '自分自身がアップロードした既存のファイルに上書き',
 'right-reupload-shared' => '共有メディアリポジトリ上のファイルにローカルで上書き',
 'right-upload_by_url' => 'URL からファイルをアップロード',
-'right-purge' => '確èª\8dã\82\92ç\9c\81ç\95¥ã\81\97ã\81¦サイトのキャッシュを破棄',
+'right-purge' => '確èª\8dã\81ªã\81\97ã\81§サイトのキャッシュを破棄',
 'right-autoconfirmed' => '半保護されたページを編集',
 'right-bot' => '自動処理と認識させる',
 'right-nominornewtalk' => '議論ページの細部の編集をした際に、新着メッセージとして通知しない',
 'right-apihighlimits' => 'API要求でより高い制限値を使用',
 'right-writeapi' => '書き込みAPIを使用',
-'right-delete' => 'ã\83\9aã\83¼ã\82¸ã\81®削除',
+'right-delete' => 'ã\83\9aã\83¼ã\82¸ã\82\92削除',
 'right-bigdelete' => '大きな履歴があるページを削除',
 'right-deletelogentry' => '特定の記録項目を削除/復帰',
 'right-deleterevision' => 'ページの特定の版を削除/復帰',
@@ -1672,7 +1681,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
 'right-unwatchedpages' => 'ウォッチされていないページ一覧を閲覧',
-'right-mergehistory' => 'ページ履歴の統合',
+'right-mergehistory' => 'ページの履歴を統合',
 'right-userrights' => '全利用者権限を編集',
 'right-userrights-interwiki' => '他のウィキの利用者の利用者権限を編集',
 'right-siteadmin' => 'データベースをロックおよびロック解除',
@@ -1683,8 +1692,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 # User rights log
 'rightslog' => '利用者権限変更記録',
 'rightslogtext' => '以下は利用者権限の変更記録です。',
-'rightslogentry' => '$1の所属グループを$2から$3へ変更しました',
-'rightslogentry-autopromote' => '$2 から $3 に自動的に昇格',
+'rightslogentry' => '$1の所属グループを $2 から $3 に変更しました',
+'rightslogentry-autopromote' => '$2 から $3 に自動的に昇格しました',
 'rightsnone' => '(なし)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1767,10 +1776,10 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchangeslinked-toolbox' => '関連ページの更新状況',
 'recentchangeslinked-title' => '「$1」と関連する変更',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
-'recentchangeslinked-summary' => "これはã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\81¾ã\81\9fã\81¯æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81¸ã\81®æ\9c\80è¿\91ã\81®å¤\89æ\9b´ã\81®ä¸\80覧ã\81§ã\81\99ã\80\82
-[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81«ã\81ªã\82\8aます。",
+'recentchangeslinked-summary' => "これはæ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\81¾ã\81\9fã\81¯æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81®æ\9c\80è¿\91ã\81®å¤\89æ\9b´ã\81®ä¸\80覧ã\81§ã\81\99ã\80\82
+[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81§è¡¨ç¤ºã\81\95ã\82\8cます。",
 'recentchangeslinked-page' => 'ページ名:',
-'recentchangeslinked-to' => '代わりに、指定したページへのリンク元での変更を表示',
+'recentchangeslinked-to' => '指定したページの「リンク元」ページの変更を表示',
 
 # Upload
 'upload' => 'ファイルをアップロード',
@@ -2288,13 +2297,13 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 # Special:AllPages
 'allpages' => '全ページ',
 'alphaindexline' => '$1から$2まで',
-'nextpage' => '次のページ($1)',
-'prevpage' => '前のページ($1)',
+'nextpage' => '次のページ ($1)',
+'prevpage' => '前のページ ($1)',
 'allpagesfrom' => '最初に表示するページ:',
 'allpagesto' => '最後に表示するページ:',
 'allarticles' => '全ページ',
-'allinnamespace' => '全ページ($1名前空間)',
-'allnotinnamespace' => '全ページ($1名前空間を除く)',
+'allinnamespace' => '全ページ ($1名前空間)',
+'allnotinnamespace' => '全ページ ($1名前空間以外)',
 'allpagesprev' => '前へ',
 'allpagesnext' => '次へ',
 'allpagessubmit' => '表示',
@@ -2405,7 +2414,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'emailccsubject' => '$1に送信したメールの控え:$2',
 'emailsent' => 'メールを送信しました',
 'emailsenttext' => 'メールを送信しました。',
-'emailuserfooter' => 'このメールは$1から$2へ、{{SITENAME}}の「利用者にメールを送信」機能でお送りしました。',
+'emailuserfooter' => 'このメールは$1から$2へ、{{SITENAME}}の「利用者にメールを送信」機能で送信されました。',
 
 # User Messenger
 'usermessage-summary' => 'システムメッセージを残す。',
@@ -2674,15 +2683,15 @@ $1',
 'tooltip-invert' => '選択した名前空間(チェックされている場合は、関連付けられた名前空間も)のページの変更を非表示にするには、このボックスにチェックを入れる',
 'namespace_association' => '対応付けられた名前空間',
 'tooltip-namespace_association' => '選択した名前空間に関連付けられているトークページまたは対象の名前空間も含めるには、このボックスにチェックを入れる',
-'blanknamespace' => '(標準)',
+'blanknamespace' => '(標準)',
 
 # Contributions
 'contributions' => '利用者の投稿記録',
 'contributions-title' => '$1の投稿記録',
 'mycontris' => '自分の投稿記録',
-'contribsub2' => '利用者:$1($2)',
+'contribsub2' => '利用者: $1 ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
-'uctop' => '(最新)',
+'uctop' => '(最新)',
 'month' => 'これ以前の月:',
 'year' => 'これ以前の年:',
 
@@ -2928,8 +2937,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 手動で統合してください。'''",
 'movedto' => '移動先:',
 'movetalk' => '付随するトークページも移動',
-'move-subpages' => '下位ページも移動($1 件まで)',
-'move-talk-subpages' => 'トークページの下位ページも移動($1 件まで)',
+'move-subpages' => '下位ページも移動 ($1 件まで)',
+'move-talk-subpages' => 'トークページの下位ページも移動 ($1 件まで)',
 'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
 'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
 'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
@@ -3060,7 +3069,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'import-parse-failure' => 'XMLの取り込み構文解析に失敗しました',
 'import-noarticle' => '取り込むページがありません!',
 'import-nonewrevisions' => 'すべての版は以前に取り込み済みです。',
-'xml-error-string' => '$1、$2行の$3文字目($4バイト目):$5',
+'xml-error-string' => '$1、$2 行の $3 文字目 ($4バイト目): $5',
 'import-upload' => 'XMLデータをアップロード',
 'import-token-mismatch' => 'セッションデータを損失しました。
 もう一度試してください。',
@@ -3248,7 +3257,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'pageinfo-edits' => '総編集回数',
 'pageinfo-authors' => '総投稿者数',
 'pageinfo-recent-edits' => '最近の編集回数 (過去 $1)',
-'pageinfo-restriction' => 'ページ保護 (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'ページ保護 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'マジック {{PLURAL:$1|ワード}} ($1)',
 'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
 'pageinfo-templates' => '参照読み込みされた{{PLURAL:$1|テンプレート}} ($1)',
@@ -3281,7 +3290,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'log-show-hide-patrol' => '巡回記録を$1',
 
 # Image deletion
-'deletedrevision' => '古い版$1を削除しました',
+'deletedrevision' => '古い版 $1 を削除しました',
 'filedeleteerror-short' => 'ファイル削除エラー:$1',
 'filedeleteerror-long' => 'ファイルの削除中にエラーが発生しました:
 
@@ -3326,7 +3335,7 @@ $1',
 'newimages-summary' => 'この特別ページでは、最近アップロードされたファイルを表示します。',
 'newimages-legend' => '絞り込み',
 'newimages-label' => 'ファイル名(またはその一部):',
-'showhidebots' => '(ボットを$1)',
+'showhidebots' => '(ボットを$1)',
 'noimages' => '表示できるものがありません。',
 'ilsubmit' => '検索',
 'bydate' => '日付順',
@@ -3460,7 +3469,7 @@ Variants for Chinese language
 'exif-compressedbitsperpixel' => '画像圧縮モード',
 'exif-pixelydimension' => '実効画像の幅',
 'exif-pixelxdimension' => '実効画像の高さ',
-'exif-usercomment' => 'ユーザコメント',
+'exif-usercomment' => 'ã\83¦ã\83¼ã\82¶ã\83¼ ã\82³ã\83¡ã\83³ã\83\88',
 'exif-relatedsoundfile' => '関連音声ファイル',
 'exif-datetimeoriginal' => '原画像データの生成日時',
 'exif-datetimedigitized' => 'デジタルデータの作成日時',
@@ -3858,7 +3867,7 @@ Variants for Chinese language
 $3
 
 もしアカウントの登録をした覚えがない場合は、
-次のURLをブラウザーで開いて、メール確認を中止してください:
+次のURLをブラウザーで開いて、メールアドレスの確認を中止してください:
 
 $5
 
index 2308b5c..d70c2a7 100644 (file)
@@ -294,6 +294,7 @@ $messages = array(
 'index-category' => 'გვერდების ინდექსაცია',
 'noindex-category' => 'არ არსებობს ინდექსირებული გვერდები',
 'broken-file-category' => 'გვერდები ფაილების არასწორი ბმულებით',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -936,7 +937,7 @@ $2
 'sectioneditnotsupported-text' => 'სექციის რედაქტირება გათიშულია ამ გვერდისთვის',
 'permissionserrors' => 'ნებართვის შეცდომა',
 'permissionserrorstext' => 'თქვენ არ გაქვთ ამის გაკეთების უფლება, შემდეგი {{PLURAL:$1|მიზეზის|მიზეზების}} გამო:',
-'permissionserrorstext-withaction' => 'თქვენ არ გაქვთ ამ მოქმედების - $2 განხორციელების ნებართვა შემდეგი $1 მიზეზის გამო:',
+'permissionserrorstext-withaction' => 'თქვენ არ გაქვთ ამ მოქმედების - „$2“ განხორციელების ნებართვა შემდეგი {{PLURAL:$1|მიზეზის|მიზეზის}} გამო:',
 'recreate-moveddeleted-warn' => "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''
 
 გთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.
@@ -1142,6 +1143,7 @@ $1",
 'mergehistory-comment' => 'გადატანა[[:$1]]-ის [[:$2]]-ში: $3',
 'mergehistory-same-destination' => 'თავდაპირველი და სამიზნე გვერდები უნდა განსხვავდებოდეს.',
 'mergehistory-reason' => 'მიზეზი:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'გაერთიანებათა ჟურნალი',
@@ -2103,7 +2105,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => 'აქტიურ მომხმარებელთა სია',
 'activeusers-intro' => 'ეს არის მომხმარებელთა სია, რომელთაც აქვს წვლილი უკანასკნელი $1 {{PLURAL:$1|დღის|დღის}} განმავლობაში.',
-'activeusers-count' => '$1 {{PLURAL:$1|á\83ªá\83\95á\83\98á\83\9aá\83\94á\83\91á\83\90\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\90}} {{PLURAL:$2|$3 á\83\93á\83¦á\83\94|$3 á\83\93á\83¦á\83\98á\83¡|$3 á\83\93á\83¦á\83\94á\83\94á\83\91ის}} განმავლობაში.',
+'activeusers-count' => '$1 {{PLURAL:$1|á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\90\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\90}} {{PLURAL:$2|$3 á\83\93á\83¦á\83\94|$3 á\83\93á\83¦ის}} განმავლობაში.',
 'activeusers-from' => 'მომხმარებელთა ჩვენება, დაწყებული:',
 'activeusers-hidebots' => 'რობოტების დამალვა',
 'activeusers-hidesysops' => 'ადმინისტრატორების დამალვა',
@@ -2169,6 +2171,7 @@ $1',
 # User Messenger
 'usermessage-summary' => 'სისტემური შეტყობინების დატოვება.',
 'usermessage-editor' => 'სისტემური მესენჯერი',
+'usermessage-template' => 'MediaWiki:მომხმარებლის შეტყობინება',
 
 # Watchlist
 'watchlist' => 'ჩემი კონტროლის სია',
@@ -2419,6 +2422,7 @@ $UNWATCHURL
 $1',
 'undelete-show-file-confirm' => 'დარწმუნებული ხართ, რომ გსურთ ფაილ <nowiki>$1</nowiki>-ის წაშლილი ვერსიის ხილვა $2 $3-დან?',
 'undelete-show-file-submit' => 'ჰო',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'სახელთა სივრცე:',
@@ -2803,6 +2807,7 @@ $1',
 'import-error-invalid' => 'გვერდი "$1" იმპორტირება არ მოხდა მიუღებელი სახელის გამო.',
 'import-options-wrong' => 'არასწორი {{PLURAL:$2|პარამეტრი|პარამეტრი}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'ძირეული გვერდის მითითებული სახელი არასწორია.',
+'import-rootpage-nosubpage' => 'სახელტა სივრცეში მითითებულ ძირეულ გვერდში „$1“ ქვეგვერდები დაუშვებელია.',
 
 # Import log
 'importlogpage' => 'იმპორტის ჟურნალი',
@@ -2942,17 +2947,23 @@ $1',
 'pageinfo-header-edits' => 'რედაქტირების ისტორია',
 'pageinfo-header-restrictions' => 'გვერდის დაცვა',
 'pageinfo-header-properties' => 'გვერდის თვისებები',
+'pageinfo-display-title' => 'ნაჩვენები სათაური',
+'pageinfo-default-sort' => 'სტანდარტული სორტირების გასაღები',
+'pageinfo-length' => 'გვერდის სიგრძე (ბაიტებში)',
 'pageinfo-article-id' => 'გვერდის ID',
 'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი',
 'pageinfo-views' => 'ხილვების რაოდენობა',
 'pageinfo-watchers' => 'გვერდის დამკვირვებელთა რაოდენობა',
+'pageinfo-redirects-name' => 'გადამისამართება ამ გვერდზე',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'ამ გვერდის ქვეგვერდები',
 'pageinfo-firstuser' => 'გვერდის შემქნელი',
 'pageinfo-firsttime' => 'გვერდის შექმნის თარიღი',
 'pageinfo-lastuser' => 'ბოლო რედაქტორი',
 'pageinfo-lasttime' => 'ბოლო რედაქტირების თარიღი',
 'pageinfo-edits' => 'რედაქტირებების ჯამური რაოდენობა',
 'pageinfo-authors' => 'განსხვავებულ ავტორთა ჯამური რაოდენობა',
-'pageinfo-restriction' => 'გვერდის დაცვა (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'გვერდის დაცვა ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'ჯადოსნური {{PLURAL:$1|სიტყვა|სიტყვა}} ($1)',
 'pageinfo-hidden-categories' => 'დამალული {{PLURAL:$1|კატეგორია|კატეგორია}} ($1)',
 'pageinfo-templates' => 'ინტეგრირებულია {{PLURAL:$1|თარგი|თარგი}} ($1)',
@@ -3021,6 +3032,8 @@ $1',
 'file-info-png-looped' => 'დარგოლილი',
 'file-info-png-repeat' => 'დაკრულია $1 {{PLURAL:$1|ჯერ}}',
 'file-info-png-frames' => '$1 კადრი',
+'file-no-thumb-animation' => "'''შენიშვნა: ტექნიკური მიზეზების გამო, ამ ფაილის მინიატიურები არ იქნება ანიმირებული.'''",
+'file-no-thumb-animation-gif' => "'''შენიშვნა: ტექნიკური მიზეზების გამო, მაღალი გარჩევადობის GIF ფორმატის სურათების მსგავსი მინიატიურები არ იქნება ანიმირებული.'''",
 
 # Special:NewFiles
 'newimages' => 'ახალი ფაილების გალერეა',
@@ -3613,6 +3626,7 @@ $5
 'ellipsis' => '...',
 'percent' => '$1%',
 'parentheses' => '($1)',
+'brackets' => '[$1]',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr; წინა გვერდი',
@@ -3643,6 +3657,11 @@ $5
 'size-kilobytes' => '$1 კბ',
 'size-megabytes' => '$1 მბ',
 'size-gigabytes' => '$1 გბ',
+'size-terabytes' => '$1 ტბ',
+'size-petabytes' => '$1 პბ',
+'size-exabytes' => '$1 ებ',
+'size-zetabytes' => '$1 ზბ',
+'size-yottabytes' => '$1 იბ',
 
 # Bitrate units
 'bitrate-bits' => '$1 ბ/წმ',
index 28dec21..0bcf016 100644 (file)
@@ -1568,22 +1568,22 @@ $3 келтірілген себебі: ''$2''",
 'upload-tryagain' => 'Файл сипаттамасының өзгерістерін жөнелту',
 'uploadnologin' => 'Кірмегенсіз',
 'uploadnologintext' => 'Файлдарды жүктеу үшін  [[Special:UserLogin|кіруіңіз]] жөн.',
-'upload_directory_missing' => 'Қотарып бермек қалтасы ($1) жетіспейді және веб-сервер жарата алмайды.',
-'upload_directory_read_only' => 'Қотарып бермек қалтасына ($1) веб-сервер жаза алмайды.',
+'upload_directory_missing' => 'Жүктеу қалтасы ($1) жетіспейді және веб-сервер жарата алмайды.',
+'upload_directory_read_only' => 'Жүктеу қалтасына ($1) веб-сервер жаза алмайды.',
 'uploaderror' => 'Жүктеу қатесі',
-'uploadtext' => "Төмендегі пішінді файлдарды қотарып беру үшін қолданыңыз.
-Алдында қотарылып берілген файлдарды қарау не іздеу үшін [[{{#special:FileList}}|қотарып берілген файлдар тізіміне]] барыңыз, тағы да қотарып беруі мен жоюы  [[{{#special:Log}}/upload|қотарып беру журналына]] жазылып алынады.
+'uploadtext' => "Төмендегі пішінді файлдарды жүктеу үшін қолданыңыз.
+Алдында жүктелген файлдарды қарау не іздеу үшін [[Special:FileList|жүктелген файлдар тізіміне]] барыңыз. Сондай-ақ файлдардың жүктелуі [[Special:Log/upload|жүктелі журналына]], ал жойылған файлдар [[Special:Log/delete|жойылу журналына]] жазылады.
 
-СÑ\83Ñ\80еÑ\82Ñ\82Ñ\96 Ð±ÐµÑ\82ке ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83ге, Ñ\84айлÒ\93а Ñ\82Ñ\83Ñ\80а Ñ\81Ñ\96лÑ\82еÑ\83 Ò¯Ñ\88Ñ\96н Ð¼Ñ\8bна Ð¿Ñ\96Ñ\88Ñ\96ндегÑ\96 Ñ\81Ñ\96лÑ\82емені қолданыңыз:
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|балама мәтін]]</nowiki>''' не
-'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>'''.",
+СÑ\83Ñ\80еÑ\82Ñ\82Ñ\96 Ð¼Ð°Ò\9bалаÒ\93а Ò\9bоÑ\81Ñ\83 Ò¯Ñ\88Ñ\96н ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ó\99Ñ\81Ñ\96лдеÑ\80ді қолданыңыз:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' файлдың толық нұсқасын орнату үшін;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|сурет тақырыбы]]</nowiki></code>''' 200px кішірейтілген файлды тақырыбын қосып сол жаққа орналастыру;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' тек файлға сілтеме жасау үшін.",
 'upload-permitted' => 'Рұқсат етілген файл түрлері: $1.',
 'upload-preferred' => 'Ұнамды файл түрлері $1.',
 'upload-prohibited' => 'Рұқсат етілмеген файл түрлері: $1.',
 'uploadlog' => 'жүктеу журналы',
 'uploadlogpage' => 'Жүктеу журналы',
-'uploadlogpagetext' => 'Төменде ең соңғы қотарып берілген файл тізімі.',
+'uploadlogpagetext' => 'Төменде ең соңғы жүктелген файлдар тізімі.',
 'filename' => 'Файл атауы',
 'filedesc' => 'Түйіндемесі',
 'fileuploadsummary' => 'Файл сипаттамасы:',
@@ -1592,7 +1592,7 @@ $3 келтірілген себебі: ''$2''",
 'filesource' => 'Қайнар көзі:',
 'uploadedfiles' => 'Жүктелген файлдар',
 'ignorewarning' => 'Құлақтандыруға елеме де файлды қалайда сақта.',
-'ignorewarnings' => 'Ð\9aез ÐºÐµÐ»Ð³ÐµÐ½ Ò\9bұлаÒ\9bÑ\82андÑ\8bÑ\80Ñ\83лаÑ\80Ò\93а ÐµÐ»ÐµÐ¼Ðµ',
+'ignorewarnings' => 'Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83леÑ\80дÑ\96 ÐµÐ»ÐµÐ¼ÐµÑ\83',
 'minlength1' => 'Файл атауында ең кемінде бір әріп болуы жөн.',
 'illegalfilename' => '«$1» файл атауында бет тақырыбы атында рұқсат берілмеген таңбалар бар.
 Файлды қайта атаңыз да бұны қотарып беруді қайта байқап көріңіз.',
@@ -1616,9 +1616,9 @@ $3 келтірілген себебі: ''$2''",
 * Қотарып берілетін файл атауы: <strong>[[:$1]]</strong>
 * Бар болған файл атауы: <strong>[[:$2]]</strong>
 Өзге атауды таңдаңыз.',
-'fileexists-thumbnail-yes' => "Осы файл — мөлшері кішірітілген сурет ''(нобай)'' сияқты. [[$1|thumb]]
-Бұл <strong>[[:$1]]</strong> деген файлды сынап шығыңыз.
-Егер сыналған файл түпнұсқалы мөлшері бар дәлме-дәл сурет болса, қосысмша нобайды қотарып беру керегі жоқ.",
+'fileexists-thumbnail-yes' => 'Осы файл — мөлшері кішірітілген көшірмесі (нобай) сияқты. [[$1|thumb]]
+Өтініш, <strong>[[:$1]]</strong> деген файлды тексеріңіз.
+Егер көрсетілген файл дәл сіз жүктейін деп жатқан файл болса, онда оның кішірейтілген көшірмесін қайта жүктеудің қажеті жоқ.',
 'file-thumbnail-no' => "Файл атауы <strong>$1</strong> дегенмен басталады.
 Бұл — мөлшері кішірітілген сурет ''(нобай)'' сияқты.
 Егер бұл суреттің толық ажыратылымдығы болса, бұны қотарып беріңіз, әйтпесе файл атауын өзгертіңіз.",
@@ -1627,11 +1627,11 @@ $3 келтірілген себебі: ''$2''",
 'fileexists-shared-forbidden' => 'Осылай аталған файл ортақ қоймада алдақашан бар;
 кері қайтыңыз да, осы файлды жаңа атымен қотарып беріңіз. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:',
-'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
+'uploadwarning' => 'Жүктеу жөнінде құлақтандыру',
 'savefile' => 'Файлды сақтау',
 'uploadedimage' => '«[[$1]]» файлын жүктеді',
 'overwroteimage' => '«[[$1]]» деген файлдың жаңа нұсқасын жүктеді',
-'uploaddisabled' => 'Қотарып беру өшірілген',
+'uploaddisabled' => 'Жүктеу өшірілген',
 'copyuploaddisabled' => 'URL арқылы жүктеу өшірілген.',
 'uploaddisabledtext' => '{{SITENAME}} жобасында файл қотарып беруі өшірілген.',
 'uploadscripted' => 'Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.',
@@ -1639,26 +1639,25 @@ $3 келтірілген себебі: ''$2''",
 'upload-source' => 'Қайнар файл',
 'sourcefilename' => 'Қайнар файл атауы:',
 'sourceurl' => 'Қайнардың URL-мекенжайы:',
-'destfilename' => 'Ð\9dÑ\8bÑ\81ана Ñ\84айл атауы:',
+'destfilename' => 'Файл атауы:',
 'upload-maxfilesize' => 'Файлдың ең көп мүмкін мөлшері: $1',
 'upload-description' => 'Файл сипаттамасы',
 'upload-options' => 'Жүктеу баптаулары',
 'watchthisupload' => 'Осы файлды бақылау',
-'filewasdeleted' => 'Бұл атауы бар файл бұрын қотарып берілген де бері келе жойылған.
-Бұны қайта қотарып беру алдынан $1 дегенді тексеріп шығыңыз.',
+'filewasdeleted' => 'Бұндай атаумен файл бұрын жүктелген болатын, бірақ кейін жойылды. Бұны қайта жүктеу алдында $1 дегенді тексеріп шығыңыз.',
 'filename-bad-prefix' => "Қотарып бермек файлыңыздың атауы '''«$1» ''' деп басталады, мынадай сипаттаусыз атауды әдетте сандық камералар өздіктік береді.
 Файлыңызға сипаттылау атауды таңдаңыз.",
-'upload-success-subj' => 'Сәтті қотарып берілді',
+'upload-success-subj' => 'Сәтті жүктелді',
 'upload-failure-subj' => 'Жүктеу мәселесі',
 'upload-warning-subj' => 'Жүктеу кезіндегі ескерту',
 
 'upload-proto-error' => 'Бұрыс хаттама',
-'upload-proto-error-text' => 'Шеттен қотарып беру үшін URL жайлары <code>http://</code> немесе <code>ftp://</code> дегендерден басталу жөн.',
+'upload-proto-error-text' => 'Шеттен жүктеу үшін URL жайлары <code>http://</code> немесе <code>ftp://</code> дегендерден басталу жөн.',
 'upload-file-error' => 'Ішкі қате',
 'upload-file-error-text' => 'Серверде уақытша файл құрылуы ішкі қатесіне ұшырасты.
 Бұл жүйенің әкімшімен қатынасыңыз.',
-'upload-misc-error' => 'Қотарып беру кезіндегі белгісіз қате',
-'upload-misc-error-text' => 'Қотарып беру кезінде белгісіз қатеге ұшырасты.
+'upload-misc-error' => 'Жүктеу кезіндегі белгісіз қате',
+'upload-misc-error-text' => 'Жүктеу кезінде белгісіз қатеге ұшырасты.
 URL жарамды және қатынаулы екенін тексеріп шығыңыз да қайта байқап көріңіз.
 Егер бұл мәселе әлде де қалса, жүйе әкімшімен қатынасыңыз.',
 'upload-too-many-redirects' => 'URL шектен тыс жылжытуларға ие',
@@ -1671,7 +1670,7 @@ URL жарамды және қатынаулы екенін тексеріп ш
 'upload-curl-error6' => 'URL жетілмеді',
 'upload-curl-error6-text' => 'Келтірілген URL жетілмеді.
 URL дұрыс екендігін және торап істеп тұрғанын қос тексеріңіз.',
-'upload-curl-error28' => 'Қотарып беру уақыты бітті',
+'upload-curl-error28' => 'Жүктеу уақыты бітті',
 'upload-curl-error28-text' => 'Тораптың жауап беруі тым ұзақ уақытқа созылды.
 Бұл торап істе екенін тексеріп шығыңыз, азғана кідіре тұрыңыз да қайта байқап көріңіз.
 Талабыңызды қол тиген кезінде қайта байқап көруіңіз мүмкін.',
@@ -1717,7 +1716,7 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'morelinkstoimage' => 'Бұл файлдың [[Special:WhatLinksHere/$1|көбірек сілтемелерін]] қарау.',
 'duplicatesoffile' => 'Келесі {{PLURAL:$1|файл бұл файлдың телнұсқасы|$1 файл бұл файлдың телнұсқалары}}:',
 'sharedupload' => 'Бұл файл ортақ қоймаға қотарып берілген сондықтан басқа жобаларда қолдануы мүмкін.',
-'uploadnewversion-linktext' => 'Бұл файлдың жаңа нұсқасын қотарып беру',
+'uploadnewversion-linktext' => 'Бұл файлдың жаңа нұсқасын жүктеу',
 
 # File reversion
 'filerevert' => '$1 дегенді қайтару',
@@ -2404,7 +2403,7 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 бет өзінің үстіне жылжытылмайды.',
 'imagenocrossnamespace' => 'Файл емес есім аясына файл жылжытылмайды',
 'imagetypemismatch' => 'Файлдың жаңа кеңейтімі бұның түріне сәйкес емес',
-'imageinvalidfilename' => 'Ð\9dÑ\8bÑ\81ана Ñ\84айл атауы жарамсыз',
+'imageinvalidfilename' => 'Файл атауы жарамсыз',
 'move-leave-redirect' => 'Ескі бетте айдату сілтемесін қалдыру',
 
 # Export
index c9c09ff..8946a7c 100644 (file)
@@ -2951,7 +2951,7 @@ $1',
 'pageinfo-authors' => 'ចំនួនអ្នកនិពន្ធសរុប',
 'pageinfo-recent-edits' => 'ចំនួនការកែប្រែថ្មីៗ (ក្នុងរយៈពេល $1 កន្លងទៅនេះ)',
 'pageinfo-recent-authors' => 'ចំនួនអ្នកនិពន្ធថ្មីៗនេះ',
-'pageinfo-restriction' => 'ការការពារទំព័រ (<code>{{$1}}</code>)',
+'pageinfo-restriction' => 'ការការពារទំព័រ ({{$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|ពាក្យ|ពាក្យ}} វេទមន្ត ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}ដែលបានលាក់ ($1)',
 
index 210e2c3..bb67198 100644 (file)
@@ -608,9 +608,9 @@ $1',
 'youhavenewmessages' => '다른 사용자가 $1란에 글을 남겼습니다. ($2)',
 'newmessageslink' => '사용자 토론',
 'newmessagesdifflink' => '바뀐 내용 비교',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자|$3 사용자}}가 $1란에 글을 남겼습니다. ($2)',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1란에 글을 남겼습니다. ($2)',
 'youhavenewmessagesmanyusers' => '여러 사용자가 $1란에 글을 남겼습니다. ($2)',
-'newmessageslinkplural' => '{{PLURAL:$1|ì\83\88 ë©\94ì\8b\9cì§\80}}',
+'newmessageslinkplural' => '{{PLURAL:$1|ì\82¬ì\9a©ì\9e\90 í\86 ë¡ }}',
 'newmessagesdifflinkplural' => '최근 {{PLURAL:$1|바뀜}}',
 'youhavenewmessagesmulti' => '다른 사용자가 $1란에 글을 남겼습니다.',
 'editsection' => '편집',
@@ -1293,7 +1293,8 @@ $1",
 'revdelete-only-restricted' => '$1 $2 버전 숨기기 오류: 다른 숨기기 설정을 같이 설정하지 않고 관리자가 보지 못하도록 특정 판을 숨길 수 없습니다.',
 'revdelete-reason-dropdown' => '*일반적인 삭제 이유
 ** 저작권 침해
-** 부적절한 개인 정보
+** 부적절한 의견과 개인 정보
+** 부적절한 이름
 ** 잠재적인 비방 정보',
 'revdelete-otherreason' => '다른 이유/부가적인 이유',
 'revdelete-reasonotherlist' => '다른 이유',
@@ -1337,7 +1338,7 @@ $1",
 'mergelogpagetext' => '다음은 한 문서의 역사를 다른 문서의 역사와 합친 최근 기록입니다.',
 
 # Diffs
-'history-title' => '"$1"  문서의 바뀜 내역',
+'history-title' => '"$1" 문서의 바뀜 내역',
 'difference-title' => '"$1"의 두 판 사이의 차이',
 'difference-title-multipage' => '문서 "$1"(와)과 "$2" 사이의 차이',
 'difference-multipage' => '(문서 사이의 차이)',
@@ -1389,7 +1390,7 @@ $1",
 'search-result-score' => '유사도: $1%',
 'search-redirect' => '($1에서 넘어옴)',
 'search-section' => '($1 문단)',
-'search-suggest' => '$1 문서를 찾고 있요?',
+'search-suggest' => '$1 문서를 찾고 있으신가요?',
 'search-interwiki-caption' => '자매 프로젝트',
 'search-interwiki-default' => '$1 결과:',
 'search-interwiki-more' => '(더 보기)',
@@ -1429,7 +1430,7 @@ $1",
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
-'mypreferences' => '내 사용자 환경 설정',
+'mypreferences' => '사용자 환경 설정',
 'prefs-edits' => '편집 횟수:',
 'prefsnologin' => '로그인하지 않음',
 'prefsnologintext' => '사용자 환경 설정을 바꾸려면 먼저 <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 로그인]</span>해야 합니다.',
@@ -1499,7 +1500,7 @@ $1",
 'prefs-files' => '파일',
 'prefs-custom-css' => '사용자 CSS',
 'prefs-custom-js' => '사용자 자바스크립트',
-'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/JavaScript:',
+'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/자바스크립트:',
 'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
 복구할 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
@@ -2708,7 +2709,7 @@ $1',
 차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.
 차단 이유를 같이 적어주세요(예: 특정 문서 훼손).',
 'ipadressorusername' => 'IP 주소 또는 사용자 이름:',
-'ipbexpiry' => '기:',
+'ipbexpiry' => '기:',
 'ipbreason' => '이유:',
 'ipbreasonotherlist' => '다른 이유',
 'ipbreason-dropdown' => '*일반적인 차단 이유
@@ -3074,7 +3075,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-pt-anonuserpage' => '현재 사용하는 IP의 사용자 문서',
 'tooltip-pt-mytalk' => '내 토론 문서',
 'tooltip-pt-anontalk' => '현재 사용하는 IP를 위한 사용자 토론 문서',
-'tooltip-pt-preferences' => '내 사용자 환경 설정',
+'tooltip-pt-preferences' => '사용자 환경 설정',
 'tooltip-pt-watchlist' => '주시문서에 대한 바뀜 목록',
 'tooltip-pt-mycontris' => '내가 편집한 글',
 'tooltip-pt-login' => '꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.',
@@ -3226,7 +3227,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-authors' => '총 서로 다른 편집자 수',
 'pageinfo-recent-edits' => '최근 편집 수 (지난 $1일 이내)',
 'pageinfo-recent-authors' => '최근 기여자 수',
-'pageinfo-restriction' => '문서 보호 (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => '문서 보호 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
 'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
 'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
index 36efed7..339816c 100644 (file)
@@ -1079,8 +1079,10 @@ Dir hutt keen Zougang dozou.',
 Kuckt w.e.g. an de Logbicher no.",
 'revdelete-only-restricted' => 'Feler beim verstoppe vum Objet vum $2, $1: Dir kënnt keng Objete virun den Administrateure verstoppen ouni och eng vun den aneren Optiounen vum weisen erauszesichen.',
 'revdelete-reason-dropdown' => "* Generell Läschgrënn
-**Verletzung vun den Droits d'Auteur
-**Net ubruechte perséinlech Informatioun",
+** Verletzung vun den Droits d'Auteur
+** Net ubruechte perséinlech Informatioun
+** Inadequate Benotzernumm
+** Informatioun déi beleidege kann",
 'revdelete-otherreason' => 'Aneren/zousätzleche Grond:',
 'revdelete-reasonotherlist' => 'Anere Grond:',
 'revdelete-edit-reasonlist' => 'Läschgrënn änneren',
@@ -2894,6 +2896,7 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-title' => 'Informatioun iwwer "$1"',
 'pageinfo-header-basic' => 'Basisinformatiounen',
 'pageinfo-header-edits' => 'Historique vun den Ännerungen',
+'pageinfo-header-restrictions' => 'Spär vun der Säit',
 'pageinfo-display-title' => 'Titel dee gewise gëtt',
 'pageinfo-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
 'pageinfo-watchers' => "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
@@ -2905,9 +2908,10 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-edits' => 'Gesamtzuel vun den Ännerungen',
 'pageinfo-authors' => 'Gesamtzuel vun de verschiddenen Auteuren',
 'pageinfo-recent-edits' => 'Zuel vun de rezenten Ännerungen (an de leschten $1)',
-'pageinfo-restriction' => 'Protectioun vun der Säit (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protectioun vun der Säit ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magescht Wuert|Magesch Wierder}} ($1)',
 'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
+'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -2961,6 +2965,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'file-info-size-pages' => '$1 × $2 Pixelen, Gréisst vum Fichier: $3, MIME Typ: $4, $5 {{PLURAL:$5|Säit|Säiten}}',
 'file-nohires' => 'Et gëtt keng méi héich Opléisung.',
 'svg-long-desc' => 'SVG-Fichier, Basisgréisst: $1 × $2 Pixel, Gréisst vum Fichier: $3',
+'svg-long-desc-animated' => 'Animéierten SVG-Fichier, Basisgréisst $1 x $2 Pixel, Gréisst vum Fichier: $3',
 'show-big-image' => 'Voll Opléisung',
 'show-big-image-preview' => 'Gréisst vun dësem Preview: $1.',
 'show-big-image-other' => 'Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.',
@@ -2970,6 +2975,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'file-info-png-looped' => 'endlos Schleef',
 'file-info-png-repeat' => 'gouf $1 {{PLURAL:$1|mol|mol}} gespillt',
 'file-info-png-frames' => '$1 {{PLURAL:$1|Frame|Framen}}',
+'file-no-thumb-animation' => "''''Informatioun: Wéinst technesche Limitatioune sinn d'Miniatur-Biller vun dësem Fichier net animéiert.'''",
 
 # Special:NewFiles
 'newimages' => 'Gallerie vun den neie Biller',
index dccadb8..b9e2f49 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kumariprity
  * @author Manojberma77
  * @author Meno25
+ * @author Nemo bis
  * @author Priyanka.rachna.jha
  * @author Rajesh
  * @author Reedy
@@ -3532,8 +3533,8 @@ $5
 'logentry-move-move-noredirect' => '$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआकेँ बिना छोड़ने',
 'logentry-move-move_redir' => '$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतिरिक्त',
 'logentry-move-move_redir-noredirect' => '$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतितिक्त घुमौआकेँ बिना छोड़ने',
-'logentry-patrol-patrol' => '$1 {{लिंग:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित',
-'logentry-patrol-patrol-auto' => '$1 स्वतः {{लिंग:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित',
+'logentry-patrol-patrol-auto' => '$1 स्वतः {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित',
 'logentry-newusers-newusers' => '$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता',
 'logentry-newusers-create' => '$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता',
 'logentry-newusers-create2' => '$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3',
index b664588..d2fb136 100644 (file)
@@ -1294,7 +1294,9 @@ $1",
 'revdelete-only-restricted' => 'Грешка при сокривањето на записот од $2, $1: не можете да криете записи од администратори без воедно да изберете едно од другите нагодувања на видливоста.',
 'revdelete-reason-dropdown' => '*Вообичаени причини за бришење
 ** Прекршување на авторски права
-** Несоодветни лични информации',
+** Неумесни коментари или лични информации
+** Неумесно корисничко име
+** Потенцијално клеветнички информации',
 'revdelete-otherreason' => 'Друга/дополнителна причина:',
 'revdelete-reasonotherlist' => 'Друга причина',
 'revdelete-edit-reasonlist' => 'Уреди причини за бришење',
@@ -3220,7 +3222,7 @@ $1',
 'pageinfo-authors' => 'Број на засебни автори',
 'pageinfo-recent-edits' => 'Број на скорешни уредувања (во последните $1)',
 'pageinfo-recent-authors' => 'Број на скорешни засебни автори',
-'pageinfo-restriction' => 'Заштита на страницата (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Заштита на страницата ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Волшебен збор|Волшебни зборови}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
index f2f8323..281ff04 100644 (file)
@@ -1094,6 +1094,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'node-count-exceeded-warning' => 'താൾ നോഡ്-എണ്ണം അധികരിച്ചിരിക്കുന്നു',
 'expansion-depth-exceeded-category' => 'വികസന ആഴം അധികരിച്ച താളുകൾ',
 'expansion-depth-exceeded-warning' => 'താളിന്റെ വികസന ആഴം അധികരിച്ചിരിക്കുന്നു',
+'converter-manual-rule-error' => 'മാനുഷികമായുള്ള ഭാഷാ പരിവർത്തന നിയമത്തിൽ പിഴവ് കണ്ടെത്തി',
 
 # "Undo" feature
 'undo-success' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്‌. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
@@ -1231,7 +1232,8 @@ $1",
 'revdelete-only-restricted' => '$2, $1 തീയതിയിലെ ഇനം മറയ്ക്കുന്നതിൽ പിഴവ്: ഒതുക്കലിനുള്ള മറ്റ് ഐച്ഛികങ്ങളിലൊന്ന് തിരഞ്ഞെടുക്കാതെ ഇനങ്ങൾ കാര്യനിർവാഹകരുടെ ദൃഷ്ടിയിൽ നിന്നും ഒതുക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
 'revdelete-reason-dropdown' => '*മായ്ക്കാനുള്ള സാധാരണ കാരണങ്ങൾ
 **പകർപ്പവകാശ ലംഘനം
-**അനുയോജ്യമല്ലാത്ത വ്യക്തി വിവരങ്ങൾ
+**അനുയോജ്യമല്ലാത്ത കുറിപ്പ് അല്ലെങ്കിൽ വ്യക്തി വിവരങ്ങൾ
+**അനുയോജ്യമല്ലാത്ത ഉപയോക്തൃനാമം
 **അടിസ്ഥാനപരമായി ദോഷകരമാകുന്ന വിവരങ്ങൾ',
 'revdelete-otherreason' => 'മറ്റ്/കൂടുതൽ കാരണം:',
 'revdelete-reasonotherlist' => 'മറ്റ് കാരണം',
@@ -3101,7 +3103,7 @@ $1',
 'pageinfo-authors' => 'ആകെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
 'pageinfo-recent-edits' => 'സമീപകാലത്തെ തിരുത്തുകൾ (കഴിഞ്ഞ $1 കാലയളവിനുള്ളിൽ)',
 'pageinfo-recent-authors' => 'സമീപകാലത്തെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
-'pageinfo-restriction' => 'താൾ സംരക്ഷണം (<code>$1</code>)',
+'pageinfo-restriction' => 'താൾ സംരക്ഷണം ($1)',
 'pageinfo-magic-words' => 'മാന്ത്രിക{{PLURAL:$1|വാക്ക്|വാക്കുകൾ}} ($1)',
 'pageinfo-hidden-categories' => 'മറഞ്ഞിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}} ($1)',
 'pageinfo-templates' => 'ഉൾപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}} ($1)',
@@ -3374,7 +3376,7 @@ $1',
 'exif-rightscertificate' => 'അവകാശകൈകാര്യ യോഗ്യതാപത്രം',
 'exif-copyrighted' => 'പകർപ്പവകാശ സ്ഥിതി',
 'exif-copyrightowner' => 'പകർപ്പവകാശ ഉടമ',
-'exif-usageterms' => 'ഉപയോഗ നിബന്ധനകൾ',
+'exif-usageterms' => 'ഉപയോഗനിബന്ധനകൾ',
 'exif-webstatement' => 'ഓൺലൈൻ പകർപ്പവകാശക്കുറിപ്പ്',
 'exif-originaldocumentid' => 'യഥാർത്ഥ രേഖയുടെ അനന്യമായ ഐ.ഡി.',
 'exif-licenseurl' => 'പകർപ്പവകാശ അനുമതിയുടെ യൂ.ആർ.എൽ.',
index da1ea47..8535f62 100644 (file)
@@ -2976,7 +2976,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'pageinfo-authors' => 'Jumlah pengarang yang berlainan',
 'pageinfo-recent-edits' => 'Bilangan suntingan terkini (dalam $1 yang lalu)',
 'pageinfo-recent-authors' => 'Bilangan pengarang berbeza yang terkini',
-'pageinfo-restriction' => 'Perlindungan halaman (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Perlindungan halaman ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'Kata sakti ($1)',
 'pageinfo-hidden-categories' => 'Kategori tersembunyi ($1)',
 'pageinfo-templates' => 'Templat tertransklusi ($1)',
index 3a9a45f..fd59cc0 100644 (file)
@@ -1701,7 +1701,7 @@ It-tlugħ ta' fajls tal-Java mhuwiex permess, minħabba li jistgħu jaqbżu rest
 'upload-source' => 'Sors tal-fajl',
 'sourcefilename' => 'L-isem tal-fajl tal-oriġini:',
 'sourceurl' => 'Sors tal-URL:',
-'destfilename' => 'L-Isem tal-fajl tad-destinazzjoni:',
+'destfilename' => "Isem tal-fajl ta' destinazzjoni:",
 'upload-maxfilesize' => 'Daqs massimu tal-fajl: $1',
 'upload-description' => 'Deskrizzjoni tal-fajl',
 'upload-options' => 'Opzjonijiet għat-tlugħ tal-fajl',
index 710adeb..9ad4238 100644 (file)
@@ -92,7 +92,7 @@ $messages = array(
 'tog-watchcreations' => 'Moaquiāz in āmatl mā niquinyōcoya īhuān in tlahcuilōlli mā niquinquetza īpan notlachiyaliz',
 'tog-watchdefault' => 'Moaquiāz āmatl īhuān tlahcuilōlli mā niquinpatla in notlachiyaliz',
 'tog-watchmoves' => 'Moaquiāz āmatl īhuān tlahcuilōlli mā niquinzaca in notlachiyaliz',
-'tog-watchdeletion' => 'Moaquiāz āmatl īhuān tlahcuilōlli mā niquinpolo in notlachiyaliz',
+'tog-watchdeletion' => 'Moaquiāz āmatl īhuān tlahcuilōlli mā niquimpolo in notlachiyaliz',
 'tog-minordefault' => 'Ticmachiyōtīz mochīntīn tlapatlalitzintli ic default',
 'tog-previewontop' => 'Tiquittāz achtochīhualiztli achtopa tlapatlaliztli caxitl',
 'tog-previewonfirst' => 'Xiquitta achtochīhualiztli inic cē tlapatlalizpan',
@@ -451,9 +451,9 @@ Occeppa xicalaqui niman ticmatīz.',
 'italic_sample' => 'Cōliuhqui tlahcuilōliztli',
 'italic_tip' => 'Cōliuhqui tlahcuilōliztli',
 'link_sample' => 'Tzonhuiliztli ītōcā',
-'link_tip' => 'Tzonhuiliztli tlahtic',
-'extlink_sample' => 'http://www.example.com Tōcāitl',
-'extlink_tip' => 'Tzonhuilizcallān (xitequitiltia http://)',
+'link_tip' => 'Tlahtic tzonhuiliztli',
+'extlink_sample' => 'http://www.machiyōtl.com Tzonhuiliztōcāitl',
+'extlink_tip' => 'Calān tzonhuiliztli (xiquilnamiqui ticaquiāz in http://)',
 'headline_sample' => 'Cuātlahcuilōlli',
 'headline_tip' => 'Iuhcāyōtl 2 tōcāyōtl',
 'image_sample' => 'Machiyōtl.jpg',
@@ -465,7 +465,7 @@ Occeppa xicalaqui niman ticmatīz.',
 # Edit pages
 'summary' => 'Mopatlaliz:',
 'subject' => 'Tōcāitl/Āmoxmachiyōtl:',
-'minoredit' => 'Inīn cah tlapatlalitzintli',
+'minoredit' => 'Inīn tlapatlaliztli tepitōn',
 'watchthis' => 'Tictlachiyāz inīn zāzanilli',
 'savearticle' => 'Ticpiyāz',
 'preview' => 'Xiquitta achtochīhualiztli',
@@ -588,7 +588,7 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'revertmerge' => 'Tiquīxipehuaz',
 
 # Diffs
-'history-title' => '"$1" tlahcuilōlloh ītlachiyaliz',
+'history-title' => '«$1» tlahcuilōlloh ītlaihittaliz',
 'lineno' => 'Pāntli $1:',
 'editundo' => 'Tichuelōz',
 'diff-multi' => '({{PLURAL:$1|Cē tlapatlaliztli nepantlah ahmo motta in ōquichīuh|$1 Tlapatlaliztli nepantlah ahmo mottah in ōquinchīuh}}  {{PLURAL:$2|cē tlatequitiltilīlli|$2 tlatequitiltilīltin}})',
@@ -615,7 +615,7 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'search-result-size' => '$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})',
 'search-redirect' => '(tlacuepaliztli $1)',
 'search-section' => '(tlahtōltzintli $1)',
-'search-suggest' => 'Mohtoa ahnozo: $1',
+'search-suggest' => 'Ahnōceh tiquihtōznequiya: $1',
 'search-interwiki-caption' => 'Tlachīhualiztli īcnīhuān',
 'search-interwiki-more' => '(huehca ōmpa)',
 'search-relatedarticle' => 'Ītechcopa',
@@ -850,7 +850,7 @@ Timitztlātlauhtiah, xitlahcuiloa occē tōcāitl.',
 'filehist-dimensions' => 'Octacayōtl',
 'filehist-comment' => 'TlahtōIcaquiliztīlōni',
 'imagelinks' => 'Tlahcuilōlli tlanemītīliztli',
-'linkstoimage' => 'Inīn {{PLURAL:$1|zāzanilli tzonhuilia|$1 zāzaniltin tzonhuiliah}} inīn tlahcuilōlhuīc:',
+'linkstoimage' => 'Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:',
 'nolinkstoimage' => 'Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.',
 'morelinkstoimage' => 'Tiquinttāz [[Special:WhatLinksHere/$1|achi tzonhuiliztli]] inīn tlahcuilōlhuīc.',
 'duplicatesoffile' => 'Inōn {{PLURAL:$1|tlahcuilōlli cah|$1 tlahcuilōlli cateh}} ōntiah inīn zāzanilli ([[Special:FileDuplicateSearch/$2|ocahci]]):',
@@ -1302,7 +1302,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-ca-nstab-category' => 'Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl',
 'tooltip-minoredit' => 'Ticmachiyōz quemeh tlapatlalitzintli',
 'tooltip-save' => 'Ticpiyāz mopatlaliz',
-'tooltip-preview' => 'Xiquitta achtopa mopatlaliz, ¡timitztlātlauhtiah quitēquitiltilia achto ticpiya!',
+'tooltip-preview' => 'Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!',
 'tooltip-diff' => 'Xiquitta in tlein ōticpatlāz tlahcuilōlco.',
 'tooltip-compareselectedversions' => 'Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.',
 'tooltip-watch' => 'Ticcēntilīz inīn zāzanilli motlachiyalizhuīc',
index b1f60f1..bbd811d 100644 (file)
@@ -3105,7 +3105,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-authors' => 'Totalt antall forskjellige forfattere',
 'pageinfo-recent-edits' => 'Antall nylige redigeringer (innen siste $1)',
 'pageinfo-recent-authors' => 'Antall nylige forfattere',
-'pageinfo-restriction' => 'Sidebeskyttelse (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Sidebeskyttelse ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
 'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
index 714892d..fc6380c 100644 (file)
@@ -319,7 +319,7 @@ $messages = array(
 'tog-numberheadings' => 'Koppen vanzelf nummeren',
 'tog-showtoolbar' => 'Laot de warkbalke zien',
 'tog-editondblclick' => 'Mit dubbelklik bewarken (JavaScript)',
-'tog-editsection' => 'Mit bewarkgedeeltes',
+'tog-editsection' => 'Mit bewarkgedeelten',
 'tog-editsectiononrightclick' => 'Bewarkgedeelte mit rechtermuusknoppe bewarken (JavaScript)',
 'tog-showtoc' => 'Samenvatting laoten zien van de zaken die an bod koemen (mit meer as dree onderwarpen)',
 'tog-rememberpassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
@@ -572,6 +572,10 @@ $1",
 'youhavenewmessages' => 'Je hebben $1 ($2).',
 'newmessageslink' => 'nieje berichten',
 'newmessagesdifflink' => 'verschil mit de veurige versie',
+'youhavenewmessagesfromusers' => 'Je hebben $1 van {{PLURAL:$3|n aandere gebruker|$3 gebrukers}} ($2).',
+'youhavenewmessagesmanyusers' => 'Je hebben $1 van n bulte gebrukers ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|n niej bericht|nieje berichten}}',
+'newmessagesdifflinkplural' => 'leste {{PLURAL:$1|wieziging|wiezigingen}}',
 'youhavenewmessagesmulti' => 'Je hebben nieje berichten op $1',
 'editsection' => 'bewark',
 'editold' => 'bewark',
@@ -628,9 +632,9 @@ De oorzake hiervan kan dujen op n fout in de programmatuur.
 Der is n syntaxisfout in t databankeverzeuk op-etrejen.
 t Kan ween dat der n fout in de programmatuur zit.
 De leste zeukpoging in de databanke was:
-<blockquote><tt>$1</tt></blockquote>
-vanuut de funksie "<tt>$2</tt>".
-De databanke gaf de volgende foutmelding "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+vanuut de funksie "<code>$2</code>".
+De databanke gaf de volgende foutmelding "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Der is n syntaxisfout in t databankeverzeuk op-etrejen.
 t Leste veurzeuk an de databanke was:
 "$1"
@@ -720,6 +724,7 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te ste
 'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
 'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
 'yourdomainname' => 'Joew domein',
+'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
 'externaldberror' => 'Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.',
 'login' => 'Anmelden',
 'nav-login-createaccount' => 'Anmelden',
@@ -965,6 +970,10 @@ of [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse zied bewarken]</span>.',
 'noarticletext-nopermission' => 'Op disse zied steet gien tekste.
 Je kunnen [[Special:Search/{{PAGENAME}}|zeuken naor disse term]] in aandere ziejen of
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken deurzeuken]</span>.',
+'missing-revision' => 'De versie #$1 van de zied "{{PAGENAME}} besteet niet.
+
+Dit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.
+Waorschienlik ku\'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].',
 'userpage-userdoesnotexist' => 'Je bewarken n gebrukerszied van n gebruker die niet besteet (gebruker "<nowiki>$1</nowiki>"). Kiek effen nao o\'j disse zied wel anmaken/bewarken willen.',
 'userpage-userdoesnotexist-view' => 'Gebruker "$1" steet hier niet in-eschreven',
 'blocked-notice-logextract' => 'Disse gebruker is op t moment eblokkeerd.
@@ -973,7 +982,6 @@ De leste regel uut t blokkeerlogboek steet hieronder as referensie:',
 *'''Firefox / Safari:''' drok op ''Shift'' terwiel je op ''verniejen'' klikken, of gebruuk ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-R'' op n knipperkiste van Mac)
 * '''Google Chrome:''' drok op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op n knipperkiste van Mac)
 *'''Internet Explorer:''' drok op ''Ctrl'' terwiel je op ''verniejen'' klikken of drok op ''Ctrl-F5''
-*'''Konqueror: '''klik op ''verniejen'' of drok op ''F5''
 *'''Opera:''' leeg t tussengeheugen in ''Extra → Voorkeuren\"",
 'usercssyoucanpreview' => "'''Tip:''' gebruuk de knoppe \"{{int:showpreview}}\" um joew nieje css/js nao te kieken veurda'j t opslaon.",
 'userjsyoucanpreview' => "'''Tip:''' gebruuk de knoppe \"{{int:showpreview}}\" um joew nieje css/js nao te kieken veurda'j t opslaon.",
@@ -1088,6 +1096,7 @@ Sommigen mallen wörden niet in-evoegd.',
 'expansion-depth-exceeded-warning' => 'Op disse zied staon te veule mallen',
 'parser-unstrip-loop-warning' => 'Der is n "unstrip"-lusse evunnen',
 'parser-unstrip-recursion-limit' => 'De rekursielimiet ($1) veur "unstrip" is overschrejen',
+'converter-manual-rule-error' => 'Der is n fout evunnen in n haandmaotig in-evoegden taalkonversieregel.',
 
 # "Undo" feature
 'undo-success' => 'De bewarking kan weerummedreid wörden. Kiek de vergelieking hieronder nao um der wisse van de ween dat alles goed is, en slao de de zied op um de bewarking weerumme te dreien.',
@@ -1269,6 +1278,10 @@ In de [[Special:BlockList|blokkeerlieste]] bin de blokkeringen, die noen van toe
 'editundo' => 'weerummedreien',
 'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies}} van {{PLURAL:$2|1 gebruker|$2 gebrukers}} tussen die der niet bie staon.)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)',
+'difference-missing-revision' => "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.
+
+Dit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.
+Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
 
 # Search results
 'searchresults' => 'Zeukresultaoten',
@@ -1626,7 +1639,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'recentchanges-label-minor' => 'Dit is n kleine wieziging',
 'recentchanges-label-bot' => 'Disse bewarking is uutevoerd deur n bot',
 'recentchanges-label-unpatrolled' => 'Disse bewarking is nog niet nao-ekeken',
-'rcnote' => "Hieronder {{PLURAL:$1|steet de leste bewarking|staon de leste '''$1''' bewarkingen}} van de aofeleupen {{PLURAL:$2|dag|'''$2''' dagen}} (stand: $5, $4).",
+'rcnote' => "Hieronder {{PLURAL:$1|steet de leste bewarking|staon de leste '''$1''' bewarkingen}} van de aofgeleupen {{PLURAL:$2|dag|'''$2''' dagen}} (per: $5, $4).",
 'rcnotefrom' => 'Dit bin de wiezigingen sinds <b>$2</b> (maximum van <b>$1</b> wiezigingen).',
 'rclistfrom' => 'Bekiek wiezigingen vanaof $1',
 'rcshowhideminor' => '$1 kleine wiezigingen',
@@ -1635,7 +1648,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'rcshowhideanons' => '$1 anonieme gebrukers',
 'rcshowhidepatr' => '$1 nao-ekeken bewarkingen',
 'rcshowhidemine' => '$1 mien bewarkingen',
-'rclinks' => 'Bekiek de leste $1 wiezigingen van de aofeleupen $2 dagen<br />$3',
+'rclinks' => 'Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen<br />$3',
 'diff' => 'wiezig',
 'hist' => 'gesch',
 'hide' => 'verbarg',
@@ -1952,6 +1965,7 @@ Je kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.',
 'uploadnewversion-linktext' => 'n Niejere versie van dit bestaand opsturen.',
 'shared-repo-from' => 'uut $1',
 'shared-repo' => 'n edeelden mediadatabanke',
+'upload-disallowed-here' => 'Je kunnen disse aofbeelding niet overschrieven.',
 
 # File reversion
 'filerevert' => '$1 weerummedreien',
@@ -2032,9 +2046,9 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 
 'disambiguations' => 'Ziejen die verwiezen naor deurverwiesziejen',
 'disambiguationspage' => 'Template:Dv',
-'disambiguations-text' => "De onderstaonde ziejen verwiezen naor n '''deurverwieszied'''. Disse verwiezingen mutten eigenliks rechtstreeks verwiezen naor t juuste onderwarp.
-
-Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Hieronder staon ziejen mit tenminsten één verwiezing naor n '''deurverwieszied'''. 
+Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
+Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
@@ -2059,6 +2073,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorie|kategorieën}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwikiverwiezing|interwikiverwiezingen}}',
 'nlinks' => '$1 {{PLURAL:$1|verwiezing|verwiezingen}}',
 'nmembers' => '$1 {{PLURAL:$1|onderwarp|onderwarpen}}',
 'nrevisions' => '$1 {{PLURAL:$1|versie|versies}}',
@@ -2087,6 +2102,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
 'mostlinkedtemplates' => 'Meestgebruukten mallen',
 'mostcategories' => 'Artikels mit de meeste kategorieën',
 'mostimages' => 'Meestgebruukten bestaanden',
+'mostinterwikis' => "Pagina's mit de meeste interwikiverwiezingen",
 'mostrevisions' => 'Artikels mit de meeste bewarkingen',
 'prefixindex' => 'Alle ziejen op veurvoegsel',
 'prefixindex-namespace' => 'Alle ziejen mit t veurvoegsel (naamruumte $1)',
@@ -2201,8 +2217,8 @@ Ondersteunde protokollen: <code>$1</code> (zet t niet in joew zeukopdrachte).',
 
 # Special:ActiveUsers
 'activeusers' => 'Aktieve gebrukers',
-'activeusers-intro' => 'Dit is n lieste van gebrukers die de aofeleupen $1 {{PLURAL:$1|dag|dagen}} enigszins aktief ewes bin.',
-'activeusers-count' => '$1 leste {{PLURAL:$1|bewarking|bewarkingen}} in de aofeleupen {{PLURAL:$3|dag|$3 dagen}}',
+'activeusers-intro' => 'Dit is n lieste van gebrukers die de aofgeleupen $1 {{PLURAL:$1|dag|dagen}} enigszins aktief ewest hebben.',
+'activeusers-count' => '$1 leste {{PLURAL:$1|bewarking|bewarkingen}} in de aofgeleupen {{PLURAL:$3|dag|$3 dagen}}',
 'activeusers-from' => 'Laot gebrukers zien vanaof:',
 'activeusers-hidebots' => 'Bots verbargen',
 'activeusers-hidesysops' => 'Beheerders verbargen',
@@ -2235,6 +2251,8 @@ Meer informasie over de rechten ku'j [[{{MediaWiki:Listgrouprights-helppage}}|hi
 'mailnologin' => 'Niet an-emeld.',
 'mailnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween en n geldig e-mailadres in "[[Special:Preferences|mien veurkeuren]]" invoeren um disse funksie te kunnen gebruken.',
 'emailuser' => 'n Bericht sturen',
+'emailuser-title-target' => 'Disse {{GENDER:$1|gebruker}} n bericht sturen',
+'emailuser-title-notarget' => 'Gebruker n bericht sturen',
 'emailpage' => 'Gebruker n bericht sturen',
 'emailpagetext' => "Deur middel van dit formulier ku'j n bericht sturen naor disse gebruker.
 t Adres da'j op-egeven hebben bie [[Special:Preferences|joew veurkeuren]] zal as aofzender gebruukt wörden.
@@ -2294,7 +2312,7 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
 'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
 'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
 'iteminvalidname' => "Verkeerde naam '$1'",
-'wlnote' => 'Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofeleupen ure|de leste $2 uren}} vanaof $3 um $4.',
+'wlnote' => 'Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofgeleupen ure|de leste $2 uren}} vanaof $3 um $4.',
 'wlshowlast' => 'Laot de veurbieje $1 uur $2 dagen $3 zien',
 'watchlist-options' => 'Opsies veur de volglieste',
 
@@ -2380,6 +2398,8 @@ Wees veurzichtig',
 'rollback' => 'Wiezigingen herstellen',
 'rollback_short' => 'Weerummedreien',
 'rollbacklink' => 'Weerummedreien',
+'rollbacklinkcount' => '{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien',
+'rollbacklinkcount-morethan' => 'Meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien',
 'rollbackfailed' => 'Wieziging herstellen is mislokt',
 'cantrollback' => 'De wiezigingen konnen niet hersteld wörden; der is mer 1 auteur.',
 'alreadyrolled' => 'Kan de leste wieziging van de zied [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niet weerummedreien.
@@ -2578,7 +2598,7 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'ipbreason' => 'Reden:',
 'ipbreasonotherlist' => 'aandere reden',
 'ipbreason-dropdown' => '*Algemene redens veur t blokkeren
-** valse informasie invoeren
+** verkeerde informasie invoeren
 ** ziejen leegmaken
 ** ongewunste verwiezingen plaotsen
 ** onzinteksten schrieven
@@ -2863,6 +2883,7 @@ Alle transwiki-invoerhaandelingen wörden op-esleugen in t [[Special:Log/import|
 'import-interwiki-templates' => 'Alle mallen opnemen',
 'import-interwiki-submit' => 'Invoeren',
 'import-interwiki-namespace' => 'Doelnaamruumte:',
+'import-interwiki-rootpage' => 'Baosiszied veur doel (opsioneel):',
 'import-upload-filename' => 'Bestaandsnaam:',
 'import-comment' => 'Opmarkingen:',
 'importtext' => 'Gebruuk de [[Special:Export|uutvoerfunksie]] in de wiki waor de informasie vandaon kömp.
@@ -2898,6 +2919,9 @@ De tiedelike map is niet anwezig.',
 'import-error-interwiki' => 'De zied "$1" is niet in-evoerd umdat disse naam ereserveerd is veur externe verwiezingen (interwiki).',
 'import-error-special' => 'Zied "$1" is niet in-evoerd umdat t eplaotst is in n spesiale naamruumte waor gien ziejen in eplaotst kunnen wörden.',
 'import-error-invalid' => 'De zied" "$1" is niet in-evoerd umdat de naam ongeldig is.',
+'import-options-wrong' => 'Verkeerde {{PLURAL:$2|opsie|opsies}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'De op-egeven baosiszied is ongeldig.',
+'import-rootpage-nosubpage' => 'In de naamruumte "$1" van de baosiszied is t anmaken van onderziejen niet meugelik.',
 
 # Import log
 'importlogpage' => 'Invoerlogboek',
@@ -3015,11 +3039,34 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 
 # Info page
 'pageinfo-title' => 'Informasie over "$1"',
-'pageinfo-header-edits' => 'Bewarkingen',
+'pageinfo-header-basic' => 'Baosisinformasie',
+'pageinfo-header-edits' => 'Bewarkingsgeschiedenisse',
+'pageinfo-header-restrictions' => 'Ziedbeveiliging',
+'pageinfo-header-properties' => 'Ziedeigenschappen',
+'pageinfo-display-title' => 'Weeregeven ziednaam',
+'pageinfo-default-sort' => 'Standard sorteerwieze',
+'pageinfo-length' => 'Ziedlengte (in bytes)',
+'pageinfo-article-id' => 'Zied-ID',
+'pageinfo-robot-policy' => 'Staotus veur de zeukmasine',
+'pageinfo-robot-index' => 'Indexeerbaor',
+'pageinfo-robot-noindex' => 'Niet indexeerbaor',
 'pageinfo-views' => 'Antal keer bekeken',
-'pageinfo-watchers' => 'Antal volgers',
-'pageinfo-edits' => 'Antal bewarkingen',
-'pageinfo-authors' => 'Antal verschillende auteurs',
+'pageinfo-watchers' => 'Antal ziedvolgers',
+'pageinfo-redirects-name' => 'Deurverwiezingen naor disse zied',
+'pageinfo-subpages-name' => 'Onderziejen van disse zied',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|deurverwiezing|deurverwiezingen}}; $3 {{PLURAL:$3|niet-deurverwiezing|niet-deurverwiezingen}})',
+'pageinfo-firstuser' => 'Gebruker die de zied an-emaakt hef',
+'pageinfo-firsttime' => 'Daotum waorop de zied an-emaakt is',
+'pageinfo-lastuser' => 'Leste bewarker',
+'pageinfo-lasttime' => 'Daotum van leste bewarking',
+'pageinfo-edits' => 'Totaal antal bewarkingen',
+'pageinfo-authors' => 'Totaal antal verschillende auteurs',
+'pageinfo-recent-edits' => 'Antal nieje bewarkingen (in de veurbieje $1).',
+'pageinfo-recent-authors' => 'Leste antal van verschillende auteurs',
+'pageinfo-restriction' => 'Ziedbeveiliging ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
+'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
@@ -3073,6 +3120,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|zied|ziejen}}',
 'file-nohires' => 'Gien hogere resolusie beschikbaor.',
 'svg-long-desc' => 'SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3',
+'svg-long-desc-animated' => 'Bewegend SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3',
 'show-big-image' => 'Volle resolusie',
 'show-big-image-preview' => 'Grootte van disse weergave: $1.',
 'show-big-image-other' => 'Aandere {{PLURAL:$2|resolusie|resolusies}}: $1.',
@@ -3082,6 +3130,8 @@ $1',
 'file-info-png-looped' => 'herhaolend',
 'file-info-png-repeat' => '$1 {{PLURAL:$1|keer|keer}} aofespeuld',
 'file-info-png-frames' => '$1 {{PLURAL:$1|beeld|beelden}}',
+'file-no-thumb-animation' => "'''Opmarking: vanwegen techniese beparkingen, zie'j bie miniaturen de boel niet bewegen.''",
+'file-no-thumb-animation-gif' => "'''Opmarking: vanwegen techniese beparkingen, zie'j bie miniaturen van GIF-aofbeeldingen mit n hoge resolusie de boel niet bewegen.''",
 
 # Special:NewFiles
 'newimages' => 'Nieje bestaanden',
@@ -3881,7 +3931,7 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zu
 'api-error-file-too-large' => "t Bestaand da'j op-estuurd hebben is te groot.",
 'api-error-filename-tooshort' => 'De bestaandsnaam is te kort.',
 'api-error-filetype-banned' => 'Dit bestaandstype is niet toe-estaon.',
-'api-error-filetype-banned-type' => '{{PLURAL:$4|t Bestaandstype $1 wordt|De bestandstypes $1 worden}} niet toegelaten. {{PLURAL:$3|t Toe-estaone bestaandstype is|De toe-estaone bestaandstypen bin}} $2.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|t Bestaandstype $1|De bestaandstypes $1}} wörden niet toe-eleuten. {{PLURAL:$3|t Toe-estaone bestaandstype is|De toe-estaone bestaandstypen bin}} $2.',
 'api-error-filetype-missing' => 't Bestaand hef gien extensie.',
 'api-error-hookaborted' => "De wieziging die'j proberen deur te voeren is aofebreuken deur n extra uutbreiding.",
 'api-error-http' => 'Interne fout: der kon gien verbiending emaakt wörden mit de server.',
index 30b0d2b..0e6ab45 100644 (file)
@@ -1302,7 +1302,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'right-userrights' => 'प्रयोगकर्ताका अधिकारहरु सम्पादन गर्ने',
 'right-userrights-interwiki' => 'अरु विकिहरुमा प्रयोगकर्ताहरुको अधिकार सम्पादन गर्ने',
 'right-siteadmin' => 'डेटाबेसको ताल्चामार्ने र ताल्चाखोल्ने',
-'right-override-export-depth' => 'गहिराइ ५ सम्मको लिंकगरिएका पृष्ठहरु सहित निर्यात गर्ने',
+'right-override-export-depth' => 'गहिराइ ५ सम्मको लिंक गरिएका पृष्ठहरु सहित निर्यात गर्ने',
 'right-sendemail' => 'अन्य प्रयोगकर्ताहरुलाई इमेल गर्ने',
 'right-passwordreset' => 'पासवर्ड परिवर्तन गर्ने ईमेलहरु हेर्नुहोस',
 
index b30c2fb..5ceb8cd 100644 (file)
@@ -1309,7 +1309,8 @@ Controleer de logboeken.',
 'revdelete-only-restricted' => 'Er is een fout opgetreden bij het verbergen van het item van $1, $2: u kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
 'revdelete-reason-dropdown' => '* Veel voorkomende redenen voor verwijderen
 ** Auteursrechtenschending
-** Onbetamelijke persoonlijke gegevens
+** Onbetamelijke reactie of persoonlijke gegevens
+** Onbetamelijke gebruikersnaam
 ** Potentieel lasterlijke gegevens',
 'revdelete-otherreason' => 'Andere reden:',
 'revdelete-reasonotherlist' => 'Andere reden',
@@ -3246,7 +3247,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'pageinfo-authors' => 'Totaal aantal verschillende auteurs',
 'pageinfo-recent-edits' => 'Recent aantal bewerkingen (binnen de afgelopen $1).',
 'pageinfo-recent-authors' => 'Recent aantal verschillende auteurs',
-'pageinfo-restriction' => 'Paginabeveiliging (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Paginabeveiliging ($1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisch woord|Magische woorden}} ($1)',
 'pageinfo-hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruikt sjabloon|Gebruikte sjablonen}} ($1)',
index 0005c66..b5018e9 100644 (file)
@@ -330,7 +330,7 @@ $messages = array(
 'fri' => 'ଶୁକ୍ରବାର',
 'sat' => 'ଶନିବାର',
 'january' => 'ଜାନୁଆରୀ',
-'february' => 'ଫà­\87ବà­\83ଆରୀ',
+'february' => 'ଫà­\87ବà­\8dରà­\81ଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
 'april' => 'ଅପ୍ରେଲ',
 'may_long' => 'ମଇ',
@@ -342,7 +342,7 @@ $messages = array(
 'november' => 'ନଭେମ୍ବର',
 'december' => 'ଡିସେମ୍ବର',
 'january-gen' => 'ଜାନୁଆରୀ',
-'february-gen' => 'ଫà­\87ବà­\83ଆରୀ',
+'february-gen' => 'ଫà­\87ବà­\8dରà­\81ଆରୀ',
 'march-gen' => 'ମାର୍ଚ୍ଚ',
 'april-gen' => 'ଅପ୍ରେଲ',
 'may-gen' => 'ମଇ',
@@ -354,7 +354,7 @@ $messages = array(
 'november-gen' => 'ନଭେମ୍ବର',
 'december-gen' => 'ଡିସେମ୍ବର',
 'jan' => 'ଜାନୁଆରୀ',
-'feb' => 'ଫà­\87ବà­\83ଆରୀ',
+'feb' => 'ଫà­\87ବà­\8dରà­\81ଆରୀ',
 'mar' => 'ମାର୍ଚ୍ଚ',
 'apr' => 'ଅପ୍ରେଲ',
 'may' => 'ମଇ',
index fdcfabf..3936a76 100644 (file)
@@ -17,6 +17,7 @@
  * @author Sukh
  * @author Surinder.wadhawan
  * @author TariButtar
+ * @author Xqt
  * @author Ævar Arnfjörð Bjarmason
  * @author לערי ריינהארט
  */
@@ -129,7 +130,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'tog-watchlisthidepatrolled' => 'ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਸੋਧਾਂ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲੁਕਾਓ',
 'tog-ccmeonemails' => 'ਜੋ ਈ-ਮੇਲਾਂ ਮੈਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਭੇਜਦਾ ਹਾਂ ਓਹਨਾਂ ਦੀਆਂ ਨਕਲਾਂ ਮੈਨੂੰ ਭੇਜੋ',
 'tog-diffonly' => 'ਫ਼ਰਕਾਂ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵਖਾਓ',
-'tog-showhiddencats' => 'ਲà©\81à¨\95à©\80à¨\86à¨\82 à¨\95à©\88à¨\9fà©\87à¨\97ਰੀਆਂ ਵਖਾਓ',
+'tog-showhiddencats' => 'ਲà©\81à¨\95à©\80à¨\86à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣੀਆਂ ਵਖਾਓ',
 'tog-norollbackdiff' => '"ਵਾਪਸ ਮੋੜੌ"ਅਮਲ ਵਿਚ ਲਿਆਣ ਬਾਦ ਫ਼ਰਕ ਨਾ ਦਿਖਾਓ',
 
 'underline-always' => 'ਹਮੇਸ਼ਾਂ',
@@ -199,10 +200,10 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'pagecategories' => '{{PLURAL:$1|ਕੈਟਾਗਰੀ|ਕੈਟਾਗਰੀਆਂ}}',
 'category_header' => 'ਕੈਟਾਗਰੀ "$1" ਵਿੱਚ ਲੇਖ',
 'subcategories' => 'ਸਬ-ਕੈਟਾਗਰੀਆਂ',
-'category-media-header' => 'à¨\95à©\88à¨\9fà©\87à¨\97ਰੀ "$1" ਵਿੱਚ ਮੀਡੀਆ',
-'category-empty' => "''à¨\87ਸ à¨\95à©\88à¨\9fà©\87à¨\97ਰੀ ਵਿੱਚ ਇਸ ਵੇਲ਼ੇ ਕੋਈ ਵੀ ਸਫ਼ਾ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ ਹੈ।''",
+'category-media-header' => 'ਸ਼à©\8dਰà©\87ਣੀ "$1" ਵਿੱਚ ਮੀਡੀਆ',
+'category-empty' => "''à¨\87ਸ à¨¸à¨¼à©\8dਰà©\87ਣੀ ਵਿੱਚ ਇਸ ਵੇਲ਼ੇ ਕੋਈ ਵੀ ਸਫ਼ਾ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ ਹੈ।''",
 'hidden-categories' => '{{PLURAL:$1|ਲੁਕੀਵੀਂ ਸ਼੍ਰੇਣੀ|ਲੁਕਵੀਂਆਂ ਸ਼੍ਰੇਣੀਆਂ}}',
-'hidden-category-category' => 'ਲà©\81à¨\95à©\80à¨\86à¨\82 à¨\95à©\88à¨\9fà©\87à¨\97ਰੀਆਂ',
+'hidden-category-category' => 'ਲà©\81à¨\95à©\80à¨\86à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣੀਆਂ',
 'category-subcat-count' => '{{ਕੁੱਲ $2 ਸ਼੍ਰੇਣੀਆਂ ਵਿਚੋਂ, PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਹੇਠ ਲਿਖੀ ਸ਼੍ਰੇਣੀ ਹੈ| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ {{PLURAL:$1|ਉਪ ਸ਼੍ਰੇਣੀ ਹੈ|$1 ਉਪ-ਸ਼੍ਰੇਣੀਆਂ ਹਨ}}}}',
 'category-subcat-count-limited' => 'ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ {{PLURAL:$1|ਉਪ-ਸ਼੍ਰੇਣੀ ਹੈ।|$1 ਉਪ-ਸ਼੍ਰੇਣੀਆਂ ਹਨ।}}',
 'category-article-count' => '{{PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਇਹ ਸਫ਼ਾ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ, ਕੁੱਲ $2 ਵਿਚੋਂ, ਇਹ {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ}} ਹਨ}}',
@@ -487,7 +488,7 @@ Note that some pages may continue to be displayed as if you were still logged in
 'nologin' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।',
 'nologinlink' => 'ਖਾਤਾ ਬਣਾਓ',
 'createaccount' => 'ਖਾਤਾ ਬਣਾਓ',
-'gotaccount' => 'à¨\96ਾਤਾ à¨¹à©\88? $1।',
+'gotaccount' => 'à¨\96ਾਤਾ à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨¹à©\88? $1',
 'gotaccountlink' => 'ਲਾਗ ਇਨ',
 'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?',
 'createaccountmail' => 'ਈਮੇਲ ਨਾਲ',
@@ -721,8 +722,8 @@ sysop}}|administrator]] ਨਾਲ਼ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ
 'templatesusedsection' => 'ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਟੈਪਲੇਟ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:',
 'template-protected' => '(ਸੁਰੱਖਿਅਤ)',
 'template-semiprotected' => '(ਨੀਮ-ਸੁਰੱਖਿਅਤ)',
-'hiddencategories' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ {{PLURAL:$1|੧ à¨²à©\81à¨\95ਵà©\80à¨\82 à¨\95à©\88à¨\9fà©\87à¨\97ਰੀ|
-$1 à¨²à©\81à¨\95ਵà©\80à¨\86à¨\82 à¨\95à©\88à¨\9fà©\87à¨\97ਰੀਆਂ}} ਦਾ ਮੈਂਬਰ ਹੈ:',
+'hiddencategories' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ {{PLURAL:$1|੧ à¨²à©\81à¨\95ਵà©\80à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣੀ|
+$1 à¨²à©\81à¨\95ਵà©\80à¨\86à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣੀਆਂ}} ਦਾ ਮੈਂਬਰ ਹੈ:',
 'nocreatetitle' => 'ਸਫ਼ਾ ਬਣਾਉਣ ਦੀ ਹੱਦ ਹੈ',
 'nocreatetext' => '{{SITENAME}} ਨੇ ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਤੇ ਰੋਕ ਲਾਈ ਹੋਈ ਹੈ।
 ਤੁਸੀਂ ਵਾਪਸ ਜਾ ਕੇ ਮੌਜੂਦਾ ਸਫ਼ੇ ਸੋਧ ਸਕਦੇ ਹੋ ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਜਾਂ ਖਾਤਾ ਬਣਾ]] ਸਕਦੇ ਹੋ।',
@@ -876,7 +877,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'mergelogpagetext' => 'ਹੇਠਾਂ ਇੱਕ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਦੂਜੇ ਦੇ ਅਤੀਤ ਵਿਚ ਰਲ਼ਾਉਣ ਦੀ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਲਿਸਟ ਹੈ।',
 
 # Diffs
-'history-title' => '"$1" ਦੇ ਅਤੀਤ ਰੀਵਿਜ਼ਨ',
+'history-title' => '"$1" ਦੇ  ਸੁਧਾਰਾਂ ਦਾ ਅਤੀਤ',
 'difference-title' => '"$1" ਦੇ ਰੀਵਿਜ਼ਨਾਂ ਵਿਚ ਫ਼ਰਕ',
 'difference-title-multipage' => 'ਸਫ਼ਿਆਂ "$1" ਅਤੇ "$2" ਵਿਚ ਫ਼ਰਕ',
 'difference-multipage' => '(ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ)',
@@ -918,7 +919,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'searchprofile-everything-tooltip' => 'ਸਭ ਚੀਜ਼ਾਂ ਖੋਜੋ (ਗੱਲਬਾਤ ਸਫ਼ਿਆਂ ਸਮੇਤ)',
 'searchprofile-advanced-tooltip' => 'ਆਪਣੇ ਬਣਾਏ ਨਾਮ-ਥਾਂਵਾਂ ਵਿਚ ਖੋਜੋ',
 'search-result-size' => '$1 ({{PLURAL:$2|੧ ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})',
-'search-result-category-size' => '{{PLURAL:$1|੧ à¨®à©\88à¨\82ਬਰ|$1 à¨®à©\88à¨\82ਬਰ}} ({{PLURAL:$2|੧ à¨¸à¨¬-à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80|$2 à¨¸à¨¬-à¨\95à©\88à¨\9fà©\87à¨\97ਰੀਆਂ}}, {{PLURAL:$3|੧ ਫ਼ਾਈਲ|$3 ਫ਼ਾਈਲਾਂ}})',
+'search-result-category-size' => '{{PLURAL:$1|੧ à¨®à©\88à¨\82ਬਰ|$1 à¨®à©\88à¨\82ਬਰ}} ({{PLURAL:$2|੧ à¨\89ਪ-ਸ਼à©\8dਰà©\87ਣà©\80|$2 à¨\89ਪ-ਸ਼à©\8dਰà©\87ਣੀਆਂ}}, {{PLURAL:$3|੧ ਫ਼ਾਈਲ|$3 ਫ਼ਾਈਲਾਂ}})',
 'search-redirect' => '($1 ਰੀ-ਡਿਰੈਕਟ)',
 'search-section' => '(ਭਾਗ $1)',
 'search-suggest' => 'ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1',
@@ -1186,9 +1187,9 @@ to upload files.',
 'filename-tooshort' => 'ਫ਼ਾਈਲ ਬਹੁਤ ਛੋਟੀ ਹੈ।',
 'filetype-banned' => 'ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।',
 'illegal-filename' => 'ਇਸ ਫ਼ਾਈਲ-ਨਾਮ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
-'fileexists' => 'à¨\87ਹ à¨«à¨¾à¨\87ਲ à¨¨à¨¾à¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ਹ à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨\9cਾਣਦà©\87 ਨਹੀਂ ਹੋ ਤਾਂ  <strong>[[:$1]]</strong> ਵੇਖੋ ਜੀ। [[$1|thumb]]',
+'fileexists' => 'à¨\87ਹ à¨«à¨¾à¨\87ਲ à¨¨à¨¾à¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ਹ à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨¦à©\8dਰਿà©\9c ਨਹੀਂ ਹੋ ਤਾਂ  <strong>[[:$1]]</strong> ਵੇਖੋ ਜੀ। [[$1|thumb]]',
 'fileexists-extension' => 'ਇਸ ਨਾਂ ਨਾਲ ਰਲਦੀ ਫਾਇਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]
-* ਅੱਪਲੋਡ ਕੀਤੀ ਫਾਇਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>
+* à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80 à¨\9cਾà¨\82ਦà©\80 à¨«à¨¾à¨\87ਲ à¨¦à¨¾ à¨¨à¨¾à¨\82: <strong>[[:$1]]</strong>
 * ਮੌਜੂਦ ਫਾਇਲ ਦਾ ਨਾਂ: <strong>[[:$2]]</strong>
 ਇੱਕ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ',
 'file-exists-duplicate' => 'ਇਹ ਫ਼ਾਈਲ {{PLURAL:$1|ਇਸ ਫ਼ਾਈਲ|ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ}} ਦੀ ਨਕਲ ਹੈ:',
@@ -1340,7 +1341,7 @@ to upload files.',
 'statistics-users-active-desc' => 'ਮੈਂਬਰ, ਜਿੰਨ੍ਹਾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
 'statistics-mostpopular' => 'ਸਭ ਤੋਂ ਵੱਧ ਵੇਖੇ ਪੇਜ',
 
-'disambiguationspage' => 'ਗੁੰਝਲ ਖੋਲ੍ਹ',
+'disambiguationspage' => 'Template:ਗੁੰਝਲ ਖੋਲ੍ਹ',
 
 'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
 
@@ -1550,7 +1551,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'actionfailed' => 'ਕਾਰਵਾਈ ਨਾਕਾਮ',
 'deletedtext' => '"$1" ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।
 ਤਾਜ਼ੀਆਂ ਮਿਟਾਉਣਾਂ ਦੇ ਰਿਕਾਰਡ ਲਈ $2 ਵੇਖੋ।',
-'dellogpage' => 'ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ',
+'dellogpage' => 'ਮਿਟਾਉਣ ਦਾ ਚਿੱਠਾ',
 'dellogpagetext' => 'ਹੇਠਾਂ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਮਿਟਾਉਣਾਂ ਦੀ ਲਿਸਟ ਹੈ।',
 'deletionlog' => 'ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ',
 'deletecomment' => 'ਕਾਰਨ:',
@@ -1660,7 +1661,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'sp-contributions-blocked-notice-anon' => 'ਇਹ IP ਪਤਾ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
 ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
-'sp-contributions-username' => 'IP à¨ªà¨¤à¨¾ à¨\9cਾà¨\82 à¨¯à©\82à¨\9c਼ਰ ਨਾਮ:',
+'sp-contributions-username' => 'IP à¨ªà¨¤à¨¾ à¨\9cਾà¨\82 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਨਾਮ:',
 'sp-contributions-toponly' => 'ਸਿਰਫ਼ ਉਹੀ ਸੋਧਾਂ ਵਖਾਓ ਜੋ ਸਭ ਤੋਂ ਨਵੀਂਆਂ ਹਨ',
 'sp-contributions-submit' => 'ਖੋਜੋ',
 
@@ -1670,7 +1671,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'whatlinkshere-page' => 'ਸਫਾ:',
 'linkshere' => "ਇਹ ਸਫ਼ੇ '''[[:$1]]''' ਨਾਲ਼ ਜੋੜਦੇ ਹਨ:",
 'nolinkshere' => "ਕੋਈ ਵੀ ਸਫ਼ਾ '''[[:$1]]''' ਨਾਲ਼ ਨਹੀਂ ਜੋੜਦਾ।",
-'isredirect' => 'ਰà©\80ਡਿਰà©\88à¨\95à¨\9f ਸਫ਼ਾ',
+'isredirect' => 'ਮà©\8bà©\9cਵਾà¨\82 ਸਫ਼ਾ',
 'istemplate' => 'ਟਾਕਰਾ ਕਰੋ',
 'isimage' => 'ਫ਼ਾਈਲ ਦਾ ਲਿੰਕ',
 'whatlinkshere-prev' => '{{PLURAL:$1|ਪਿਛਲਾ|ਪਿਛਲੇ $1}}',
@@ -1893,7 +1894,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Info page
 'pageinfo-header-edits' => 'ਸੋਧਾਂ ਦਾ ਅਤੀਤ',
-'pageinfo-watchers' => 'ਸਫ਼à©\87 â\80\99ਤà©\87 à¨¨à¨\9c਼ਰ à¨°à©±à¨\96ਣ à¨µà¨¾à¨²à¨¼à©\87',
+'pageinfo-watchers' => 'ਸਫ਼à©\87 â\80\99ਤà©\87 à¨¨à¨\9c਼ਰ à¨°à©±à¨\96ਣ à¨µà¨¾à¨²à¨¿à¨\86à¨\82 à¨¦à©\80 à¨\97ਿਣਤà©\80',
 'pageinfo-edits' => 'ਕੁੱਲ ਸੋਧਾਂ',
 
 # Skin names
index cd41c24..10f3892 100644 (file)
@@ -1439,7 +1439,7 @@ Tej operacji nie można później cofnąć.',
 'username' => 'Nazwa użytkownika',
 'uid' => 'ID użytkownika',
 'prefs-memberingroups' => 'Należy do {{PLURAL:$1|grupy|grup}}',
-'prefs-registration' => 'Moment rejestracji',
+'prefs-registration' => 'Data rejestracji',
 'yourrealname' => 'Imię i nazwisko',
 'yourlanguage' => 'Język interfejsu',
 'yourvariant' => 'Wariant języka treści',
@@ -1987,6 +1987,7 @@ Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
 'uploadnewversion-linktext' => 'Załaduj nowszą wersję tego pliku',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'współdzielone zasoby',
+'upload-disallowed-here' => 'Niestety, nie możesz nadpisać tego pliku.',
 
 # File reversion
 'filerevert' => 'Przywracanie $1',
@@ -3119,7 +3120,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-authors' => 'Całkowita liczba autorów',
 'pageinfo-recent-edits' => 'Liczba ostatnich edycji (w przeciągu $1)',
 'pageinfo-recent-authors' => 'Liczba ostatnich autorów',
-'pageinfo-restriction' => 'Zabezpieczenie strony (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Zabezpieczenie strony ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'Magiczne {{PLURAL:$1|słowo|słowa|słowa}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukryte kategorie}} ($1)',
 'pageinfo-templates' => 'Transkludowan{{PLURAL:$1|y szablon|e szablony}} ($1)',
@@ -3187,6 +3188,8 @@ Jeśli go otworzysz, możesz zarazić swój system.",
 'file-info-png-looped' => 'zapętlony',
 'file-info-png-repeat' => 'powtarzany $1 {{PLURAL:$1|raz|razy}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|klatka|klatki|klatek}}',
+'file-no-thumb-animation' => "'''Uwaga: z powodu ograniczeń technicznych miniaturki tego pliku nie bedą animowane.'''",
+'file-no-thumb-animation-gif' => "'''Uwaga: z powodu ograniczeń technicznych miniaturki plików GIF o wysokiej rozdzielczości – takich jak ten – nie bedą animowane.'''",
 
 # Special:NewFiles
 'newimages' => 'Najnowsze pliki',
index 386cc8f..938f0af 100644 (file)
@@ -2792,27 +2792,27 @@ A lassa gionté na spiegassion ant ël resumé.",
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utent|Utent}} anònim ëd {{SITENAME}}',
 'siteuser' => '$1, utent ëd {{SITENAME}}',
-'anonuser' => '{{SITENAME}} utent anònim $1',
-'lastmodifiedatby' => "Sta pàgina-sì a l'é staita modificà l'ùltima vira al $2, $1 da $3.",
+'anonuser' => "l'utent anònim $1 ëd {{SITENAME}}",
+'lastmodifiedatby' => "Costa pàgina-sì a l'é staita modificà l'ùltima vira a $2, $1 da $3.",
 'othercontribs' => 'Basà ant sëj travaj ëd $1.',
 'others' => 'àutri',
 'siteusers' => '$1, {{PLURAL:$2|utent|utent}} ëd {{SITENAME}}',
 'anonusers' => '{{SITENAME}} {{PLURAL:$2|utent|utent}} anònim $1',
-'creditspage' => 'Credit dla pàgina',
-'nocredits' => 'A-i é pa gnun crédit për sta pagina-sì.',
+'creditspage' => 'Paternità dla pàgina',
+'nocredits' => "A-i é gnun-a anformassion d'atribussion disponìbil për costa pàgina.",
 
 # Spam protection
 'spamprotectiontitle' => 'Filtror dla rumenta',
-'spamprotectiontext' => "La pàgina che a vorìa salvé a l'é staita blocà dal filtror dla rumenta.
+'spamprotectiontext' => "Ël test che a vorìa salvé a l'é stàit blocà dal filtror dla rumenta.
 Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit estern ëd coj blocà.",
 'spamprotectionmatch' => "Cost-sì a l'é ël test che a l'é restà ciapà andrinta al filtror dla rumenta: $1",
 'spambot_username' => 'MediaWiki - trigomiro che a-j dà deuit a la rumenta',
-'spam_reverting' => "Buta andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1",
-'spam_blanking' => "Pàgina dësveujdà, che tute le version a l'avìo andrinta dj'anliure a $1",
-'spam_deleting' => 'Tute le revision a contnisìo dle liure a $1, scancelament',
+'spam_reverting' => "Butà andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1",
+'spam_blanking' => "Pàgina dësvujdà, che tute le version a l'avìo andrinta dj'anliure a $1",
+'spam_deleting' => 'Scancelà, dagià che tute le revision a contnisìo dle liure a $1',
 
 # Info page
-'pageinfo-title' => 'Anformassion për "$1"',
+'pageinfo-title' => 'Anformassion për «$1»',
 'pageinfo-header-basic' => 'Anformassion ëd base',
 'pageinfo-header-edits' => 'Modìfiche',
 'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
@@ -2825,7 +2825,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-robot-index' => 'Indesàbil',
 'pageinfo-robot-noindex' => 'Nen indesàbil',
 'pageinfo-views' => 'Nùmer ëd vìsite',
-'pageinfo-watchers' => "Vàire ch'a ten-o sot-euj la pàgina",
+'pageinfo-watchers' => "Vàire utent ch'a ten-o sot-euj la pàgina",
 'pageinfo-redirects-name' => 'Ridiression a sta pàgina-sì',
 'pageinfo-subpages-name' => 'Sot-pàgine ëd costa pàgina',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ridiression|ridiression}}; $3 {{PLURAL:$3|nen ridiression|nen ridiression}})',
@@ -2837,25 +2837,25 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-authors' => "Nùmer d'autor diferent",
 'pageinfo-recent-edits' => "Nùmer ëd modìfiche recente (ant j'ùltim $1)",
 'pageinfo-recent-authors' => "Nùmer d'autor diferent recent",
-'pageinfo-restriction' => 'Protession ëd la pàgina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protession ëd la pàgina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgica|Paròle màgiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
 
 # Patrolling
-'markaspatrolleddiff' => 'Marca coma verificà',
-'markaspatrolledtext' => "Marca st'artìcol-sì coma verificà",
+'markaspatrolleddiff' => 'Marc coma verificà',
+'markaspatrolledtext' => 'Marché costa pàgina coma verificà',
 'markedaspatrolled' => 'Marca dla verìfica butà',
 'markedaspatrolledtext' => "La version selessionà ëd [[:$1]] a l'é staita marcà coma verificà.",
 'rcpatroldisabled' => "Verìfica dj'ùltime modìfiche disabilità",
 'rcpatroldisabledtext' => "La possibilità ëd verifichè j'ùltime modìfiche a l'é disabilità.",
-'markedaspatrollederror' => 'As peul pa marchè verificà',
-'markedaspatrollederrortext' => 'A venta che a specìfica che version che a veul marchè verificà.',
-'markedaspatrollederror-noautopatrol' => 'A l\'ha nen ël përmess dë marchesse soe modìfiche coma "controlà".',
+'markedaspatrollederror' => 'As peul pa marché coma verificà',
+'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
+'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
 
 # Patrol log
 'patrol-log-page' => 'Registr dij contròj',
-'patrol-log-header' => "Sto sì a l'é un registr ëd le revision verificà.",
+'patrol-log-header' => "Cost-sì a l'é un registr ëd le revision controlà.",
 'log-show-hide-patrol' => '$1 registr verificà',
 
 # Image deletion
index ff59bb3..9c0307d 100644 (file)
@@ -417,6 +417,8 @@ $1',
 'youhavenewmessages' => 'تاسې $1 لری  ($2).',
 'newmessageslink' => 'نوي پيغامونه',
 'newmessagesdifflink' => 'وروستی بدلون',
+'newmessageslinkplural' => '{{PLURAL:$1|يو نوی پيغام|نوي پيغامونه}}',
+'newmessagesdifflinkplural' => 'وروستي {{PLURAL:$1|بدلون|بدلونونه}}',
 'youhavenewmessagesmulti' => 'تاسې په $1 کې نوي پېغامونه لرۍ',
 'editsection' => 'سمول',
 'editold' => 'سمول',
@@ -497,6 +499,8 @@ $1',
 'badtitle' => 'ناسم سرليک',
 'badtitletext' => 'ستاسې د غوښتل شوي مخ سرليک سم نه وو، يا مو د سرليک ځای تش وو او يا هم د ژبو خپلمنځي تړنې څخه يا د ويکي ګانو خپلمنځي سرليکونو څخه يو ناسم توری مو پکې کارولی وي.
 کېدای شي چې ستاسې په ورکړ شوي سرليک کې يو يا څو داسې توري وي چې د سرليک په توګه بايد و نه کارېږي.',
+'querypage-no-updates' => 'د دې مخ اوسمهالېدنې ناچارن شوي.
+په ښکاره توګه د دې ځای اومتوک به نه وي تازه شوي.',
 'viewsource' => 'سرچينه کتل',
 'viewsource-title' => 'د $1 سرچينه کتل',
 'actionthrottled' => 'د دې کړنې مخنيوی وشو',
@@ -711,7 +715,7 @@ $1',
 ستاسې IP پته $3 ده او ستاسې د بنديز پېژند #$5 دی.
 د بنديز اړونده د اړيکو نيولو په وخت کې لطفاً د پورتني مالوماتو يادونه وکړۍ.',
 'blockednoreason' => 'هېڅ سبب نه دی ورکړ شوی',
-'whitelistedittext' => 'ددې لپاره چې سمادول ترسره کړی تاسو بايد $1.',
+'whitelistedittext' => 'د مخونو د سمون لپاره بايد $1 کېښکاږۍ.',
 'nosuchsectiontitle' => 'برخه و نه موندل شوه',
 'nosuchsectiontext' => 'تاسې د يوې داسې برخې د سمون هڅه کړې چې تر اوسه پورې نشته.
 کېدای هغه مهال چې تاسې د دې مخ نه کتنه کوله، همدا برخه کوم بل ځای ته لېږدل شوې او يا هم ړنګه شوې وي.',
@@ -736,11 +740,10 @@ $1',
 'userpage-userdoesnotexist-view' => 'د "$1" ګڼون نه دی ثبت شوی.',
 'blocked-notice-logextract' => 'دم مهال په دې کارن بنديز لګېدلی.
 دلته لاندې د بنديز تازه يادښت د سرچينې په توګه ورکړ شوی:',
-'clearyourcache' => "'''يادونه:''' د غوره توبونو د خوندي کولو وروسته، ددې لپاره چې تاسو خپل سر ته رسولي ونجونه وګورۍ نو پکار ده چې د خپل بروزر ساتل شوې حافظه تازه کړی. 
-* '''Ù\85Ù\88زÛ\90Ù\84ا/ Ù\81اÙ\8aرÙ\81اکس/ Ø³Ù\81رÙ\8a:''' Ù¾Ù\87 Ø¯Û\90 Ú©ØªÙ\86Ù\85Ù\84 Ú©Û\90 Ø¯ ''Reload'' Ø¯ Ù¼Ú©Ù\88Ù\87Ù\84Ù\88 Ù¾Ù\87 Ù\88خت Ø¯ ''Shift'' ØªÚ¼Û\8d Ù\86Ù\8aÙ\88Ù\84Û\90 Ù\88ساتÛ\8cØ\8c Ø§Ù\88 Ù\8aا Ù\87Ù\85 ''Ctrl-F5'' Ù\8aا ''Ctrl-R'' تڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ''⌘-R'' کېښکاږۍ)
+'clearyourcache' => "'''يادښت:''' د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.
+* '''Ù\81اÙ\8aرÙ\81اکس/ Ø³Ù\81رÙ\8a:''' Ù¾Ù\87 Ø¯Û\90 Ú©ØªÙ\86Ù\85Ù\84 Ú©Û\90 Ø¯ ''Reload'' Ø¯ Ù¼Ú©Ù\88Ù\87Ù\84Ù\88 Ù¾Ù\87 Ù\88خت Ø¯ ''Shift'' ØªÚ¼Û\8d Ù\86Ù\8aÙ\88Ù\84Û\90 Ù\88ساتÛ\8cØ\8c Ø§Ù\88 Ù\8aا Ù\87Ù\85 ''Ctrl-F5'' Ù\8aا ''Ctrl-R''تڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ''⌘-R'' کېښکاږۍ)
 * '''ګووګل کروم:''' په دې کتنمل کې د ''Ctrl-Shift-R'' تڼۍ کېښکاږۍ (د مک لپاره ''⌘-Shift-R'')
 * '''انټرنټ اېکسپلورر:''' په دې کتنمل کې د ''Refresh'' د ټکوهلو په وخت کې د ''Ctrl'' تڼۍ کېښکاږلې ونيسۍ، او يا هم د ''Ctrl-F5'' تڼۍ کېښکاږۍ
-* '''کانکوېرور:''' په دې کتنمل کې د يواځې د ''Reload'' تڼۍ ټکوهۍ، او يا ''F5'' کېښکاږۍ
 * '''اوپرا''': په دې کتنمل کې د خپل براوزر ساتل شوې حافظه پدې توګه سپينولی شی ''Tools→Preferences''",
 'usercsspreview' => "'''هېر مو نشي چې دا يوازې ستاسې د کارن CSS مخليدنه ده.'''
 '''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
@@ -950,10 +953,11 @@ $1',
 'searcheverything-enable' => 'په ټولو نوم-تشيالونو کې پلټل',
 'searchrelated' => 'اړونده',
 'searchall' => 'ټول',
+'showingresults' => "دلته لاندې تر {{PLURAL:$1|'''1''' پايله|'''$1''' پايلې}} ښکاره شوي پيل له #'''$2''' شوی.",
 'showingresultsheader' => "د «'''$4'''» لپاره {{PLURAL:$5|له '''$1''' نه تر '''$3''' پايله|له '''$1 نه تر $2''' پايلې، ټولې پايلې '''$3''' }}",
 'nonefound' => "'''يادښت''': يوازې يو څو نوم-تشيالونو په تلواليزه توګه پلټل کېږي.
 د ''ټول:'' مختاړي په کارولو سره به ستاسې د پلټنې لپاره، په ټوله مېنځپانګه کې پلټنه وشي (د خبرواترو، کينډۍ او نورو مخونو په ګډون), او يا هم د خپلې خوښې نوم-تشيال د مختاړي په توګه وکاروۍ.",
-'search-nonefound' => 'د ØºÙ\88Ú\9aتÙ\86Û\90 Ø³Ø±Ù\87 Ø³Ù\85 اړونده پايلې و نه موندل شوې.',
+'search-nonefound' => 'ستاسÛ\90 Ø¯ØºÙ\88Ú\9aتÙ\86Û\90 اړونده پايلې و نه موندل شوې.',
 'powersearch' => 'ژوره پلټنه',
 'powersearch-legend' => 'ژوره پلټنه',
 'powersearch-ns' => 'په نوم-تشيالونو کې پلټنه:',
@@ -1008,6 +1012,7 @@ $1',
 'resultsperpage' => 'په هر مخ کې د پايلو شمېر:',
 'stub-threshold-disabled' => 'ناچارن',
 'recentchangesdays' => 'د هغو ورځو شمېر وټاکی چې په وروستي بدلونو کې يې ليدل غواړی:',
+'recentchangesdays-max' => 'حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}',
 'recentchangescount' => 'د هغو سمونو شمېر چې په تلواليزه بڼه ښکاره بايد شي:',
 'prefs-help-recentchangescount' => 'پدې کې د وروستني بدلونونو، د مخونو د پېښليکونو او يادښتونه شامل دي.',
 'savedprefs' => 'ستاسو غوره توبونه خوندي شوه.',
@@ -1220,7 +1225,7 @@ $1',
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، تاسو ته پکار ده چې لومړی غونډال کې [[Special:UserLogin|ننوتنه]] ترسره کړی.',
+'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو پکار ده چې تاسې لومړی غونډال کې [[Special:Userlogin|ننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
@@ -1266,9 +1271,11 @@ $1',
 که تاسې بيا هم د خپلې دوتنې پورته کول غواړۍ، نو لطفاً بېرته وګرځۍ او همدغه دوتنه بيا په يوه نوي نوم پورته کړی.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'همدا دوتنه د {{PLURAL:$1|لاندينۍ دوتنې|لاندينيو دوتنو}} غبرګه لمېسه ده:',
+'uploadwarning' => 'د پورته کولو ګواښ',
 'savefile' => 'دوتنه خوندي کړه',
 'uploadedimage' => '"[[$1]]" پورته شوه',
 'uploaddisabled' => 'پورته کول ناچارن شوي',
+'uploaddisabledtext' => 'د دوتنې پورته کولو آسانتياوې ناچارن شوي.',
 'uploadvirus' => 'دا دوتنه ويروس لري! تفصيل: $1',
 'upload-source' => 'سرچينيزه دوتنه',
 'sourcefilename' => 'د سرچينيزې دوتنې نوم:',
@@ -1280,6 +1287,7 @@ $1',
 'watchthisupload' => 'همدا دوتنه کتل',
 'upload-success-subj' => 'دوتنه پورته کېدل په برياليتوب سره ترسره شو',
 'upload-failure-subj' => 'د پورته کېدو ستونزه',
+'upload-warning-subj' => 'د پورته کولو ګواښ',
 
 'upload-file-error' => 'کورنۍ ستونزه',
 'upload-unknown-size' => 'ناڅرګنده کچه',
@@ -1361,6 +1369,7 @@ $1',
 # File deletion
 'filedelete' => '$1 ړنګول',
 'filedelete-legend' => 'دوتنه ړنګول',
+'filedelete-intro' => "تاسې د '''[[Media:$1|$1]]''' دوتنې او د ورسره ټول پېښليک د ړنګولو په حال کې ياست.",
 'filedelete-comment' => 'سبب:',
 'filedelete-submit' => 'ړنګول',
 'filedelete-success' => "'''$1''' ړنګ شو.",
@@ -1409,6 +1418,7 @@ $1',
 'statistics-views-total' => 'ټولټال کتنې',
 'statistics-users' => 'ثبت شوي [[Special:ListUsers|کارنان]]',
 'statistics-users-active' => 'فعاله کارنان',
+'statistics-users-active-desc' => 'هغه کارنان چې په {{PLURAL:$1|وروستۍ ورځ|وروستيو $1 ورځو}} کې فعاله ونډه لرلې',
 'statistics-mostpopular' => 'تر ټولو ډېر کتل شوي مخونه',
 
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
@@ -1453,6 +1463,7 @@ $1',
 'mostlinkedtemplates' => 'د ډېرو تړنو کينډۍ',
 'mostcategories' => 'د ګڼو وېشنيزو مخونه',
 'mostimages' => 'د ډېرو تړنو انځورونه',
+'mostinterwikis' => 'د ډېرو خپلمنځي تړنو مخونه',
 'mostrevisions' => 'ډېر کتلي مخونه',
 'prefixindex' => 'د مختاړيو ټول مخونه',
 'prefixindex-namespace' => 'د مختاړي ټول مخونه ($1 نومتشيال)',
@@ -1474,6 +1485,7 @@ $1',
 'ancientpages' => 'تر ټولو زاړه مخونه',
 'move' => 'لېږدول',
 'movethispage' => 'دا مخ ولېږدوه',
+'unusedimagestext' => 'دا لاندينۍ دوتنې په هېڅ کوم مخ کې نه دي ټومبېدلي. لطفاً په پام کې وساتۍ چې نور وېبځايونه به د دغو دوتنو له يو دوتنې سره يو راسن يو آر ال (URL) ولري او لا تر اوسه به دوتنه د فعالې کارېدنې سره سره دلته پرته وي.',
 'notargettitle' => 'بې موخې',
 'pager-newer-n' => '{{PLURAL:$1|نوی 1|نوي $1}}',
 'pager-older-n' => '{{PLURAL:$1|زوړ 1|زاړه $1}}',
@@ -1508,6 +1520,7 @@ $1',
 'allpagesprefix' => 'هغه مخونه ښکاره کړه چې مختاړی يې وي:',
 'allpagesbadtitle' => 'ورکړ شوی سرليک سم نه دی او يا هم د ژبو او يا د بېلابېلو ويکي ګانو مختاړی لري. ستاسو په سرليک کې يو يا څو داسې ابېڅې دي کوم چې په سرليک کې نه شي کارېدلی.',
 'allpages-bad-ns' => '{{SITENAME}} د "$1" په نامه هېڅ کوم نوم-تشيال نه لري.',
+'allpages-hide-redirects' => 'مخ ګرځونې پټول',
 
 # Special:Categories
 'categories' => 'وېشنيزې',
@@ -1540,6 +1553,7 @@ $1',
 'activeusers' => 'د فعالو کارنانو لړليک',
 'activeusers-count' => 'په {{PLURAL:$2|تېرې|تېرو}} {{PLURAL:$3|ورځ|$3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}',
 'activeusers-from' => 'هغه کارنان کتل چې نومونه يې پېلېږي په:',
+'activeusers-hidebots' => 'روباټونه پټول',
 'activeusers-hidesysops' => 'پازوالان پټول',
 'activeusers-noresult' => 'کارن و نه موندل شو.',
 
@@ -1565,6 +1579,8 @@ $1',
 # E-mail user
 'mailnologin' => 'هېڅ کومه لېږل شوې پته نشته',
 'emailuser' => 'کارن ته برېښليک لېږل',
+'emailuser-title-target' => 'دې {{GENDER:$1|کارن}} ته برېښليک لېږل',
+'emailuser-title-notarget' => 'کارن ته برېښليک لېږل',
 'emailpage' => 'کارن ته برېښليک لېږل',
 'defemailsubject' => 'د "$1" کارن لخوا د {{SITENAME}} برېښليک',
 'usermaildisabled' => 'د کارن برېښليک ناچارند دی',
@@ -1598,7 +1614,7 @@ $1',
 'nowatchlist' => 'ستاسو په کتلي لړليک کې هېڅ نه شته.',
 'watchlistanontext' => 'د خپل کتنلړ د توکو د سمولو او کتلو لپاره $1 ترسره کړۍ.',
 'watchnologin' => 'غونډال کې نه ياست ننوتي.',
-'watchnologintext' => 'ددÛ\90 Ù\84پارÙ\87 Ú\86Û\90 Ø®Ù¾Ù\84 Ú©ØªÙ\84 Ø´Ù\88Ù\8a Ù\84Ú\93Ù\84Ù\8aÚ© Ú©Û\90 Ø¨Ø¯Ù\84Ù\88Ù\86 Ø±Ø§Ù\88Ù\84Û\8c Ù\86Ù\88 ØªØ§Ø³Ù\88 ØªÙ\87 Ù¾Ú©Ø§Ø± Ø¯Ù\87 Ú\86Û\90 Ù\84Ù\88Ù\85Ú\93Û\8c ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 [[Special:UserLogin|Ù\86Ù\86Ù\88تÙ\86Ù\87]] ØªØ±Ø³Ø±Ù\87 Ú©Ú\93Û\8c.',
+'watchnologintext' => 'ددÛ\90 Ù\84پارÙ\87 Ú\86Û\90 Ø®Ù¾Ù\84 Ú©ØªÙ\86Ù\84Ú\93 Ú©Û\90 Ø¨Ø¯Ù\84Ù\88Ù\86 Ø±Ø§Ù\88Ù\84Û\8c Ù\86Ù\88 ØªØ§Ø³Ù\88 ØªÙ\87 Ù¾Ú©Ø§Ø± Ø¯Ù\87 Ú\86Û\90 Ù\84Ù\88Ù\85Ú\93Û\8c ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 [[Special:UserLogin|Ù\88رÙ\86Ù\86Ù\88Ú\81Û\8d]].',
 'addwatch' => 'کتنلړ کې ورګډول',
 'addedwatchtext' => "د \"[[:\$1]]\" په نوم يو مخ ستاسې [[Special:Watchlist|کتنلړ]] کې ورګډ شو.
 په راتلونکې کې چې په دغه مخ او د ده د خبرواترو مخ کې کوم بدلونونه راځي نو هغه به ستاسې کتنلړ کې ښکاره شي،
@@ -1757,6 +1773,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'undeleteinvert' => 'ټاکنې سرچپه کول',
 'undeletecomment' => 'سبب:',
 'undeletedfiles' => '{{PLURAL:$1|1 دوتنه بيازېرمه شوه|$1 دوتنې بيازېرمه شوې}}',
+'undelete-header' => 'د وروستيو ړنګو شوو مخونو لپاره [[Special:Log/delete|د ړنګولو يادښت]] وګورۍ.',
 'undelete-search-box' => 'ړنګ شوي مخونه لټول',
 'undelete-search-prefix' => 'هغه مخونه ښکاره کړه چې پېلېږي په:',
 'undelete-search-submit' => 'پلټل',
@@ -1774,8 +1791,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'mycontris' => 'زما ونډې',
 'contribsub2' => 'د $1 لپاره ($2)',
 'uctop' => '(سرپاڼه)',
-'month' => 'Ù\84Ù\87 Ù¼Ø§Ú©Ù\84Û\90 Ù\85Ù\8aاشتÛ\90 Ù\86Ù\87 Ø±Ø§Ù¾Ø¯Û\90Ø®Ù\88ا (اÙ\88 ØªØ± Ø¯Û\90 پخواني):',
-'year' => 'له ټاکلي کال نه راپدېخوا (او تر دې پخواني):',
+'month' => 'Ù\84Ù\87 Ù\85Ù\8aاشتÛ\90 Ø¯ (اÙ\88 پخواني):',
+'year' => 'له کال د (او پخواني):',
 
 'sp-contributions-newbies' => 'د نوو ګڼونونو ونډې ښکاره کول',
 'sp-contributions-newbies-sub' => 'د نوو ګڼونونو لپاره',
@@ -1873,7 +1890,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'contribslink' => 'ونډې',
 'emaillink' => 'برېښليک لېږل',
 'autoblocker' => 'په اتوماتيک ډول ستاسو مخنيوی شوی دا ځکه چې ستاسو IP پته وروستی ځل د "[[User:$1|$1]]" له خوا کارېدلې. او د $1 د مخنيوي سبب دا دی: "$2"',
-'blocklogpage' => 'د مخنيوي يادښت',
+'blocklogpage' => 'د بنديز يادښت',
 'blocklogentry' => 'په [[$1]] بنديز لګېدلی چې د بنديز د پای وخت يې $2 $3 دی',
 'unblocklogentry' => 'بنديز ليرې شو $1',
 'block-log-flags-anononly' => 'يواځې ورکنومي کارنان',
@@ -2054,6 +2071,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-preferences-save' => 'غوره توبونه خوندي کول',
 'tooltip-summary' => 'يو لنډ لنډيز کښل',
 
+# Scripts
+'vector.js' => '/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
+
 # Attribution
 'anonymous' => 'د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}',
 'siteuser' => 'د {{SITENAME}} کارن $1',
@@ -2066,10 +2086,10 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Info page
 'pageinfo-title' => 'د "$1" مالومات',
-'pageinfo-header-edits' => 'سÙ\85Ù\88Ù\86Ù\88Ù\86Ù\87',
+'pageinfo-header-edits' => 'د Ø³Ù\85Ù\88Ù\86 Ù¾Û\90Ú\9aÙ\84Ù\8aÚ©',
 'pageinfo-views' => 'د کتنو شمېر',
-'pageinfo-watchers' => 'د کتونکو شمېر',
-'pageinfo-edits' => 'د سمونونو شمېر',
+'pageinfo-watchers' => 'د مخ د کتونکو شمېر',
+'pageinfo-edits' => 'د ټولو سمونونو شمېر',
 
 # Skin names
 'skinname-standard' => 'کلاسيک',
@@ -2080,6 +2100,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'skinname-chick' => 'شيک',
 'skinname-simple' => 'ساده',
 'skinname-modern' => 'نوی',
+'skinname-vector' => 'وېکټور',
 
 # Patrolling
 'markaspatrolledtext' => 'دا مخ څارل شوی په نخښه کول',
@@ -2330,7 +2351,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # E-mail address confirmation
 'confirmemail' => 'د برېښليک پتې پخلی وکړی',
-'confirmemail_noemail' => 'تاسو يوه سمه برېښناليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارونکي غوره توبونه]] کې مو بدلون راولی.',
+'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
 'confirmemail_send' => 'يو تاييدي کوډ لېږل',
 'confirmemail_sent' => 'تاييدي برېښليک ولېږل شو.',
 'confirmemail_oncreate' => 'ستاسو د برېښناليک پتې ته يو تاييدي کوډ درولېږل شو.
@@ -2366,6 +2387,11 @@ $5
 'confirm-watch-button' => 'ښه',
 'confirm-unwatch-button' => 'ښه',
 
+# Separators for various lists, etc.
+'percent' => '$1%',
+'parentheses' => '($1)',
+'brackets' => '[$1]',
+
 # Multipage image navigation
 'imgmultipageprev' => '← پخوانی مخ',
 'imgmultipagenext' => 'راتلونکی مخ →',
@@ -2390,6 +2416,17 @@ $5
 'autoredircomment' => '[[$1]] ته وګرځولی شو',
 'autosumm-new' => 'د "$1" تورو مخ جوړ شو',
 
+# Size units
+'size-bytes' => '$1 بايټ',
+'size-kilobytes' => '$1 کيلوبايټ',
+'size-megabytes' => '$1 مېګابايټ',
+'size-gigabytes' => '$1 ګېګابايټ',
+'size-terabytes' => '$1 ټېرابايټ',
+'size-petabytes' => '$1 پېبي بايټ',
+'size-exabytes' => '$1 اېکسبي بايټ',
+'size-zetabytes' => '$1 زېبي بايټ',
+'size-yottabytes' => '$1 يوبي بايټ',
+
 # Live preview
 'livepreview-loading' => 'برسېرېدنې کې دی...',
 'livepreview-ready' => 'برسېرېدنه ... چمتو ده!',
@@ -2427,6 +2464,28 @@ $5
 'iranian-calendar-m11' => 'سلواغه',
 'iranian-calendar-m12' => 'کب',
 
+# Hijri month names
+'hijri-calendar-m1' => 'محرم',
+'hijri-calendar-m2' => 'صفر',
+'hijri-calendar-m3' => 'ربيع الاول',
+'hijri-calendar-m4' => 'ربيع الثاني',
+'hijri-calendar-m5' => 'جمادى الاولى',
+'hijri-calendar-m6' => 'جمادى الثانية',
+'hijri-calendar-m7' => 'رجب',
+'hijri-calendar-m8' => 'شعبان',
+'hijri-calendar-m9' => 'رمضان',
+'hijri-calendar-m10' => 'شوال',
+'hijri-calendar-m11' => 'ذو القعدة',
+'hijri-calendar-m12' => 'ذو الحجة',
+
+# Hebrew month names
+'hebrew-calendar-m1' => 'تيشري',
+'hebrew-calendar-m2' => 'حشوان',
+'hebrew-calendar-m3' => 'كيسليف',
+'hebrew-calendar-m4' => 'تيفيت',
+'hebrew-calendar-m5' => 'شيفات',
+'hebrew-calendar-m6' => 'آدار',
+
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])',
 
@@ -2474,6 +2533,7 @@ $5
 'specialpages-group-other' => 'نور ځانګړي مخونه',
 'specialpages-group-login' => 'ننوتل / ګڼون جوړول',
 'specialpages-group-changes' => 'وروستي بدلونونه او يادښتونه',
+'specialpages-group-media' => 'د رسنۍ راپورونه او پورته کېدنې',
 'specialpages-group-users' => 'کارنان او رښتې',
 'specialpages-group-highuse' => 'ډېر کارېدونکي مخونه',
 'specialpages-group-pages' => 'د مخونو لړليک',
index 4b52538..63482bf 100644 (file)
@@ -329,16 +329,16 @@ $messages = array(
 'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
 'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
 'tog-watchcreations' => 'Adicionar as páginas e arquivos que eu criar às minhas páginas vigiadas',
-'tog-watchdefault' => 'Adicionar páginas editadas por mim à minha lista de páginas vigiadas',
-'tog-watchmoves' => 'Adicionar páginas movidas por mim à minha lista de páginas vigiadas',
-'tog-watchdeletion' => 'Adicionar páginas eliminadas por mim à minha lista de páginas vigiadas',
+'tog-watchdefault' => 'Adicionar as páginas e arquivos que eu editar às minhas páginas vigiadas',
+'tog-watchmoves' => 'Adicionar as páginas e arquivos que eu mover às minhas páginas vigiadas',
+'tog-watchdeletion' => 'Adicionar as páginas e arquivos que eu eliminar às minhas páginas vigiadas',
 'tog-minordefault' => 'Marcar todas as edições como secundárias, por padrão',
 'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
 'tog-nocache' => 'Desativar o cache de páginas do navegador',
-'tog-enotifwatchlistpages' => 'Receber e-mail quando uma página da minha lista de páginas vigiadas for alterada',
+'tog-enotifwatchlistpages' => 'Notificar-me por e-mail quando uma página ou arquivo vigiado for alterado',
 'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
-'tog-enotifminoredits' => 'Enviar-me um email também quando forem edições menores',
+'tog-enotifminoredits' => 'Notificar-me por e-mail também sobre edições menores de páginas ou arquivos',
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
@@ -1235,9 +1235,10 @@ Você não tem acesso a ele.',
 'revdelete-concurrent-change' => 'Erro ao modificar o item datado de $2, $1: o seu estado parece ter sido alterado por outra pessoa enquanto você tentava modificá-lo.
 Por favor, verifique os registros.',
 'revdelete-only-restricted' => 'Erro ao ocultar o item de $2 às $1: você não pode impedir que itens sejam visualizados por administradores sem também selecionar uma das outras opções de visibilidade.',
-'revdelete-reason-dropdown' => '*Motivos comuns para eliminação
-** Violação de direitos autorais
-** Informação pessoal inapropriada
+'revdelete-reason-dropdown' => '*Razões comuns para eliminação
+** Violação de direitos de autor
+** Comentário ou informação pessoal inapropriada
+** Nome de usuário impróprio
 ** Informação potencialmente difamatória',
 'revdelete-otherreason' => 'Outro motivo/motivo adicional:',
 'revdelete-reasonotherlist' => 'Outro motivo',
@@ -2112,6 +2113,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorias}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|Interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisão|revisões}}',
@@ -2140,6 +2142,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'mostlinkedtemplates' => 'Predefinições com mais afluentes',
 'mostcategories' => 'Páginas de conteúdo com mais categorias',
 'mostimages' => 'Imagens com mais afluentes',
+'mostinterwikis' => 'Páginas com mais interwikis',
 'mostrevisions' => 'Páginas de conteúdo com mais revisões',
 'prefixindex' => 'Todas as páginas com prefixo',
 'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
@@ -2431,6 +2434,8 @@ prossiga com cuidado.',
 'rollback' => 'Reverter edições',
 'rollback_short' => 'Reverter',
 'rollbacklink' => 'reverter',
+'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edição|edições}}',
+'rollbacklinkcount-morethan' => 'reverter mais de $1 {{PLURAL:$1|edição|edições}}',
 'rollbackfailed' => 'A reversão falhou',
 'cantrollback' => 'Não foi possível reverter a edição; o último contribuidor é o único autor desta página',
 'alreadyrolled' => 'Não foi possível reverter a última edição de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2914,6 +2919,7 @@ Todas as ações de importação transwiki são registradas no [[Special:Log/imp
 'import-interwiki-templates' => 'Incluir todas as predefinições',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Domínio de destino:',
+'import-interwiki-rootpage' => 'Página raiz de destino (opcional):',
 'import-upload-filename' => 'Nome do arquivo:',
 'import-comment' => 'Comentário:',
 'importtext' => 'Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
@@ -2946,6 +2952,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
 'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
 'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
+'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
 
 # Import log
 'importlogpage' => 'Registro de importações',
@@ -3080,11 +3087,30 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
+'pageinfo-header-basic' => 'Informação básica',
 'pageinfo-header-edits' => 'Histórico de edições',
+'pageinfo-header-restrictions' => 'Proteção da página',
+'pageinfo-header-properties' => 'Propriedades da página',
+'pageinfo-display-title' => 'Exibir título',
+'pageinfo-length' => 'Tamanho da página (em bytes)',
+'pageinfo-article-id' => 'ID da página',
+'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-index' => 'Indexável',
+'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
-'pageinfo-watchers' => 'Número de pessoas vigiando',
-'pageinfo-edits' => 'Número de edições',
-'pageinfo-authors' => 'Número de autores individuais',
+'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-redirects-name' => 'Redireciona para esta página',
+'pageinfo-subpages-name' => 'Subpáginas desta página',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não-redirecionamento|não-redirecionamentos}})',
+'pageinfo-firstuser' => 'Criador da página',
+'pageinfo-firsttime' => 'Data de criação da página',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Data da última edição',
+'pageinfo-edits' => 'Número total de edições',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
+'pageinfo-recent-authors' => 'Número recente de autores distintos',
+'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
 
 # Skin names
 'skinname-standard' => 'Clássico',
index 3c0cb81..65db9a4 100644 (file)
@@ -26,6 +26,7 @@
  * @author Brest
  * @author BrokenArrow
  * @author Byrial
+ * @author BáthoryPéter
  * @author Claudia Hattitten
  * @author Codex Sinaiticus
  * @author Crt
@@ -462,7 +463,8 @@ Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
 'toolbox' => 'The title of the toolbox below the search menu.',
 'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
 {{Identical|Otherlanguages}}',
-'redirectedfrom' => 'The text displayed when a certain page is redirected to another page. Variable <tt>$1</tt> contains the name of the page user came from.',
+'redirectedfrom' => 'The text displayed when a certain page is redirected to another page.
+*<tt>$1</tt> contains the name of the page user came from.',
 'redirectpagesub' => 'Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.
 
 {{Identical|Redirect page}}',
@@ -544,7 +546,7 @@ Do '''not''' replace SITENAME with a translation of Wikipedia or some encycopedi
 Appears in subtitle
 * $1 is a link to the page (HTML)',
 'retrievedfrom' => 'Message which appears in the source of every page, but it is hidden. It is shown when printing. $1 is a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}.',
-'youhavenewmessages' => 'The blue message appearing when someone edited your user talk page.
+'youhavenewmessages' => 'The yellow message appearing when someone edited your user talk page.
 The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslink/{{SUBPAGENAME}}|{{int:newmessageslink}}]] |[[MediaWiki:Newmessagesdifflink/{{SUBPAGENAME}}|{{int:newmessagesdifflink}}]]}}"',
 'newmessageslink' => 'This is the first link displayed in an orange rectangle when a user gets a message on his talk page. Used in message {{msg-mw|youhavenewmessages}} (as parameter $1).
 
@@ -3489,7 +3491,7 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 'pageinfo-recent-edits' => 'The number of times the page has been edited recently. $1 is a localised duration (e.g. 9 days).',
 'pageinfo-recent-authors' => 'The number of users who have edited the page recently.',
 'pageinfo-restriction' => 'Parameters:
-* $1 is the type of page protection (message restriction-$type, preferably in lowercase). If your language doesn\'t have small and capital letters, you can simply write <nowiki><code>$1</code></nowiki>.',
+* $1 is the type of page protection (message restriction-$type, preferably in lowercase). If your language doesn\'t have small and capital letters, you can simply write <nowiki>$1</nowiki>.',
 'pageinfo-magic-words' => 'The list of magic words on the page. Parameters:
 * $1 is the number of magic words on the page.',
 'pageinfo-hidden-categories' => 'The list of hidden categories on the page. Parameters:
index beed6e8..f501dea 100644 (file)
@@ -1228,10 +1228,10 @@ Nu ai acces asupra lui.',
 'revdelete-no-change' => "'''Atenție:''' elementul datat $2, $1 are deja aplicată vizibilitatea cerută.",
 'revdelete-concurrent-change' => 'Eroare la modificarea elementului datat $2, $1: statutul său a fost modificat de altcineva în timpul acestei modificări.',
 'revdelete-only-restricted' => 'Eroare în timpul suprimării elementului datat $1, $2: nu puteți suprima elemente la vizualizarea de către administratori fără a marca una din celelalte opțiuni de suprimare.',
-'revdelete-reason-dropdown' => '*Motive de ascundere
+'revdelete-reason-dropdown' => '*Motive generale de ștergere
 ** Violarea drepturilor de autor
-** Informații personale
-** Obscenități
+** Comentarii inadecvate sau informații personale
+** Nume de utilizator inadecvat
 ** Atacuri la persoană',
 'revdelete-otherreason' => 'Motiv suplimentar, detalii',
 'revdelete-reasonotherlist' => 'Alt motiv',
@@ -3111,7 +3111,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-authors' => 'Număr total de autori distincți',
 'pageinfo-recent-edits' => 'Număr de modificări recente (în ultima perioadă de $1)',
 'pageinfo-recent-authors' => 'Număr de autori distincți recenți',
-'pageinfo-restriction' => 'Protecție pagină (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Protecție pagină ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Cuvânt magic|Cuvinte magice}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
index 2f0ab9c..638b8a6 100644 (file)
@@ -986,7 +986,9 @@ Pe piacere condrolle l'archivije.",
 'revdelete-only-restricted' => "Errore scunnènne l'artichele datate $2, $1: tu non ge puè sopprimere l'artichele da 'a viste de le amministrature senze ca scacchie pure une de le otre opziune de soppressione.",
 'revdelete-reason-dropdown' => "*Mutive comune pa scangellazzione
 ** Violazione d'u copyright
-** 'Mbormaziune personale inappropriate",
+** 'Mbormaziune personale o commende inappropriate
+** Nome utende inappropriate
+** 'Mbormaziune potenzialmende diffamatorie",
 'revdelete-otherreason' => 'Otre/addizionale mutive:',
 'revdelete-reasonotherlist' => 'Otre mutive',
 'revdelete-edit-reasonlist' => "Mutive d'a scangellazione d'u cangiamende",
@@ -1762,6 +1764,7 @@ Pò essere ca tu vuè cangià 'a descrizione de jidde [$2 pàgene de descrizione
 'shared-repo' => "'nu condenitore de cose condivise",
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => "/* 'U CSS ca se iacchie aqquà jè ingluse sus 'a pàgene de descrizione d'u file, pure ingluse pe le client de le Uicchi furastire */",
+'upload-disallowed-here' => "Sfortunatamende non ge puè sovrascrivere st'immaggine.",
 
 # File reversion
 'filerevert' => "'Nvirte $1",
@@ -2747,6 +2750,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-error-special' => "'A pagena \"\$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
 'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => "'A pàgene radice date tène 'nu titole invalide.",
 
 # Import log
 'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2922,6 +2926,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-lasttime' => "Darte de l'urteme cangiamende",
 'pageinfo-edits' => 'Numere totale de cangiaminde',
 'pageinfo-authors' => 'Numere Totale de autore diverse',
+'pageinfo-recent-edits' => "Numere de le urteme cangiaminde ('mbonde a $1)",
+'pageinfo-recent-authors' => 'Numere de le urteme autore diverse',
 'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
 
 # Skin names
index be9b03d..39ede3e 100644 (file)
@@ -3225,7 +3225,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-authors' => 'Общее число различных авторов',
 'pageinfo-recent-edits' => 'Правок за последнее время (в течение $1)',
 'pageinfo-recent-authors' => 'Уникальных авторов за последнее время',
-'pageinfo-restriction' => 'Защита страницы (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Защита страницы ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магическое слово|Магические слова}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытых категорий}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
index 82a4753..6d3ac8a 100644 (file)
@@ -119,7 +119,7 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Підчарковати одказы:',
+'tog-underline' => 'Підкреслёвати одказы:',
 'tog-justify' => 'Зарівнати текст до блоку',
 'tog-hideminor' => 'Сховати малы едітованя в списку послїднїх змін',
 'tog-hidepatrolled' => 'Сховати патролёваны едітованя в списку послїднїх змін',
@@ -146,7 +146,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Послати електронічну пошту і про меншы едітованя сторінок і файлів',
 'tog-enotifrevealaddr' => 'Прозрадити мою поштову адресу в поштї  увідомлїня',
 'tog-shownumberswatching' => 'Вказати кілько хоснователїв придало сторінку до свого списку слїдованых',
-'tog-oldsig' => 'Ð\95кзÑ\96Ñ\81Ñ\82уючій підпис:',
+'tog-oldsig' => 'Ð\86Ñ\81нуючій підпис:',
 'tog-fancysig' => 'Хосновати про підпис вікітекст (без автоматічного одказу)',
 'tog-externaleditor' => 'Імпліцітно хосновати екстерный едітор (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
 'tog-externaldiff' => 'Імпліцітно хосновати проґрам про порівнаваня (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
@@ -156,10 +156,10 @@ $messages = array(
 'tog-watchlisthideown' => 'Сховати мої едітованя на списку слїдованых сторінок',
 'tog-watchlisthidebots' => 'Сховати едітованя ботів у списку слїдованых сторінок',
 'tog-watchlisthideminor' => 'Сховати малы едітованя зо списку слїдованых сторінок',
-'tog-watchlisthideliu' => 'У Ñ\81пиÑ\81кÑ\83 Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\81Ñ\85оваÑ\82и ÐµÐ´Ñ\96Ñ\82аÑ\86Ñ\96Ñ\97 приголошеных хоснователїв',
-'tog-watchlisthideanons' => 'У Ñ\81пиÑ\81кÑ\83 Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\81Ñ\85оваÑ\82и ÐµÐ´Ñ\96Ñ\82аÑ\86Ñ\96Ñ\97 анонімів',
-'tog-watchlisthidepatrolled' => 'СÑ\85оваÑ\82и Ð¿Ð°Ñ\82Ñ\80олÑ\91ванÑ\8b ÐµÐ´Ñ\96Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\83 слїдованых сторінках',
-'tog-ccmeonemails' => 'Ð\9fоÑ\81Ñ\8bлаÑ\82и Ð¼Ñ\96 ÐºÐ¾Ð¿Ñ\96Ñ\97 Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, ÐºÐ¾Ñ\82Ñ\80Ñ\83 Ð¿Ð¾Ñ\88лÑ\8e іншым хоснователям',
+'tog-watchlisthideliu' => 'Ð\92 Ñ\81пиÑ\81кÑ\83 Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\81Ñ\85оваÑ\82и ÐµÐ´Ñ\96Ñ\82ованÑ\8f приголошеных хоснователїв',
+'tog-watchlisthideanons' => 'Ð\92 Ñ\81пиÑ\81кÑ\83 Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\81Ñ\85оваÑ\82и ÐµÐ´Ñ\96Ñ\82ованÑ\8f анонімів',
+'tog-watchlisthidepatrolled' => 'СÑ\85оваÑ\82и Ð¿Ð°Ñ\82Ñ\80олÑ\91ванÑ\8b ÐµÐ´Ñ\96Ñ\82ованÑ\8f Ð² слїдованых сторінках',
+'tog-ccmeonemails' => 'Ð\9fоÑ\81Ñ\8bлаÑ\82и Ð¼Ñ\96 ÐºÐ¾Ð¿Ñ\96Ñ\97 Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, ÐºÐ¾Ñ\82Ñ\80Ñ\83 Ð·Ð°Ð¶ÐµÐ½Ñ\83 іншым хоснователям',
 'tog-diffonly' => 'Не вказовати обсяг сторінкы під роздїлом  верзій',
 'tog-showhiddencats' => 'Вказати схованы катеґорії',
 'tog-norollbackdiff' => 'По вернутю зміны не вказовати порівнаня роздїлів',
@@ -232,7 +232,7 @@ $messages = array(
 'category_header' => 'Сторінкы в катеґорії «$1»',
 'subcategories' => 'Підкатеґорії',
 'category-media-header' => 'Файлы в катеґорії «$1»',
-'category-empty' => "''ТоÑ\82а катеґорія порожня.''",
+'category-empty' => "''Ð\93евÑ\81Ñ\8f катеґорія порожня.''",
 'hidden-categories' => '{{PLURAL:$1|Скрыта катеґорія|Скрыты катеґорії}}',
 'hidden-category-category' => 'Схованы катеґорії',
 'category-subcat-count' => '{{PLURAL:$2|Тота катеґорія має лем таку підкатеґорію.|{{PLURAL:$1|Указана $1 підкатеґорія|Указаны $1 підкатеґорії|Указаных $1 підкатеґорій}} із $2.}}',
@@ -244,7 +244,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(дале)',
 'index-category' => 'Індексованы сторінкы',
 'noindex-category' => 'Неіндексованы сторінкы',
-'broken-file-category' => 'Сторінкы, што ся одказують на неекзістуючі файлы',
+'broken-file-category' => 'Сторінкы, што ся одказують на неіснуючі файлы',
 
 'about' => 'О',
 'article' => 'Обсягова сторінка',
@@ -295,7 +295,7 @@ $messages = array(
 'searcharticle' => 'Перейти',
 'history' => 'Історія сторінкы',
 'history_short' => 'Історія',
-'updatedmarker' => 'змÑ\96нено Ð¾Ð´ Ð¿Ð¾Ñ\81лÑ\97днÑ\8bй навщівы',
+'updatedmarker' => 'обновлено Ð¾Ð´ Ð¿Ð¾Ñ\81лÑ\97днÑ\91й навщівы',
 'printableversion' => 'Верзія до друку',
 'permalink' => 'Перманентный одказ',
 'print' => 'Друк',
@@ -340,8 +340,8 @@ $messages = array(
 'jumpto' => 'Перейти до:',
 'jumptonavigation' => 'навіґація',
 'jumptosearch' => 'Найти',
-'view-pool-error' => 'Перебачте, серверы суть теперь перетяжены.
-Тоту сторінку сі теперь перезерать много хоснователїв.
+'view-pool-error' => 'Перебачте, серверы суть теперь переладованы.
+Тоту сторінку сі теперь пoзерать много хоснователїв.
 Просиме Вас, почекайте і спробуйте доступность пізнїше.
 
 $1',
@@ -371,7 +371,7 @@ $1',
 
 'badaccess' => 'Брак прав приступу',
 'badaccess-group0' => 'Вам не є дозволено выконавати тоту дїю.',
-'badaccess-groups' => 'Дїя, яку сьте хотїли зробити, дозволена лем хоснователям із {{PLURAL:$2|ґрупы|ґруп}}: $1.',
+'badaccess-groups' => 'Дїя, яку сьте хотїли зробити, дозволена лем хоснователям з {{PLURAL:$2|ґрупы|ґруп}}: $1.',
 
 'versionrequired' => 'Потрібна MediaWiki верзії $1',
 'versionrequiredtext' => 'Про роботу з тов сторінков потрібна MediaWiki верзії $1. Відь [[Special:Version|сторінку верзії]].',
@@ -439,9 +439,9 @@ $1',
 'dberrortext' => 'Найджена  сінтактічна хыба в запросї до датабазы.
 Тото може вказовати на хыбу в проґрамовім забеспечіню.
 Послїднїй запрос до датабазы:
-<blockquote><tt>$1</tt></blockquote>
-з функції "<tt>$2</tt>".
-Датабаза вернула хыбу "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+з функції "<code>$2</code>".
+Датабаза вернула хыбу "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Найджена сінтактічна хыба в запросї до датабазы.
 Послїднїй запрос до датабазы:
 «$1»
@@ -469,7 +469,7 @@ $1',
 'filecopyerror' => 'Не было можне копіровати файл «$1» на «$2».',
 'filerenameerror' => 'Не было можне переменовати файл «$1» на «$2».',
 'filedeleteerror' => 'Не было можне змазаты файл «$1».',
-'directorycreateerror' => 'Не є можне вытворити адресарь «$1».',
+'directorycreateerror' => 'Не мож вытворити адресарь «$1».',
 'filenotfound' => 'Не было можне найти файл «$1».',
 'fileexistserror' => 'Не дасть ся записати до файлу «$1»: файл екзістує.',
 'unexpected' => 'Неочекавана годнота: «$1»=«$2».',
@@ -491,7 +491,7 @@ $1',
 'viewsource' => 'Видїти код',
 'viewsource-title' => 'Видїти жрідло сторінкы $1',
 'actionthrottled' => 'Акція была придушена',
-'actionthrottledtext' => 'Ð\92зглÑ\8fдом ÐºÑ\83 Ð¿Ñ\80оÑ\82иÑ\81памовÑ\8bм Ð¾Ð¿Ð°Ñ\82Ñ\80Ñ\97нÑ\8fм не можете жадану акцію провести барз часто в короткім часї. Спробуйте то знову о пару мінут.',
+'actionthrottledtext' => 'Ð\92зглÑ\8fдом ÐºÑ\83 Ð¿Ñ\80оÑ\82иÑ\81памовÑ\8bм ÐºÑ\80окам не можете жадану акцію провести барз часто в короткім часї. Спробуйте то знову о пару мінут.',
 'protectedpagetext' => 'Тота сторінка была замкнута, также ся не дасть едітовати',
 'viewsourcetext' => 'Можете видїти і копіровати код той сторінкы:',
 'viewyourtext' => "Можете собі посмотрити і скопіровати жрідловый текст '''вашых змін''' той сторінкы:",
@@ -802,7 +802,7 @@ $2
 'previewconflict' => 'Тот нагляд зображує текст так, як буде вызерати по уложіню сторінкы.',
 'session_fail_preview' => "'''Вашу пожадавку ся не удало спрацовати, бо были страчены дата сеансу.
 Просиме, спробуйте то зясь.
\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¾Ð¿Ð°ÐºÐ¾Ð²Ð°ти, спробуйте ся [[Special:UserLogout|одголосити]] і знову приголосити до сістемы.'''",
\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¿Ð¾Ð²Ñ\82оÑ\80ити, спробуйте ся [[Special:UserLogout|одголосити]] і знову приголосити до сістемы.'''",
 'session_fail_preview_html' => "'''Вашу пожадавку ся не удало спрацовати, бо были страчены дата сеансу..'''
 
 ''Зато же {{SITENAME}} має запнуте хоснованя чістого HTML, нагляд ся про превенцію проти атакам JavaScript-ом не зображує.''
@@ -818,10 +818,10 @@ $2
 'editingcomment' => 'Едітованя $1 (нова секція)',
 'editconflict' => 'Конфлікт едітованя: $1',
 'explainconflict' => "Дахто змінив сторінку по започатю вашой едітації.
-Выше видите актуалный текст сторінкы.
\92Ñ\8bÑ\81Ñ\88е Ð²Ð¸Ð´Ð¸Ñ\82е Ð°ÐºÑ\82Ñ\83алнÑ\8bй Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b.
 Вашы зміны суть вказаны долов.
\9cÑ\83Ñ\81иÑ\82е Ð·Ð»Ñ\83Ñ\87Ñ\96Ñ\82и Ñ\81воÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð· Ñ\94Ñ\81Ñ\82вуючім текстом.
-'''Ð\9bем''' Ð²Ñ\8bÑ\88е Ð²ÐºÐ°Ð·Ð°Ð½Ñ\8bй Ñ\82екÑ\81Ñ\82 Ð·Ñ\96Ñ\81Ñ\82ане Ñ\83Ñ\85ованый по кликнутю на  „{{int:savearticle}}“.",
\9cÑ\83Ñ\81иÑ\82е Ð·Ð»Ñ\83Ñ\87Ñ\96Ñ\82и Ñ\81воÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð· Ñ\96Ñ\81нуючім текстом.
+'''Ð\9bем''' Ð²Ñ\8bÑ\81Ñ\88е Ð²ÐºÐ°Ð·Ð°Ð½Ñ\8bй Ñ\82екÑ\81Ñ\82 Ð·Ñ\96Ñ\81Ñ\82ане Ð²Ñ\81окоÑ\87еный по кликнутю на  „{{int:savearticle}}“.",
 'yourtext' => 'Ваш текст',
 'storedversion' => 'Уложена верзія',
 'nonunicodebrowser' => "'''Увага: Ваш переглядач не є способный працовати із знаками Unicode. Абы сьте могли тоту сторінку беспечно едітовати: вшыткы знакы мімо  ASCII суть зображены в гексадецімалных кодах.'''",
@@ -856,7 +856,7 @@ $2
 'nocreate-loggedin' => 'Не маєте права створёвати новы сторінкы.',
 'sectioneditnotsupported-title' => 'Едітованя секцій не є підпороване',
 'sectioneditnotsupported-text' => 'На тій сторінцї не є підпороване едітованя єдной секції.',
-'permissionserrors' => 'Ð¥Ñ\8bба Ð¾Ð¿Ñ\80авнÑ\97нÑ\8f',
+'permissionserrors' => 'Ð¥Ñ\8bба Ð¿Ñ\80ав',
 'permissionserrorstext' => 'Не маєте поволїня той операції з  {{PLURAL:$1|такой причіны|такых причін}}:',
 'permissionserrorstext-withaction' => 'Не маєте дозволїня на $2 з {{PLURAL:$1|такой прічіны|такых прічін}}:',
 'recreate-moveddeleted-warn' => "'''Увага: Пробуєте знову створити сторінку, котра была в минулости змазана.'''
@@ -871,7 +871,7 @@ $2
 Асі была змазана.',
 'edit-conflict' => 'Конфлікт едітованя.',
 'edit-no-change' => 'Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.',
-'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж екзістує.',
+'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж існує.',
 'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
 
 # Parser/template warnings
@@ -896,8 +896,8 @@ $2
 'converter-manual-rule-error' => 'Найджена хыба в ручнім правилї конверзії языка',
 
 # "Undo" feature
-'undo-success' => 'Ð\95дÑ\96Ñ\82ованÑ\8f Ð¼Ð¾Ð¶Ðµ Ð±Ñ\8bÑ\82и Ð·Ñ\80Ñ\83Ñ\87ене.
-Просиме Вас перевірте порівнаня ниже, жебы сьте ся упевнили в тім, што хочете зробити а потім уложте зміны долов, жебы сьте закінчіли зрушіня едітованя.',
+'undo-success' => 'Ð\95дÑ\96Ñ\82ованÑ\8f Ð¼Ð¾Ð¶Ðµ Ð±Ñ\8bÑ\82и Ð·Ñ\80Ñ\83Ñ\88ене.
\9fÑ\80оÑ\81име Ð\92аÑ\81 Ð¿ÐµÑ\80евÑ\96Ñ\80Ñ\8cÑ\82е Ð¿Ð¾Ñ\80Ñ\96внанÑ\8f Ð½Ð¸Ð¶Ðµ, Ð¶ÐµÐ±Ñ\8b Ñ\81Ñ\8cÑ\82е Ñ\81Ñ\8f Ñ\83певнили Ð² Ñ\82Ñ\96м, Ñ\88Ñ\82о Ñ\85оÑ\87еÑ\82е Ð·Ñ\80обиÑ\82и Ð° Ð¿Ð¾Ñ\82Ñ\96м Ñ\83ложÑ\82е Ð·Ð¼Ñ\96нÑ\8b Ð´Ð¾Ð»Ð¾Ð², Ð¶ÐµÐ±Ñ\8b Ñ\81Ñ\8cÑ\82е Ð·Ð°ÐºÑ\96нÑ\87Ñ\96ли Ð·Ñ\80Ñ\83Ñ\88Ñ\96нÑ\8f ÐµÐ´Ñ\96Ñ\82ованÑ\8f.',
 'undo-failure' => 'Едітованя не могло быти зрушене про конфлікт міджілеглых змін.',
 'undo-norev' => 'Тото едітованя не можете вернути назад, бо не екзістує або было змазане.',
 'undo-summary' => 'Зрушена верзія $1 од хоснователя [[Special:Contributions/$2|$2]] ([[User talk:$2|діскузія]])',
@@ -936,42 +936,42 @@ $3 зазначів тоту причіну: ''$2''",
 'history-feed-title' => 'Історія едітовань',
 'history-feed-description' => 'Історія едітовань той сторінкы на вікі',
 'history-feed-item-nocomment' => '$1 в $2',
-'history-feed-empty' => 'Такой сторінкы не екзістує.
+'history-feed-empty' => 'Такой сторінкы нїт.
 Могли єй вымазати ці переменовати.
-СпÑ\80обÑ\83йÑ\82е [[Special:Search|найÑ\82и Ð²Ð¾ вікі]] подобны сторінкы.',
+СпÑ\80обÑ\83йÑ\82е [[Special:Search|найÑ\82и Ð½Ð° вікі]] подобны сторінкы.',
 
 # Revision deletion
 'rev-deleted-comment' => '(згорнутя едітованя вымазане)',
-'rev-deleted-user' => '(мено автора стерто)',
+'rev-deleted-user' => '(імя автора стерто)',
 'rev-deleted-event' => '(лоґ одстраненый)',
 'rev-deleted-user-contribs' => '[мено хоснователя або IP адреса одстранене – едітованя є в приспевках сховане]',
-'rev-deleted-text-permission' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла  '''змазана'''.
\94еÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð·Ð¼Ð°Ð·Ð°ных сторінок].",
-'rev-deleted-text-unhide' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла '''змазана'''.
\94еÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð·Ð¼Ð°Ð·Ð°ных сторінок].
+'rev-deleted-text-permission' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла  '''вÑ\8bлÑ\83Ñ\87ена''.
\94еÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð²Ñ\8bлÑ\83Ñ\87еных сторінок].",
+'rev-deleted-text-unhide' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла '''вÑ\8bлÑ\83Ñ\87ена'''.
\94еÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð²Ñ\8bлÑ\83Ñ\87еных сторінок].
 Можете  сі все [$1 тоту ревізію посмотрити], кідь хочете.",
 'rev-suppressed-text-unhide' => "Тота ревізія была '''затаєна'''.
 Детайлы можуть быти уведены в  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} записї утаїня].
 Можете сі [$1 тоту ревізію посмотрити], кідь  хочете.",
-'rev-deleted-text-view' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла  '''змазана'''.
\9cожеÑ\82е Ñ\81Ñ\96 Ñ\94й Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и; Ð´ÐµÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð·Ð¼Ð°Ð·Ð°ных сторінок].",
+'rev-deleted-text-view' => "ТоÑ\82а Ñ\80евÑ\96зÑ\96Ñ\8f Ð±Ñ\8bла  '''вÑ\8bлÑ\83Ñ\87ена'''.
\9cожеÑ\82е Ñ\81Ñ\96 Ñ\94й Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и; Ð´ÐµÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð²Ñ\8bлÑ\83Ñ\87еных сторінок].",
 'rev-suppressed-text-view' => "Тота верзія была '''затаєна'''.
 Можете сі єй посмотрити; детайлы можуть быти зазначены в  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} записї затаїня].",
 'rev-deleted-no-diff' => "Тот розділ сі не можете помострити, бо єдна з &nbsp;ревізій была '''змазана'''.
 Детайлы можуть быти зазначены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} книзї змазаных сторінок].",
 'rev-suppressed-no-diff' => "Тот роздїл сі не можете посмотрити, бо єдна з ревізій была  '''змазана'''.",
-'rev-deleted-unhide-diff' => "Ð\84дна Ð· Ñ\80евÑ\96зÑ\96й Ð¿Ñ\80о Ñ\82оÑ\82о Ð¿Ð¾Ñ\80Ñ\96внанÑ\8f Ð±Ñ\8bла '''змазана'''.
+'rev-deleted-unhide-diff' => "Ð\84дна Ð· Ñ\80евÑ\96зÑ\96й Ð¿Ñ\80о Ñ\82оÑ\82о Ð¿Ð¾Ñ\80Ñ\96внанÑ\8f Ð±Ñ\8bла '''вÑ\8bлÑ\83Ñ\87ена'''.
 Можете сі але  [$1 тоту ревізію посмотрити], кідь хочете.",
 'rev-suppressed-unhide-diff' => "Єдна з ревізій про тото порівнаня была '''затаєна'''.
 Детайлы можуть быти уведены в  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} записї утаїня].
 Можете сі але [$1 тоту ревізію посмотрити], кідь  хочете.",
-'rev-deleted-diff-view' => "Ð\84дна Ð· Ñ\80евÑ\96зÑ\96й Ð¿Ñ\80о Ñ\82оÑ\82о Ð¿Ð¾Ñ\80Ñ\96внанÑ\8f Ð±Ñ\8bла  '''змазана'''.
\9cожеÑ\82е Ñ\81Ñ\96 Ñ\94й Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и; Ð´ÐµÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð·Ð¼Ð°Ð·Ð°ных сторінок].",
+'rev-deleted-diff-view' => "Ð\84дна Ð· Ñ\80евÑ\96зÑ\96й Ð¿Ñ\80о Ñ\82оÑ\82о Ð¿Ð¾Ñ\80Ñ\96внанÑ\8f Ð±Ñ\8bла  '''вÑ\8bлÑ\83Ñ\87ена'''.
\9cожеÑ\82е Ñ\81Ñ\96 Ñ\94й Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и; Ð´ÐµÑ\82айлÑ\8b Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\8bÑ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ð² [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐ½Ð¸Ð·Ñ\97 Ð²Ñ\8bлÑ\83Ñ\87еных сторінок].",
 'rev-suppressed-diff-view' => "Єдна з ревізій про тото порівнаня была '''затаєна'''.
 Можете сі єй посмотрити; детайлы можуть быти зазначены в  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} записї затаїня].",
 'rev-delundel' => 'вказати/сховати',
 'rev-showdeleted' => 'вказати',
-'revisiondelete' => 'Ð\97мазати/обновити ревізії',
+'revisiondelete' => 'Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96ти/обновити ревізії',
 'revdelete-nooldid-title' => 'Хыбна цілёва ревізія',
 'revdelete-nooldid-text' => 'Не зволили сьте ревізії, на котрых хочете тоту функцію выконати.',
 'revdelete-nologtype-title' => 'Нестановленый тіп запису',
@@ -979,7 +979,7 @@ $3 зазначів тоту причіну: ''$2''",
 'revdelete-nologid-title' => 'Неплатный протоколовачій запис',
 'revdelete-nologid-text' => 'Будь сьте не зазначіли цілёвый запис в протоколї або даный запис не екзістує.',
 'revdelete-no-file' => 'Зазначеный файл не єствує.',
-'revdelete-show-file-confirm' => 'Ð\9dа Ð¿ÐµÐ²Ð½Ð¾ Ñ\81обÑ\96 Ñ\85оÑ\87еÑ\82е Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и Ð·Ð¼Ð°Ð·Ð°ну ревізію файлу „<nowiki>$1</nowiki>“ з $2, $3?',
+'revdelete-show-file-confirm' => 'Ð\9dа Ð¿ÐµÐ²Ð½Ð¾ Ñ\81обÑ\96 Ñ\85оÑ\87еÑ\82е Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и Ð²Ñ\8bлÑ\83Ñ\87ену ревізію файлу „<nowiki>$1</nowiki>“ з $2, $3?',
 'revdelete-show-file-submit' => 'Гей',
 'revdelete-selected' => "'''{{PLURAL:$2|Выбрана ревізія|Выбраны ревізії}} з [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Выбрана протоколована подїя|Выбраны протоколованы подїї}}:'''",
@@ -1012,7 +1012,7 @@ $1",
 'logdelete-failure' => "'''Не вдало ся наставити видимость протоколу.'''
 $1",
 'revdel-restore' => 'Змінити видимость',
-'revdel-restore-deleted' => 'вÑ\8bмазаны ревізії',
+'revdel-restore-deleted' => 'вÑ\8bлÑ\83Ñ\87ены ревізії',
 'revdel-restore-visible' => 'видительны ревізії',
 'pagehist' => 'Історія сторінкы',
 'deletedhist' => 'Вымазана історія',
@@ -1046,7 +1046,7 @@ $1",
 'mergehistory-header' => 'Тота сторінка Вам дозволить злучіти історію єдной жрідловой сторінкы з новшов сторінков.
 Пересвіджте ся, же тота зміна утриме повязаность і поступность  історії сторінкы.',
 'mergehistory-box' => 'Злучіти ревізії двох сторінок:',
-'mergehistory-from' => 'Ð\97дÑ\80оÑ\91ва сторінка:',
+'mergehistory-from' => 'Ð\96Ñ\80Ñ\96длова сторінка:',
 'mergehistory-into' => 'Цілёва сторінка:',
 'mergehistory-list' => 'Історія злучітельных сторінок',
 'mergehistory-merge' => 'Наслїдуючі верзії сторінкы [[:$1|$1]] можуть быти злучены в [[:$2]]. Перепиначом выберте верзію, котра урчіть, же лем тота і старшы едітації будуть злучены. Рахуйте з тым, же хоснованём  навіґачных одказів будуть дата страчены.',
@@ -1055,9 +1055,9 @@ $1",
 'mergehistory-empty' => 'Не дають ся споїти жадны ревізії.',
 'mergehistory-success' => '$3 {{PLURAL:$3|ревізія|ревізії|ревізійí}} сторінкы [[:$1]] {{PLURAL:$3|была успішно злучена|были успішно злучены|было успішно злуґено}} до сторінкы [[:$2]].',
 'mergehistory-fail' => 'Злучіня історій ся не дасть зробити. Перевірте заданы сторінкы і їх історії',
-'mergehistory-no-source' => 'Ð\97дÑ\80оÑ\91ва Ñ\81Ñ\82оÑ\80Ñ\96нка $1 Ð½Ðµ ÐµÐºÐ·Ñ\96Ñ\81Ñ\82ує.',
+'mergehistory-no-source' => 'Ð\96Ñ\80Ñ\96длова Ñ\81Ñ\82оÑ\80Ñ\96нка $1 Ð½Ðµ Ñ\96Ñ\81нує.',
 'mergehistory-no-destination' => 'Цілёва сторінка «$1» не екзістує.',
-'mergehistory-invalid-source' => 'Ð\97дÑ\80ойова сторінка мусить мати правилну назву.',
+'mergehistory-invalid-source' => 'Ð\96Ñ\80Ñ\96длова сторінка мусить мати правилну назву.',
 'mergehistory-invalid-destination' => 'Цілёва сторінка мусить мати правилну назву.',
 'mergehistory-autocomment' => 'Злучена сторінка [[:$1]] до сторінкы [[:$2]]',
 'mergehistory-comment' => 'Злучена сторінка [[:$1]] до сторінкы [[:$2]]: $3',
@@ -2268,7 +2268,7 @@ $UNWATCHURL
 'restriction-level-all' => 'хоцьяка рівень',
 
 # Undelete
-'undelete' => 'Ð\97мазаны сторінкы',
+'undelete' => 'Ð\92Ñ\8bлÑ\83Ñ\87ены сторінкы',
 'undeletepage' => 'Посмотрити собі і обновити змазану сторінку',
 'undeletepagetitle' => "'''Ниже суть змазаны верзії сторінкы [[:$1]]'''.",
 'viewdeletedpage' => 'Зобразити змазаны сторінкы',
@@ -2431,7 +2431,7 @@ $1',
 'blocklist-addressblocks' => 'Сховати блокованя єдной IP адресы',
 'blocklist-rangeblocks' => 'Скрыти блокованя россягів',
 'blocklist-timestamp' => 'Часова значка',
-'blocklist-target' => 'ЦÑ\96ль',
+'blocklist-target' => 'ЦÑ\97ль',
 'blocklist-expiry' => 'Кінчіть',
 'blocklist-by' => 'Блокуючій адмін',
 'blocklist-params' => 'Параметры блокованя',
index 8ffb44f..6e42444 100644 (file)
@@ -2991,7 +2991,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'pageinfo-authors' => 'प्रत्येककर्तॄणां समग्रा सङ्ख्या ।',
 'pageinfo-recent-edits' => 'सद्योजातसम्पादनानां सङ्ख्या (गतेषु $1 दिनेषु)',
 'pageinfo-recent-authors' => 'प्रत्येककर्तॄणां सद्यःकालीना सङ्ख्या ।',
-'pageinfo-restriction' => 'पृष्ठसंरक्षणम्  (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'पृष्ठसंरक्षणम्  ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'मान्त्रिक{{PLURAL:$1|शब्दः|शब्दाः}} ($1)',
 'pageinfo-hidden-categories' => 'गोपित{{PLURAL:$1|वर्गः|वर्गाः}} ($1)',
 'pageinfo-templates' => 'समायोजित{{PLURAL:$1|फलकम्|फलकानि}} ($1)',
index 8829a0b..f25c1fb 100644 (file)
@@ -125,7 +125,6 @@ $messages = array(
 'tog-watchlisthideown' => 'Čiega mu iežan rievdadusaid',
 'tog-watchlisthidebots' => 'Čiega bot-prográmmaid rievdadusaid',
 'tog-watchlisthideminor' => 'Čiega unna rievdadusaid',
-'tog-nolangconversion' => 'Ále daga rievdadusaid giellavariánttaid gaskal',
 'tog-ccmeonemails' => 'Sádde munnje kopiija e-poasttain, maid sádden eará geavaheddjiide',
 
 'underline-always' => 'Álo',
index 9b3eb3e..a4152b9 100644 (file)
@@ -215,7 +215,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij patrolirane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij patrolirane stranice sa spiska novih stranica',
 'tog-extendwatchlist' => 'Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih',
-'tog-usenewrc' => 'Korištenje poboljšanog spiska nedavnih izmjena (zahtijeva JavaScript)',
+'tog-usenewrc' => 'Promene u grupi po stranici u spisku nedavnih izmhena i nadgledanih stranica (zahtijeva JavaScript)',
 'tog-numberheadings' => 'Automatski numeriši podnaslove',
 'tog-showtoolbar' => 'Pokaži alatnu traku (potreban JavaScript)',
 'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom (potreban JavaScript)',
@@ -223,17 +223,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka (JavaScript)',
 'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
 'tog-rememberpassword' => 'Upamti moju prijavu za ovaj preglednik (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
-'tog-watchcreations' => 'Dodaj stranice koje sam napravio u moj spisak praćenja',
-'tog-watchdefault' => 'Dodaj stranice koje uređujem u moj spisak praćenja',
-'tog-watchmoves' => 'Dodaj stranice koje premještam u moj spisak praćenja',
-'tog-watchdeletion' => 'Stranice koje brišem dodaj na moj spisak praćenja',
+'tog-watchcreations' => 'Dodaj stranice koje sam stvorio i dadtoteke koje sam poslao u moj spisak praćenih stranica',
+'tog-watchdefault' => 'Dodaj stranice i datoteke koje izmijenim u spisak praćenja',
+'tog-watchmoves' => 'Dodaj stranice i datoteke koje premjestim na moj spisak praćenja',
+'tog-watchdeletion' => 'Dodaj stranice i datoteke koje izbrišem na moj spisak praćenja',
 'tog-minordefault' => 'Označi da su sve izmjene u pravilu manje',
 'tog-previewontop' => 'Prikaži pretpregled prije kutije za uređivanje',
 'tog-previewonfirst' => 'Prikaži pretpregled na prvoj izmjeni',
 'tog-nocache' => 'Onemogući keš (cache) stranica u pregledniku',
-'tog-enotifwatchlistpages' => 'Pošalji mi e-poštu kad se promijeni stranica na mom spisku praćenja',
+'tog-enotifwatchlistpages' => 'Pošalji mi e-mail kada se promijeni stranica ili datoteka na mom spisku praćenja',
 'tog-enotifusertalkpages' => 'Pošalji mi e-poštu kad se promijeni moja korisnička stranica za razgovor',
-'tog-enotifminoredits' => 'Pošalji mi e-poštu takođe za male izmjene stranica',
+'tog-enotifminoredits' => 'Pošalji mi e-mail i kod manjih izmjena stranica i datoteka',
 'tog-enotifrevealaddr' => 'Otkrij adresu moje e-pošte u porukama obaviještenja',
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
@@ -471,6 +471,10 @@ $1',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih promjena',
 'newmessagesdifflink' => 'posljednja promjena',
+'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).',
+'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|$1 nove poruke|$1 novih poruka}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednje uređivanje|$ posljednja uređivanja|$ posljednjih uređivanja}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editold' => 'uredi',
@@ -522,12 +526,12 @@ Lista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'Desila se sintaksna greška upita baze.
-Ovo se desilo zbog moguće greške u softveru.
-Posljednji pokušani upit je bio:
-<blockquote><tt>$1</tt></blockquote>
-iz funkcije "<tt>$2</tt>".
-MySQL je vratio grešku "<tt>$3: $4</tt>".',
+'dberrortext' => 'Došlo je do sintaktičke greške u bazi.
+Možda se radi o grešci u softveru.
+Posljednji pokušaj upita je glasio:
+<blockquote><code>$1</code></blockquote>
+unutar funkcije „<code>$2</code>“.
+Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Desila se sintaksna greška upita baze.
 Posljednji pokušani upit je bio:
 "$1"
@@ -564,6 +568,8 @@ Molimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođ
 'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
 Moguće je da ju je neko drugi već obrisao.',
 'cannotdelete-title' => 'Brisanje stranice "$1" nije moguće',
+'delete-hook-aborted' => 'Brisanje prekinuto softverskim priključkom (hook).
+Nema obrazloženja ili poruke o grešci.',
 'badtitle' => 'Loš naslov',
 'badtitletext' => 'Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.
 Može sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.',
@@ -597,6 +603,10 @@ Kao razlog je naveden "\'\'$2\'\'".',
 'filereadonlyerror' => 'Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.
 
 Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
+'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“',
+'invalidtitle-unknownnamespace' => 'Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“',
+'exception-nologin' => 'Niste prijavljeni',
+'exception-nologin-text' => 'Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.',
 
 # Virus scanner
 'virus-badscanner' => "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
@@ -617,6 +627,7 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
 'securelogin-stick-https' => 'Ostanite povezani na HTTPS nakon prijave',
 'yourdomainname' => 'Vaš domen:',
+'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
 'externaldberror' => 'Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.',
 'login' => 'Prijavi se',
 'nav-login-createaccount' => 'Prijavi se / Registruj se',
@@ -872,17 +883,20 @@ Možete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] u drugim st
 ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
 'noarticletext-nopermission' => 'Trenutno nema teksta na ovoj stranici.
 Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane registre]</span>.',
+'missing-revision' => 'Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{PAGENAME}}“.
+
+Ovo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].',
 'userpage-userdoesnotexist' => 'Korisnički račun "<nowiki>$1</nowiki>" nije registrovan.
 Molimo provjerite da li želite napraviti/izmijeniti ovu stranicu.',
 'userpage-userdoesnotexist-view' => 'Korisnički račun "$1" nije registrovan.',
 'blocked-notice-logextract' => 'Ovaj korisnik je trenutno blokiran.
 Posljednje stavke evidencije blokiranja možete pogledati ispod:',
-'clearyourcache' => "'''Napomena:''' nakon čuvanja, možda ćete morati da očistite keš pregledača.
-*'''Firefox / Safari::''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)
-*'''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)
-*'''Internet Explorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''
-*'''Konqueror: '''kliknite na ''Osveži'' ili pritisnite ''F5''
-*'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
+'clearyourcache' => "'''Napomena:''' Nakon snimanja možda ćete trebate očistiti cache svog preglednika kako biste vidjeli promjene.
+* '''Firefox / Safari:''' držite ''Shift'' i pritisnite ''Reload'', ili pritisnite bilo ''Ctrl-F5'' ili ''Ctrl-R'' (''Command-R'' na Macu)
+* '''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''Command-Shift-R'' na Macu)
+* '''Internet Explorer:''' držite ''Ctrl'' i kliknite ''Refresh'', ili pritisnite ''Ctrl-F5''
+* '''Opera:''' očistite međuspremnik u ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Sugestija:''' Koristite 'Prikaži izgled' dugme da testirate svoj novi CSS prije nego što ga snimite.",
 'userjsyoucanpreview' => "'''Sugestija:''' Koristite 'Prikaži izgled' dugme da testirate svoj novi JS prije nego što ga snimite.",
 'usercsspreview' => "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''
@@ -995,6 +1009,13 @@ Ovakvi argumenti se trebaju izbjegavati.",
 'parser-template-loop-warning' => 'Otkrivena kružna greška u šablonu: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Dubina uključivanja šablona prekoračena ($1)',
 'language-converter-depth-warning' => 'Prekoračena granica dubine jezičkog pretvarača ($1)',
+'node-count-exceeded-category' => 'Stranice sa prekoračenim brojem čvorova',
+'node-count-exceeded-warning' => 'Stranica u kojoj je prekoračen broj čvorova',
+'expansion-depth-exceeded-category' => 'Stranice koje su prekoračile dubinu proširenja',
+'expansion-depth-exceeded-warning' => 'Na ovoj stranici dubina proširenja je prevelika',
+'parser-unstrip-loop-warning' => 'Utvrđena je petlja',
+'parser-unstrip-recursion-limit' => 'Dosegnuto je ograničenje rekurzije ($1)',
+'converter-manual-rule-error' => 'Pronađena je greška u pravilu za ručno pretvaranje jezika',
 
 # "Undo" feature
 'undo-success' => 'Izmjena se može vratiti.
@@ -1131,7 +1152,8 @@ Molimo provjerite zapise.',
 'revdelete-only-restricted' => 'Greška pri sakrivanju stavke od dana $2, $1: ne možete ukloniti stavke od pregledavanja administratora bez da odaberete neku od drugih opcija za uklanjanje.',
 'revdelete-reason-dropdown' => '*Uobičajeni razlozi brisanja
 ** Kršenje autorskih prava
-** Neadekvatni lični podaci
+** Neprimjereni komentari ili lični podaci
+** Neprimjereno korisničko ime
 ** Potencijalno klevetničke informacije',
 'revdelete-otherreason' => 'Ostali/dodatni razlog:',
 'revdelete-reasonotherlist' => 'Ostali razlozi',
@@ -1175,6 +1197,8 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 
 # Diffs
 'history-title' => 'Historija izmjena stranice "$1"',
+'difference-title' => 'Razlike između iumjena na stranici "$1"',
+'difference-title-multipage' => 'Razlika između stranica "$1" i "$2"',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Linija $1:',
 'compareselectedversions' => 'Uporedite označene verzije',
@@ -1182,6 +1206,10 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'editundo' => 'ukloni ovu izmjenu',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
+'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
+
+Ovo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].',
 
 # Search results
 'searchresults' => 'Rezultati pretrage',
@@ -1272,6 +1300,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'prefs-beta' => 'Beta mogućnosti',
 'prefs-datetime' => 'Datum i vrijeme',
 'prefs-labs' => 'Eksperimentalne mogućnosti',
+'prefs-user-pages' => 'Korisničke stranice',
 'prefs-personal' => 'Korisnički profil',
 'prefs-rc' => 'Podešavanje nedavnih izmjena',
 'prefs-watchlist' => 'Praćene stranice',
@@ -1452,6 +1481,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'right-writeapi' => "Korištenje opcije ''write API''",
 'right-delete' => 'Brisanje stranica',
 'right-bigdelete' => 'Brisanje stranica sa velikom historijom',
+'right-deletelogentry' => 'Brisanje i vraćanje određenih stavki u registru',
 'right-deleterevision' => 'Brisanje i vraćanje određenih revizija stranice',
 'right-deletedhistory' => 'Pregled stavki obrisane historije, bez povezanog teksta',
 'right-deletedtext' => 'Pregled obrisanog teksta i izmjena između obrisanih revizija',
@@ -1734,14 +1764,19 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-writetemp' => 'Ne mogu da pišem u privremenoj datoteci.',
 'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu da pročitam datoteku $1.',
-'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
-'backend-fail-maxsize' => 'Ne mogu da napravim datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
+'backend-fail-create' => 'Ne mogu snimiti datoteku $1.',
+'backend-fail-maxsize' => 'Ne mogu snimiti datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
 'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
 'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
 'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
 'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
 'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
 'backend-fail-batchsize' => 'Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
+'backend-fail-usable' => 'Ne mogu snimiti datoteku $1 zbog nedovoljno dozvola ili nedostattnih direktorija/sadržaoca.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Ne mogu da se povežem s novinarskom bazom za skladišnu osnovu „$1“.',
+'filejournal-fail-dbquery' => 'Ne mogu da ažuriram novinarsku bazu za skladišnu osnovu „$1“.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Ne mogu da otključam „$1“ jer nije zaključan.',
@@ -1752,6 +1787,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'lockmanager-fail-releaselock' => 'Ne mogu da oslobodim katanac za „$1“.',
 'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.',
 'lockmanager-fail-db-release' => 'Ne mogu da oslobodim katance u bazi $1.',
+'lockmanager-fail-svr-acquire' => 'Ne mogu da dobijem katance na serveru $1.',
 'lockmanager-fail-svr-release' => 'Ne mogu da oslobodim katance na serveru $1.',
 
 # ZipDirectoryReader
@@ -1871,6 +1907,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'uploadnewversion-linktext' => 'Postavite novu verziju ove datoteke/fajla',
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'zajednička ostava',
+'upload-disallowed-here' => 'Nažalost, ne možete da zamenite ovu sliku.',
 
 # File reversion
 'filerevert' => 'Vrati $1',
@@ -1953,7 +1990,7 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'disambiguations' => 'Stranice do višeznačnih odrednica',
 'disambiguationspage' => 'Template:Višeznačna odrednica',
 'disambiguations-text' => "Slijedeće stranice su povezane sa '''stranicom za razvrstavanje'''.
-Po pravilu, one se trebaju povezati sa konkretnim člankom.<br />
+One se možda moraju povezati sa konkretnim člankom.<br />
 Stranica se smatra stranicom za razvrstavanje, ukoliko koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|stranica za razvrstavanje]]",
 
 'doubleredirects' => 'Dvostruka preusmjerenja',
@@ -1979,6 +2016,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajtova}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorija|kategorije}}',
+'ninterwikis' => '$1 {{PLURAL:$1|međuviki|međuvikija|međuvikija}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linka|linkova}}',
 'nmembers' => '$1 {{PLURAL:$1|član|članova}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
@@ -2007,6 +2045,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 'mostlinkedtemplates' => 'Šabloni sa najviše linkova',
 'mostcategories' => 'Stranice sa najviše kategorija',
 'mostimages' => 'Datoteke sa najviše linkova',
+'mostinterwikis' => 'Stranice s najviše međuwiki poveznica',
 'mostrevisions' => 'Stranice sa najviše izmjena',
 'prefixindex' => 'Sve stranice sa prefiksom',
 'prefixindex-namespace' => 'Sve stranice s predmetkom (imenski prostor $1)',
@@ -2061,6 +2100,7 @@ na kome bi se izvela ova funkcija.',
 Možete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).',
 'logempty' => 'Ne postoji takav zapis.',
 'log-title-wildcard' => 'Traži naslove koji počinju s ovim tekstom',
+'showhideselectedlogentries' => 'Prikaži/sakrij izabrane zapise u evidenciji',
 
 # Special:AllPages
 'allpages' => 'Sve stranice',
@@ -2081,6 +2121,11 @@ Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
 'allpages-hide-redirects' => 'Sakrij preusmerenja',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Gledate keširanu verziju ove stranice, koja može biti stara i do $1.',
+'cachedspecial-viewing-cached-ts' => 'Gledate keširanu verziju ove stranice, koja možda nije potpuno aktualna.',
+'cachedspecial-refresh-now' => 'Pogledaj najnoviju.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.
@@ -2148,6 +2193,8 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 'mailnologin' => 'Nema adrese za slanje',
 'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.',
 'emailuser' => 'Pošalji E-mail ovom korisniku',
+'emailuser-title-target' => 'Slanje e-maila {{GENDER:$1|korisniku|korisnici|korisniku}}',
+'emailuser-title-notarget' => 'Slanje e-maila korisniku',
 'emailpage' => 'Pošalji e-mail ovom korisniku',
 'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
 E-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.',
@@ -2294,6 +2341,8 @@ nastavite s oprezom.',
 'rollback' => 'Vrati izmjene',
 'rollback_short' => 'Vrati',
 'rollbacklink' => 'vrati',
+'rollbacklinkcount' => 'vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}',
+'rollbacklinkcount-morethan' => 'vrati više od $1 {{PLURAL:$1|izmjene|izmjene|izmjena}}',
 'rollbackfailed' => 'Vraćanje nije uspjelo',
 'cantrollback' => 'Nemoguće je vratiti izmjenu;
 posljednji kontributor je jedini na ovoj stranici.',
@@ -2525,8 +2574,8 @@ Unesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su
 'ipb-confirm' => 'Potvrdite blokiranje',
 'badipaddress' => 'Nevaljana IP adresa',
 'blockipsuccesssub' => 'Blokiranje je uspjelo',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je blokiran.
-<br />Pogledajte [[Special:BlockList|IP spisak blokiranih korisnika]] za pregled blokiranja.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />
+Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipb-blockingself' => 'Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?',
 'ipb-confirmhideuser' => "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
@@ -2798,6 +2847,7 @@ Sve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|regis
 'import-interwiki-templates' => 'Uključi sve šablone',
 'import-interwiki-submit' => 'Uvoz',
 'import-interwiki-namespace' => 'Odredišni imenski prostor:',
+'import-interwiki-rootpage' => 'Odredišna osnovna stranica (neobavezno):',
 'import-upload-filename' => 'Naziv datoteke:',
 'import-comment' => 'Komentar:',
 'importtext' => 'Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].
@@ -2834,6 +2884,9 @@ Molimo pokušajte ponovno.',
 'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).',
 'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
 'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
+'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
+'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
 
 # Import log
 'importlogpage' => 'Registar uvoza',
@@ -2949,14 +3002,38 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'spambot_username' => 'MediaWiki čišćenje spama',
 'spam_reverting' => 'Vraćanje na zadnju verziju koja ne sadrži linkove ka $1',
 'spam_blanking' => 'Sve revizije koje sadrže linkove ka $1, očisti',
+'spam_deleting' => 'Sve izmene sadrže veze do $1. Brišem',
 
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
-'pageinfo-header-edits' => 'Izmjene',
+'pageinfo-header-basic' => 'Osnovne informacije',
+'pageinfo-header-edits' => 'Historija izmjena',
+'pageinfo-header-restrictions' => 'Zaštita stranice',
+'pageinfo-header-properties' => 'Svojstva stranice',
+'pageinfo-display-title' => 'Prikaži naslov',
+'pageinfo-default-sort' => 'Podrazumijevani ključ sortiranja',
+'pageinfo-length' => 'Dužina stranice (u bajtovima)',
+'pageinfo-article-id' => 'ID stranice',
+'pageinfo-robot-policy' => 'Status tražilice',
+'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
+'pageinfo-robot-noindex' => 'Ne može se indeksirati',
 'pageinfo-views' => 'Broj pregleda',
-'pageinfo-watchers' => 'Broj onih koji pregledaju',
-'pageinfo-edits' => 'Broj izmjena',
-'pageinfo-authors' => 'Broj specifičnih autora',
+'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
+'pageinfo-subpages-name' => 'Podstranice ove stranice',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja|nepreusmjerenja}})',
+'pageinfo-firstuser' => 'Tvorac stranice',
+'pageinfo-firsttime' => 'Datum stvaranja stranice',
+'pageinfo-lastuser' => 'Posljednji urednik',
+'pageinfo-lasttime' => 'Datum posljednje izmjene',
+'pageinfo-edits' => 'Ukupni broj uređivanja',
+'pageinfo-authors' => 'Ukupni broj specifičnih autora',
+'pageinfo-recent-edits' => 'Broj nedavnih izmjena (u posljednjih $1)',
+'pageinfo-recent-authors' => 'Broj nedavnih specifičnih autora',
+'pageinfo-restriction' => 'Zaštita stranice ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ|Magične riječi}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi kao patrolirano',
@@ -3000,6 +3077,7 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'file-info-size-pages' => '$1 × $2 piksela, veličina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
 'file-nohires' => 'Veća rezolucija nije dostupna.',
 'svg-long-desc' => 'SVG fajl, nominalno $1 × $2 piksela, veličina fajla: $3',
+'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina: $3',
 'show-big-image' => 'Puna rezolucija',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
@@ -3009,6 +3087,8 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'file-info-png-looped' => 'stalno iznova',
 'file-info-png-repeat' => 'pregledano $1 {{PLURAL:$1|put|puta}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|sličica|sličice|sličica}}',
+'file-no-thumb-animation' => "'''Napomena: zbog tehničkih ograničenja, minijature ove datoteke se neće animirati.'''",
+'file-no-thumb-animation-gif' => "'''Napomena: zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće se animirati.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerija novih slika',
@@ -3647,6 +3727,8 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints' => 'URL adresa instalacije',
+'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3809,10 +3891,12 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-empty-file' => 'Datoteka koju ste poslali je bila prazna.',
 'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
 'api-error-fetchfileerror' => 'Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.',
+'api-error-fileexists-forbidden' => 'Već postoji datoteka s imenom „$1“ i ne može da se zamijeni.',
+'api-error-fileexists-shared-forbidden' => 'Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zamijeni.',
 'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
 'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nije dopušten tip datoteke|nisu dopušteni tipovi datoteka}}. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmjena koji ste pokušali načiniti je otkazana preko "kuke" proširenja mediawiki softvera.',
 'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
index 7f173aa..af67c4a 100644 (file)
@@ -449,6 +449,7 @@ $1',
 'newmessageslink' => 'nova sporočila',
 'newmessagesdifflink' => 'zadnja sprememba',
 'newmessageslinkplural' => '{{PLURAL:$1|novo sporočilo|nova sporočila}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnja sprememba|zadnji spremembi|zadnje spremembe}}',
 'youhavenewmessagesmulti' => 'Na $1 imate novo sporočilo',
 'editsection' => 'uredi',
 'editold' => 'spremeni',
@@ -501,11 +502,11 @@ Seznam vseh prepoznanih posebnih strani je na razpolago na strani [[Special:Spec
 'error' => 'Napaka',
 'databaseerror' => 'Napaka zbirke podatkov',
 'dberrortext' => 'Prišlo je do napake podatkovne zbirke.
-Vzrok bi lahko bil nesprejemljiv iskalni niz ali programski hrošč.
-Zadnje poskušano iskanje:
-<blockquote><tt>$1</tt></blockquote>
-znotraj funkcije »<tt>$2</tt>«.
-Podatkovna zbirka je vrnila napako »<tt>$3: $4</tt>«.',
+Vzrok je lahko programski hrošč v programju.
+Zadnja poskušana poizvedba po zbirki podatkov:
+<blockquote><code>$1</code></blockquote>
+znotraj funkcije »<code>$2</code>«.
+Zbirka podatkov je vrnila napako »<samp>$3: $4</samp>«.',
 'dberrortextcl' => 'Pri iskanju v podatkoovni zbirki je prišlo do skladenjske napake.
 Zadnje iskanje v zbirki podatkov:
 »$1«
@@ -865,7 +866,6 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
 * '''Firefox/Safari:''' Držite ''Shift'' in kliknite ''Ponovno naloži'' (''Reload'') ali pritisnite ''Ctrl-Shift-R'' ali ''Ctrl-R'' (''⌘-R'' na sistemu Mac)
 * '''Internet Explorer:''' Držite ''Ctrl-F5'' in kliknite ''Osveži'' (''Refresh'') ali pritisnite ''Ctrl-F5''
 * '''Google Chrome:''' Pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na sistemu Mac)
-* '''Konqueror:''' Kliknite ''Ponovno naloži'' (''Reload'') ali pritisnite ''F5''.
 * '''Opera:''' Počistite predpomnilnik v ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Nasvet:''' Za preizkušanje svojega novega CSS pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
 'userjsyoucanpreview' => "'''Nasvet:''' Za preizkušanje svojega novega JavaScripta pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
@@ -948,7 +948,7 @@ Lahko se vrnete nazaj in urejate že obstoječe strani, ali pa se [[Special:User
 'sectioneditnotsupported-text' => 'Urejanje razdelkov ni podprto na tej strani.',
 'permissionserrors' => 'Napake dovoljenj',
 'permissionserrorstext' => 'Nimate dovoljenja za izvedbo dejanja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov|naslednjih razlogov}}:',
-'permissionserrorstext-withaction' => 'Nimate dovoljenja za $2, zaradi {{PLURAL:$1|naslednjega razloga|naslednjih $1 razlogov|naslednjih $1 razlogov|naslednjih $1 razlogov}}:',
+'permissionserrorstext-withaction' => 'Nimate dovoljenja za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih $1 razlogov|naslednjih $1 razlogov|naslednjih $1 razlogov}}:',
 'recreate-moveddeleted-warn' => "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''
 
 Premislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.
@@ -1118,7 +1118,8 @@ Prosimo, preverite dnevnik.',
 'revdelete-only-restricted' => 'Napaka pri skrivanju predmeta z dne $1, $2: ne morete spremeniti vidnosti predmeta pred administratorji brez izbire ene od drugih možnosti vidnosti.',
 'revdelete-reason-dropdown' => '* Pogosti razlogi za izbris
 ** Kršitev avtorskih pravic
-** Neprimerni osebni podatki
+** Neprimerna pripomba ali osebni podatki
+** Neprimerno uporabniško ime
 ** Morebitni žaljivi podatki',
 'revdelete-otherreason' => 'Drug/dodaten razlog:',
 'revdelete-reasonotherlist' => 'Drug razlog',
@@ -1885,6 +1886,7 @@ Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datote
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'skupno skladišče',
 'shared-repo-name-wikimediacommons' => 'Wikimedijina Zbirka',
+'upload-disallowed-here' => 'Slike žal ne morete prepisati.',
 
 # File reversion
 'filerevert' => 'Vrni $1',
@@ -2970,11 +2972,22 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 
 # Info page
 'pageinfo-title' => 'Informacije o »$1«',
-'pageinfo-header-edits' => 'Urejanja',
+'pageinfo-header-basic' => 'Osnovni podatki',
+'pageinfo-header-edits' => 'Zgodovina urejanja',
+'pageinfo-header-restrictions' => 'Zaščita strani',
+'pageinfo-header-properties' => 'Lastnosti strani',
+'pageinfo-display-title' => 'Naslov za prikaz',
+'pageinfo-default-sort' => 'Privzeti ključ za razvrščanje',
 'pageinfo-views' => 'Število ogledov',
-'pageinfo-watchers' => 'Število spremljevalcev',
-'pageinfo-edits' => 'Število urejanj',
-'pageinfo-authors' => 'Število različnih avtorjev',
+'pageinfo-watchers' => 'Število spremljevalcev strani',
+'pageinfo-redirects-name' => 'Preusmeritve na stran',
+'pageinfo-subpages-name' => 'Podstrani strani',
+'pageinfo-firstuser' => 'Ustvarjalec strani',
+'pageinfo-firsttime' => 'Datum ustvarjanja strani',
+'pageinfo-lastuser' => 'Zadnji urejevalec',
+'pageinfo-lasttime' => 'Datum zadnjega urejanja',
+'pageinfo-edits' => 'Skupno število urejanj',
+'pageinfo-authors' => 'Skupno število različnih avtorjev',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
@@ -3019,6 +3032,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'file-info-size-pages' => '$1 × $2 točk, velikost datoteke: $3, vrsta MIME: $4, $5 {{PLURAL:$5|stran|strani}}',
 'file-nohires' => 'Slika višje ločljivosti ni na voljo.',
 'svg-long-desc' => 'datoteka SVG, v izvirniku $1 × $2 slikovnih točk, velikost datoteke: $3',
+'svg-long-desc-animated' => 'animirana datoteka SVG, v izvirniku $1 × $2 slikovnih točk, velikost datoteke: $3',
 'show-big-image' => 'Slika v višji ločljivosti',
 'show-big-image-preview' => 'Velikost predogleda: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga resolucija|Drugi resoluciji|Druge resolucije}}: $1.',
index cc1894a..218d486 100644 (file)
@@ -3288,7 +3288,7 @@ $1',
 'pageinfo-authors' => 'Број засебних аутора',
 'pageinfo-recent-edits' => 'Број скорашњих измена (у последњих $1)',
 'pageinfo-recent-authors' => 'Број скорашњих засебних аутора',
-'pageinfo-restriction' => 'Заштита странице (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Заштита странице ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
index 93234fa..c72f225 100644 (file)
@@ -3197,7 +3197,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-authors' => 'Broj zasebnih autora',
 'pageinfo-recent-edits' => 'Broj skorašnjih izmena (u poslednjih $1)',
 'pageinfo-recent-authors' => 'Broj skorašnjih zasebnih autora',
-'pageinfo-restriction' => 'Zaštita stranice (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Zaštita stranice ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
index 9635ba4..c83e826 100644 (file)
@@ -774,7 +774,7 @@ Kontrollera din stavning, eller [[Special:UserLogin/signup|skapa ett nytt konto]
 'nosuchusershort' => 'Det finns ingen användare som heter "$1". Kontrollera att du stavat rätt.',
 'nouserspecified' => 'Du måste ange ett användarnamn.',
 'login-userblocked' => 'Denna användare är blockerad. Login inte tillåtet.',
-'wrongpassword' => 'Lösenordet du angav är felaktigt. Försök igen',
+'wrongpassword' => 'Lösenordet du angav är felaktigt. Försök igen.',
 'wrongpasswordempty' => 'Lösenordet som angavs var blankt. Var god försök igen.',
 'passwordtooshort' => 'Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.',
 'password-name-match' => 'Ditt lösenord måste vara olikt ditt användarnamn.',
@@ -1241,7 +1241,8 @@ Vänligen kontrollera loggarna.',
 'revdelete-only-restricted' => 'Fel vid döljning av objekt daterat $2, $1: du kan inte undanhålla objekt från att visas för administratörer utan att också välja en av de övriga visningsalternativen.',
 'revdelete-reason-dropdown' => '*Vanliga orsaker till radering
 ** Brott mot copyright
-** Opassande personupplysningar
+** Opassande kommentar eller personupplysningar
+** Opassande användarnamn
 ** Möjligt ärekränkande uppgifter',
 'revdelete-otherreason' => 'Annan/ytterligare anledning:',
 'revdelete-reasonotherlist' => 'Annan anledning',
@@ -3130,7 +3131,7 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-authors' => 'Totalt antal olika författare',
 'pageinfo-recent-edits' => 'Antal nyliga redigeringar (inom de senaste $1)',
 'pageinfo-recent-authors' => 'Antal nyliga olika författare',
-'pageinfo-restriction' => 'Sidskydd (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Sidskydd ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiskt|Magiska}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)',
 
index 8b704d3..e8e584b 100644 (file)
@@ -1260,7 +1260,7 @@ $1",
 'group-autoconfirmed-member' => '{{GENDER:$1|தானாக உறுதிசெய்யப்பட்ட பயனர்}}',
 'group-bot-member' => '{{GENDER:$1|தானியங்கி}}',
 'group-sysop-member' => '{{GENDER:$1|நிர்வாகி}}',
-'group-bureaucrat-member' => '{{GENDER:$1|பà®\9fிபà¯\8dபாளரà¯\8dகள்}}',
+'group-bureaucrat-member' => '{{GENDER:$1|à®\85திà®\95ாரிகள்}}',
 'group-suppress-member' => '{{GENDER:$1|மேற்பார்வை}}',
 
 'grouppage-user' => '{{ns:project}}:பயனர்கள்',
index eea0dee..ebab217 100644 (file)
@@ -1105,9 +1105,10 @@ Hindi mo ito mapupuntahan.',
 'revdelete-concurrent-change' => 'May mali sa pagbabago ng bagay na may petsang $2, $1: ang katayuan nito ay tila nagpapakitang binago ng ibang tao habang sinubukan mong baguhin ito.
 Pakitingnan ang mga talaan.',
 'revdelete-only-restricted' => 'May mali sa pagtatago ng bagay na may petsang $2, $1: hindi mo mapipigil ang mga bagay na matingnan ng mga tagapangasiwa na hindi rin pipili ng isa sa mga pagpipiliang kaugnay ng antas ng pagpapakita.',
-'revdelete-reason-dropdown' => '*Mga karaniwang dahilan sa pagbubura
+'revdelete-reason-dropdown' => '*Mga karaniwang dahilan ng pagbura
 ** Paglabag sa karapatang-ari (kopirayt)
 ** Hindi nararapat na personal na impormasyon
+** Hindi nararapat na pangalan ng tagagamit
 ** Impormasyong maaaring mapanirang-puri',
 'revdelete-otherreason' => 'Iba/karagdagang dahilan:',
 'revdelete-reasonotherlist' => 'Ibang dahilan',
@@ -3013,7 +3014,7 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'pageinfo-authors' => 'Kabuuang bilang ng magkakabukod na mga may-akda',
 'pageinfo-recent-edits' => 'Kamakailang bilang ng mga pamamatnugot (sa loob ng huling $1)',
 'pageinfo-recent-authors' => 'Kamakailang bilang ng magkakabukod na mga may-akda',
-'pageinfo-restriction' => 'Pruteksiyon ng pahina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Pruteksiyon ng pahina ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Salita|Mga salita}}ng mahiwaga ($1)',
 'pageinfo-hidden-categories' => 'Nakatagong {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)',
index 05b2808..411c3d2 100644 (file)
@@ -246,6 +246,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(дәвом)',
 'index-category' => 'Индекс быә сәһифон.',
 'noindex-category' => 'Индекс нибыә саһифон',
+'broken-file-category' => 'Сәһифон де ко ныкардә фајлинә сәбонон',
 
 'about' => 'Тәсвир',
 'article' => 'Мәғолә',
@@ -360,7 +361,7 @@ $messages = array(
 'privacy' => 'Мәхфијәти сијосәт',
 'privacypage' => 'Project:Мәхфијәти сијосәт',
 
-'badaccess' => 'Ð\98ҹазÓ\99 Ñ\85Ó\99Ñ\82а.',
+'badaccess' => 'Ð\94аÑ\81Ñ\82Ñ\80Ó\99Ñ\81и Ò\93Ó\99лÓ\99Ñ\82',
 'badaccess-group0' => 'Ын фәалијјәти ичра карде әзынишон.',
 
 'ok' => 'OK',
@@ -368,6 +369,7 @@ $messages = array(
 'youhavenewmessages' => 'Шымә сәјоне $1 ($2).',
 'newmessageslink' => 'нујә хәбон',
 'newmessagesdifflink' => 'охонә дәгиши',
+'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|охонә дәгиши|охонә дәгишон}}',
 'editsection' => 'Сәрост кардеј',
 'editold' => 'Сәрост кардеј',
 'viewsourceold' => 'бешемонә коди дијә кардеј',
@@ -405,15 +407,16 @@ $messages = array(
 Хаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.',
 'missingarticle-rev' => '(рәвојәт#: $1)',
 'missingarticle-diff' => '(Фәрг: $1, $2)',
-'internalerror' => 'Дахили хәта',
-'internalerror_info' => 'Дахили хәта: $1',
-'fileappenderrorread' => 'Ó\98лавон Ð³ејд карде быәдә"$1" һанде ныбе.',
-'formerror' => 'Ð¥Ó\99Ñ\82а: Ð§Ðµ Ñ\84оÑ\80мÓ\99 Ð¼Ó\99лÑ\83моÑ\82он Ó\99кÑ\81 ÐºÐ°Ñ\80де Ò\93еÑ\80Ñ\80и Ð¼Ñ\83мкуне.',
+'internalerror' => 'Дыләтонә ғәләт',
+'internalerror_info' => 'Дыләтонә ғәләт: $1',
+'fileappenderrorread' => 'Ó\98ловон Ò\93ејд карде быәдә"$1" һанде ныбе.',
+'formerror' => 'СÓ\99һв: Ð§Ðµ Ñ\84оÑ\80мÓ\99 Ð¼Ó\99лÑ\83моÑ\82он Ó\99кÑ\81 ÐºÐ°Ñ\80де Ò\93еÑ\80Ñ\80и Ð¼Ñ\8bмкуне.',
 'cannotdelete-title' => 'Сәһифә әбыни рәдд кардеј "$1"',
 'badtitle' => 'Роныдоә ном',
 'badtitletext' => 'Ахтар кардә быә сәһифә ном сәһве, тәјлије, јаанки сәрост доә быәнин мијонзывонон ја мијонвики номон.
 Бе бәзне ки кали рәмзон сәрловһәдә око дој әбыни.',
 'viewsource' => 'Дијә кардеј',
+'exception-nologin' => 'Ыштәни едаштәнијоне',
 
 # Login and logout pages
 'yourname' => 'Иштирокәкә ном:',
@@ -435,6 +438,7 @@ $messages = array(
 'gotaccountlink' => 'Ыштәни едаштеј',
 'userlogin-resetlink' => 'Бә системә дәше мәлумоти јодәдә бекардәјоне?',
 'createaccountmail' => 'бә е-номә',
+'createaccountreason' => 'Сәбәб:',
 'mailmypassword' => 'Нујә парол вығандеј бә Е-номә.',
 'loginlanguagelabel' => 'Зывон: $1',
 
@@ -556,6 +560,7 @@ $messages = array(
 'revdelete-show-file-submit' => 'Бәле',
 'revdelete-radio-set' => 'Бәле',
 'revdelete-radio-unset' => 'Не',
+'revdelete-log' => 'Сәбәб:',
 'revdel-restore' => 'Винде дәрәҹә дәгиш карде',
 'revdel-restore-deleted' => 'Рәдд кардә быә рәвојәтон',
 'revdel-restore-visible' => 'Чијә рәвојәтон',
@@ -605,7 +610,7 @@ $messages = array(
 'powersearch-toggleall' => 'Һәммәј',
 
 # Preferences page
-'preferences' => 'ЧиÑ\87Ñ\81Ó\99 Ð¿ÐµÑ\87Ñ\8bниÑ\98е',
+'preferences' => 'Ð\9aÑ\83кон',
 'mypreferences' => 'Кукон',
 'prefsnologin' => 'Ыштәни едаштәнијоне',
 'prefsnologintext' => 'Шымә бәбе <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ыштәни едәштән]</span> бо иштирокәкә пеғәндон дәгиш кардеј.',
@@ -614,7 +619,9 @@ $messages = array(
 'prefs-user-pages' => 'Иштирокәкә сәһифон',
 'prefs-rc' => 'Ән нујә дәгишон',
 'prefs-changeemail' => 'Е-номә дәгиш кардеј',
+'prefs-email' => 'Е-номә кукон',
 'saveprefs' => 'Огәтеј',
+'rows' => 'Сәтырон:',
 'searchresultshead' => 'Нәве',
 'timezoneregion-america' => 'Америка',
 'timezoneregion-europe' => 'Авропа',
@@ -630,6 +637,9 @@ $messages = array(
 'prefs-help-email' => 'Е-номә унвони нывыштеј һукман ни, интаси ав бә шымә гәрәк бәбе гирам шымә пароли виро бебәкардејон.',
 'prefs-help-email-others' => 'Комәг бәка бә ҹо иштироәкон шымә е-номә унвони оныкарде, че шымә шәхси сәһифәдә быә линки де шымә әлогә огәтеј.',
 
+# User rights
+'userrights-reason' => 'Сәбәб:',
+
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'Ым сәһифә сәрост кардеј',
 
@@ -713,6 +723,10 @@ $messages = array(
 'sharedupload-desc-here' => 'Ым фајл чыјо пегәтә быә $1 ијән бәзыне истифодә бе бә ҹо нәхшонәдә.
 Мәлумот чн әчәј [$2 тәсвири сәһифәку] бә жиј доә быә.',
 
+# File deletion
+'filedelete-comment' => 'Сәбәб:',
+'filedelete-submit' => 'Рәдд кардеј',
+
 # Random page
 'randompage' => 'Рајрастә мәғолә',
 
@@ -774,6 +788,7 @@ $messages = array(
 'actioncomplete' => 'Һәрәкәт иҹро кардә быә',
 'actionfailed' => 'Һәрәкәт иҹро кардә бәни',
 'dellogpage' => 'Рәдд кардә быә чијон журнал',
+'deletecomment' => 'Сәбәб:',
 
 # Rollback
 'rollbacklink' => 'Окырнијеј',
@@ -781,10 +796,12 @@ $messages = array(
 # Protect
 'protectlogpage' => 'Мыдофијә журнал',
 'protectedarticle' => 'мыдофијә быә "[[$1]]"',
+'protectcomment' => 'Сәбәб:',
 
 # Undelete
 'undeletelink' => 'чәшику дәвонијеј/бәрпо кардеј',
 'undeleteviewlink' => 'тәмшо кардеј',
+'undeletecomment' => 'Сәбәб:',
 'undelete-search-submit' => 'Нәве',
 'undelete-show-file-submit' => 'Бәле',
 
@@ -831,6 +848,7 @@ $messages = array(
 'whatlinkshere-filters' => 'Филтрон',
 
 # Block/unblock
+'ipbreason' => 'Сәбәб:',
 'ipboptions' => '2 саат:2 hours,1 руж:1 day,3 руж:3 days,1 һафтә:1 week,2 һафтә:2 weeks,1 манг:1 month,3 манг:3 months,6 манг:6 months,1 сор:1 year,бемыһләт:infinite',
 'ipblocklist' => 'Бастә быә иштирокәкон',
 'blocklink' => 'Бә гырд гәтеј',
@@ -855,7 +873,7 @@ $messages = array(
 # Namespace 8 related
 'allmessagesname' => 'Хәбә',
 'allmessagesdefault' => 'Иминә огәтә быә мәтн',
-'allmessages-filter-all' => 'Һаммај',
+'allmessages-filter-all' => 'Һәммәј',
 'allmessages-filter-submit' => 'Давард',
 
 # Thumbnails
@@ -920,7 +938,7 @@ $messages = array(
 'tooltip-summary' => 'Кыртә тәсвир бынывыштән',
 
 # Info page
-'pageinfo-header-edits' => 'СÓ\99Ñ\80оÑ\81Ñ\82 ÐºÐ°Ñ\80деÑ\98',
+'pageinfo-header-edits' => 'Ð\94Ó\99гиÑ\88 ÐºÐ°Ñ\80дÓ\99 Ð±Ñ\8bÓ\99 Ñ\87иÑ\98он Ñ\82аÑ\80Ñ\8bÑ\85',
 
 # Browsing diffs
 'previousdiff' => '← Навынәни дәгиши',
index 71bdc4a..e1213f4 100644 (file)
@@ -3162,11 +3162,11 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Інформація про " $1 "',
-'pageinfo-header-edits' => 'РедагÑ\83ваннÑ\8f',
+'pageinfo-header-edits' => 'Ð\86Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8f Ñ\80едагÑ\83ванÑ\8c',
 'pageinfo-views' => 'Кількість переглядів',
 'pageinfo-watchers' => 'Кількість спостерігачів',
-'pageinfo-edits' => 'Ð\9aількість редагувань',
-'pageinfo-authors' => 'Ð\9aількість унікальних авторів',
+'pageinfo-edits' => 'Ð\97агалÑ\8cна Ðºількість редагувань',
+'pageinfo-authors' => 'Ð\97агалÑ\8cна Ðºількість унікальних авторів',
 
 # Skin names
 'skinname-standard' => 'Стандартне',
index 632f2fa..8d54d6e 100644 (file)
@@ -1216,7 +1216,9 @@ Xin hãy kiểm tra nhật trình.',
 'revdelete-only-restricted' => 'Có lỗi khi ẩn mục vào $2, $1: nếu ẩn mục để cho bảo quản viên khỏi nhìn thấy được thì cũng cần chọn một trong những tùy chọn ẩn khác.',
 'revdelete-reason-dropdown' => '*Các lý do thường gặp khi xóa
 ** Vi phạm bản quyền
-** Thông tin cá nhân không thích hợp',
+** Bình luận hoặc thông tin cá nhân không thích hợp
+** Tên người dùng không thích hợp
+** Thông tin có thể bôi nhọ người khác',
 'revdelete-otherreason' => 'Lý do khác/bổ sung:',
 'revdelete-reasonotherlist' => 'Lý do khác',
 'revdelete-edit-reasonlist' => 'Sửa lý do xóa',
@@ -3102,7 +3104,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'pageinfo-authors' => 'Tổng số tác giả riêng',
 'pageinfo-recent-edits' => 'Số lần sửa đổi gần đây (trong $1 qua)',
 'pageinfo-recent-authors' => 'Số người dùng sửa đổi gần đây',
-'pageinfo-restriction' => 'Mức khóa trang (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-restriction' => 'Mức khóa trang ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'Từ thần chú ($1)',
 'pageinfo-hidden-categories' => 'Thể loại ẩn ($1)',
 'pageinfo-templates' => 'Bản mẫu được nhúng ($1)',
index 0f1744c..715298d 100644 (file)
@@ -2856,7 +2856,7 @@ $1',
 'pageinfo-authors' => 'סה"כ צאָל באַזונדערע שרײַבער',
 'pageinfo-recent-edits' => 'לעצטיקע צאל רעדאקטירונגען (במשך די לעצטע $1)',
 'pageinfo-recent-authors' => 'לעצטיקע צאָל באַזונדערע שרײַבער',
-'pageinfo-restriction' => 'בלאט שוץ (<code>$1</code>)',
+'pageinfo-restriction' => 'בלאט שוץ ($1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|מאגיש ווארט|מאגישע ווערטער}} ($1)',
 'pageinfo-hidden-categories' => 'באהאלטענע {{PLURAL:$1|קאטעגאריע|קאטעגאריעס}} ($1)',
 'pageinfo-templates' => ' {{PLURAL:$1|אריבערגעשלאסענער מוסטער|אריבערגשלאסענע מוסטערן}} ($1)',
index 27f19e8..a3c5b5d 100644 (file)
@@ -1102,7 +1102,9 @@ $1",
 'revdelete-only-restricted' => '在隱藏$1 $2的項目時發生錯誤:您不能在選擇了另一可見性選項後廢止管理員查看該項目。',
 'revdelete-reason-dropdown' => '*常用刪除理由
 ** 侵犯版權
-** 不合適的個人資料',
+** 不合適的評論或個人資料
+** 不當的用戶名
+** 潛在誹謗的資料',
 'revdelete-otherreason' => '其它/附加的理由:',
 'revdelete-reasonotherlist' => '其它理由',
 'revdelete-edit-reasonlist' => '編輯刪除埋由',
@@ -2965,7 +2967,7 @@ $1被封禁的理由是“$2”',
 'pageinfo-authors' => '作者總數',
 'pageinfo-recent-edits' => '最近編輯次數 (過去 $1 內)',
 'pageinfo-recent-authors' => '最近作者數目',
-'pageinfo-restriction' => '保護頁面 ( <code>{{lcfirst:$1}}</code> )',
+'pageinfo-restriction' => '保護頁面 ( {{lcfirst:$1}} )',
 'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}} ( $1 )',
 'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
 'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
diff --git a/maintenance/archives/patch-cat_hidden.sql b/maintenance/archives/patch-cat_hidden.sql
new file mode 100644 (file)
index 0000000..933188c
--- /dev/null
@@ -0,0 +1,3 @@
+-- cat_hidden is no longer used, delete it
+
+ALTER TABLE /*$wgDBprefix*/category DROP COLUMN cat_hidden;
index d406ea8..2c28011 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Replication-safe online upgrade script for log_id/log_deleted
+ * Replication-safe online upgrade for log_id/log_deleted fields.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 require( __DIR__ . '/../commandLine.inc' );
 
+/**
+ * Maintenance script that upgrade for log_id/log_deleted fields in a
+ * replication-safe way.
+ *
+ * @ingroup Maintenance
+ */
 class UpdateLogging {
 
        /**
@@ -63,21 +69,21 @@ CREATE TABLE $logging_1_10 (
   -- action field, but only the type controls categorization.
   log_type varbinary(10) NOT NULL default '',
   log_action varbinary(10) NOT NULL default '',
-  
+
   -- Timestamp. Duh.
   log_timestamp binary(14) NOT NULL default '19700101000000',
-  
+
   -- The user who performed this action; key to user_id
   log_user int unsigned NOT NULL default 0,
-  
+
   -- Key to the page affected. Where a user is the target,
   -- this will point to the user page.
   log_namespace int NOT NULL default 0,
   log_title varchar(255) binary NOT NULL default '',
-  
+
   -- Freeform text. Interpreted as edit history comments.
   log_comment varchar(255) NOT NULL default '',
-  
+
   -- LF separated list of miscellaneous parameters
   log_params blob NOT NULL,
 
@@ -124,7 +130,7 @@ EOT;
                $minTs = $this->dbw->selectField( $srcTable, 'MIN(log_timestamp)', false, __METHOD__ );
                $minTsUnix = wfTimestamp( TS_UNIX, $minTs );
                $numRowsCopied = 0;
-               
+
                while ( true ) {
                        $maxTs = $this->dbw->selectField( $srcTable, 'MAX(log_timestamp)', false, __METHOD__ );
                        $copyPos = $this->dbw->selectField( $dstTable, 'MAX(log_timestamp)', false, __METHOD__ );
@@ -137,7 +143,7 @@ EOT;
                                $percent = ( $copyPosUnix - $minTsUnix ) / ( $maxTsUnix - $minTsUnix ) * 100;
                        }
                        printf( "%s  %.2f%%\n", $copyPos, $percent );
-                       
+
                        # Handle all entries with timestamp equal to $copyPos
                        if ( $copyPos !== null ) {
                                $numRowsCopied += $this->copyExactMatch( $srcTable, $dstTable, $copyPos );
index 04c65ba..e3dc488 100644 (file)
@@ -259,7 +259,7 @@ class BackupDumper {
                        $dbr = wfGetDB( DB_SLAVE );
                }
                $this->maxCount = $dbr->selectField( $table, "MAX($field)", '', __METHOD__ );
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
                $this->lastTime = $this->startTime;
                $this->ID = getmypid();
        }
@@ -328,9 +328,9 @@ class BackupDumper {
        function showReport() {
                if ( $this->reporting ) {
                        $now = wfTimestamp( TS_DB );
-                       $nowts = wfTime();
-                       $deltaAll = wfTime() - $this->startTime;
-                       $deltaPart = wfTime() - $this->lastTime;
+                       $nowts = microtime( true );
+                       $deltaAll = $nowts - $this->startTime;
+                       $deltaPart = $nowts - $this->lastTime;
                        $this->pageCountPart = $this->pageCount - $this->pageCountLast;
                        $this->revCountPart = $this->revCount - $this->revCountLast;
 
index 84aac57..f1f0954 100644 (file)
@@ -247,9 +247,9 @@ class TextPassDumper extends BackupDumper {
 
                if ( $this->reporting ) {
                        $now = wfTimestamp( TS_DB );
-                       $nowts = wfTime();
-                       $deltaAll = wfTime() - $this->startTime;
-                       $deltaPart = wfTime() - $this->lastTime;
+                       $nowts = microtime( true );
+                       $deltaAll = $nowts - $this->startTime;
+                       $deltaPart = $nowts - $this->lastTime;
                        $this->pageCountPart = $this->pageCount - $this->pageCountLast;
                        $this->revCountPart = $this->revCount - $this->revCountLast;
 
index 822f1a6..c198e0f 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 /**
- * Create a doxygen subgroup of Maintenance for benchmarks
+ * Base code for benchmark scripts.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
+
+/**
+ * Base class for benchmark scripts.
+ *
+ * @ingroup Benchmark
+ */
 abstract class Benchmarker extends Maintenance {
        private $results;
 
@@ -47,11 +53,11 @@ abstract class Benchmarker extends Maintenance {
                        }
 
                        $bench_number++;
-                       $start = wfTime();
+                       $start = microtime( true );
                        for( $i=0; $i<$count; $i++ ) {
                                call_user_func_array( $bench['function'], $bench['args'] );
                        }
-                       $delta = wfTime() - $start;
+                       $delta = microtime( true ) - $start;
 
                        // function passed as a callback
                        if( is_array( $bench['function'] ) ) {
@@ -61,7 +67,7 @@ abstract class Benchmarker extends Maintenance {
 
                        $this->results[$bench_number] = array(
                                'function'  => $bench['function'],
-                               'arguments' => $bench['args'], 
+                               'arguments' => $bench['args'],
                                'count'     => $count,
                                'delta'     => $delta,
                                'average'   => $delta / $count,
index fb836c1..fa76ae2 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 /**
- * This come from r75429 message
+ * Benchmark HTTP request vs HTTPS request.
+ *
+ * This come from r75429 message.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 require_once( __DIR__ . '/Benchmarker.php' );
+
+/**
+ * Maintenance script that benchmarks HTTP request vs HTTPS request.
+ *
+ * @ingroup Benchmark
+ */
 class bench_HTTP_HTTPS extends Benchmarker {
 
        public function __construct() {
index 6e44864..31d517f 100644 (file)
@@ -1,11 +1,33 @@
 <?php
 /**
+ * Benchmark SQL DELETE vs SQL TRUNCATE.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Benchmark
  */
 
 require_once( __DIR__ . '/Benchmarker.php' );
 
+/**
+ * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
+ *
+ * @ingroup Benchmark
+ */
 class BenchmarkDeleteTruncate extends Benchmarker {
 
        public function __construct() {
@@ -24,22 +46,22 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 
                $this->insertData( $dbw );
 
-               $start = wfTime();
+               $start = microtime( true );
 
                $this->delete( $dbw );
 
-               $end = wfTime();
+               $end = microtime( true );
 
                echo "Delete: " . $end - $start;
                echo "\r\n";
 
                $this->insertData( $dbw );
 
-               $start = wfTime();
+               $start = microtime( true );
 
                $this->truncate( $dbw );
 
-               $end = wfTime();
+               $end = microtime( true );
 
                echo "Truncate: " . $end - $start;
                echo "\r\n";
index 4a3abd4..1f590d4 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Benchmark if elseif... versus switch case.
+ *
  * This come from r75429 message
  *
  * This program is free software; you can redistribute it and/or modify
  */
 
 require_once( __DIR__ . '/Benchmarker.php' );
+
+/**
+ * Maintenance script that benchmark if elseif... versus switch case.
+ *
+ * @ingroup Maintenance
+ */
 class bench_if_switch extends Benchmarker {
 
        public function __construct() {
index cce7879..9fa7c8e 100644 (file)
@@ -1,5 +1,24 @@
 <?php
 /**
+ * Benchmark for strtr() vs str_replace().
+ *
+ * This come from r75429 message.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Benchmark
  */
@@ -14,6 +33,11 @@ function bfNormalizeTitleStrReplace( $str ) {
     return str_replace( '_', ' ', $str );
 }
 
+/**
+ * Maintenance script that benchmarks for strtr() vs str_replace().
+ *
+ * @ingroup Benchmark
+ */
 class bench_strtr_str_replace extends Benchmarker {
 
        public function __construct() {
index d71f5f5..f598780 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Benchmark for using a regexp vs. mb_check_encoding to check for UTF-8 encoding.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Benchmark
  */
@@ -7,8 +24,10 @@
 require_once( __DIR__ . '/Benchmarker.php' );
 
 /**
- * This little benchmark executes the regexp used in Language->checkTitleEncoding() and compares its execution time
- * against that of mb_check_encoding, if available.
+ * This little benchmark executes the regexp used in Language->checkTitleEncoding()
+ * and compares its execution time against that of mb_check_encoding, if available.
+ *
+ * @ingroup Benchmark
  */
 class bench_utf8_title_check extends Benchmarker {
 
index cd07fbd..8543982 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 /**
- * This come from r75429 message
+ * Benchmark for wfIsWindows().
+ *
+ * This come from r75429 message.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 require_once( __DIR__ . '/Benchmarker.php' );
+
+/**
+ * Maintenance script that benchmarks wfIsWindows().
+ *
+ * @ingroup Benchmark
+ */
 class bench_wfIsWindows extends Benchmarker {
 
        public function __construct() {
index 508ea80..9de7610 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Benchmark %MediaWiki hooks.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
 
 require_once( __DIR__ . '/Benchmarker.php' );
 
+/**
+ * Maintenance script that benchmarks %MediaWiki hooks.
+ *
+ * @ingroup Benchmark
+ */
 class BenchmarkHooks extends Benchmarker {
 
        public function __construct() {
@@ -58,11 +65,11 @@ class BenchmarkHooks extends Benchmarker {
         * @return string
         */
        private function benchHooks( $trials = 10 ) {
-               $start = wfTime();
+               $start = microtime( true );
                for ( $i = 0; $i < $trials; $i++ ) {
                        wfRunHooks( 'Test' );
                }
-               $delta = wfTime() - $start;
+               $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
                return sprintf( "Took %6.2fs",
                        $pertrial );
index 4d36d26..ec686b2 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Squid purge benchmark script
+ * Benchmark for Squid purge.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 require_once( __DIR__ . '/Benchmarker.php' );
 
+/**
+ * Maintenance script that benchmarks Squid purge.
+ *
+ * @ingroup Benchmark
+ */
 class BenchmarkPurge extends Benchmarker {
 
        public function __construct() {
@@ -57,11 +62,11 @@ class BenchmarkPurge extends Benchmarker {
         * @return string
         */
        private function benchSquid( $urls, $trials = 1 ) {
-               $start = wfTime();
+               $start = microtime( true );
                for ( $i = 0; $i < $trials; $i++ ) {
                        SquidUpdate::purge( $urls );
                }
-               $delta = wfTime() - $start;
+               $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
                $pertitle = $pertrial / count( $urls );
                return sprintf( "%4d titles in %6.2fms (%6.2fms each)",
index 85911ba..57acfd8 100644 (file)
@@ -62,7 +62,7 @@ class TableCleanup extends Maintenance {
                $this->processed = 0;
                $this->updated = 0;
                $this->count = $count;
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
                $this->table = $table;
        }
 
@@ -75,7 +75,7 @@ class TableCleanup extends Maintenance {
                $portion = $this->processed / $this->count;
                $updateRate = $this->updated / $this->processed;
 
-               $now = wfTime();
+               $now = microtime( true );
                $delta = $now - $this->startTime;
                $estimatedTotalTime = $delta / $portion;
                $eta = $this->startTime + $estimatedTotalTime;
index 95bb1fa..ac96f45 100644 (file)
@@ -1,7 +1,25 @@
 <?php
-
-# Router for the php cli-server built-in webserver
-# http://ca2.php.net/manual/en/features.commandline.webserver.php
+/**
+ * Router for the php cli-server built-in webserver.
+ * http://www.php.net/manual/en/features.commandline.webserver.php
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 if ( php_sapi_name() != 'cli-server' ) {
        die( "This script can only be run by php's cli-server sapi." );
index 485218c..3657f96 100644 (file)
@@ -62,7 +62,7 @@ abstract class DumpIterator extends Maintenance {
                        return;
                }
 
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
 
                if ( $this->getOption('dump') == '-' ) {
                        $source = new ImportStreamSource( $this->getStdin() );
@@ -80,7 +80,7 @@ abstract class DumpIterator extends Maintenance {
 
                $this->conclusions();
 
-               $delta = wfTime() - $this->startTime;
+               $delta = microtime( true ) - $this->startTime;
                $this->error( "Done {$this->count} revisions in " . round($delta, 2) . " seconds " );
                if ($delta > 0)
                        $this->error( round($this->count / $delta, 2) . " pages/sec" );
index b089f70..f51d7ad 100644 (file)
@@ -208,7 +208,7 @@ TEXT;
 
        function showReport() {
                if ( !$this->mQuiet ) {
-                       $delta = wfTime() - $this->startTime;
+                       $delta = microtime( true ) - $this->startTime;
                        if ( $delta ) {
                                $rate = sprintf( "%.2f", $this->pageCount / $delta );
                                $revrate = sprintf( "%.2f", $this->revCount / $delta );
@@ -254,7 +254,7 @@ TEXT;
        }
 
        function importFromHandle( $handle ) {
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
 
                $source = new ImportStreamSource( $handle );
                $importer = new WikiImporter( $source );
index b537f9b..8caf867 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup MaintenanceLanguage
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
 
+/**
+ * Maintenance script that gets all messages as defined by the
+ * English language file.
+ *
+ * @ingroup MaintenanceLanguage
+ */
 class AllTrans extends Maintenance {
        public function __construct() {
                parent::__construct();
index 1888c4c..6abf7b4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to print out duplicates in message array
+ * Print out duplicates in message array
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d37d22e..5058a54 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup MaintenanceLanguage
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
 
+/**
+ * Maintenance script that counts how many messages we have defined
+ * for each language.
+ *
+ * @ingroup MaintenanceLanguage
+ */
 class CountMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
index 505cb57..ed12b78 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup MaintenanceLanguage
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
 
+/**
+ * Maintenance script that tests various language time and date functions.
+ *
+ * @ingroup MaintenanceLanguage
+ */
 class DateFormats extends Maintenance {
 
        private $ts = '20010115123456';
index 7e729b4..9d4cbe7 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Check digit transformation
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup MaintenanceLanguage
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
 
+/**
+ * Maintenance script that check digit transformation.
+ *
+ * @ingroup MaintenanceLanguage
+ */
 class Digit2Html extends Maintenance {
 
        # A list of unicode numerals is available at:
index 9292ce3..0292d31 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup MaintenanceLanguage
- * @todo Make this more useful, right now just dumps $wgContentLang
+ * @todo Make this more useful, right now just dumps $wgContLang
  */
 
 require_once( __DIR__ . '/../Maintenance.php' );
 
+/**
+ * Maintenance script that dumps an entire language, using the keys from English.
+ *
+ * @ingroup MaintenanceLanguage
+ */
 class DumpMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Dump an entire language, using the keys from English";
        }
-       
+
        public function execute() {
                global $wgVersion;
 
index c4a8e54..e34d9a1 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
- * @ingroup Maintenance
  * @file
+ * @ingroup MaintenanceLanguage
  */
 
 require_once( __DIR__ .'/../Maintenance.php' );
 
 /**
  * Generate first letter data files for Collation.php
+ *
+ * @ingroup MaintenanceLanguage
  */
 class GenerateCollationData extends Maintenance {
        /** The directory with source data files in it */
index f3cc568..54dfa39 100644 (file)
@@ -28,6 +28,8 @@ require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
 /**
  * Generates normalizer data files for Arabic and Malayalam.
  * For NFC see includes/normal.
+ *
+ * @ingroup MaintenanceLanguage
  */
 class GenerateNormalizerData extends Maintenance {
        var $dataFile;
diff --git a/maintenance/purgeStaleMemcachedText.php b/maintenance/purgeStaleMemcachedText.php
deleted file mode 100644 (file)
index 225400f..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance Memcached
- */
-
-require_once( __DIR__ . '/commandLine.inc' );
-
-function purgeStaleMemcachedText() {
-       global $wgMemc, $wgDBname;
-       $db = wfGetDB( DB_MASTER );
-       $maxTextId = $db->selectField( 'text', 'max(old_id)' );
-       $latestReplicatedTextId = $db->selectField( array( 'recentchanges', 'revision' ), 'rev_text_id', 
-               array( 'rev_id = rc_this_oldid', "rc_timestamp < '20101225183000'"),  'purgeStaleMemcachedText', 
-               array( 'ORDER BY' => 'rc_timestamp DESC' ) );
-       $latestReplicatedTextId -= 100; # A bit of paranoia
-
-       echo "Going to purge text entries from $latestReplicatedTextId to $maxTextId in $wgDBname\n";
-
-       for ( $i = $latestReplicatedTextId; $i < $maxTextId; $i++ ) {
-               $key = wfMemcKey( 'revisiontext', 'textid', $i );
-               
-               while (1) {
-                       if (! $wgMemc->delete( $key ) ) {
-                               echo "Memcache delete for $key returned false\n";
-                       }
-                       if ( $wgMemc->get( $key ) ) {
-                               echo "There's still content in $key!\n";
-                       } else {
-                               break;
-                       }
-               }
-               
-       }
-}
-
-purgeStaleMemcachedText();
-
index f5d06e4..2842b40 100644 (file)
@@ -91,7 +91,7 @@ class ImageBuilder extends Maintenance {
                $this->processed = 0;
                $this->updated = 0;
                $this->count = $count;
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
                $this->table = $table;
        }
 
@@ -104,7 +104,7 @@ class ImageBuilder extends Maintenance {
                $portion = $this->processed / $this->count;
                $updateRate = $this->updated / $this->processed;
 
-               $now = wfTime();
+               $now = microtime( true );
                $delta = $now - $this->startTime;
                $estimatedTotalTime = $delta / $portion;
                $eta = $this->startTime + $estimatedTotalTime;
diff --git a/maintenance/refreshImageCount.php b/maintenance/refreshImageCount.php
deleted file mode 100644 (file)
index be6bd18..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Quickie hack; patch-ss_images.sql uses variables which don't
- * replicate properly.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-class RefreshImageCount extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Resets ss_image count, forcing slaves to pick it up.";
-       }
-
-       public function execute() {
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Load the current value from the master
-               $count = $dbw->selectField( 'site_stats', 'ss_images' );
-
-               $this->output( wfWikiID() . ": forcing ss_images to $count\n" );
-
-               // First set to NULL so that it changes on the master
-               $dbw->update( 'site_stats',
-                       array( 'ss_images' => null ),
-                       array( 'ss_row_id' => 1 ) );
-
-               // Now this update will be forced to go out
-               $dbw->update( 'site_stats',
-                       array( 'ss_images' => $count ),
-                       array( 'ss_row_id' => 1 ) );
-                       }
-}
-
-$maintClass = "RefreshImageCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
index b25fb94..24bedfa 100644 (file)
@@ -52,7 +52,7 @@ class DumpRenderer extends Maintenance {
        public function execute() {
                $this->outputDirectory = $this->getOption( 'output-dir' );
                $this->prefix = $this->getOption( 'prefix', 'wiki' );
-               $this->startTime = wfTime();
+               $this->startTime = microtime( true );
 
                if ( $this->hasOption( 'parser' ) ) {
                        global $wgParserConf;
@@ -68,7 +68,7 @@ class DumpRenderer extends Maintenance {
 
                $importer->doImport();
 
-               $delta = wfTime() - $this->startTime;
+               $delta = microtime( true ) - $this->startTime;
                $this->error( "Rendered {$this->count} pages in " . round($delta, 2) . " seconds " );
                if ($delta > 0)
                        $this->error( round($this->count / $delta, 2) . " pages/sec" );
index c3d0e62..04e98d9 100644 (file)
@@ -18,6 +18,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
diff --git a/maintenance/sqlite/archives/patch-cat_hidden.sql b/maintenance/sqlite/archives/patch-cat_hidden.sql
new file mode 100644 (file)
index 0000000..272b8ef
--- /dev/null
@@ -0,0 +1,20 @@
+-- cat_hidden is no longer used, delete it
+
+CREATE TABLE /*_*/category_tmp (
+  cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  cat_title varchar(255) binary NOT NULL,
+  cat_pages int signed NOT NULL default 0,
+  cat_subcats int signed NOT NULL default 0,
+  cat_files int signed NOT NULL default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/category_tmp
+       SELECT cat_id, cat_title, cat_pages, cat_subcats, cat_files
+               FROM /*_*/category;
+
+DROP TABLE /*_*/category;
+
+ALTER TABLE /*_*/category_tmp RENAME TO /*_*/category;
+
+CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
+CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
index 2e1d1c3..a29647b 100644 (file)
@@ -209,7 +209,11 @@ class SyncFileBackend extends Maintenance {
                }
 
                $t_start = microtime( true );
-               $status->merge( $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ) );
+               $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               if ( !$status->isOK() ) {
+                       sleep( 10 ); // wait and retry copy again
+                       $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               }
                $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
                        $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .
index 0a5b2fb..062052f 100644 (file)
@@ -571,10 +571,7 @@ CREATE TABLE /*_*/category (
   -- ing is not.
   cat_pages int signed NOT NULL default 0,
   cat_subcats int signed NOT NULL default 0,
-  cat_files int signed NOT NULL default 0,
-
-  -- Reserved for future use
-  cat_hidden tinyint unsigned NOT NULL default 0
+  cat_files int signed NOT NULL default 0
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
index 13faece..1e268de 100644 (file)
@@ -252,7 +252,7 @@ class FiveUpgrade extends Maintenance {
                $this->chunkSize  = $chunksize;
                $this->chunkFinal = $final;
                $this->chunkCount = 0;
-               $this->chunkStartTime = wfTime();
+               $this->chunkStartTime = microtime( true );
                $this->chunkOptions = array( 'IGNORE' );
                $this->chunkTable = $table;
                $this->chunkFunction = $fname;
@@ -273,7 +273,7 @@ class FiveUpgrade extends Maintenance {
                        $this->insertChunk( $chunk );
 
                        $this->chunkCount += count( $chunk );
-                       $now = wfTime();
+                       $now = microtime( true );
                        $delta = $now - $this->chunkStartTime;
                        $rate = $this->chunkCount / $delta;
 
index 4443ece..5156dd0 100644 (file)
@@ -160,6 +160,7 @@ return array(
        ),
        'jquery.highlightText' => array(
                'scripts' => 'resources/jquery/jquery.highlightText.js',
+               'dependencies' => 'jquery.mwExtension',
        ),
        'jquery.hoverIntent' => array(
                'scripts' => 'resources/jquery/jquery.hoverIntent.js',
@@ -216,6 +217,7 @@ return array(
                'scripts' => 'resources/jquery/jquery.tablesorter.js',
                'styles' => 'resources/jquery/jquery.tablesorter.css',
                'messages' => array( 'sort-descending', 'sort-ascending' ),
+               'dependencies' => 'jquery.mwExtension',
        ),
        'jquery.textSelection' => array(
                'scripts' => 'resources/jquery/jquery.textSelection.js',
@@ -789,6 +791,7 @@ return array(
                        'mediawiki.api.watch',
                        'mediawiki.util',
                        'mediawiki.notify',
+                       'jquery.mwExtension',
                ),
                'messages' => array(
                        'watch',
diff --git a/resources/jquery/images/spinner-large.gif b/resources/jquery/images/spinner-large.gif
new file mode 100644 (file)
index 0000000..72203fd
Binary files /dev/null and b/resources/jquery/images/spinner-large.gif differ
index 37d3a43..6146be4 100644 (file)
Binary files a/resources/jquery/images/spinner.gif and b/resources/jquery/images/spinner.gif differ
index 1b414dd..488d106 100644 (file)
  * </script>
  *
  */
-
 ( function ( $ ) {
        $.fn.arrowSteps = function () {
+               var $steps, width, arrowWidth;
                this.addClass( 'arrowSteps' );
-               var $steps = this.find( 'li' );
+               $steps = this.find( 'li' );
 
-               var width = parseInt( 100 / $steps.length, 10 );
+               width = parseInt( 100 / $steps.length, 10 );
                $steps.css( 'width', width + '%' );
 
                // every step except the last one has an arrow at the right hand side. Also add in the padding
                // for the calculated arrow width.
-               var arrowWidth = parseInt( this.outerHeight(), 10 );
+               arrowWidth = parseInt( this.outerHeight(), 10 );
                $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
                      .find( 'div' ).css( 'padding-right', arrowWidth.toString() + 'px' );
 
@@ -60,8 +60,8 @@
        };
 
        $.fn.arrowStepsHighlight = function ( selector ) {
-               var $steps = this.data( 'arrowSteps' );
-               var $previous;
+               var $previous,
+                       $steps = this.data( 'arrowSteps' );
                $.each( $steps, function ( i, step ) {
                        var $step = $( step );
                        if ( $step.is( selector ) ) {
index 23ba074..04bb301 100644 (file)
@@ -3,10 +3,12 @@
  */
 ( function ( $ ) {
 
-// Cache ellipsed substrings for every string-width-position combination
-var cache = { };
-// Use a separate cache when match highlighting is enabled
-var matchTextCache = { };
+var
+       // Cache ellipsed substrings for every string-width-position combination
+       cache = { },
+
+       // Use a separate cache when match highlighting is enabled
+       matchTextCache = { };
 
 $.fn.autoEllipsis = function ( options ) {
        options = $.extend( {
@@ -19,7 +21,7 @@ $.fn.autoEllipsis = function ( options ) {
        $(this).each( function () {
                var $container, $trimmableText,
                        text, trimmableText, w, pw,
-                       l, r, i, side,
+                       l, r, i, side, m,
                        $el = $(this);
                if ( options.restoreText ) {
                        if ( !$el.data( 'autoEllipsis.originalText' ) ) {
@@ -90,7 +92,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        l = 0;
                                        r = trimmableText.length;
                                        do {
-                                               var m = Math.ceil( ( l + r ) / 2 );
+                                               m = Math.ceil( ( l + r ) / 2 );
                                                $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
                                                if ( $trimmableText.width() + pw > w ) {
                                                        // Text is too long
index 3d7f94d..1990dc0 100644 (file)
@@ -6,10 +6,9 @@
  * @author Krinkle <krinklemail@gmail.com>
  * @license GPL v2
  */
-( function( $ ) {
+( function ( $ ) {
        $.fn.checkboxShiftClick = function ( text ) {
-               var prevCheckbox = null;
-               var $box = this;
+               var prevCheckbox = null, $box = this;
                // When our boxes are clicked..
                $box.click( function ( e ) {
                        // And one has been clicked before...
@@ -18,7 +17,7 @@
                                $box.slice(
                                        Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
                                        Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                               ).prop( 'checked', e.target.checked ? true : false );
+                               ).prop( 'checked', !!e.target.checked );
                        }
                        // Either way, update the prevCheckbox variable to the one clicked now
                        prevCheckbox = e.target;
index 26eea96..24f8959 100644 (file)
@@ -32,7 +32,7 @@
                 *  }
                 */
                profile: function ( nav ) {
-                       /*jshint boss:true */
+                       /*jshint boss: true */
 
                        if ( nav === undefined ) {
                                nav = window.navigator;
index a3396a2..063f260 100644 (file)
        $.fn.expandableField = function () {
 
                // Multi-context fields
-               var returnValue;
-               var args = arguments;
+               var returnValue,
+                       args = arguments;
 
                $( this ).each( function () {
-                       var key;
+                       var key, context;
 
                        /* Construction / Loading */
 
-                       var context = $( this ).data( 'expandableField-context' );
+                       context = $( this ).data( 'expandableField-context' );
 
                        // TODO: Do we need to check both null and undefined?
                        if ( context === undefined || context === null ) {
index fa4416c..0844da7 100644 (file)
@@ -9,8 +9,9 @@
 
                // Split our pattern string at spaces and run our highlight function on the results
                splitAndHighlight: function ( node, pat ) {
-                       var patArray = pat.split( ' ' );
-                       for ( var i = 0; i < patArray.length; i++ ) {
+                       var i,
+                               patArray = pat.split( ' ' );
+                       for ( i = 0; i < patArray.length; i++ ) {
                                if ( patArray[i].length === 0 ) {
                                        continue;
                                }
 
                // scans a node looking for the pattern and wraps a span around each match
                innerHighlight: function ( node, pat ) {
+                       var i, match, pos, spannode, middlebit, middleclone;
                        // if this is a text node
                        if ( node.nodeType === 3 ) {
                                // TODO - need to be smarter about the character matching here.
                                // non latin characters can make regex think a new word has begun: do not use \b
                                // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
                                // look for an occurrence of our pattern and store the starting position
-                               var match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
+                               match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
                                if ( match ) {
-                                       var pos = match.index + match[1].length; // include length of any matched spaces
+                                       pos = match.index + match[1].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
-                                       var spannode = document.createElement( 'span' );
+                                       spannode = document.createElement( 'span' );
                                        spannode.className = 'highlight';
                                        // shave off the characters preceding the matched text
-                                       var middlebit = node.splitText( pos );
+                                       middlebit = node.splitText( pos );
                                        // shave off any unmatched text off the end
                                        middlebit.splitText( pat.length );
                                        // clone for appending to our span
-                                       var middleclone = middlebit.cloneNode( true );
+                                       middleclone = middlebit.cloneNode( true );
                                        // append the matched text node to the span
                                        spannode.appendChild( middleclone );
                                        // replace the matched node, with our span-wrapped clone of the matched node
@@ -47,7 +49,7 @@
                        // if this is an element with childnodes, and not a script, style or an element we created
                        } else if ( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
                                        && !( node.tagName.toLowerCase() === 'span' && node.className.match( /\bhighlight/ ) ) ) {
-                               for ( var i = 0; i < node.childNodes.length; ++i ) {
+                               for ( i = 0; i < node.childNodes.length; ++i ) {
                                        // call the highlight function for each child node
                                        $.highlightText.innerHighlight( node.childNodes[i], pat );
                                }
index 973ef3d..b7dd119 100644 (file)
 /*!
- * jQuery JavaScript Library v1.8.1
+ * jQuery JavaScript Library v1.7.2
  * http://jquery.com/
  *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
  * Includes Sizzle.js
  * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
  *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
+ * Date: Wed Mar 21 12:46:34 2012 -0700
  */
 (function( window, undefined ) {
-var
-       // A central reference to the root jQuery(document)
-       rootjQuery,
-
-       // The deferred used on DOM ready
-       readyList,
-
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-       location = window.location,
-       navigator = window.navigator,
-
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
-
-       // Map over the $ in case of overwrite
-       _$ = window.$,
-
-       // Save a reference to some core methods
-       core_push = Array.prototype.push,
-       core_slice = Array.prototype.slice,
-       core_indexOf = Array.prototype.indexOf,
-       core_toString = Object.prototype.toString,
-       core_hasOwn = Object.prototype.hasOwnProperty,
-       core_trim = String.prototype.trim,
-
-       // Define a local copy of jQuery
-       jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
-
-       // Used for matching numbers
-       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-
-       // Used for detecting and trimming whitespace
-       core_rnotwhite = /\S/,
-       core_rspace = /\s+/,
-
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-       // A simple way to check for HTML strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-       // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
-       // JSON RegExp
-       rvalidchars = /^[\],:{}\s]*$/,
-       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-
-       // Matches dashed string for camelizing
-       rmsPrefix = /^-ms-/,
-       rdashAlpha = /-([\da-z])/gi,
-
-       // Used by jQuery.camelCase as callback to replace()
-       fcamelCase = function( all, letter ) {
-               return ( letter + "" ).toUpperCase();
-       },
-
-       // The ready event handler and self cleanup method
-       DOMContentLoaded = function() {
-               if ( document.addEventListener ) {
-                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-                       jQuery.ready();
-               } else if ( document.readyState === "complete" ) {
-                       // we're here because readyState === "complete" in oldIE
-                       // which is good enough for us to call the dom ready!
-                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                       jQuery.ready();
-               }
-       },
 
-       // [[Class]] -> type pairs
-       class2type = {};
+// Use the correct document accordingly with window argument (sandbox)
+       var document = window.document,
+               navigator = window.navigator,
+               location = window.location;
+       var jQuery = (function() {
 
-jQuery.fn = jQuery.prototype = {
-       constructor: jQuery,
-       init: function( selector, context, rootjQuery ) {
-               var match, elem, ret, doc;
+// Define a local copy of jQuery
+               var jQuery = function( selector, context ) {
+                               // The jQuery object is actually just the init constructor 'enhanced'
+                               return new jQuery.fn.init( selector, context, rootjQuery );
+                       },
 
-               // Handle $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
+               // Map over jQuery in case of overwrite
+                       _jQuery = window.jQuery,
 
-               // Handle $(DOMElement)
-               if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-               }
+               // Map over the $ in case of overwrite
+                       _$ = window.$,
 
-               // Handle HTML strings
-               if ( typeof selector === "string" ) {
-                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                               match = [ null, selector, null ];
+               // A central reference to the root jQuery(document)
+                       rootjQuery,
 
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
+               // A simple way to check for HTML strings or ID strings
+               // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+                       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
 
-                       // Match html or make sure no context is specified for #id
-                       if ( match && (match[1] || !context) ) {
+               // Check if a string has a non-whitespace character in it
+                       rnotwhite = /\S/,
 
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[1] ) {
-                                       context = context instanceof jQuery ? context[0] : context;
-                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+               // Used for trimming whitespace
+                       trimLeft = /^\s+/,
+                       trimRight = /\s+$/,
 
-                                       // scripts is true for back-compat
-                                       selector = jQuery.parseHTML( match[1], doc, true );
-                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-                                               this.attr.call( selector, context, true );
-                                       }
+               // Match a standalone tag
+                       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
-                                       return jQuery.merge( this, selector );
+               // JSON RegExp
+                       rvalidchars = /^[\],:{}\s]*$/,
+                       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+                       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+                       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
 
-                               // HANDLE: $(#id)
-                               } else {
-                                       elem = document.getElementById( match[2] );
-
-                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                       // nodes that are no longer in the document #6963
-                                       if ( elem && elem.parentNode ) {
-                                               // Handle the case where IE and Opera return items
-                                               // by name instead of ID
-                                               if ( elem.id !== match[2] ) {
-                                                       return rootjQuery.find( selector );
-                                               }
+               // Useragent RegExp
+                       rwebkit = /(webkit)[ \/]([\w.]+)/,
+                       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+                       rmsie = /(msie) ([\w.]+)/,
+                       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
 
-                                               // Otherwise, we inject the element directly into the jQuery object
-                                               this.length = 1;
-                                               this[0] = elem;
-                                       }
+               // Matches dashed string for camelizing
+                       rdashAlpha = /-([a-z]|[0-9])/ig,
+                       rmsPrefix = /^-ms-/,
+
+               // Used by jQuery.camelCase as callback to replace()
+                       fcamelCase = function( all, letter ) {
+                               return ( letter + "" ).toUpperCase();
+                       },
+
+               // Keep a UserAgent string for use with jQuery.browser
+                       userAgent = navigator.userAgent,
+
+               // For matching the engine and version of the browser
+                       browserMatch,
+
+               // The deferred used on DOM ready
+                       readyList,
+
+               // The ready event handler
+                       DOMContentLoaded,
+
+               // Save a reference to some core methods
+                       toString = Object.prototype.toString,
+                       hasOwn = Object.prototype.hasOwnProperty,
+                       push = Array.prototype.push,
+                       slice = Array.prototype.slice,
+                       trim = String.prototype.trim,
+                       indexOf = Array.prototype.indexOf,
+
+               // [[Class]] -> type pairs
+                       class2type = {};
+
+               jQuery.fn = jQuery.prototype = {
+                       constructor: jQuery,
+                       init: function( selector, context, rootjQuery ) {
+                               var match, elem, ret, doc;
+
+                               // Handle $(""), $(null), or $(undefined)
+                               if ( !selector ) {
+                                       return this;
+                               }
+
+                               // Handle $(DOMElement)
+                               if ( selector.nodeType ) {
+                                       this.context = this[0] = selector;
+                                       this.length = 1;
+                                       return this;
+                               }
 
+                               // The body element only exists once, optimize finding it
+                               if ( selector === "body" && !context && document.body ) {
                                        this.context = document;
+                                       this[0] = document.body;
                                        this.selector = selector;
+                                       this.length = 1;
                                        return this;
                                }
 
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector );
+                               // Handle HTML strings
+                               if ( typeof selector === "string" ) {
+                                       // Are we dealing with HTML string or an ID?
+                                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                                               match = [ null, selector, null ];
 
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( selector );
-                       }
+                                       } else {
+                                               match = quickExpr.exec( selector );
+                                       }
 
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return rootjQuery.ready( selector );
-               }
+                                       // Verify a match, and that no context was specified for #id
+                                       if ( match && (match[1] || !context) ) {
 
-               if ( selector.selector !== undefined ) {
-                       this.selector = selector.selector;
-                       this.context = selector.context;
-               }
+                                               // HANDLE: $(html) -> $(array)
+                                               if ( match[1] ) {
+                                                       context = context instanceof jQuery ? context[0] : context;
+                                                       doc = ( context ? context.ownerDocument || context : document );
 
-               return jQuery.makeArray( selector, this );
-       },
+                                                       // If a single string is passed in and it's a single tag
+                                                       // just do a createElement and skip the rest
+                                                       ret = rsingleTag.exec( selector );
 
-       // Start with an empty selector
-       selector: "",
+                                                       if ( ret ) {
+                                                               if ( jQuery.isPlainObject( context ) ) {
+                                                                       selector = [ document.createElement( ret[1] ) ];
+                                                                       jQuery.fn.attr.call( selector, context, true );
 
-       // The current version of jQuery being used
-       jquery: "1.8.1",
+                                                               } else {
+                                                                       selector = [ doc.createElement( ret[1] ) ];
+                                                               }
 
-       // The default length of a jQuery object is 0
-       length: 0,
+                                                       } else {
+                                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+                                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+                                                       }
 
-       // The number of elements contained in the matched element set
-       size: function() {
-               return this.length;
-       },
+                                                       return jQuery.merge( this, selector );
 
-       toArray: function() {
-               return core_slice.call( this );
-       },
+                                                       // HANDLE: $("#id")
+                                               } else {
+                                                       elem = document.getElementById( match[2] );
+
+                                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                                       // nodes that are no longer in the document #6963
+                                                       if ( elem && elem.parentNode ) {
+                                                               // Handle the case where IE and Opera return items
+                                                               // by name instead of ID
+                                                               if ( elem.id !== match[2] ) {
+                                                                       return rootjQuery.find( selector );
+                                                               }
 
-       // Get the Nth element in the matched element set OR
-       // Get the whole matched element set as a clean array
-       get: function( num ) {
-               return num == null ?
+                                                               // Otherwise, we inject the element directly into the jQuery object
+                                                               this.length = 1;
+                                                               this[0] = elem;
+                                                       }
 
-                       // Return a 'clean' array
-                       this.toArray() :
+                                                       this.context = document;
+                                                       this.selector = selector;
+                                                       return this;
+                                               }
 
-                       // Return just the object
-                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
-       },
+                                               // HANDLE: $(expr, $(...))
+                                       } else if ( !context || context.jquery ) {
+                                               return ( context || rootjQuery ).find( selector );
 
-       // Take an array of elements and push it onto the stack
-       // (returning the new matched element set)
-       pushStack: function( elems, name, selector ) {
+                                               // HANDLE: $(expr, context)
+                                               // (which is just equivalent to: $(context).find(expr)
+                                       } else {
+                                               return this.constructor( context ).find( selector );
+                                       }
 
-               // Build a new jQuery matched element set
-               var ret = jQuery.merge( this.constructor(), elems );
+                                       // HANDLE: $(function)
+                                       // Shortcut for document ready
+                               } else if ( jQuery.isFunction( selector ) ) {
+                                       return rootjQuery.ready( selector );
+                               }
 
-               // Add the old object onto the stack (as a reference)
-               ret.prevObject = this;
+                               if ( selector.selector !== undefined ) {
+                                       this.selector = selector.selector;
+                                       this.context = selector.context;
+                               }
 
-               ret.context = this.context;
+                               return jQuery.makeArray( selector, this );
+                       },
 
-               if ( name === "find" ) {
-                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-               } else if ( name ) {
-                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-               }
+                       // Start with an empty selector
+                       selector: "",
 
-               // Return the newly-formed element set
-               return ret;
-       },
-
-       // Execute a callback for every element in the matched set.
-       // (You can seed the arguments with an array of args, but this is
-       // only used internally.)
-       each: function( callback, args ) {
-               return jQuery.each( this, callback, args );
-       },
-
-       ready: function( fn ) {
-               // Add the callback
-               jQuery.ready.promise().done( fn );
-
-               return this;
-       },
-
-       eq: function( i ) {
-               i = +i;
-               return i === -1 ?
-                       this.slice( i ) :
-                       this.slice( i, i + 1 );
-       },
-
-       first: function() {
-               return this.eq( 0 );
-       },
-
-       last: function() {
-               return this.eq( -1 );
-       },
-
-       slice: function() {
-               return this.pushStack( core_slice.apply( this, arguments ),
-                       "slice", core_slice.call(arguments).join(",") );
-       },
-
-       map: function( callback ) {
-               return this.pushStack( jQuery.map(this, function( elem, i ) {
-                       return callback.call( elem, i, elem );
-               }));
-       },
-
-       end: function() {
-               return this.prevObject || this.constructor(null);
-       },
-
-       // For internal use only.
-       // Behaves like an Array's method, not like a jQuery method.
-       push: core_push,
-       sort: [].sort,
-       splice: [].splice
-};
+                       // The current version of jQuery being used
+                       jquery: "1.7.2",
 
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-       var options, name, src, copy, copyIsArray, clone,
-               target = arguments[0] || {},
-               i = 1,
-               length = arguments.length,
-               deep = false;
-
-       // Handle a deep copy situation
-       if ( typeof target === "boolean" ) {
-               deep = target;
-               target = arguments[1] || {};
-               // skip the boolean and the target
-               i = 2;
-       }
+                       // The default length of a jQuery object is 0
+                       length: 0,
 
-       // Handle case when target is a string or something (possible in deep copy)
-       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-               target = {};
-       }
+                       // The number of elements contained in the matched element set
+                       size: function() {
+                               return this.length;
+                       },
 
-       // extend jQuery itself if only one argument is passed
-       if ( length === i ) {
-               target = this;
-               --i;
-       }
+                       toArray: function() {
+                               return slice.call( this, 0 );
+                       },
 
-       for ( ; i < length; i++ ) {
-               // Only deal with non-null/undefined values
-               if ( (options = arguments[ i ]) != null ) {
-                       // Extend the base object
-                       for ( name in options ) {
-                               src = target[ name ];
-                               copy = options[ name ];
+                       // Get the Nth element in the matched element set OR
+                       // Get the whole matched element set as a clean array
+                       get: function( num ) {
+                               return num == null ?
 
-                               // Prevent never-ending loop
-                               if ( target === copy ) {
-                                       continue;
-                               }
+                                       // Return a 'clean' array
+                                       this.toArray() :
 
-                               // Recurse if we're merging plain objects or arrays
-                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-                                       if ( copyIsArray ) {
-                                               copyIsArray = false;
-                                               clone = src && jQuery.isArray(src) ? src : [];
+                                       // Return just the object
+                                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+                       },
 
-                                       } else {
-                                               clone = src && jQuery.isPlainObject(src) ? src : {};
-                                       }
+                       // Take an array of elements and push it onto the stack
+                       // (returning the new matched element set)
+                       pushStack: function( elems, name, selector ) {
+                               // Build a new jQuery matched element set
+                               var ret = this.constructor();
 
-                                       // Never move original objects, clone them
-                                       target[ name ] = jQuery.extend( deep, clone, copy );
+                               if ( jQuery.isArray( elems ) ) {
+                                       push.apply( ret, elems );
 
-                               // Don't bring in undefined values
-                               } else if ( copy !== undefined ) {
-                                       target[ name ] = copy;
+                               } else {
+                                       jQuery.merge( ret, elems );
                                }
-                       }
-               }
-       }
 
-       // Return the modified object
-       return target;
-};
+                               // Add the old object onto the stack (as a reference)
+                               ret.prevObject = this;
 
-jQuery.extend({
-       noConflict: function( deep ) {
-               if ( window.$ === jQuery ) {
-                       window.$ = _$;
-               }
+                               ret.context = this.context;
 
-               if ( deep && window.jQuery === jQuery ) {
-                       window.jQuery = _jQuery;
-               }
+                               if ( name === "find" ) {
+                                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+                               } else if ( name ) {
+                                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+                               }
 
-               return jQuery;
-       },
+                               // Return the newly-formed element set
+                               return ret;
+                       },
 
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
+                       // Execute a callback for every element in the matched set.
+                       // (You can seed the arguments with an array of args, but this is
+                       // only used internally.)
+                       each: function( callback, args ) {
+                               return jQuery.each( this, callback, args );
+                       },
 
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
+                       ready: function( fn ) {
+                               // Attach the listeners
+                               jQuery.bindReady();
 
-       // Hold (or release) the ready event
-       holdReady: function( hold ) {
-               if ( hold ) {
-                       jQuery.readyWait++;
-               } else {
-                       jQuery.ready( true );
-               }
-       },
+                               // Add the callback
+                               readyList.add( fn );
 
-       // Handle when the DOM is ready
-       ready: function( wait ) {
+                               return this;
+                       },
 
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
+                       eq: function( i ) {
+                               i = +i;
+                               return i === -1 ?
+                                       this.slice( i ) :
+                                       this.slice( i, i + 1 );
+                       },
 
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready, 1 );
-               }
+                       first: function() {
+                               return this.eq( 0 );
+                       },
 
-               // Remember that the DOM is ready
-               jQuery.isReady = true;
+                       last: function() {
+                               return this.eq( -1 );
+                       },
 
-               // If a normal DOM Ready event fired, decrement, and wait if need be
-               if ( wait !== true && --jQuery.readyWait > 0 ) {
-                       return;
-               }
+                       slice: function() {
+                               return this.pushStack( slice.apply( this, arguments ),
+                                       "slice", slice.call(arguments).join(",") );
+                       },
 
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
+                       map: function( callback ) {
+                               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                                       return callback.call( elem, i, elem );
+                               }));
+                       },
 
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
-               }
-       },
-
-       // See test/unit/core.js for details concerning isFunction.
-       // Since version 1.3, DOM methods and functions like alert
-       // aren't supported. They return false on IE (#2968).
-       isFunction: function( obj ) {
-               return jQuery.type(obj) === "function";
-       },
-
-       isArray: Array.isArray || function( obj ) {
-               return jQuery.type(obj) === "array";
-       },
-
-       isWindow: function( obj ) {
-               return obj != null && obj == obj.window;
-       },
-
-       isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
-       },
-
-       type: function( obj ) {
-               return obj == null ?
-                       String( obj ) :
-                       class2type[ core_toString.call(obj) ] || "object";
-       },
-
-       isPlainObject: function( obj ) {
-               // Must be an Object.
-               // Because of IE, we also have to check the presence of the constructor property.
-               // Make sure that DOM nodes and window objects don't pass through, as well
-               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-                       return false;
-               }
+                       end: function() {
+                               return this.prevObject || this.constructor(null);
+                       },
 
-               try {
-                       // Not own constructor property must be Object
-                       if ( obj.constructor &&
-                               !core_hasOwn.call(obj, "constructor") &&
-                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-                               return false;
-                       }
-               } catch ( e ) {
-                       // IE8,9 Will throw exceptions on certain host objects #9897
-                       return false;
-               }
+                       // For internal use only.
+                       // Behaves like an Array's method, not like a jQuery method.
+                       push: push,
+                       sort: [].sort,
+                       splice: [].splice
+               };
 
-               // Own properties are enumerated firstly, so to speed up,
-               // if last one is own, then all properties are own.
+// Give the init function the jQuery prototype for later instantiation
+               jQuery.fn.init.prototype = jQuery.fn;
 
-               var key;
-               for ( key in obj ) {}
+               jQuery.extend = jQuery.fn.extend = function() {
+                       var options, name, src, copy, copyIsArray, clone,
+                               target = arguments[0] || {},
+                               i = 1,
+                               length = arguments.length,
+                               deep = false;
 
-               return key === undefined || core_hasOwn.call( obj, key );
-       },
+                       // Handle a deep copy situation
+                       if ( typeof target === "boolean" ) {
+                               deep = target;
+                               target = arguments[1] || {};
+                               // skip the boolean and the target
+                               i = 2;
+                       }
 
-       isEmptyObject: function( obj ) {
-               var name;
-               for ( name in obj ) {
-                       return false;
-               }
-               return true;
-       },
-
-       error: function( msg ) {
-               throw new Error( msg );
-       },
-
-       // data: string of html
-       // context (optional): If specified, the fragment will be created in this context, defaults to document
-       // scripts (optional): If true, will include scripts passed in the html string
-       parseHTML: function( data, context, scripts ) {
-               var parsed;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               if ( typeof context === "boolean" ) {
-                       scripts = context;
-                       context = 0;
-               }
-               context = context || document;
+                       // Handle case when target is a string or something (possible in deep copy)
+                       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+                               target = {};
+                       }
 
-               // Single tag
-               if ( (parsed = rsingleTag.exec( data )) ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
+                       // extend jQuery itself if only one argument is passed
+                       if ( length === i ) {
+                               target = this;
+                               --i;
+                       }
 
-               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-               return jQuery.merge( [],
-                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-       },
+                       for ( ; i < length; i++ ) {
+                               // Only deal with non-null/undefined values
+                               if ( (options = arguments[ i ]) != null ) {
+                                       // Extend the base object
+                                       for ( name in options ) {
+                                               src = target[ name ];
+                                               copy = options[ name ];
+
+                                               // Prevent never-ending loop
+                                               if ( target === copy ) {
+                                                       continue;
+                                               }
 
-       parseJSON: function( data ) {
-               if ( !data || typeof data !== "string") {
-                       return null;
-               }
+                                               // Recurse if we're merging plain objects or arrays
+                                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                                       if ( copyIsArray ) {
+                                                               copyIsArray = false;
+                                                               clone = src && jQuery.isArray(src) ? src : [];
 
-               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-               data = jQuery.trim( data );
+                                                       } else {
+                                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                                       }
 
-               // Attempt to parse using the native JSON parser first
-               if ( window.JSON && window.JSON.parse ) {
-                       return window.JSON.parse( data );
-               }
+                                                       // Never move original objects, clone them
+                                                       target[ name ] = jQuery.extend( deep, clone, copy );
 
-               // Make sure the incoming data is actual JSON
-               // Logic borrowed from http://json.org/json2.js
-               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                       .replace( rvalidtokens, "]" )
-                       .replace( rvalidbraces, "")) ) {
+                                                       // Don't bring in undefined values
+                                               } else if ( copy !== undefined ) {
+                                                       target[ name ] = copy;
+                                               }
+                                       }
+                               }
+                       }
 
-                       return ( new Function( "return " + data ) )();
+                       // Return the modified object
+                       return target;
+               };
 
-               }
-               jQuery.error( "Invalid JSON: " + data );
-       },
+               jQuery.extend({
+                       noConflict: function( deep ) {
+                               if ( window.$ === jQuery ) {
+                                       window.$ = _$;
+                               }
 
-       // Cross-browser xml parsing
-       parseXML: function( data ) {
-               var xml, tmp;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               try {
-                       if ( window.DOMParser ) { // Standard
-                               tmp = new DOMParser();
-                               xml = tmp.parseFromString( data , "text/xml" );
-                       } else { // IE
-                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                               xml.async = "false";
-                               xml.loadXML( data );
-                       }
-               } catch( e ) {
-                       xml = undefined;
-               }
-               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-                       jQuery.error( "Invalid XML: " + data );
-               }
-               return xml;
-       },
-
-       noop: function() {},
-
-       // Evaluates a script in a global context
-       // Workarounds based on findings by Jim Driscoll
-       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-       globalEval: function( data ) {
-               if ( data && core_rnotwhite.test( data ) ) {
-                       // We use execScript on Internet Explorer
-                       // We use an anonymous function so that context is window
-                       // rather than jQuery in Firefox
-                       ( window.execScript || function( data ) {
-                               window[ "eval" ].call( window, data );
-                       } )( data );
-               }
-       },
+                               if ( deep && window.jQuery === jQuery ) {
+                                       window.jQuery = _jQuery;
+                               }
 
-       // Convert dashed to camelCase; used by the css and data modules
-       // Microsoft forgot to hump their vendor prefix (#9572)
-       camelCase: function( string ) {
-               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-       },
+                               return jQuery;
+                       },
 
-       nodeName: function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-       },
+                       // Is the DOM ready to be used? Set to true once it occurs.
+                       isReady: false,
 
-       // args is for internal usage only
-       each: function( obj, callback, args ) {
-               var name,
-                       i = 0,
-                       length = obj.length,
-                       isObj = length === undefined || jQuery.isFunction( obj );
+                       // A counter to track how many items to wait for before
+                       // the ready event fires. See #6781
+                       readyWait: 1,
 
-               if ( args ) {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.apply( obj[ name ], args ) === false ) {
-                                               break;
-                                       }
+                       // Hold (or release) the ready event
+                       holdReady: function( hold ) {
+                               if ( hold ) {
+                                       jQuery.readyWait++;
+                               } else {
+                                       jQuery.ready( true );
                                }
-                       } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
-                                               break;
+                       },
+
+                       // Handle when the DOM is ready
+                       ready: function( wait ) {
+                               // Either a released hold or an DOMready/load event and not yet ready
+                               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+                                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                                       if ( !document.body ) {
+                                               return setTimeout( jQuery.ready, 1 );
                                        }
-                               }
-                       }
 
-               // A special, fast, case for the most common use of each
-               } else {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
-                                               break;
+                                       // Remember that the DOM is ready
+                                       jQuery.isReady = true;
+
+                                       // If a normal DOM Ready event fired, decrement, and wait if need be
+                                       if ( wait !== true && --jQuery.readyWait > 0 ) {
+                                               return;
                                        }
-                               }
-                       } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
-                                               break;
+
+                                       // If there are functions bound, to execute
+                                       readyList.fireWith( document, [ jQuery ] );
+
+                                       // Trigger any bound ready events
+                                       if ( jQuery.fn.trigger ) {
+                                               jQuery( document ).trigger( "ready" ).off( "ready" );
                                        }
                                }
-                       }
-               }
+                       },
 
-               return obj;
-       },
-
-       // Use native String.trim function wherever possible
-       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               core_trim.call( text );
-               } :
+                       bindReady: function() {
+                               if ( readyList ) {
+                                       return;
+                               }
 
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               text.toString().replace( rtrim, "" );
-               },
+                               readyList = jQuery.Callbacks( "once memory" );
 
-       // results is for internal usage only
-       makeArray: function( arr, results ) {
-               var type,
-                       ret = results || [];
+                               // Catch cases where $(document).ready() is called after the
+                               // browser event has already occurred.
+                               if ( document.readyState === "complete" ) {
+                                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                                       return setTimeout( jQuery.ready, 1 );
+                               }
 
-               if ( arr != null ) {
-                       // The window, strings (and functions) also have 'length'
-                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                       type = jQuery.type( arr );
+                               // Mozilla, Opera and webkit nightlies currently support this event
+                               if ( document.addEventListener ) {
+                                       // Use the handy event callback
+                                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
-                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-                               core_push.call( ret, arr );
-                       } else {
-                               jQuery.merge( ret, arr );
-                       }
-               }
+                                       // A fallback to window.onload, that will always work
+                                       window.addEventListener( "load", jQuery.ready, false );
 
-               return ret;
-       },
+                                       // If IE event model is used
+                               } else if ( document.attachEvent ) {
+                                       // ensure firing before onload,
+                                       // maybe late but safe also for iframes
+                                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
-       inArray: function( elem, arr, i ) {
-               var len;
+                                       // A fallback to window.onload, that will always work
+                                       window.attachEvent( "onload", jQuery.ready );
 
-               if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
-                       }
+                                       // If IE and not a frame
+                                       // continually check to see if the document is ready
+                                       var toplevel = false;
 
-                       len = arr.length;
-                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+                                       try {
+                                               toplevel = window.frameElement == null;
+                                       } catch(e) {}
 
-                       for ( ; i < len; i++ ) {
-                               // Skip accessing in sparse arrays
-                               if ( i in arr && arr[ i ] === elem ) {
-                                       return i;
+                                       if ( document.documentElement.doScroll && toplevel ) {
+                                               doScrollCheck();
+                                       }
                                }
-                       }
-               }
+                       },
 
-               return -1;
-       },
+                       // See test/unit/core.js for details concerning isFunction.
+                       // Since version 1.3, DOM methods and functions like alert
+                       // aren't supported. They return false on IE (#2968).
+                       isFunction: function( obj ) {
+                               return jQuery.type(obj) === "function";
+                       },
 
-       merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
-                       j = 0;
+                       isArray: Array.isArray || function( obj ) {
+                               return jQuery.type(obj) === "array";
+                       },
 
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
-                               first[ i++ ] = second[ j ];
-                       }
+                       isWindow: function( obj ) {
+                               return obj != null && obj == obj.window;
+                       },
 
-               } else {
-                       while ( second[j] !== undefined ) {
-                               first[ i++ ] = second[ j++ ];
-                       }
-               }
+                       isNumeric: function( obj ) {
+                               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+                       },
 
-               first.length = i;
+                       type: function( obj ) {
+                               return obj == null ?
+                                       String( obj ) :
+                                       class2type[ toString.call(obj) ] || "object";
+                       },
 
-               return first;
-       },
+                       isPlainObject: function( obj ) {
+                               // Must be an Object.
+                               // Because of IE, we also have to check the presence of the constructor property.
+                               // Make sure that DOM nodes and window objects don't pass through, as well
+                               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                                       return false;
+                               }
 
-       grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
-                       i = 0,
-                       length = elems.length;
-               inv = !!inv;
+                               try {
+                                       // Not own constructor property must be Object
+                                       if ( obj.constructor &&
+                                               !hasOwn.call(obj, "constructor") &&
+                                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                                               return false;
+                                       }
+                               } catch ( e ) {
+                                       // IE8,9 Will throw exceptions on certain host objects #9897
+                                       return false;
+                               }
 
-               // Go through the array, only saving the items
-               // that pass the validator function
-               for ( ; i < length; i++ ) {
-                       retVal = !!callback( elems[ i ], i );
-                       if ( inv !== retVal ) {
-                               ret.push( elems[ i ] );
-                       }
-               }
+                               // Own properties are enumerated firstly, so to speed up,
+                               // if last one is own, then all properties are own.
 
-               return ret;
-       },
+                               var key;
+                               for ( key in obj ) {}
 
-       // arg is for internal usage only
-       map: function( elems, callback, arg ) {
-               var value, key,
-                       ret = [],
-                       i = 0,
-                       length = elems.length,
-                       // jquery objects are treated as arrays
-                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+                               return key === undefined || hasOwn.call( obj, key );
+                       },
 
-               // Go through the array, translating each of the items to their
-               if ( isArray ) {
-                       for ( ; i < length; i++ ) {
-                               value = callback( elems[ i ], i, arg );
+                       isEmptyObject: function( obj ) {
+                               for ( var name in obj ) {
+                                       return false;
+                               }
+                               return true;
+                       },
+
+                       error: function( msg ) {
+                               throw new Error( msg );
+                       },
 
-                               if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                       parseJSON: function( data ) {
+                               if ( typeof data !== "string" || !data ) {
+                                       return null;
                                }
-                       }
 
-               // Go through every key on the object,
-               } else {
-                       for ( key in elems ) {
-                               value = callback( elems[ key ], key, arg );
+                               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+                               data = jQuery.trim( data );
 
-                               if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                               // Attempt to parse using the native JSON parser first
+                               if ( window.JSON && window.JSON.parse ) {
+                                       return window.JSON.parse( data );
                                }
-                       }
-               }
 
-               // Flatten any nested arrays
-               return ret.concat.apply( [], ret );
-       },
+                               // Make sure the incoming data is actual JSON
+                               // Logic borrowed from http://json.org/json2.js
+                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                                       .replace( rvalidtokens, "]" )
+                                       .replace( rvalidbraces, "")) ) {
 
-       // A global GUID counter for objects
-       guid: 1,
+                                       return ( new Function( "return " + data ) )();
 
-       // Bind a function to a context, optionally partially applying any
-       // arguments.
-       proxy: function( fn, context ) {
-               var tmp, args, proxy;
+                               }
+                               jQuery.error( "Invalid JSON: " + data );
+                       },
 
-               if ( typeof context === "string" ) {
-                       tmp = fn[ context ];
-                       context = fn;
-                       fn = tmp;
-               }
+                       // Cross-browser xml parsing
+                       parseXML: function( data ) {
+                               if ( typeof data !== "string" || !data ) {
+                                       return null;
+                               }
+                               var xml, tmp;
+                               try {
+                                       if ( window.DOMParser ) { // Standard
+                                               tmp = new DOMParser();
+                                               xml = tmp.parseFromString( data , "text/xml" );
+                                       } else { // IE
+                                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                                               xml.async = "false";
+                                               xml.loadXML( data );
+                                       }
+                               } catch( e ) {
+                                       xml = undefined;
+                               }
+                               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                                       jQuery.error( "Invalid XML: " + data );
+                               }
+                               return xml;
+                       },
 
-               // Quick check to determine if target is callable, in the spec
-               // this throws a TypeError, but we will just return undefined.
-               if ( !jQuery.isFunction( fn ) ) {
-                       return undefined;
-               }
+                       noop: function() {},
+
+                       // Evaluates a script in a global context
+                       // Workarounds based on findings by Jim Driscoll
+                       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+                       globalEval: function( data ) {
+                               if ( data && rnotwhite.test( data ) ) {
+                                       // We use execScript on Internet Explorer
+                                       // We use an anonymous function so that context is window
+                                       // rather than jQuery in Firefox
+                                       ( window.execScript || function( data ) {
+                                               window[ "eval" ].call( window, data );
+                                       } )( data );
+                               }
+                       },
 
-               // Simulated bind
-               args = core_slice.call( arguments, 2 );
-               proxy = function() {
-                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
-               };
+                       // Convert dashed to camelCase; used by the css and data modules
+                       // Microsoft forgot to hump their vendor prefix (#9572)
+                       camelCase: function( string ) {
+                               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+                       },
 
-               // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+                       nodeName: function( elem, name ) {
+                               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+                       },
 
-               return proxy;
-       },
+                       // args is for internal usage only
+                       each: function( object, callback, args ) {
+                               var name, i = 0,
+                                       length = object.length,
+                                       isObj = length === undefined || jQuery.isFunction( object );
 
-       // Multifunctional method to get and set values of a collection
-       // The value/s can optionally be executed if it's a function
-       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-               var exec,
-                       bulk = key == null,
-                       i = 0,
-                       length = elems.length;
-
-               // Sets many values
-               if ( key && typeof key === "object" ) {
-                       for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-                       }
-                       chainable = 1;
-
-               // Sets one value
-               } else if ( value !== undefined ) {
-                       // Optionally, function values get executed if exec is true
-                       exec = pass === undefined && jQuery.isFunction( value );
-
-                       if ( bulk ) {
-                               // Bulk operations only iterate when executing function values
-                               if ( exec ) {
-                                       exec = fn;
-                                       fn = function( elem, key, value ) {
-                                               return exec.call( jQuery( elem ), value );
-                                       };
+                               if ( args ) {
+                                       if ( isObj ) {
+                                               for ( name in object ) {
+                                                       if ( callback.apply( object[ name ], args ) === false ) {
+                                                               break;
+                                                       }
+                                               }
+                                       } else {
+                                               for ( ; i < length; ) {
+                                                       if ( callback.apply( object[ i++ ], args ) === false ) {
+                                                               break;
+                                                       }
+                                               }
+                                       }
 
-                               // Otherwise they run against the entire set
+                                       // A special, fast, case for the most common use of each
                                } else {
-                                       fn.call( elems, value );
-                                       fn = null;
+                                       if ( isObj ) {
+                                               for ( name in object ) {
+                                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                                                               break;
+                                                       }
+                                               }
+                                       } else {
+                                               for ( ; i < length; ) {
+                                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+                                                               break;
+                                                       }
+                                               }
+                                       }
                                }
-                       }
 
-                       if ( fn ) {
-                               for (; i < length; i++ ) {
-                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-                               }
-                       }
+                               return object;
+                       },
 
-                       chainable = 1;
-               }
+                       // Use native String.trim function wherever possible
+                       trim: trim ?
+                               function( text ) {
+                                       return text == null ?
+                                               "" :
+                                               trim.call( text );
+                               } :
+
+                               // Otherwise use our own trimming functionality
+                               function( text ) {
+                                       return text == null ?
+                                               "" :
+                                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+                               },
 
-               return chainable ?
-                       elems :
+                       // results is for internal usage only
+                       makeArray: function( array, results ) {
+                               var ret = results || [];
 
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
-       },
+                               if ( array != null ) {
+                                       // The window, strings (and functions) also have 'length'
+                                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                                       var type = jQuery.type( array );
 
-       now: function() {
-               return ( new Date() ).getTime();
-       }
-});
+                                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+                                               push.call( ret, array );
+                                       } else {
+                                               jQuery.merge( ret, array );
+                                       }
+                               }
 
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
+                               return ret;
+                       },
 
-               readyList = jQuery.Deferred();
+                       inArray: function( elem, array, i ) {
+                               var len;
 
-               // Catch cases where $(document).ready() is called after the browser event has already occurred.
-               // we once tried to use readyState "interactive" here, but it caused issues like the one
-               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                       setTimeout( jQuery.ready, 1 );
+                               if ( array ) {
+                                       if ( indexOf ) {
+                                               return indexOf.call( array, elem, i );
+                                       }
 
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                                       len = array.length;
+                                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
+                                       for ( ; i < len; i++ ) {
+                                               // Skip accessing in sparse arrays
+                                               if ( i in array && array[ i ] === elem ) {
+                                                       return i;
+                                               }
+                                       }
+                               }
 
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+                               return -1;
+                       },
 
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
+                       merge: function( first, second ) {
+                               var i = first.length,
+                                       j = 0;
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
+                               if ( typeof second.length === "number" ) {
+                                       for ( var l = second.length; j < l; j++ ) {
+                                               first[ i++ ] = second[ j ];
+                                       }
 
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
+                               } else {
+                                       while ( second[j] !== undefined ) {
+                                               first[ i++ ] = second[ j++ ];
+                                       }
+                               }
+
+                               first.length = i;
+
+                               return first;
+                       },
+
+                       grep: function( elems, callback, inv ) {
+                               var ret = [], retVal;
+                               inv = !!inv;
+
+                               // Go through the array, only saving the items
+                               // that pass the validator function
+                               for ( var i = 0, length = elems.length; i < length; i++ ) {
+                                       retVal = !!callback( elems[ i ], i );
+                                       if ( inv !== retVal ) {
+                                               ret.push( elems[ i ] );
+                                       }
+                               }
+
+                               return ret;
+                       },
+
+                       // arg is for internal usage only
+                       map: function( elems, callback, arg ) {
+                               var value, key, ret = [],
+                                       i = 0,
+                                       length = elems.length,
+                               // jquery objects are treated as arrays
+                                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+                               // Go through the array, translating each of the items to their
+                               if ( isArray ) {
+                                       for ( ; i < length; i++ ) {
+                                               value = callback( elems[ i ], i, arg );
+
+                                               if ( value != null ) {
+                                                       ret[ ret.length ] = value;
+                                               }
+                                       }
+
+                                       // Go through every key on the object,
+                               } else {
+                                       for ( key in elems ) {
+                                               value = callback( elems[ key ], key, arg );
+
+                                               if ( value != null ) {
+                                                       ret[ ret.length ] = value;
+                                               }
+                                       }
+                               }
+
+                               // Flatten any nested arrays
+                               return ret.concat.apply( [], ret );
+                       },
+
+                       // A global GUID counter for objects
+                       guid: 1,
+
+                       // Bind a function to a context, optionally partially applying any
+                       // arguments.
+                       proxy: function( fn, context ) {
+                               if ( typeof context === "string" ) {
+                                       var tmp = fn[ context ];
+                                       context = fn;
+                                       fn = tmp;
+                               }
+
+                               // Quick check to determine if target is callable, in the spec
+                               // this throws a TypeError, but we will just return undefined.
+                               if ( !jQuery.isFunction( fn ) ) {
+                                       return undefined;
+                               }
+
+                               // Simulated bind
+                               var args = slice.call( arguments, 2 ),
+                                       proxy = function() {
+                                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
+                                       };
+
+                               // Set the guid of unique handler to the same of original handler, so it can be removed
+                               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+                               return proxy;
+                       },
+
+                       // Mutifunctional method to get and set values to a collection
+                       // The value/s can optionally be executed if it's a function
+                       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+                               var exec,
+                                       bulk = key == null,
+                                       i = 0,
+                                       length = elems.length;
+
+                               // Sets many values
+                               if ( key && typeof key === "object" ) {
+                                       for ( i in key ) {
+                                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+                                       }
+                                       chainable = 1;
+
+                                       // Sets one value
+                               } else if ( value !== undefined ) {
+                                       // Optionally, function values get executed if exec is true
+                                       exec = pass === undefined && jQuery.isFunction( value );
+
+                                       if ( bulk ) {
+                                               // Bulk operations only iterate when executing function values
+                                               if ( exec ) {
+                                                       exec = fn;
+                                                       fn = function( elem, key, value ) {
+                                                               return exec.call( jQuery( elem ), value );
+                                                       };
+
+                                                       // Otherwise they run against the entire set
+                                               } else {
+                                                       fn.call( elems, value );
+                                                       fn = null;
+                                               }
+                                       }
+
+                                       if ( fn ) {
+                                               for (; i < length; i++ ) {
+                                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                                               }
+                                       }
+
+                                       chainable = 1;
+                               }
+
+                               return chainable ?
+                                       elems :
+
+                                       // Gets
+                                       bulk ?
+                                               fn.call( elems ) :
+                                               length ? fn( elems[0], key ) : emptyGet;
+                       },
+
+                       now: function() {
+                               return ( new Date() ).getTime();
+                       },
+
+                       // Use of jQuery.browser is frowned upon.
+                       // More details: http://docs.jquery.com/Utilities/jQuery.browser
+                       uaMatch: function( ua ) {
+                               ua = ua.toLowerCase();
+
+                               var match = rwebkit.exec( ua ) ||
+                                       ropera.exec( ua ) ||
+                                       rmsie.exec( ua ) ||
+                                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+                                       [];
+
+                               return { browser: match[1] || "", version: match[2] || "0" };
+                       },
+
+                       sub: function() {
+                               function jQuerySub( selector, context ) {
+                                       return new jQuerySub.fn.init( selector, context );
+                               }
+                               jQuery.extend( true, jQuerySub, this );
+                               jQuerySub.superclass = this;
+                               jQuerySub.fn = jQuerySub.prototype = this();
+                               jQuerySub.fn.constructor = jQuerySub;
+                               jQuerySub.sub = this.sub;
+                               jQuerySub.fn.init = function init( selector, context ) {
+                                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                                               context = jQuerySub( context );
+                                       }
+
+                                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+                               };
+                               jQuerySub.fn.init.prototype = jQuerySub.fn;
+                               var rootjQuerySub = jQuerySub(document);
+                               return jQuerySub;
+                       },
+
+                       browser: {}
+               });
+
+// Populate the class2type map
+               jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+                       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+               });
+
+               browserMatch = jQuery.uaMatch( userAgent );
+               if ( browserMatch.browser ) {
+                       jQuery.browser[ browserMatch.browser ] = true;
+                       jQuery.browser.version = browserMatch.version;
+               }
+
+// Deprecated, use jQuery.browser.webkit instead
+               if ( jQuery.browser.webkit ) {
+                       jQuery.browser.safari = true;
+               }
+
+// IE doesn't match non-breaking spaces with \s
+               if ( rnotwhite.test( "\xA0" ) ) {
+                       trimLeft = /^[\s\xA0]+/;
+                       trimRight = /[\s\xA0]+$/;
+               }
+
+// All jQuery objects should point back to these
+               rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+               if ( document.addEventListener ) {
+                       DOMContentLoaded = function() {
+                               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                               jQuery.ready();
+                       };
+
+               } else if ( document.attachEvent ) {
+                       DOMContentLoaded = function() {
+                               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                               if ( document.readyState === "complete" ) {
+                                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                                       jQuery.ready();
+                               }
+                       };
+               }
+
+// The DOM ready check for Internet Explorer
+               function doScrollCheck() {
+                       if ( jQuery.isReady ) {
+                               return;
+                       }
+
+                       try {
+                               // If IE is used, use the trick by Diego Perini
+                               // http://javascript.nwbox.com/IEContentLoaded/
+                               document.documentElement.doScroll("left");
+                       } catch(e) {
+                               setTimeout( doScrollCheck, 1 );
+                               return;
+                       }
+
+                       // and execute any waiting functions
+                       jQuery.ready();
+               }
+
+               return jQuery;
+
+       })();
+
+
+// String to Object flags format cache
+       var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+       function createFlags( flags ) {
+               var object = flagsCache[ flags ] = {},
+                       i, length;
+               flags = flags.split( /\s+/ );
+               for ( i = 0, length = flags.length; i < length; i++ ) {
+                       object[ flags[i] ] = true;
+               }
+               return object;
+       }
+
+       /*
+        * Create a callback list using the following parameters:
+        *
+        *      flags:  an optional list of space-separated flags that will change how
+        *                      the callback list behaves
+        *
+        * By default a callback list will act like an event callback list and can be
+        * "fired" multiple times.
+        *
+        * Possible flags:
+        *
+        *      once:                   will ensure the callback list can only be fired once (like a Deferred)
+        *
+        *      memory:                 will keep track of previous values and will call any callback added
+        *                                      after the list has been fired right away with the latest "memorized"
+        *                                      values (like a Deferred)
+        *
+        *      unique:                 will ensure a callback can only be added once (no duplicate in the list)
+        *
+        *      stopOnFalse:    interrupt callings when a callback returns false
+        *
+        */
+       jQuery.Callbacks = function( flags ) {
+
+               // Convert flags from String-formatted to Object-formatted
+               // (we check in cache first)
+               flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+               var // Actual callback list
+                       list = [],
+               // Stack of fire calls for repeatable lists
+                       stack = [],
+               // Last fire value (for non-forgettable lists)
+                       memory,
+               // Flag to know if list was already fired
+                       fired,
+               // Flag to know if list is currently firing
+                       firing,
+               // First callback to fire (used internally by add and fireWith)
+                       firingStart,
+               // End of the loop when firing
+                       firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+                       firingIndex,
+               // Add one or several callbacks to the list
+                       add = function( args ) {
+                               var i,
+                                       length,
+                                       elem,
+                                       type,
+                                       actual;
+                               for ( i = 0, length = args.length; i < length; i++ ) {
+                                       elem = args[ i ];
+                                       type = jQuery.type( elem );
+                                       if ( type === "array" ) {
+                                               // Inspect recursively
+                                               add( elem );
+                                       } else if ( type === "function" ) {
+                                               // Add if not in unique mode and callback is not in
+                                               if ( !flags.unique || !self.has( elem ) ) {
+                                                       list.push( elem );
+                                               }
+                                       }
+                               }
+                       },
+               // Fire callbacks
+                       fire = function( context, args ) {
+                               args = args || [];
+                               memory = !flags.memory || [ context, args ];
+                               fired = true;
+                               firing = true;
+                               firingIndex = firingStart || 0;
+                               firingStart = 0;
+                               firingLength = list.length;
+                               for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                                       if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+                                               memory = true; // Mark as halted
+                                               break;
+                                       }
+                               }
+                               firing = false;
+                               if ( list ) {
+                                       if ( !flags.once ) {
+                                               if ( stack && stack.length ) {
+                                                       memory = stack.shift();
+                                                       self.fireWith( memory[ 0 ], memory[ 1 ] );
+                                               }
+                                       } else if ( memory === true ) {
+                                               self.disable();
+                                       } else {
+                                               list = [];
+                                       }
+                               }
+                       },
+               // Actual Callbacks object
+                       self = {
+                               // Add a callback or a collection of callbacks to the list
+                               add: function() {
+                                       if ( list ) {
+                                               var length = list.length;
+                                               add( arguments );
+                                               // Do we need to add the callbacks to the
+                                               // current firing batch?
+                                               if ( firing ) {
+                                                       firingLength = list.length;
+                                                       // With memory, if we're not firing then
+                                                       // we should call right away, unless previous
+                                                       // firing was halted (stopOnFalse)
+                                               } else if ( memory && memory !== true ) {
+                                                       firingStart = length;
+                                                       fire( memory[ 0 ], memory[ 1 ] );
+                                               }
+                                       }
+                                       return this;
+                               },
+                               // Remove a callback from the list
+                               remove: function() {
+                                       if ( list ) {
+                                               var args = arguments,
+                                                       argIndex = 0,
+                                                       argLength = args.length;
+                                               for ( ; argIndex < argLength ; argIndex++ ) {
+                                                       for ( var i = 0; i < list.length; i++ ) {
+                                                               if ( args[ argIndex ] === list[ i ] ) {
+                                                                       // Handle firingIndex and firingLength
+                                                                       if ( firing ) {
+                                                                               if ( i <= firingLength ) {
+                                                                                       firingLength--;
+                                                                                       if ( i <= firingIndex ) {
+                                                                                               firingIndex--;
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                                       // Remove the element
+                                                                       list.splice( i--, 1 );
+                                                                       // If we have some unicity property then
+                                                                       // we only need to do this once
+                                                                       if ( flags.unique ) {
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       return this;
+                               },
+                               // Control if a given callback is in the list
+                               has: function( fn ) {
+                                       if ( list ) {
+                                               var i = 0,
+                                                       length = list.length;
+                                               for ( ; i < length; i++ ) {
+                                                       if ( fn === list[ i ] ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                                       return false;
+                               },
+                               // Remove all callbacks from the list
+                               empty: function() {
+                                       list = [];
+                                       return this;
+                               },
+                               // Have the list do nothing anymore
+                               disable: function() {
+                                       list = stack = memory = undefined;
+                                       return this;
+                               },
+                               // Is it disabled?
+                               disabled: function() {
+                                       return !list;
+                               },
+                               // Lock the list in its current state
+                               lock: function() {
+                                       stack = undefined;
+                                       if ( !memory || memory === true ) {
+                                               self.disable();
+                                       }
+                                       return this;
+                               },
+                               // Is it locked?
+                               locked: function() {
+                                       return !stack;
+                               },
+                               // Call all callbacks with the given context and arguments
+                               fireWith: function( context, args ) {
+                                       if ( stack ) {
+                                               if ( firing ) {
+                                                       if ( !flags.once ) {
+                                                               stack.push( [ context, args ] );
+                                                       }
+                                               } else if ( !( flags.once && memory ) ) {
+                                                       fire( context, args );
+                                               }
+                                       }
+                                       return this;
+                               },
+                               // Call all the callbacks with the given arguments
+                               fire: function() {
+                                       self.fireWith( this, arguments );
+                                       return this;
+                               },
+                               // To know if the callbacks have already been called at least once
+                               fired: function() {
+                                       return !!fired;
+                               }
+                       };
+
+               return self;
+       };
+
+
+
+
+       var // Static reference to slice
+               sliceDeferred = [].slice;
+
+       jQuery.extend({
+
+               Deferred: function( func ) {
+                       var doneList = jQuery.Callbacks( "once memory" ),
+                               failList = jQuery.Callbacks( "once memory" ),
+                               progressList = jQuery.Callbacks( "memory" ),
+                               state = "pending",
+                               lists = {
+                                       resolve: doneList,
+                                       reject: failList,
+                                       notify: progressList
+                               },
+                               promise = {
+                                       done: doneList.add,
+                                       fail: failList.add,
+                                       progress: progressList.add,
+
+                                       state: function() {
+                                               return state;
+                                       },
+
+                                       // Deprecated
+                                       isResolved: doneList.fired,
+                                       isRejected: failList.fired,
+
+                                       then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+                                               deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+                                               return this;
+                                       },
+                                       always: function() {
+                                               deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                                               return this;
+                                       },
+                                       pipe: function( fnDone, fnFail, fnProgress ) {
+                                               return jQuery.Deferred(function( newDefer ) {
+                                                       jQuery.each( {
+                                                               done: [ fnDone, "resolve" ],
+                                                               fail: [ fnFail, "reject" ],
+                                                               progress: [ fnProgress, "notify" ]
+                                                       }, function( handler, data ) {
+                                                               var fn = data[ 0 ],
+                                                                       action = data[ 1 ],
+                                                                       returned;
+                                                               if ( jQuery.isFunction( fn ) ) {
+                                                                       deferred[ handler ](function() {
+                                                                               returned = fn.apply( this, arguments );
+                                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                                       returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+                                                                               } else {
+                                                                                       newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                               }
+                                                                       });
+                                                               } else {
+                                                                       deferred[ handler ]( newDefer[ action ] );
+                                                               }
+                                                       });
+                                               }).promise();
+                                       },
+                                       // Get a promise for this deferred
+                                       // If obj is provided, the promise aspect is added to the object
+                                       promise: function( obj ) {
+                                               if ( obj == null ) {
+                                                       obj = promise;
+                                               } else {
+                                                       for ( var key in promise ) {
+                                                               obj[ key ] = promise[ key ];
+                                                       }
+                                               }
+                                               return obj;
+                                       }
+                               },
+                               deferred = promise.promise({}),
+                               key;
+
+                       for ( key in lists ) {
+                               deferred[ key ] = lists[ key ].fire;
+                               deferred[ key + "With" ] = lists[ key ].fireWith;
+                       }
+
+                       // Handle state
+                       deferred.done( function() {
+                               state = "resolved";
+                       }, failList.disable, progressList.lock ).fail( function() {
+                                       state = "rejected";
+                               }, doneList.disable, progressList.lock );
+
+                       // Call given func if any
+                       if ( func ) {
+                               func.call( deferred, deferred );
+                       }
+
+                       // All done!
+                       return deferred;
+               },
+
+               // Deferred helper
+               when: function( firstParam ) {
+                       var args = sliceDeferred.call( arguments, 0 ),
+                               i = 0,
+                               length = args.length,
+                               pValues = new Array( length ),
+                               count = length,
+                               pCount = length,
+                               deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+                                       firstParam :
+                                       jQuery.Deferred(),
+                               promise = deferred.promise();
+                       function resolveFunc( i ) {
+                               return function( value ) {
+                                       args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                                       if ( !( --count ) ) {
+                                               deferred.resolveWith( deferred, args );
+                                       }
+                               };
+                       }
+                       function progressFunc( i ) {
+                               return function( value ) {
+                                       pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                                       deferred.notifyWith( promise, pValues );
+                               };
+                       }
+                       if ( length > 1 ) {
+                               for ( ; i < length; i++ ) {
+                                       if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+                                               args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+                                       } else {
+                                               --count;
+                                       }
+                               }
+                               if ( !count ) {
+                                       deferred.resolveWith( deferred, args );
+                               }
+                       } else if ( deferred !== firstParam ) {
+                               deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+                       }
+                       return promise;
+               }
+       });
+
+
+
+
+       jQuery.support = (function() {
+
+               var support,
+                       all,
+                       a,
+                       select,
+                       opt,
+                       input,
+                       fragment,
+                       tds,
+                       events,
+                       eventName,
+                       i,
+                       isSupported,
+                       div = document.createElement( "div" ),
+                       documentElement = document.documentElement;
+
+               // Preliminary tests
+               div.setAttribute("className", "t");
+               div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+               all = div.getElementsByTagName( "*" );
+               a = div.getElementsByTagName( "a" )[ 0 ];
+
+               // Can't get basic test support
+               if ( !all || !all.length || !a ) {
+                       return {};
+               }
+
+               // First batch of supports tests
+               select = document.createElement( "select" );
+               opt = select.appendChild( document.createElement("option") );
+               input = div.getElementsByTagName( "input" )[ 0 ];
+
+               support = {
+                       // IE strips leading whitespace when .innerHTML is used
+                       leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+                       // Make sure that tbody elements aren't automatically inserted
+                       // IE will insert them into empty tables
+                       tbody: !div.getElementsByTagName("tbody").length,
+
+                       // Make sure that link elements get serialized correctly by innerHTML
+                       // This requires a wrapper element in IE
+                       htmlSerialize: !!div.getElementsByTagName("link").length,
+
+                       // Get the style information from getAttribute
+                       // (IE uses .cssText instead)
+                       style: /top/.test( a.getAttribute("style") ),
+
+                       // Make sure that URLs aren't manipulated
+                       // (IE normalizes it by default)
+                       hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+                       // Make sure that element opacity exists
+                       // (IE uses filter instead)
+                       // Use a regex to work around a WebKit issue. See #5145
+                       opacity: /^0.55/.test( a.style.opacity ),
+
+                       // Verify style float existence
+                       // (IE uses styleFloat instead of cssFloat)
+                       cssFloat: !!a.style.cssFloat,
+
+                       // Make sure that if no value is specified for a checkbox
+                       // that it defaults to "on".
+                       // (WebKit defaults to "" instead)
+                       checkOn: ( input.value === "on" ),
+
+                       // Make sure that a selected-by-default option has a working selected property.
+                       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+                       optSelected: opt.selected,
+
+                       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+                       getSetAttribute: div.className !== "t",
+
+                       // Tests for enctype support on a form(#6743)
+                       enctype: !!document.createElement("form").enctype,
+
+                       // Makes sure cloning an html5 element does not cause problems
+                       // Where outerHTML is undefined, this still works
+                       html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+                       // Will be defined later
+                       submitBubbles: true,
+                       changeBubbles: true,
+                       focusinBubbles: false,
+                       deleteExpando: true,
+                       noCloneEvent: true,
+                       inlineBlockNeedsLayout: false,
+                       shrinkWrapBlocks: false,
+                       reliableMarginRight: true,
+                       pixelMargin: true
+               };
+
+               // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+               jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+               // Make sure checked status is properly cloned
+               input.checked = true;
+               support.noCloneChecked = input.cloneNode( true ).checked;
+
+               // Make sure that the options inside disabled selects aren't marked as disabled
+               // (WebKit marks them as disabled)
+               select.disabled = true;
+               support.optDisabled = !opt.disabled;
+
+               // Test to see if it's possible to delete an expando from an element
+               // Fails in Internet Explorer
+               try {
+                       delete div.test;
+               } catch( e ) {
+                       support.deleteExpando = false;
+               }
+
+               if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+                       div.attachEvent( "onclick", function() {
+                               // Cloning a node shouldn't copy over any
+                               // bound event handlers (IE does this)
+                               support.noCloneEvent = false;
+                       });
+                       div.cloneNode( true ).fireEvent( "onclick" );
+               }
+
+               // Check if a radio maintains its value
+               // after being appended to the DOM
+               input = document.createElement("input");
+               input.value = "t";
+               input.setAttribute("type", "radio");
+               support.radioValue = input.value === "t";
+
+               input.setAttribute("checked", "checked");
+
+               // #11217 - WebKit loses check when the name is after the checked attribute
+               input.setAttribute( "name", "t" );
+
+               div.appendChild( input );
+               fragment = document.createDocumentFragment();
+               fragment.appendChild( div.lastChild );
+
+               // WebKit doesn't clone checked state correctly in fragments
+               support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+               // Check if a disconnected checkbox will retain its checked
+               // value of true after appended to the DOM (IE6/7)
+               support.appendChecked = input.checked;
+
+               fragment.removeChild( input );
+               fragment.appendChild( div );
+
+               // Technique from Juriy Zaytsev
+               // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+               // We only care about the case where non-standard event systems
+               // are used, namely in IE. Short-circuiting here helps us to
+               // avoid an eval call (in setAttribute) which can cause CSP
+               // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+               if ( div.attachEvent ) {
+                       for ( i in {
+                               submit: 1,
+                               change: 1,
+                               focusin: 1
+                       }) {
+                               eventName = "on" + i;
+                               isSupported = ( eventName in div );
+                               if ( !isSupported ) {
+                                       div.setAttribute( eventName, "return;" );
+                                       isSupported = ( typeof div[ eventName ] === "function" );
+                               }
+                               support[ i + "Bubbles" ] = isSupported;
+                       }
+               }
+
+               fragment.removeChild( div );
+
+               // Null elements to avoid leaks in IE
+               fragment = select = opt = div = input = null;
+
+               // Run tests that need a body at doc ready
+               jQuery(function() {
+                       var container, outer, inner, table, td, offsetSupport,
+                               marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+                               paddingMarginBorderVisibility, paddingMarginBorder,
+                               body = document.getElementsByTagName("body")[0];
+
+                       if ( !body ) {
+                               // Return for frameset docs that don't have a body
+                               return;
+                       }
+
+                       conMarginTop = 1;
+                       paddingMarginBorder = "padding:0;margin:0;border:";
+                       positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+                       paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+                       style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+                       html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+                               "<table " + style + "' cellpadding='0' cellspacing='0'>" +
+                               "<tr><td></td></tr></table>";
+
+                       container = document.createElement("div");
+                       container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+                       body.insertBefore( container, body.firstChild );
+
+                       // Construct the test element
+                       div = document.createElement("div");
+                       container.appendChild( div );
+
+                       // Check if table cells still have offsetWidth/Height when they are set
+                       // to display:none and there are still other visible table cells in a
+                       // table row; if so, offsetWidth/Height are not reliable for use when
+                       // determining if an element has been hidden directly using
+                       // display:none (it is still safe to use offsets if a parent element is
+                       // hidden; don safety goggles and see bug #4512 for more information).
+                       // (only IE 8 fails this test)
+                       div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+                       tds = div.getElementsByTagName( "td" );
+                       isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+                       tds[ 0 ].style.display = "";
+                       tds[ 1 ].style.display = "none";
+
+                       // Check if empty table cells still have offsetWidth/Height
+                       // (IE <= 8 fail this test)
+                       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. For more
+                       // info see bug #3333
+                       // Fails in WebKit before Feb 2011 nightlies
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       if ( window.getComputedStyle ) {
+                               div.innerHTML = "";
+                               marginDiv = document.createElement( "div" );
+                               marginDiv.style.width = "0";
+                               marginDiv.style.marginRight = "0";
+                               div.style.width = "2px";
+                               div.appendChild( marginDiv );
+                               support.reliableMarginRight =
+                                       ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+                       }
+
+                       if ( typeof div.style.zoom !== "undefined" ) {
+                               // Check if natively block-level elements act like inline-block
+                               // elements when setting their display to 'inline' and giving
+                               // them layout
+                               // (IE < 8 does this)
+                               div.innerHTML = "";
+                               div.style.width = div.style.padding = "1px";
+                               div.style.border = 0;
+                               div.style.overflow = "hidden";
+                               div.style.display = "inline";
+                               div.style.zoom = 1;
+                               support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                               // Check if elements with layout shrink-wrap their children
+                               // (IE 6 does this)
+                               div.style.display = "block";
+                               div.style.overflow = "visible";
+                               div.innerHTML = "<div style='width:5px;'></div>";
+                               support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+                       }
+
+                       div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+                       div.innerHTML = html;
+
+                       outer = div.firstChild;
+                       inner = outer.firstChild;
+                       td = outer.nextSibling.firstChild.firstChild;
+
+                       offsetSupport = {
+                               doesNotAddBorder: ( inner.offsetTop !== 5 ),
+                               doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+                       };
+
+                       inner.style.position = "fixed";
+                       inner.style.top = "20px";
+
+                       // safari subtracts parent border width here which is 5px
+                       offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+                       inner.style.position = inner.style.top = "";
+
+                       outer.style.overflow = "hidden";
+                       outer.style.position = "relative";
+
+                       offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+                       offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+                       if ( window.getComputedStyle ) {
+                               div.style.marginTop = "1%";
+                               support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+                       }
+
+                       if ( typeof container.style.zoom !== "undefined" ) {
+                               container.style.zoom = 1;
+                       }
+
+                       body.removeChild( container );
+                       marginDiv = div = container = null;
+
+                       jQuery.extend( support, offsetSupport );
+               });
+
+               return support;
+       })();
+
+
+
+
+       var rbrace = /^(?:\{.*\}|\[.*\])$/,
+               rmultiDash = /([A-Z])/g;
+
+       jQuery.extend({
+               cache: {},
+
+               // Please use with caution
+               uuid: 0,
+
+               // Unique for each copy of jQuery on the page
+               // Non-digits removed to match rinlinejQuery
+               expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+               // The following elements throw uncatchable exceptions if you
+               // attempt to add expando properties to them.
+               noData: {
+                       "embed": true,
+                       // Ban all objects except for Flash (which handle expandos)
+                       "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+                       "applet": true
+               },
+
+               hasData: function( elem ) {
+                       elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+                       return !!elem && !isEmptyDataObject( elem );
+               },
+
+               data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+                       if ( !jQuery.acceptData( elem ) ) {
+                               return;
+                       }
+
+                       var privateCache, thisCache, ret,
+                               internalKey = jQuery.expando,
+                               getByName = typeof name === "string",
+
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                               isNode = elem.nodeType,
+
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                               cache = isNode ? jQuery.cache : elem,
+
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+                               isEvents = name === "events";
+
+                       // Avoid doing any more work than we need to when trying to get data on an
+                       // object that has no data at all
+                       if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+                               return;
+                       }
+
+                       if ( !id ) {
+                               // Only DOM nodes need a new unique ID for each element since their data
+                               // ends up in the global cache
+                               if ( isNode ) {
+                                       elem[ internalKey ] = id = ++jQuery.uuid;
+                               } else {
+                                       id = internalKey;
+                               }
+                       }
+
+                       if ( !cache[ id ] ) {
+                               cache[ id ] = {};
+
+                               // Avoids exposing jQuery metadata on plain JS objects when the object
+                               // is serialized using JSON.stringify
+                               if ( !isNode ) {
+                                       cache[ id ].toJSON = jQuery.noop;
+                               }
+                       }
+
+                       // An object can be passed to jQuery.data instead of a key/value pair; this gets
+                       // shallow copied over onto the existing cache
+                       if ( typeof name === "object" || typeof name === "function" ) {
+                               if ( pvt ) {
+                                       cache[ id ] = jQuery.extend( cache[ id ], name );
+                               } else {
+                                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                               }
+                       }
+
+                       privateCache = thisCache = cache[ id ];
+
+                       // jQuery data() is stored in a separate object inside the object's internal data
+                       // cache in order to avoid key collisions between internal data and user-defined
+                       // data.
+                       if ( !pvt ) {
+                               if ( !thisCache.data ) {
+                                       thisCache.data = {};
+                               }
+
+                               thisCache = thisCache.data;
+                       }
+
+                       if ( data !== undefined ) {
+                               thisCache[ jQuery.camelCase( name ) ] = data;
+                       }
+
+                       // Users should not attempt to inspect the internal events object using jQuery.data,
+                       // it is undocumented and subject to change. But does anyone listen? No.
+                       if ( isEvents && !thisCache[ name ] ) {
+                               return privateCache.events;
+                       }
+
+                       // Check for both converted-to-camel and non-converted data property names
+                       // If a data property was specified
+                       if ( getByName ) {
+
+                               // First Try to find as-is property data
+                               ret = thisCache[ name ];
+
+                               // Test for null|undefined property data
+                               if ( ret == null ) {
+
+                                       // Try to find the camelCased property
+                                       ret = thisCache[ jQuery.camelCase( name ) ];
+                               }
+                       } else {
+                               ret = thisCache;
+                       }
+
+                       return ret;
+               },
+
+               removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+                       if ( !jQuery.acceptData( elem ) ) {
+                               return;
+                       }
+
+                       var thisCache, i, l,
+
+                       // Reference to internal data cache key
+                               internalKey = jQuery.expando,
+
+                               isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                               cache = isNode ? jQuery.cache : elem,
+
+                       // See jQuery.data for more information
+                               id = isNode ? elem[ internalKey ] : internalKey;
+
+                       // If there is already no cache entry for this object, there is no
+                       // purpose in continuing
+                       if ( !cache[ id ] ) {
+                               return;
+                       }
+
+                       if ( name ) {
+
+                               thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+                               if ( thisCache ) {
+
+                                       // Support array or space separated string names for data keys
+                                       if ( !jQuery.isArray( name ) ) {
+
+                                               // try the string as a key before any manipulation
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+
+                                                       // split the camel cased version by spaces unless a key with the spaces exists
+                                                       name = jQuery.camelCase( name );
+                                                       if ( name in thisCache ) {
+                                                               name = [ name ];
+                                                       } else {
+                                                               name = name.split( " " );
+                                                       }
+                                               }
+                                       }
+
+                                       for ( i = 0, l = name.length; i < l; i++ ) {
+                                               delete thisCache[ name[i] ];
+                                       }
+
+                                       // If there is no data left in the cache, we want to continue
+                                       // and let the cache object itself get destroyed
+                                       if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                               return;
+                                       }
+                               }
+                       }
+
+                       // See jQuery.data for more information
+                       if ( !pvt ) {
+                               delete cache[ id ].data;
+
+                               // Don't destroy the parent cache unless the internal data object
+                               // had been the only thing left in it
+                               if ( !isEmptyDataObject(cache[ id ]) ) {
+                                       return;
+                               }
+                       }
+
+                       // Browsers that fail expando deletion also refuse to delete expandos on
+                       // the window, but it will allow it on all other JS objects; other browsers
+                       // don't care
+                       // Ensure that `cache` is not a window object #10080
+                       if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+                               delete cache[ id ];
+                       } else {
+                               cache[ id ] = null;
+                       }
+
+                       // We destroyed the cache and need to eliminate the expando on the node to avoid
+                       // false lookups in the cache for entries that no longer exist
+                       if ( isNode ) {
+                               // IE does not allow us to delete expando properties from nodes,
+                               // nor does it have a removeAttribute function on Document nodes;
+                               // we must handle all of these cases
+                               if ( jQuery.support.deleteExpando ) {
+                                       delete elem[ internalKey ];
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( internalKey );
+                               } else {
+                                       elem[ internalKey ] = null;
+                               }
+                       }
+               },
+
+               // For internal use only.
+               _data: function( elem, name, data ) {
+                       return jQuery.data( elem, name, data, true );
+               },
+
+               // A method for determining if a DOM node can handle the data expando
+               acceptData: function( elem ) {
+                       if ( elem.nodeName ) {
+                               var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                               if ( match ) {
+                                       return !(match === true || elem.getAttribute("classid") !== match);
+                               }
+                       }
+
+                       return true;
+               }
+       });
+
+       jQuery.fn.extend({
+               data: function( key, value ) {
+                       var parts, part, attr, name, l,
+                               elem = this[0],
+                               i = 0,
+                               data = null;
+
+                       // Gets all values
+                       if ( key === undefined ) {
+                               if ( this.length ) {
+                                       data = jQuery.data( elem );
+
+                                       if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                               attr = elem.attributes;
+                                               for ( l = attr.length; i < l; i++ ) {
+                                                       name = attr[i].name;
+
+                                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                                               name = jQuery.camelCase( name.substring(5) );
+
+                                                               dataAttr( elem, name, data[ name ] );
+                                                       }
+                                               }
+                                               jQuery._data( elem, "parsedAttrs", true );
+                                       }
+                               }
+
+                               return data;
+                       }
+
+                       // Sets multiple values
+                       if ( typeof key === "object" ) {
+                               return this.each(function() {
+                                       jQuery.data( this, key );
+                               });
+                       }
+
+                       parts = key.split( ".", 2 );
+                       parts[1] = parts[1] ? "." + parts[1] : "";
+                       part = parts[1] + "!";
+
+                       return jQuery.access( this, function( value ) {
+
+                               if ( value === undefined ) {
+                                       data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+                                       // Try to fetch any internally stored data first
+                                       if ( data === undefined && elem ) {
+                                               data = jQuery.data( elem, key );
+                                               data = dataAttr( elem, key, data );
+                                       }
+
+                                       return data === undefined && parts[1] ?
+                                               this.data( parts[0] ) :
+                                               data;
+                               }
+
+                               parts[1] = value;
+                               this.each(function() {
+                                       var self = jQuery( this );
+
+                                       self.triggerHandler( "setData" + part, parts );
+                                       jQuery.data( this, key, value );
+                                       self.triggerHandler( "changeData" + part, parts );
+                               });
+                       }, null, value, arguments.length > 1, null, false );
+               },
+
+               removeData: function( key ) {
+                       return this.each(function() {
+                               jQuery.removeData( this, key );
+                       });
+               }
+       });
+
+       function dataAttr( elem, key, data ) {
+               // If nothing was found internally, try to fetch any
+               // data from the HTML5 data-* attribute
+               if ( data === undefined && elem.nodeType === 1 ) {
+
+                       var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+                       data = elem.getAttribute( name );
+
+                       if ( typeof data === "string" ) {
+                               try {
+                                       data = data === "true" ? true :
+                                               data === "false" ? false :
+                                                       data === "null" ? null :
+                                                               jQuery.isNumeric( data ) ? +data :
+                                                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                                                               data;
+                               } catch( e ) {}
+
+                               // Make sure we set the data so it isn't changed later
+                               jQuery.data( elem, key, data );
+
+                       } else {
+                               data = undefined;
+                       }
+               }
+
+               return data;
+       }
+
+// checks a cache object for emptiness
+       function isEmptyDataObject( obj ) {
+               for ( var name in obj ) {
+
+                       // if the public data object is empty, the private is still empty
+                       if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                               continue;
+                       }
+                       if ( name !== "toJSON" ) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+
+
+
+       function handleQueueMarkDefer( elem, type, src ) {
+               var deferDataKey = type + "defer",
+                       queueDataKey = type + "queue",
+                       markDataKey = type + "mark",
+                       defer = jQuery._data( elem, deferDataKey );
+               if ( defer &&
+                       ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+                       ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+                       // Give room for hard-coded callbacks to fire first
+                       // and eventually mark/queue something else on the element
+                       setTimeout( function() {
+                               if ( !jQuery._data( elem, queueDataKey ) &&
+                                       !jQuery._data( elem, markDataKey ) ) {
+                                       jQuery.removeData( elem, deferDataKey, true );
+                                       defer.fire();
+                               }
+                       }, 0 );
+               }
+       }
+
+       jQuery.extend({
+
+               _mark: function( elem, type ) {
+                       if ( elem ) {
+                               type = ( type || "fx" ) + "mark";
+                               jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+                       }
+               },
+
+               _unmark: function( force, elem, type ) {
+                       if ( force !== true ) {
+                               type = elem;
+                               elem = force;
+                               force = false;
+                       }
+                       if ( elem ) {
+                               type = type || "fx";
+                               var key = type + "mark",
+                                       count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+                               if ( count ) {
+                                       jQuery._data( elem, key, count );
+                               } else {
+                                       jQuery.removeData( elem, key, true );
+                                       handleQueueMarkDefer( elem, type, "mark" );
+                               }
+                       }
+               },
+
+               queue: function( elem, type, data ) {
+                       var q;
+                       if ( elem ) {
+                               type = ( type || "fx" ) + "queue";
+                               q = jQuery._data( elem, type );
+
+                               // Speed up dequeue by getting out quickly if this is just a lookup
+                               if ( data ) {
+                                       if ( !q || jQuery.isArray(data) ) {
+                                               q = jQuery._data( elem, type, jQuery.makeArray(data) );
+                                       } else {
+                                               q.push( data );
+                                       }
+                               }
+                               return q || [];
+                       }
+               },
+
+               dequeue: function( elem, type ) {
+                       type = type || "fx";
+
+                       var queue = jQuery.queue( elem, type ),
+                               fn = queue.shift(),
+                               hooks = {};
+
+                       // If the fx queue is dequeued, always remove the progress sentinel
+                       if ( fn === "inprogress" ) {
+                               fn = queue.shift();
+                       }
+
+                       if ( fn ) {
+                               // Add a progress sentinel to prevent the fx queue from being
+                               // automatically dequeued
+                               if ( type === "fx" ) {
+                                       queue.unshift( "inprogress" );
+                               }
+
+                               jQuery._data( elem, type + ".run", hooks );
+                               fn.call( elem, function() {
+                                       jQuery.dequeue( elem, type );
+                               }, hooks );
+                       }
+
+                       if ( !queue.length ) {
+                               jQuery.removeData( elem, type + "queue " + type + ".run", true );
+                               handleQueueMarkDefer( elem, type, "queue" );
+                       }
+               }
+       });
+
+       jQuery.fn.extend({
+               queue: function( type, data ) {
+                       var setter = 2;
+
+                       if ( typeof type !== "string" ) {
+                               data = type;
+                               type = "fx";
+                               setter--;
+                       }
+
+                       if ( arguments.length < setter ) {
+                               return jQuery.queue( this[0], type );
+                       }
+
+                       return data === undefined ?
+                               this :
+                               this.each(function() {
+                                       var queue = jQuery.queue( this, type, data );
+
+                                       if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                               jQuery.dequeue( this, type );
+                                       }
+                               });
+               },
+               dequeue: function( type ) {
+                       return this.each(function() {
+                               jQuery.dequeue( this, type );
+                       });
+               },
+               // Based off of the plugin by Clint Helfers, with permission.
+               // http://blindsignals.com/index.php/2009/07/jquery-delay/
+               delay: function( time, type ) {
+                       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+                       type = type || "fx";
+
+                       return this.queue( type, function( next, hooks ) {
+                               var timeout = setTimeout( next, time );
+                               hooks.stop = function() {
+                                       clearTimeout( timeout );
+                               };
+                       });
+               },
+               clearQueue: function( type ) {
+                       return this.queue( type || "fx", [] );
+               },
+               // Get a promise resolved when queues of a certain type
+               // are emptied (fx is the type by default)
+               promise: function( type, object ) {
+                       if ( typeof type !== "string" ) {
+                               object = type;
+                               type = undefined;
+                       }
+                       type = type || "fx";
+                       var defer = jQuery.Deferred(),
+                               elements = this,
+                               i = elements.length,
+                               count = 1,
+                               deferDataKey = type + "defer",
+                               queueDataKey = type + "queue",
+                               markDataKey = type + "mark",
+                               tmp;
+                       function resolve() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       }
+                       while( i-- ) {
+                               if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+                                               jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+                                       count++;
+                                       tmp.add( resolve );
+                               }
+                       }
+                       resolve();
+                       return defer.promise( object );
+               }
+       });
+
+
+
+
+       var rclass = /[\n\t\r]/g,
+               rspace = /\s+/,
+               rreturn = /\r/g,
+               rtype = /^(?:button|input)$/i,
+               rfocusable = /^(?:button|input|object|select|textarea)$/i,
+               rclickable = /^a(?:rea)?$/i,
+               rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+               getSetAttribute = jQuery.support.getSetAttribute,
+               nodeHook, boolHook, fixSpecified;
+
+       jQuery.fn.extend({
+               attr: function( name, value ) {
+                       return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+               },
+
+               removeAttr: function( name ) {
+                       return this.each(function() {
+                               jQuery.removeAttr( this, name );
+                       });
+               },
+
+               prop: function( name, value ) {
+                       return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+               },
+
+               removeProp: function( name ) {
+                       name = jQuery.propFix[ name ] || name;
+                       return this.each(function() {
+                               // try/catch handles cases where IE balks (such as removing a property on window)
+                               try {
+                                       this[ name ] = undefined;
+                                       delete this[ name ];
+                               } catch( e ) {}
+                       });
+               },
+
+               addClass: function( value ) {
+                       var classNames, i, l, elem,
+                               setClass, c, cl;
+
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function( j ) {
+                                       jQuery( this ).addClass( value.call(this, j, this.className) );
+                               });
+                       }
+
+                       if ( value && typeof value === "string" ) {
+                               classNames = value.split( rspace );
+
+                               for ( i = 0, l = this.length; i < l; i++ ) {
+                                       elem = this[ i ];
+
+                                       if ( elem.nodeType === 1 ) {
+                                               if ( !elem.className && classNames.length === 1 ) {
+                                                       elem.className = value;
+
+                                               } else {
+                                                       setClass = " " + elem.className + " ";
+
+                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                               if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                                       setClass += classNames[ c ] + " ";
+                                                               }
+                                                       }
+                                                       elem.className = jQuery.trim( setClass );
+                                               }
+                                       }
+                               }
+                       }
+
+                       return this;
+               },
+
+               removeClass: function( value ) {
+                       var classNames, i, l, elem, className, c, cl;
+
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function( j ) {
+                                       jQuery( this ).removeClass( value.call(this, j, this.className) );
+                               });
+                       }
+
+                       if ( (value && typeof value === "string") || value === undefined ) {
+                               classNames = ( value || "" ).split( rspace );
+
+                               for ( i = 0, l = this.length; i < l; i++ ) {
+                                       elem = this[ i ];
+
+                                       if ( elem.nodeType === 1 && elem.className ) {
+                                               if ( value ) {
+                                                       className = (" " + elem.className + " ").replace( rclass, " " );
+                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                               className = className.replace(" " + classNames[ c ] + " ", " ");
+                                                       }
+                                                       elem.className = jQuery.trim( className );
+
+                                               } else {
+                                                       elem.className = "";
+                                               }
+                                       }
+                               }
+                       }
+
+                       return this;
+               },
+
+               toggleClass: function( value, stateVal ) {
+                       var type = typeof value,
+                               isBool = typeof stateVal === "boolean";
+
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function( i ) {
+                                       jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                               });
+                       }
+
+                       return this.each(function() {
+                               if ( type === "string" ) {
+                                       // toggle individual class names
+                                       var className,
+                                               i = 0,
+                                               self = jQuery( this ),
+                                               state = stateVal,
+                                               classNames = value.split( rspace );
+
+                                       while ( (className = classNames[ i++ ]) ) {
+                                               // check each className given, space seperated list
+                                               state = isBool ? state : !self.hasClass( className );
+                                               self[ state ? "addClass" : "removeClass" ]( className );
+                                       }
+
+                               } else if ( type === "undefined" || type === "boolean" ) {
+                                       if ( this.className ) {
+                                               // store className if set
+                                               jQuery._data( this, "__className__", this.className );
+                                       }
+
+                                       // toggle whole className
+                                       this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                               }
+                       });
+               },
+
+               hasClass: function( selector ) {
+                       var className = " " + selector + " ",
+                               i = 0,
+                               l = this.length;
+                       for ( ; i < l; i++ ) {
+                               if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                                       return true;
+                               }
+                       }
+
+                       return false;
+               },
+
+               val: function( value ) {
+                       var hooks, ret, isFunction,
+                               elem = this[0];
+
+                       if ( !arguments.length ) {
+                               if ( elem ) {
+                                       hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                               return ret;
+                                       }
+
+                                       ret = elem.value;
+
+                                       return typeof ret === "string" ?
+                                               // handle most common string cases
+                                               ret.replace(rreturn, "") :
+                                               // handle cases where value is null/undef or number
+                                               ret == null ? "" : ret;
+                               }
+
+                               return;
+                       }
+
+                       isFunction = jQuery.isFunction( value );
+
+                       return this.each(function( i ) {
+                               var self = jQuery(this), val;
+
+                               if ( this.nodeType !== 1 ) {
+                                       return;
+                               }
+
+                               if ( isFunction ) {
+                                       val = value.call( this, i, self.val() );
+                               } else {
+                                       val = value;
+                               }
+
+                               // Treat null/undefined as ""; convert numbers to string
+                               if ( val == null ) {
+                                       val = "";
+                               } else if ( typeof val === "number" ) {
+                                       val += "";
+                               } else if ( jQuery.isArray( val ) ) {
+                                       val = jQuery.map(val, function ( value ) {
+                                               return value == null ? "" : value + "";
+                                       });
+                               }
+
+                               hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                               // If set returns undefined, fall back to normal setting
+                               if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                                       this.value = val;
+                               }
+                       });
+               }
+       });
+
+       jQuery.extend({
+               valHooks: {
+                       option: {
+                               get: function( elem ) {
+                                       // attributes.value is undefined in Blackberry 4.7 but
+                                       // uses .value. See #6932
+                                       var val = elem.attributes.value;
+                                       return !val || val.specified ? elem.value : elem.text;
+                               }
+                       },
+                       select: {
+                               get: function( elem ) {
+                                       var value, i, max, option,
+                                               index = elem.selectedIndex,
+                                               values = [],
+                                               options = elem.options,
+                                               one = elem.type === "select-one";
+
+                                       // Nothing was selected
+                                       if ( index < 0 ) {
+                                               return null;
+                                       }
+
+                                       // Loop through all the selected options
+                                       i = one ? index : 0;
+                                       max = one ? index + 1 : options.length;
+                                       for ( ; i < max; i++ ) {
+                                               option = options[ i ];
+
+                                               // Don't return options that are disabled or in a disabled optgroup
+                                               if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+                                                       // Get the specific value for the option
+                                                       value = jQuery( option ).val();
+
+                                                       // We don't need an array for one selects
+                                                       if ( one ) {
+                                                               return value;
+                                                       }
+
+                                                       // Multi-Selects return an array
+                                                       values.push( value );
+                                               }
+                                       }
+
+                                       // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                                       if ( one && !values.length && options.length ) {
+                                               return jQuery( options[ index ] ).val();
+                                       }
+
+                                       return values;
+                               },
+
+                               set: function( elem, value ) {
+                                       var values = jQuery.makeArray( value );
+
+                                       jQuery(elem).find("option").each(function() {
+                                               this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                                       });
+
+                                       if ( !values.length ) {
+                                               elem.selectedIndex = -1;
+                                       }
+                                       return values;
+                               }
+                       }
+               },
+
+               attrFn: {
+                       val: true,
+                       css: true,
+                       html: true,
+                       text: true,
+                       data: true,
+                       width: true,
+                       height: true,
+                       offset: true
+               },
+
+               attr: function( elem, name, value, pass ) {
+                       var ret, hooks, notxml,
+                               nType = elem.nodeType;
+
+                       // don't get/set attributes on text, comment and attribute nodes
+                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                               return;
+                       }
+
+                       if ( pass && name in jQuery.attrFn ) {
+                               return jQuery( elem )[ name ]( value );
+                       }
+
+                       // Fallback to prop when attributes are not supported
+                       if ( typeof elem.getAttribute === "undefined" ) {
+                               return jQuery.prop( elem, name, value );
+                       }
+
+                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+                       // All attributes are lowercase
+                       // Grab necessary hook if one is defined
+                       if ( notxml ) {
+                               name = name.toLowerCase();
+                               hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+                       }
+
+                       if ( value !== undefined ) {
+
+                               if ( value === null ) {
+                                       jQuery.removeAttr( elem, name );
+                                       return;
+
+                               } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                                       return ret;
+
+                               } else {
+                                       elem.setAttribute( name, "" + value );
+                                       return value;
+                               }
+
+                       } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
+
+                       } else {
+
+                               ret = elem.getAttribute( name );
+
+                               // Non-existent attributes return null, we normalize to undefined
+                               return ret === null ?
+                                       undefined :
+                                       ret;
+                       }
+               },
+
+               removeAttr: function( elem, value ) {
+                       var propName, attrNames, name, l, isBool,
+                               i = 0;
+
+                       if ( value && elem.nodeType === 1 ) {
+                               attrNames = value.toLowerCase().split( rspace );
+                               l = attrNames.length;
+
+                               for ( ; i < l; i++ ) {
+                                       name = attrNames[ i ];
+
+                                       if ( name ) {
+                                               propName = jQuery.propFix[ name ] || name;
+                                               isBool = rboolean.test( name );
+
+                                               // See #9699 for explanation of this approach (setting first, then removal)
+                                               // Do not do this for boolean attributes (see #10870)
+                                               if ( !isBool ) {
+                                                       jQuery.attr( elem, name, "" );
+                                               }
+                                               elem.removeAttribute( getSetAttribute ? name : propName );
+
+                                               // Set corresponding property to false for boolean attributes
+                                               if ( isBool && propName in elem ) {
+                                                       elem[ propName ] = false;
+                                               }
+                                       }
+                               }
+                       }
+               },
+
+               attrHooks: {
+                       type: {
+                               set: function( elem, value ) {
+                                       // We can't allow the type property to be changed (since it causes problems in IE)
+                                       if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                               jQuery.error( "type property can't be changed" );
+                                       } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                               // Setting the type on a radio button after the value resets the value in IE6-9
+                                               // Reset value to it's default in case type is set after value
+                                               // This is for element creation
+                                               var val = elem.value;
+                                               elem.setAttribute( "type", value );
+                                               if ( val ) {
+                                                       elem.value = val;
+                                               }
+                                               return value;
+                                       }
+                               }
+                       },
+                       // Use the value property for back compat
+                       // Use the nodeHook for button elements in IE6/7 (#1954)
+                       value: {
+                               get: function( elem, name ) {
+                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                               return nodeHook.get( elem, name );
+                                       }
+                                       return name in elem ?
+                                               elem.value :
+                                               null;
+                               },
+                               set: function( elem, value, name ) {
+                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                               return nodeHook.set( elem, value, name );
+                                       }
+                                       // Does not return so that setAttribute is also used
+                                       elem.value = value;
+                               }
+                       }
+               },
+
+               propFix: {
+                       tabindex: "tabIndex",
+                       readonly: "readOnly",
+                       "for": "htmlFor",
+                       "class": "className",
+                       maxlength: "maxLength",
+                       cellspacing: "cellSpacing",
+                       cellpadding: "cellPadding",
+                       rowspan: "rowSpan",
+                       colspan: "colSpan",
+                       usemap: "useMap",
+                       frameborder: "frameBorder",
+                       contenteditable: "contentEditable"
+               },
+
+               prop: function( elem, name, value ) {
+                       var ret, hooks, notxml,
+                               nType = elem.nodeType;
+
+                       // don't get/set properties on text, comment and attribute nodes
+                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                               return;
+                       }
+
+                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+                       if ( notxml ) {
+                               // Fix name and attach hooks
+                               name = jQuery.propFix[ name ] || name;
+                               hooks = jQuery.propHooks[ name ];
+                       }
+
+                       if ( value !== undefined ) {
+                               if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                                       return ret;
+
+                               } else {
+                                       return ( elem[ name ] = value );
+                               }
+
+                       } else {
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                                       return ret;
+
+                               } else {
+                                       return elem[ name ];
+                               }
+                       }
+               },
+
+               propHooks: {
+                       tabIndex: {
+                               get: function( elem ) {
+                                       // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                                       // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                                       var attributeNode = elem.getAttributeNode("tabindex");
+
+                                       return attributeNode && attributeNode.specified ?
+                                               parseInt( attributeNode.value, 10 ) :
+                                               rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                                       0 :
+                                                       undefined;
+                               }
+                       }
+               }
+       });
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+       jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+       boolHook = {
+               get: function( elem, name ) {
+                       // Align boolean attributes with corresponding properties
+                       // Fall back to attribute presence where some booleans are not supported
+                       var attrNode,
+                               property = jQuery.prop( elem, name );
+                       return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                               name.toLowerCase() :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       var propName;
+                       if ( value === false ) {
+                               // Remove boolean attributes when set to false
+                               jQuery.removeAttr( elem, name );
+                       } else {
+                               // value is true since we know at this point it's type boolean and not false
+                               // Set boolean attributes to the same name and set the DOM property
+                               propName = jQuery.propFix[ name ] || name;
+                               if ( propName in elem ) {
+                                       // Only set the IDL specifically if it already exists on the element
+                                       elem[ propName ] = true;
+                               }
+
+                               elem.setAttribute( name, name.toLowerCase() );
+                       }
+                       return name;
+               }
+       };
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+       if ( !getSetAttribute ) {
+
+               fixSpecified = {
+                       name: true,
+                       id: true,
+                       coords: true
+               };
+
+               // Use this for any attribute in IE6/7
+               // This fixes almost every IE6/7 issue
+               nodeHook = jQuery.valHooks.button = {
+                       get: function( elem, name ) {
+                               var ret;
+                               ret = elem.getAttributeNode( name );
+                               return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+                                       ret.nodeValue :
+                                       undefined;
+                       },
+                       set: function( elem, value, name ) {
+                               // Set the existing or create a new attribute node
+                               var ret = elem.getAttributeNode( name );
+                               if ( !ret ) {
+                                       ret = document.createAttribute( name );
+                                       elem.setAttributeNode( ret );
+                               }
+                               return ( ret.nodeValue = value + "" );
+                       }
+               };
+
+               // Apply the nodeHook to tabindex
+               jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+               // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+               // This is for removals
+               jQuery.each([ "width", "height" ], function( i, name ) {
+                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                               set: function( elem, value ) {
+                                       if ( value === "" ) {
+                                               elem.setAttribute( name, "auto" );
+                                               return value;
+                                       }
+                               }
+                       });
+               });
+
+               // Set contenteditable to false on removals(#10429)
+               // Setting to empty string throws an error as an invalid value
+               jQuery.attrHooks.contenteditable = {
+                       get: nodeHook.get,
+                       set: function( elem, value, name ) {
+                               if ( value === "" ) {
+                                       value = "false";
+                               }
+                               nodeHook.set( elem, value, name );
+                       }
+               };
+       }
+
+
+// Some attributes require a special call on IE
+       if ( !jQuery.support.hrefNormalized ) {
+               jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                               get: function( elem ) {
+                                       var ret = elem.getAttribute( name, 2 );
+                                       return ret === null ? undefined : ret;
+                               }
+                       });
+               });
+       }
+
+       if ( !jQuery.support.style ) {
+               jQuery.attrHooks.style = {
+                       get: function( elem ) {
+                               // Return undefined in the case of empty string
+                               // Normalize to lowercase since IE uppercases css property names
+                               return elem.style.cssText.toLowerCase() || undefined;
+                       },
+                       set: function( elem, value ) {
+                               return ( elem.style.cssText = "" + value );
+                       }
+               };
+       }
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+       if ( !jQuery.support.optSelected ) {
+               jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+                       get: function( elem ) {
+                               var parent = elem.parentNode;
+
+                               if ( parent ) {
+                                       parent.selectedIndex;
+
+                                       // Make sure that it also works with optgroups, see #5701
+                                       if ( parent.parentNode ) {
+                                               parent.parentNode.selectedIndex;
+                                       }
+                               }
+                               return null;
+                       }
+               });
+       }
+
+// IE6/7 call enctype encoding
+       if ( !jQuery.support.enctype ) {
+               jQuery.propFix.enctype = "encoding";
+       }
+
+// Radios and checkboxes getter/setter
+       if ( !jQuery.support.checkOn ) {
+               jQuery.each([ "radio", "checkbox" ], function() {
+                       jQuery.valHooks[ this ] = {
+                               get: function( elem ) {
+                                       // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                                       return elem.getAttribute("value") === null ? "on" : elem.value;
+                               }
+                       };
+               });
+       }
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+                       set: function( elem, value ) {
+                               if ( jQuery.isArray( value ) ) {
+                                       return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                               }
+                       }
+               });
+       });
+
+
+
+
+       var rformElems = /^(?:textarea|input|select)$/i,
+               rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+               rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+               rkeyEvent = /^key/,
+               rmouseEvent = /^(?:mouse|contextmenu)|click/,
+               rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+               rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+               quickParse = function( selector ) {
+                       var quick = rquickIs.exec( selector );
+                       if ( quick ) {
+                               //   0  1    2   3
+                               // [ _, tag, id, class ]
+                               quick[1] = ( quick[1] || "" ).toLowerCase();
+                               quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+                       }
+                       return quick;
+               },
+               quickIs = function( elem, m ) {
+                       var attrs = elem.attributes || {};
+                       return (
+                               (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+                                       (!m[2] || (attrs.id || {}).value === m[2]) &&
+                                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+                               );
+               },
+               hoverHack = function( events ) {
+                       return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+               };
+
+       /*
+        * Helper functions for managing events -- not part of the public interface.
+        * Props to Dean Edwards' addEvent library for many of the ideas.
+        */
+       jQuery.event = {
+
+               add: function( elem, types, handler, data, selector ) {
+
+                       var elemData, eventHandle, events,
+                               t, tns, type, namespaces, handleObj,
+                               handleObjIn, quick, handlers, special;
+
+                       // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+                       if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                               return;
+                       }
+
+                       // Caller can pass in an object of custom data in lieu of the handler
+                       if ( handler.handler ) {
+                               handleObjIn = handler;
+                               handler = handleObjIn.handler;
+                               selector = handleObjIn.selector;
+                       }
+
+                       // Make sure that the handler has a unique ID, used to find/remove it later
+                       if ( !handler.guid ) {
+                               handler.guid = jQuery.guid++;
+                       }
+
+                       // Init the element's event structure and main handler, if this is the first
+                       events = elemData.events;
+                       if ( !events ) {
+                               elemData.events = events = {};
+                       }
+                       eventHandle = elemData.handle;
+                       if ( !eventHandle ) {
+                               elemData.handle = eventHandle = function( e ) {
+                                       // Discard the second event of a jQuery.event.trigger() and
+                                       // when an event is called after a page has unloaded
+                                       return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                               jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                               undefined;
+                               };
+                               // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                               eventHandle.elem = elem;
+                       }
+
+                       // Handle multiple events separated by a space
+                       // jQuery(...).bind("mouseover mouseout", fn);
+                       types = jQuery.trim( hoverHack(types) ).split( " " );
+                       for ( t = 0; t < types.length; t++ ) {
+
+                               tns = rtypenamespace.exec( types[t] ) || [];
+                               type = tns[1];
+                               namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+                               // If event changes its type, use the special event handlers for the changed type
+                               special = jQuery.event.special[ type ] || {};
+
+                               // If selector defined, determine special event api type, otherwise given type
+                               type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                               // Update special based on newly reset type
+                               special = jQuery.event.special[ type ] || {};
+
+                               // handleObj is passed to all event handlers
+                               handleObj = jQuery.extend({
+                                       type: type,
+                                       origType: tns[1],
+                                       data: data,
+                                       handler: handler,
+                                       guid: handler.guid,
+                                       selector: selector,
+                                       quick: selector && quickParse( selector ),
+                                       namespace: namespaces.join(".")
+                               }, handleObjIn );
+
+                               // Init the event handler queue if we're the first
+                               handlers = events[ type ];
+                               if ( !handlers ) {
+                                       handlers = events[ type ] = [];
+                                       handlers.delegateCount = 0;
+
+                                       // Only use addEventListener/attachEvent if the special events handler returns false
+                                       if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                               // Bind the global event handler to the element
+                                               if ( elem.addEventListener ) {
+                                                       elem.addEventListener( type, eventHandle, false );
+
+                                               } else if ( elem.attachEvent ) {
+                                                       elem.attachEvent( "on" + type, eventHandle );
+                                               }
+                                       }
+                               }
+
+                               if ( special.add ) {
+                                       special.add.call( elem, handleObj );
+
+                                       if ( !handleObj.handler.guid ) {
+                                               handleObj.handler.guid = handler.guid;
+                                       }
+                               }
+
+                               // Add to the element's handler list, delegates in front
+                               if ( selector ) {
+                                       handlers.splice( handlers.delegateCount++, 0, handleObj );
+                               } else {
+                                       handlers.push( handleObj );
+                               }
+
+                               // Keep track of which events have ever been used, for event optimization
+                               jQuery.event.global[ type ] = true;
+                       }
+
+                       // Nullify elem to prevent memory leaks in IE
+                       elem = null;
+               },
+
+               global: {},
+
+               // Detach an event or set of events from an element
+               remove: function( elem, types, handler, selector, mappedTypes ) {
+
+                       var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+                               t, tns, type, origType, namespaces, origCount,
+                               j, events, special, handle, eventType, handleObj;
+
+                       if ( !elemData || !(events = elemData.events) ) {
+                               return;
+                       }
+
+                       // Once for each type.namespace in types; type may be omitted
+                       types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+                       for ( t = 0; t < types.length; t++ ) {
+                               tns = rtypenamespace.exec( types[t] ) || [];
+                               type = origType = tns[1];
+                               namespaces = tns[2];
+
+                               // Unbind all events (on this namespace, if provided) for the element
+                               if ( !type ) {
+                                       for ( type in events ) {
+                                               jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                                       }
+                                       continue;
+                               }
+
+                               special = jQuery.event.special[ type ] || {};
+                               type = ( selector? special.delegateType : special.bindType ) || type;
+                               eventType = events[ type ] || [];
+                               origCount = eventType.length;
+                               namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+                               // Remove matching events
+                               for ( j = 0; j < eventType.length; j++ ) {
+                                       handleObj = eventType[ j ];
+
+                                       if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                               ( !handler || handler.guid === handleObj.guid ) &&
+                                               ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                               ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                               eventType.splice( j--, 1 );
+
+                                               if ( handleObj.selector ) {
+                                                       eventType.delegateCount--;
+                                               }
+                                               if ( special.remove ) {
+                                                       special.remove.call( elem, handleObj );
+                                               }
+                                       }
+                               }
+
+                               // Remove generic event handler if we removed something and no more handlers exist
+                               // (avoids potential for endless recursion during removal of special event handlers)
+                               if ( eventType.length === 0 && origCount !== eventType.length ) {
+                                       if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                                               jQuery.removeEvent( elem, type, elemData.handle );
+                                       }
+
+                                       delete events[ type ];
+                               }
+                       }
+
+                       // Remove the expando if it's no longer used
+                       if ( jQuery.isEmptyObject( events ) ) {
+                               handle = elemData.handle;
+                               if ( handle ) {
+                                       handle.elem = null;
+                               }
+
+                               // removeData also checks for emptiness and clears the expando if empty
+                               // so use it instead of delete
+                               jQuery.removeData( elem, [ "events", "handle" ], true );
+                       }
+               },
+
+               // Events that are safe to short-circuit if no handlers are attached.
+               // Native DOM events should not be added, they may have inline handlers.
+               customEvent: {
+                       "getData": true,
+                       "setData": true,
+                       "changeData": true
+               },
+
+               trigger: function( event, data, elem, onlyHandlers ) {
+                       // Don't do events on text and comment nodes
+                       if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                               return;
+                       }
+
+                       // Event object or event type
+                       var type = event.type || event,
+                               namespaces = [],
+                               cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+                       // focus/blur morphs to focusin/out; ensure we're not firing them right now
+                       if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                               return;
+                       }
+
+                       if ( type.indexOf( "!" ) >= 0 ) {
+                               // Exclusive events trigger only for the exact event (no namespaces)
+                               type = type.slice(0, -1);
+                               exclusive = true;
+                       }
+
+                       if ( type.indexOf( "." ) >= 0 ) {
+                               // Namespaced trigger; create a regexp to match event type in handle()
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+                               namespaces.sort();
+                       }
+
+                       if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                               // No jQuery handlers for this event type, and it can't have inline handlers
+                               return;
+                       }
+
+                       // Caller can pass in an Event, Object, or just an event type string
+                       event = typeof event === "object" ?
+                               // jQuery.Event object
+                               event[ jQuery.expando ] ? event :
+                                       // Object literal
+                                       new jQuery.Event( type, event ) :
+                               // Just the event type (string)
+                               new jQuery.Event( type );
+
+                       event.type = type;
+                       event.isTrigger = true;
+                       event.exclusive = exclusive;
+                       event.namespace = namespaces.join( "." );
+                       event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+                       ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+                       // Handle a global trigger
+                       if ( !elem ) {
+
+                               // TODO: Stop taunting the data cache; remove global events and always attach to document
+                               cache = jQuery.cache;
+                               for ( i in cache ) {
+                                       if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                               jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                                       }
+                               }
+                               return;
+                       }
+
+                       // Clean up the event in case it is being reused
+                       event.result = undefined;
+                       if ( !event.target ) {
+                               event.target = elem;
+                       }
+
+                       // Clone any incoming data and prepend the event, creating the handler arg list
+                       data = data != null ? jQuery.makeArray( data ) : [];
+                       data.unshift( event );
+
+                       // Allow special events to draw outside the lines
+                       special = jQuery.event.special[ type ] || {};
+                       if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                               return;
+                       }
+
+                       // Determine event propagation path in advance, per W3C events spec (#9951)
+                       // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+                       eventPath = [[ elem, special.bindType || type ]];
+                       if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                               bubbleType = special.delegateType || type;
+                               cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                               old = null;
+                               for ( ; cur; cur = cur.parentNode ) {
+                                       eventPath.push([ cur, bubbleType ]);
+                                       old = cur;
+                               }
+
+                               // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                               if ( old && old === elem.ownerDocument ) {
+                                       eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                               }
+                       }
+
+                       // Fire handlers on the event path
+                       for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+                               cur = eventPath[i][0];
+                               event.type = eventPath[i][1];
+
+                               handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                               if ( handle ) {
+                                       handle.apply( cur, data );
+                               }
+                               // Note that this is a bare JS function and not a jQuery handler
+                               handle = ontype && cur[ ontype ];
+                               if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                                       event.preventDefault();
+                               }
+                       }
+                       event.type = type;
+
+                       // If nobody prevented the default action, do it now
+                       if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                               if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                                       !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+                                       // Call a native DOM method on the target with the same name name as the event.
+                                       // Can't use an .isFunction() check here because IE6/7 fails that test.
+                                       // Don't do default actions on window, that's where global variables be (#6170)
+                                       // IE<9 dies on focus/blur to hidden element (#1486)
+                                       if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+                                               // Don't re-trigger an onFOO event when we call its FOO() method
+                                               old = elem[ ontype ];
+
+                                               if ( old ) {
+                                                       elem[ ontype ] = null;
+                                               }
+
+                                               // Prevent re-triggering of the same event, since we already bubbled it above
+                                               jQuery.event.triggered = type;
+                                               elem[ type ]();
+                                               jQuery.event.triggered = undefined;
+
+                                               if ( old ) {
+                                                       elem[ ontype ] = old;
+                                               }
+                                       }
+                               }
+                       }
+
+                       return event.result;
+               },
+
+               dispatch: function( event ) {
+
+                       // Make a writable jQuery.Event from the native event object
+                       event = jQuery.event.fix( event || window.event );
+
+                       var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                               delegateCount = handlers.delegateCount,
+                               args = [].slice.call( arguments, 0 ),
+                               run_all = !event.exclusive && !event.namespace,
+                               special = jQuery.event.special[ event.type ] || {},
+                               handlerQueue = [],
+                               i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+                       // Use the fix-ed jQuery.Event rather than the (read-only) native event
+                       args[0] = event;
+                       event.delegateTarget = this;
+
+                       // Call the preDispatch hook for the mapped type, and let it bail if desired
+                       if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                               return;
+                       }
+
+                       // Determine handlers that should run if there are delegated events
+                       // Avoid non-left-click bubbling in Firefox (#3861)
+                       if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                               // Pregenerate a single jQuery object for reuse with .is()
+                               jqcur = jQuery(this);
+                               jqcur.context = this.ownerDocument || this;
+
+                               for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+                                       // Don't process events on disabled elements (#6911, #8165)
+                                       if ( cur.disabled !== true ) {
+                                               selMatch = {};
+                                               matches = [];
+                                               jqcur[0] = cur;
+                                               for ( i = 0; i < delegateCount; i++ ) {
+                                                       handleObj = handlers[ i ];
+                                                       sel = handleObj.selector;
+
+                                                       if ( selMatch[ sel ] === undefined ) {
+                                                               selMatch[ sel ] = (
+                                                                       handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+                                                                       );
+                                                       }
+                                                       if ( selMatch[ sel ] ) {
+                                                               matches.push( handleObj );
+                                                       }
+                                               }
+                                               if ( matches.length ) {
+                                                       handlerQueue.push({ elem: cur, matches: matches });
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Add the remaining (directly-bound) handlers
+                       if ( handlers.length > delegateCount ) {
+                               handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+                       }
+
+                       // Run delegates first; they may want to stop propagation beneath us
+                       for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                               matched = handlerQueue[ i ];
+                               event.currentTarget = matched.elem;
+
+                               for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                                       handleObj = matched.matches[ j ];
+
+                                       // Triggered event must either 1) be non-exclusive and have no namespace, or
+                                       // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                                       if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+                                               event.data = handleObj.data;
+                                               event.handleObj = handleObj;
+
+                                               ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                               if ( ret !== undefined ) {
+                                                       event.result = ret;
+                                                       if ( ret === false ) {
+                                                               event.preventDefault();
+                                                               event.stopPropagation();
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Call the postDispatch hook for the mapped type
+                       if ( special.postDispatch ) {
+                               special.postDispatch.call( this, event );
+                       }
+
+                       return event.result;
+               },
+
+               // Includes some event props shared by KeyEvent and MouseEvent
+               // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+               props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+               fixHooks: {},
+
+               keyHooks: {
+                       props: "char charCode key keyCode".split(" "),
+                       filter: function( event, original ) {
+
+                               // Add which for key events
+                               if ( event.which == null ) {
+                                       event.which = original.charCode != null ? original.charCode : original.keyCode;
+                               }
+
+                               return event;
+                       }
+               },
+
+               mouseHooks: {
+                       props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+                       filter: function( event, original ) {
+                               var eventDoc, doc, body,
+                                       button = original.button,
+                                       fromElement = original.fromElement;
+
+                               // Calculate pageX/Y if missing and clientX/Y available
+                               if ( event.pageX == null && original.clientX != null ) {
+                                       eventDoc = event.target.ownerDocument || document;
+                                       doc = eventDoc.documentElement;
+                                       body = eventDoc.body;
+
+                                       event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                                       event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                               }
+
+                               // Add relatedTarget, if necessary
+                               if ( !event.relatedTarget && fromElement ) {
+                                       event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                               }
+
+                               // Add which for click: 1 === left; 2 === middle; 3 === right
+                               // Note: button is not normalized, so don't use it
+                               if ( !event.which && button !== undefined ) {
+                                       event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                               }
+
+                               return event;
+                       }
+               },
+
+               fix: function( event ) {
+                       if ( event[ jQuery.expando ] ) {
+                               return event;
+                       }
+
+                       // Create a writable copy of the event object and normalize some properties
+                       var i, prop,
+                               originalEvent = event,
+                               fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+                       event = jQuery.Event( originalEvent );
+
+                       for ( i = copy.length; i; ) {
+                               prop = copy[ --i ];
+                               event[ prop ] = originalEvent[ prop ];
+                       }
+
+                       // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+                       if ( !event.target ) {
+                               event.target = originalEvent.srcElement || document;
+                       }
+
+                       // Target should not be a text node (#504, Safari)
+                       if ( event.target.nodeType === 3 ) {
+                               event.target = event.target.parentNode;
+                       }
+
+                       // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+                       if ( event.metaKey === undefined ) {
+                               event.metaKey = event.ctrlKey;
+                       }
+
+                       return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+               },
+
+               special: {
+                       ready: {
+                               // Make sure the ready event is setup
+                               setup: jQuery.bindReady
+                       },
+
+                       load: {
+                               // Prevent triggered image.load events from bubbling to window.load
+                               noBubble: true
+                       },
+
+                       focus: {
+                               delegateType: "focusin"
+                       },
+                       blur: {
+                               delegateType: "focusout"
+                       },
+
+                       beforeunload: {
+                               setup: function( data, namespaces, eventHandle ) {
+                                       // We only want to do this special case on windows
+                                       if ( jQuery.isWindow( this ) ) {
+                                               this.onbeforeunload = eventHandle;
+                                       }
+                               },
+
+                               teardown: function( namespaces, eventHandle ) {
+                                       if ( this.onbeforeunload === eventHandle ) {
+                                               this.onbeforeunload = null;
+                                       }
+                               }
+                       }
+               },
+
+               simulate: function( type, elem, event, bubble ) {
+                       // Piggyback on a donor event to simulate a different one.
+                       // Fake originalEvent to avoid donor's stopPropagation, but if the
+                       // simulated event prevents default then we do the same on the donor.
+                       var e = jQuery.extend(
+                               new jQuery.Event(),
+                               event,
+                               { type: type,
+                                       isSimulated: true,
+                                       originalEvent: {}
+                               }
+                       );
+                       if ( bubble ) {
+                               jQuery.event.trigger( e, null, elem );
+                       } else {
+                               jQuery.event.dispatch.call( elem, e );
+                       }
+                       if ( e.isDefaultPrevented() ) {
+                               event.preventDefault();
+                       }
+               }
+       };
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+       jQuery.event.handle = jQuery.event.dispatch;
+
+       jQuery.removeEvent = document.removeEventListener ?
+               function( elem, type, handle ) {
+                       if ( elem.removeEventListener ) {
+                               elem.removeEventListener( type, handle, false );
+                       }
+               } :
+               function( elem, type, handle ) {
+                       if ( elem.detachEvent ) {
+                               elem.detachEvent( "on" + type, handle );
+                       }
+               };
+
+       jQuery.Event = function( src, props ) {
+               // Allow instantiation without the 'new' keyword
+               if ( !(this instanceof jQuery.Event) ) {
+                       return new jQuery.Event( src, props );
+               }
+
+               // Event object
+               if ( src && src.type ) {
+                       this.originalEvent = src;
+                       this.type = src.type;
+
+                       // Events bubbling up the document may have been marked as prevented
+                       // by a handler lower down the tree; reflect the correct value.
+                       this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                               src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+                       // Event type
+               } else {
+                       this.type = src;
+               }
+
+               // Put explicitly provided properties onto the event object
+               if ( props ) {
+                       jQuery.extend( this, props );
+               }
+
+               // Create a timestamp if incoming event doesn't have one
+               this.timeStamp = src && src.timeStamp || jQuery.now();
+
+               // Mark it as fixed
+               this[ jQuery.expando ] = true;
+       };
+
+       function returnFalse() {
+               return false;
+       }
+       function returnTrue() {
+               return true;
+       }
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+       jQuery.Event.prototype = {
+               preventDefault: function() {
+                       this.isDefaultPrevented = returnTrue;
+
+                       var e = this.originalEvent;
+                       if ( !e ) {
+                               return;
+                       }
+
+                       // if preventDefault exists run it on the original event
+                       if ( e.preventDefault ) {
+                               e.preventDefault();
+
+                               // otherwise set the returnValue property of the original event to false (IE)
+                       } else {
+                               e.returnValue = false;
+                       }
+               },
+               stopPropagation: function() {
+                       this.isPropagationStopped = returnTrue;
+
+                       var e = this.originalEvent;
+                       if ( !e ) {
+                               return;
+                       }
+                       // if stopPropagation exists run it on the original event
+                       if ( e.stopPropagation ) {
+                               e.stopPropagation();
+                       }
+                       // otherwise set the cancelBubble property of the original event to true (IE)
+                       e.cancelBubble = true;
+               },
+               stopImmediatePropagation: function() {
+                       this.isImmediatePropagationStopped = returnTrue;
+                       this.stopPropagation();
+               },
+               isDefaultPrevented: returnFalse,
+               isPropagationStopped: returnFalse,
+               isImmediatePropagationStopped: returnFalse
+       };
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+       jQuery.each({
+               mouseenter: "mouseover",
+               mouseleave: "mouseout"
+       }, function( orig, fix ) {
+               jQuery.event.special[ orig ] = {
+                       delegateType: fix,
+                       bindType: fix,
+
+                       handle: function( event ) {
+                               var target = this,
+                                       related = event.relatedTarget,
+                                       handleObj = event.handleObj,
+                                       selector = handleObj.selector,
+                                       ret;
+
+                               // For mousenter/leave call the handler if related is outside the target.
+                               // NB: No relatedTarget if the mouse left/entered the browser window
+                               if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                                       event.type = handleObj.origType;
+                                       ret = handleObj.handler.apply( this, arguments );
+                                       event.type = fix;
+                               }
+                               return ret;
+                       }
+               };
+       });
+
+// IE submit delegation
+       if ( !jQuery.support.submitBubbles ) {
+
+               jQuery.event.special.submit = {
+                       setup: function() {
+                               // Only need this for delegated form submit events
+                               if ( jQuery.nodeName( this, "form" ) ) {
+                                       return false;
+                               }
+
+                               // Lazy-add a submit handler when a descendant form may potentially be submitted
+                               jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                                       // Node name check avoids a VML-related crash in IE (#9807)
+                                       var elem = e.target,
+                                               form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                                       if ( form && !form._submit_attached ) {
+                                               jQuery.event.add( form, "submit._submit", function( event ) {
+                                                       event._submit_bubble = true;
+                                               });
+                                               form._submit_attached = true;
+                                       }
+                               });
+                               // return undefined since we don't need an event listener
+                       },
+
+                       postDispatch: function( event ) {
+                               // If form was submitted by the user, bubble the event up the tree
+                               if ( event._submit_bubble ) {
+                                       delete event._submit_bubble;
+                                       if ( this.parentNode && !event.isTrigger ) {
+                                               jQuery.event.simulate( "submit", this.parentNode, event, true );
+                                       }
+                               }
+                       },
+
+                       teardown: function() {
+                               // Only need this for delegated form submit events
+                               if ( jQuery.nodeName( this, "form" ) ) {
+                                       return false;
+                               }
+
+                               // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                               jQuery.event.remove( this, "._submit" );
+                       }
+               };
+       }
+
+// IE change delegation and checkbox/radio fix
+       if ( !jQuery.support.changeBubbles ) {
+
+               jQuery.event.special.change = {
+
+                       setup: function() {
+
+                               if ( rformElems.test( this.nodeName ) ) {
+                                       // IE doesn't fire change on a check/radio until blur; trigger it on click
+                                       // after a propertychange. Eat the blur-change in special.change.handle.
+                                       // This still fires onchange a second time for check/radio after blur.
+                                       if ( this.type === "checkbox" || this.type === "radio" ) {
+                                               jQuery.event.add( this, "propertychange._change", function( event ) {
+                                                       if ( event.originalEvent.propertyName === "checked" ) {
+                                                               this._just_changed = true;
+                                                       }
+                                               });
+                                               jQuery.event.add( this, "click._change", function( event ) {
+                                                       if ( this._just_changed && !event.isTrigger ) {
+                                                               this._just_changed = false;
+                                                               jQuery.event.simulate( "change", this, event, true );
+                                                       }
+                                               });
+                                       }
+                                       return false;
+                               }
+                               // Delegated event; lazy-add a change handler on descendant inputs
+                               jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                                       var elem = e.target;
+
+                                       if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+                                               jQuery.event.add( elem, "change._change", function( event ) {
+                                                       if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                               jQuery.event.simulate( "change", this.parentNode, event, true );
+                                                       }
+                                               });
+                                               elem._change_attached = true;
+                                       }
+                               });
+                       },
+
+                       handle: function( event ) {
+                               var elem = event.target;
+
+                               // Swallow native change events from checkbox/radio, we already triggered them above
+                               if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                                       return event.handleObj.handler.apply( this, arguments );
+                               }
+                       },
+
+                       teardown: function() {
+                               jQuery.event.remove( this, "._change" );
+
+                               return rformElems.test( this.nodeName );
+                       }
+               };
+       }
+
+// Create "bubbling" focus and blur events
+       if ( !jQuery.support.focusinBubbles ) {
+               jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+                       // Attach a single capturing handler while someone wants focusin/focusout
+                       var attaches = 0,
+                               handler = function( event ) {
+                                       jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                               };
+
+                       jQuery.event.special[ fix ] = {
+                               setup: function() {
+                                       if ( attaches++ === 0 ) {
+                                               document.addEventListener( orig, handler, true );
+                                       }
+                               },
+                               teardown: function() {
+                                       if ( --attaches === 0 ) {
+                                               document.removeEventListener( orig, handler, true );
+                                       }
+                               }
+                       };
+               });
+       }
+
+       jQuery.fn.extend({
+
+               on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+                       var origFn, type;
+
+                       // Types can be a map of types/handlers
+                       if ( typeof types === "object" ) {
+                               // ( types-Object, selector, data )
+                               if ( typeof selector !== "string" ) { // && selector != null
+                                       // ( types-Object, data )
+                                       data = data || selector;
+                                       selector = undefined;
+                               }
+                               for ( type in types ) {
+                                       this.on( type, selector, data, types[ type ], one );
+                               }
+                               return this;
+                       }
+
+                       if ( data == null && fn == null ) {
+                               // ( types, fn )
+                               fn = selector;
+                               data = selector = undefined;
+                       } else if ( fn == null ) {
+                               if ( typeof selector === "string" ) {
+                                       // ( types, selector, fn )
+                                       fn = data;
+                                       data = undefined;
+                               } else {
+                                       // ( types, data, fn )
+                                       fn = data;
+                                       data = selector;
+                                       selector = undefined;
+                               }
+                       }
+                       if ( fn === false ) {
+                               fn = returnFalse;
+                       } else if ( !fn ) {
+                               return this;
+                       }
+
+                       if ( one === 1 ) {
+                               origFn = fn;
+                               fn = function( event ) {
+                                       // Can use an empty set, since event contains the info
+                                       jQuery().off( event );
+                                       return origFn.apply( this, arguments );
+                               };
+                               // Use same guid so caller can remove using origFn
+                               fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+                       }
+                       return this.each( function() {
+                               jQuery.event.add( this, types, fn, data, selector );
+                       });
+               },
+               one: function( types, selector, data, fn ) {
+                       return this.on( types, selector, data, fn, 1 );
+               },
+               off: function( types, selector, fn ) {
+                       if ( types && types.preventDefault && types.handleObj ) {
+                               // ( event )  dispatched jQuery.Event
+                               var handleObj = types.handleObj;
+                               jQuery( types.delegateTarget ).off(
+                                       handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                                       handleObj.selector,
+                                       handleObj.handler
+                               );
+                               return this;
+                       }
+                       if ( typeof types === "object" ) {
+                               // ( types-object [, selector] )
+                               for ( var type in types ) {
+                                       this.off( type, selector, types[ type ] );
+                               }
+                               return this;
+                       }
+                       if ( selector === false || typeof selector === "function" ) {
+                               // ( types [, fn] )
+                               fn = selector;
+                               selector = undefined;
+                       }
+                       if ( fn === false ) {
+                               fn = returnFalse;
+                       }
+                       return this.each(function() {
+                               jQuery.event.remove( this, types, fn, selector );
+                       });
+               },
+
+               bind: function( types, data, fn ) {
+                       return this.on( types, null, data, fn );
+               },
+               unbind: function( types, fn ) {
+                       return this.off( types, null, fn );
+               },
+
+               live: function( types, data, fn ) {
+                       jQuery( this.context ).on( types, this.selector, data, fn );
+                       return this;
+               },
+               die: function( types, fn ) {
+                       jQuery( this.context ).off( types, this.selector || "**", fn );
+                       return this;
+               },
+
+               delegate: function( selector, types, data, fn ) {
+                       return this.on( types, selector, data, fn );
+               },
+               undelegate: function( selector, types, fn ) {
+                       // ( namespace ) or ( selector, types [, fn] )
+                       return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+               },
+
+               trigger: function( type, data ) {
+                       return this.each(function() {
+                               jQuery.event.trigger( type, data, this );
+                       });
+               },
+               triggerHandler: function( type, data ) {
+                       if ( this[0] ) {
+                               return jQuery.event.trigger( type, data, this[0], true );
+                       }
+               },
+
+               toggle: function( fn ) {
+                       // Save reference to arguments for access in closure
+                       var args = arguments,
+                               guid = fn.guid || jQuery.guid++,
+                               i = 0,
+                               toggler = function( event ) {
+                                       // Figure out which function to execute
+                                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                                       // Make sure that clicks stop
+                                       event.preventDefault();
+
+                                       // and execute the function
+                                       return args[ lastToggle ].apply( this, arguments ) || false;
+                               };
+
+                       // link all the functions, so any of them can unbind this click handler
+                       toggler.guid = guid;
+                       while ( i < args.length ) {
+                               args[ i++ ].guid = guid;
+                       }
+
+                       return this.click( toggler );
+               },
+
+               hover: function( fnOver, fnOut ) {
+                       return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+               }
+       });
+
+       jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+               "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+               "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+               // Handle event binding
+               jQuery.fn[ name ] = function( data, fn ) {
+                       if ( fn == null ) {
+                               fn = data;
+                               data = null;
+                       }
+
+                       return arguments.length > 0 ?
+                               this.on( name, null, data, fn ) :
+                               this.trigger( name );
+               };
+
+               if ( jQuery.attrFn ) {
+                       jQuery.attrFn[ name ] = true;
+               }
+
+               if ( rkeyEvent.test( name ) ) {
+                       jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+               }
+
+               if ( rmouseEvent.test( name ) ) {
+                       jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+               }
+       });
+
+
+
+       /*!
+        * Sizzle CSS Selector Engine
+        *  Copyright 2011, The Dojo Foundation
+        *  Released under the MIT, BSD, and GPL Licenses.
+        *  More information: http://sizzlejs.com/
+        */
+       (function(){
+
+               var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+                       expando = "sizcache" + (Math.random() + '').replace('.', ''),
+                       done = 0,
+                       toString = Object.prototype.toString,
+                       hasDuplicate = false,
+                       baseHasDuplicate = true,
+                       rBackslash = /\\/g,
+                       rReturn = /\r\n/g,
+                       rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+               [0, 0].sort(function() {
+                       baseHasDuplicate = false;
+                       return 0;
+               });
+
+               var Sizzle = function( selector, context, results, seed ) {
+                       results = results || [];
+                       context = context || document;
+
+                       var origContext = context;
+
+                       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+                               return [];
+                       }
+
+                       if ( !selector || typeof selector !== "string" ) {
+                               return results;
+                       }
+
+                       var m, set, checkSet, extra, ret, cur, pop, i,
+                               prune = true,
+                               contextXML = Sizzle.isXML( context ),
+                               parts = [],
+                               soFar = selector;
+
+                       // Reset the position of the chunker regexp (start from head)
+                       do {
+                               chunker.exec( "" );
+                               m = chunker.exec( soFar );
+
+                               if ( m ) {
+                                       soFar = m[3];
+
+                                       parts.push( m[1] );
+
+                                       if ( m[2] ) {
+                                               extra = m[3];
+                                               break;
+                                       }
+                               }
+                       } while ( m );
+
+                       if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+                               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                                       set = posProcess( parts[0] + parts[1], context, seed );
+
+                               } else {
+                                       set = Expr.relative[ parts[0] ] ?
+                                               [ context ] :
+                                               Sizzle( parts.shift(), context );
+
+                                       while ( parts.length ) {
+                                               selector = parts.shift();
+
+                                               if ( Expr.relative[ selector ] ) {
+                                                       selector += parts.shift();
+                                               }
 
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
+                                               set = posProcess( selector, set, seed );
+                                       }
+                               }
 
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
+                       } else {
+                               // Take a shortcut and set the context if the root selector is an ID
+                               // (but not if it'll be faster if the inner selector is an ID)
+                               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                                       Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+                                       ret = Sizzle.find( parts.shift(), context, contextXML );
+                                       context = ret.expr ?
+                                               Sizzle.filter( ret.expr, ret.set )[0] :
+                                               ret.set[0];
+                               }
+
+                               if ( context ) {
+                                       ret = seed ?
+                                       { expr: parts.pop(), set: makeArray(seed) } :
+                                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
 
-                                               // and execute any waiting functions
-                                               jQuery.ready();
+                                       set = ret.expr ?
+                                               Sizzle.filter( ret.expr, ret.set ) :
+                                               ret.set;
+
+                                       if ( parts.length > 0 ) {
+                                               checkSet = makeArray( set );
+
+                                       } else {
+                                               prune = false;
                                        }
-                               })();
-                       }
-               }
-       }
-       return readyList.promise( obj );
-};
 
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
+                                       while ( parts.length ) {
+                                               cur = parts.pop();
+                                               pop = cur;
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-       var object = optionsCache[ options ] = {};
-       jQuery.each( options.split( core_rspace ), function( _, flag ) {
-               object[ flag ] = true;
-       });
-       return object;
-}
+                                               if ( !Expr.relative[ cur ] ) {
+                                                       cur = "";
+                                               } else {
+                                                       pop = parts.pop();
+                                               }
 
-/*
- * Create a callback list using the following parameters:
- *
- *     options: an optional list of space-separated options that will change how
- *                     the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *     once:                   will ensure the callback list can only be fired once (like a Deferred)
- *
- *     memory:                 will keep track of previous values and will call any callback added
- *                                     after the list has been fired right away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
+                                               if ( pop == null ) {
+                                                       pop = context;
+                                               }
 
-       // Convert options from String-formatted to Object-formatted if needed
-       // (we check in cache first)
-       options = typeof options === "string" ?
-               ( optionsCache[ options ] || createOptions( options ) ) :
-               jQuery.extend( {}, options );
+                                               Expr.relative[ cur ]( checkSet, pop, contextXML );
+                                       }
 
-       var // Last fire value (for non-forgettable lists)
-               memory,
-               // Flag to know if list was already fired
-               fired,
-               // Flag to know if list is currently firing
-               firing,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
-               // End of the loop when firing
-               firingLength,
-               // Index of currently firing callback (modified by remove if needed)
-               firingIndex,
-               // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = !options.once && [],
-               // Fire callbacks
-               fire = function( data ) {
-                       memory = options.memory && data;
-                       fired = true;
-                       firingIndex = firingStart || 0;
-                       firingStart = 0;
-                       firingLength = list.length;
-                       firing = true;
-                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-                                       memory = false; // To prevent further calls using add
-                                       break;
+                               } else {
+                                       checkSet = parts = [];
                                }
                        }
-                       firing = false;
-                       if ( list ) {
-                               if ( stack ) {
-                                       if ( stack.length ) {
-                                               fire( stack.shift() );
+
+                       if ( !checkSet ) {
+                               checkSet = set;
+                       }
+
+                       if ( !checkSet ) {
+                               Sizzle.error( cur || selector );
+                       }
+
+                       if ( toString.call(checkSet) === "[object Array]" ) {
+                               if ( !prune ) {
+                                       results.push.apply( results, checkSet );
+
+                               } else if ( context && context.nodeType === 1 ) {
+                                       for ( i = 0; checkSet[i] != null; i++ ) {
+                                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+                                                       results.push( set[i] );
+                                               }
                                        }
-                               } else if ( memory ) {
-                                       list = [];
+
                                } else {
-                                       self.disable();
+                                       for ( i = 0; checkSet[i] != null; i++ ) {
+                                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                                       results.push( set[i] );
+                                               }
+                                       }
                                }
+
+                       } else {
+                               makeArray( checkSet, results );
                        }
-               },
-               // Actual Callbacks object
-               self = {
-                       // Add a callback or a collection of callbacks to the list
-                       add: function() {
-                               if ( list ) {
-                                       // First, we save the current length
-                                       var start = list.length;
-                                       (function add( args ) {
-                                               jQuery.each( args, function( _, arg ) {
-                                                       var type = jQuery.type( arg );
-                                                       if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
-                                                               list.push( arg );
-                                                       } else if ( arg && arg.length && type !== "string" ) {
-                                                               // Inspect recursively
-                                                               add( arg );
-                                                       }
-                                               });
-                                       })( arguments );
-                                       // Do we need to add the callbacks to the
-                                       // current firing batch?
-                                       if ( firing ) {
-                                               firingLength = list.length;
-                                       // With memory, if we're not firing then
-                                       // we should call right away
-                                       } else if ( memory ) {
-                                               firingStart = start;
-                                               fire( memory );
+
+                       if ( extra ) {
+                               Sizzle( extra, origContext, results, seed );
+                               Sizzle.uniqueSort( results );
+                       }
+
+                       return results;
+               };
+
+               Sizzle.uniqueSort = function( results ) {
+                       if ( sortOrder ) {
+                               hasDuplicate = baseHasDuplicate;
+                               results.sort( sortOrder );
+
+                               if ( hasDuplicate ) {
+                                       for ( var i = 1; i < results.length; i++ ) {
+                                               if ( results[i] === results[ i - 1 ] ) {
+                                                       results.splice( i--, 1 );
+                                               }
                                        }
                                }
-                               return this;
-                       },
-                       // Remove a callback from the list
-                       remove: function() {
-                               if ( list ) {
-                                       jQuery.each( arguments, function( _, arg ) {
-                                               var index;
-                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                                                       list.splice( index, 1 );
-                                                       // Handle firing indexes
-                                                       if ( firing ) {
-                                                               if ( index <= firingLength ) {
-                                                                       firingLength--;
-                                                               }
-                                                               if ( index <= firingIndex ) {
-                                                                       firingIndex--;
-                                                               }
-                                                       }
+                       }
+
+                       return results;
+               };
+
+               Sizzle.matches = function( expr, set ) {
+                       return Sizzle( expr, null, null, set );
+               };
+
+               Sizzle.matchesSelector = function( node, expr ) {
+                       return Sizzle( expr, null, null, [node] ).length > 0;
+               };
+
+               Sizzle.find = function( expr, context, isXML ) {
+                       var set, i, len, match, type, left;
+
+                       if ( !expr ) {
+                               return [];
+                       }
+
+                       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+                               type = Expr.order[i];
+
+                               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                                       left = match[1];
+                                       match.splice( 1, 1 );
+
+                                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                                               match[1] = (match[1] || "").replace( rBackslash, "" );
+                                               set = Expr.find[ type ]( match, context, isXML );
+
+                                               if ( set != null ) {
+                                                       expr = expr.replace( Expr.match[ type ], "" );
+                                                       break;
                                                }
-                                       });
-                               }
-                               return this;
-                       },
-                       // Control if a given callback is in the list
-                       has: function( fn ) {
-                               return jQuery.inArray( fn, list ) > -1;
-                       },
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               list = [];
-                               return this;
-                       },
-                       // Have the list do nothing anymore
-                       disable: function() {
-                               list = stack = memory = undefined;
-                               return this;
-                       },
-                       // Is it disabled?
-                       disabled: function() {
-                               return !list;
-                       },
-                       // Lock the list in its current state
-                       lock: function() {
-                               stack = undefined;
-                               if ( !memory ) {
-                                       self.disable();
-                               }
-                               return this;
-                       },
-                       // Is it locked?
-                       locked: function() {
-                               return !stack;
-                       },
-                       // Call all callbacks with the given context and arguments
-                       fireWith: function( context, args ) {
-                               args = args || [];
-                               args = [ context, args.slice ? args.slice() : args ];
-                               if ( list && ( !fired || stack ) ) {
-                                       if ( firing ) {
-                                               stack.push( args );
-                                       } else {
-                                               fire( args );
                                        }
                                }
-                               return this;
-                       },
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-                       // To know if the callbacks have already been called at least once
-                       fired: function() {
-                               return !!fired;
                        }
+
+                       if ( !set ) {
+                               set = typeof context.getElementsByTagName !== "undefined" ?
+                                       context.getElementsByTagName( "*" ) :
+                                       [];
+                       }
+
+                       return { set: set, expr: expr };
                };
 
-       return self;
-};
-jQuery.extend({
-
-       Deferred: function( func ) {
-               var tuples = [
-                               // action, add listener, listener list, final state
-                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-                               [ "notify", "progress", jQuery.Callbacks("memory") ]
-                       ],
-                       state = "pending",
-                       promise = {
-                               state: function() {
-                                       return state;
-                               },
-                               always: function() {
-                                       deferred.done( arguments ).fail( arguments );
-                                       return this;
-                               },
-                               then: function( /* fnDone, fnFail, fnProgress */ ) {
-                                       var fns = arguments;
-                                       return jQuery.Deferred(function( newDefer ) {
-                                               jQuery.each( tuples, function( i, tuple ) {
-                                                       var action = tuple[ 0 ],
-                                                               fn = fns[ i ];
-                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
-                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
-                                                               function() {
-                                                                       var returned = fn.apply( this, arguments );
-                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                               returned.promise()
-                                                                                       .done( newDefer.resolve )
-                                                                                       .fail( newDefer.reject )
-                                                                                       .progress( newDefer.notify );
-                                                                       } else {
-                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-                                                                       }
-                                                               } :
-                                                               newDefer[ action ]
-                                                       );
-                                               });
-                                               fns = null;
-                                       }).promise();
-                               },
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is added to the object
-                               promise: function( obj ) {
-                                       return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
-                               }
-                       },
-                       deferred = {};
+               Sizzle.filter = function( expr, set, inplace, not ) {
+                       var match, anyFound,
+                               type, found, item, filter, left,
+                               i, pass,
+                               old = expr,
+                               result = [],
+                               curLoop = set,
+                               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
 
-               // Keep pipe for back-compat
-               promise.pipe = promise.then;
+                       while ( expr && set.length ) {
+                               for ( type in Expr.filter ) {
+                                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+                                               filter = Expr.filter[ type ];
+                                               left = match[1];
 
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 3 ];
+                                               anyFound = false;
 
-                       // promise[ done | fail | progress ] = list.add
-                       promise[ tuple[1] ] = list.add;
+                                               match.splice(1,1);
 
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(function() {
-                                       // state = [ resolved | rejected ]
-                                       state = stateString;
+                                               if ( left.substr( left.length - 1 ) === "\\" ) {
+                                                       continue;
+                                               }
 
-                               // [ reject_list | resolve_list ].disable; progress_list.lock
-                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-                       }
+                                               if ( curLoop === result ) {
+                                                       result = [];
+                                               }
 
-                       // deferred[ resolve | reject | notify ] = list.fire
-                       deferred[ tuple[0] ] = list.fire;
-                       deferred[ tuple[0] + "With" ] = list.fireWith;
-               });
+                                               if ( Expr.preFilter[ type ] ) {
+                                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
 
-               // Make the deferred a promise
-               promise.promise( deferred );
+                                                       if ( !match ) {
+                                                               anyFound = found = true;
 
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
+                                                       } else if ( match === true ) {
+                                                               continue;
+                                                       }
+                                               }
+
+                                               if ( match ) {
+                                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+                                                               if ( item ) {
+                                                                       found = filter( item, match, i, curLoop );
+                                                                       pass = not ^ found;
+
+                                                                       if ( inplace && found != null ) {
+                                                                               if ( pass ) {
+                                                                                       anyFound = true;
+
+                                                                               } else {
+                                                                                       curLoop[i] = false;
+                                                                               }
 
-               // All done!
-               return deferred;
-       },
+                                                                       } else if ( pass ) {
+                                                                               result.push( item );
+                                                                               anyFound = true;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
 
-       // Deferred helper
-       when: function( subordinate /* , ..., subordinateN */ ) {
-               var i = 0,
-                       resolveValues = core_slice.call( arguments ),
-                       length = resolveValues.length,
+                                               if ( found !== undefined ) {
+                                                       if ( !inplace ) {
+                                                               curLoop = result;
+                                                       }
 
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+                                                       expr = expr.replace( Expr.match[ type ], "" );
 
-                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+                                                       if ( !anyFound ) {
+                                                               return [];
+                                                       }
 
-                       // Update function for both resolve and progress values
-                       updateFunc = function( i, contexts, values ) {
-                               return function( value ) {
-                                       contexts[ i ] = this;
-                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-                                       if( values === progressValues ) {
-                                               deferred.notifyWith( contexts, values );
-                                       } else if ( !( --remaining ) ) {
-                                               deferred.resolveWith( contexts, values );
+                                                       break;
+                                               }
                                        }
-                               };
-                       },
+                               }
 
-                       progressValues, progressContexts, resolveContexts;
+                               // Improper expression
+                               if ( expr === old ) {
+                                       if ( anyFound == null ) {
+                                               Sizzle.error( expr );
 
-               // add listeners to Deferred subordinates; treat others as resolved
-               if ( length > 1 ) {
-                       progressValues = new Array( length );
-                       progressContexts = new Array( length );
-                       resolveContexts = new Array( length );
-                       for ( ; i < length; i++ ) {
-                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-                                       resolveValues[ i ].promise()
-                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
-                                               .fail( deferred.reject )
-                                               .progress( updateFunc( i, progressContexts, progressValues ) );
-                               } else {
-                                       --remaining;
+                                       } else {
+                                               break;
+                                       }
                                }
+
+                               old = expr;
                        }
-               }
 
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
-               }
+                       return curLoop;
+               };
 
-               return deferred.promise();
-       }
-});
-jQuery.support = (function() {
-
-       var support,
-               all,
-               a,
-               select,
-               opt,
-               input,
-               fragment,
-               eventName,
-               i,
-               isSupported,
-               clickFn,
-               div = document.createElement("div");
-
-       // Preliminary tests
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-       all = div.getElementsByTagName("*");
-       a = div.getElementsByTagName("a")[ 0 ];
-       a.style.cssText = "top:1px;float:left;opacity:.5";
-
-       // Can't get basic test support
-       if ( !all || !all.length || !a ) {
-               return {};
-       }
+               Sizzle.error = function( msg ) {
+                       throw new Error( "Syntax error, unrecognized expression: " + msg );
+               };
 
-       // First batch of supports tests
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
-
-       support = {
-               // IE strips leading whitespace when .innerHTML is used
-               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-               // Make sure that tbody elements aren't automatically inserted
-               // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName("tbody").length,
-
-               // Make sure that link elements get serialized correctly by innerHTML
-               // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName("link").length,
-
-               // Get the style information from getAttribute
-               // (IE uses .cssText instead)
-               style: /top/.test( a.getAttribute("style") ),
-
-               // Make sure that URLs aren't manipulated
-               // (IE normalizes it by default)
-               hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-               // Make sure that element opacity exists
-               // (IE uses filter instead)
-               // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.5/.test( a.style.opacity ),
-
-               // Verify style float existence
-               // (IE uses styleFloat instead of cssFloat)
-               cssFloat: !!a.style.cssFloat,
-
-               // Make sure that if no value is specified for a checkbox
-               // that it defaults to "on".
-               // (WebKit defaults to "" instead)
-               checkOn: ( input.value === "on" ),
-
-               // Make sure that a selected-by-default option has a working selected property.
-               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-               optSelected: opt.selected,
-
-               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-               getSetAttribute: div.className !== "t",
-
-               // Tests for enctype support on a form(#6743)
-               enctype: !!document.createElement("form").enctype,
-
-               // Makes sure cloning an html5 element does not cause problems
-               // Where outerHTML is undefined, this still works
-               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-               boxModel: ( document.compatMode === "CSS1Compat" ),
-
-               // Will be defined later
-               submitBubbles: true,
-               changeBubbles: true,
-               focusinBubbles: false,
-               deleteExpando: true,
-               noCloneEvent: true,
-               inlineBlockNeedsLayout: false,
-               shrinkWrapBlocks: false,
-               reliableMarginRight: true,
-               boxSizingReliable: true,
-               pixelPosition: false
-       };
+               /**
+                * Utility function for retreiving the text value of an array of DOM nodes
+                * @param {Array|Element} elem
+                */
+               var getText = Sizzle.getText = function( elem ) {
+                       var i, node,
+                               nodeType = elem.nodeType,
+                               ret = "";
+
+                       if ( nodeType ) {
+                               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+                                       // Use textContent || innerText for elements
+                                       if ( typeof elem.textContent === 'string' ) {
+                                               return elem.textContent;
+                                       } else if ( typeof elem.innerText === 'string' ) {
+                                               // Replace IE's carriage returns
+                                               return elem.innerText.replace( rReturn, '' );
+                                       } else {
+                                               // Traverse it's children
+                                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+                                                       ret += getText( elem );
+                                               }
+                                       }
+                               } else if ( nodeType === 3 || nodeType === 4 ) {
+                                       return elem.nodeValue;
+                               }
+                       } else {
 
-       // Make sure checked status is properly cloned
-       input.checked = true;
-       support.noCloneChecked = input.cloneNode( true ).checked;
+                               // If no nodeType, this is expected to be an array
+                               for ( i = 0; (node = elem[i]); i++ ) {
+                                       // Do not traverse comment nodes
+                                       if ( node.nodeType !== 8 ) {
+                                               ret += getText( node );
+                                       }
+                               }
+                       }
+                       return ret;
+               };
 
-       // Make sure that the options inside disabled selects aren't marked as disabled
-       // (WebKit marks them as disabled)
-       select.disabled = true;
-       support.optDisabled = !opt.disabled;
+               var Expr = Sizzle.selectors = {
+                       order: [ "ID", "NAME", "TAG" ],
+
+                       match: {
+                               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+                               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+                               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+                               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+                               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+                               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+                               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+                               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+                       },
 
-       // Test to see if it's possible to delete an expando from an element
-       // Fails in Internet Explorer
-       try {
-               delete div.test;
-       } catch( e ) {
-               support.deleteExpando = false;
-       }
+                       leftMatch: {},
 
-       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-               div.attachEvent( "onclick", clickFn = function() {
-                       // Cloning a node shouldn't copy over any
-                       // bound event handlers (IE does this)
-                       support.noCloneEvent = false;
-               });
-               div.cloneNode( true ).fireEvent("onclick");
-               div.detachEvent( "onclick", clickFn );
-       }
+                       attrMap: {
+                               "class": "className",
+                               "for": "htmlFor"
+                       },
 
-       // Check if a radio maintains its value
-       // after being appended to the DOM
-       input = document.createElement("input");
-       input.value = "t";
-       input.setAttribute( "type", "radio" );
-       support.radioValue = input.value === "t";
-
-       input.setAttribute( "checked", "checked" );
-
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       input.setAttribute( "name", "t" );
-
-       div.appendChild( input );
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( div.lastChild );
-
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
-
-       fragment.removeChild( input );
-       fragment.appendChild( div );
-
-       // Technique from Juriy Zaytsev
-       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-       // We only care about the case where non-standard event systems
-       // are used, namely in IE. Short-circuiting here helps us to
-       // avoid an eval call (in setAttribute) which can cause CSP
-       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-       if ( div.attachEvent ) {
-               for ( i in {
-                       submit: true,
-                       change: true,
-                       focusin: true
-               }) {
-                       eventName = "on" + i;
-                       isSupported = ( eventName in div );
-                       if ( !isSupported ) {
-                               div.setAttribute( eventName, "return;" );
-                               isSupported = ( typeof div[ eventName ] === "function" );
-                       }
-                       support[ i + "Bubbles" ] = isSupported;
-               }
-       }
+                       attrHandle: {
+                               href: function( elem ) {
+                                       return elem.getAttribute( "href" );
+                               },
+                               type: function( elem ) {
+                                       return elem.getAttribute( "type" );
+                               }
+                       },
 
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, div, tds, marginDiv,
-                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
-                       body = document.getElementsByTagName("body")[0];
+                       relative: {
+                               "+": function(checkSet, part){
+                                       var isPartStr = typeof part === "string",
+                                               isTag = isPartStr && !rNonWord.test( part ),
+                                               isPartStrNotTag = isPartStr && !isTag;
 
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
+                                       if ( isTag ) {
+                                               part = part.toLowerCase();
+                                       }
 
-               container = document.createElement("div");
-               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
-               body.insertBefore( container, body.firstChild );
-
-               // Construct the test element
-               div = document.createElement("div");
-               container.appendChild( div );
-
-               // Check if table cells still have offsetWidth/Height when they are set
-               // to display:none and there are still other visible table cells in a
-               // table row; if so, offsetWidth/Height are not reliable for use when
-               // determining if an element has been hidden directly using
-               // display:none (it is still safe to use offsets if a parent element is
-               // hidden; don safety goggles and see bug #4512 for more information).
-               // (only IE 8 fails this test)
-               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName("td");
-               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-               isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-               tds[ 0 ].style.display = "";
-               tds[ 1 ].style.display = "none";
-
-               // Check if empty table cells still have offsetWidth/Height
-               // (IE <= 8 fail this test)
-               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-               // Check box-sizing and margin behavior
-               div.innerHTML = "";
-               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-               support.boxSizing = ( div.offsetWidth === 4 );
-               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
-               // NOTE: To any future maintainer, we've window.getComputedStyle
-               // because jsdom on node.js will break without it.
-               if ( window.getComputedStyle ) {
-                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+                                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                                               if ( (elem = checkSet[i]) ) {
+                                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
 
-                       // Check if div with explicit width and no margin-right incorrectly
-                       // gets computed margin-right based on width of container. For more
-                       // info see bug #3333
-                       // Fails in WebKit before Feb 2011 nightlies
-                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       marginDiv = document.createElement("div");
-                       marginDiv.style.cssText = div.style.cssText = divReset;
-                       marginDiv.style.marginRight = marginDiv.style.width = "0";
-                       div.style.width = "1px";
-                       div.appendChild( marginDiv );
-                       support.reliableMarginRight =
-                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-               }
+                                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+                                                               elem || false :
+                                                               elem === part;
+                                               }
+                                       }
 
-               if ( typeof div.style.zoom !== "undefined" ) {
-                       // Check if natively block-level elements act like inline-block
-                       // elements when setting their display to 'inline' and giving
-                       // them layout
-                       // (IE < 8 does this)
-                       div.innerHTML = "";
-                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-                       // Check if elements with layout shrink-wrap their children
-                       // (IE 6 does this)
-                       div.style.display = "block";
-                       div.style.overflow = "visible";
-                       div.innerHTML = "<div></div>";
-                       div.firstChild.style.width = "5px";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-                       container.style.zoom = 1;
-               }
+                                       if ( isPartStrNotTag ) {
+                                               Sizzle.filter( part, checkSet, true );
+                                       }
+                               },
 
-               // Null elements to avoid leaks in IE
-               body.removeChild( container );
-               container = div = tds = marginDiv = null;
-       });
+                               ">": function( checkSet, part ) {
+                                       var elem,
+                                               isPartStr = typeof part === "string",
+                                               i = 0,
+                                               l = checkSet.length;
 
-       // Null elements to avoid leaks in IE
-       fragment.removeChild( div );
-       all = a = select = opt = input = fragment = div = null;
+                                       if ( isPartStr && !rNonWord.test( part ) ) {
+                                               part = part.toLowerCase();
 
-       return support;
-})();
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
+                                               for ( ; i < l; i++ ) {
+                                                       elem = checkSet[i];
 
-jQuery.extend({
-       cache: {},
+                                                       if ( elem ) {
+                                                               var parent = elem.parentNode;
+                                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+                                                       }
+                                               }
 
-       deletedIds: [],
+                                       } else {
+                                               for ( ; i < l; i++ ) {
+                                                       elem = checkSet[i];
 
-       // Please use with caution
-       uuid: 0,
+                                                       if ( elem ) {
+                                                               checkSet[i] = isPartStr ?
+                                                                       elem.parentNode :
+                                                                       elem.parentNode === part;
+                                                       }
+                                               }
 
-       // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+                                               if ( isPartStr ) {
+                                                       Sizzle.filter( part, checkSet, true );
+                                               }
+                                       }
+                               },
 
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
-       noData: {
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-               "applet": true
-       },
+                               "": function(checkSet, part, isXML){
+                                       var nodeCheck,
+                                               doneName = done++,
+                                               checkFn = dirCheck;
 
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
+                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                                               part = part.toLowerCase();
+                                               nodeCheck = part;
+                                               checkFn = dirNodeCheck;
+                                       }
 
-       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+                                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+                               },
 
-               var thisCache, ret,
-                       internalKey = jQuery.expando,
-                       getByName = typeof name === "string",
+                               "~": function( checkSet, part, isXML ) {
+                                       var nodeCheck,
+                                               doneName = done++,
+                                               checkFn = dirCheck;
 
-                       // We have to handle DOM nodes and JS objects differently because IE6-7
-                       // can't GC object references properly across the DOM-JS boundary
-                       isNode = elem.nodeType,
+                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                                               part = part.toLowerCase();
+                                               nodeCheck = part;
+                                               checkFn = dirNodeCheck;
+                                       }
 
-                       // Only DOM nodes need the global jQuery cache; JS object data is
-                       // attached directly to the object so GC can occur automatically
-                       cache = isNode ? jQuery.cache : elem,
+                                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+                               }
+                       },
 
-                       // Only defining an ID for JS objects if its cache already exists allows
-                       // the code to shortcut on the same path as a DOM node with no cache
-                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+                       find: {
+                               ID: function( match, context, isXML ) {
+                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                                               var m = context.getElementById(match[1]);
+                                               // Check parentNode to catch when Blackberry 4.6 returns
+                                               // nodes that are no longer in the document #6963
+                                               return m && m.parentNode ? [m] : [];
+                                       }
+                               },
 
-               // Avoid doing any more work than we need to when trying to get data on an
-               // object that has no data at all
-               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-                       return;
-               }
+                               NAME: function( match, context ) {
+                                       if ( typeof context.getElementsByName !== "undefined" ) {
+                                               var ret = [],
+                                                       results = context.getElementsByName( match[1] );
 
-               if ( !id ) {
-                       // Only DOM nodes need a new unique ID for each element since their data
-                       // ends up in the global cache
-                       if ( isNode ) {
-                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
-                       } else {
-                               id = internalKey;
-                       }
-               }
+                                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                                               ret.push( results[i] );
+                                                       }
+                                               }
+
+                                               return ret.length === 0 ? null : ret;
+                                       }
+                               },
 
-               if ( !cache[ id ] ) {
-                       cache[ id ] = {};
+                               TAG: function( match, context ) {
+                                       if ( typeof context.getElementsByTagName !== "undefined" ) {
+                                               return context.getElementsByTagName( match[1] );
+                                       }
+                               }
+                       },
+                       preFilter: {
+                               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+                                       match = " " + match[1].replace( rBackslash, "" ) + " ";
 
-                       // Avoids exposing jQuery metadata on plain JS objects when the object
-                       // is serialized using JSON.stringify
-                       if ( !isNode ) {
-                               cache[ id ].toJSON = jQuery.noop;
-                       }
-               }
+                                       if ( isXML ) {
+                                               return match;
+                                       }
 
-               // An object can be passed to jQuery.data instead of a key/value pair; this gets
-               // shallow copied over onto the existing cache
-               if ( typeof name === "object" || typeof name === "function" ) {
-                       if ( pvt ) {
-                               cache[ id ] = jQuery.extend( cache[ id ], name );
-                       } else {
-                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-                       }
-               }
+                                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                                               if ( elem ) {
+                                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+                                                               if ( !inplace ) {
+                                                                       result.push( elem );
+                                                               }
 
-               thisCache = cache[ id ];
+                                                       } else if ( inplace ) {
+                                                               curLoop[i] = false;
+                                                       }
+                                               }
+                                       }
 
-               // jQuery data() is stored in a separate object inside the object's internal data
-               // cache in order to avoid key collisions between internal data and user-defined
-               // data.
-               if ( !pvt ) {
-                       if ( !thisCache.data ) {
-                               thisCache.data = {};
-                       }
+                                       return false;
+                               },
 
-                       thisCache = thisCache.data;
-               }
+                               ID: function( match ) {
+                                       return match[1].replace( rBackslash, "" );
+                               },
 
-               if ( data !== undefined ) {
-                       thisCache[ jQuery.camelCase( name ) ] = data;
-               }
+                               TAG: function( match, curLoop ) {
+                                       return match[1].replace( rBackslash, "" ).toLowerCase();
+                               },
+
+                               CHILD: function( match ) {
+                                       if ( match[1] === "nth" ) {
+                                               if ( !match[2] ) {
+                                                       Sizzle.error( match[0] );
+                                               }
+
+                                               match[2] = match[2].replace(/^\+|\s*/g, '');
+
+                                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+                                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+                                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+                                                               !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+                                               // calculate the numbers (first)n+(last) including if they are negative
+                                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                                               match[3] = test[3] - 0;
+                                       }
+                                       else if ( match[2] ) {
+                                               Sizzle.error( match[0] );
+                                       }
+
+                                       // TODO: Move to normal caching system
+                                       match[0] = done++;
+
+                                       return match;
+                               },
+
+                               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+                                       var name = match[1] = match[1].replace( rBackslash, "" );
 
-               // Check for both converted-to-camel and non-converted data property names
-               // If a data property was specified
-               if ( getByName ) {
+                                       if ( !isXML && Expr.attrMap[name] ) {
+                                               match[1] = Expr.attrMap[name];
+                                       }
 
-                       // First Try to find as-is property data
-                       ret = thisCache[ name ];
+                                       // Handle if an un-quoted value was used
+                                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
 
-                       // Test for null|undefined property data
-                       if ( ret == null ) {
+                                       if ( match[2] === "~=" ) {
+                                               match[4] = " " + match[4] + " ";
+                                       }
 
-                               // Try to find the camelCased property
-                               ret = thisCache[ jQuery.camelCase( name ) ];
-                       }
-               } else {
-                       ret = thisCache;
-               }
+                                       return match;
+                               },
 
-               return ret;
-       },
+                               PSEUDO: function( match, curLoop, inplace, result, not ) {
+                                       if ( match[1] === "not" ) {
+                                               // If we're dealing with a complex expression, or a simple one
+                                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                                       match[3] = Sizzle(match[3], null, null, curLoop);
 
-       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+                                               } else {
+                                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
 
-               var thisCache, i, l,
+                                                       if ( !inplace ) {
+                                                               result.push.apply( result, ret );
+                                                       }
 
-                       isNode = elem.nodeType,
+                                                       return false;
+                                               }
 
-                       // See jQuery.data for more information
-                       cache = isNode ? jQuery.cache : elem,
-                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+                                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                                               return true;
+                                       }
 
-               // If there is already no cache entry for this object, there is no
-               // purpose in continuing
-               if ( !cache[ id ] ) {
-                       return;
-               }
+                                       return match;
+                               },
 
-               if ( name ) {
+                               POS: function( match ) {
+                                       match.unshift( true );
 
-                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+                                       return match;
+                               }
+                       },
 
-                       if ( thisCache ) {
+                       filters: {
+                               enabled: function( elem ) {
+                                       return elem.disabled === false && elem.type !== "hidden";
+                               },
 
-                               // Support array or space separated string names for data keys
-                               if ( !jQuery.isArray( name ) ) {
+                               disabled: function( elem ) {
+                                       return elem.disabled === true;
+                               },
 
-                                       // try the string as a key before any manipulation
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
+                               checked: function( elem ) {
+                                       return elem.checked === true;
+                               },
 
-                                               // split the camel cased version by spaces unless a key with the spaces exists
-                                               name = jQuery.camelCase( name );
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-                                                       name = name.split(" ");
-                                               }
+                               selected: function( elem ) {
+                                       // Accessing this property makes selected-by-default
+                                       // options in Safari work properly
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.selectedIndex;
                                        }
-                               }
 
-                               for ( i = 0, l = name.length; i < l; i++ ) {
-                                       delete thisCache[ name[i] ];
-                               }
+                                       return elem.selected === true;
+                               },
 
-                               // If there is no data left in the cache, we want to continue
-                               // and let the cache object itself get destroyed
-                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                                       return;
-                               }
-                       }
-               }
+                               parent: function( elem ) {
+                                       return !!elem.firstChild;
+                               },
 
-               // See jQuery.data for more information
-               if ( !pvt ) {
-                       delete cache[ id ].data;
+                               empty: function( elem ) {
+                                       return !elem.firstChild;
+                               },
 
-                       // Don't destroy the parent cache unless the internal data object
-                       // had been the only thing left in it
-                       if ( !isEmptyDataObject( cache[ id ] ) ) {
-                               return;
-                       }
-               }
+                               has: function( elem, i, match ) {
+                                       return !!Sizzle( match[3], elem ).length;
+                               },
 
-               // Destroy the cache
-               if ( isNode ) {
-                       jQuery.cleanData( [ elem ], true );
+                               header: function( elem ) {
+                                       return (/h\d/i).test( elem.nodeName );
+                               },
 
-               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-                       delete cache[ id ];
+                               text: function( elem ) {
+                                       var attr = elem.getAttribute( "type" ), type = elem.type;
+                                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+                                       // use getAttribute instead to test this case
+                                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+                               },
 
-               // When all else fails, null
-               } else {
-                       cache[ id ] = null;
-               }
-       },
+                               radio: function( elem ) {
+                                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+                               },
+
+                               checkbox: function( elem ) {
+                                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+                               },
 
-       // For internal use only.
-       _data: function( elem, name, data ) {
-               return jQuery.data( elem, name, data, true );
-       },
+                               file: function( elem ) {
+                                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+                               },
 
-       // A method for determining if a DOM node can handle the data expando
-       acceptData: function( elem ) {
-               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+                               password: function( elem ) {
+                                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+                               },
 
-               // nodes accept data unless otherwise specified; rejection can be conditional
-               return !noData || noData !== true && elem.getAttribute("classid") === noData;
-       }
-});
+                               submit: function( elem ) {
+                                       var name = elem.nodeName.toLowerCase();
+                                       return (name === "input" || name === "button") && "submit" === elem.type;
+                               },
 
-jQuery.fn.extend({
-       data: function( key, value ) {
-               var parts, part, attr, name, l,
-                       elem = this[0],
-                       i = 0,
-                       data = null;
+                               image: function( elem ) {
+                                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+                               },
 
-               // Gets all values
-               if ( key === undefined ) {
-                       if ( this.length ) {
-                               data = jQuery.data( elem );
+                               reset: function( elem ) {
+                                       var name = elem.nodeName.toLowerCase();
+                                       return (name === "input" || name === "button") && "reset" === elem.type;
+                               },
 
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                       attr = elem.attributes;
-                                       for ( l = attr.length; i < l; i++ ) {
-                                               name = attr[i].name;
+                               button: function( elem ) {
+                                       var name = elem.nodeName.toLowerCase();
+                                       return name === "input" && "button" === elem.type || name === "button";
+                               },
 
-                                               if ( name.indexOf( "data-" ) === 0 ) {
-                                                       name = jQuery.camelCase( name.substring(5) );
+                               input: function( elem ) {
+                                       return (/input|select|textarea|button/i).test( elem.nodeName );
+                               },
 
-                                                       dataAttr( elem, name, data[ name ] );
-                                               }
-                                       }
-                                       jQuery._data( elem, "parsedAttrs", true );
+                               focus: function( elem ) {
+                                       return elem === elem.ownerDocument.activeElement;
                                }
-                       }
-
-                       return data;
-               }
+                       },
+                       setFilters: {
+                               first: function( elem, i ) {
+                                       return i === 0;
+                               },
 
-               // Sets multiple values
-               if ( typeof key === "object" ) {
-                       return this.each(function() {
-                               jQuery.data( this, key );
-                       });
-               }
+                               last: function( elem, i, match, array ) {
+                                       return i === array.length - 1;
+                               },
 
-               parts = key.split( ".", 2 );
-               parts[1] = parts[1] ? "." + parts[1] : "";
-               part = parts[1] + "!";
+                               even: function( elem, i ) {
+                                       return i % 2 === 0;
+                               },
 
-               return jQuery.access( this, function( value ) {
+                               odd: function( elem, i ) {
+                                       return i % 2 === 1;
+                               },
 
-                       if ( value === undefined ) {
-                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+                               lt: function( elem, i, match ) {
+                                       return i < match[3] - 0;
+                               },
 
-                               // Try to fetch any internally stored data first
-                               if ( data === undefined && elem ) {
-                                       data = jQuery.data( elem, key );
-                                       data = dataAttr( elem, key, data );
-                               }
+                               gt: function( elem, i, match ) {
+                                       return i > match[3] - 0;
+                               },
 
-                               return data === undefined && parts[1] ?
-                                       this.data( parts[0] ) :
-                                       data;
-                       }
+                               nth: function( elem, i, match ) {
+                                       return match[3] - 0 === i;
+                               },
 
-                       parts[1] = value;
-                       this.each(function() {
-                               var self = jQuery( this );
+                               eq: function( elem, i, match ) {
+                                       return match[3] - 0 === i;
+                               }
+                       },
+                       filter: {
+                               PSEUDO: function( elem, match, i, array ) {
+                                       var name = match[1],
+                                               filter = Expr.filters[ name ];
 
-                               self.triggerHandler( "setData" + part, parts );
-                               jQuery.data( this, key, value );
-                               self.triggerHandler( "changeData" + part, parts );
-                       });
-               }, null, value, arguments.length > 1, null, false );
-       },
+                                       if ( filter ) {
+                                               return filter( elem, i, match, array );
 
-       removeData: function( key ) {
-               return this.each(function() {
-                       jQuery.removeData( this, key );
-               });
-       }
-});
+                                       } else if ( name === "contains" ) {
+                                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
 
-function dataAttr( elem, key, data ) {
-       // If nothing was found internally, try to fetch any
-       // data from the HTML5 data-* attribute
-       if ( data === undefined && elem.nodeType === 1 ) {
+                                       } else if ( name === "not" ) {
+                                               var not = match[3];
 
-               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+                                               for ( var j = 0, l = not.length; j < l; j++ ) {
+                                                       if ( not[j] === elem ) {
+                                                               return false;
+                                                       }
+                                               }
 
-               data = elem.getAttribute( name );
+                                               return true;
 
-               if ( typeof data === "string" ) {
-                       try {
-                               data = data === "true" ? true :
-                               data === "false" ? false :
-                               data === "null" ? null :
-                               // Only convert to a number if it doesn't change the string
-                               +data + "" === data ? +data :
-                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                       data;
-                       } catch( e ) {}
-
-                       // Make sure we set the data so it isn't changed later
-                       jQuery.data( elem, key, data );
+                                       } else {
+                                               Sizzle.error( name );
+                                       }
+                               },
 
-               } else {
-                       data = undefined;
-               }
-       }
+                               CHILD: function( elem, match ) {
+                                       var first, last,
+                                               doneName, parent, cache,
+                                               count, diff,
+                                               type = match[1],
+                                               node = elem;
+
+                                       switch ( type ) {
+                                               case "only":
+                                               case "first":
+                                                       while ( (node = node.previousSibling) ) {
+                                                               if ( node.nodeType === 1 ) {
+                                                                       return false;
+                                                               }
+                                                       }
 
-       return data;
-}
+                                                       if ( type === "first" ) {
+                                                               return true;
+                                                       }
 
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
+                                                       node = elem;
 
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
-               }
-               if ( name !== "toJSON" ) {
-                       return false;
-               }
-       }
+                                               /* falls through */
+                                               case "last":
+                                                       while ( (node = node.nextSibling) ) {
+                                                               if ( node.nodeType === 1 ) {
+                                                                       return false;
+                                                               }
+                                                       }
 
-       return true;
-}
-jQuery.extend({
-       queue: function( elem, type, data ) {
-               var queue;
+                                                       return true;
 
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
+                                               case "nth":
+                                                       first = match[2];
+                                                       last = match[3];
 
-                       // Speed up dequeue by getting out quickly if this is just a lookup
-                       if ( data ) {
-                               if ( !queue || jQuery.isArray(data) ) {
-                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-                               } else {
-                                       queue.push( data );
-                               }
-                       }
-                       return queue || [];
-               }
-       },
+                                                       if ( first === 1 && last === 0 ) {
+                                                               return true;
+                                                       }
 
-       dequeue: function( elem, type ) {
-               type = type || "fx";
+                                                       doneName = match[0];
+                                                       parent = elem.parentNode;
 
-               var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
-                       fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
+                                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+                                                               count = 0;
 
-               // If the fx queue is dequeued, always remove the progress sentinel
-               if ( fn === "inprogress" ) {
-                       fn = queue.shift();
-                       startLength--;
-               }
+                                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                                       if ( node.nodeType === 1 ) {
+                                                                               node.nodeIndex = ++count;
+                                                                       }
+                                                               }
 
-               if ( fn ) {
+                                                               parent[ expando ] = doneName;
+                                                       }
 
-                       // Add a progress sentinel to prevent the fx queue from being
-                       // automatically dequeued
-                       if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
-                       }
+                                                       diff = elem.nodeIndex - last;
 
-                       // clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
-               }
+                                                       if ( first === 0 ) {
+                                                               return diff === 0;
 
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
-               }
-       },
-
-       // not intended for public consumption - generates a queueHooks object, or returns the current one
-       _queueHooks: function( elem, type ) {
-               var key = type + "queueHooks";
-               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-                       empty: jQuery.Callbacks("once memory").add(function() {
-                               jQuery.removeData( elem, type + "queue", true );
-                               jQuery.removeData( elem, key, true );
-                       })
-               });
-       }
-});
+                                                       } else {
+                                                               return ( diff % first === 0 && diff / first >= 0 );
+                                                       }
+                                       }
+                               },
 
-jQuery.fn.extend({
-       queue: function( type, data ) {
-               var setter = 2;
+                               ID: function( elem, match ) {
+                                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
+                               },
 
-               if ( typeof type !== "string" ) {
-                       data = type;
-                       type = "fx";
-                       setter--;
-               }
+                               TAG: function( elem, match ) {
+                                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+                               },
 
-               if ( arguments.length < setter ) {
-                       return jQuery.queue( this[0], type );
-               }
+                               CLASS: function( elem, match ) {
+                                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                                               .indexOf( match ) > -1;
+                               },
 
-               return data === undefined ?
-                       this :
-                       this.each(function() {
-                               var queue = jQuery.queue( this, type, data );
+                               ATTR: function( elem, match ) {
+                                       var name = match[1],
+                                               result = Sizzle.attr ?
+                                                       Sizzle.attr( elem, name ) :
+                                                       Expr.attrHandle[ name ] ?
+                                                               Expr.attrHandle[ name ]( elem ) :
+                                                               elem[ name ] != null ?
+                                                                       elem[ name ] :
+                                                                       elem.getAttribute( name ),
+                                               value = result + "",
+                                               type = match[2],
+                                               check = match[4];
+
+                                       return result == null ?
+                                               type === "!=" :
+                                               !type && Sizzle.attr ?
+                                                       result != null :
+                                                       type === "=" ?
+                                                               value === check :
+                                                               type === "*=" ?
+                                                                       value.indexOf(check) >= 0 :
+                                                                       type === "~=" ?
+                                                                               (" " + value + " ").indexOf(check) >= 0 :
+                                                                               !check ?
+                                                                                       value && result !== false :
+                                                                                       type === "!=" ?
+                                                                                               value !== check :
+                                                                                               type === "^=" ?
+                                                                                                       value.indexOf(check) === 0 :
+                                                                                                       type === "$=" ?
+                                                                                                               value.substr(value.length - check.length) === check :
+                                                                                                               type === "|=" ?
+                                                                                                                       value === check || value.substr(0, check.length + 1) === check + "-" :
+                                                                                                                       false;
+                               },
 
-                               // ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
+                               POS: function( elem, match, i, array ) {
+                                       var name = match[2],
+                                               filter = Expr.setFilters[ name ];
 
-                               if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
-       },
-       dequeue: function( type ) {
-               return this.each(function() {
-                       jQuery.dequeue( this, type );
-               });
-       },
-       // Based off of the plugin by Clint Helfers, with permission.
-       // http://blindsignals.com/index.php/2009/07/jquery-delay/
-       delay: function( time, type ) {
-               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-               type = type || "fx";
-
-               return this.queue( type, function( next, hooks ) {
-                       var timeout = setTimeout( next, time );
-                       hooks.stop = function() {
-                               clearTimeout( timeout );
-                       };
-               });
-       },
-       clearQueue: function( type ) {
-               return this.queue( type || "fx", [] );
-       },
-       // Get a promise resolved when queues of a certain type
-       // are emptied (fx is the type by default)
-       promise: function( type, obj ) {
-               var tmp,
-                       count = 1,
-                       defer = jQuery.Deferred(),
-                       elements = this,
-                       i = this.length,
-                       resolve = function() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
+                                       if ( filter ) {
+                                               return filter( elem, i, match, array );
+                                       }
                                }
-                       };
+                       }
+               };
 
-               if ( typeof type !== "string" ) {
-                       obj = type;
-                       type = undefined;
-               }
-               type = type || "fx";
+               var origPOS = Expr.match.POS,
+                       fescape = function(all, num){
+                               return "\\" + (num - 0 + 1);
+                       };
 
-               while( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
-                               count++;
-                               tmp.empty.add( resolve );
-                       }
+               for ( var type in Expr.match ) {
+                       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+                       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
                }
-               resolve();
-               return defer.promise( obj );
-       }
-});
-var nodeHook, boolHook, fixSpecified,
-       rclass = /[\t\r\n]/g,
-       rreturn = /\r/g,
-       rtype = /^(?:button|input)$/i,
-       rfocusable = /^(?:button|input|object|select|textarea)$/i,
-       rclickable = /^a(?:rea|)$/i,
-       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-       getSetAttribute = jQuery.support.getSetAttribute;
-
-jQuery.fn.extend({
-       attr: function( name, value ) {
-               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-       },
-
-       removeAttr: function( name ) {
-               return this.each(function() {
-                       jQuery.removeAttr( this, name );
-               });
-       },
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+               Expr.match.globalPOS = origPOS;
 
-       prop: function( name, value ) {
-               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-       },
+               var makeArray = function( array, results ) {
+                       array = Array.prototype.slice.call( array, 0 );
 
-       removeProp: function( name ) {
-               name = jQuery.propFix[ name ] || name;
-               return this.each(function() {
-                       // try/catch handles cases where IE balks (such as removing a property on window)
-                       try {
-                               this[ name ] = undefined;
-                               delete this[ name ];
-                       } catch( e ) {}
-               });
-       },
+                       if ( results ) {
+                               results.push.apply( results, array );
+                               return results;
+                       }
 
-       addClass: function( value ) {
-               var classNames, i, l, elem,
-                       setClass, c, cl;
+                       return array;
+               };
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).addClass( value.call(this, j, this.className) );
-                       });
-               }
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+               try {
+                       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
-               if ( value && typeof value === "string" ) {
-                       classNames = value.split( core_rspace );
+// Provide a fallback method if it does not work
+               } catch( e ) {
+                       makeArray = function( array, results ) {
+                               var i = 0,
+                                       ret = results || [];
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
+                               if ( toString.call(array) === "[object Array]" ) {
+                                       Array.prototype.push.apply( ret, array );
 
-                               if ( elem.nodeType === 1 ) {
-                                       if ( !elem.className && classNames.length === 1 ) {
-                                               elem.className = value;
+                               } else {
+                                       if ( typeof array.length === "number" ) {
+                                               for ( var l = array.length; i < l; i++ ) {
+                                                       ret.push( array[i] );
+                                               }
 
                                        } else {
-                                               setClass = " " + elem.className + " ";
-
-                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
-                                                               setClass += classNames[ c ] + " ";
-                                                       }
+                                               for ( ; array[i]; i++ ) {
+                                                       ret.push( array[i] );
                                                }
-                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
-                       }
-               }
-
-               return this;
-       },
 
-       removeClass: function( value ) {
-               var removes, className, elem, c, cl, i, l;
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).removeClass( value.call(this, j, this.className) );
-                       });
+                               return ret;
+                       };
                }
-               if ( (value && typeof value === "string") || value === undefined ) {
-                       removes = ( value || "" ).split( core_rspace );
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
-                               if ( elem.nodeType === 1 && elem.className ) {
+               var sortOrder, siblingCheck;
 
-                                       className = (" " + elem.className + " ").replace( rclass, " " );
+               if ( document.documentElement.compareDocumentPosition ) {
+                       sortOrder = function( a, b ) {
+                               if ( a === b ) {
+                                       hasDuplicate = true;
+                                       return 0;
+                               }
 
-                                       // loop over each item in the removal list
-                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
-                                               // Remove until there is nothing to remove,
-                                               while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
-                                                       className = className.replace( " " + removes[ c ] + " " , " " );
-                                               }
-                                       }
-                                       elem.className = value ? jQuery.trim( className ) : "";
+                               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                                       return a.compareDocumentPosition ? -1 : 1;
                                }
-                       }
-               }
 
-               return this;
-       },
+                               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+                       };
 
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       isBool = typeof stateVal === "boolean";
+               } else {
+                       sortOrder = function( a, b ) {
+                               // The nodes are identical, we can exit early
+                               if ( a === b ) {
+                                       hasDuplicate = true;
+                                       return 0;
+
+                                       // Fallback to using sourceIndex (in IE) if it's available on both nodes
+                               } else if ( a.sourceIndex && b.sourceIndex ) {
+                                       return a.sourceIndex - b.sourceIndex;
+                               }
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( i ) {
-                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                       });
-               }
+                               var al, bl,
+                                       ap = [],
+                                       bp = [],
+                                       aup = a.parentNode,
+                                       bup = b.parentNode,
+                                       cur = aup;
 
-               return this.each(function() {
-                       if ( type === "string" ) {
-                               // toggle individual class names
-                               var className,
-                                       i = 0,
-                                       self = jQuery( this ),
-                                       state = stateVal,
-                                       classNames = value.split( core_rspace );
+                               // If the nodes are siblings (or identical) we can do a quick check
+                               if ( aup === bup ) {
+                                       return siblingCheck( a, b );
+
+                                       // If no parents were found then the nodes are disconnected
+                               } else if ( !aup ) {
+                                       return -1;
 
-                               while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
-                                       state = isBool ? state : !self.hasClass( className );
-                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               } else if ( !bup ) {
+                                       return 1;
                                }
 
-                       } else if ( type === "undefined" || type === "boolean" ) {
-                               if ( this.className ) {
-                                       // store className if set
-                                       jQuery._data( this, "__className__", this.className );
+                               // Otherwise they're somewhere else in the tree so we need
+                               // to build up a full list of the parentNodes for comparison
+                               while ( cur ) {
+                                       ap.unshift( cur );
+                                       cur = cur.parentNode;
                                }
 
-                               // toggle whole className
-                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-                       }
-               });
-       },
+                               cur = bup;
 
-       hasClass: function( selector ) {
-               var className = " " + selector + " ",
-                       i = 0,
-                       l = this.length;
-               for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-                               return true;
-                       }
-               }
+                               while ( cur ) {
+                                       bp.unshift( cur );
+                                       cur = cur.parentNode;
+                               }
 
-               return false;
-       },
+                               al = ap.length;
+                               bl = bp.length;
 
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[0];
+                               // Start walking down the tree looking for a discrepancy
+                               for ( var i = 0; i < al && i < bl; i++ ) {
+                                       if ( ap[i] !== bp[i] ) {
+                                               return siblingCheck( ap[i], bp[i] );
+                                       }
+                               }
 
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+                               // We ended someplace up the tree so do a sibling check
+                               return i === al ?
+                                       siblingCheck( a, bp[i], -1 ) :
+                                       siblingCheck( ap[i], b, 1 );
+                       };
 
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                       siblingCheck = function( a, b, ret ) {
+                               if ( a === b ) {
                                        return ret;
                                }
 
-                               ret = elem.value;
+                               var cur = a.nextSibling;
 
-                               return typeof ret === "string" ?
-                                       // handle most common string cases
-                                       ret.replace(rreturn, "") :
-                                       // handle cases where value is null/undef or number
-                                       ret == null ? "" : ret;
-                       }
+                               while ( cur ) {
+                                       if ( cur === b ) {
+                                               return -1;
+                                       }
 
-                       return;
+                                       cur = cur.nextSibling;
+                               }
+
+                               return 1;
+                       };
                }
 
-               isFunction = jQuery.isFunction( value );
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+               (function(){
+                       // We're going to inject a fake input element with a specified name
+                       var form = document.createElement("div"),
+                               id = "script" + (new Date()).getTime(),
+                               root = document.documentElement;
 
-               return this.each(function( i ) {
-                       var val,
-                               self = jQuery(this);
+                       form.innerHTML = "<a name='" + id + "'/>";
 
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
+                       // Inject it into the root element, check its status, and remove it quickly
+                       root.insertBefore( form, root.firstChild );
 
-                       if ( isFunction ) {
-                               val = value.call( this, i, self.val() );
-                       } else {
-                               val = value;
-                       }
+                       // The workaround has to do additional checks after a getElementById
+                       // Which slows things down for other browsers (hence the branching)
+                       if ( document.getElementById( id ) ) {
+                               Expr.find.ID = function( match, context, isXML ) {
+                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                                               var m = context.getElementById(match[1]);
 
-                       // Treat null/undefined as ""; convert numbers to string
-                       if ( val == null ) {
-                               val = "";
-                       } else if ( typeof val === "number" ) {
-                               val += "";
-                       } else if ( jQuery.isArray( val ) ) {
-                               val = jQuery.map(val, function ( value ) {
-                                       return value == null ? "" : value + "";
-                               });
-                       }
+                                               return m ?
+                                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+                                                               [m] :
+                                                               undefined :
+                                                       [];
+                                       }
+                               };
 
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+                               Expr.filter.ID = function( elem, match ) {
+                                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
 
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
+                                       return elem.nodeType === 1 && node && node.nodeValue === match;
+                               };
                        }
-               });
-       }
-});
 
-jQuery.extend({
-       valHooks: {
-               option: {
-                       get: function( elem ) {
-                               // attributes.value is undefined in Blackberry 4.7 but
-                               // uses .value. See #6932
-                               var val = elem.attributes.value;
-                               return !val || val.specified ? elem.value : elem.text;
-                       }
-               },
-               select: {
-                       get: function( elem ) {
-                               var value, i, max, option,
-                                       index = elem.selectedIndex,
-                                       values = [],
-                                       options = elem.options,
-                                       one = elem.type === "select-one";
-
-                               // Nothing was selected
-                               if ( index < 0 ) {
-                                       return null;
-                               }
+                       root.removeChild( form );
 
-                               // Loop through all the selected options
-                               i = one ? index : 0;
-                               max = one ? index + 1 : options.length;
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
+                       // release memory in IE
+                       root = form = null;
+               })();
 
-                                       // Don't return options that are disabled or in a disabled optgroup
-                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+               (function(){
+                       // Check to see if the browser returns only elements
+                       // when doing getElementsByTagName("*")
+
+                       // Create a fake element
+                       var div = document.createElement("div");
+                       div.appendChild( document.createComment("") );
+
+                       // Make sure no comments are found
+                       if ( div.getElementsByTagName("*").length > 0 ) {
+                               Expr.find.TAG = function( match, context ) {
+                                       var results = context.getElementsByTagName( match[1] );
 
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
+                                       // Filter out possible comments
+                                       if ( match[1] === "*" ) {
+                                               var tmp = [];
 
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
+                                               for ( var i = 0; results[i]; i++ ) {
+                                                       if ( results[i].nodeType === 1 ) {
+                                                               tmp.push( results[i] );
+                                                       }
                                                }
 
-                                               // Multi-Selects return an array
-                                               values.push( value );
+                                               results = tmp;
                                        }
-                               }
-
-                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-                               if ( one && !values.length && options.length ) {
-                                       return jQuery( options[ index ] ).val();
-                               }
 
-                               return values;
-                       },
+                                       return results;
+                               };
+                       }
 
-                       set: function( elem, value ) {
-                               var values = jQuery.makeArray( value );
+                       // Check to see if an attribute returns normalized href attributes
+                       div.innerHTML = "<a href='#'></a>";
 
-                               jQuery(elem).find("option").each(function() {
-                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-                               });
+                       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                               div.firstChild.getAttribute("href") !== "#" ) {
 
-                               if ( !values.length ) {
-                                       elem.selectedIndex = -1;
-                               }
-                               return values;
+                               Expr.attrHandle.href = function( elem ) {
+                                       return elem.getAttribute( "href", 2 );
+                               };
                        }
-               }
-       },
 
-       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-       attrFn: {},
+                       // release memory in IE
+                       div = null;
+               })();
 
-       attr: function( elem, name, value, pass ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
+               if ( document.querySelectorAll ) {
+                       (function(){
+                               var oldSizzle = Sizzle,
+                                       div = document.createElement("div"),
+                                       id = "__sizzle__";
 
-               // don't get/set attributes on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
+                               div.innerHTML = "<p class='TEST'></p>";
 
-               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-                       return jQuery( elem )[ name ]( value );
-               }
+                               // Safari can't handle uppercase or unicode characters when
+                               // in quirks mode.
+                               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+                                       return;
+                               }
 
-               // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === "undefined" ) {
-                       return jQuery.prop( elem, name, value );
-               }
+                               Sizzle = function( query, context, extra, seed ) {
+                                       context = context || document;
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+                                       // Only use querySelectorAll on non-XML documents
+                                       // (ID selectors don't work in non-HTML documents)
+                                       if ( !seed && !Sizzle.isXML(context) ) {
+                                               // See if we find a selector to speed up
+                                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
 
-               // All attributes are lowercase
-               // Grab necessary hook if one is defined
-               if ( notxml ) {
-                       name = name.toLowerCase();
-                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-               }
+                                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+                                                       // Speed-up: Sizzle("TAG")
+                                                       if ( match[1] ) {
+                                                               return makeArray( context.getElementsByTagName( query ), extra );
 
-               if ( value !== undefined ) {
+                                                               // Speed-up: Sizzle(".CLASS")
+                                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+                                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
+                                                       }
+                                               }
 
-                       if ( value === null ) {
-                               jQuery.removeAttr( elem, name );
-                               return;
+                                               if ( context.nodeType === 9 ) {
+                                                       // Speed-up: Sizzle("body")
+                                                       // The body element only exists once, optimize finding it
+                                                       if ( query === "body" && context.body ) {
+                                                               return makeArray( [ context.body ], extra );
+
+                                                               // Speed-up: Sizzle("#ID")
+                                                       } else if ( match && match[3] ) {
+                                                               var elem = context.getElementById( match[3] );
+
+                                                               // Check parentNode to catch when Blackberry 4.6 returns
+                                                               // nodes that are no longer in the document #6963
+                                                               if ( elem && elem.parentNode ) {
+                                                                       // Handle the case where IE and Opera return items
+                                                                       // by name instead of ID
+                                                                       if ( elem.id === match[3] ) {
+                                                                               return makeArray( [ elem ], extra );
+                                                                       }
 
-                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
+                                                               } else {
+                                                                       return makeArray( [], extra );
+                                                               }
+                                                       }
 
-                       } else {
-                               elem.setAttribute( name, "" + value );
-                               return value;
-                       }
+                                                       try {
+                                                               return makeArray( context.querySelectorAll(query), extra );
+                                                       } catch(qsaError) {}
+
+                                                       // qSA works strangely on Element-rooted queries
+                                                       // We can work around this by specifying an extra ID on the root
+                                                       // and working up from there (Thanks to Andrew Dupont for the technique)
+                                                       // IE 8 doesn't work on object elements
+                                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                                                       var oldContext = context,
+                                                               old = context.getAttribute( "id" ),
+                                                               nid = old || id,
+                                                               hasParent = context.parentNode,
+                                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+                                                       if ( !old ) {
+                                                               context.setAttribute( "id", nid );
+                                                       } else {
+                                                               nid = nid.replace( /'/g, "\\$&" );
+                                                       }
+                                                       if ( relativeHierarchySelector && hasParent ) {
+                                                               context = context.parentNode;
+                                                       }
 
-               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                       return ret;
+                                                       try {
+                                                               if ( !relativeHierarchySelector || hasParent ) {
+                                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+                                                               }
+
+                                                       } catch(pseudoError) {
+                                                       } finally {
+                                                               if ( !old ) {
+                                                                       oldContext.removeAttribute( "id" );
+                                                               }
+                                                       }
+                                               }
+                                       }
 
-               } else {
+                                       return oldSizzle(query, context, extra, seed);
+                               };
 
-                       ret = elem.getAttribute( name );
+                               for ( var prop in oldSizzle ) {
+                                       Sizzle[ prop ] = oldSizzle[ prop ];
+                               }
 
-                       // Non-existent attributes return null, we normalize to undefined
-                       return ret === null ?
-                               undefined :
-                               ret;
+                               // release memory in IE
+                               div = null;
+                       })();
                }
-       },
-
-       removeAttr: function( elem, value ) {
-               var propName, attrNames, name, isBool,
-                       i = 0;
 
-               if ( value && elem.nodeType === 1 ) {
+               (function(){
+                       var html = document.documentElement,
+                               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
 
-                       attrNames = value.split( core_rspace );
+                       if ( matches ) {
+                               // Check to see if it's possible to do matchesSelector
+                               // on a disconnected node (IE 9 fails this)
+                               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+                                       pseudoWorks = false;
 
-                       for ( ; i < attrNames.length; i++ ) {
-                               name = attrNames[ i ];
+                               try {
+                                       // This should fail with an exception
+                                       // Gecko does not error, returns false instead
+                                       matches.call( document.documentElement, "[test!='']:sizzle" );
 
-                               if ( name ) {
-                                       propName = jQuery.propFix[ name ] || name;
-                                       isBool = rboolean.test( name );
+                               } catch( pseudoError ) {
+                                       pseudoWorks = true;
+                               }
 
-                                       // See #9699 for explanation of this approach (setting first, then removal)
-                                       // Do not do this for boolean attributes (see #10870)
-                                       if ( !isBool ) {
-                                               jQuery.attr( elem, name, "" );
-                                       }
-                                       elem.removeAttribute( getSetAttribute ? name : propName );
+                               Sizzle.matchesSelector = function( node, expr ) {
+                                       // Make sure that attribute selectors are quoted
+                                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
 
-                                       // Set corresponding property to false for boolean attributes
-                                       if ( isBool && propName in elem ) {
-                                               elem[ propName ] = false;
+                                       if ( !Sizzle.isXML( node ) ) {
+                                               try {
+                                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+                                                               var ret = matches.call( node, expr );
+
+                                                               // IE 9's matchesSelector returns false on disconnected nodes
+                                                               if ( ret || !disconnectedMatch ||
+                                                                       // As well, disconnected nodes are said to be in a document
+                                                                       // fragment in IE 9, so check for that
+                                                                       node.document && node.document.nodeType !== 11 ) {
+                                                                       return ret;
+                                                               }
+                                                       }
+                                               } catch(e) {}
                                        }
-                               }
-                       }
-               }
-       },
 
-       attrHooks: {
-               type: {
-                       set: function( elem, value ) {
-                               // We can't allow the type property to be changed (since it causes problems in IE)
-                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                       jQuery.error( "type property can't be changed" );
-                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                       // Setting the type on a radio button after the value resets the value in IE6-9
-                                       // Reset value to it's default in case type is set after value
-                                       // This is for element creation
-                                       var val = elem.value;
-                                       elem.setAttribute( "type", value );
-                                       if ( val ) {
-                                               elem.value = val;
-                                       }
-                                       return value;
-                               }
-                       }
-               },
-               // Use the value property for back compat
-               // Use the nodeHook for button elements in IE6/7 (#1954)
-               value: {
-                       get: function( elem, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.get( elem, name );
-                               }
-                               return name in elem ?
-                                       elem.value :
-                                       null;
-                       },
-                       set: function( elem, value, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.set( elem, value, name );
-                               }
-                               // Does not return so that setAttribute is also used
-                               elem.value = value;
+                                       return Sizzle(expr, null, null, [node]).length > 0;
+                               };
                        }
-               }
-       },
-
-       propFix: {
-               tabindex: "tabIndex",
-               readonly: "readOnly",
-               "for": "htmlFor",
-               "class": "className",
-               maxlength: "maxLength",
-               cellspacing: "cellSpacing",
-               cellpadding: "cellPadding",
-               rowspan: "rowSpan",
-               colspan: "colSpan",
-               usemap: "useMap",
-               frameborder: "frameBorder",
-               contenteditable: "contentEditable"
-       },
-
-       prop: function( elem, name, value ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
-
-               // don't get/set properties on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
+               })();
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+               (function(){
+                       var div = document.createElement("div");
 
-               if ( notxml ) {
-                       // Fix name and attach hooks
-                       name = jQuery.propFix[ name ] || name;
-                       hooks = jQuery.propHooks[ name ];
-               }
-
-               if ( value !== undefined ) {
-                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
+                       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
 
-                       } else {
-                               return ( elem[ name ] = value );
+                       // Opera can't find a second classname (in 9.6)
+                       // Also, make sure that getElementsByClassName actually exists
+                       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+                               return;
                        }
 
-               } else {
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
+                       // Safari caches class attributes, doesn't catch changes (in 3.2)
+                       div.lastChild.className = "e";
 
-                       } else {
-                               return elem[ name ];
+                       if ( div.getElementsByClassName("e").length === 1 ) {
+                               return;
                        }
-               }
-       },
 
-       propHooks: {
-               tabIndex: {
-                       get: function( elem ) {
-                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               var attributeNode = elem.getAttributeNode("tabindex");
-
-                               return attributeNode && attributeNode.specified ?
-                                       parseInt( attributeNode.value, 10 ) :
-                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                               0 :
-                                               undefined;
-                       }
-               }
-       }
-});
+                       Expr.order.splice(1, 0, "CLASS");
+                       Expr.find.CLASS = function( match, context, isXML ) {
+                               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                                       return context.getElementsByClassName(match[1]);
+                               }
+                       };
 
-// Hook for boolean attributes
-boolHook = {
-       get: function( elem, name ) {
-               // Align boolean attributes with corresponding properties
-               // Fall back to attribute presence where some booleans are not supported
-               var attrNode,
-                       property = jQuery.prop( elem, name );
-               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-                       name.toLowerCase() :
-                       undefined;
-       },
-       set: function( elem, value, name ) {
-               var propName;
-               if ( value === false ) {
-                       // Remove boolean attributes when set to false
-                       jQuery.removeAttr( elem, name );
-               } else {
-                       // value is true since we know at this point it's type boolean and not false
-                       // Set boolean attributes to the same name and set the DOM property
-                       propName = jQuery.propFix[ name ] || name;
-                       if ( propName in elem ) {
-                               // Only set the IDL specifically if it already exists on the element
-                               elem[ propName ] = true;
-                       }
+                       // release memory in IE
+                       div = null;
+               })();
 
-                       elem.setAttribute( name, name.toLowerCase() );
-               }
-               return name;
-       }
-};
+               function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                               var elem = checkSet[i];
 
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
+                               if ( elem ) {
+                                       var match = false;
 
-       fixSpecified = {
-               name: true,
-               id: true,
-               coords: true
-       };
+                                       elem = elem[dir];
 
-       // Use this for any attribute in IE6/7
-       // This fixes almost every IE6/7 issue
-       nodeHook = jQuery.valHooks.button = {
-               get: function( elem, name ) {
-                       var ret;
-                       ret = elem.getAttributeNode( name );
-                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
-                               ret.value :
-                               undefined;
-               },
-               set: function( elem, value, name ) {
-                       // Set the existing or create a new attribute node
-                       var ret = elem.getAttributeNode( name );
-                       if ( !ret ) {
-                               ret = document.createAttribute( name );
-                               elem.setAttributeNode( ret );
-                       }
-                       return ( ret.value = value + "" );
-               }
-       };
+                                       while ( elem ) {
+                                               if ( elem[ expando ] === doneName ) {
+                                                       match = checkSet[elem.sizset];
+                                                       break;
+                                               }
 
-       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-       // This is for removals
-       jQuery.each([ "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       set: function( elem, value ) {
-                               if ( value === "" ) {
-                                       elem.setAttribute( name, "auto" );
-                                       return value;
-                               }
-                       }
-               });
-       });
+                                               if ( elem.nodeType === 1 && !isXML ){
+                                                       elem[ expando ] = doneName;
+                                                       elem.sizset = i;
+                                               }
 
-       // Set contenteditable to false on removals(#10429)
-       // Setting to empty string throws an error as an invalid value
-       jQuery.attrHooks.contenteditable = {
-               get: nodeHook.get,
-               set: function( elem, value, name ) {
-                       if ( value === "" ) {
-                               value = "false";
-                       }
-                       nodeHook.set( elem, value, name );
-               }
-       };
-}
+                                               if ( elem.nodeName.toLowerCase() === cur ) {
+                                                       match = elem;
+                                                       break;
+                                               }
 
+                                               elem = elem[dir];
+                                       }
 
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
-       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       get: function( elem ) {
-                               var ret = elem.getAttribute( name, 2 );
-                               return ret === null ? undefined : ret;
+                                       checkSet[i] = match;
+                               }
                        }
-               });
-       });
-}
-
-if ( !jQuery.support.style ) {
-       jQuery.attrHooks.style = {
-               get: function( elem ) {
-                       // Return undefined in the case of empty string
-                       // Normalize to lowercase since IE uppercases css property names
-                       return elem.style.cssText.toLowerCase() || undefined;
-               },
-               set: function( elem, value ) {
-                       return ( elem.style.cssText = "" + value );
                }
-       };
-}
 
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-               get: function( elem ) {
-                       var parent = elem.parentNode;
+               function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+                               var elem = checkSet[i];
 
-                       if ( parent ) {
-                               parent.selectedIndex;
+                               if ( elem ) {
+                                       var match = false;
 
-                               // Make sure that it also works with optgroups, see #5701
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
-                       }
-                       return null;
-               }
-       });
-}
+                                       elem = elem[dir];
 
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
-}
+                                       while ( elem ) {
+                                               if ( elem[ expando ] === doneName ) {
+                                                       match = checkSet[elem.sizset];
+                                                       break;
+                                               }
 
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-       jQuery.each([ "radio", "checkbox" ], function() {
-               jQuery.valHooks[ this ] = {
-                       get: function( elem ) {
-                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-                               return elem.getAttribute("value") === null ? "on" : elem.value;
-                       }
-               };
-       });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-               set: function( elem, value ) {
-                       if ( jQuery.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                       }
-               }
-       });
-});
-var rformElems = /^(?:textarea|input|select)$/i,
-       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
-       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-       rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|contextmenu)|click/,
-       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-       hoverHack = function( events ) {
-               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-       };
+                                               if ( elem.nodeType === 1 ) {
+                                                       if ( !isXML ) {
+                                                               elem[ expando ] = doneName;
+                                                               elem.sizset = i;
+                                                       }
 
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
+                                                       if ( typeof cur !== "string" ) {
+                                                               if ( elem === cur ) {
+                                                                       match = true;
+                                                                       break;
+                                                               }
 
-       add: function( elem, types, handler, data, selector ) {
+                                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                                               match = elem;
+                                                               break;
+                                                       }
+                                               }
 
-               var elemData, eventHandle, events,
-                       t, tns, type, namespaces, handleObj,
-                       handleObjIn, handlers, special;
+                                               elem = elem[dir];
+                                       }
 
-               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
-               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-                       return;
+                                       checkSet[i] = match;
+                               }
+                       }
                }
 
-               // Caller can pass in an object of custom data in lieu of the handler
-               if ( handler.handler ) {
-                       handleObjIn = handler;
-                       handler = handleObjIn.handler;
-                       selector = handleObjIn.selector;
-               }
+               if ( document.documentElement.contains ) {
+                       Sizzle.contains = function( a, b ) {
+                               return a !== b && (a.contains ? a.contains(b) : true);
+                       };
 
-               // Make sure that the handler has a unique ID, used to find/remove it later
-               if ( !handler.guid ) {
-                       handler.guid = jQuery.guid++;
-               }
+               } else if ( document.documentElement.compareDocumentPosition ) {
+                       Sizzle.contains = function( a, b ) {
+                               return !!(a.compareDocumentPosition(b) & 16);
+                       };
 
-               // Init the element's event structure and main handler, if this is the first
-               events = elemData.events;
-               if ( !events ) {
-                       elemData.events = events = {};
-               }
-               eventHandle = elemData.handle;
-               if ( !eventHandle ) {
-                       elemData.handle = eventHandle = function( e ) {
-                               // Discard the second event of a jQuery.event.trigger() and
-                               // when an event is called after a page has unloaded
-                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                       undefined;
+               } else {
+                       Sizzle.contains = function() {
+                               return false;
                        };
-                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                       eventHandle.elem = elem;
                }
 
-               // Handle multiple events separated by a space
-               // jQuery(...).bind("mouseover mouseout", fn);
-               types = jQuery.trim( hoverHack(types) ).split( " " );
-               for ( t = 0; t < types.length; t++ ) {
+               Sizzle.isXML = function( elem ) {
+                       // documentElement is verified for cases where it doesn't yet exist
+                       // (such as loading iframes in IE - #4833)
+                       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
 
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = tns[1];
-                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+                       return documentElement ? documentElement.nodeName !== "HTML" : false;
+               };
 
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
+               var posProcess = function( selector, context, seed ) {
+                       var match,
+                               tmpSet = [],
+                               later = "",
+                               root = context.nodeType ? [context] : context;
 
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       // Position selectors must be done after the filter
+                       // And so must :not(positional) so we move all PSEUDOs to the end
+                       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+                               later += match[0];
+                               selector = selector.replace( Expr.match.PSEUDO, "" );
+                       }
 
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
+                       selector = Expr.relative[selector] ? selector + "*" : selector;
 
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend({
-                               type: type,
-                               origType: tns[1],
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               namespace: namespaces.join(".")
-                       }, handleObjIn );
+                       for ( var i = 0, l = root.length; i < l; i++ ) {
+                               Sizzle( selector, root[i], tmpSet, seed );
+                       }
+
+                       return Sizzle.filter( later, tmpSet );
+               };
 
-                       // Init the event handler queue if we're the first
-                       handlers = events[ type ];
-                       if ( !handlers ) {
-                               handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
+// EXPOSE
+// Override sizzle attribute retrieval
+               Sizzle.attr = jQuery.attr;
+               Sizzle.selectors.attrMap = {};
+               jQuery.find = Sizzle;
+               jQuery.expr = Sizzle.selectors;
+               jQuery.expr[":"] = jQuery.expr.filters;
+               jQuery.unique = Sizzle.uniqueSort;
+               jQuery.text = Sizzle.getText;
+               jQuery.isXMLDoc = Sizzle.isXML;
+               jQuery.contains = Sizzle.contains;
+
+
+       })();
+
+
+       var runtil = /Until$/,
+               rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+       // Note: This RegExp should be improved, or likely pulled from Sizzle
+               rmultiselector = /,/,
+               isSimple = /^.[^:#\[\.,]*$/,
+               slice = Array.prototype.slice,
+               POS = jQuery.expr.match.globalPOS,
+       // methods guaranteed to produce a unique set when starting from a unique set
+               guaranteedUnique = {
+                       children: true,
+                       contents: true,
+                       next: true,
+                       prev: true
+               };
 
-                               // Only use addEventListener/attachEvent if the special events handler returns false
-                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                       // Bind the global event handler to the element
-                                       if ( elem.addEventListener ) {
-                                               elem.addEventListener( type, eventHandle, false );
+       jQuery.fn.extend({
+               find: function( selector ) {
+                       var self = this,
+                               i, l;
 
-                                       } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, eventHandle );
+                       if ( typeof selector !== "string" ) {
+                               return jQuery( selector ).filter(function() {
+                                       for ( i = 0, l = self.length; i < l; i++ ) {
+                                               if ( jQuery.contains( self[ i ], this ) ) {
+                                                       return true;
+                                               }
                                        }
-                               }
+                               });
                        }
 
-                       if ( special.add ) {
-                               special.add.call( elem, handleObj );
+                       var ret = this.pushStack( "", "find", selector ),
+                               length, n, r;
 
-                               if ( !handleObj.handler.guid ) {
-                                       handleObj.handler.guid = handler.guid;
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               length = ret.length;
+                               jQuery.find( selector, this[i], ret );
+
+                               if ( i > 0 ) {
+                                       // Make sure that the results are unique
+                                       for ( n = length; n < ret.length; n++ ) {
+                                               for ( r = 0; r < length; r++ ) {
+                                                       if ( ret[r] === ret[n] ) {
+                                                               ret.splice(n--, 1);
+                                                               break;
+                                                       }
+                                               }
+                                       }
                                }
                        }
 
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
-                       } else {
-                               handlers.push( handleObj );
-                       }
+                       return ret;
+               },
 
-                       // Keep track of which events have ever been used, for event optimization
-                       jQuery.event.global[ type ] = true;
-               }
+               has: function( target ) {
+                       var targets = jQuery( target );
+                       return this.filter(function() {
+                               for ( var i = 0, l = targets.length; i < l; i++ ) {
+                                       if ( jQuery.contains( this, targets[i] ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
+               },
+
+               not: function( selector ) {
+                       return this.pushStack( winnow(this, selector, false), "not", selector);
+               },
 
-               // Nullify elem to prevent memory leaks in IE
-               elem = null;
-       },
+               filter: function( selector ) {
+                       return this.pushStack( winnow(this, selector, true), "filter", selector );
+               },
 
-       global: {},
+               is: function( selector ) {
+                       return !!selector && (
+                               typeof selector === "string" ?
+                                       // If this is a positional selector, check membership in the returned set
+                                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                                       POS.test( selector ) ?
+                                               jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                               jQuery.filter( selector, this ).length > 0 :
+                                       this.filter( selector ).length > 0 );
+               },
 
-       // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
+               closest: function( selectors, context ) {
+                       var ret = [], i, l, cur = this[0];
 
-               var t, tns, type, origType, namespaces, origCount,
-                       j, events, special, eventType, handleObj,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+                       // Array (deprecated as of jQuery 1.7)
+                       if ( jQuery.isArray( selectors ) ) {
+                               var level = 1;
 
-               if ( !elemData || !(events = elemData.events) ) {
-                       return;
-               }
+                               while ( cur && cur.ownerDocument && cur !== context ) {
+                                       for ( i = 0; i < selectors.length; i++ ) {
 
-               // Once for each type.namespace in types; type may be omitted
-               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-               for ( t = 0; t < types.length; t++ ) {
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = origType = tns[1];
-                       namespaces = tns[2];
+                                               if ( jQuery( cur ).is( selectors[ i ] ) ) {
+                                                       ret.push({ selector: selectors[ i ], elem: cur, level: level });
+                                               }
+                                       }
 
-                       // Unbind all events (on this namespace, if provided) for the element
-                       if ( !type ) {
-                               for ( type in events ) {
-                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                                       cur = cur.parentNode;
+                                       level++;
                                }
-                               continue;
+
+                               return ret;
                        }
 
-                       special = jQuery.event.special[ type ] || {};
-                       type = ( selector? special.delegateType : special.bindType ) || type;
-                       eventType = events[ type ] || [];
-                       origCount = eventType.length;
-                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+                       // String
+                       var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
 
-                       // Remove matching events
-                       for ( j = 0; j < eventType.length; j++ ) {
-                               handleObj = eventType[ j ];
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               cur = this[i];
 
-                               if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                        ( !handler || handler.guid === handleObj.guid ) &&
-                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                       eventType.splice( j--, 1 );
+                               while ( cur ) {
+                                       if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                               ret.push( cur );
+                                               break;
 
-                                       if ( handleObj.selector ) {
-                                               eventType.delegateCount--;
-                                       }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
+                                       } else {
+                                               cur = cur.parentNode;
+                                               if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+                                                       break;
+                                               }
                                        }
                                }
                        }
 
-                       // Remove generic event handler if we removed something and no more handlers exist
-                       // (avoids potential for endless recursion during removal of special event handlers)
-                       if ( eventType.length === 0 && origCount !== eventType.length ) {
-                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-                                       jQuery.removeEvent( elem, type, elemData.handle );
-                               }
-
-                               delete events[ type ];
-                       }
-               }
-
-               // Remove the expando if it's no longer used
-               if ( jQuery.isEmptyObject( events ) ) {
-                       delete elemData.handle;
-
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery.removeData( elem, "events", true );
-               }
-       },
-
-       // Events that are safe to short-circuit if no handlers are attached.
-       // Native DOM events should not be added, they may have inline handlers.
-       customEvent: {
-               "getData": true,
-               "setData": true,
-               "changeData": true
-       },
-
-       trigger: function( event, data, elem, onlyHandlers ) {
-               // Don't do events on text and comment nodes
-               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                       return;
-               }
-
-               // Event object or event type
-               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-                       type = event.type || event,
-                       namespaces = [];
+                       ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
-               }
-
-               if ( type.indexOf( "!" ) >= 0 ) {
-                       // Exclusive events trigger only for the exact event (no namespaces)
-                       type = type.slice(0, -1);
-                       exclusive = true;
-               }
+                       return this.pushStack( ret, "closest", selectors );
+               },
 
-               if ( type.indexOf( "." ) >= 0 ) {
-                       // Namespaced trigger; create a regexp to match event type in handle()
-                       namespaces = type.split(".");
-                       type = namespaces.shift();
-                       namespaces.sort();
-               }
+               // Determine the position of an element within
+               // the matched set of elements
+               index: function( elem ) {
 
-               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-                       // No jQuery handlers for this event type, and it can't have inline handlers
-                       return;
-               }
+                       // No argument, return index in parent
+                       if ( !elem ) {
+                               return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+                       }
 
-               // Caller can pass in an Event, Object, or just an event type string
-               event = typeof event === "object" ?
-                       // jQuery.Event object
-                       event[ jQuery.expando ] ? event :
-                       // Object literal
-                       new jQuery.Event( type, event ) :
-                       // Just the event type (string)
-                       new jQuery.Event( type );
+                       // index in selector
+                       if ( typeof elem === "string" ) {
+                               return jQuery.inArray( this[0], jQuery( elem ) );
+                       }
 
-               event.type = type;
-               event.isTrigger = true;
-               event.exclusive = exclusive;
-               event.namespace = namespaces.join( "." );
-               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+                       // Locate the position of the desired element
+                       return jQuery.inArray(
+                               // If it receives a jQuery object, the first element is used
+                               elem.jquery ? elem[0] : elem, this );
+               },
 
-               // Handle a global trigger
-               if ( !elem ) {
+               add: function( selector, context ) {
+                       var set = typeof selector === "string" ?
+                                       jQuery( selector, context ) :
+                                       jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                               all = jQuery.merge( this.get(), set );
 
-                       // TODO: Stop taunting the data cache; remove global events and always attach to document
-                       cache = jQuery.cache;
-                       for ( i in cache ) {
-                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-                               }
-                       }
-                       return;
-               }
+                       return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                               all :
+                               jQuery.unique( all ) );
+               },
 
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
+               andSelf: function() {
+                       return this.add( this.prevObject );
                }
+       });
 
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data != null ? jQuery.makeArray( data ) : [];
-               data.unshift( event );
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+       function isDisconnected( node ) {
+               return !node || !node.parentNode || node.parentNode.nodeType === 11;
+       }
 
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                       return;
+       jQuery.each({
+               parent: function( elem ) {
+                       var parent = elem.parentNode;
+                       return parent && parent.nodeType !== 11 ? parent : null;
+               },
+               parents: function( elem ) {
+                       return jQuery.dir( elem, "parentNode" );
+               },
+               parentsUntil: function( elem, i, until ) {
+                       return jQuery.dir( elem, "parentNode", until );
+               },
+               next: function( elem ) {
+                       return jQuery.nth( elem, 2, "nextSibling" );
+               },
+               prev: function( elem ) {
+                       return jQuery.nth( elem, 2, "previousSibling" );
+               },
+               nextAll: function( elem ) {
+                       return jQuery.dir( elem, "nextSibling" );
+               },
+               prevAll: function( elem ) {
+                       return jQuery.dir( elem, "previousSibling" );
+               },
+               nextUntil: function( elem, i, until ) {
+                       return jQuery.dir( elem, "nextSibling", until );
+               },
+               prevUntil: function( elem, i, until ) {
+                       return jQuery.dir( elem, "previousSibling", until );
+               },
+               siblings: function( elem ) {
+                       return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+               },
+               children: function( elem ) {
+                       return jQuery.sibling( elem.firstChild );
+               },
+               contents: function( elem ) {
+                       return jQuery.nodeName( elem, "iframe" ) ?
+                               elem.contentDocument || elem.contentWindow.document :
+                               jQuery.makeArray( elem.childNodes );
                }
+       }, function( name, fn ) {
+               jQuery.fn[ name ] = function( until, selector ) {
+                       var ret = jQuery.map( this, fn, until );
 
-               // Determine event propagation path in advance, per W3C events spec (#9951)
-               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               eventPath = [[ elem, special.bindType || type ]];
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-                       bubbleType = special.delegateType || type;
-                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                       for ( old = elem; cur; cur = cur.parentNode ) {
-                               eventPath.push([ cur, bubbleType ]);
-                               old = cur;
+                       if ( !runtil.test( name ) ) {
+                               selector = until;
                        }
 
-                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( old === (elem.ownerDocument || document) ) {
-                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       if ( selector && typeof selector === "string" ) {
+                               ret = jQuery.filter( selector, ret );
                        }
-               }
-
-               // Fire handlers on the event path
-               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
 
-                       cur = eventPath[i][0];
-                       event.type = eventPath[i][1];
+                       ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                       if ( handle ) {
-                               handle.apply( cur, data );
-                       }
-                       // Note that this is a bare JS function and not a jQuery handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
-                               event.preventDefault();
+                       if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+                               ret = ret.reverse();
                        }
-               }
-               event.type = type;
 
-               // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+                       return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+               };
+       });
 
-                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+       jQuery.extend({
+               filter: function( expr, elems, not ) {
+                       if ( not ) {
+                               expr = ":not(" + expr + ")";
+                       }
 
-                               // Call a native DOM method on the target with the same name name as the event.
-                               // Can't use an .isFunction() check here because IE6/7 fails that test.
-                               // Don't do default actions on window, that's where global variables be (#6170)
-                               // IE<9 dies on focus/blur to hidden element (#1486)
-                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+                       return elems.length === 1 ?
+                               jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                               jQuery.find.matches(expr, elems);
+               },
 
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       old = elem[ ontype ];
+               dir: function( elem, dir, until ) {
+                       var matched = [],
+                               cur = elem[ dir ];
 
-                                       if ( old ) {
-                                               elem[ ontype ] = null;
-                                       }
+                       while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                               if ( cur.nodeType === 1 ) {
+                                       matched.push( cur );
+                               }
+                               cur = cur[dir];
+                       }
+                       return matched;
+               },
 
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       elem[ type ]();
-                                       jQuery.event.triggered = undefined;
+               nth: function( cur, result, dir, elem ) {
+                       result = result || 1;
+                       var num = 0;
 
-                                       if ( old ) {
-                                               elem[ ontype ] = old;
-                                       }
+                       for ( ; cur; cur = cur[dir] ) {
+                               if ( cur.nodeType === 1 && ++num === result ) {
+                                       break;
                                }
                        }
-               }
 
-               return event.result;
-       },
+                       return cur;
+               },
 
-       dispatch: function( event ) {
+               sibling: function( n, elem ) {
+                       var r = [];
 
-               // Make a writable jQuery.Event from the native event object
-               event = jQuery.event.fix( event || window.event );
+                       for ( ; n; n = n.nextSibling ) {
+                               if ( n.nodeType === 1 && n !== elem ) {
+                                       r.push( n );
+                               }
+                       }
 
-               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
-                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                       delegateCount = handlers.delegateCount,
-                       args = [].slice.call( arguments ),
-                       run_all = !event.exclusive && !event.namespace,
-                       special = jQuery.event.special[ event.type ] || {},
-                       handlerQueue = [];
+                       return r;
+               }
+       });
 
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
-               args[0] = event;
-               event.delegateTarget = this;
+// Implement the identical functionality for filter and not
+       function winnow( elements, qualifier, keep ) {
 
-               // Call the preDispatch hook for the mapped type, and let it bail if desired
-               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                       return;
-               }
+               // Can't pass null or undefined to indexOf in Firefox 4
+               // Set to 0 to skip string check
+               qualifier = qualifier || 0;
 
-               // Determine handlers that should run if there are delegated events
-               // Avoid non-left-click bubbling in Firefox (#3861)
-               if ( delegateCount && !(event.button && event.type === "click") ) {
+               if ( jQuery.isFunction( qualifier ) ) {
+                       return jQuery.grep(elements, function( elem, i ) {
+                               var retVal = !!qualifier.call( elem, i, elem );
+                               return retVal === keep;
+                       });
 
-                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+               } else if ( qualifier.nodeType ) {
+                       return jQuery.grep(elements, function( elem, i ) {
+                               return ( elem === qualifier ) === keep;
+                       });
 
-                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.disabled !== true || event.type !== "click" ) {
-                                       selMatch = {};
-                                       matches = [];
-                                       for ( i = 0; i < delegateCount; i++ ) {
-                                               handleObj = handlers[ i ];
-                                               sel = handleObj.selector;
+               } else if ( typeof qualifier === "string" ) {
+                       var filtered = jQuery.grep(elements, function( elem ) {
+                               return elem.nodeType === 1;
+                       });
 
-                                               if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = jQuery( sel, this ).index( cur ) >= 0;
-                                               }
-                                               if ( selMatch[ sel ] ) {
-                                                       matches.push( handleObj );
-                                               }
-                                       }
-                                       if ( matches.length ) {
-                                               handlerQueue.push({ elem: cur, matches: matches });
-                                       }
-                               }
+                       if ( isSimple.test( qualifier ) ) {
+                               return jQuery.filter(qualifier, filtered, !keep);
+                       } else {
+                               qualifier = jQuery.filter( qualifier, filtered );
                        }
                }
 
-               // Add the remaining (directly-bound) handlers
-               if ( handlers.length > delegateCount ) {
-                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-               }
-
-               // Run delegates first; they may want to stop propagation beneath us
-               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-                       matched = handlerQueue[ i ];
-                       event.currentTarget = matched.elem;
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+               });
+       }
 
-                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                               handleObj = matched.matches[ j ];
 
-                               // Triggered event must either 1) be non-exclusive and have no namespace, or
-                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
 
-                                       event.data = handleObj.data;
-                                       event.handleObj = handleObj;
 
-                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
+       function createSafeFragment( document ) {
+               var list = nodeNames.split( "|" ),
+                       safeFrag = document.createDocumentFragment();
 
-                                       if ( ret !== undefined ) {
-                                               event.result = ret;
-                                               if ( ret === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
-                                               }
-                                       }
-                               }
+               if ( safeFrag.createElement ) {
+                       while ( list.length ) {
+                               safeFrag.createElement(
+                                       list.pop()
+                               );
                        }
                }
+               return safeFrag;
+       }
 
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
-
-               return event.result;
-       },
+       var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+                       "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+               rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+               rleadingWhitespace = /^\s+/,
+               rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+               rtagName = /<([\w:]+)/,
+               rtbody = /<tbody/i,
+               rhtml = /<|&#?\w+;/,
+               rnoInnerhtml = /<(?:script|style)/i,
+               rnocache = /<(?:script|object|embed|option|style)/i,
+               rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       // checked="checked" or checked
+               rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+               rscriptType = /\/(java|ecma)script/i,
+               rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+               wrapMap = {
+                       option: [ 1, "<select multiple='multiple'>", "</select>" ],
+                       legend: [ 1, "<fieldset>", "</fieldset>" ],
+                       thead: [ 1, "<table>", "</table>" ],
+                       tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+                       td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+                       col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+                       area: [ 1, "<map>", "</map>" ],
+                       _default: [ 0, "", "" ]
+               },
+               safeFragment = createSafeFragment( document );
 
-       // Includes some event props shared by KeyEvent and MouseEvent
-       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+       wrapMap.optgroup = wrapMap.option;
+       wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+       wrapMap.th = wrapMap.td;
 
-       fixHooks: {},
+// IE can't serialize <link> and <script> tags normally
+       if ( !jQuery.support.htmlSerialize ) {
+               wrapMap._default = [ 1, "div<div>", "</div>" ];
+       }
 
-       keyHooks: {
-               props: "char charCode key keyCode".split(" "),
-               filter: function( event, original ) {
+       jQuery.fn.extend({
+               text: function( value ) {
+                       return jQuery.access( this, function( value ) {
+                               return value === undefined ?
+                                       jQuery.text( this ) :
+                                       this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+                       }, null, value, arguments.length );
+               },
 
-                       // Add which for key events
-                       if ( event.which == null ) {
-                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+               wrapAll: function( html ) {
+                       if ( jQuery.isFunction( html ) ) {
+                               return this.each(function(i) {
+                                       jQuery(this).wrapAll( html.call(this, i) );
+                               });
                        }
 
-                       return event;
-               }
-       },
-
-       mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-               filter: function( event, original ) {
-                       var eventDoc, doc, body,
-                               button = original.button,
-                               fromElement = original.fromElement;
+                       if ( this[0] ) {
+                               // The elements to wrap the target around
+                               var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
 
-                       // Calculate pageX/Y if missing and clientX/Y available
-                       if ( event.pageX == null && original.clientX != null ) {
-                               eventDoc = event.target.ownerDocument || document;
-                               doc = eventDoc.documentElement;
-                               body = eventDoc.body;
+                               if ( this[0].parentNode ) {
+                                       wrap.insertBefore( this[0] );
+                               }
 
-                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                       }
+                               wrap.map(function() {
+                                       var elem = this;
 
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
+                                       while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                               elem = elem.firstChild;
+                                       }
 
-                       // Add which for click: 1 === left; 2 === middle; 3 === right
-                       // Note: button is not normalized, so don't use it
-                       if ( !event.which && button !== undefined ) {
-                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                                       return elem;
+                               }).append( this );
                        }
 
-                       return event;
-               }
-       },
+                       return this;
+               },
 
-       fix: function( event ) {
-               if ( event[ jQuery.expando ] ) {
-                       return event;
-               }
+               wrapInner: function( html ) {
+                       if ( jQuery.isFunction( html ) ) {
+                               return this.each(function(i) {
+                                       jQuery(this).wrapInner( html.call(this, i) );
+                               });
+                       }
 
-               // Create a writable copy of the event object and normalize some properties
-               var i, prop,
-                       originalEvent = event,
-                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
-                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+                       return this.each(function() {
+                               var self = jQuery( this ),
+                                       contents = self.contents();
 
-               event = jQuery.Event( originalEvent );
+                               if ( contents.length ) {
+                                       contents.wrapAll( html );
 
-               for ( i = copy.length; i; ) {
-                       prop = copy[ --i ];
-                       event[ prop ] = originalEvent[ prop ];
-               }
+                               } else {
+                                       self.append( html );
+                               }
+                       });
+               },
 
-               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-               if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
-               }
+               wrap: function( html ) {
+                       var isFunction = jQuery.isFunction( html );
 
-               // Target should not be a text node (#504, Safari)
-               if ( event.target.nodeType === 3 ) {
-                       event.target = event.target.parentNode;
-               }
+                       return this.each(function(i) {
+                               jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+                       });
+               },
 
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-               event.metaKey = !!event.metaKey;
+               unwrap: function() {
+                       return this.parent().each(function() {
+                               if ( !jQuery.nodeName( this, "body" ) ) {
+                                       jQuery( this ).replaceWith( this.childNodes );
+                               }
+                       }).end();
+               },
 
-               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-       },
+               append: function() {
+                       return this.domManip(arguments, true, function( elem ) {
+                               if ( this.nodeType === 1 ) {
+                                       this.appendChild( elem );
+                               }
+                       });
+               },
 
-       special: {
-               load: {
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
+               prepend: function() {
+                       return this.domManip(arguments, true, function( elem ) {
+                               if ( this.nodeType === 1 ) {
+                                       this.insertBefore( elem, this.firstChild );
+                               }
+                       });
                },
 
-               focus: {
-                       delegateType: "focusin"
+               before: function() {
+                       if ( this[0] && this[0].parentNode ) {
+                               return this.domManip(arguments, false, function( elem ) {
+                                       this.parentNode.insertBefore( elem, this );
+                               });
+                       } else if ( arguments.length ) {
+                               var set = jQuery.clean( arguments );
+                               set.push.apply( set, this.toArray() );
+                               return this.pushStack( set, "before", arguments );
+                       }
                },
-               blur: {
-                       delegateType: "focusout"
+
+               after: function() {
+                       if ( this[0] && this[0].parentNode ) {
+                               return this.domManip(arguments, false, function( elem ) {
+                                       this.parentNode.insertBefore( elem, this.nextSibling );
+                               });
+                       } else if ( arguments.length ) {
+                               var set = this.pushStack( this, "after", arguments );
+                               set.push.apply( set, jQuery.clean(arguments) );
+                               return set;
+                       }
                },
 
-               beforeunload: {
-                       setup: function( data, namespaces, eventHandle ) {
-                               // We only want to do this special case on windows
-                               if ( jQuery.isWindow( this ) ) {
-                                       this.onbeforeunload = eventHandle;
-                               }
-                       },
+               // keepData is for internal use only--do not document
+               remove: function( selector, keepData ) {
+                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                               if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                                       if ( !keepData && elem.nodeType === 1 ) {
+                                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                                               jQuery.cleanData( [ elem ] );
+                                       }
 
-                       teardown: function( namespaces, eventHandle ) {
-                               if ( this.onbeforeunload === eventHandle ) {
-                                       this.onbeforeunload = null;
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
                                }
                        }
-               }
-       },
-
-       simulate: function( type, elem, event, bubble ) {
-               // Piggyback on a donor event to simulate a different one.
-               // Fake originalEvent to avoid donor's stopPropagation, but if the
-               // simulated event prevents default then we do the same on the donor.
-               var e = jQuery.extend(
-                       new jQuery.Event(),
-                       event,
-                       { type: type,
-                               isSimulated: true,
-                               originalEvent: {}
-                       }
-               );
-               if ( bubble ) {
-                       jQuery.event.trigger( e, null, elem );
-               } else {
-                       jQuery.event.dispatch.call( elem, e );
-               }
-               if ( e.isDefaultPrevented() ) {
-                       event.preventDefault();
-               }
-       }
-};
 
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
-       function( elem, type, handle ) {
-               if ( elem.removeEventListener ) {
-                       elem.removeEventListener( type, handle, false );
-               }
-       } :
-       function( elem, type, handle ) {
-               var name = "on" + type;
+                       return this;
+               },
 
-               if ( elem.detachEvent ) {
+               empty: function() {
+                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                               // Remove element nodes and prevent memory leaks
+                               if ( elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                               }
 
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
-                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
-                       if ( typeof elem[ name ] === "undefined" ) {
-                               elem[ name ] = null;
+                               // Remove any remaining nodes
+                               while ( elem.firstChild ) {
+                                       elem.removeChild( elem.firstChild );
+                               }
                        }
 
-                       elem.detachEvent( name, handle );
-               }
-       };
+                       return this;
+               },
 
-jQuery.Event = function( src, props ) {
-       // Allow instantiation without the 'new' keyword
-       if ( !(this instanceof jQuery.Event) ) {
-               return new jQuery.Event( src, props );
-       }
+               clone: function( dataAndEvents, deepDataAndEvents ) {
+                       dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+                       deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-       // Event object
-       if ( src && src.type ) {
-               this.originalEvent = src;
-               this.type = src.type;
+                       return this.map( function () {
+                               return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+                       });
+               },
 
-               // Events bubbling up the document may have been marked as prevented
-               // by a handler lower down the tree; reflect the correct value.
-               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+               html: function( value ) {
+                       return jQuery.access( this, function( value ) {
+                               var elem = this[0] || {},
+                                       i = 0,
+                                       l = this.length;
 
-       // Event type
-       } else {
-               this.type = src;
-       }
+                               if ( value === undefined ) {
+                                       return elem.nodeType === 1 ?
+                                               elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                               null;
+                               }
 
-       // Put explicitly provided properties onto the event object
-       if ( props ) {
-               jQuery.extend( this, props );
-       }
 
-       // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
+                               if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                                       ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                                       !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
 
-       // Mark it as fixed
-       this[ jQuery.expando ] = true;
-};
+                                       value = value.replace( rxhtmlTag, "<$1></$2>" );
 
-function returnFalse() {
-       return false;
-}
-function returnTrue() {
-       return true;
-}
+                                       try {
+                                               for (; i < l; i++ ) {
+                                                       // Remove element nodes and prevent memory leaks
+                                                       elem = this[i] || {};
+                                                       if ( elem.nodeType === 1 ) {
+                                                               jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                               elem.innerHTML = value;
+                                                       }
+                                               }
 
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-       preventDefault: function() {
-               this.isDefaultPrevented = returnTrue;
+                                               elem = 0;
 
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
+                                               // If using innerHTML throws an exception, use the fallback method
+                                       } catch(e) {}
+                               }
 
-               // if preventDefault exists run it on the original event
-               if ( e.preventDefault ) {
-                       e.preventDefault();
+                               if ( elem ) {
+                                       this.empty().append( value );
+                               }
+                       }, null, value, arguments.length );
+               },
 
-               // otherwise set the returnValue property of the original event to false (IE)
-               } else {
-                       e.returnValue = false;
-               }
-       },
-       stopPropagation: function() {
-               this.isPropagationStopped = returnTrue;
+               replaceWith: function( value ) {
+                       if ( this[0] && this[0].parentNode ) {
+                               // Make sure that the elements are removed from the DOM before they are inserted
+                               // this can help fix replacing a parent with child elements
+                               if ( jQuery.isFunction( value ) ) {
+                                       return this.each(function(i) {
+                                               var self = jQuery(this), old = self.html();
+                                               self.replaceWith( value.call( this, i, old ) );
+                                       });
+                               }
 
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
-               // if stopPropagation exists run it on the original event
-               if ( e.stopPropagation ) {
-                       e.stopPropagation();
-               }
-               // otherwise set the cancelBubble property of the original event to true (IE)
-               e.cancelBubble = true;
-       },
-       stopImmediatePropagation: function() {
-               this.isImmediatePropagationStopped = returnTrue;
-               this.stopPropagation();
-       },
-       isDefaultPrevented: returnFalse,
-       isPropagationStopped: returnFalse,
-       isImmediatePropagationStopped: returnFalse
-};
+                               if ( typeof value !== "string" ) {
+                                       value = jQuery( value ).detach();
+                               }
 
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-       mouseenter: "mouseover",
-       mouseleave: "mouseout"
-}, function( orig, fix ) {
-       jQuery.event.special[ orig ] = {
-               delegateType: fix,
-               bindType: fix,
-
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj,
-                               selector = handleObj.selector;
-
-                       // For mousenter/leave call the handler if related is outside the target.
-                       // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                               event.type = handleObj.origType;
-                               ret = handleObj.handler.apply( this, arguments );
-                               event.type = fix;
-                       }
-                       return ret;
-               }
-       };
-});
+                               return this.each(function() {
+                                       var next = this.nextSibling,
+                                               parent = this.parentNode;
 
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
+                                       jQuery( this ).remove();
 
-       jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
+                                       if ( next ) {
+                                               jQuery(next).before( value );
+                                       } else {
+                                               jQuery(parent).append( value );
+                                       }
+                               });
+                       } else {
+                               return this.length ?
+                                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                                       this;
                        }
+               },
 
-                       // Lazy-add a submit handler when a descendant form may potentially be submitted
-                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                               // Node name check avoids a VML-related crash in IE (#9807)
-                               var elem = e.target,
-                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
-                                       jQuery.event.add( form, "submit._submit", function( event ) {
-                                               event._submit_bubble = true;
-                                       });
-                                       jQuery._data( form, "_submit_attached", true );
-                               }
-                       });
-                       // return undefined since we don't need an event listener
+               detach: function( selector ) {
+                       return this.remove( selector, true );
                },
 
-               postDispatch: function( event ) {
-                       // If form was submitted by the user, bubble the event up the tree
-                       if ( event._submit_bubble ) {
-                               delete event._submit_bubble;
-                               if ( this.parentNode && !event.isTrigger ) {
-                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                               }
+               domManip: function( args, table, callback ) {
+                       var results, first, fragment, parent,
+                               value = args[0],
+                               scripts = [];
+
+                       // We can't cloneNode fragments that contain checked, in WebKit
+                       if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+                               return this.each(function() {
+                                       jQuery(this).domManip( args, table, callback, true );
+                               });
                        }
-               },
 
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
+                       if ( jQuery.isFunction(value) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this);
+                                       args[0] = value.call(this, i, table ? self.html() : undefined);
+                                       self.domManip( args, table, callback );
+                               });
                        }
 
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
-               }
-       };
-}
+                       if ( this[0] ) {
+                               parent = value && value.parentNode;
 
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
+                               // If we're in a fragment, just use that instead of building a new one
+                               if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                                       results = { fragment: parent };
 
-       jQuery.event.special.change = {
+                               } else {
+                                       results = jQuery.buildFragment( args, this, scripts );
+                               }
 
-               setup: function() {
+                               fragment = results.fragment;
 
-                       if ( rformElems.test( this.nodeName ) ) {
-                               // IE doesn't fire change on a check/radio until blur; trigger it on click
-                               // after a propertychange. Eat the blur-change in special.change.handle.
-                               // This still fires onchange a second time for check/radio after blur.
-                               if ( this.type === "checkbox" || this.type === "radio" ) {
-                                       jQuery.event.add( this, "propertychange._change", function( event ) {
-                                               if ( event.originalEvent.propertyName === "checked" ) {
-                                                       this._just_changed = true;
-                                               }
-                                       });
-                                       jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed && !event.isTrigger ) {
-                                                       this._just_changed = false;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               jQuery.event.simulate( "change", this, event, true );
-                                       });
+                               if ( fragment.childNodes.length === 1 ) {
+                                       first = fragment = fragment.firstChild;
+                               } else {
+                                       first = fragment.firstChild;
                                }
-                               return false;
-                       }
-                       // Delegated event; lazy-add a change handler on descendant inputs
-                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                               var elem = e.target;
 
-                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
-                                       jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                               if ( first ) {
+                                       table = table && jQuery.nodeName( first, "tr" );
+
+                                       for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+                                               callback.call(
+                                                       table ?
+                                                               root(this[i], first) :
+                                                               this[i],
+                                                       // Make sure that we do not leak memory by inadvertently discarding
+                                                       // the original fragment (which might have attached data) instead of
+                                                       // using it; in addition, use the original fragment object for the last
+                                                       // item instead of first because it can end up being emptied incorrectly
+                                                       // in certain situations (Bug #8070).
+                                                       // Fragments from the fragment cache must always be cloned and never used
+                                                       // in place.
+                                                       results.cacheable || ( l > 1 && i < lastIndex ) ?
+                                                               jQuery.clone( fragment, true, true ) :
+                                                               fragment
+                                               );
+                                       }
+                               }
+
+                               if ( scripts.length ) {
+                                       jQuery.each( scripts, function( i, elem ) {
+                                               if ( elem.src ) {
+                                                       jQuery.ajax({
+                                                               type: "GET",
+                                                               global: false,
+                                                               url: elem.src,
+                                                               async: false,
+                                                               dataType: "script"
+                                                       });
+                                               } else {
+                                                       jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+                                               }
+
+                                               if ( elem.parentNode ) {
+                                                       elem.parentNode.removeChild( elem );
                                                }
                                        });
-                                       jQuery._data( elem, "_change_attached", true );
                                }
-                       });
-               },
+                       }
 
-               handle: function( event ) {
-                       var elem = event.target;
+                       return this;
+               }
+       });
 
-                       // Swallow native change events from checkbox/radio, we already triggered them above
-                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                               return event.handleObj.handler.apply( this, arguments );
-                       }
-               },
+       function root( elem, cur ) {
+               return jQuery.nodeName(elem, "table") ?
+                       (elem.getElementsByTagName("tbody")[0] ||
+                               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+                       elem;
+       }
 
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
+       function cloneCopyEvent( src, dest ) {
 
-                       return !rformElems.test( this.nodeName );
+               if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+                       return;
                }
-       };
-}
 
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+               var type, i, l,
+                       oldData = jQuery._data( src ),
+                       curData = jQuery._data( dest, oldData ),
+                       events = oldData.events;
 
-               // Attach a single capturing handler while someone wants focusin/focusout
-               var attaches = 0,
-                       handler = function( event ) {
-                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                       };
+               if ( events ) {
+                       delete curData.handle;
+                       curData.events = {};
 
-               jQuery.event.special[ fix ] = {
-                       setup: function() {
-                               if ( attaches++ === 0 ) {
-                                       document.addEventListener( orig, handler, true );
-                               }
-                       },
-                       teardown: function() {
-                               if ( --attaches === 0 ) {
-                                       document.removeEventListener( orig, handler, true );
+                       for ( type in events ) {
+                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                                       jQuery.event.add( dest, type, events[ type ][ i ] );
                                }
                        }
-               };
-       });
-}
+               }
 
-jQuery.fn.extend({
+               // make the cloned public data object a copy from the original
+               if ( curData.data ) {
+                       curData.data = jQuery.extend( {}, curData.data );
+               }
+       }
 
-       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var origFn, type;
+       function cloneFixAttributes( src, dest ) {
+               var nodeName;
 
-               // Types can be a map of types/handlers
-               if ( typeof types === "object" ) {
-                       // ( types-Object, selector, data )
-                       if ( typeof selector !== "string" ) { // && selector != null
-                               // ( types-Object, data )
-                               data = data || selector;
-                               selector = undefined;
-                       }
-                       for ( type in types ) {
-                               this.on( type, selector, data, types[ type ], one );
-                       }
-                       return this;
+               // We do not need to do anything for non-Elements
+               if ( dest.nodeType !== 1 ) {
+                       return;
                }
 
-               if ( data == null && fn == null ) {
-                       // ( types, fn )
-                       fn = selector;
-                       data = selector = undefined;
-               } else if ( fn == null ) {
-                       if ( typeof selector === "string" ) {
-                               // ( types, selector, fn )
-                               fn = data;
-                               data = undefined;
-                       } else {
-                               // ( types, data, fn )
-                               fn = data;
-                               data = selector;
-                               selector = undefined;
-                       }
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               } else if ( !fn ) {
-                       return this;
+               // clearAttributes removes the attributes, which we don't want,
+               // but also removes the attachEvent events, which we *do* want
+               if ( dest.clearAttributes ) {
+                       dest.clearAttributes();
                }
 
-               if ( one === 1 ) {
-                       origFn = fn;
-                       fn = function( event ) {
-                               // Can use an empty set, since event contains the info
-                               jQuery().off( event );
-                               return origFn.apply( this, arguments );
-                       };
-                       // Use same guid so caller can remove using origFn
-                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-               }
-               return this.each( function() {
-                       jQuery.event.add( this, types, fn, data, selector );
-               });
-       },
-       one: function( types, selector, data, fn ) {
-               return this.on( types, selector, data, fn, 1 );
-       },
-       off: function( types, selector, fn ) {
-               var handleObj, type;
-               if ( types && types.preventDefault && types.handleObj ) {
-                       // ( event )  dispatched jQuery.Event
-                       handleObj = types.handleObj;
-                       jQuery( types.delegateTarget ).off(
-                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                               handleObj.selector,
-                               handleObj.handler
-                       );
-                       return this;
+               // mergeAttributes, in contrast, only merges back on the
+               // original attributes, not the events
+               if ( dest.mergeAttributes ) {
+                       dest.mergeAttributes( src );
                }
-               if ( typeof types === "object" ) {
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
+
+               nodeName = dest.nodeName.toLowerCase();
+
+               // IE6-8 fail to clone children inside object elements that use
+               // the proprietary classid attribute value (rather than the type
+               // attribute) to identify the type of content to display
+               if ( nodeName === "object" ) {
+                       dest.outerHTML = src.outerHTML;
+
+               } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+                       // IE6-8 fails to persist the checked state of a cloned checkbox
+                       // or radio button. Worse, IE6-7 fail to give the cloned element
+                       // a checked appearance if the defaultChecked value isn't also set
+                       if ( src.checked ) {
+                               dest.defaultChecked = dest.checked = src.checked;
                        }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               }
-               return this.each(function() {
-                       jQuery.event.remove( this, types, fn, selector );
-               });
-       },
-
-       bind: function( types, data, fn ) {
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               return this.off( types, null, fn );
-       },
-
-       live: function( types, data, fn ) {
-               jQuery( this.context ).on( types, this.selector, data, fn );
-               return this;
-       },
-       die: function( types, fn ) {
-               jQuery( this.context ).off( types, this.selector || "**", fn );
-               return this;
-       },
-
-       delegate: function( selector, types, data, fn ) {
-               return this.on( types, selector, data, fn );
-       },
-       undelegate: function( selector, types, fn ) {
-               // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-       },
-
-       trigger: function( type, data ) {
-               return this.each(function() {
-                       jQuery.event.trigger( type, data, this );
-               });
-       },
-       triggerHandler: function( type, data ) {
-               if ( this[0] ) {
-                       return jQuery.event.trigger( type, data, this[0], true );
-               }
-       },
 
-       toggle: function( fn ) {
-               // Save reference to arguments for access in closure
-               var args = arguments,
-                       guid = fn.guid || jQuery.guid++,
-                       i = 0,
-                       toggler = function( event ) {
-                               // Figure out which function to execute
-                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+                       // IE6-7 get confused and end up setting the value of a cloned
+                       // checkbox/radio button to an empty string instead of "on"
+                       if ( dest.value !== src.value ) {
+                               dest.value = src.value;
+                       }
 
-                               // Make sure that clicks stop
-                               event.preventDefault();
+                       // IE6-8 fails to return the selected option to the default selected
+                       // state when cloning options
+               } else if ( nodeName === "option" ) {
+                       dest.selected = src.defaultSelected;
 
-                               // and execute the function
-                               return args[ lastToggle ].apply( this, arguments ) || false;
-                       };
+                       // IE6-8 fails to set the defaultValue to the correct value when
+                       // cloning other types of input fields
+               } else if ( nodeName === "input" || nodeName === "textarea" ) {
+                       dest.defaultValue = src.defaultValue;
 
-               // link all the functions, so any of them can unbind this click handler
-               toggler.guid = guid;
-               while ( i < args.length ) {
-                       args[ i++ ].guid = guid;
+                       // IE blanks contents when cloning scripts
+               } else if ( nodeName === "script" && dest.text !== src.text ) {
+                       dest.text = src.text;
                }
 
-               return this.click( toggler );
-       },
+               // Event data gets referenced instead of copied if the expando
+               // gets copied too
+               dest.removeAttribute( jQuery.expando );
 
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+               // Clear flags for bubbling special change/submit events, they must
+               // be reattached when the newly cloned events are first activated
+               dest.removeAttribute( "_submit_attached" );
+               dest.removeAttribute( "_change_attached" );
        }
-});
 
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+       jQuery.buildFragment = function( args, nodes, scripts ) {
+               var fragment, cacheable, cacheresults, doc,
+                       first = args[ 0 ];
 
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               if ( fn == null ) {
-                       fn = data;
-                       data = null;
+               // nodes may contain either an explicit document object,
+               // a jQuery collection or context object.
+               // If nodes[0] contains a valid object to assign to doc
+               if ( nodes && nodes[0] ) {
+                       doc = nodes[0].ownerDocument || nodes[0];
                }
 
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-       };
+               // Ensure that an attr object doesn't incorrectly stand in as a document object
+               // Chrome and Firefox seem to allow this to occur and will throw exception
+               // Fixes #8950
+               if ( !doc.createDocumentFragment ) {
+                       doc = document;
+               }
 
-       if ( rkeyEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-       }
+               // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+               // Cloning options loses the selected state, so don't cache them
+               // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+               // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+               // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+               if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+                       first.charAt(0) === "<" && !rnocache.test( first ) &&
+                       (jQuery.support.checkClone || !rchecked.test( first )) &&
+                       (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
 
-       if ( rmouseEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-       }
-});
-/*!\r
- * Sizzle CSS Selector Engine\r
- *  Copyright 2012 jQuery Foundation and other contributors\r
- *  Released under the MIT license\r
- *  http://sizzlejs.com/\r
- */\r
-(function( window, undefined ) {\r
-\r
-var dirruns,\r
-       cachedruns,\r
-       assertGetIdNotName,\r
-       Expr,\r
-       getText,\r
-       isXML,\r
-       contains,\r
-       compile,\r
-       sortOrder,\r
-       hasDuplicate,\r
-\r
-       baseHasDuplicate = true,\r
-       strundefined = "undefined",\r
-\r
-       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
-\r
-       document = window.document,\r
-       docElem = document.documentElement,\r
-       done = 0,\r
-       slice = [].slice,\r
-       push = [].push,\r
-\r
-       // Augment a function for special use by Sizzle\r
-       markFunction = function( fn, value ) {\r
-               fn[ expando ] = value || true;\r
-               return fn;\r
-       },\r
-\r
-       createCache = function() {\r
-               var cache = {},\r
-                       keys = [];\r
-\r
-               return markFunction(function( key, value ) {\r
-                       // Only keep the most recent entries\r
-                       if ( keys.push( key ) > Expr.cacheLength ) {\r
-                               delete cache[ keys.shift() ];\r
-                       }\r
-\r
-                       return (cache[ key ] = value);\r
-               }, cache );\r
-       },\r
-\r
-       classCache = createCache(),\r
-       tokenCache = createCache(),\r
-       compilerCache = createCache(),\r
-\r
-       // Regex\r
-\r
-       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
-       whitespace = "[\\x20\\t\\r\\n\\f]",\r
-       // http://www.w3.org/TR/css3-syntax/#characters\r
-       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
-\r
-       // Loosely modeled on CSS identifier characters\r
-       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
-       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
-       identifier = characterEncoding.replace( "w", "w#" ),\r
-\r
-       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
-       operators = "([*^$|!~]?=)",\r
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
-               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
-\r
-       // Prefer arguments not in parens/brackets,\r
-       //   then attribute selectors and non-pseudos (denoted by :),\r
-       //   then anything else\r
-       // These preferences are here to reduce the number of selectors\r
-       //   needing tokenize in the PSEUDO preFilter\r
-       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
-\r
-       // For matchExpr.POS and matchExpr.needsContext\r
-       pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",\r
-\r
-       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
-\r
-       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
-       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
-       rpseudo = new RegExp( pseudos ),\r
-\r
-       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
-       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
-\r
-       rnot = /^:not/,\r
-       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
-       rendsWithNot = /:not\($/,\r
-\r
-       rheader = /h\d/i,\r
-       rinputs = /input|select|textarea|button/i,\r
-\r
-       rbackslash = /\\(?!\\)/g,\r
-\r
-       matchExpr = {\r
-               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
-               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
-               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
-               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
-               "ATTR": new RegExp( "^" + attributes ),\r
-               "PSEUDO": new RegExp( "^" + pseudos ),\r
-               "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +\r
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
-               "POS": new RegExp( pos, "ig" ),\r
-               // For use in libraries implementing .is()\r
-               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
-       },\r
-\r
-       // Support\r
-\r
-       // Used for testing something on an element\r
-       assert = function( fn ) {\r
-               var div = document.createElement("div");\r
-\r
-               try {\r
-                       return fn( div );\r
-               } catch (e) {\r
-                       return false;\r
-               } finally {\r
-                       // release memory in IE\r
-                       div = null;\r
-               }\r
-       },\r
-\r
-       // Check if getElementsByTagName("*") returns only elements\r
-       assertTagNameNoComments = assert(function( div ) {\r
-               div.appendChild( document.createComment("") );\r
-               return !div.getElementsByTagName("*").length;\r
-       }),\r
-\r
-       // Check if getAttribute returns normalized href attributes\r
-       assertHrefNotNormalized = assert(function( div ) {\r
-               div.innerHTML = "<a href='#'></a>";\r
-               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
-                       div.firstChild.getAttribute("href") === "#";\r
-       }),\r
-\r
-       // Check if attributes should be retrieved by attribute nodes\r
-       assertAttributes = assert(function( div ) {\r
-               div.innerHTML = "<select></select>";\r
-               var type = typeof div.lastChild.getAttribute("multiple");\r
-               // IE8 returns a string for some attributes even when not present\r
-               return type !== "boolean" && type !== "string";\r
-       }),\r
-\r
-       // Check if getElementsByClassName can be trusted\r
-       assertUsableClassName = assert(function( div ) {\r
-               // Opera can't find a second classname (in 9.6)\r
-               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
-               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
-                       return false;\r
-               }\r
-\r
-               // Safari 3.2 caches class attributes and doesn't catch changes\r
-               div.lastChild.className = "e";\r
-               return div.getElementsByClassName("e").length === 2;\r
-       }),\r
-\r
-       // Check if getElementById returns elements by name\r
-       // Check if getElementsByName privileges form controls or returns elements by ID\r
-       assertUsableName = assert(function( div ) {\r
-               // Inject content\r
-               div.id = expando + 0;\r
-               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
-               docElem.insertBefore( div, docElem.firstChild );\r
-\r
-               // Test\r
-               var pass = document.getElementsByName &&\r
-                       // buggy browsers will return fewer than the correct 2\r
-                       document.getElementsByName( expando ).length === 2 +\r
-                       // buggy browsers will return more than the correct 0\r
-                       document.getElementsByName( expando + 0 ).length;\r
-               assertGetIdNotName = !document.getElementById( expando );\r
-\r
-               // Cleanup\r
-               docElem.removeChild( div );\r
-\r
-               return pass;\r
-       });\r
-\r
-// If slice is not available, provide a backup\r
-try {\r
-       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
-} catch ( e ) {\r
-       slice = function( i ) {\r
-               var elem, results = [];\r
-               for ( ; (elem = this[i]); i++ ) {\r
-                       results.push( elem );\r
-               }\r
-               return results;\r
-       };\r
-}\r
-\r
-function Sizzle( selector, context, results, seed ) {\r
-       results = results || [];\r
-       context = context || document;\r
-       var match, elem, xml, m,\r
-               nodeType = context.nodeType;\r
-\r
-       if ( nodeType !== 1 && nodeType !== 9 ) {\r
-               return [];\r
-       }\r
-\r
-       if ( !selector || typeof selector !== "string" ) {\r
-               return results;\r
-       }\r
-\r
-       xml = isXML( context );\r
-\r
-       if ( !xml && !seed ) {\r
-               if ( (match = rquickExpr.exec( selector )) ) {\r
-                       // Speed-up: Sizzle("#ID")\r
-                       if ( (m = match[1]) ) {\r
-                               if ( nodeType === 9 ) {\r
-                                       elem = context.getElementById( m );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       if ( elem && elem.parentNode ) {\r
-                                               // Handle the case where IE, Opera, and Webkit return items\r
-                                               // by name instead of ID\r
-                                               if ( elem.id === m ) {\r
-                                                       results.push( elem );\r
-                                                       return results;\r
-                                               }\r
-                                       } else {\r
-                                               return results;\r
-                                       }\r
-                               } else {\r
-                                       // Context is not a document\r
-                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
-                                               contains( context, elem ) && elem.id === m ) {\r
-                                               results.push( elem );\r
-                                               return results;\r
-                                       }\r
-                               }\r
-\r
-                       // Speed-up: Sizzle("TAG")\r
-                       } else if ( match[2] ) {\r
-                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
-                               return results;\r
-\r
-                       // Speed-up: Sizzle(".CLASS")\r
-                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
-                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
-                               return results;\r
-                       }\r
-               }\r
-       }\r
-\r
-       // All others\r
-       return select( selector, context, results, seed, xml );\r
-}\r
-\r
-Sizzle.matches = function( expr, elements ) {\r
-       return Sizzle( expr, null, null, elements );\r
-};\r
-\r
-Sizzle.matchesSelector = function( elem, expr ) {\r
-       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-};\r
-\r
-// Returns a function to use in pseudos for input types\r
-function createInputPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return name === "input" && elem.type === type;\r
-       };\r
-}\r
-\r
-// Returns a function to use in pseudos for buttons\r
-function createButtonPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return (name === "input" || name === "button") && elem.type === type;\r
-       };\r
-}\r
-\r
-/**\r
- * Utility function for retrieving the text value of an array of DOM nodes\r
- * @param {Array|Element} elem\r
- */\r
-getText = Sizzle.getText = function( elem ) {\r
-       var node,\r
-               ret = "",\r
-               i = 0,\r
-               nodeType = elem.nodeType;\r
-\r
-       if ( nodeType ) {\r
-               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
-                       // Use textContent for elements\r
-                       // innerText usage removed for consistency of new lines (see #11153)\r
-                       if ( typeof elem.textContent === "string" ) {\r
-                               return elem.textContent;\r
-                       } else {\r
-                               // Traverse its children\r
-                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
-                                       ret += getText( elem );\r
-                               }\r
-                       }\r
-               } else if ( nodeType === 3 || nodeType === 4 ) {\r
-                       return elem.nodeValue;\r
-               }\r
-               // Do not include comment or processing instruction nodes\r
-       } else {\r
-\r
-               // If no nodeType, this is expected to be an array\r
-               for ( ; (node = elem[i]); i++ ) {\r
-                       // Do not traverse comment nodes\r
-                       ret += getText( node );\r
-               }\r
-       }\r
-       return ret;\r
-};\r
-\r
-isXML = Sizzle.isXML = function isXML( elem ) {\r
-       // documentElement is verified for cases where it doesn't yet exist\r
-       // (such as loading iframes in IE - #4833)\r
-       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
-       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
-};\r
-\r
-// Element contains another\r
-contains = Sizzle.contains = docElem.contains ?\r
-       function( a, b ) {\r
-               var adown = a.nodeType === 9 ? a.documentElement : a,\r
-                       bup = b && b.parentNode;\r
-               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
-       } :\r
-       docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
-       } :\r
-       function( a, b ) {\r
-               while ( (b = b.parentNode) ) {\r
-                       if ( b === a ) {\r
-                               return true;\r
-                       }\r
-               }\r
-               return false;\r
-       };\r
-\r
-Sizzle.attr = function( elem, name ) {\r
-       var attr,\r
-               xml = isXML( elem );\r
-\r
-       if ( !xml ) {\r
-               name = name.toLowerCase();\r
-       }\r
-       if ( Expr.attrHandle[ name ] ) {\r
-               return Expr.attrHandle[ name ]( elem );\r
-       }\r
-       if ( assertAttributes || xml ) {\r
-               return elem.getAttribute( name );\r
-       }\r
-       attr = elem.getAttributeNode( name );\r
-       return attr ?\r
-               typeof elem[ name ] === "boolean" ?\r
-                       elem[ name ] ? name : null :\r
-                       attr.specified ? attr.value : null :\r
-               null;\r
-};\r
-\r
-Expr = Sizzle.selectors = {\r
-\r
-       // Can be adjusted by the user\r
-       cacheLength: 50,\r
-\r
-       createPseudo: markFunction,\r
-\r
-       match: matchExpr,\r
-\r
-       order: new RegExp( "ID|TAG" +\r
-               (assertUsableName ? "|NAME" : "") +\r
-               (assertUsableClassName ? "|CLASS" : "")\r
-       ),\r
-\r
-       // IE6/7 return a modified href\r
-       attrHandle: assertHrefNotNormalized ?\r
-               {} :\r
-               {\r
-                       "href": function( elem ) {\r
-                               return elem.getAttribute( "href", 2 );\r
-                       },\r
-                       "type": function( elem ) {\r
-                               return elem.getAttribute("type");\r
-                       }\r
-               },\r
-\r
-       find: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       return m && m.parentNode ? [m] : [];\r
-                               }\r
-                       } :\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-\r
-                                       return m ?\r
-                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
-                                                       [m] :\r
-                                                       undefined :\r
-                                               [];\r
-                               }\r
-                       },\r
-\r
-               "TAG": assertTagNameNoComments ?\r
-                       function( tag, context ) {\r
-                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
-                                       return context.getElementsByTagName( tag );\r
-                               }\r
-                       } :\r
-                       function( tag, context ) {\r
-                               var results = context.getElementsByTagName( tag );\r
-\r
-                               // Filter out possible comments\r
-                               if ( tag === "*" ) {\r
-                                       var elem,\r
-                                               tmp = [],\r
-                                               i = 0;\r
-\r
-                                       for ( ; (elem = results[i]); i++ ) {\r
-                                               if ( elem.nodeType === 1 ) {\r
-                                                       tmp.push( elem );\r
-                                               }\r
-                                       }\r
-\r
-                                       return tmp;\r
-                               }\r
-                               return results;\r
-                       },\r
-\r
-               "NAME": function( tag, context ) {\r
-                       if ( typeof context.getElementsByName !== strundefined ) {\r
-                               return context.getElementsByName( name );\r
-                       }\r
-               },\r
-\r
-               "CLASS": function( className, context, xml ) {\r
-                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
-                               return context.getElementsByClassName( className );\r
-                       }\r
-               }\r
-       },\r
-\r
-       relative: {\r
-               ">": { dir: "parentNode", first: true },\r
-               " ": { dir: "parentNode" },\r
-               "+": { dir: "previousSibling", first: true },\r
-               "~": { dir: "previousSibling" }\r
-       },\r
-\r
-       preFilter: {\r
-               "ATTR": function( match ) {\r
-                       match[1] = match[1].replace( rbackslash, "" );\r
-\r
-                       // Move the given value to match[3] whether quoted or unquoted\r
-                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
-\r
-                       if ( match[2] === "~=" ) {\r
-                               match[3] = " " + match[3] + " ";\r
-                       }\r
-\r
-                       return match.slice( 0, 4 );\r
-               },\r
-\r
-               "CHILD": function( match ) {\r
-                       /* matches from matchExpr.CHILD\r
-                               1 type (only|nth|...)\r
-                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
-                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
-                               4 sign of xn-component\r
-                               5 x of xn-component\r
-                               6 sign of y-component\r
-                               7 y of y-component\r
-                       */\r
-                       match[1] = match[1].toLowerCase();\r
-\r
-                       if ( match[1] === "nth" ) {\r
-                               // nth-child requires argument\r
-                               if ( !match[2] ) {\r
-                                       Sizzle.error( match[0] );\r
-                               }\r
-\r
-                               // numeric x and y parameters for Expr.filter.CHILD\r
-                               // remember that false/true cast respectively to 0/1\r
-                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
-                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
-\r
-                       // other types prohibit arguments\r
-                       } else if ( match[2] ) {\r
-                               Sizzle.error( match[0] );\r
-                       }\r
-\r
-                       return match;\r
-               },\r
-\r
-               "PSEUDO": function( match, context, xml ) {\r
-                       var unquoted, excess;\r
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
-                               return null;\r
-                       }\r
-\r
-                       if ( match[3] ) {\r
-                               match[2] = match[3];\r
-                       } else if ( (unquoted = match[4]) ) {\r
-                               // Only check arguments that contain a pseudo\r
-                               if ( rpseudo.test(unquoted) &&\r
-                                       // Get excess from tokenize (recursively)\r
-                                       (excess = tokenize( unquoted, context, xml, true )) &&\r
-                                       // advance to the next closing parenthesis\r
-                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
-\r
-                                       // excess is a negative index\r
-                                       unquoted = unquoted.slice( 0, excess );\r
-                                       match[0] = match[0].slice( 0, excess );\r
-                               }\r
-                               match[2] = unquoted;\r
-                       }\r
-\r
-                       // Return only captures needed by the pseudo filter method (type and argument)\r
-                       return match.slice( 0, 3 );\r
-               }\r
-       },\r
-\r
-       filter: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       return elem.getAttribute("id") === id;\r
-                               };\r
-                       } :\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
-                                       return node && node.value === id;\r
-                               };\r
-                       },\r
-\r
-               "TAG": function( nodeName ) {\r
-                       if ( nodeName === "*" ) {\r
-                               return function() { return true; };\r
-                       }\r
-                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
-\r
-                       return function( elem ) {\r
-                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
-                       };\r
-               },\r
-\r
-               "CLASS": function( className ) {\r
-                       var pattern = classCache[ expando ][ className ];\r
-                       if ( !pattern ) {\r
-                               pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );\r
-                       }\r
-                       return function( elem ) {\r
-                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
-                       };\r
-               },\r
-\r
-               "ATTR": function( name, operator, check ) {\r
-                       if ( !operator ) {\r
-                               return function( elem ) {\r
-                                       return Sizzle.attr( elem, name ) != null;\r
-                               };\r
-                       }\r
-\r
-                       return function( elem ) {\r
-                               var result = Sizzle.attr( elem, name ),\r
-                                       value = result + "";\r
-\r
-                               if ( result == null ) {\r
-                                       return operator === "!=";\r
-                               }\r
-\r
-                               switch ( operator ) {\r
-                                       case "=":\r
-                                               return value === check;\r
-                                       case "!=":\r
-                                               return value !== check;\r
-                                       case "^=":\r
-                                               return check && value.indexOf( check ) === 0;\r
-                                       case "*=":\r
-                                               return check && value.indexOf( check ) > -1;\r
-                                       case "$=":\r
-                                               return check && value.substr( value.length - check.length ) === check;\r
-                                       case "~=":\r
-                                               return ( " " + value + " " ).indexOf( check ) > -1;\r
-                                       case "|=":\r
-                                               return value === check || value.substr( 0, check.length + 1 ) === check + "-";\r
-                               }\r
-                       };\r
-               },\r
-\r
-               "CHILD": function( type, argument, first, last ) {\r
-\r
-                       if ( type === "nth" ) {\r
-                               var doneName = done++;\r
-\r
-                               return function( elem ) {\r
-                                       var parent, diff,\r
-                                               count = 0,\r
-                                               node = elem;\r
-\r
-                                       if ( first === 1 && last === 0 ) {\r
-                                               return true;\r
-                                       }\r
-\r
-                                       parent = elem.parentNode;\r
-\r
-                                       if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\r
-                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               node.sizset = ++count;\r
-                                                               if ( node === elem ) {\r
-                                                                       break;\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-\r
-                                               parent[ expando ] = doneName;\r
-                                       }\r
-\r
-                                       diff = elem.sizset - last;\r
-\r
-                                       if ( first === 0 ) {\r
-                                               return diff === 0;\r
-\r
-                                       } else {\r
-                                               return ( diff % first === 0 && diff / first >= 0 );\r
-                                       }\r
-                               };\r
-                       }\r
-\r
-                       return function( elem ) {\r
-                               var node = elem;\r
-\r
-                               switch ( type ) {\r
-                                       case "only":\r
-                                       case "first":\r
-                                               while ( (node = node.previousSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               if ( type === "first" ) {\r
-                                                       return true;\r
-                                               }\r
-\r
-                                               node = elem;\r
-\r
-                                               /* falls through */\r
-                                       case "last":\r
-                                               while ( (node = node.nextSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               return true;\r
-                               }\r
-                       };\r
-               },\r
-\r
-               "PSEUDO": function( pseudo, argument, context, xml ) {\r
-                       // pseudo-class names are case-insensitive\r
-                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
-                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
-                       var args,\r
-                               fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\r
-\r
-                       if ( !fn ) {\r
-                               Sizzle.error( "unsupported pseudo: " + pseudo );\r
-                       }\r
-\r
-                       // The user may use createPseudo to indicate that\r
-                       // arguments are needed to create the filter function\r
-                       // just as Sizzle does\r
-                       if ( !fn[ expando ] ) {\r
-                               if ( fn.length > 1 ) {\r
-                                       args = [ pseudo, pseudo, "", argument ];\r
-                                       return function( elem ) {\r
-                                               return fn( elem, 0, args );\r
-                                       };\r
-                               }\r
-                               return fn;\r
-                       }\r
-\r
-                       return fn( argument, context, xml );\r
-               }\r
-       },\r
-\r
-       pseudos: {\r
-               "not": markFunction(function( selector, context, xml ) {\r
-                       // Trim the selector passed to compile\r
-                       // to avoid treating leading and trailing\r
-                       // spaces as combinators\r
-                       var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );\r
-                       return function( elem ) {\r
-                               return !matcher( elem );\r
-                       };\r
-               }),\r
-\r
-               "enabled": function( elem ) {\r
-                       return elem.disabled === false;\r
-               },\r
-\r
-               "disabled": function( elem ) {\r
-                       return elem.disabled === true;\r
-               },\r
-\r
-               "checked": function( elem ) {\r
-                       // In CSS3, :checked should return both checked and selected elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       var nodeName = elem.nodeName.toLowerCase();\r
-                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
-               },\r
-\r
-               "selected": function( elem ) {\r
-                       // Accessing this property makes selected-by-default\r
-                       // options in Safari work properly\r
-                       if ( elem.parentNode ) {\r
-                               elem.parentNode.selectedIndex;\r
-                       }\r
-\r
-                       return elem.selected === true;\r
-               },\r
-\r
-               "parent": function( elem ) {\r
-                       return !Expr.pseudos["empty"]( elem );\r
-               },\r
-\r
-               "empty": function( elem ) {\r
-                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
-                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
-                       //   not comment, processing instructions, or others\r
-                       // Thanks to Diego Perini for the nodeName shortcut\r
-                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
-                       var nodeType;\r
-                       elem = elem.firstChild;\r
-                       while ( elem ) {\r
-                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
-                                       return false;\r
-                               }\r
-                               elem = elem.nextSibling;\r
-                       }\r
-                       return true;\r
-               },\r
-\r
-               "contains": markFunction(function( text ) {\r
-                       return function( elem ) {\r
-                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
-                       };\r
-               }),\r
-\r
-               "has": markFunction(function( selector ) {\r
-                       return function( elem ) {\r
-                               return Sizzle( selector, elem ).length > 0;\r
-                       };\r
-               }),\r
-\r
-               "header": function( elem ) {\r
-                       return rheader.test( elem.nodeName );\r
-               },\r
-\r
-               "text": function( elem ) {\r
-                       var type, attr;\r
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
-                       // use getAttribute instead to test this case\r
-                       return elem.nodeName.toLowerCase() === "input" &&\r
-                               (type = elem.type) === "text" &&\r
-                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
-               },\r
-\r
-               // Input types\r
-               "radio": createInputPseudo("radio"),\r
-               "checkbox": createInputPseudo("checkbox"),\r
-               "file": createInputPseudo("file"),\r
-               "password": createInputPseudo("password"),\r
-               "image": createInputPseudo("image"),\r
-\r
-               "submit": createButtonPseudo("submit"),\r
-               "reset": createButtonPseudo("reset"),\r
-\r
-               "button": function( elem ) {\r
-                       var name = elem.nodeName.toLowerCase();\r
-                       return name === "input" && elem.type === "button" || name === "button";\r
-               },\r
-\r
-               "input": function( elem ) {\r
-                       return rinputs.test( elem.nodeName );\r
-               },\r
-\r
-               "focus": function( elem ) {\r
-                       var doc = elem.ownerDocument;\r
-                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\r
-               },\r
-\r
-               "active": function( elem ) {\r
-                       return elem === elem.ownerDocument.activeElement;\r
-               }\r
-       },\r
-\r
-       setFilters: {\r
-               "first": function( elements, argument, not ) {\r
-                       return not ? elements.slice( 1 ) : [ elements[0] ];\r
-               },\r
-\r
-               "last": function( elements, argument, not ) {\r
-                       var elem = elements.pop();\r
-                       return not ? elements : [ elem ];\r
-               },\r
-\r
-               "even": function( elements, argument, not ) {\r
-                       var results = [],\r
-                               i = not ? 1 : 0,\r
-                               len = elements.length;\r
-                       for ( ; i < len; i = i + 2 ) {\r
-                               results.push( elements[i] );\r
-                       }\r
-                       return results;\r
-               },\r
-\r
-               "odd": function( elements, argument, not ) {\r
-                       var results = [],\r
-                               i = not ? 0 : 1,\r
-                               len = elements.length;\r
-                       for ( ; i < len; i = i + 2 ) {\r
-                               results.push( elements[i] );\r
-                       }\r
-                       return results;\r
-               },\r
-\r
-               "lt": function( elements, argument, not ) {\r
-                       return not ? elements.slice( +argument ) : elements.slice( 0, +argument );\r
-               },\r
-\r
-               "gt": function( elements, argument, not ) {\r
-                       return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\r
-               },\r
-\r
-               "eq": function( elements, argument, not ) {\r
-                       var elem = elements.splice( +argument, 1 );\r
-                       return not ? elements : elem;\r
-               }\r
-       }\r
-};\r
-\r
-function siblingCheck( a, b, ret ) {\r
-       if ( a === b ) {\r
-               return ret;\r
-       }\r
-\r
-       var cur = a.nextSibling;\r
-\r
-       while ( cur ) {\r
-               if ( cur === b ) {\r
-                       return -1;\r
-               }\r
-\r
-               cur = cur.nextSibling;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-sortOrder = docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-               }\r
-\r
-               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
-                       a.compareDocumentPosition :\r
-                       a.compareDocumentPosition(b) & 4\r
-               ) ? -1 : 1;\r
-       } :\r
-       function( a, b ) {\r
-               // The nodes are identical, we can exit early\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-\r
-               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
-               } else if ( a.sourceIndex && b.sourceIndex ) {\r
-                       return a.sourceIndex - b.sourceIndex;\r
-               }\r
-\r
-               var al, bl,\r
-                       ap = [],\r
-                       bp = [],\r
-                       aup = a.parentNode,\r
-                       bup = b.parentNode,\r
-                       cur = aup;\r
-\r
-               // If the nodes are siblings (or identical) we can do a quick check\r
-               if ( aup === bup ) {\r
-                       return siblingCheck( a, b );\r
-\r
-               // If no parents were found then the nodes are disconnected\r
-               } else if ( !aup ) {\r
-                       return -1;\r
-\r
-               } else if ( !bup ) {\r
-                       return 1;\r
-               }\r
-\r
-               // Otherwise they're somewhere else in the tree so we need\r
-               // to build up a full list of the parentNodes for comparison\r
-               while ( cur ) {\r
-                       ap.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               cur = bup;\r
-\r
-               while ( cur ) {\r
-                       bp.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               al = ap.length;\r
-               bl = bp.length;\r
-\r
-               // Start walking down the tree looking for a discrepancy\r
-               for ( var i = 0; i < al && i < bl; i++ ) {\r
-                       if ( ap[i] !== bp[i] ) {\r
-                               return siblingCheck( ap[i], bp[i] );\r
-                       }\r
-               }\r
-\r
-               // We ended someplace up the tree so do a sibling check\r
-               return i === al ?\r
-                       siblingCheck( a, bp[i], -1 ) :\r
-                       siblingCheck( ap[i], b, 1 );\r
-       };\r
-\r
-// Always assume the presence of duplicates if sort doesn't\r
-// pass them to our comparison function (as in Google Chrome).\r
-[0, 0].sort( sortOrder );\r
-baseHasDuplicate = !hasDuplicate;\r
-\r
-// Document sorting and removing duplicates\r
-Sizzle.uniqueSort = function( results ) {\r
-       var elem,\r
-               i = 1;\r
-\r
-       hasDuplicate = baseHasDuplicate;\r
-       results.sort( sortOrder );\r
-\r
-       if ( hasDuplicate ) {\r
-               for ( ; (elem = results[i]); i++ ) {\r
-                       if ( elem === results[ i - 1 ] ) {\r
-                               results.splice( i--, 1 );\r
-                       }\r
-               }\r
-       }\r
-\r
-       return results;\r
-};\r
-\r
-Sizzle.error = function( msg ) {\r
-       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
-};\r
-\r
-function tokenize( selector, context, xml, parseOnly ) {\r
-       var matched, match, tokens, type,\r
-               soFar, groups, group, i,\r
-               preFilters, filters,\r
-               checkContext = !xml && context !== document,\r
-               // Token cache should maintain spaces\r
-               key = ( checkContext ? "<s>" : "" ) + selector.replace( rtrim, "$1<s>" ),\r
-               cached = tokenCache[ expando ][ key ];\r
-\r
-       if ( cached ) {\r
-               return parseOnly ? 0 : slice.call( cached, 0 );\r
-       }\r
-\r
-       soFar = selector;\r
-       groups = [];\r
-       i = 0;\r
-       preFilters = Expr.preFilter;\r
-       filters = Expr.filter;\r
-\r
-       while ( soFar ) {\r
-\r
-               // Comma and first run\r
-               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
-                       if ( match ) {\r
-                               soFar = soFar.slice( match[0].length );\r
-                               tokens.selector = group;\r
-                       }\r
-                       groups.push( tokens = [] );\r
-                       group = "";\r
-\r
-                       // Need to make sure we're within a narrower context if necessary\r
-                       // Adding a descendant combinator will generate what is needed\r
-                       if ( checkContext ) {\r
-                               soFar = " " + soFar;\r
-                       }\r
-               }\r
-\r
-               matched = false;\r
-\r
-               // Combinators\r
-               if ( (match = rcombinators.exec( soFar )) ) {\r
-                       group += match[0];\r
-                       soFar = soFar.slice( match[0].length );\r
-\r
-                       // Cast descendant combinators to space\r
-                       matched = tokens.push({\r
-                               part: match.pop().replace( rtrim, " " ),\r
-                               string: match[0],\r
-                               captures: match\r
-                       });\r
-               }\r
-\r
-               // Filters\r
-               for ( type in filters ) {\r
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
-                               ( match = preFilters[ type ](match, context, xml) )) ) {\r
-\r
-                               group += match[0];\r
-                               soFar = soFar.slice( match[0].length );\r
-                               matched = tokens.push({\r
-                                       part: type,\r
-                                       string: match.shift(),\r
-                                       captures: match\r
-                               });\r
-                       }\r
-               }\r
-\r
-               if ( !matched ) {\r
-                       break;\r
-               }\r
-       }\r
-\r
-       // Attach the full group as a selector\r
-       if ( group ) {\r
-               tokens.selector = group;\r
-       }\r
-\r
-       // Return the length of the invalid excess\r
-       // if we're just parsing\r
-       // Otherwise, throw an error or return tokens\r
-       return parseOnly ?\r
-               soFar.length :\r
-               soFar ?\r
-                       Sizzle.error( selector ) :\r
-                       // Cache the tokens\r
-                       slice.call( tokenCache(key, groups), 0 );\r
-}\r
-\r
-function addCombinator( matcher, combinator, context, xml ) {\r
-       var dir = combinator.dir,\r
-               doneName = done++;\r
-\r
-       if ( !matcher ) {\r
-               // If there is no matcher to check, check against the context\r
-               matcher = function( elem ) {\r
-                       return elem === context;\r
-               };\r
-       }\r
-       return combinator.first ?\r
-               function( elem ) {\r
-                       while ( (elem = elem[ dir ]) ) {\r
-                               if ( elem.nodeType === 1 ) {\r
-                                       return matcher( elem ) && elem;\r
-                               }\r
-                       }\r
-               } :\r
-               xml ?\r
-                       function( elem ) {\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( elem.nodeType === 1 ) {\r
-                                               if ( matcher( elem ) ) {\r
-                                                       return elem;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } :\r
-                       function( elem ) {\r
-                               var cache,\r
-                                       dirkey = doneName + "." + dirruns,\r
-                                       cachedkey = dirkey + "." + cachedruns;\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( elem.nodeType === 1 ) {\r
-                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
-                                                       return elem.sizset;\r
-                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
-                                                       if ( elem.sizset ) {\r
-                                                               return elem;\r
-                                                       }\r
-                                               } else {\r
-                                                       elem[ expando ] = cachedkey;\r
-                                                       if ( matcher( elem ) ) {\r
-                                                               elem.sizset = true;\r
-                                                               return elem;\r
-                                                       }\r
-                                                       elem.sizset = false;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       };\r
-}\r
-\r
-function addMatcher( higher, deeper ) {\r
-       return higher ?\r
-               function( elem ) {\r
-                       var result = deeper( elem );\r
-                       return result && higher( result === true ? elem : result );\r
-               } :\r
-               deeper;\r
-}\r
-\r
-// ["TAG", ">", "ID", " ", "CLASS"]\r
-function matcherFromTokens( tokens, context, xml ) {\r
-       var token, matcher,\r
-               i = 0;\r
-\r
-       for ( ; (token = tokens[i]); i++ ) {\r
-               if ( Expr.relative[ token.part ] ) {\r
-                       matcher = addCombinator( matcher, Expr.relative[ token.part ], context, xml );\r
-               } else {\r
-                       matcher = addMatcher( matcher, Expr.filter[ token.part ].apply(null, token.captures.concat( context, xml )) );\r
-               }\r
-       }\r
-\r
-       return matcher;\r
-}\r
-\r
-function matcherFromGroupMatchers( matchers ) {\r
-       return function( elem ) {\r
-               var matcher,\r
-                       j = 0;\r
-               for ( ; (matcher = matchers[j]); j++ ) {\r
-                       if ( matcher(elem) ) {\r
-                               return true;\r
-                       }\r
-               }\r
-               return false;\r
-       };\r
-}\r
-\r
-compile = Sizzle.compile = function( selector, context, xml ) {\r
-       var group, i, len,\r
-               cached = compilerCache[ expando ][ selector ];\r
-\r
-       // Return a cached group function if already generated (context dependent)\r
-       if ( cached && cached.context === context ) {\r
-               return cached;\r
-       }\r
-\r
-       // Generate a function of recursive functions that can be used to check each element\r
-       group = tokenize( selector, context, xml );\r
-       for ( i = 0, len = group.length; i < len; i++ ) {\r
-               group[i] = matcherFromTokens(group[i], context, xml);\r
-       }\r
-\r
-       // Cache the compiled function\r
-       cached = compilerCache( selector, matcherFromGroupMatchers(group) );\r
-       cached.context = context;\r
-       cached.runs = cached.dirruns = 0;\r
-       return cached;\r
-};\r
-\r
-function multipleContexts( selector, contexts, results, seed ) {\r
-       var i = 0,\r
-               len = contexts.length;\r
-       for ( ; i < len; i++ ) {\r
-               Sizzle( selector, contexts[i], results, seed );\r
-       }\r
-}\r
-\r
-function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
-       var results,\r
-               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
-\r
-       if ( !fn ) {\r
-               Sizzle.error( posfilter );\r
-       }\r
-\r
-       if ( selector || !(results = seed) ) {\r
-               multipleContexts( selector || "*", contexts, (results = []), seed );\r
-       }\r
-\r
-       return results.length > 0 ? fn( results, argument, not ) : [];\r
-}\r
-\r
-function handlePOS( groups, context, results, seed ) {\r
-       var group, part, j, groupLen, token, selector,\r
-               anchor, elements, match, matched,\r
-               lastIndex, currentContexts, not,\r
-               i = 0,\r
-               len = groups.length,\r
-               rpos = matchExpr["POS"],\r
-               // This is generated here in case matchExpr["POS"] is extended\r
-               rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),\r
-               // This is for making sure non-participating\r
-               // matching groups are represented cross-browser (IE6-8)\r
-               setUndefined = function() {\r
-                       var i = 1,\r
-                               len = arguments.length - 2;\r
-                       for ( ; i < len; i++ ) {\r
-                               if ( arguments[i] === undefined ) {\r
-                                       match[i] = undefined;\r
-                               }\r
-                       }\r
-               };\r
-\r
-       for ( ; i < len; i++ ) {\r
-               group = groups[i];\r
-               part = "";\r
-               elements = seed;\r
-               for ( j = 0, groupLen = group.length; j < groupLen; j++ ) {\r
-                       token = group[j];\r
-                       selector = token.string;\r
-                       if ( token.part === "PSEUDO" ) {\r
-                               // Reset regex index to 0\r
-                               rpos.exec("");\r
-                               anchor = 0;\r
-                               while ( (match = rpos.exec( selector )) ) {\r
-                                       matched = true;\r
-                                       lastIndex = rpos.lastIndex = match.index + match[0].length;\r
-                                       if ( lastIndex > anchor ) {\r
-                                               part += selector.slice( anchor, match.index );\r
-                                               anchor = lastIndex;\r
-                                               currentContexts = [ context ];\r
-\r
-                                               if ( rcombinators.test(part) ) {\r
-                                                       if ( elements ) {\r
-                                                               currentContexts = elements;\r
-                                                       }\r
-                                                       elements = seed;\r
-                                               }\r
-\r
-                                               if ( (not = rendsWithNot.test( part )) ) {\r
-                                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
-                                                       anchor++;\r
-                                               }\r
-\r
-                                               if ( match.length > 1 ) {\r
-                                                       match[0].replace( rposgroups, setUndefined );\r
-                                               }\r
-                                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
-                                       }\r
-                                       part = "";\r
-                               }\r
-\r
-                       }\r
-\r
-                       if ( !matched ) {\r
-                               part += selector;\r
-                       }\r
-                       matched = false;\r
-               }\r
-\r
-               if ( part ) {\r
-                       if ( rcombinators.test(part) ) {\r
-                               multipleContexts( part, elements || [ context ], results, seed );\r
-                       } else {\r
-                               Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
-                       }\r
-               } else {\r
-                       push.apply( results, elements );\r
-               }\r
-       }\r
-\r
-       // Do not sort if this is a single filter\r
-       return len === 1 ? results : Sizzle.uniqueSort( results );\r
-}\r
-\r
-function select( selector, context, results, seed, xml ) {\r
-       // Remove excessive whitespace\r
-       selector = selector.replace( rtrim, "$1" );\r
-       var elements, matcher, cached, elem,\r
-               i, tokens, token, lastToken, findContext, type,\r
-               match = tokenize( selector, context, xml ),\r
-               contextNodeType = context.nodeType;\r
-\r
-       // POS handling\r
-       if ( matchExpr["POS"].test(selector) ) {\r
-               return handlePOS( match, context, results, seed );\r
-       }\r
-\r
-       if ( seed ) {\r
-               elements = slice.call( seed, 0 );\r
-\r
-       // To maintain document order, only narrow the\r
-       // set if there is one group\r
-       } else if ( match.length === 1 ) {\r
-\r
-               // Take a shortcut and set the context if the root selector is an ID\r
-               if ( (tokens = slice.call( match[0], 0 )).length > 2 &&\r
-                               (token = tokens[0]).part === "ID" &&\r
-                               contextNodeType === 9 && !xml &&\r
-                               Expr.relative[ tokens[1].part ] ) {\r
-\r
-                       context = Expr.find["ID"]( token.captures[0].replace( rbackslash, "" ), context, xml )[0];\r
-                       if ( !context ) {\r
-                               return results;\r
-                       }\r
-\r
-                       selector = selector.slice( tokens.shift().string.length );\r
-               }\r
-\r
-               findContext = ( (match = rsibling.exec( tokens[0].string )) && !match.index && context.parentNode ) || context;\r
-\r
-               // Reduce the set if possible\r
-               lastToken = "";\r
-               for ( i = tokens.length - 1; i >= 0; i-- ) {\r
-                       token = tokens[i];\r
-                       type = token.part;\r
-                       lastToken = token.string + lastToken;\r
-                       if ( Expr.relative[ type ] ) {\r
-                               break;\r
-                       }\r
-                       if ( Expr.order.test(type) ) {\r
-                               elements = Expr.find[ type ]( token.captures[0].replace( rbackslash, "" ), findContext, xml );\r
-                               if ( elements == null ) {\r
-                                       continue;\r
-                               } else {\r
-                                       selector = selector.slice( 0, selector.length - lastToken.length ) +\r
-                                               lastToken.replace( matchExpr[ type ], "" );\r
-\r
-                                       if ( !selector ) {\r
-                                               push.apply( results, slice.call(elements, 0) );\r
-                                       }\r
-\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // Only loop over the given elements once\r
-       if ( selector ) {\r
-               matcher = compile( selector, context, xml );\r
-               dirruns = matcher.dirruns++;\r
-               if ( elements == null ) {\r
-                       elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );\r
-               }\r
-\r
-               for ( i = 0; (elem = elements[i]); i++ ) {\r
-                       cachedruns = matcher.runs++;\r
-                       if ( matcher(elem) ) {\r
-                               results.push( elem );\r
-                       }\r
-               }\r
-       }\r
-\r
-       return results;\r
-}\r
-\r
-if ( document.querySelectorAll ) {\r
-       (function() {\r
-               var disconnectedMatch,\r
-                       oldSelect = select,\r
-                       rescape = /'|\\/g,\r
-                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
-                       rbuggyQSA = [],\r
-                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
-                       // A support test would require too much code (would include document ready)\r
-                       // just skip matchesSelector for :active\r
-                       rbuggyMatches = [":active"],\r
-                       matches = docElem.matchesSelector ||\r
-                               docElem.mozMatchesSelector ||\r
-                               docElem.webkitMatchesSelector ||\r
-                               docElem.oMatchesSelector ||\r
-                               docElem.msMatchesSelector;\r
-\r
-               // Build QSA regex\r
-               // Regex strategy adopted from Diego Perini\r
-               assert(function( div ) {\r
-                       // Select is set to empty string on purpose\r
-                       // This is to test IE's treatment of not explictly\r
-                       // setting a boolean content attribute,\r
-                       // since its presence should be enough\r
-                       // http://bugs.jquery.com/ticket/12359\r
-                       div.innerHTML = "<select><option selected=''></option></select>";\r
-\r
-                       // IE8 - Some boolean attributes are not treated correctly\r
-                       if ( !div.querySelectorAll("[selected]").length ) {\r
-                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
-                       }\r
-\r
-                       // Webkit/Opera - :checked should return selected option elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       if ( !div.querySelectorAll(":checked").length ) {\r
-                               rbuggyQSA.push(":checked");\r
-                       }\r
-               });\r
-\r
-               assert(function( div ) {\r
-\r
-                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
-                       // Should not select anything\r
-                       div.innerHTML = "<p test=''></p>";\r
-                       if ( div.querySelectorAll("[test^='']").length ) {\r
-                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
-                       }\r
-\r
-                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       div.innerHTML = "<input type='hidden'/>";\r
-                       if ( !div.querySelectorAll(":enabled").length ) {\r
-                               rbuggyQSA.push(":enabled", ":disabled");\r
-                       }\r
-               });\r
-\r
-               rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\r
-\r
-               select = function( selector, context, results, seed, xml ) {\r
-                       // Only use querySelectorAll when not filtering,\r
-                       // when this is not xml,\r
-                       // and when no QSA bugs apply\r
-                       if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r
-                               if ( context.nodeType === 9 ) {\r
-                                       try {\r
-                                               push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\r
-                                               return results;\r
-                                       } catch(qsaError) {}\r
-                               // qSA works strangely on Element-rooted queries\r
-                               // We can work around this by specifying an extra ID on the root\r
-                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
-                               // IE 8 doesn't work on object elements\r
-                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
-                                       var groups, i, len,\r
-                                               old = context.getAttribute("id"),\r
-                                               nid = old || expando,\r
-                                               newContext = rsibling.test( selector ) && context.parentNode || context;\r
-\r
-                                       if ( old ) {\r
-                                               nid = nid.replace( rescape, "\\$&" );\r
-                                       } else {\r
-                                               context.setAttribute( "id", nid );\r
-                                       }\r
-\r
-                                       groups = tokenize(selector, context, xml);\r
-                                       // Trailing space is unnecessary\r
-                                       // There is always a context check\r
-                                       nid = "[id='" + nid + "']";\r
-                                       for ( i = 0, len = groups.length; i < len; i++ ) {\r
-                                               groups[i] = nid + groups[i].selector;\r
-                                       }\r
-                                       try {\r
-                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
-                                                       groups.join(",")\r
-                                               ), 0 ) );\r
-                                               return results;\r
-                                       } catch(qsaError) {\r
-                                       } finally {\r
-                                               if ( !old ) {\r
-                                                       context.removeAttribute("id");\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       return oldSelect( selector, context, results, seed, xml );\r
-               };\r
-\r
-               if ( matches ) {\r
-                       assert(function( div ) {\r
-                               // Check to see if it's possible to do matchesSelector\r
-                               // on a disconnected node (IE 9)\r
-                               disconnectedMatch = matches.call( div, "div" );\r
-\r
-                               // This should fail with an exception\r
-                               // Gecko does not error, returns false instead\r
-                               try {\r
-                                       matches.call( div, "[test!='']:sizzle" );\r
-                                       rbuggyMatches.push( matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=" );\r
-                               } catch ( e ) {}\r
-                       });\r
-\r
-                       // rbuggyMatches always contains :active, so no need for a length check\r
-                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
-\r
-                       Sizzle.matchesSelector = function( elem, expr ) {\r
-                               // Make sure that attribute selectors are quoted\r
-                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
-\r
-                               // rbuggyMatches always contains :active, so no need for an existence check\r
-                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\r
-                                       try {\r
-                                               var ret = matches.call( elem, expr );\r
-\r
-                                               // IE 9's matchesSelector returns false on disconnected nodes\r
-                                               if ( ret || disconnectedMatch ||\r
-                                                               // As well, disconnected nodes are said to be in a document\r
-                                                               // fragment in IE 9\r
-                                                               elem.document && elem.document.nodeType !== 11 ) {\r
-                                                       return ret;\r
-                                               }\r
-                                       } catch(e) {}\r
-                               }\r
-\r
-                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-                       };\r
-               }\r
-       })();\r
-}\r
-\r
-// Deprecated\r
-Expr.setFilters["nth"] = Expr.setFilters["eq"];\r
-\r
-// Back-compat\r
-Expr.filters = Expr.pseudos;\r
-\r
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-\r
-\r
-})( window );\r
-var runtil = /Until$/,
-       rparentsprev = /^(?:parents|prev(?:Until|All))/,
-       isSimple = /^.[^:#\[\.,]*$/,
-       rneedsContext = jQuery.expr.match.needsContext,
-       // methods guaranteed to produce a unique set when starting from a unique set
-       guaranteedUnique = {
-               children: true,
-               contents: true,
-               next: true,
-               prev: true
-       };
+                       cacheable = true;
 
-jQuery.fn.extend({
-       find: function( selector ) {
-               var i, l, length, n, r, ret,
-                       self = this;
+                       cacheresults = jQuery.fragments[ first ];
+                       if ( cacheresults && cacheresults !== 1 ) {
+                               fragment = cacheresults;
+                       }
+               }
 
-               if ( typeof selector !== "string" ) {
-                       return jQuery( selector ).filter(function() {
-                               for ( i = 0, l = self.length; i < l; i++ ) {
-                                       if ( jQuery.contains( self[ i ], this ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
+               if ( !fragment ) {
+                       fragment = doc.createDocumentFragment();
+                       jQuery.clean( args, doc, fragment, scripts );
                }
 
-               ret = this.pushStack( "", "find", selector );
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+               }
 
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       length = ret.length;
-                       jQuery.find( selector, this[i], ret );
+               return { fragment: fragment, cacheable: cacheable };
+       };
 
-                       if ( i > 0 ) {
-                               // Make sure that the results are unique
-                               for ( n = length; n < ret.length; n++ ) {
-                                       for ( r = 0; r < length; r++ ) {
-                                               if ( ret[r] === ret[n] ) {
-                                                       ret.splice(n--, 1);
-                                                       break;
-                                               }
-                                       }
+       jQuery.fragments = {};
+
+       jQuery.each({
+               appendTo: "append",
+               prependTo: "prepend",
+               insertBefore: "before",
+               insertAfter: "after",
+               replaceAll: "replaceWith"
+       }, function( name, original ) {
+               jQuery.fn[ name ] = function( selector ) {
+                       var ret = [],
+                               insert = jQuery( selector ),
+                               parent = this.length === 1 && this[0].parentNode;
+
+                       if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                               insert[ original ]( this[0] );
+                               return this;
+
+                       } else {
+                               for ( var i = 0, l = insert.length; i < l; i++ ) {
+                                       var elems = ( i > 0 ? this.clone(true) : this ).get();
+                                       jQuery( insert[i] )[ original ]( elems );
+                                       ret = ret.concat( elems );
                                }
+
+                               return this.pushStack( ret, name, insert.selector );
                        }
+               };
+       });
+
+       function getAll( elem ) {
+               if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                       return elem.getElementsByTagName( "*" );
+
+               } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+                       return elem.querySelectorAll( "*" );
+
+               } else {
+                       return [];
+               }
+       }
+
+// Used in clean, fixes the defaultChecked property
+       function fixDefaultChecked( elem ) {
+               if ( elem.type === "checkbox" || elem.type === "radio" ) {
+                       elem.defaultChecked = elem.checked;
+               }
+       }
+// Finds all inputs and passes them to fixDefaultChecked
+       function findInputs( elem ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "input" ) {
+                       fixDefaultChecked( elem );
+                       // Skip scripts, get other children
+               } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
                }
+       }
 
-               return ret;
-       },
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+       function shimCloneNode( elem ) {
+               var div = document.createElement( "div" );
+               safeFragment.appendChild( div );
 
-       has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
+               div.innerHTML = elem.outerHTML;
+               return div.firstChild;
+       }
 
-               return this.filter(function() {
-                       for ( i = 0; i < len; i++ ) {
-                               if ( jQuery.contains( this, targets[i] ) ) {
-                                       return true;
-                               }
-                       }
-               });
-       },
-
-       not: function( selector ) {
-               return this.pushStack( winnow(this, selector, false), "not", selector);
-       },
-
-       filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true), "filter", selector );
-       },
-
-       is: function( selector ) {
-               return !!selector && (
-                       typeof selector === "string" ?
-                               // If this is a positional/relative selector, check membership in the returned set
-                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               rneedsContext.test( selector ) ?
-                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                       jQuery.filter( selector, this ).length > 0 :
-                               this.filter( selector ).length > 0 );
-       },
-
-       closest: function( selectors, context ) {
-               var cur,
-                       i = 0,
-                       l = this.length,
-                       ret = [],
-                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
+       jQuery.extend({
+               clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+                       var srcElements,
+                               destElements,
+                               i,
+                       // IE<=8 does not properly clone detached, unknown element nodes
+                               clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+                                       elem.cloneNode( true ) :
+                                       shimCloneNode( elem );
+
+                       if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                               // IE copies events bound via attachEvent when using cloneNode.
+                               // Calling detachEvent on the clone will also remove the events
+                               // from the original. In order to get around this, we use some
+                               // proprietary methods to clear the events. Thanks to MooTools
+                               // guys for this hotness.
 
-               for ( ; i < l; i++ ) {
-                       cur = this[i];
+                               cloneFixAttributes( elem, clone );
 
-                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                       ret.push( cur );
-                                       break;
+                               // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
+
+                               // Weird iteration because IE will replace the length property
+                               // with an element if you are cloning the body and one of the
+                               // elements on the page has a name or id of "length"
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       // Ensure that the destination node is not null; Fixes #9587
+                                       if ( destElements[i] ) {
+                                               cloneFixAttributes( srcElements[i], destElements[i] );
+                                       }
                                }
-                               cur = cur.parentNode;
                        }
-               }
-
-               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
-               return this.pushStack( ret, "closest", selectors );
-       },
+                       // Copy the events from the original to the clone
+                       if ( dataAndEvents ) {
+                               cloneCopyEvent( elem, clone );
 
-       // Determine the position of an element within
-       // the matched set of elements
-       index: function( elem ) {
-
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-               }
+                               if ( deepDataAndEvents ) {
+                                       srcElements = getAll( elem );
+                                       destElements = getAll( clone );
 
-               // index in selector
-               if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
-               }
+                                       for ( i = 0; srcElements[i]; ++i ) {
+                                               cloneCopyEvent( srcElements[i], destElements[i] );
+                                       }
+                               }
+                       }
 
-               // Locate the position of the desired element
-               return jQuery.inArray(
-                       // If it receives a jQuery object, the first element is used
-                       elem.jquery ? elem[0] : elem, this );
-       },
-
-       add: function( selector, context ) {
-               var set = typeof selector === "string" ?
-                               jQuery( selector, context ) :
-                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-                       all = jQuery.merge( this.get(), set );
-
-               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                       all :
-                       jQuery.unique( all ) );
-       },
-
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter(selector)
-               );
-       }
-});
+                       srcElements = destElements = null;
 
-jQuery.fn.andSelf = jQuery.fn.addBack;
+                       // Return the cloned set
+                       return clone;
+               },
 
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-       return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
-
-       return cur;
-}
-
-jQuery.each({
-       parent: function( elem ) {
-               var parent = elem.parentNode;
-               return parent && parent.nodeType !== 11 ? parent : null;
-       },
-       parents: function( elem ) {
-               return jQuery.dir( elem, "parentNode" );
-       },
-       parentsUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "parentNode", until );
-       },
-       next: function( elem ) {
-               return sibling( elem, "nextSibling" );
-       },
-       prev: function( elem ) {
-               return sibling( elem, "previousSibling" );
-       },
-       nextAll: function( elem ) {
-               return jQuery.dir( elem, "nextSibling" );
-       },
-       prevAll: function( elem ) {
-               return jQuery.dir( elem, "previousSibling" );
-       },
-       nextUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "nextSibling", until );
-       },
-       prevUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "previousSibling", until );
-       },
-       siblings: function( elem ) {
-               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-       },
-       children: function( elem ) {
-               return jQuery.sibling( elem.firstChild );
-       },
-       contents: function( elem ) {
-               return jQuery.nodeName( elem, "iframe" ) ?
-                       elem.contentDocument || elem.contentWindow.document :
-                       jQuery.merge( [], elem.childNodes );
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until );
+               clean: function( elems, context, fragment, scripts ) {
+                       var checkScriptType, script, j,
+                               ret = [];
 
-               if ( !runtil.test( name ) ) {
-                       selector = until;
-               }
+                       context = context || document;
 
-               if ( selector && typeof selector === "string" ) {
-                       ret = jQuery.filter( selector, ret );
-               }
+                       // !context.createElement fails in IE with an error but returns typeof 'object'
+                       if ( typeof context.createElement === "undefined" ) {
+                               context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+                       }
 
-               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                               if ( typeof elem === "number" ) {
+                                       elem += "";
+                               }
 
-               if ( this.length > 1 && rparentsprev.test( name ) ) {
-                       ret = ret.reverse();
-               }
+                               if ( !elem ) {
+                                       continue;
+                               }
 
-               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-       };
-});
+                               // Convert html string into DOM nodes
+                               if ( typeof elem === "string" ) {
+                                       if ( !rhtml.test( elem ) ) {
+                                               elem = context.createTextNode( elem );
+                                       } else {
+                                               // Fix "XHTML"-style tags in all browsers
+                                               elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+                                               // Trim whitespace, otherwise indexOf won't work as expected
+                                               var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+                                                       wrap = wrapMap[ tag ] || wrapMap._default,
+                                                       depth = wrap[0],
+                                                       div = context.createElement("div"),
+                                                       safeChildNodes = safeFragment.childNodes,
+                                                       remove;
+
+                                               // Append wrapper element to unknown element safe doc fragment
+                                               if ( context === document ) {
+                                                       // Use the fragment we've already created for this document
+                                                       safeFragment.appendChild( div );
+                                               } else {
+                                                       // Use a fragment created with the owner document
+                                                       createSafeFragment( context ).appendChild( div );
+                                               }
 
-jQuery.extend({
-       filter: function( expr, elems, not ) {
-               if ( not ) {
-                       expr = ":not(" + expr + ")";
-               }
+                                               // Go to html and back, then peel off extra wrappers
+                                               div.innerHTML = wrap[1] + elem + wrap[2];
 
-               return elems.length === 1 ?
-                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                       jQuery.find.matches(expr, elems);
-       },
+                                               // Move to the right depth
+                                               while ( depth-- ) {
+                                                       div = div.lastChild;
+                                               }
 
-       dir: function( elem, dir, until ) {
-               var matched = [],
-                       cur = elem[ dir ];
+                                               // Remove IE's autoinserted <tbody> from table fragments
+                                               if ( !jQuery.support.tbody ) {
 
-               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                       if ( cur.nodeType === 1 ) {
-                               matched.push( cur );
-                       }
-                       cur = cur[dir];
-               }
-               return matched;
-       },
+                                                       // String was a <table>, *may* have spurious <tbody>
+                                                       var hasBody = rtbody.test(elem),
+                                                               tbody = tag === "table" && !hasBody ?
+                                                                       div.firstChild && div.firstChild.childNodes :
 
-       sibling: function( n, elem ) {
-               var r = [];
+                                                                       // String was a bare <thead> or <tfoot>
+                                                                       wrap[1] === "<table>" && !hasBody ?
+                                                                               div.childNodes :
+                                                                               [];
 
-               for ( ; n; n = n.nextSibling ) {
-                       if ( n.nodeType === 1 && n !== elem ) {
-                               r.push( n );
-                       }
-               }
+                                                       for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                               if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                                       tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                               }
+                                                       }
+                                               }
 
-               return r;
-       }
-});
+                                               // IE completely kills leading whitespace when innerHTML is used
+                                               if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                                       div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                               }
 
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
+                                               elem = div.childNodes;
 
-       // Can't pass null or undefined to indexOf in Firefox 4
-       // Set to 0 to skip string check
-       qualifier = qualifier || 0;
+                                               // Clear elements from DocumentFragment (safeFragment or otherwise)
+                                               // to avoid hoarding elements. Fixes #11356
+                                               if ( div ) {
+                                                       div.parentNode.removeChild( div );
 
-       if ( jQuery.isFunction( qualifier ) ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       var retVal = !!qualifier.call( elem, i, elem );
-                       return retVal === keep;
-               });
+                                                       // Guard against -1 index exceptions in FF3.6
+                                                       if ( safeChildNodes.length > 0 ) {
+                                                               remove = safeChildNodes[ safeChildNodes.length - 1 ];
 
-       } else if ( qualifier.nodeType ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( elem === qualifier ) === keep;
-               });
+                                                               if ( remove && remove.parentNode ) {
+                                                                       remove.parentNode.removeChild( remove );
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
 
-       } else if ( typeof qualifier === "string" ) {
-               var filtered = jQuery.grep(elements, function( elem ) {
-                       return elem.nodeType === 1;
-               });
+                               // Resets defaultChecked for any radios and checkboxes
+                               // about to be appended to the DOM in IE 6/7 (#8060)
+                               var len;
+                               if ( !jQuery.support.appendChecked ) {
+                                       if ( elem[0] && typeof (len = elem.length) === "number" ) {
+                                               for ( j = 0; j < len; j++ ) {
+                                                       findInputs( elem[j] );
+                                               }
+                                       } else {
+                                               findInputs( elem );
+                                       }
+                               }
 
-               if ( isSimple.test( qualifier ) ) {
-                       return jQuery.filter(qualifier, filtered, !keep);
-               } else {
-                       qualifier = jQuery.filter( qualifier, filtered );
-               }
-       }
+                               if ( elem.nodeType ) {
+                                       ret.push( elem );
+                               } else {
+                                       ret = jQuery.merge( ret, elem );
+                               }
+                       }
 
-       return jQuery.grep(elements, function( elem, i ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-       });
-}
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-       safeFrag = document.createDocumentFragment();
-
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
-                       );
-               }
-       }
-       return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-       rleadingWhitespace = /^\s+/,
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-       rtagName = /<([\w:]+)/,
-       rtbody = /<tbody/i,
-       rhtml = /<|&#?\w+;/,
-       rnoInnerhtml = /<(?:script|style|link)/i,
-       rnocache = /<(?:script|object|embed|option|style)/i,
-       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       rcheckableType = /^(?:checkbox|radio)$/,
-       // checked="checked" or checked
-       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptType = /\/(java|ecma)script/i,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
-       wrapMap = {
-               option: [ 1, "<select multiple='multiple'>", "</select>" ],
-               legend: [ 1, "<fieldset>", "</fieldset>" ],
-               thead: [ 1, "<table>", "</table>" ],
-               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-               area: [ 1, "<map>", "</map>" ],
-               _default: [ 0, "", "" ]
-       },
-       safeFragment = createSafeFragment( document ),
-       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
-       wrapMap._default = [ 1, "X<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
-       text: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       return value === undefined ?
-                               jQuery.text( this ) :
-                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-               }, null, value, arguments.length );
-       },
-
-       wrapAll: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapAll( html.call(this, i) );
-                       });
-               }
+                       if ( fragment ) {
+                               checkScriptType = function( elem ) {
+                                       return !elem.type || rscriptType.test( elem.type );
+                               };
+                               for ( i = 0; ret[i]; i++ ) {
+                                       script = ret[i];
+                                       if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+                                               scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
 
-               if ( this[0] ) {
-                       // The elements to wrap the target around
-                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+                                       } else {
+                                               if ( script.nodeType === 1 ) {
+                                                       var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
 
-                       if ( this[0].parentNode ) {
-                               wrap.insertBefore( this[0] );
+                                                       ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               }
+                                               fragment.appendChild( script );
+                                       }
+                               }
                        }
 
-                       wrap.map(function() {
-                               var elem = this;
+                       return ret;
+               },
 
-                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                       elem = elem.firstChild;
-                               }
+               cleanData: function( elems ) {
+                       var data, id,
+                               cache = jQuery.cache,
+                               special = jQuery.event.special,
+                               deleteExpando = jQuery.support.deleteExpando;
 
-                               return elem;
-                       }).append( this );
-               }
+                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                                       continue;
+                               }
 
-               return this;
-       },
+                               id = elem[ jQuery.expando ];
 
-       wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapInner( html.call(this, i) );
-                       });
-               }
+                               if ( id ) {
+                                       data = cache[ id ];
 
-               return this.each(function() {
-                       var self = jQuery( this ),
-                               contents = self.contents();
+                                       if ( data && data.events ) {
+                                               for ( var type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
 
-                       if ( contents.length ) {
-                               contents.wrapAll( html );
+                                                               // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
 
-                       } else {
-                               self.append( html );
-                       }
-               });
-       },
+                                               // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+                                               if ( data.handle ) {
+                                                       data.handle.elem = null;
+                                               }
+                                       }
 
-       wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
+                                       if ( deleteExpando ) {
+                                               delete elem[ jQuery.expando ];
 
-               return this.each(function(i) {
-                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-               });
-       },
+                                       } else if ( elem.removeAttribute ) {
+                                               elem.removeAttribute( jQuery.expando );
+                                       }
 
-       unwrap: function() {
-               return this.parent().each(function() {
-                       if ( !jQuery.nodeName( this, "body" ) ) {
-                               jQuery( this ).replaceWith( this.childNodes );
+                                       delete cache[ id ];
+                               }
                        }
-               }).end();
-       },
+               }
+       });
 
-       append: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.appendChild( elem );
-                       }
-               });
-       },
 
-       prepend: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.insertBefore( elem, this.firstChild );
-                       }
-               });
-       },
 
-       before: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this );
-                       });
-               }
 
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
-               }
-       },
+       var ralpha = /alpha\([^)]*\)/i,
+               ropacity = /opacity=([^)]*)/,
+       // fixed for IE9, see #8346
+               rupper = /([A-Z]|^ms)/g,
+               rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+               rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
+               rrelNum = /^([\-+])=([\-+.\de]+)/,
+               rmargin = /^margin/,
 
-       after: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this.nextSibling );
-                       });
-               }
+               cssShow = { position: "absolute", visibility: "hidden", display: "block" },
 
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-               }
-       },
+       // order is important!
+               cssExpand = [ "Top", "Right", "Bottom", "Left" ],
 
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               var elem,
-                       i = 0;
+               curCSS,
 
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-                               if ( !keepData && elem.nodeType === 1 ) {
-                                       jQuery.cleanData( elem.getElementsByTagName("*") );
-                                       jQuery.cleanData( [ elem ] );
-                               }
+               getComputedStyle,
+               currentStyle;
+
+       jQuery.fn.css = function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       };
+
+       jQuery.extend({
+               // Add in style property hooks for overriding the default
+               // behavior of getting and setting a style property
+               cssHooks: {
+                       opacity: {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               // We should always get a number back from opacity
+                                               var ret = curCSS( elem, "opacity" );
+                                               return ret === "" ? "1" : ret;
 
-                               if ( elem.parentNode ) {
-                                       elem.parentNode.removeChild( elem );
+                                       } else {
+                                               return elem.style.opacity;
+                                       }
                                }
                        }
-               }
+               },
 
-               return this;
-       },
+               // Exclude the following css properties to add px
+               cssNumber: {
+                       "fillOpacity": true,
+                       "fontWeight": true,
+                       "lineHeight": true,
+                       "opacity": true,
+                       "orphans": true,
+                       "widows": true,
+                       "zIndex": true,
+                       "zoom": true
+               },
 
-       empty: function() {
-               var elem,
-                       i = 0;
+               // Add in properties whose names you wish to fix before
+               // setting or getting the value
+               cssProps: {
+                       // normalize float css property
+                       "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+               },
 
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       // Remove element nodes and prevent memory leaks
-                       if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( elem.getElementsByTagName("*") );
+               // Get and set the style property on a DOM Node
+               style: function( elem, name, value, extra ) {
+                       // Don't set styles on text and comment nodes
+                       if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                               return;
                        }
 
-                       // Remove any remaining nodes
-                       while ( elem.firstChild ) {
-                               elem.removeChild( elem.firstChild );
-                       }
-               }
+                       // Make sure that we're working with the right name
+                       var ret, type, origName = jQuery.camelCase( name ),
+                               style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
-               return this;
-       },
+                       name = jQuery.cssProps[ origName ] || origName;
 
-       clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+                       // Check if we're setting a value
+                       if ( value !== undefined ) {
+                               type = typeof value;
 
-               return this.map( function () {
-                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-               });
-       },
+                               // convert relative number strings (+= or -=) to relative numbers. #7345
+                               if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                                       value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+                                       // Fixes bug #9237
+                                       type = "number";
+                               }
 
-       html: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       var elem = this[0] || {},
-                               i = 0,
-                               l = this.length;
+                               // Make sure that NaN and null values aren't set. See: #7116
+                               if ( value == null || type === "number" && isNaN( value ) ) {
+                                       return;
+                               }
 
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
-                       }
+                               // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                               if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                                       value += "px";
+                               }
 
-                       // See if we can take a shortcut and just use innerHTML
-                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+                               // If a hook was provided, use that value, otherwise just set the specified value
+                               if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+                                       // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                                       // Fixes bug #5509
+                                       try {
+                                               style[ name ] = value;
+                                       } catch(e) {}
+                               }
 
-                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+                       } else {
+                               // If a hook was provided get the non-computed value from there
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                                       return ret;
+                               }
 
-                               try {
-                                       for (; i < l; i++ ) {
-                                               // Remove element nodes and prevent memory leaks
-                                               elem = this[i] || {};
-                                               if ( elem.nodeType === 1 ) {
-                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-                                                       elem.innerHTML = value;
-                                               }
-                                       }
+                               // Otherwise just get the value from the style object
+                               return style[ name ];
+                       }
+               },
 
-                                       elem = 0;
+               css: function( elem, name, extra ) {
+                       var ret, hooks;
 
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
-                       }
+                       // Make sure that we're working with the right name
+                       name = jQuery.camelCase( name );
+                       hooks = jQuery.cssHooks[ name ];
+                       name = jQuery.cssProps[ name ] || name;
 
-                       if ( elem ) {
-                               this.empty().append( value );
+                       // cssFloat needs a special treatment
+                       if ( name === "cssFloat" ) {
+                               name = "float";
                        }
-               }, null, value, arguments.length );
-       },
 
-       replaceWith: function( value ) {
-               if ( !isDisconnected( this[0] ) ) {
-                       // Make sure that the elements are removed from the DOM before they are inserted
-                       // this can help fix replacing a parent with child elements
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function(i) {
-                                       var self = jQuery(this), old = self.html();
-                                       self.replaceWith( value.call( this, i, old ) );
-                               });
-                       }
+                       // If a hook was provided get the computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+                               return ret;
 
-                       if ( typeof value !== "string" ) {
-                               value = jQuery( value ).detach();
+                               // Otherwise, if a way to get the computed value exists, use that
+                       } else if ( curCSS ) {
+                               return curCSS( elem, name );
                        }
+               },
 
-                       return this.each(function() {
-                               var next = this.nextSibling,
-                                       parent = this.parentNode;
-
-                               jQuery( this ).remove();
+               // A method for quickly swapping in/out CSS properties to get correct calculations
+               swap: function( elem, options, callback ) {
+                       var old = {},
+                               ret, name;
 
-                               if ( next ) {
-                                       jQuery(next).before( value );
-                               } else {
-                                       jQuery(parent).append( value );
-                               }
-                       });
-               }
+                       // Remember the old values, and insert the new ones
+                       for ( name in options ) {
+                               old[ name ] = elem.style[ name ];
+                               elem.style[ name ] = options[ name ];
+                       }
 
-               return this.length ?
-                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                       this;
-       },
+                       ret = callback.call( elem );
 
-       detach: function( selector ) {
-               return this.remove( selector, true );
-       },
+                       // Revert the old values
+                       for ( name in options ) {
+                               elem.style[ name ] = old[ name ];
+                       }
 
-       domManip: function( args, table, callback ) {
+                       return ret;
+               }
+       });
 
-               // Flatten any nested arrays
-               args = [].concat.apply( [], args );
+// DEPRECATED in 1.3, Use jQuery.css() instead
+       jQuery.curCSS = jQuery.css;
 
-               var results, first, fragment, iNoClone,
-                       i = 0,
-                       value = args[0],
-                       scripts = [],
-                       l = this.length;
+       if ( document.defaultView && document.defaultView.getComputedStyle ) {
+               getComputedStyle = function( elem, name ) {
+                       var ret, defaultView, computedStyle, width,
+                               style = elem.style;
 
-               // We can't cloneNode fragments that contain checked, in WebKit
-               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
-                       return this.each(function() {
-                               jQuery(this).domManip( args, table, callback );
-                       });
-               }
+                       name = name.replace( rupper, "-$1" ).toLowerCase();
 
-               if ( jQuery.isFunction(value) ) {
-                       return this.each(function(i) {
-                               var self = jQuery(this);
-                               args[0] = value.call( this, i, table ? self.html() : undefined );
-                               self.domManip( args, table, callback );
-                       });
-               }
+                       if ( (defaultView = elem.ownerDocument.defaultView) &&
+                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
 
-               if ( this[0] ) {
-                       results = jQuery.buildFragment( args, this, scripts );
-                       fragment = results.fragment;
-                       first = fragment.firstChild;
-
-                       if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
-                       }
-
-                       if ( first ) {
-                               table = table && jQuery.nodeName( first, "tr" );
-
-                               // Use the original fragment for the last item instead of the first because it can end up
-                               // being emptied incorrectly in certain situations (#8070).
-                               // Fragments from the fragment cache must always be cloned and never used in place.
-                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
-                                       callback.call(
-                                               table && jQuery.nodeName( this[i], "table" ) ?
-                                                       findOrAppend( this[i], "tbody" ) :
-                                                       this[i],
-                                               i === iNoClone ?
-                                                       fragment :
-                                                       jQuery.clone( fragment, true, true )
-                                       );
+                               ret = computedStyle.getPropertyValue( name );
+                               if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+                                       ret = jQuery.style( elem, name );
                                }
                        }
 
-                       // Fix #11809: Avoid leaking memory
-                       fragment = first = null;
-
-                       if ( scripts.length ) {
-                               jQuery.each( scripts, function( i, elem ) {
-                                       if ( elem.src ) {
-                                               if ( jQuery.ajax ) {
-                                                       jQuery.ajax({
-                                                               url: elem.src,
-                                                               type: "GET",
-                                                               dataType: "script",
-                                                               async: false,
-                                                               global: false,
-                                                               "throws": true
-                                                       });
-                                               } else {
-                                                       jQuery.error("no ajax");
-                                               }
-                                       } else {
-                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
-                                       }
-
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               });
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+                       // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+                               width = style.width;
+                               style.width = ret;
+                               ret = computedStyle.width;
+                               style.width = width;
                        }
-               }
 
-               return this;
+                       return ret;
+               };
        }
-});
 
-function findOrAppend( elem, tag ) {
-       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
+       if ( document.documentElement.currentStyle ) {
+               currentStyle = function( elem, name ) {
+                       var left, rsLeft, uncomputed,
+                               ret = elem.currentStyle && elem.currentStyle[ name ],
+                               style = elem.style;
 
-function cloneCopyEvent( src, dest ) {
+                       // Avoid setting ret to empty string here
+                       // so we don't default to auto
+                       if ( ret == null && style && (uncomputed = style[ name ]) ) {
+                               ret = uncomputed;
+                       }
 
-       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-               return;
-       }
+                       // From the awesome hack by Dean Edwards
+                       // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
+                       // If we're not dealing with a regular pixel number
+                       // but a number that has a weird ending, we need to convert it to pixels
+                       if ( rnumnonpx.test( ret ) ) {
 
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
+                               // Remember the original values
+                               left = style.left;
+                               rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
 
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                               // Put in the new values to get a computed value out
+                               if ( rsLeft ) {
+                                       elem.runtimeStyle.left = elem.currentStyle.left;
+                               }
+                               style.left = name === "fontSize" ? "1em" : ret;
+                               ret = style.pixelLeft + "px";
+
+                               // Revert the changed values
+                               style.left = left;
+                               if ( rsLeft ) {
+                                       elem.runtimeStyle.left = rsLeft;
+                               }
                        }
-               }
-       }
 
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
+                       return ret === "" ? "auto" : ret;
+               };
        }
-}
 
-function cloneFixAttributes( src, dest ) {
-       var nodeName;
-
-       // We do not need to do anything for non-Elements
-       if ( dest.nodeType !== 1 ) {
-               return;
-       }
+       curCSS = getComputedStyle || currentStyle;
 
-       // clearAttributes removes the attributes, which we don't want,
-       // but also removes the attachEvent events, which we *do* want
-       if ( dest.clearAttributes ) {
-               dest.clearAttributes();
-       }
+       function getWidthOrHeight( elem, name, extra ) {
 
-       // mergeAttributes, in contrast, only merges back on the
-       // original attributes, not the events
-       if ( dest.mergeAttributes ) {
-               dest.mergeAttributes( src );
-       }
+               // Start with offset property
+               var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+                       i = name === "width" ? 1 : 0,
+                       len = 4;
 
-       nodeName = dest.nodeName.toLowerCase();
+               if ( val > 0 ) {
+                       if ( extra !== "border" ) {
+                               for ( ; i < len; i += 2 ) {
+                                       if ( !extra ) {
+                                               val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                                       }
+                                       if ( extra === "margin" ) {
+                                               val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
+                                       } else {
+                                               val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                                       }
+                               }
+                       }
 
-       if ( nodeName === "object" ) {
-               // IE6-10 improperly clones children of object elements using classid.
-               // IE10 throws NoModificationAllowedError if parent is null, #12132.
-               if ( dest.parentNode ) {
-                       dest.outerHTML = src.outerHTML;
+                       return val + "px";
                }
 
-               // This path appears unavoidable for IE9. When cloning an object
-               // element in IE9, the outerHTML strategy above is not sufficient.
-               // If the src has innerHTML and the destination does not,
-               // copy the src.innerHTML into the dest.innerHTML. #10324
-               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
-                       dest.innerHTML = src.innerHTML;
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
                }
 
-       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-               // IE6-8 fails to persist the checked state of a cloned checkbox
-               // or radio button. Worse, IE6-7 fail to give the cloned element
-               // a checked appearance if the defaultChecked value isn't also set
-
-               dest.defaultChecked = dest.checked = src.checked;
-
-               // IE6-7 get confused and end up setting the value of a cloned
-               // checkbox/radio button to an empty string instead of "on"
-               if ( dest.value !== src.value ) {
-                       dest.value = src.value;
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
                }
 
-       // IE6-8 fails to return the selected option to the default selected
-       // state when cloning options
-       } else if ( nodeName === "option" ) {
-               dest.selected = src.defaultSelected;
-
-       // IE6-8 fails to set the defaultValue to the correct value when
-       // cloning other types of input fields
-       } else if ( nodeName === "input" || nodeName === "textarea" ) {
-               dest.defaultValue = src.defaultValue;
-
-       // IE blanks contents when cloning scripts
-       } else if ( nodeName === "script" && dest.text !== src.text ) {
-               dest.text = src.text;
-       }
-
-       // Event data gets referenced instead of copied if the expando
-       // gets copied too
-       dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
-       var fragment, cacheable, cachehit,
-               first = args[ 0 ];
-
-       // Set context from what may come in as undefined or a jQuery collection or a node
-       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
-       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
-       context = context || document;
-       context = !context.nodeType && context[0] || context;
-       context = context.ownerDocument || context;
-
-       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-       // Cloning options loses the selected state, so don't cache them
-       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
-               first.charAt(0) === "<" && !rnocache.test( first ) &&
-               (jQuery.support.checkClone || !rchecked.test( first )) &&
-               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-               // Mark cacheable and look for a hit
-               cacheable = true;
-               fragment = jQuery.fragments[ first ];
-               cachehit = fragment !== undefined;
-       }
-
-       if ( !fragment ) {
-               fragment = context.createDocumentFragment();
-               jQuery.clean( args, context, fragment, scripts );
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
 
-               // Update the cache, but only store false
-               // unless this is a second parsing of the same content
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cachehit && fragment;
+               // Add padding, border, margin
+               if ( extra ) {
+                       for ( ; i < len; i += 2 ) {
+                               val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                               if ( extra !== "padding" ) {
+                                       val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                               }
+                               if ( extra === "margin" ) {
+                                       val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
+                               }
+                       }
                }
-       }
 
-       return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
+               return val + "px";
+       }
 
-jQuery.each({
-       appendTo: "append",
-       prependTo: "prepend",
-       insertBefore: "before",
-       insertAfter: "after",
-       replaceAll: "replaceWith"
-}, function( name, original ) {
-       jQuery.fn[ name ] = function( selector ) {
-               var elems,
-                       i = 0,
-                       ret = [],
-                       insert = jQuery( selector ),
-                       l = insert.length,
-                       parent = this.length === 1 && this[0].parentNode;
+       jQuery.each([ "height", "width" ], function( i, name ) {
+               jQuery.cssHooks[ name ] = {
+                       get: function( elem, computed, extra ) {
+                               if ( computed ) {
+                                       if ( elem.offsetWidth !== 0 ) {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       } else {
+                                               return jQuery.swap( elem, cssShow, function() {
+                                                       return getWidthOrHeight( elem, name, extra );
+                                               });
+                                       }
+                               }
+                       },
 
-               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
-                       insert[ original ]( this[0] );
-                       return this;
-               } else {
-                       for ( ; i < l; i++ ) {
-                               elems = ( i > 0 ? this.clone(true) : this ).get();
-                               jQuery( insert[i] )[ original ]( elems );
-                               ret = ret.concat( elems );
+                       set: function( elem, value ) {
+                               return rnum.test( value ) ?
+                                       value + "px" :
+                                       value;
                        }
+               };
+       });
 
-                       return this.pushStack( ret, name, insert.selector );
-               }
-       };
-});
+       if ( !jQuery.support.opacity ) {
+               jQuery.cssHooks.opacity = {
+                       get: function( elem, computed ) {
+                               // IE uses filters for opacity
+                               return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                                       ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+                                       computed ? "1" : "";
+                       },
 
-function getAll( elem ) {
-       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-               return elem.getElementsByTagName( "*" );
+                       set: function( elem, value ) {
+                               var style = elem.style,
+                                       currentStyle = elem.currentStyle,
+                                       opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                                       filter = currentStyle && currentStyle.filter || style.filter || "";
 
-       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-               return elem.querySelectorAll( "*" );
+                               // IE has trouble with opacity if it does not have layout
+                               // Force it by setting the zoom level
+                               style.zoom = 1;
 
-       } else {
-               return [];
-       }
-}
+                               // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                               if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
 
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-       if ( rcheckableType.test( elem.type ) ) {
-               elem.defaultChecked = elem.checked;
-       }
-}
+                                       // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                                       // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                                       // style.removeAttribute is IE Only, but so apparently is this code path...
+                                       style.removeAttribute( "filter" );
 
-jQuery.extend({
-       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var srcElements,
-                       destElements,
-                       i,
-                       clone;
+                                       // if there there is no filter style applied in a css rule, we are done
+                                       if ( currentStyle && !currentStyle.filter ) {
+                                               return;
+                                       }
+                               }
 
-               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
+                               // otherwise, set new filter values
+                               style.filter = ralpha.test( filter ) ?
+                                       filter.replace( ralpha, opacity ) :
+                                       filter + " " + opacity;
+                       }
+               };
+       }
 
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+       jQuery(function() {
+               // This hook cannot be added until DOM ready because the support test
+               // for it is not run until after DOM ready
+               if ( !jQuery.support.reliableMarginRight ) {
+                       jQuery.cssHooks.marginRight = {
+                               get: function( elem, computed ) {
+                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                                       // Work around by temporarily setting element display to inline-block
+                                       return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                               if ( computed ) {
+                                                       return curCSS( elem, "margin-right" );
+                                               } else {
+                                                       return elem.style.marginRight;
+                                               }
+                                       });
+                               }
+                       };
                }
+       });
 
-               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-                       // IE copies events bound via attachEvent when using cloneNode.
-                       // Calling detachEvent on the clone will also remove the events
-                       // from the original. In order to get around this, we use some
-                       // proprietary methods to clear the events. Thanks to MooTools
-                       // guys for this hotness.
+       if ( jQuery.expr && jQuery.expr.filters ) {
+               jQuery.expr.filters.hidden = function( elem ) {
+                       var width = elem.offsetWidth,
+                               height = elem.offsetHeight;
 
-                       cloneFixAttributes( elem, clone );
+                       return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+               };
 
-                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                       srcElements = getAll( elem );
-                       destElements = getAll( clone );
+               jQuery.expr.filters.visible = function( elem ) {
+                       return !jQuery.expr.filters.hidden( elem );
+               };
+       }
 
-                       // Weird iteration because IE will replace the length property
-                       // with an element if you are cloning the body and one of the
-                       // elements on the page has a name or id of "length"
-                       for ( i = 0; srcElements[i]; ++i ) {
-                               // Ensure that the destination node is not null; Fixes #9587
-                               if ( destElements[i] ) {
-                                       cloneFixAttributes( srcElements[i], destElements[i] );
-                               }
-                       }
-               }
+// These hooks are used by animate to expand properties
+       jQuery.each({
+               margin: "",
+               padding: "",
+               border: "Width"
+       }, function( prefix, suffix ) {
 
-               // Copy the events from the original to the clone
-               if ( dataAndEvents ) {
-                       cloneCopyEvent( elem, clone );
+               jQuery.cssHooks[ prefix + suffix ] = {
+                       expand: function( value ) {
+                               var i,
 
-                       if ( deepDataAndEvents ) {
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
+                               // assumes a single number if not a string
+                                       parts = typeof value === "string" ? value.split(" ") : [ value ],
+                                       expanded = {};
 
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               for ( i = 0; i < 4; i++ ) {
+                                       expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                               parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
                                }
-                       }
-               }
 
-               srcElements = destElements = null;
+                               return expanded;
+                       }
+               };
+       });
 
-               // Return the cloned set
-               return clone;
-       },
 
-       clean: function( elems, context, fragment, scripts ) {
-               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-                       safe = context === document && safeFragment,
-                       ret = [];
 
-               // Ensure that context is a document
-               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-                       context = document;
-               }
 
-               // Use the already-created safe fragment if context permits
-               for ( i = 0; (elem = elems[i]) != null; i++ ) {
-                       if ( typeof elem === "number" ) {
-                               elem += "";
-                       }
+       var r20 = /%20/g,
+               rbracket = /\[\]$/,
+               rCRLF = /\r?\n/g,
+               rhash = /#.*$/,
+               rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+               rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       // #7653, #8125, #8152: local protocol detection
+               rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+               rnoContent = /^(?:GET|HEAD)$/,
+               rprotocol = /^\/\//,
+               rquery = /\?/,
+               rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+               rselectTextarea = /^(?:select|textarea)/i,
+               rspacesAjax = /\s+/,
+               rts = /([?&])_=[^&]*/,
+               rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
 
-                       if ( !elem ) {
-                               continue;
-                       }
+       // Keep a copy of the old load method
+               _load = jQuery.fn.load,
 
-                       // Convert html string into DOM nodes
-                       if ( typeof elem === "string" ) {
-                               if ( !rhtml.test( elem ) ) {
-                                       elem = context.createTextNode( elem );
-                               } else {
-                                       // Ensure a safe container in which to render the html
-                                       safe = safe || createSafeFragment( context );
-                                       div = context.createElement("div");
-                                       safe.appendChild( div );
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+               prefilters = {},
 
-                                       // Fix "XHTML"-style tags in all browsers
-                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+               transports = {},
 
-                                       // Go to html and back, then peel off extra wrappers
-                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-                                       wrap = wrapMap[ tag ] || wrapMap._default;
-                                       depth = wrap[0];
-                                       div.innerHTML = wrap[1] + elem + wrap[2];
+       // Document location
+               ajaxLocation,
 
-                                       // Move to the right depth
-                                       while ( depth-- ) {
-                                               div = div.lastChild;
-                                       }
+       // Document location segments
+               ajaxLocParts,
 
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !jQuery.support.tbody ) {
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+               allTypes = ["*/"] + ["*"];
 
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               hasBody = rtbody.test(elem);
-                                                       tbody = tag === "table" && !hasBody ?
-                                                               div.firstChild && div.firstChild.childNodes :
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+       try {
+               ajaxLocation = location.href;
+       } catch( e ) {
+               // Use the href attribute of an A element
+               // since IE will modify it given document.location
+               ajaxLocation = document.createElement( "a" );
+               ajaxLocation.href = "";
+               ajaxLocation = ajaxLocation.href;
+       }
 
-                                                               // String was a bare <thead> or <tfoot>
-                                                               wrap[1] === "<table>" && !hasBody ?
-                                                                       div.childNodes :
-                                                                       [];
+// Segment location into parts
+       ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
 
-                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                       }
-                                               }
-                                       }
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+       function addToPrefiltersOrTransports( structure ) {
 
-                                       // IE completely kills leading whitespace when innerHTML is used
-                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-                                       }
+               // dataTypeExpression is optional and defaults to "*"
+               return function( dataTypeExpression, func ) {
 
-                                       elem = div.childNodes;
+                       if ( typeof dataTypeExpression !== "string" ) {
+                               func = dataTypeExpression;
+                               dataTypeExpression = "*";
+                       }
 
-                                       // Take out of fragment container (we need a fresh div each time)
-                                       div.parentNode.removeChild( div );
+                       if ( jQuery.isFunction( func ) ) {
+                               var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+                                       i = 0,
+                                       length = dataTypes.length,
+                                       dataType,
+                                       list,
+                                       placeBefore;
+
+                               // For each dataType in the dataTypeExpression
+                               for ( ; i < length; i++ ) {
+                                       dataType = dataTypes[ i ];
+                                       // We control if we're asked to add before
+                                       // any existing element
+                                       placeBefore = /^\+/.test( dataType );
+                                       if ( placeBefore ) {
+                                               dataType = dataType.substr( 1 ) || "*";
+                                       }
+                                       list = structure[ dataType ] = structure[ dataType ] || [];
+                                       // then we add to the structure accordingly
+                                       list[ placeBefore ? "unshift" : "push" ]( func );
                                }
                        }
+               };
+       }
 
-                       if ( elem.nodeType ) {
-                               ret.push( elem );
-                       } else {
-                               jQuery.merge( ret, elem );
-                       }
-               }
+// Base inspection function for prefilters and transports
+       function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+                                               dataType /* internal */, inspected /* internal */ ) {
 
-               // Fix #11356: Clear elements from safeFragment
-               if ( div ) {
-                       elem = div = safe = null;
-               }
+               dataType = dataType || options.dataTypes[ 0 ];
+               inspected = inspected || {};
+
+               inspected[ dataType ] = true;
 
-               // Reset defaultChecked for any radios and checkboxes
-               // about to be appended to the DOM in IE 6/7 (#8060)
-               if ( !jQuery.support.appendChecked ) {
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               if ( jQuery.nodeName( elem, "input" ) ) {
-                                       fixDefaultChecked( elem );
-                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+               var list = structure[ dataType ],
+                       i = 0,
+                       length = list ? list.length : 0,
+                       executeOnly = ( structure === prefilters ),
+                       selection;
+
+               for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+                       selection = list[ i ]( options, originalOptions, jqXHR );
+                       // If we got redirected to another dataType
+                       // we try there if executing only and not done already
+                       if ( typeof selection === "string" ) {
+                               if ( !executeOnly || inspected[ selection ] ) {
+                                       selection = undefined;
+                               } else {
+                                       options.dataTypes.unshift( selection );
+                                       selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
                                }
                        }
                }
+               // If we're only executing or nothing was selected
+               // we try the catchall dataType if not done already
+               if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+                       selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+               }
+               // unnecessary when only executing (prefilters)
+               // but it'll be ignored by the caller in that case
+               return selection;
+       }
 
-               // Append elements to a provided document fragment
-               if ( fragment ) {
-                       // Special handling of each script element
-                       handleScript = function( elem ) {
-                               // Check if we consider it executable
-                               if ( !elem.type || rscriptType.test( elem.type ) ) {
-                                       // Detach the script and store it in the scripts array (if provided) or the fragment
-                                       // Return truthy to indicate that it has been handled
-                                       return scripts ?
-                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-                                               fragment.appendChild( elem );
-                               }
-                       };
-
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               // Check if we're done after handling an executable script
-                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-                                       // Append to fragment and handle embedded scripts
-                                       fragment.appendChild( elem );
-                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
-                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
-                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               i += jsTags.length;
-                                       }
-                               }
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+       function ajaxExtend( target, src ) {
+               var key, deep,
+                       flatOptions = jQuery.ajaxSettings.flatOptions || {};
+               for ( key in src ) {
+                       if ( src[ key ] !== undefined ) {
+                               ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
                        }
                }
+               if ( deep ) {
+                       jQuery.extend( true, target, deep );
+               }
+       }
 
-               return ret;
-       },
-
-       cleanData: function( elems, /* internal */ acceptData ) {
-               var data, id, elem, type,
-                       i = 0,
-                       internalKey = jQuery.expando,
-                       cache = jQuery.cache,
-                       deleteExpando = jQuery.support.deleteExpando,
-                       special = jQuery.event.special;
-
-               for ( ; (elem = elems[i]) != null; i++ ) {
-
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
-
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
+       jQuery.fn.extend({
+               load: function( url, params, callback ) {
+                       if ( typeof url !== "string" && _load ) {
+                               return _load.apply( this, arguments );
 
-                               if ( data ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+                               // Don't do a request if no elements are being requested
+                       } else if ( !this.length ) {
+                               return this;
+                       }
 
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
-                                       }
+                       var off = url.indexOf( " " );
+                       if ( off >= 0 ) {
+                               var selector = url.slice( off, url.length );
+                               url = url.slice( 0, off );
+                       }
 
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
+                       // Default to a GET request
+                       var type = "GET";
 
-                                               delete cache[ id ];
+                       // If the second parameter was provided
+                       if ( params ) {
+                               // If it's a function
+                               if ( jQuery.isFunction( params ) ) {
+                                       // We assume that it's the callback
+                                       callback = params;
+                                       params = undefined;
 
-                                               // IE does not allow us to delete expando properties from nodes,
-                                               // nor does it have a removeAttribute function on Document nodes;
-                                               // we must handle all of these cases
-                                               if ( deleteExpando ) {
-                                                       delete elem[ internalKey ];
+                                       // Otherwise, build a param string
+                               } else if ( typeof params === "object" ) {
+                                       params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+                                       type = "POST";
+                               }
+                       }
 
-                                               } else if ( elem.removeAttribute ) {
-                                                       elem.removeAttribute( internalKey );
+                       var self = this;
 
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
+                       // Request the remote document
+                       jQuery.ajax({
+                               url: url,
+                               type: type,
+                               dataType: "html",
+                               data: params,
+                               // Complete callback (responseText is used internally)
+                               complete: function( jqXHR, status, responseText ) {
+                                       // Store the response as specified by the jqXHR object
+                                       responseText = jqXHR.responseText;
+                                       // If successful, inject the HTML into all the matched elements
+                                       if ( jqXHR.isResolved() ) {
+                                               // #4825: Get the actual response in case
+                                               // a dataFilter is present in ajaxSettings
+                                               jqXHR.done(function( r ) {
+                                                       responseText = r;
+                                               });
+                                               // See if a selector was specified
+                                               self.html( selector ?
+                                                       // Create a dummy div to hold the results
+                                                       jQuery("<div>")
+                                                               // inject the contents of the document in, removing the scripts
+                                                               // to avoid any 'Permission Denied' errors in IE
+                                                               .append(responseText.replace(rscript, ""))
+
+                                                               // Locate the specified elements
+                                                               .find(selector) :
+
+                                                       // If not, just inject the full result
+                                                       responseText );
+                                       }
 
-                                               jQuery.deletedIds.push( id );
+                                       if ( callback ) {
+                                               self.each( callback, [ responseText, status, jqXHR ] );
                                        }
                                }
-                       }
-               }
-       }
-});
-// Limit scope pollution from any deprecated API
-(function() {
-
-var matched, browser;
-
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
-       ua = ua.toLowerCase();
-
-       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-               /(msie) ([\w.]+)/.exec( ua ) ||
-               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-               [];
-
-       return {
-               browser: match[ 1 ] || "",
-               version: match[ 2 ] || "0"
-       };
-};
-
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
-
-if ( matched.browser ) {
-       browser[ matched.browser ] = true;
-       browser.version = matched.version;
-}
+                       });
 
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
-       browser.webkit = true;
-} else if ( browser.webkit ) {
-       browser.safari = true;
-}
+                       return this;
+               },
 
-jQuery.browser = browser;
+               serialize: function() {
+                       return jQuery.param( this.serializeArray() );
+               },
 
-jQuery.sub = function() {
-       function jQuerySub( selector, context ) {
-               return new jQuerySub.fn.init( selector, context );
-       }
-       jQuery.extend( true, jQuerySub, this );
-       jQuerySub.superclass = this;
-       jQuerySub.fn = jQuerySub.prototype = this();
-       jQuerySub.fn.constructor = jQuerySub;
-       jQuerySub.sub = this.sub;
-       jQuerySub.fn.init = function init( selector, context ) {
-               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                       context = jQuerySub( context );
+               serializeArray: function() {
+                       return this.map(function(){
+                               return this.elements ? jQuery.makeArray( this.elements ) : this;
+                       })
+                               .filter(function(){
+                                       return this.name && !this.disabled &&
+                                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                                       rinput.test( this.type ) );
+                               })
+                               .map(function( i, elem ){
+                                       var val = jQuery( this ).val();
+
+                                       return val == null ?
+                                               null :
+                                               jQuery.isArray( val ) ?
+                                                       jQuery.map( val, function( val, i ){
+                                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                                       }) :
+                                               { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                               }).get();
                }
+       });
 
-               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-       };
-       jQuerySub.fn.init.prototype = jQuerySub.fn;
-       var rootjQuerySub = jQuerySub(document);
-       return jQuerySub;
-};
-
-})();
-var curCSS, iframe, iframeDoc,
-       ralpha = /alpha\([^)]*\)/i,
-       ropacity = /opacity=([^)]*)/,
-       rposition = /^(top|right|bottom|left)$/,
-       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-       rmargin = /^margin/,
-       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-       elemdisplay = {},
-
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
-       },
-
-       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-
-       eventsToggle = jQuery.fn.toggle;
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
-       // shortcut for names that are not vendor prefixed
-       if ( name in style ) {
-               return name;
-       }
-
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
-               origName = name,
-               i = cssPrefixes.length;
-
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in style ) {
-                       return name;
-               }
-       }
+// Attach a bunch of functions for handling common AJAX events
+       jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+               jQuery.fn[ o ] = function( f ){
+                       return this.on( o, f );
+               };
+       });
 
-       return origName;
-}
+       jQuery.each( [ "get", "post" ], function( i, method ) {
+               jQuery[ method ] = function( url, data, callback, type ) {
+                       // shift arguments if data argument was omitted
+                       if ( jQuery.isFunction( data ) ) {
+                               type = type || callback;
+                               callback = data;
+                               data = undefined;
+                       }
 
-function isHidden( elem, el ) {
-       elem = el || elem;
-       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
+                       return jQuery.ajax({
+                               type: method,
+                               url: url,
+                               data: data,
+                               success: callback,
+                               dataType: type
+                       });
+               };
+       });
 
-function showHide( elements, show ) {
-       var elem, display,
-               values = [],
-               index = 0,
-               length = elements.length;
+       jQuery.extend({
 
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               values[ index ] = jQuery._data( elem, "olddisplay" );
-               if ( show ) {
-                       // Reset the inline display of this element to learn if it is
-                       // being hidden by cascaded rules or not
-                       if ( !values[ index ] && elem.style.display === "none" ) {
-                               elem.style.display = "";
-                       }
+               getScript: function( url, callback ) {
+                       return jQuery.get( url, undefined, callback, "script" );
+               },
 
-                       // Set elements which have been overridden with display: none
-                       // in a stylesheet to whatever the default browser style is
-                       // for such an element
-                       if ( elem.style.display === "" && isHidden( elem ) ) {
-                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-                       }
-               } else {
-                       display = curCSS( elem, "display" );
+               getJSON: function( url, data, callback ) {
+                       return jQuery.get( url, data, callback, "json" );
+               },
 
-                       if ( !values[ index ] && display !== "none" ) {
-                               jQuery._data( elem, "olddisplay", display );
+               // Creates a full fledged settings object into target
+               // with both ajaxSettings and settings fields.
+               // If target is omitted, writes into ajaxSettings.
+               ajaxSetup: function( target, settings ) {
+                       if ( settings ) {
+                               // Building a settings object
+                               ajaxExtend( target, jQuery.ajaxSettings );
+                       } else {
+                               // Extending ajaxSettings
+                               settings = target;
+                               target = jQuery.ajaxSettings;
                        }
-               }
-       }
+                       ajaxExtend( target, settings );
+                       return target;
+               },
 
-       // Set the display of most of the elements in a second loop
-       // to avoid the constant reflow
-       for ( index = 0; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-                       elem.style.display = show ? values[ index ] || "" : "none";
-               }
-       }
+               ajaxSettings: {
+                       url: ajaxLocation,
+                       isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+                       global: true,
+                       type: "GET",
+                       contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+                       processData: true,
+                       async: true,
+                       /*
+                        timeout: 0,
+                        data: null,
+                        dataType: null,
+                        username: null,
+                        password: null,
+                        cache: null,
+                        traditional: false,
+                        headers: {},
+                        */
+
+                       accepts: {
+                               xml: "application/xml, text/xml",
+                               html: "text/html",
+                               text: "text/plain",
+                               json: "application/json, text/javascript",
+                               "*": allTypes
+                       },
 
-       return elements;
-}
+                       contents: {
+                               xml: /xml/,
+                               html: /html/,
+                               json: /json/
+                       },
 
-jQuery.fn.extend({
-       css: function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       },
-       show: function() {
-               return showHide( this, true );
-       },
-       hide: function() {
-               return showHide( this );
-       },
-       toggle: function( state, fn2 ) {
-               var bool = typeof state === "boolean";
-
-               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-                       return eventsToggle.apply( this, arguments );
-               }
+                       responseFields: {
+                               xml: "responseXML",
+                               text: "responseText"
+                       },
 
-               return this.each(function() {
-                       if ( bool ? state : isHidden( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
-               });
-       }
-});
+                       // List of data converters
+                       // 1) key format is "source_type destination_type" (a single space in-between)
+                       // 2) the catchall symbol "*" can be used for source_type
+                       converters: {
 
-jQuery.extend({
-       // Add in style property hooks for overriding the default
-       // behavior of getting and setting a style property
-       cssHooks: {
-               opacity: {
-                       get: function( elem, computed ) {
-                               if ( computed ) {
-                                       // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity" );
-                                       return ret === "" ? "1" : ret;
+                               // Convert anything to text
+                               "* text": window.String,
 
-                               }
-                       }
-               }
-       },
-
-       // Exclude the following css properties to add px
-       cssNumber: {
-               "fillOpacity": true,
-               "fontWeight": true,
-               "lineHeight": true,
-               "opacity": true,
-               "orphans": true,
-               "widows": true,
-               "zIndex": true,
-               "zoom": true
-       },
-
-       // Add in properties whose names you wish to fix before
-       // setting or getting the value
-       cssProps: {
-               // normalize float css property
-               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-       },
-
-       // Get and set the style property on a DOM Node
-       style: function( elem, name, value, extra ) {
-               // Don't set styles on text and comment nodes
-               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-                       return;
-               }
+                               // Text to html (true = no transformation)
+                               "text html": true,
 
-               // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       style = elem.style;
+                               // Evaluate text as a json expression
+                               "text json": jQuery.parseJSON,
 
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+                               // Parse text as xml
+                               "text xml": jQuery.parseXML
+                       },
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+                       // For options that shouldn't be deep extended:
+                       // you can add your own custom options here if
+                       // and when you create one that shouldn't be
+                       // deep extended (see ajaxExtend)
+                       flatOptions: {
+                               context: true,
+                               url: true
+                       }
+               },
 
-               // Check if we're setting a value
-               if ( value !== undefined ) {
-                       type = typeof value;
+               ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+               ajaxTransport: addToPrefiltersOrTransports( transports ),
 
-                       // convert relative number strings (+= or -=) to relative numbers. #7345
-                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-                               // Fixes bug #9237
-                               type = "number";
-                       }
+               // Main method
+               ajax: function( url, options ) {
 
-                       // Make sure that NaN and null values aren't set. See: #7116
-                       if ( value == null || type === "number" && isNaN( value ) ) {
-                               return;
+                       // If url is an object, simulate pre-1.5 signature
+                       if ( typeof url === "object" ) {
+                               options = url;
+                               url = undefined;
                        }
 
-                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                               value += "px";
-                       }
+                       // Force options to be an object
+                       options = options || {};
 
-                       // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-                               // Fixes bug #5509
-                               try {
-                                       style[ name ] = value;
-                               } catch(e) {}
-                       }
+                       var // Create the final options object
+                               s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                               callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                               globalEventContext = callbackContext !== s &&
+                                       ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                       jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                               deferred = jQuery.Deferred(),
+                               completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                               statusCode = s.statusCode || {},
+                       // ifModified key
+                               ifModifiedKey,
+                       // Headers (they are sent all at once)
+                               requestHeaders = {},
+                               requestHeadersNames = {},
+                       // Response headers
+                               responseHeadersString,
+                               responseHeaders,
+                       // transport
+                               transport,
+                       // timeout handle
+                               timeoutTimer,
+                       // Cross-domain detection vars
+                               parts,
+                       // The jqXHR state
+                               state = 0,
+                       // To know if global events are to be dispatched
+                               fireGlobals,
+                       // Loop variable
+                               i,
+                       // Fake xhr
+                               jqXHR = {
 
-               } else {
-                       // If a hook was provided get the non-computed value from there
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-                               return ret;
-                       }
+                                       readyState: 0,
 
-                       // Otherwise just get the value from the style object
-                       return style[ name ];
-               }
-       },
+                                       // Caches the header
+                                       setRequestHeader: function( name, value ) {
+                                               if ( !state ) {
+                                                       var lname = name.toLowerCase();
+                                                       name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                                       requestHeaders[ name ] = value;
+                                               }
+                                               return this;
+                                       },
+
+                                       // Raw string
+                                       getAllResponseHeaders: function() {
+                                               return state === 2 ? responseHeadersString : null;
+                                       },
+
+                                       // Builds headers hashtable if needed
+                                       getResponseHeader: function( key ) {
+                                               var match;
+                                               if ( state === 2 ) {
+                                                       if ( !responseHeaders ) {
+                                                               responseHeaders = {};
+                                                               while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                                       responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                               }
+                                                       }
+                                                       match = responseHeaders[ key.toLowerCase() ];
+                                               }
+                                               return match === undefined ? null : match;
+                                       },
 
-       css: function( elem, name, numeric, extra ) {
-               var val, num, hooks,
-                       origName = jQuery.camelCase( name );
+                                       // Overrides response content-type header
+                                       overrideMimeType: function( type ) {
+                                               if ( !state ) {
+                                                       s.mimeType = type;
+                                               }
+                                               return this;
+                                       },
+
+                                       // Cancel the request
+                                       abort: function( statusText ) {
+                                               statusText = statusText || "abort";
+                                               if ( transport ) {
+                                                       transport.abort( statusText );
+                                               }
+                                               done( 0, statusText );
+                                               return this;
+                                       }
+                               };
 
-               // Make sure that we're working with the right name
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+                       // Callback for when everything is done
+                       // It is defined here because jslint complains if it is declared
+                       // at the end of the function (which would be more logical and readable)
+                       function done( status, nativeStatusText, responses, headers ) {
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+                               // Called once
+                               if ( state === 2 ) {
+                                       return;
+                               }
 
-               // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
+                               // State is "done" now
+                               state = 2;
 
-               // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name );
-               }
+                               // Clear timeout if it exists
+                               if ( timeoutTimer ) {
+                                       clearTimeout( timeoutTimer );
+                               }
 
-               //convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
-               }
+                               // Dereference transport for early garbage collection
+                               // (no matter how long the jqXHR object will be used)
+                               transport = undefined;
 
-               // Return, converting to number if forced or a qualifier was provided and val looks numeric
-               if ( numeric || extra !== undefined ) {
-                       num = parseFloat( val );
-                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
-               }
-               return val;
-       },
-
-       // A method for quickly swapping in/out CSS properties to get correct calculations
-       swap: function( elem, options, callback ) {
-               var ret, name,
-                       old = {};
-
-               // Remember the old values, and insert the new ones
-               for ( name in options ) {
-                       old[ name ] = elem.style[ name ];
-                       elem.style[ name ] = options[ name ];
-               }
+                               // Cache response headers
+                               responseHeadersString = headers || "";
 
-               ret = callback.call( elem );
+                               // Set readyState
+                               jqXHR.readyState = status > 0 ? 4 : 0;
 
-               // Revert the old values
-               for ( name in options ) {
-                       elem.style[ name ] = old[ name ];
-               }
+                               var isSuccess,
+                                       success,
+                                       error,
+                                       statusText = nativeStatusText,
+                                       response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+                                       lastModified,
+                                       etag;
 
-               return ret;
-       }
-});
+                               // If successful, handle type chaining
+                               if ( status >= 200 && status < 300 || status === 304 ) {
 
-// NOTE: To any future maintainer, we've window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-       curCSS = function( elem, name ) {
-               var ret, width, minWidth, maxWidth,
-                       computed = window.getComputedStyle( elem, null ),
-                       style = elem.style;
+                                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                                       if ( s.ifModified ) {
 
-               if ( computed ) {
+                                               if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+                                                       jQuery.lastModified[ ifModifiedKey ] = lastModified;
+                                               }
+                                               if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+                                                       jQuery.etag[ ifModifiedKey ] = etag;
+                                               }
+                                       }
 
-                       ret = computed[ name ];
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
-                       }
+                                       // If not modified
+                                       if ( status === 304 ) {
 
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-                               width = style.width;
-                               minWidth = style.minWidth;
-                               maxWidth = style.maxWidth;
+                                               statusText = "notmodified";
+                                               isSuccess = true;
 
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
+                                               // If we have data
+                                       } else {
 
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
-                       }
-               }
+                                               try {
+                                                       success = ajaxConvert( s, response );
+                                                       statusText = "success";
+                                                       isSuccess = true;
+                                               } catch(e) {
+                                                       // We have a parsererror
+                                                       statusText = "parsererror";
+                                                       error = e;
+                                               }
+                                       }
+                               } else {
+                                       // We extract error from statusText
+                                       // then normalize statusText and status for non-aborts
+                                       error = statusText;
+                                       if ( !statusText || status ) {
+                                               statusText = "error";
+                                               if ( status < 0 ) {
+                                                       status = 0;
+                                               }
+                                       }
+                               }
 
-               return ret;
-       };
-} else if ( document.documentElement.currentStyle ) {
-       curCSS = function( elem, name ) {
-               var left, rsLeft,
-                       ret = elem.currentStyle && elem.currentStyle[ name ],
-                       style = elem.style;
-
-               // Avoid setting ret to empty string here
-               // so we don't default to auto
-               if ( ret == null && style && style[ name ] ) {
-                       ret = style[ name ];
-               }
+                               // Set data for the fake xhr object
+                               jqXHR.status = status;
+                               jqXHR.statusText = "" + ( nativeStatusText || statusText );
 
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+                               // Success/Error
+                               if ( isSuccess ) {
+                                       deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                               } else {
+                                       deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                               }
 
-               // If we're not dealing with a regular pixel number
-               // but a number that has a weird ending, we need to convert it to pixels
-               // but not position css attributes, as those are proportional to the parent element instead
-               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+                               // Status-dependent callbacks
+                               jqXHR.statusCode( statusCode );
+                               statusCode = undefined;
 
-                       // Remember the original values
-                       left = style.left;
-                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+                               if ( fireGlobals ) {
+                                       globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                               }
 
-                       // Put in the new values to get a computed value out
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = elem.currentStyle.left;
-                       }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
+                               // Complete
+                               completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = rsLeft;
+                               if ( fireGlobals ) {
+                                       globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                                       // Handle the global AJAX counter
+                                       if ( !( --jQuery.active ) ) {
+                                               jQuery.event.trigger( "ajaxStop" );
+                                       }
+                               }
                        }
-               }
 
-               return ret === "" ? "auto" : ret;
-       };
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-       var matches = rnumsplit.exec( value );
-       return matches ?
-                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-                       value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
-       var i = extra === ( isBorderBox ? "border" : "content" ) ?
-               // If we already have the right measurement, avoid augmentation
-               4 :
-               // Otherwise initialize for horizontal or vertical properties
-               name === "width" ? 1 : 0,
-
-               val = 0;
-
-       for ( ; i < 4; i += 2 ) {
-               // both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       // we use jQuery.css instead of curCSS here
-                       // because of the reliableMarginRight CSS hook!
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
-               }
+                       // Attach deferreds
+                       deferred.promise( jqXHR );
+                       jqXHR.success = jqXHR.done;
+                       jqXHR.error = jqXHR.fail;
+                       jqXHR.complete = completeDeferred.add;
 
-               // From this point on we use curCSS for maximum performance (relevant in animations)
-               if ( isBorderBox ) {
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                       }
+                       // Status-dependent callbacks
+                       jqXHR.statusCode = function( map ) {
+                               if ( map ) {
+                                       var tmp;
+                                       if ( state < 2 ) {
+                                               for ( tmp in map ) {
+                                                       statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                               }
+                                       } else {
+                                               tmp = map[ jqXHR.status ];
+                                               jqXHR.then( tmp, tmp );
+                                       }
+                               }
+                               return this;
+                       };
 
-                       // at this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       // Remove hash character (#7531: and string promotion)
+                       // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+                       // We also use the url parameter if available
+                       s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+                       // Extract dataTypes list
+                       s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+                       // Determine if a cross-domain request is in order
+                       if ( s.crossDomain == null ) {
+                               parts = rurl.exec( s.url.toLowerCase() );
+                               s.crossDomain = !!( parts &&
+                                       ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                                               ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                                       ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                                       );
                        }
-               } else {
-                       // at this point, extra isn't content, so add padding
-                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
 
-                       // at this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       // Convert data if not already a string
+                       if ( s.data && s.processData && typeof s.data !== "string" ) {
+                               s.data = jQuery.param( s.data, s.traditional );
                        }
-               }
-       }
 
-       return val;
-}
+                       // Apply prefilters
+                       inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
-function getWidthOrHeight( elem, name, extra ) {
+                       // If request was aborted inside a prefilter, stop there
+                       if ( state === 2 ) {
+                               return false;
+                       }
 
-       // Start with offset property, which is equivalent to the border-box value
-       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               valueIsBorderBox = true,
-               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+                       // We can fire global events as of now if asked to
+                       fireGlobals = s.global;
 
-       // some non-html elements return undefined for offsetWidth, so check for null/undefined
-       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-       if ( val <= 0 || val == null ) {
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
-               }
+                       // Uppercase the type
+                       s.type = s.type.toUpperCase();
 
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
-               }
+                       // Determine if request has content
+                       s.hasContent = !rnoContent.test( s.type );
 
-               // we need the check for style in case a browser which returns unreliable values
-               // for getComputedStyle silently falls back to the reliable elem.style
-               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+                       // Watch for a new set of requests
+                       if ( fireGlobals && jQuery.active++ === 0 ) {
+                               jQuery.event.trigger( "ajaxStart" );
+                       }
 
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
-       }
+                       // More options handling for requests with no content
+                       if ( !s.hasContent ) {
 
-       // use the active box-sizing model to add/subtract irrelevant styles
-       return ( val +
-               augmentWidthOrHeight(
-                       elem,
-                       name,
-                       extra || ( isBorderBox ? "border" : "content" ),
-                       valueIsBorderBox
-               )
-       ) + "px";
-}
-
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-       if ( elemdisplay[ nodeName ] ) {
-               return elemdisplay[ nodeName ];
-       }
+                               // If data is available, append data to url
+                               if ( s.data ) {
+                                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                                       // #9682: remove data so that it's not used in an eventual retry
+                                       delete s.data;
+                               }
 
-       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-               display = elem.css("display");
-       elem.remove();
-
-       // If the simple way fails,
-       // get element's real default display by attaching it to a temp iframe
-       if ( display === "none" || display === "" ) {
-               // Use the already-created iframe if possible
-               iframe = document.body.appendChild(
-                       iframe || jQuery.extend( document.createElement("iframe"), {
-                               frameBorder: 0,
-                               width: 0,
-                               height: 0
-                       })
-               );
-
-               // Create a cacheable copy of the iframe document on first call.
-               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-               // document to it; WebKit & Firefox won't allow reusing the iframe document.
-               if ( !iframeDoc || !iframe.createElement ) {
-                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                       iframeDoc.write("<!doctype html><html><body>");
-                       iframeDoc.close();
-               }
+                               // Get ifModifiedKey before adding the anti-cache parameter
+                               ifModifiedKey = s.url;
 
-               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+                               // Add anti-cache in url if needed
+                               if ( s.cache === false ) {
 
-               display = curCSS( elem, "display" );
-               document.body.removeChild( iframe );
-       }
+                                       var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                               ret = s.url.replace( rts, "$1_=" + ts );
 
-       // Store the correct default display
-       elemdisplay[ nodeName ] = display;
+                                       // if nothing was replaced, add timestamp to the end
+                                       s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                               }
+                       }
 
-       return display;
-}
+                       // Set the correct header, if data is being sent
+                       if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                               jqXHR.setRequestHeader( "Content-Type", s.contentType );
+                       }
 
-jQuery.each([ "height", "width" ], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
-               get: function( elem, computed, extra ) {
-                       if ( computed ) {
-                               // certain elements can have dimension info if we invisibly show them
-                               // however, it must have a current display style that would benefit from this
-                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
-                                       return jQuery.swap( elem, cssShow, function() {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       });
-                               } else {
-                                       return getWidthOrHeight( elem, name, extra );
+                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                       if ( s.ifModified ) {
+                               ifModifiedKey = ifModifiedKey || s.url;
+                               if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                                       jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                               }
+                               if ( jQuery.etag[ ifModifiedKey ] ) {
+                                       jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
                                }
                        }
-               },
 
-               set: function( elem, value, extra ) {
-                       return setPositiveNumber( elem, value, extra ?
-                               augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-                               ) : 0
+                       // Set the Accepts header for the server, depending on the dataType
+                       jqXHR.setRequestHeader(
+                               "Accept",
+                               s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                                       s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                                       s.accepts[ "*" ]
                        );
-               }
-       };
-});
-
-if ( !jQuery.support.opacity ) {
-       jQuery.cssHooks.opacity = {
-               get: function( elem, computed ) {
-                       // IE uses filters for opacity
-                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-                               computed ? "1" : "";
-               },
-
-               set: function( elem, value ) {
-                       var style = elem.style,
-                               currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                               filter = currentStyle && currentStyle.filter || style.filter || "";
 
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
+                       // Check for headers option
+                       for ( i in s.headers ) {
+                               jqXHR.setRequestHeader( i, s.headers[ i ] );
+                       }
 
-                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-                               style.removeAttribute ) {
+                       // Allow custom headers/mimetypes and early abort
+                       if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already
+                               jqXHR.abort();
+                               return false;
 
-                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                               // style.removeAttribute is IE Only, but so apparently is this code path...
-                               style.removeAttribute( "filter" );
+                       }
 
-                               // if there there is no filter style applied in a css rule, we are done
-                               if ( currentStyle && !currentStyle.filter ) {
-                                       return;
-                               }
+                       // Install callbacks on deferreds
+                       for ( i in { success: 1, error: 1, complete: 1 } ) {
+                               jqXHR[ i ]( s[ i ] );
                        }
 
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
+                       // Get transport
+                       transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-       if ( !jQuery.support.reliableMarginRight ) {
-               jQuery.cssHooks.marginRight = {
-                       get: function( elem, computed ) {
-                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                               // Work around by temporarily setting element display to inline-block
-                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                       if ( computed ) {
-                                               return curCSS( elem, "marginRight" );
-                                       }
-                               });
-                       }
-               };
-       }
+                       // If no transport, we auto-abort
+                       if ( !transport ) {
+                               done( -1, "No Transport" );
+                       } else {
+                               jqXHR.readyState = 1;
+                               // Send global event
+                               if ( fireGlobals ) {
+                                       globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                               }
+                               // Timeout
+                               if ( s.async && s.timeout > 0 ) {
+                                       timeoutTimer = setTimeout( function(){
+                                               jqXHR.abort( "timeout" );
+                                       }, s.timeout );
+                               }
 
-       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-       // getComputedStyle returns percent when specified for top/left/bottom/right
-       // rather than make the css module depend on the offset module, we just check for it here
-       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-               jQuery.each( [ "top", "left" ], function( i, prop ) {
-                       jQuery.cssHooks[ prop ] = {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               var ret = curCSS( elem, prop );
-                                               // if curCSS returns percentage, fallback to offset
-                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+                               try {
+                                       state = 1;
+                                       transport.send( requestHeaders, done );
+                               } catch (e) {
+                                       // Propagate exception as error if not done
+                                       if ( state < 2 ) {
+                                               done( -1, e );
+                                               // Simply rethrow otherwise
+                                       } else {
+                                               throw e;
                                        }
                                }
-                       };
-               });
-       }
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.hidden = function( elem ) {
-               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
-       };
-
-       jQuery.expr.filters.visible = function( elem ) {
-               return !jQuery.expr.filters.hidden( elem );
-       };
-}
+                       }
 
-// These hooks are used by animate to expand properties
-jQuery.each({
-       margin: "",
-       padding: "",
-       border: "Width"
-}, function( prefix, suffix ) {
-       jQuery.cssHooks[ prefix + suffix ] = {
-               expand: function( value ) {
-                       var i,
+                       return jqXHR;
+               },
 
-                               // assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split(" ") : [ value ],
-                               expanded = {};
+               // Serialize an array of form elements or a set of
+               // key/values into a query string
+               param: function( a, traditional ) {
+                       var s = [],
+                               add = function( key, value ) {
+                                       // If value is a function, invoke it and return its value
+                                       value = jQuery.isFunction( value ) ? value() : value;
+                                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+                               };
 
-                       for ( i = 0; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       // Set traditional to true for jQuery <= 1.3.2 behavior.
+                       if ( traditional === undefined ) {
+                               traditional = jQuery.ajaxSettings.traditional;
                        }
 
-                       return expanded;
-               }
-       };
-
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
-});
-var r20 = /%20/g,
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
-       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       rselectTextarea = /^(?:select|textarea)/i;
-
-jQuery.fn.extend({
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
-       },
-       serializeArray: function() {
-               return this.map(function(){
-                       return this.elements ? jQuery.makeArray( this.elements ) : this;
-               })
-               .filter(function(){
-                       return this.name && !this.disabled &&
-                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                       rinput.test( this.type ) );
-               })
-               .map(function( i, elem ){
-                       var val = jQuery( this ).val();
-
-                       return val == null ?
-                               null :
-                               jQuery.isArray( val ) ?
-                                       jQuery.map( val, function( val, i ){
-                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                       }) :
-                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               }).get();
-       }
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-       var prefix,
-               s = [],
-               add = function( key, value ) {
-                       // If value is a function, invoke it and return its value
-                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-               };
-
-       // Set traditional to true for jQuery <= 1.3.2 behavior.
-       if ( traditional === undefined ) {
-               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-       }
+                       // If an array was passed in, assume that it is an array of form elements.
+                       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+                               // Serialize the form elements
+                               jQuery.each( a, function() {
+                                       add( this.name, this.value );
+                               });
 
-       // If an array was passed in, assume that it is an array of form elements.
-       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-               // Serialize the form elements
-               jQuery.each( a, function() {
-                       add( this.name, this.value );
-               });
+                       } else {
+                               // If traditional, encode the "old" way (the way 1.3.2 or older
+                               // did it), otherwise encode params recursively.
+                               for ( var prefix in a ) {
+                                       buildParams( prefix, a[ prefix ], traditional, add );
+                               }
+                       }
 
-       } else {
-               // If traditional, encode the "old" way (the way 1.3.2 or older
-               // did it), otherwise encode params recursively.
-               for ( prefix in a ) {
-                       buildParams( prefix, a[ prefix ], traditional, add );
+                       // Return the resulting serialization
+                       return s.join( "&" ).replace( r20, "+" );
                }
-       }
-
-       // Return the resulting serialization
-       return s.join( "&" ).replace( r20, "+" );
-};
+       });
 
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
+       function buildParams( prefix, obj, traditional, add ) {
+               if ( jQuery.isArray( obj ) ) {
+                       // Serialize array item.
+                       jQuery.each( obj, function( i, v ) {
+                               if ( traditional || rbracket.test( prefix ) ) {
+                                       // Treat each array item as a scalar.
+                                       add( prefix, v );
 
-       if ( jQuery.isArray( obj ) ) {
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
+                               } else {
+                                       // If array item is non-scalar (array or object), encode its
+                                       // numeric index to resolve deserialization ambiguity issues.
+                                       // Note that rack (as of 1.0.0) can't currently deserialize
+                                       // nested arrays properly, and attempting to do so may cause
+                                       // a server error. Possible fixes are to modify rack's
+                                       // deserialization algorithm or to provide an option or flag
+                                       // to force array serialization to be shallow.
+                                       buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                               }
+                       });
 
-                       } else {
-                               // If array item is non-scalar (array or object), encode its
-                               // numeric index to resolve deserialization ambiguity issues.
-                               // Note that rack (as of 1.0.0) can't currently deserialize
-                               // nested arrays properly, and attempting to do so may cause
-                               // a server error. Possible fixes are to modify rack's
-                               // deserialization algorithm or to provide an option or flag
-                               // to force array serialization to be shallow.
-                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+               } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+                       // Serialize object item.
+                       for ( var name in obj ) {
+                               buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
                        }
-               });
 
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-               // Serialize object item.
-               for ( name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               } else {
+                       // Serialize scalar item.
+                       add( prefix, obj );
                }
-
-       } else {
-               // Serialize scalar item.
-               add( prefix, obj );
        }
-}
-var // Document location
-       ajaxLocation,
-       // Document location segments
-       ajaxLocParts,
-
-       rhash = /#.*$/,
-       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-       // #7653, #8125, #8152: local protocol detection
-       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-       rnoContent = /^(?:GET|HEAD)$/,
-       rprotocol = /^\/\//,
-       rquery = /\?/,
-       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-       rts = /([?&])_=[^&]*/,
-       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-       // Keep a copy of the old load method
-       _load = jQuery.fn.load,
-
-       /* Prefilters
-        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-        * 2) These are called:
-        *    - BEFORE asking for a transport
-        *    - AFTER param serialization (s.data is a string if s.processData is true)
-        * 3) key is the dataType
-        * 4) the catchall symbol "*" can be used
-        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-        */
-       prefilters = {},
 
-       /* Transports bindings
-        * 1) key is the dataType
-        * 2) the catchall symbol "*" can be used
-        * 3) selection will start with transport dataType and THEN go to "*" if needed
-        */
-       transports = {},
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+       jQuery.extend({
 
-       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = ["*/"] + ["*"];
+               // Counter for holding the number of active queries
+               active: 0,
 
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-       ajaxLocation = location.href;
-} catch( e ) {
-       // Use the href attribute of an A element
-       // since IE will modify it given document.location
-       ajaxLocation = document.createElement( "a" );
-       ajaxLocation.href = "";
-       ajaxLocation = ajaxLocation.href;
-}
+               // Last-Modified header cache for next request
+               lastModified: {},
+               etag: {}
 
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+       });
 
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
+       /* Handles responses to an ajax request:
+        * - sets all responseXXX fields accordingly
+        * - finds the right dataType (mediates between content-type and expected dataType)
+        * - returns the corresponding response
+        */
+       function ajaxHandleResponses( s, jqXHR, responses ) {
 
-       // dataTypeExpression is optional and defaults to "*"
-       return function( dataTypeExpression, func ) {
+               var contents = s.contents,
+                       dataTypes = s.dataTypes,
+                       responseFields = s.responseFields,
+                       ct,
+                       type,
+                       finalDataType,
+                       firstDataType;
 
-               if ( typeof dataTypeExpression !== "string" ) {
-                       func = dataTypeExpression;
-                       dataTypeExpression = "*";
+               // Fill responseXXX fields
+               for ( type in responseFields ) {
+                       if ( type in responses ) {
+                               jqXHR[ responseFields[type] ] = responses[ type ];
+                       }
                }
 
-               var dataType, list, placeBefore,
-                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
-                       i = 0,
-                       length = dataTypes.length;
+               // Remove auto dataType and get content-type in the process
+               while( dataTypes[ 0 ] === "*" ) {
+                       dataTypes.shift();
+                       if ( ct === undefined ) {
+                               ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+                       }
+               }
 
-               if ( jQuery.isFunction( func ) ) {
-                       // For each dataType in the dataTypeExpression
-                       for ( ; i < length; i++ ) {
-                               dataType = dataTypes[ i ];
-                               // We control if we're asked to add before
-                               // any existing element
-                               placeBefore = /^\+/.test( dataType );
-                               if ( placeBefore ) {
-                                       dataType = dataType.substr( 1 ) || "*";
+               // Check if we're dealing with a known content-type
+               if ( ct ) {
+                       for ( type in contents ) {
+                               if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                                       dataTypes.unshift( type );
+                                       break;
                                }
-                               list = structure[ dataType ] = structure[ dataType ] || [];
-                               // then we add to the structure accordingly
-                               list[ placeBefore ? "unshift" : "push" ]( func );
                        }
                }
-       };
-}
 
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-               dataType /* internal */, inspected /* internal */ ) {
-
-       dataType = dataType || options.dataTypes[ 0 ];
-       inspected = inspected || {};
-
-       inspected[ dataType ] = true;
-
-       var selection,
-               list = structure[ dataType ],
-               i = 0,
-               length = list ? list.length : 0,
-               executeOnly = ( structure === prefilters );
-
-       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-               selection = list[ i ]( options, originalOptions, jqXHR );
-               // If we got redirected to another dataType
-               // we try there if executing only and not done already
-               if ( typeof selection === "string" ) {
-                       if ( !executeOnly || inspected[ selection ] ) {
-                               selection = undefined;
-                       } else {
-                               options.dataTypes.unshift( selection );
-                               selection = inspectPrefiltersOrTransports(
-                                               structure, options, originalOptions, jqXHR, selection, inspected );
+               // Check to see if we have a response for the expected dataType
+               if ( dataTypes[ 0 ] in responses ) {
+                       finalDataType = dataTypes[ 0 ];
+               } else {
+                       // Try convertible dataTypes
+                       for ( type in responses ) {
+                               if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                                       finalDataType = type;
+                                       break;
+                               }
+                               if ( !firstDataType ) {
+                                       firstDataType = type;
+                               }
                        }
+                       // Or just use first one
+                       finalDataType = finalDataType || firstDataType;
                }
-       }
-       // If we're only executing or nothing was selected
-       // we try the catchall dataType if not done already
-       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-               selection = inspectPrefiltersOrTransports(
-                               structure, options, originalOptions, jqXHR, "*", inspected );
-       }
-       // unnecessary when only executing (prefilters)
-       // but it'll be ignored by the caller in that case
-       return selection;
-}
 
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-       var key, deep,
-               flatOptions = jQuery.ajaxSettings.flatOptions || {};
-       for ( key in src ) {
-               if ( src[ key ] !== undefined ) {
-                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               // If we found a dataType
+               // We add the dataType to the list if needed
+               // and return the corresponding response
+               if ( finalDataType ) {
+                       if ( finalDataType !== dataTypes[ 0 ] ) {
+                               dataTypes.unshift( finalDataType );
+                       }
+                       return responses[ finalDataType ];
                }
        }
-       if ( deep ) {
-               jQuery.extend( true, target, deep );
-       }
-}
-
-jQuery.fn.load = function( url, params, callback ) {
-       if ( typeof url !== "string" && _load ) {
-               return _load.apply( this, arguments );
-       }
-
-       // Don't do a request if no elements are being requested
-       if ( !this.length ) {
-               return this;
-       }
 
-       var selector, type, response,
-               self = this,
-               off = url.indexOf(" ");
+// Chain conversions given the request and the original response
+       function ajaxConvert( s, response ) {
 
-       if ( off >= 0 ) {
-               selector = url.slice( off, url.length );
-               url = url.slice( 0, off );
-       }
+               // Apply the dataFilter if provided
+               if ( s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
+               }
 
-       // If it's a function
-       if ( jQuery.isFunction( params ) ) {
+               var dataTypes = s.dataTypes,
+                       converters = {},
+                       i,
+                       key,
+                       length = dataTypes.length,
+                       tmp,
+               // Current and previous dataTypes
+                       current = dataTypes[ 0 ],
+                       prev,
+               // Conversion expression
+                       conversion,
+               // Conversion function
+                       conv,
+               // Conversion functions (transitive conversion)
+                       conv1,
+                       conv2;
+
+               // For each dataType in the chain
+               for ( i = 1; i < length; i++ ) {
+
+                       // Create converters map
+                       // with lowercased keys
+                       if ( i === 1 ) {
+                               for ( key in s.converters ) {
+                                       if ( typeof key === "string" ) {
+                                               converters[ key.toLowerCase() ] = s.converters[ key ];
+                                       }
+                               }
+                       }
 
-               // We assume that it's the callback
-               callback = params;
-               params = undefined;
+                       // Get the dataTypes
+                       prev = current;
+                       current = dataTypes[ i ];
 
-       // Otherwise, build a param string
-       } else if ( params && typeof params === "object" ) {
-               type = "POST";
-       }
+                       // If current is auto dataType, update it to prev
+                       if ( current === "*" ) {
+                               current = prev;
+                               // If no auto and dataTypes are actually different
+                       } else if ( prev !== "*" && prev !== current ) {
 
-       // Request the remote document
-       jQuery.ajax({
-               url: url,
+                               // Get the converter
+                               conversion = prev + " " + current;
+                               conv = converters[ conversion ] || converters[ "* " + current ];
 
-               // if "type" variable is undefined, then "GET" method will be used
-               type: type,
-               dataType: "html",
-               data: params,
-               complete: function( jqXHR, status ) {
-                       if ( callback ) {
-                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+                               // If there is no direct converter, search transitively
+                               if ( !conv ) {
+                                       conv2 = undefined;
+                                       for ( conv1 in converters ) {
+                                               tmp = conv1.split( " " );
+                                               if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+                                                       conv2 = converters[ tmp[1] + " " + current ];
+                                                       if ( conv2 ) {
+                                                               conv1 = converters[ conv1 ];
+                                                               if ( conv1 === true ) {
+                                                                       conv = conv2;
+                                                               } else if ( conv2 === true ) {
+                                                                       conv = conv1;
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                               // If we found no converter, dispatch an error
+                               if ( !( conv || conv2 ) ) {
+                                       jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+                               }
+                               // If found converter is not an equivalence
+                               if ( conv !== true ) {
+                                       // Convert with 1 or 2 converters accordingly
+                                       response = conv ? conv( response ) : conv2( conv1(response) );
+                               }
                        }
                }
-       }).done(function( responseText ) {
-
-               // Save response for use in complete callback
-               response = arguments;
-
-               // See if a selector was specified
-               self.html( selector ?
+               return response;
+       }
 
-                       // Create a dummy div to hold the results
-                       jQuery("<div>")
 
-                               // inject the contents of the document in, removing the scripts
-                               // to avoid any 'Permission Denied' errors in IE
-                               .append( responseText.replace( rscript, "" ) )
 
-                               // Locate the specified elements
-                               .find( selector ) :
 
-                       // If not, just inject the full result
-                       responseText );
+       var jsc = jQuery.now(),
+               jsre = /(\=)\?(&|$)|\?\?/i;
 
+// Default jsonp settings
+       jQuery.ajaxSetup({
+               jsonp: "callback",
+               jsonpCallback: function() {
+                       return jQuery.expando + "_" + ( jsc++ );
+               }
        });
 
-       return this;
-};
+// Detect, normalize options and install callbacks for jsonp requests
+       jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+               var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
+
+               if ( s.dataTypes[ 0 ] === "jsonp" ||
+                       s.jsonp !== false && ( jsre.test( s.url ) ||
+                               inspectData && jsre.test( s.data ) ) ) {
+
+                       var responseContainer,
+                               jsonpCallback = s.jsonpCallback =
+                                       jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+                               previous = window[ jsonpCallback ],
+                               url = s.url,
+                               data = s.data,
+                               replace = "$1" + jsonpCallback + "$2";
+
+                       if ( s.jsonp !== false ) {
+                               url = url.replace( jsre, replace );
+                               if ( s.url === url ) {
+                                       if ( inspectData ) {
+                                               data = data.replace( jsre, replace );
+                                       }
+                                       if ( s.data === data ) {
+                                               // Add callback manually
+                                               url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                                       }
+                               }
+                       }
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-       jQuery.fn[ o ] = function( f ){
-               return this.on( o, f );
-       };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-       jQuery[ method ] = function( url, data, callback, type ) {
-               // shift arguments if data argument was omitted
-               if ( jQuery.isFunction( data ) ) {
-                       type = type || callback;
-                       callback = data;
-                       data = undefined;
-               }
+                       s.url = url;
+                       s.data = data;
 
-               return jQuery.ajax({
-                       type: method,
-                       url: url,
-                       data: data,
-                       success: callback,
-                       dataType: type
-               });
-       };
-});
+                       // Install callback
+                       window[ jsonpCallback ] = function( response ) {
+                               responseContainer = [ response ];
+                       };
 
-jQuery.extend({
+                       // Clean-up function
+                       jqXHR.always(function() {
+                               // Set callback back to previous value
+                               window[ jsonpCallback ] = previous;
+                               // Call if it was a function and we have a response
+                               if ( responseContainer && jQuery.isFunction( previous ) ) {
+                                       window[ jsonpCallback ]( responseContainer[ 0 ] );
+                               }
+                       });
 
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
+                       // Use data converter to retrieve json after script execution
+                       s.converters["script json"] = function() {
+                               if ( !responseContainer ) {
+                                       jQuery.error( jsonpCallback + " was not called" );
+                               }
+                               return responseContainer[ 0 ];
+                       };
 
-       getJSON: function( url, data, callback ) {
-               return jQuery.get( url, data, callback, "json" );
-       },
+                       // force json dataType
+                       s.dataTypes[ 0 ] = "json";
 
-       // Creates a full fledged settings object into target
-       // with both ajaxSettings and settings fields.
-       // If target is omitted, writes into ajaxSettings.
-       ajaxSetup: function( target, settings ) {
-               if ( settings ) {
-                       // Building a settings object
-                       ajaxExtend( target, jQuery.ajaxSettings );
-               } else {
-                       // Extending ajaxSettings
-                       settings = target;
-                       target = jQuery.ajaxSettings;
+                       // Delegate to script
+                       return "script";
                }
-               ajaxExtend( target, settings );
-               return target;
-       },
-
-       ajaxSettings: {
-               url: ajaxLocation,
-               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-               global: true,
-               type: "GET",
-               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-               processData: true,
-               async: true,
-               /*
-               timeout: 0,
-               data: null,
-               dataType: null,
-               username: null,
-               password: null,
-               cache: null,
-               throws: false,
-               traditional: false,
-               headers: {},
-               */
+       });
 
+
+
+
+// Install script dataType
+       jQuery.ajaxSetup({
                accepts: {
-                       xml: "application/xml, text/xml",
-                       html: "text/html",
-                       text: "text/plain",
-                       json: "application/json, text/javascript",
-                       "*": allTypes
+                       script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
                },
-
                contents: {
-                       xml: /xml/,
-                       html: /html/,
-                       json: /json/
-               },
-
-               responseFields: {
-                       xml: "responseXML",
-                       text: "responseText"
+                       script: /javascript|ecmascript/
                },
-
-               // List of data converters
-               // 1) key format is "source_type destination_type" (a single space in-between)
-               // 2) the catchall symbol "*" can be used for source_type
                converters: {
-
-                       // Convert anything to text
-                       "* text": window.String,
-
-                       // Text to html (true = no transformation)
-                       "text html": true,
-
-                       // Evaluate text as a json expression
-                       "text json": jQuery.parseJSON,
-
-                       // Parse text as xml
-                       "text xml": jQuery.parseXML
-               },
-
-               // For options that shouldn't be deep extended:
-               // you can add your own custom options here if
-               // and when you create one that shouldn't be
-               // deep extended (see ajaxExtend)
-               flatOptions: {
-                       context: true,
-                       url: true
+                       "text script": function( text ) {
+                               jQuery.globalEval( text );
+                               return text;
+                       }
                }
-       },
-
-       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-       ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-       // Main method
-       ajax: function( url, options ) {
+       });
 
-               // If url is an object, simulate pre-1.5 signature
-               if ( typeof url === "object" ) {
-                       options = url;
-                       url = undefined;
+// Handle cache's special case and global
+       jQuery.ajaxPrefilter( "script", function( s ) {
+               if ( s.cache === undefined ) {
+                       s.cache = false;
                }
+               if ( s.crossDomain ) {
+                       s.type = "GET";
+                       s.global = false;
+               }
+       });
 
-               // Force options to be an object
-               options = options || {};
-
-               var // ifModified key
-                       ifModifiedKey,
-                       // Response headers
-                       responseHeadersString,
-                       responseHeaders,
-                       // transport
-                       transport,
-                       // timeout handle
-                       timeoutTimer,
-                       // Cross-domain detection vars
-                       parts,
-                       // To know if global events are to be dispatched
-                       fireGlobals,
-                       // Loop variable
-                       i,
-                       // Create the final options object
-                       s = jQuery.ajaxSetup( {}, options ),
-                       // Callbacks context
-                       callbackContext = s.context || s,
-                       // Context for global events
-                       // It's the callbackContext if one was provided in the options
-                       // and if it's a DOM node or a jQuery collection
-                       globalEventContext = callbackContext !== s &&
-                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-                                               jQuery( callbackContext ) : jQuery.event,
-                       // Deferreds
-                       deferred = jQuery.Deferred(),
-                       completeDeferred = jQuery.Callbacks( "once memory" ),
-                       // Status-dependent callbacks
-                       statusCode = s.statusCode || {},
-                       // Headers (they are sent all at once)
-                       requestHeaders = {},
-                       requestHeadersNames = {},
-                       // The jqXHR state
-                       state = 0,
-                       // Default abort message
-                       strAbort = "canceled",
-                       // Fake xhr
-                       jqXHR = {
-
-                               readyState: 0,
-
-                               // Caches the header
-                               setRequestHeader: function( name, value ) {
-                                       if ( !state ) {
-                                               var lname = name.toLowerCase();
-                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                               requestHeaders[ name ] = value;
-                                       }
-                                       return this;
-                               },
+// Bind script tag hack transport
+       jQuery.ajaxTransport( "script", function(s) {
 
-                               // Raw string
-                               getAllResponseHeaders: function() {
-                                       return state === 2 ? responseHeadersString : null;
-                               },
+               // This transport only deals with cross domain requests
+               if ( s.crossDomain ) {
 
-                               // Builds headers hashtable if needed
-                               getResponseHeader: function( key ) {
-                                       var match;
-                                       if ( state === 2 ) {
-                                               if ( !responseHeaders ) {
-                                                       responseHeaders = {};
-                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-                                                       }
-                                               }
-                                               match = responseHeaders[ key.toLowerCase() ];
-                                       }
-                                       return match === undefined ? null : match;
-                               },
+                       var script,
+                               head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
 
-                               // Overrides response content-type header
-                               overrideMimeType: function( type ) {
-                                       if ( !state ) {
-                                               s.mimeType = type;
-                                       }
-                                       return this;
-                               },
+                       return {
 
-                               // Cancel the request
-                               abort: function( statusText ) {
-                                       statusText = statusText || strAbort;
-                                       if ( transport ) {
-                                               transport.abort( statusText );
-                                       }
-                                       done( 0, statusText );
-                                       return this;
-                               }
-                       };
+                               send: function( _, callback ) {
 
-               // Callback for when everything is done
-               // It is defined here because jslint complains if it is declared
-               // at the end of the function (which would be more logical and readable)
-               function done( status, nativeStatusText, responses, headers ) {
-                       var isSuccess, success, error, response, modified,
-                               statusText = nativeStatusText;
+                                       script = document.createElement( "script" );
 
-                       // Called once
-                       if ( state === 2 ) {
-                               return;
-                       }
+                                       script.async = "async";
 
-                       // State is "done" now
-                       state = 2;
+                                       if ( s.scriptCharset ) {
+                                               script.charset = s.scriptCharset;
+                                       }
 
-                       // Clear timeout if it exists
-                       if ( timeoutTimer ) {
-                               clearTimeout( timeoutTimer );
-                       }
+                                       script.src = s.url;
 
-                       // Dereference transport for early garbage collection
-                       // (no matter how long the jqXHR object will be used)
-                       transport = undefined;
+                                       // Attach handlers for all browsers
+                                       script.onload = script.onreadystatechange = function( _, isAbort ) {
 
-                       // Cache response headers
-                       responseHeadersString = headers || "";
+                                               if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
-                       // Set readyState
-                       jqXHR.readyState = status > 0 ? 4 : 0;
+                                                       // Handle memory leak in IE
+                                                       script.onload = script.onreadystatechange = null;
 
-                       // Get response data
-                       if ( responses ) {
-                               response = ajaxHandleResponses( s, jqXHR, responses );
-                       }
+                                                       // Remove the script
+                                                       if ( head && script.parentNode ) {
+                                                               head.removeChild( script );
+                                                       }
 
-                       // If successful, handle type chaining
-                       if ( status >= 200 && status < 300 || status === 304 ) {
+                                                       // Dereference the script
+                                                       script = undefined;
 
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
+                                                       // Callback if not abort
+                                                       if ( !isAbort ) {
+                                                               callback( 200, "success" );
+                                                       }
+                                               }
+                                       };
+                                       // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                                       // This arises when a base node is used (#2709 and #4378).
+                                       head.insertBefore( script, head.firstChild );
+                               },
 
-                                       modified = jqXHR.getResponseHeader("Last-Modified");
-                                       if ( modified ) {
-                                               jQuery.lastModified[ ifModifiedKey ] = modified;
-                                       }
-                                       modified = jqXHR.getResponseHeader("Etag");
-                                       if ( modified ) {
-                                               jQuery.etag[ ifModifiedKey ] = modified;
+                               abort: function() {
+                                       if ( script ) {
+                                               script.onload( 0, 1 );
                                        }
                                }
+                       };
+               }
+       });
 
-                               // If not modified
-                               if ( status === 304 ) {
 
-                                       statusText = "notmodified";
-                                       isSuccess = true;
 
-                               // If we have data
-                               } else {
 
-                                       isSuccess = ajaxConvert( s, response );
-                                       statusText = isSuccess.state;
-                                       success = isSuccess.data;
-                                       error = isSuccess.error;
-                                       isSuccess = !error;
-                               }
-                       } else {
-                               // We extract error from statusText
-                               // then normalize statusText and status for non-aborts
-                               error = statusText;
-                               if ( !statusText || status ) {
-                                       statusText = "error";
-                                       if ( status < 0 ) {
-                                               status = 0;
-                                       }
-                               }
+       var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+               xhrOnUnloadAbort = window.ActiveXObject ? function() {
+                       // Abort all pending requests
+                       for ( var key in xhrCallbacks ) {
+                               xhrCallbacks[ key ]( 0, 1 );
                        }
+               } : false,
+               xhrId = 0,
+               xhrCallbacks;
 
-                       // Set data for the fake xhr object
-                       jqXHR.status = status;
-                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
+// Functions to create xhrs
+       function createStandardXHR() {
+               try {
+                       return new window.XMLHttpRequest();
+               } catch( e ) {}
+       }
 
-                       // Success/Error
-                       if ( isSuccess ) {
-                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                       } else {
-                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                       }
+       function createActiveXHR() {
+               try {
+                       return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+               } catch( e ) {}
+       }
 
-                       // Status-dependent callbacks
-                       jqXHR.statusCode( statusCode );
-                       statusCode = undefined;
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+       jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+               /* Microsoft failed to properly
+                * implement the XMLHttpRequest in IE7 (can't request local files),
+                * so we use the ActiveXObject when it is available
+                * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+                * we need a fallback.
+                */
+               function() {
+                       return !this.isLocal && createStandardXHR() || createActiveXHR();
+               } :
+               // For all other browsers, use the standard XMLHttpRequest object
+               createStandardXHR;
 
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                       }
+// Determine support properties
+       (function( xhr ) {
+               jQuery.extend( jQuery.support, {
+                       ajax: !!xhr,
+                       cors: !!xhr && ( "withCredentials" in xhr )
+               });
+       })( jQuery.ajaxSettings.xhr() );
 
-                       // Complete
-                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+// Create transport if the browser can provide an xhr
+       if ( jQuery.support.ajax ) {
 
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                               // Handle the global AJAX counter
-                               if ( !( --jQuery.active ) ) {
-                                       jQuery.event.trigger( "ajaxStop" );
-                               }
-                       }
-               }
+               jQuery.ajaxTransport(function( s ) {
+                       // Cross domain only allowed if supported through XMLHttpRequest
+                       if ( !s.crossDomain || jQuery.support.cors ) {
 
-               // Attach deferreds
-               deferred.promise( jqXHR );
-               jqXHR.success = jqXHR.done;
-               jqXHR.error = jqXHR.fail;
-               jqXHR.complete = completeDeferred.add;
+                               var callback;
 
-               // Status-dependent callbacks
-               jqXHR.statusCode = function( map ) {
-                       if ( map ) {
-                               var tmp;
-                               if ( state < 2 ) {
-                                       for ( tmp in map ) {
-                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-                                       }
-                               } else {
-                                       tmp = map[ jqXHR.status ];
-                                       jqXHR.always( tmp );
-                               }
-                       }
-                       return this;
-               };
+                               return {
+                                       send: function( headers, complete ) {
 
-               // Remove hash character (#7531: and string promotion)
-               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-               // We also use the url parameter if available
-               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-               // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
-
-               // Determine if a cross-domain request is in order
-               if ( s.crossDomain == null ) {
-                       parts = rurl.exec( s.url.toLowerCase() );
-                       s.crossDomain = !!( parts &&
-                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-                       );
-               }
+                                               // Get a new xhr
+                                               var xhr = s.xhr(),
+                                                       handle,
+                                                       i;
 
-               // Convert data if not already a string
-               if ( s.data && s.processData && typeof s.data !== "string" ) {
-                       s.data = jQuery.param( s.data, s.traditional );
-               }
+                                               // Open the socket
+                                               // Passing null username, generates a login popup on Opera (#2865)
+                                               if ( s.username ) {
+                                                       xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                               } else {
+                                                       xhr.open( s.type, s.url, s.async );
+                                               }
 
-               // Apply prefilters
-               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+                                               // Apply custom fields if provided
+                                               if ( s.xhrFields ) {
+                                                       for ( i in s.xhrFields ) {
+                                                               xhr[ i ] = s.xhrFields[ i ];
+                                                       }
+                                               }
 
-               // If request was aborted inside a prefilter, stop there
-               if ( state === 2 ) {
-                       return jqXHR;
-               }
+                                               // Override mime type if needed
+                                               if ( s.mimeType && xhr.overrideMimeType ) {
+                                                       xhr.overrideMimeType( s.mimeType );
+                                               }
 
-               // We can fire global events as of now if asked to
-               fireGlobals = s.global;
+                                               // X-Requested-With header
+                                               // For cross-domain requests, seeing as conditions for a preflight are
+                                               // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                               // (it can always be set on a per-request basis or even using ajaxSetup)
+                                               // For same-domain requests, won't change header if already provided.
+                                               if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                                       headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                               }
 
-               // Uppercase the type
-               s.type = s.type.toUpperCase();
+                                               // Need an extra try/catch for cross domain requests in Firefox 3
+                                               try {
+                                                       for ( i in headers ) {
+                                                               xhr.setRequestHeader( i, headers[ i ] );
+                                                       }
+                                               } catch( _ ) {}
+
+                                               // Do send the request
+                                               // This may raise an exception which is actually
+                                               // handled in jQuery.ajax (so no try/catch here)
+                                               xhr.send( ( s.hasContent && s.data ) || null );
+
+                                               // Listener
+                                               callback = function( _, isAbort ) {
+
+                                                       var status,
+                                                               statusText,
+                                                               responseHeaders,
+                                                               responses,
+                                                               xml;
+
+                                                       // Firefox throws exceptions when accessing properties
+                                                       // of an xhr when a network error occured
+                                                       // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                                       try {
+
+                                                               // Was never called and is aborted or complete
+                                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                                       // Only called once
+                                                                       callback = undefined;
+
+                                                                       // Do not keep as active anymore
+                                                                       if ( handle ) {
+                                                                               xhr.onreadystatechange = jQuery.noop;
+                                                                               if ( xhrOnUnloadAbort ) {
+                                                                                       delete xhrCallbacks[ handle ];
+                                                                               }
+                                                                       }
 
-               // Determine if request has content
-               s.hasContent = !rnoContent.test( s.type );
+                                                                       // If it's an abort
+                                                                       if ( isAbort ) {
+                                                                               // Abort it manually if needed
+                                                                               if ( xhr.readyState !== 4 ) {
+                                                                                       xhr.abort();
+                                                                               }
+                                                                       } else {
+                                                                               status = xhr.status;
+                                                                               responseHeaders = xhr.getAllResponseHeaders();
+                                                                               responses = {};
+                                                                               xml = xhr.responseXML;
+
+                                                                               // Construct response list
+                                                                               if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                                       responses.xml = xml;
+                                                                               }
+
+                                                                               // When requesting binary data, IE6-9 will throw an exception
+                                                                               // on any attempt to access responseText (#11426)
+                                                                               try {
+                                                                                       responses.text = xhr.responseText;
+                                                                               } catch( _ ) {
+                                                                               }
+
+                                                                               // Firefox throws an exception when accessing
+                                                                               // statusText for faulty cross-domain requests
+                                                                               try {
+                                                                                       statusText = xhr.statusText;
+                                                                               } catch( e ) {
+                                                                                       // We normalize with Webkit giving an empty statusText
+                                                                                       statusText = "";
+                                                                               }
+
+                                                                               // Filter status for non standard behaviors
+
+                                                                               // If the request is local and we have data: assume a success
+                                                                               // (success with no data won't get notified, that's the best we
+                                                                               // can do given current implementations)
+                                                                               if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                                       status = responses.text ? 200 : 404;
+                                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                               } else if ( status === 1223 ) {
+                                                                                       status = 204;
+                                                                               }
+                                                                       }
+                                                               }
+                                                       } catch( firefoxAccessException ) {
+                                                               if ( !isAbort ) {
+                                                                       complete( -1, firefoxAccessException );
+                                                               }
+                                                       }
 
-               // Watch for a new set of requests
-               if ( fireGlobals && jQuery.active++ === 0 ) {
-                       jQuery.event.trigger( "ajaxStart" );
-               }
+                                                       // Call complete if needed
+                                                       if ( responses ) {
+                                                               complete( status, statusText, responses, responseHeaders );
+                                                       }
+                                               };
 
-               // More options handling for requests with no content
-               if ( !s.hasContent ) {
+                                               // if we're in sync mode or it's in cache
+                                               // and has been retrieved directly (IE6 & IE7)
+                                               // we need to manually fire the callback
+                                               if ( !s.async || xhr.readyState === 4 ) {
+                                                       callback();
+                                               } else {
+                                                       handle = ++xhrId;
+                                                       if ( xhrOnUnloadAbort ) {
+                                                               // Create the active xhrs callbacks list if needed
+                                                               // and attach the unload handler
+                                                               if ( !xhrCallbacks ) {
+                                                                       xhrCallbacks = {};
+                                                                       jQuery( window ).unload( xhrOnUnloadAbort );
+                                                               }
+                                                               // Add to list of active xhrs callbacks
+                                                               xhrCallbacks[ handle ] = callback;
+                                                       }
+                                                       xhr.onreadystatechange = callback;
+                                               }
+                                       },
 
-                       // If data is available, append data to url
-                       if ( s.data ) {
-                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-                               // #9682: remove data so that it's not used in an eventual retry
-                               delete s.data;
+                                       abort: function() {
+                                               if ( callback ) {
+                                                       callback(0,1);
+                                               }
+                                       }
+                               };
                        }
+               });
+       }
 
-                       // Get ifModifiedKey before adding the anti-cache parameter
-                       ifModifiedKey = s.url;
-
-                       // Add anti-cache in url if needed
-                       if ( s.cache === false ) {
 
-                               var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                       ret = s.url.replace( rts, "$1_=" + ts );
 
-                               // if nothing was replaced, add timestamp to the end
-                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-                       }
-               }
 
-               // Set the correct header, if data is being sent
-               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
-               }
+       var elemdisplay = {},
+               iframe, iframeDoc,
+               rfxtypes = /^(?:toggle|show|hide)$/,
+               rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+               timerId,
+               fxAttrs = [
+                       // height animations
+                       [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+                       // width animations
+                       [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+                       // opacity animations
+                       [ "opacity" ]
+               ],
+               fxNow;
 
-               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-               if ( s.ifModified ) {
-                       ifModifiedKey = ifModifiedKey || s.url;
-                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-                       }
-                       if ( jQuery.etag[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
-                       }
-               }
+       jQuery.fn.extend({
+               show: function( speed, easing, callback ) {
+                       var elem, display;
 
-               // Set the Accepts header for the server, depending on the dataType
-               jqXHR.setRequestHeader(
-                       "Accept",
-                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-                               s.accepts[ "*" ]
-               );
-
-               // Check for headers option
-               for ( i in s.headers ) {
-                       jqXHR.setRequestHeader( i, s.headers[ i ] );
-               }
+                       if ( speed || speed === 0 ) {
+                               return this.animate( genFx("show", 3), speed, easing, callback );
 
-               // Allow custom headers/mimetypes and early abort
-               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already and return
-                               return jqXHR.abort();
+                       } else {
+                               for ( var i = 0, j = this.length; i < j; i++ ) {
+                                       elem = this[ i ];
 
-               }
+                                       if ( elem.style ) {
+                                               display = elem.style.display;
 
-               // aborting is no longer a cancellation
-               strAbort = "abort";
+                                               // Reset the inline display of this element to learn if it is
+                                               // being hidden by cascaded rules or not
+                                               if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+                                                       display = elem.style.display = "";
+                                               }
 
-               // Install callbacks on deferreds
-               for ( i in { success: 1, error: 1, complete: 1 } ) {
-                       jqXHR[ i ]( s[ i ] );
-               }
+                                               // Set elements which have been overridden with display: none
+                                               // in a stylesheet to whatever the default browser style is
+                                               // for such an element
+                                               if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+                                                       !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+                                                       jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+                                               }
+                                       }
+                               }
 
-               // Get transport
-               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+                               // Set the display of most of the elements in a second loop
+                               // to avoid the constant reflow
+                               for ( i = 0; i < j; i++ ) {
+                                       elem = this[ i ];
 
-               // If no transport, we auto-abort
-               if ( !transport ) {
-                       done( -1, "No Transport" );
-               } else {
-                       jqXHR.readyState = 1;
-                       // Send global event
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-                       }
-                       // Timeout
-                       if ( s.async && s.timeout > 0 ) {
-                               timeoutTimer = setTimeout( function(){
-                                       jqXHR.abort( "timeout" );
-                               }, s.timeout );
-                       }
+                                       if ( elem.style ) {
+                                               display = elem.style.display;
 
-                       try {
-                               state = 1;
-                               transport.send( requestHeaders, done );
-                       } catch (e) {
-                               // Propagate exception as error if not done
-                               if ( state < 2 ) {
-                                       done( -1, e );
-                               // Simply rethrow otherwise
-                               } else {
-                                       throw e;
+                                               if ( display === "" || display === "none" ) {
+                                                       elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+                                               }
+                                       }
                                }
+
+                               return this;
                        }
-               }
+               },
+
+               hide: function( speed, easing, callback ) {
+                       if ( speed || speed === 0 ) {
+                               return this.animate( genFx("hide", 3), speed, easing, callback);
 
-               return jqXHR;
-       },
+                       } else {
+                               var elem, display,
+                                       i = 0,
+                                       j = this.length;
 
-       // Counter for holding the number of active queries
-       active: 0,
+                               for ( ; i < j; i++ ) {
+                                       elem = this[i];
+                                       if ( elem.style ) {
+                                               display = jQuery.css( elem, "display" );
 
-       // Last-Modified header cache for next request
-       lastModified: {},
-       etag: {}
+                                               if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+                                                       jQuery._data( elem, "olddisplay", display );
+                                               }
+                                       }
+                               }
 
-});
+                               // Set the display of the elements in a second loop
+                               // to avoid the constant reflow
+                               for ( i = 0; i < j; i++ ) {
+                                       if ( this[i].style ) {
+                                               this[i].style.display = "none";
+                                       }
+                               }
 
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
+                               return this;
+                       }
+               },
 
-       var ct, type, finalDataType, firstDataType,
-               contents = s.contents,
-               dataTypes = s.dataTypes,
-               responseFields = s.responseFields;
+               // Save the old toggle function
+               _toggle: jQuery.fn.toggle,
 
-       // Fill responseXXX fields
-       for ( type in responseFields ) {
-               if ( type in responses ) {
-                       jqXHR[ responseFields[type] ] = responses[ type ];
-               }
-       }
+               toggle: function( fn, fn2, callback ) {
+                       var bool = typeof fn === "boolean";
 
-       // Remove auto dataType and get content-type in the process
-       while( dataTypes[ 0 ] === "*" ) {
-               dataTypes.shift();
-               if ( ct === undefined ) {
-                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-               }
-       }
+                       if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+                               this._toggle.apply( this, arguments );
 
-       // Check if we're dealing with a known content-type
-       if ( ct ) {
-               for ( type in contents ) {
-                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
-                               dataTypes.unshift( type );
-                               break;
-                       }
-               }
-       }
+                       } else if ( fn == null || bool ) {
+                               this.each(function() {
+                                       var state = bool ? fn : jQuery(this).is(":hidden");
+                                       jQuery(this)[ state ? "show" : "hide" ]();
+                               });
 
-       // Check to see if we have a response for the expected dataType
-       if ( dataTypes[ 0 ] in responses ) {
-               finalDataType = dataTypes[ 0 ];
-       } else {
-               // Try convertible dataTypes
-               for ( type in responses ) {
-                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-                               finalDataType = type;
-                               break;
-                       }
-                       if ( !firstDataType ) {
-                               firstDataType = type;
+                       } else {
+                               this.animate(genFx("toggle", 3), fn, fn2, callback);
                        }
-               }
-               // Or just use first one
-               finalDataType = finalDataType || firstDataType;
-       }
 
-       // If we found a dataType
-       // We add the dataType to the list if needed
-       // and return the corresponding response
-       if ( finalDataType ) {
-               if ( finalDataType !== dataTypes[ 0 ] ) {
-                       dataTypes.unshift( finalDataType );
-               }
-               return responses[ finalDataType ];
-       }
-}
+                       return this;
+               },
 
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
-       var conv, conv2, current, tmp,
-               // Work with a copy of dataTypes in case we need to modify it for conversion
-               dataTypes = s.dataTypes.slice(),
-               prev = dataTypes[ 0 ],
-               converters = {},
-               i = 0;
-
-       // Apply the dataFilter if provided
-       if ( s.dataFilter ) {
-               response = s.dataFilter( response, s.dataType );
-       }
+               fadeTo: function( speed, to, easing, callback ) {
+                       return this.filter(":hidden").css("opacity", 0).show().end()
+                               .animate({opacity: to}, speed, easing, callback);
+               },
 
-       // Create converters map with lowercased keys
-       if ( dataTypes[ 1 ] ) {
-               for ( conv in s.converters ) {
-                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
-               }
-       }
+               animate: function( prop, speed, easing, callback ) {
+                       var optall = jQuery.speed( speed, easing, callback );
+
+                       if ( jQuery.isEmptyObject( prop ) ) {
+                               return this.each( optall.complete, [ false ] );
+                       }
 
-       // Convert to each sequential dataType, tolerating list modification
-       for ( ; (current = dataTypes[++i]); ) {
+                       // Do not change referenced properties as per-property easing will be lost
+                       prop = jQuery.extend( {}, prop );
 
-               // There's only work to do if current dataType is non-auto
-               if ( current !== "*" ) {
+                       function doAnimation() {
+                               // XXX 'this' does not always have a nodeName when running the
+                               // test suite
 
-                       // Convert response if prev dataType is non-auto and differs from current
-                       if ( prev !== "*" && prev !== current ) {
+                               if ( optall.queue === false ) {
+                                       jQuery._mark( this );
+                               }
 
-                               // Seek a direct converter
-                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+                               var opt = jQuery.extend( {}, optall ),
+                                       isElement = this.nodeType === 1,
+                                       hidden = isElement && jQuery(this).is(":hidden"),
+                                       name, val, p, e, hooks, replace,
+                                       parts, start, end, unit,
+                                       method;
+
+                               // will store per property easing and be used to determine when an animation is complete
+                               opt.animatedProperties = {};
+
+                               // first pass over propertys to expand / normalize
+                               for ( p in prop ) {
+                                       name = jQuery.camelCase( p );
+                                       if ( p !== name ) {
+                                               prop[ name ] = prop[ p ];
+                                               delete prop[ p ];
+                                       }
 
-                               // If none found, seek a pair
-                               if ( !conv ) {
-                                       for ( conv2 in converters ) {
-
-                                               // If conv2 outputs current
-                                               tmp = conv2.split(" ");
-                                               if ( tmp[ 1 ] === current ) {
-
-                                                       // If prev can be converted to accepted input
-                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
-                                                               converters[ "* " + tmp[ 0 ] ];
-                                                       if ( conv ) {
-                                                               // Condense equivalence converters
-                                                               if ( conv === true ) {
-                                                                       conv = converters[ conv2 ];
-
-                                                               // Otherwise, insert the intermediate dataType
-                                                               } else if ( converters[ conv2 ] !== true ) {
-                                                                       current = tmp[ 0 ];
-                                                                       dataTypes.splice( i--, 0, current );
-                                                               }
+                                       if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+                                               replace = hooks.expand( prop[ name ] );
+                                               delete prop[ name ];
 
-                                                               break;
+                                               // not quite $.extend, this wont overwrite keys already present.
+                                               // also - reusing 'p' from above because we have the correct "name"
+                                               for ( p in replace ) {
+                                                       if ( ! ( p in prop ) ) {
+                                                               prop[ p ] = replace[ p ];
                                                        }
                                                }
                                        }
                                }
 
-                               // Apply converter (if not an equivalence)
-                               if ( conv !== true ) {
-
-                                       // Unless errors are allowed to bubble, catch and return them
-                                       if ( conv && s["throws"] ) {
-                                               response = conv( response );
+                               for ( name in prop ) {
+                                       val = prop[ name ];
+                                       // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+                                       if ( jQuery.isArray( val ) ) {
+                                               opt.animatedProperties[ name ] = val[ 1 ];
+                                               val = prop[ name ] = val[ 0 ];
                                        } else {
-                                               try {
-                                                       response = conv( response );
-                                               } catch ( e ) {
-                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-                                               }
+                                               opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
                                        }
-                               }
-                       }
 
-                       // Update prev for next iteration
-                       prev = current;
-               }
-       }
+                                       if ( val === "hide" && hidden || val === "show" && !hidden ) {
+                                               return opt.complete.call( this );
+                                       }
 
-       return { state: "success", data: response };
-}
-var oldCallbacks = [],
-       rquestion = /\?/,
-       rjsonp = /(=)\?(?=&|$)|\?\?/,
-       nonce = jQuery.now();
+                                       if ( isElement && ( name === "height" || name === "width" ) ) {
+                                               // Make sure that nothing sneaks out
+                                               // Record all 3 overflow attributes because IE does not
+                                               // change the overflow attribute when overflowX and
+                                               // overflowY are set to the same value
+                                               opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
 
-// Default jsonp settings
-jQuery.ajaxSetup({
-       jsonp: "callback",
-       jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-               this[ callback ] = true;
-               return callback;
-       }
-});
+                                               // Set display property to inline-block for height/width
+                                               // animations on inline elements that are having width/height animated
+                                               if ( jQuery.css( this, "display" ) === "inline" &&
+                                                       jQuery.css( this, "float" ) === "none" ) {
 
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-       var callbackName, overwritten, responseContainer,
-               data = s.data,
-               url = s.url,
-               hasCallback = s.jsonp !== false,
-               replaceInUrl = hasCallback && rjsonp.test( url ),
-               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
-                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
-                       rjsonp.test( data );
-
-       // Handle iff the expected data type is "jsonp" or we have a parameter to set
-       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
-
-               // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-                       s.jsonpCallback() :
-                       s.jsonpCallback;
-               overwritten = window[ callbackName ];
-
-               // Insert callback into url or form data
-               if ( replaceInUrl ) {
-                       s.url = url.replace( rjsonp, "$1" + callbackName );
-               } else if ( replaceInData ) {
-                       s.data = data.replace( rjsonp, "$1" + callbackName );
-               } else if ( hasCallback ) {
-                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-               }
+                                                       // inline-level elements accept inline-block;
+                                                       // block-level elements need to be inline with layout
+                                                       if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+                                                               this.style.display = "inline-block";
 
-               // Use data converter to retrieve json after script execution
-               s.converters["script json"] = function() {
-                       if ( !responseContainer ) {
-                               jQuery.error( callbackName + " was not called" );
-                       }
-                       return responseContainer[ 0 ];
-               };
+                                                       } else {
+                                                               this.style.zoom = 1;
+                                                       }
+                                               }
+                                       }
+                               }
 
-               // force json dataType
-               s.dataTypes[ 0 ] = "json";
+                               if ( opt.overflow != null ) {
+                                       this.style.overflow = "hidden";
+                               }
 
-               // Install callback
-               window[ callbackName ] = function() {
-                       responseContainer = arguments;
-               };
+                               for ( p in prop ) {
+                                       e = new jQuery.fx( this, opt, p );
+                                       val = prop[ p ];
 
-               // Clean-up function (fires after converters)
-               jqXHR.always(function() {
-                       // Restore preexisting value
-                       window[ callbackName ] = overwritten;
+                                       if ( rfxtypes.test( val ) ) {
 
-                       // Save back as free
-                       if ( s[ callbackName ] ) {
-                               // make sure that re-using the options doesn't screw things around
-                               s.jsonpCallback = originalSettings.jsonpCallback;
+                                               // Tracks whether to show or hide based on private
+                                               // data attached to the element
+                                               method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+                                               if ( method ) {
+                                                       jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+                                                       e[ method ]();
+                                               } else {
+                                                       e[ val ]();
+                                               }
 
-                               // save the callback name for future use
-                               oldCallbacks.push( callbackName );
-                       }
+                                       } else {
+                                               parts = rfxnum.exec( val );
+                                               start = e.cur();
+
+                                               if ( parts ) {
+                                                       end = parseFloat( parts[2] );
+                                                       unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+                                                       // We need to compute starting value
+                                                       if ( unit !== "px" ) {
+                                                               jQuery.style( this, p, (end || 1) + unit);
+                                                               start = ( (end || 1) / e.cur() ) * start;
+                                                               jQuery.style( this, p, start + unit);
+                                                       }
 
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-                               overwritten( responseContainer[ 0 ] );
-                       }
+                                                       // If a +=/-= token was provided, we're doing a relative animation
+                                                       if ( parts[1] ) {
+                                                               end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+                                                       }
 
-                       responseContainer = overwritten = undefined;
-               });
+                                                       e.custom( start, end, unit );
 
-               // Delegate to script
-               return "script";
-       }
-});
-// Install script dataType
-jQuery.ajaxSetup({
-       accepts: {
-               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-       },
-       contents: {
-               script: /javascript|ecmascript/
-       },
-       converters: {
-               "text script": function( text ) {
-                       jQuery.globalEval( text );
-                       return text;
-               }
-       }
-});
+                                               } else {
+                                                       e.custom( start, val, "" );
+                                               }
+                                       }
+                               }
 
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-       if ( s.cache === undefined ) {
-               s.cache = false;
-       }
-       if ( s.crossDomain ) {
-               s.type = "GET";
-               s.global = false;
-       }
-});
+                               // For JS strict compliance
+                               return true;
+                       }
 
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
+                       return optall.queue === false ?
+                               this.each( doAnimation ) :
+                               this.queue( optall.queue, doAnimation );
+               },
 
-       // This transport only deals with cross domain requests
-       if ( s.crossDomain ) {
+               stop: function( type, clearQueue, gotoEnd ) {
+                       if ( typeof type !== "string" ) {
+                               gotoEnd = clearQueue;
+                               clearQueue = type;
+                               type = undefined;
+                       }
+                       if ( clearQueue && type !== false ) {
+                               this.queue( type || "fx", [] );
+                       }
 
-               var script,
-                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+                       return this.each(function() {
+                               var index,
+                                       hadTimers = false,
+                                       timers = jQuery.timers,
+                                       data = jQuery._data( this );
+
+                               // clear marker counters if we know they won't be
+                               if ( !gotoEnd ) {
+                                       jQuery._unmark( true, this );
+                               }
 
-               return {
+                               function stopQueue( elem, data, index ) {
+                                       var hooks = data[ index ];
+                                       jQuery.removeData( elem, index, true );
+                                       hooks.stop( gotoEnd );
+                               }
 
-                       send: function( _, callback ) {
+                               if ( type == null ) {
+                                       for ( index in data ) {
+                                               if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+                                                       stopQueue( this, data, index );
+                                               }
+                                       }
+                               } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+                                       stopQueue( this, data, index );
+                               }
 
-                               script = document.createElement( "script" );
+                               for ( index = timers.length; index--; ) {
+                                       if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                               if ( gotoEnd ) {
 
-                               script.async = "async";
+                                                       // force the next step to be the last
+                                                       timers[ index ]( true );
+                                               } else {
+                                                       timers[ index ].saveState();
+                                               }
+                                               hadTimers = true;
+                                               timers.splice( index, 1 );
+                                       }
+                               }
 
-                               if ( s.scriptCharset ) {
-                                       script.charset = s.scriptCharset;
+                               // start the next in the queue if the last step wasn't forced
+                               // timers currently will call their complete callbacks, which will dequeue
+                               // but only if they were gotoEnd
+                               if ( !( gotoEnd && hadTimers ) ) {
+                                       jQuery.dequeue( this, type );
                                }
+                       });
+               }
+
+       });
+
+// Animations created synchronously will run synchronously
+       function createFxNow() {
+               setTimeout( clearFxNow, 0 );
+               return ( fxNow = jQuery.now() );
+       }
 
-                               script.src = s.url;
+       function clearFxNow() {
+               fxNow = undefined;
+       }
 
-                               // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+// Generate parameters to create a standard animation
+       function genFx( type, num ) {
+               var obj = {};
 
-                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+               jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+                       obj[ this ] = type;
+               });
 
-                                               // Handle memory leak in IE
-                                               script.onload = script.onreadystatechange = null;
+               return obj;
+       }
 
-                                               // Remove the script
-                                               if ( head && script.parentNode ) {
-                                                       head.removeChild( script );
-                                               }
+// Generate shortcuts for custom animations
+       jQuery.each({
+               slideDown: genFx( "show", 1 ),
+               slideUp: genFx( "hide", 1 ),
+               slideToggle: genFx( "toggle", 1 ),
+               fadeIn: { opacity: "show" },
+               fadeOut: { opacity: "hide" },
+               fadeToggle: { opacity: "toggle" }
+       }, function( name, props ) {
+               jQuery.fn[ name ] = function( speed, easing, callback ) {
+                       return this.animate( props, speed, easing, callback );
+               };
+       });
 
-                                               // Dereference the script
-                                               script = undefined;
+       jQuery.extend({
+               speed: function( speed, easing, fn ) {
+                       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+                               complete: fn || !fn && easing ||
+                                       jQuery.isFunction( speed ) && speed,
+                               duration: speed,
+                               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+                       };
 
-                                               // Callback if not abort
-                                               if ( !isAbort ) {
-                                                       callback( 200, "success" );
-                                               }
-                                       }
-                               };
-                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-                               // This arises when a base node is used (#2709 and #4378).
-                               head.insertBefore( script, head.firstChild );
-                       },
+                       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-                       abort: function() {
-                               if ( script ) {
-                                       script.onload( 0, 1 );
-                               }
+                       // normalize opt.queue - true/undefined/null -> "fx"
+                       if ( opt.queue == null || opt.queue === true ) {
+                               opt.queue = "fx";
                        }
-               };
-       }
-});
-var xhrCallbacks,
-       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-       xhrOnUnloadAbort = window.ActiveXObject ? function() {
-               // Abort all pending requests
-               for ( var key in xhrCallbacks ) {
-                       xhrCallbacks[ key ]( 0, 1 );
-               }
-       } : false,
-       xhrId = 0;
 
-// Functions to create xhrs
-function createStandardXHR() {
-       try {
-               return new window.XMLHttpRequest();
-       } catch( e ) {}
-}
+                       // Queueing
+                       opt.old = opt.complete;
 
-function createActiveXHR() {
-       try {
-               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-       } catch( e ) {}
-}
+                       opt.complete = function( noUnmark ) {
+                               if ( jQuery.isFunction( opt.old ) ) {
+                                       opt.old.call( this );
+                               }
 
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-       /* Microsoft failed to properly
-        * implement the XMLHttpRequest in IE7 (can't request local files),
-        * so we use the ActiveXObject when it is available
-        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-        * we need a fallback.
-        */
-       function() {
-               return !this.isLocal && createStandardXHR() || createActiveXHR();
-       } :
-       // For all other browsers, use the standard XMLHttpRequest object
-       createStandardXHR;
+                               if ( opt.queue ) {
+                                       jQuery.dequeue( this, opt.queue );
+                               } else if ( noUnmark !== false ) {
+                                       jQuery._unmark( this );
+                               }
+                       };
 
-// Determine support properties
-(function( xhr ) {
-       jQuery.extend( jQuery.support, {
-               ajax: !!xhr,
-               cors: !!xhr && ( "withCredentials" in xhr )
-       });
-})( jQuery.ajaxSettings.xhr() );
+                       return opt;
+               },
+
+               easing: {
+                       linear: function( p ) {
+                               return p;
+                       },
+                       swing: function( p ) {
+                               return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+                       }
+               },
 
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
+               timers: [],
 
-       jQuery.ajaxTransport(function( s ) {
-               // Cross domain only allowed if supported through XMLHttpRequest
-               if ( !s.crossDomain || jQuery.support.cors ) {
+               fx: function( elem, options, prop ) {
+                       this.options = options;
+                       this.elem = elem;
+                       this.prop = prop;
 
-                       var callback;
+                       options.orig = options.orig || {};
+               }
 
-                       return {
-                               send: function( headers, complete ) {
+       });
 
-                                       // Get a new xhr
-                                       var handle, i,
-                                               xhr = s.xhr();
+       jQuery.fx.prototype = {
+               // Simple function for setting a style value
+               update: function() {
+                       if ( this.options.step ) {
+                               this.options.step.call( this.elem, this.now, this );
+                       }
 
-                                       // Open the socket
-                                       // Passing null username, generates a login popup on Opera (#2865)
-                                       if ( s.username ) {
-                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
-                                       } else {
-                                               xhr.open( s.type, s.url, s.async );
-                                       }
+                       ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+               },
 
-                                       // Apply custom fields if provided
-                                       if ( s.xhrFields ) {
-                                               for ( i in s.xhrFields ) {
-                                                       xhr[ i ] = s.xhrFields[ i ];
-                                               }
-                                       }
+               // Get the current size
+               cur: function() {
+                       if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+                               return this.elem[ this.prop ];
+                       }
 
-                                       // Override mime type if needed
-                                       if ( s.mimeType && xhr.overrideMimeType ) {
-                                               xhr.overrideMimeType( s.mimeType );
-                                       }
+                       var parsed,
+                               r = jQuery.css( this.elem, this.prop );
+                       // Empty strings, null, undefined and "auto" are converted to 0,
+                       // complex values such as "rotate(1rad)" are returned as is,
+                       // simple values such as "10px" are parsed to Float.
+                       return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+               },
 
-                                       // X-Requested-With header
-                                       // For cross-domain requests, seeing as conditions for a preflight are
-                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
-                                       // (it can always be set on a per-request basis or even using ajaxSetup)
-                                       // For same-domain requests, won't change header if already provided.
-                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+               // Start an animation from one number to another
+               custom: function( from, to, unit ) {
+                       var self = this,
+                               fx = jQuery.fx;
+
+                       this.startTime = fxNow || createFxNow();
+                       this.end = to;
+                       this.now = this.start = from;
+                       this.pos = this.state = 0;
+                       this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+                       function t( gotoEnd ) {
+                               return self.step( gotoEnd );
+                       }
+
+                       t.queue = this.options.queue;
+                       t.elem = this.elem;
+                       t.saveState = function() {
+                               if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+                                       if ( self.options.hide ) {
+                                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+                                       } else if ( self.options.show ) {
+                                               jQuery._data( self.elem, "fxshow" + self.prop, self.end );
                                        }
+                               }
+                       };
 
-                                       // Need an extra try/catch for cross domain requests in Firefox 3
-                                       try {
-                                               for ( i in headers ) {
-                                                       xhr.setRequestHeader( i, headers[ i ] );
-                                               }
-                                       } catch( _ ) {}
+                       if ( t() && jQuery.timers.push(t) && !timerId ) {
+                               timerId = setInterval( fx.tick, fx.interval );
+                       }
+               },
 
-                                       // Do send the request
-                                       // This may raise an exception which is actually
-                                       // handled in jQuery.ajax (so no try/catch here)
-                                       xhr.send( ( s.hasContent && s.data ) || null );
+               // Simple 'show' function
+               show: function() {
+                       var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
 
-                                       // Listener
-                                       callback = function( _, isAbort ) {
+                       // Remember where we started, so that we can go back to it later
+                       this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+                       this.options.show = true;
 
-                                               var status,
-                                                       statusText,
-                                                       responseHeaders,
-                                                       responses,
-                                                       xml;
+                       // Begin the animation
+                       // Make sure that we start at a small width/height to avoid any flash of content
+                       if ( dataShow !== undefined ) {
+                               // This show is picking up where a previous hide or show left off
+                               this.custom( this.cur(), dataShow );
+                       } else {
+                               this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+                       }
 
-                                               // Firefox throws exceptions when accessing properties
-                                               // of an xhr when a network error occurred
-                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-                                               try {
+                       // Start by showing the element
+                       jQuery( this.elem ).show();
+               },
 
-                                                       // Was never called and is aborted or complete
-                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+               // Simple 'hide' function
+               hide: function() {
+                       // Remember where we started, so that we can go back to it later
+                       this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+                       this.options.hide = true;
 
-                                                               // Only called once
-                                                               callback = undefined;
+                       // Begin the animation
+                       this.custom( this.cur(), 0 );
+               },
 
-                                                               // Do not keep as active anymore
-                                                               if ( handle ) {
-                                                                       xhr.onreadystatechange = jQuery.noop;
-                                                                       if ( xhrOnUnloadAbort ) {
-                                                                               delete xhrCallbacks[ handle ];
-                                                                       }
-                                                               }
+               // Each step of an animation
+               step: function( gotoEnd ) {
+                       var p, n, complete,
+                               t = fxNow || createFxNow(),
+                               done = true,
+                               elem = this.elem,
+                               options = this.options;
 
-                                                               // If it's an abort
-                                                               if ( isAbort ) {
-                                                                       // Abort it manually if needed
-                                                                       if ( xhr.readyState !== 4 ) {
-                                                                               xhr.abort();
-                                                                       }
-                                                               } else {
-                                                                       status = xhr.status;
-                                                                       responseHeaders = xhr.getAllResponseHeaders();
-                                                                       responses = {};
-                                                                       xml = xhr.responseXML;
-
-                                                                       // Construct response list
-                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
-                                                                               responses.xml = xml;
-                                                                       }
+                       if ( gotoEnd || t >= options.duration + this.startTime ) {
+                               this.now = this.end;
+                               this.pos = this.state = 1;
+                               this.update();
 
-                                                                       // When requesting binary data, IE6-9 will throw an exception
-                                                                       // on any attempt to access responseText (#11426)
-                                                                       try {
-                                                                               responses.text = xhr.responseText;
-                                                                       } catch( _ ) {
-                                                                       }
+                               options.animatedProperties[ this.prop ] = true;
 
-                                                                       // Firefox throws an exception when accessing
-                                                                       // statusText for faulty cross-domain requests
-                                                                       try {
-                                                                               statusText = xhr.statusText;
-                                                                       } catch( e ) {
-                                                                               // We normalize with Webkit giving an empty statusText
-                                                                               statusText = "";
-                                                                       }
+                               for ( p in options.animatedProperties ) {
+                                       if ( options.animatedProperties[ p ] !== true ) {
+                                               done = false;
+                                       }
+                               }
 
-                                                                       // Filter status for non standard behaviors
+                               if ( done ) {
+                                       // Reset the overflow
+                                       if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
 
-                                                                       // If the request is local and we have data: assume a success
-                                                                       // (success with no data won't get notified, that's the best we
-                                                                       // can do given current implementations)
-                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
-                                                                               status = responses.text ? 200 : 404;
-                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
-                                                                       } else if ( status === 1223 ) {
-                                                                               status = 204;
-                                                                       }
-                                                               }
-                                                       }
-                                               } catch( firefoxAccessException ) {
-                                                       if ( !isAbort ) {
-                                                               complete( -1, firefoxAccessException );
-                                                       }
-                                               }
+                                               jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+                                                       elem.style[ "overflow" + value ] = options.overflow[ index ];
+                                               });
+                                       }
 
-                                               // Call complete if needed
-                                               if ( responses ) {
-                                                       complete( status, statusText, responses, responseHeaders );
-                                               }
-                                       };
+                                       // Hide the element if the "hide" operation was done
+                                       if ( options.hide ) {
+                                               jQuery( elem ).hide();
+                                       }
 
-                                       if ( !s.async ) {
-                                               // if we're in sync mode we fire the callback
-                                               callback();
-                                       } else if ( xhr.readyState === 4 ) {
-                                               // (IE6 & IE7) if it's in cache and has been
-                                               // retrieved directly we need to fire the callback
-                                               setTimeout( callback, 0 );
-                                       } else {
-                                               handle = ++xhrId;
-                                               if ( xhrOnUnloadAbort ) {
-                                                       // Create the active xhrs callbacks list if needed
-                                                       // and attach the unload handler
-                                                       if ( !xhrCallbacks ) {
-                                                               xhrCallbacks = {};
-                                                               jQuery( window ).unload( xhrOnUnloadAbort );
-                                                       }
-                                                       // Add to list of active xhrs callbacks
-                                                       xhrCallbacks[ handle ] = callback;
+                                       // Reset the properties, if the item has been hidden or shown
+                                       if ( options.hide || options.show ) {
+                                               for ( p in options.animatedProperties ) {
+                                                       jQuery.style( elem, p, options.orig[ p ] );
+                                                       jQuery.removeData( elem, "fxshow" + p, true );
+                                                       // Toggle data is no longer needed
+                                                       jQuery.removeData( elem, "toggle" + p, true );
                                                }
-                                               xhr.onreadystatechange = callback;
                                        }
-                               },
 
-                               abort: function() {
-                                       if ( callback ) {
-                                               callback(0,1);
+                                       // Execute the complete function
+                                       // in the event that the complete function throws an exception
+                                       // we must ensure it won't be called twice. #5684
+
+                                       complete = options.complete;
+                                       if ( complete ) {
+
+                                               options.complete = false;
+                                               complete.call( elem );
                                        }
                                }
-                       };
-               }
-       });
-}
-var fxNow, timerId,
-       rfxtypes = /^(?:toggle|show|hide)$/,
-       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-       rrun = /queueHooks$/,
-       animationPrefilters = [ defaultPrefilter ],
-       tweeners = {
-               "*": [function( prop, value ) {
-                       var end, unit, prevScale,
-                               tween = this.createTween( prop, value ),
-                               parts = rfxnum.exec( value ),
-                               target = tween.cur(),
-                               start = +target || 0,
-                               scale = 1;
-
-                       if ( parts ) {
-                               end = +parts[2];
-                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-                               // We need to compute starting value
-                               if ( unit !== "px" && start ) {
-                                       // Iteratively approximate from a nonzero starting point
-                                       // Prefer the current property, because this process will be trivial if it uses the same units
-                                       // Fallback to end or a simple constant
-                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-                                       do {
-                                               // If previous iteration zeroed out, double until we get *something*
-                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
-                                               prevScale = scale = scale || ".5";
-
-                                               // Adjust and apply
-                                               start = start / scale;
-                                               jQuery.style( tween.elem, prop, start + unit );
-
-                                               // Update scale, tolerating zeroes from tween.cur()
-                                               scale = tween.cur() / target;
-
-                                       // Stop looping if we've hit the mark or scale is unchanged
-                                       } while ( scale !== 1 && scale !== prevScale );
-                               }
-
-                               tween.unit = unit;
-                               tween.start = start;
-                               // If a +=/-= token was provided, we're doing a relative animation
-                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-                       }
-                       return tween;
-               }]
-       };
 
-// Animations created synchronously will run synchronously
-function createFxNow() {
-       setTimeout(function() {
-               fxNow = undefined;
-       }, 0 );
-       return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
-       jQuery.each( props, function( prop, value ) {
-               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-                       index = 0,
-                       length = collection.length;
-               for ( ; index < length; index++ ) {
-                       if ( collection[ index ].call( animation, prop, value ) ) {
-
-                               // we're done with this property
-                               return;
-                       }
-               }
-       });
-}
-
-function Animation( elem, properties, options ) {
-       var result,
-               index = 0,
-               tweenerIndex = 0,
-               length = animationPrefilters.length,
-               deferred = jQuery.Deferred().always( function() {
-                       // don't match elem in the :animated selector
-                       delete tick.elem;
-               }),
-               tick = function() {
-                       var currentTime = fxNow || createFxNow(),
-                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               percent = 1 - ( remaining / animation.duration || 0 ),
-                               index = 0,
-                               length = animation.tweens.length;
-
-                       for ( ; index < length ; index++ ) {
-                               animation.tweens[ index ].run( percent );
-                       }
-
-                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-                       if ( percent < 1 && length ) {
-                               return remaining;
-                       } else {
-                               deferred.resolveWith( elem, [ animation ] );
                                return false;
-                       }
-               },
-               animation = deferred.promise({
-                       elem: elem,
-                       props: jQuery.extend( {}, properties ),
-                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
-                       originalProperties: properties,
-                       originalOptions: options,
-                       startTime: fxNow || createFxNow(),
-                       duration: options.duration,
-                       tweens: [],
-                       createTween: function( prop, end, easing ) {
-                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
-                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
-                               animation.tweens.push( tween );
-                               return tween;
-                       },
-                       stop: function( gotoEnd ) {
-                               var index = 0,
-                                       // if we are going to the end, we want to run all the tweens
-                                       // otherwise we skip this part
-                                       length = gotoEnd ? animation.tweens.length : 0;
 
-                               for ( ; index < length ; index++ ) {
-                                       animation.tweens[ index ].run( 1 );
-                               }
-
-                               // resolve when we played the last frame
-                               // otherwise, reject
-                               if ( gotoEnd ) {
-                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                       } else {
+                               // classical easing cannot be used with an Infinity duration
+                               if ( options.duration == Infinity ) {
+                                       this.now = t;
                                } else {
-                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                                       n = t - this.startTime;
+                                       this.state = n / options.duration;
+
+                                       // Perform the easing function, defaults to swing
+                                       this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+                                       this.now = this.start + ( (this.end - this.start) * this.pos );
                                }
-                               return this;
+                               // Perform the next step of the animation
+                               this.update();
                        }
-               }),
-               props = animation.props;
-
-       propFilter( props, animation.opts.specialEasing );
-
-       for ( ; index < length ; index++ ) {
-               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-               if ( result ) {
-                       return result;
-               }
-       }
-
-       createTweens( animation, props );
-
-       if ( jQuery.isFunction( animation.opts.start ) ) {
-               animation.opts.start.call( elem, animation );
-       }
 
-       jQuery.fx.timer(
-               jQuery.extend( tick, {
-                       anim: animation,
-                       queue: animation.opts.queue,
-                       elem: elem
-               })
-       );
-
-       // attach callbacks from options
-       return animation.progress( animation.opts.progress )
-               .done( animation.opts.done, animation.opts.complete )
-               .fail( animation.opts.fail )
-               .always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
-       var index, name, easing, value, hooks;
-
-       // camelCase, specialEasing and expand cssHook pass
-       for ( index in props ) {
-               name = jQuery.camelCase( index );
-               easing = specialEasing[ name ];
-               value = props[ index ];
-               if ( jQuery.isArray( value ) ) {
-                       easing = value[ 1 ];
-                       value = props[ index ] = value[ 0 ];
-               }
-
-               if ( index !== name ) {
-                       props[ name ] = value;
-                       delete props[ index ];
+                       return true;
                }
+       };
 
-               hooks = jQuery.cssHooks[ name ];
-               if ( hooks && "expand" in hooks ) {
-                       value = hooks.expand( value );
-                       delete props[ name ];
+       jQuery.extend( jQuery.fx, {
+               tick: function() {
+                       var timer,
+                               timers = jQuery.timers,
+                               i = 0;
 
-                       // not quite $.extend, this wont overwrite keys already present.
-                       // also - reusing 'index' from above because we have the correct "name"
-                       for ( index in value ) {
-                               if ( !( index in props ) ) {
-                                       props[ index ] = value[ index ];
-                                       specialEasing[ index ] = easing;
+                       for ( ; i < timers.length; i++ ) {
+                               timer = timers[ i ];
+                               // Checks the timer has not already been removed
+                               if ( !timer() && timers[ i ] === timer ) {
+                                       timers.splice( i--, 1 );
                                }
                        }
-               } else {
-                       specialEasing[ name ] = easing;
-               }
-       }
-}
 
-jQuery.Animation = jQuery.extend( Animation, {
+                       if ( !timers.length ) {
+                               jQuery.fx.stop();
+                       }
+               },
 
-       tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
-                       callback = props;
-                       props = [ "*" ];
-               } else {
-                       props = props.split(" ");
-               }
+               interval: 13,
 
-               var prop,
-                       index = 0,
-                       length = props.length;
+               stop: function() {
+                       clearInterval( timerId );
+                       timerId = null;
+               },
 
-               for ( ; index < length ; index++ ) {
-                       prop = props[ index ];
-                       tweeners[ prop ] = tweeners[ prop ] || [];
-                       tweeners[ prop ].unshift( callback );
-               }
-       },
+               speeds: {
+                       slow: 600,
+                       fast: 200,
+                       // Default speed
+                       _default: 400
+               },
 
-       prefilter: function( callback, prepend ) {
-               if ( prepend ) {
-                       animationPrefilters.unshift( callback );
-               } else {
-                       animationPrefilters.push( callback );
-               }
-       }
-});
-
-function defaultPrefilter( elem, props, opts ) {
-       var index, prop, value, length, dataShow, tween, hooks, oldfire,
-               anim = this,
-               style = elem.style,
-               orig = {},
-               handled = [],
-               hidden = elem.nodeType && isHidden( elem );
-
-       // handle queue: false promises
-       if ( !opts.queue ) {
-               hooks = jQuery._queueHooks( elem, "fx" );
-               if ( hooks.unqueued == null ) {
-                       hooks.unqueued = 0;
-                       oldfire = hooks.empty.fire;
-                       hooks.empty.fire = function() {
-                               if ( !hooks.unqueued ) {
-                                       oldfire();
-                               }
-                       };
-               }
-               hooks.unqueued++;
+               step: {
+                       opacity: function( fx ) {
+                               jQuery.style( fx.elem, "opacity", fx.now );
+                       },
 
-               anim.always(function() {
-                       // doing this makes sure that the complete handler will be called
-                       // before this completes
-                       anim.always(function() {
-                               hooks.unqueued--;
-                               if ( !jQuery.queue( elem, "fx" ).length ) {
-                                       hooks.empty.fire();
+                       _default: function( fx ) {
+                               if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                                       fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+                               } else {
+                                       fx.elem[ fx.prop ] = fx.now;
                                }
-                       });
-               });
-       }
-
-       // height/width overflow pass
-       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-               // Make sure that nothing sneaks out
-               // Record all 3 overflow attributes because IE does not
-               // change the overflow attribute when overflowX and
-               // overflowY are set to the same value
-               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-               // Set display property to inline-block for height/width
-               // animations on inline elements that are having width/height animated
-               if ( jQuery.css( elem, "display" ) === "inline" &&
-                               jQuery.css( elem, "float" ) === "none" ) {
-
-                       // inline-level elements accept inline-block;
-                       // block-level elements need to be inline with layout
-                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-                               style.display = "inline-block";
-
-                       } else {
-                               style.zoom = 1;
                        }
                }
-       }
+       });
 
-       if ( opts.overflow ) {
-               style.overflow = "hidden";
-               if ( !jQuery.support.shrinkWrapBlocks ) {
-                       anim.done(function() {
-                               style.overflow = opts.overflow[ 0 ];
-                               style.overflowX = opts.overflow[ 1 ];
-                               style.overflowY = opts.overflow[ 2 ];
-                       });
+// Ensure props that can't be negative don't go there on undershoot easing
+       jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+               // exclude marginTop, marginLeft, marginBottom and marginRight from this list
+               if ( prop.indexOf( "margin" ) ) {
+                       jQuery.fx.step[ prop ] = function( fx ) {
+                               jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+                       };
                }
+       });
+
+       if ( jQuery.expr && jQuery.expr.filters ) {
+               jQuery.expr.filters.animated = function( elem ) {
+                       return jQuery.grep(jQuery.timers, function( fn ) {
+                               return elem === fn.elem;
+                       }).length;
+               };
        }
 
+// Try to restore the default display value of an element
+       function defaultDisplay( nodeName ) {
 
-       // show/hide pass
-       for ( index in props ) {
-               value = props[ index ];
-               if ( rfxtypes.exec( value ) ) {
-                       delete props[ index ];
-                       if ( value === ( hidden ? "hide" : "show" ) ) {
-                               continue;
-                       }
-                       handled.push( index );
-               }
-       }
+               if ( !elemdisplay[ nodeName ] ) {
 
-       length = handled.length;
-       if ( length ) {
-               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-               if ( hidden ) {
-                       jQuery( elem ).show();
-               } else {
-                       anim.done(function() {
-                               jQuery( elem ).hide();
-                       });
-               }
-               anim.done(function() {
-                       var prop;
-                       jQuery.removeData( elem, "fxshow", true );
-                       for ( prop in orig ) {
-                               jQuery.style( elem, prop, orig[ prop ] );
-                       }
-               });
-               for ( index = 0 ; index < length ; index++ ) {
-                       prop = handled[ index ];
-                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+                       var body = document.body,
+                               elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+                               display = elem.css( "display" );
+                       elem.remove();
 
-                       if ( !( prop in dataShow ) ) {
-                               dataShow[ prop ] = tween.start;
-                               if ( hidden ) {
-                                       tween.end = tween.start;
-                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                       // If the simple way fails,
+                       // get element's real default display by attaching it to a temp iframe
+                       if ( display === "none" || display === "" ) {
+                               // No iframe to use yet, so create it
+                               if ( !iframe ) {
+                                       iframe = document.createElement( "iframe" );
+                                       iframe.frameBorder = iframe.width = iframe.height = 0;
                                }
-                       }
-               }
-       }
-}
-
-function Tween( elem, options, prop, end, easing ) {
-       return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-       constructor: Tween,
-       init: function( elem, options, prop, end, easing, unit ) {
-               this.elem = elem;
-               this.prop = prop;
-               this.easing = easing || "swing";
-               this.options = options;
-               this.start = this.now = this.cur();
-               this.end = end;
-               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-       },
-       cur: function() {
-               var hooks = Tween.propHooks[ this.prop ];
-
-               return hooks && hooks.get ?
-                       hooks.get( this ) :
-                       Tween.propHooks._default.get( this );
-       },
-       run: function( percent ) {
-               var eased,
-                       hooks = Tween.propHooks[ this.prop ];
-
-               if ( this.options.duration ) {
-                       this.pos = eased = jQuery.easing[ this.easing ](
-                               percent, this.options.duration * percent, 0, 1, this.options.duration
-                       );
-               } else {
-                       this.pos = eased = percent;
-               }
-               this.now = ( this.end - this.start ) * eased + this.start;
 
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
+                               body.appendChild( iframe );
 
-               if ( hooks && hooks.set ) {
-                       hooks.set( this );
-               } else {
-                       Tween.propHooks._default.set( this );
-               }
-               return this;
-       }
-};
+                               // Create a cacheable copy of the iframe document on first call.
+                               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+                               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+                               if ( !iframeDoc || !iframe.createElement ) {
+                                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                                       iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
+                                       iframeDoc.close();
+                               }
 
-Tween.prototype.init.prototype = Tween.prototype;
+                               elem = iframeDoc.createElement( nodeName );
 
-Tween.propHooks = {
-       _default: {
-               get: function( tween ) {
-                       var result;
+                               iframeDoc.body.appendChild( elem );
 
-                       if ( tween.elem[ tween.prop ] != null &&
-                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-                               return tween.elem[ tween.prop ];
+                               display = jQuery.css( elem, "display" );
+                               body.removeChild( iframe );
                        }
 
-                       // passing any value as a 4th parameter to .css will automatically
-                       // attempt a parseFloat and fallback to a string if the parse fails
-                       // so, simple values such as "10px" are parsed to Float.
-                       // complex values such as "rotate(1rad)" are returned as is.
-                       result = jQuery.css( tween.elem, tween.prop, false, "" );
-                       // Empty strings, null, undefined and "auto" are converted to 0.
-                       return !result || result === "auto" ? 0 : result;
-               },
-               set: function( tween ) {
-                       // use step hook for back compat - use cssHook if its there - use .style if its
-                       // available and use plain properties where available
-                       if ( jQuery.fx.step[ tween.prop ] ) {
-                               jQuery.fx.step[ tween.prop ]( tween );
-                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-                       } else {
-                               tween.elem[ tween.prop ] = tween.now;
-                       }
+                       // Store the correct default display
+                       elemdisplay[ nodeName ] = display;
                }
+
+               return elemdisplay[ nodeName ];
        }
-};
 
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
 
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-       set: function( tween ) {
-               if ( tween.elem.nodeType && tween.elem.parentNode ) {
-                       tween.elem[ tween.prop ] = tween.now;
-               }
-       }
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-       var cssFn = jQuery.fn[ name ];
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return speed == null || typeof speed === "boolean" ||
-                       // special check for .toggle( handler, handler, ... )
-                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
-                       cssFn.apply( this, arguments ) :
-                       this.animate( genFx( name, true ), speed, easing, callback );
-       };
-});
 
-jQuery.fn.extend({
-       fadeTo: function( speed, to, easing, callback ) {
 
-               // show any hidden elements after setting opacity to 0
-               return this.filter( isHidden ).css( "opacity", 0 ).show()
+       var getOffset,
+               rtable = /^t(?:able|d|h)$/i,
+               rroot = /^(?:body|html)$/i;
+
+       if ( "getBoundingClientRect" in document.documentElement ) {
+               getOffset = function( elem, doc, docElem, box ) {
+                       try {
+                               box = elem.getBoundingClientRect();
+                       } catch(e) {}
 
-                       // animate to the value specified
-                       .end().animate({ opacity: to }, speed, easing, callback );
-       },
-       animate: function( prop, speed, easing, callback ) {
-               var empty = jQuery.isEmptyObject( prop ),
-                       optall = jQuery.speed( speed, easing, callback ),
-                       doAnimation = function() {
-                               // Operate on a copy of prop so per-property easing won't be lost
-                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+                       // Make sure we're not dealing with a disconnected DOM node
+                       if ( !box || !jQuery.contains( docElem, elem ) ) {
+                               return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+                       }
 
-                               // Empty animations resolve immediately
-                               if ( empty ) {
-                                       anim.stop( true );
-                               }
-                       };
+                       var body = doc.body,
+                               win = getWindow( doc ),
+                               clientTop  = docElem.clientTop  || body.clientTop  || 0,
+                               clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                               scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+                               scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+                               top  = box.top  + scrollTop  - clientTop,
+                               left = box.left + scrollLeft - clientLeft;
 
-               return empty || optall.queue === false ?
-                       this.each( doAnimation ) :
-                       this.queue( optall.queue, doAnimation );
-       },
-       stop: function( type, clearQueue, gotoEnd ) {
-               var stopQueue = function( hooks ) {
-                       var stop = hooks.stop;
-                       delete hooks.stop;
-                       stop( gotoEnd );
+                       return { top: top, left: left };
                };
 
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
-               }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
-               }
+       } else {
+               getOffset = function( elem, doc, docElem ) {
+                       var computedStyle,
+                               offsetParent = elem.offsetParent,
+                               prevOffsetParent = elem,
+                               body = doc.body,
+                               defaultView = doc.defaultView,
+                               prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+                               top = elem.offsetTop,
+                               left = elem.offsetLeft;
+
+                       while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+                               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                                       break;
+                               }
 
-               return this.each(function() {
-                       var dequeue = true,
-                               index = type != null && type + "queueHooks",
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
+                               computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+                               top  -= elem.scrollTop;
+                               left -= elem.scrollLeft;
 
-                       if ( index ) {
-                               if ( data[ index ] && data[ index ].stop ) {
-                                       stopQueue( data[ index ] );
-                               }
-                       } else {
-                               for ( index in data ) {
-                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-                                               stopQueue( data[ index ] );
+                               if ( elem === offsetParent ) {
+                                       top  += elem.offsetTop;
+                                       left += elem.offsetLeft;
+
+                                       if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+                                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
                                        }
+
+                                       prevOffsetParent = offsetParent;
+                                       offsetParent = elem.offsetParent;
                                }
-                       }
 
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                       timers[ index ].anim.stop( gotoEnd );
-                                       dequeue = false;
-                                       timers.splice( index, 1 );
+                               if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
                                }
-                       }
 
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
-                       if ( dequeue || !gotoEnd ) {
-                               jQuery.dequeue( this, type );
+                               prevComputedStyle = computedStyle;
                        }
-               });
-       }
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-       var which,
-               attrs = { height: type },
-               i = 0;
-
-       // if we include width, step value is 1 to do all cssExpand values,
-       // if we don't include width, step value is 2 to skip over Left and Right
-       includeWidth = includeWidth? 1 : 0;
-       for( ; i < 4 ; i += 2 - includeWidth ) {
-               which = cssExpand[ i ];
-               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-       }
-
-       if ( includeWidth ) {
-               attrs.opacity = attrs.width = type;
-       }
 
-       return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx("show"),
-       slideUp: genFx("hide"),
-       slideToggle: genFx("toggle"),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" },
-       fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return this.animate( props, speed, easing, callback );
-       };
-});
-
-jQuery.speed = function( speed, easing, fn ) {
-       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-               complete: fn || !fn && easing ||
-                       jQuery.isFunction( speed ) && speed,
-               duration: speed,
-               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-       };
+                       if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+                               top  += body.offsetTop;
+                               left += body.offsetLeft;
+                       }
 
-       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                               top  += Math.max( docElem.scrollTop, body.scrollTop );
+                               left += Math.max( docElem.scrollLeft, body.scrollLeft );
+                       }
 
-       // normalize opt.queue - true/undefined/null -> "fx"
-       if ( opt.queue == null || opt.queue === true ) {
-               opt.queue = "fx";
+                       return { top: top, left: left };
+               };
        }
 
-       // Queueing
-       opt.old = opt.complete;
-
-       opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
-                       opt.old.call( this );
-               }
-
-               if ( opt.queue ) {
-                       jQuery.dequeue( this, opt.queue );
+       jQuery.fn.offset = function( options ) {
+               if ( arguments.length ) {
+                       return options === undefined ?
+                               this :
+                               this.each(function( i ) {
+                                       jQuery.offset.setOffset( this, options, i );
+                               });
                }
-       };
 
-       return opt;
-};
+               var elem = this[0],
+                       doc = elem && elem.ownerDocument;
 
-jQuery.easing = {
-       linear: function( p ) {
-               return p;
-       },
-       swing: function( p ) {
-               return 0.5 - Math.cos( p*Math.PI ) / 2;
-       }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-       var timer,
-               timers = jQuery.timers,
-               i = 0;
-
-       for ( ; i < timers.length; i++ ) {
-               timer = timers[ i ];
-               // Checks the timer has not already been removed
-               if ( !timer() && timers[ i ] === timer ) {
-                       timers.splice( i--, 1 );
+               if ( !doc ) {
+                       return null;
                }
-       }
 
-       if ( !timers.length ) {
-               jQuery.fx.stop();
-       }
-};
+               if ( elem === doc.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
 
-jQuery.fx.timer = function( timer ) {
-       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-       }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.stop = function() {
-       clearInterval( timerId );
-       timerId = null;
-};
-
-jQuery.fx.speeds = {
-       slow: 600,
-       fast: 200,
-       // Default speed
-       _default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
+               return getOffset( elem, doc, doc.documentElement );
        };
-}
-var rroot = /^(?:body|html)$/i;
-
-jQuery.fn.offset = function( options ) {
-       if ( arguments.length ) {
-               return options === undefined ?
-                       this :
-                       this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-       }
 
-       var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
-               elem = this[ 0 ],
-               doc = elem && elem.ownerDocument;
+       jQuery.offset = {
 
-       if ( !doc ) {
-               return;
-       }
+               bodyOffset: function( body ) {
+                       var top = body.offsetTop,
+                               left = body.offsetLeft;
 
-       if ( (body = doc.body) === elem ) {
-               return jQuery.offset.bodyOffset( elem );
-       }
+                       if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                               top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                               left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+                       }
+
+                       return { top: top, left: left };
+               },
 
-       docElem = doc.documentElement;
+               setOffset: function( elem, options, i ) {
+                       var position = jQuery.css( elem, "position" );
 
-       // Make sure we're not dealing with a disconnected DOM node
-       if ( !jQuery.contains( docElem, elem ) ) {
-               return { top: 0, left: 0 };
-       }
+                       // set position first, in-case top/left are set even on static elem
+                       if ( position === "static" ) {
+                               elem.style.position = "relative";
+                       }
 
-       box = elem.getBoundingClientRect();
-       win = getWindow( doc );
-       clientTop  = docElem.clientTop  || body.clientTop  || 0;
-       clientLeft = docElem.clientLeft || body.clientLeft || 0;
-       scrollTop  = win.pageYOffset || docElem.scrollTop;
-       scrollLeft = win.pageXOffset || docElem.scrollLeft;
-       top  = box.top  + scrollTop  - clientTop;
-       left = box.left + scrollLeft - clientLeft;
+                       var curElem = jQuery( elem ),
+                               curOffset = curElem.offset(),
+                               curCSSTop = jQuery.css( elem, "top" ),
+                               curCSSLeft = jQuery.css( elem, "left" ),
+                               calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                               props = {}, curPosition = {}, curTop, curLeft;
 
-       return { top: top, left: left };
-};
+                       // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+                       if ( calculatePosition ) {
+                               curPosition = curElem.position();
+                               curTop = curPosition.top;
+                               curLeft = curPosition.left;
+                       } else {
+                               curTop = parseFloat( curCSSTop ) || 0;
+                               curLeft = parseFloat( curCSSLeft ) || 0;
+                       }
 
-jQuery.offset = {
+                       if ( jQuery.isFunction( options ) ) {
+                               options = options.call( elem, i, curOffset );
+                       }
 
-       bodyOffset: function( body ) {
-               var top = body.offsetTop,
-                       left = body.offsetLeft;
+                       if ( options.top != null ) {
+                               props.top = ( options.top - curOffset.top ) + curTop;
+                       }
+                       if ( options.left != null ) {
+                               props.left = ( options.left - curOffset.left ) + curLeft;
+                       }
 
-               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+                       if ( "using" in options ) {
+                               options.using.call( elem, props );
+                       } else {
+                               curElem.css( props );
+                       }
                }
+       };
 
-               return { top: top, left: left };
-       },
 
-       setOffset: function( elem, options, i ) {
-               var position = jQuery.css( elem, "position" );
+       jQuery.fn.extend({
 
-               // set position first, in-case top/left are set even on static elem
-               if ( position === "static" ) {
-                       elem.style.position = "relative";
-               }
+               position: function() {
+                       if ( !this[0] ) {
+                               return null;
+                       }
 
-               var curElem = jQuery( elem ),
-                       curOffset = curElem.offset(),
-                       curCSSTop = jQuery.css( elem, "top" ),
-                       curCSSLeft = jQuery.css( elem, "left" ),
-                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-                       props = {}, curPosition = {}, curTop, curLeft;
-
-               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-               if ( calculatePosition ) {
-                       curPosition = curElem.position();
-                       curTop = curPosition.top;
-                       curLeft = curPosition.left;
-               } else {
-                       curTop = parseFloat( curCSSTop ) || 0;
-                       curLeft = parseFloat( curCSSLeft ) || 0;
-               }
+                       var elem = this[0],
 
-               if ( jQuery.isFunction( options ) ) {
-                       options = options.call( elem, i, curOffset );
-               }
+                       // Get *real* offsetParent
+                               offsetParent = this.offsetParent(),
 
-               if ( options.top != null ) {
-                       props.top = ( options.top - curOffset.top ) + curTop;
-               }
-               if ( options.left != null ) {
-                       props.left = ( options.left - curOffset.left ) + curLeft;
-               }
+                       // Get correct offsets
+                               offset       = this.offset(),
+                               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
-               if ( "using" in options ) {
-                       options.using.call( elem, props );
-               } else {
-                       curElem.css( props );
-               }
-       }
-};
+                       // Subtract element margins
+                       // note: when an element has margin: auto the offsetLeft and marginLeft
+                       // are the same in Safari causing offset.left to incorrectly be 0
+                       offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+                       offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
 
+                       // Add offsetParent borders
+                       parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+                       parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
 
-jQuery.fn.extend({
+                       // Subtract the two offsets
+                       return {
+                               top:  offset.top  - parentOffset.top,
+                               left: offset.left - parentOffset.left
+                       };
+               },
 
-       position: function() {
-               if ( !this[0] ) {
-                       return;
+               offsetParent: function() {
+                       return this.map(function() {
+                               var offsetParent = this.offsetParent || document.body;
+                               while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                                       offsetParent = offsetParent.offsetParent;
+                               }
+                               return offsetParent;
+                       });
                }
+       });
 
-               var elem = this[0],
-
-               // Get *real* offsetParent
-               offsetParent = this.offsetParent(),
-
-               // Get correct offsets
-               offset       = this.offset(),
-               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
-               // Subtract element margins
-               // note: when an element has margin: auto the offsetLeft and marginLeft
-               // are the same in Safari causing offset.left to incorrectly be 0
-               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+// Create scrollLeft and scrollTop methods
+       jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+               var top = /Y/.test( prop );
+
+               jQuery.fn[ method ] = function( val ) {
+                       return jQuery.access( this, function( elem, method, val ) {
+                               var win = getWindow( elem );
+
+                               if ( val === undefined ) {
+                                       return win ? (prop in win) ? win[ prop ] :
+                                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                                       win.document.body[ method ] :
+                                               elem[ method ];
+                               }
 
-               // Add offsetParent borders
-               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+                               if ( win ) {
+                                       win.scrollTo(
+                                               !top ? val : jQuery( win ).scrollLeft(),
+                                               top ? val : jQuery( win ).scrollTop()
+                                       );
 
-               // Subtract the two offsets
-               return {
-                       top:  offset.top  - parentOffset.top,
-                       left: offset.left - parentOffset.left
+                               } else {
+                                       elem[ method ] = val;
+                               }
+                       }, method, val, arguments.length, null );
                };
-       },
+       });
 
-       offsetParent: function() {
-               return this.map(function() {
-                       var offsetParent = this.offsetParent || document.body;
-                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-                               offsetParent = offsetParent.offsetParent;
-                       }
-                       return offsetParent || document.body;
-               });
+       function getWindow( elem ) {
+               return jQuery.isWindow( elem ) ?
+                       elem :
+                       elem.nodeType === 9 ?
+                               elem.defaultView || elem.parentWindow :
+                               false;
        }
-});
 
 
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-       var top = /Y/.test( prop );
 
-       jQuery.fn[ method ] = function( val ) {
-               return jQuery.access( this, function( elem, method, val ) {
-                       var win = getWindow( elem );
 
-                       if ( val === undefined ) {
-                               return win ? (prop in win) ? win[ prop ] :
-                                       win.document.documentElement[ method ] :
-                                       elem[ method ];
-                       }
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+       jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+               var clientProp = "client" + name,
+                       scrollProp = "scroll" + name,
+                       offsetProp = "offset" + name;
 
-                       if ( win ) {
-                               win.scrollTo(
-                                       !top ? val : jQuery( win ).scrollLeft(),
-                                        top ? val : jQuery( win ).scrollTop()
-                               );
+               // innerHeight and innerWidth
+               jQuery.fn[ "inner" + name ] = function() {
+                       var elem = this[0];
+                       return elem ?
+                               elem.style ?
+                                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
+                                       this[ type ]() :
+                               null;
+               };
 
-                       } else {
-                               elem[ method ] = val;
-                       }
-               }, method, val, arguments.length, null );
-       };
-});
-
-function getWindow( elem ) {
-       return jQuery.isWindow( elem ) ?
-               elem :
-               elem.nodeType === 9 ?
-                       elem.defaultView || elem.parentWindow :
-                       false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-               // margin is only for outerHeight, outerWidth
-               jQuery.fn[ funcName ] = function( margin, value ) {
-                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+               // outerHeight and outerWidth
+               jQuery.fn[ "outer" + name ] = function( margin ) {
+                       var elem = this[0];
+                       return elem ?
+                               elem.style ?
+                                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+                                       this[ type ]() :
+                               null;
+               };
 
+               jQuery.fn[ type ] = function( value ) {
                        return jQuery.access( this, function( elem, type, value ) {
-                               var doc;
+                               var doc, docElemProp, orig, ret;
 
                                if ( jQuery.isWindow( elem ) ) {
-                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
-                                       // https://github.com/jquery/jquery/pull/764
-                                       return elem.document.documentElement[ "client" + name ];
+                                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                                       doc = elem.document;
+                                       docElemProp = doc.documentElement[ clientProp ];
+                                       return jQuery.support.boxModel && docElemProp ||
+                                               doc.body && doc.body[ clientProp ] || docElemProp;
                                }
 
                                // Get document width or height
                                if ( elem.nodeType === 9 ) {
+                                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
                                        doc = elem.documentElement;
 
-                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+                                       // so we can't use max, as it'll choose the incorrect offset[Width/Height]
+                                       // instead we use the correct client[Width/Height]
+                                       // support:IE6
+                                       if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+                                               return doc[ clientProp ];
+                                       }
+
                                        return Math.max(
-                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
-                                               doc[ "client" + name ]
+                                               elem.body[ scrollProp ], doc[ scrollProp ],
+                                               elem.body[ offsetProp ], doc[ offsetProp ]
                                        );
                                }
 
-                               return value === undefined ?
-                                       // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, value, extra ) :
+                               // Get width or height on the element
+                               if ( value === undefined ) {
+                                       orig = jQuery.css( elem, type );
+                                       ret = parseFloat( orig );
+                                       return jQuery.isNumeric( ret ) ? ret : orig;
+                               }
 
-                                       // Set width or height on the element
-                                       jQuery.style( elem, type, value, extra );
-                       }, type, chainable ? margin : undefined, chainable, null );
+                               // Set the width or height on the element
+                               jQuery( elem ).css( type, value );
+                       }, type, value, arguments.length, null );
                };
        });
-});
+
+
+
+
 // Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
+       window.jQuery = window.$ = jQuery;
 
 // Expose jQuery as an AMD module, but only for AMD loaders that
 // understand the issues with loading multiple versions of jQuery
@@ -9294,8 +9395,10 @@ window.jQuery = window.$ = jQuery;
 // file names, and jQuery is normally delivered in a lowercase file name.
 // Do this after creating the global so that if an AMD module wants to call
 // noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-       define( "jquery", [], function () { return jQuery; } );
-}
+       if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+               define( "jquery", [], function () { return jQuery; } );
+       }
+
+
 
 })( window );
index 3757393..bbffd7b 100644 (file)
@@ -55,6 +55,7 @@
                        return true;
                },
                compareObject: function ( objectA, objectB ) {
+                       var prop, type;
 
                        // Do a simple check if the types match
                        if ( typeof objectA === typeof objectB ) {
                                        if ( objectA === objectB ) {
                                                return true;
                                        } else {
-                                               var prop;
                                                // Iterate over each property
                                                for ( prop in objectA ) {
                                                        // Check if this property is also present in the other object
                                                        if ( prop in objectB ) {
                                                                // Compare the types of the properties
-                                                               var type = typeof objectA[prop];
+                                                               type = typeof objectA[prop];
                                                                if ( type === typeof objectB[prop] ) {
                                                                        // Recursively check objects inside this one
                                                                        switch ( type ) {
index 5ec05f2..aa356c4 100644 (file)
        $.fn.placeholder = function () {
 
                return this.each( function () {
+                       var placeholder, $input;
 
                        // If the HTML5 placeholder attribute is supported, use it
                        if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
                                return;
                        }
 
-                       var placeholder = this.getAttribute( 'placeholder' );
-                       var $input = $(this);
+                       placeholder = this.getAttribute( 'placeholder' );
+                       $input = $(this);
 
                        // Show initially, if empty
                        if ( this.value === '' || this.value === placeholder ) {
index d54e66c..1475af2 100644 (file)
@@ -96,7 +96,7 @@
         *  other constructor. Otherwise "missingTests" will include all methods that
         *  were not called from that instance.
         */
-       var CompletenessTest = function ( masterVariable, ignoreFn ) {
+       function CompletenessTest( masterVariable, ignoreFn ) {
 
                // Keep track in these objects. Keyed by strings with the
                // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
                });
 
                return this;
-       };
+       }
 
        /* Static members */
        CompletenessTest.ACTION_INJECT = 500;
index 257b224..55970e0 100644 (file)
@@ -1,11 +1,11 @@
 /**
- * QUnit v1.9.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.10.0 - A JavaScript Unit Testing Framework
  *
- * http://docs.jquery.com/QUnit
+ * http://qunitjs.com
  *
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
  */
 
 /** Font Family and Sizes */
@@ -20,7 +20,7 @@
 
 /** Resets */
 
-#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
+#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
        margin: 0;
        padding: 0;
 }
@@ -67,6 +67,7 @@
        padding: 0.5em 0 0.5em 2em;
        color: #5E740B;
        background-color: #eee;
+       overflow: hidden;
 }
 
 #qunit-userAgent {
@@ -76,6 +77,9 @@
        text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
 }
 
+#qunit-modulefilter-container {
+       float: right;
+}
 
 /** Tests: Pass/Fail */
 
index 9efedcb..d4f17b5 100644 (file)
@@ -1,11 +1,11 @@
 /**
- * QUnit v1.9.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.10.0 - A JavaScript Unit Testing Framework
  *
- * http://docs.jquery.com/QUnit
+ * http://qunitjs.com
  *
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
  */
 
 (function( window ) {
@@ -17,6 +17,8 @@ var QUnit,
        fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
        toString = Object.prototype.toString,
        hasOwn = Object.prototype.hasOwnProperty,
+       // Keep a local reference to Date (GH-283)
+       Date = window.Date,
        defined = {
        setTimeout: typeof window.setTimeout !== "undefined",
        sessionStorage: (function() {
@@ -304,7 +306,8 @@ QUnit = {
        // call on start of module test to prepend name to all tests
        module: function( name, testEnvironment ) {
                config.currentModule = name;
-               config.currentModuleTestEnviroment = testEnvironment;
+               config.currentModuleTestEnvironment = testEnvironment;
+               config.modules[name] = true;
        },
 
        asyncTest: function( testName, expected, callback ) {
@@ -336,7 +339,7 @@ QUnit = {
                        async: async,
                        callback: callback,
                        module: config.currentModule,
-                       moduleTestEnvironment: config.currentModuleTestEnviroment,
+                       moduleTestEnvironment: config.currentModuleTestEnvironment,
                        stack: sourceFromStacktrace( 2 )
                });
 
@@ -349,7 +352,11 @@ QUnit = {
 
        // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
        expect: function( asserts ) {
-               config.current.expected = asserts;
+               if (arguments.length === 1) {
+                       config.current.expected = asserts;
+               } else {
+                       return config.current.expected;
+               }
        },
 
        start: function( count ) {
@@ -415,6 +422,8 @@ QUnit.assert = {
 
                var source,
                        details = {
+                               module: config.current.module,
+                               name: config.current.testName,
                                result: result,
                                message: msg
                        };
@@ -600,6 +609,9 @@ config = {
                }
        ],
 
+       // Set of all modules.
+       modules: {},
+
        // logging callback queues
        begin: [],
        done: [],
@@ -710,17 +722,10 @@ extend( QUnit, {
        },
 
        // Resets the test setup. Useful for tests that modify the DOM.
-       // If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
        reset: function() {
-               var fixture;
-
-               if ( window.jQuery ) {
-                       jQuery( "#qunit-fixture" ).html( config.fixture );
-               } else {
-                       fixture = id( "qunit-fixture" );
-                       if ( fixture ) {
-                               fixture.innerHTML = config.fixture;
-                       }
+               var fixture = id( "qunit-fixture" );
+               if ( fixture ) {
+                       fixture.innerHTML = config.fixture;
                }
        },
 
@@ -781,6 +786,8 @@ extend( QUnit, {
 
                var output, source,
                        details = {
+                               module: config.current.module,
+                               name: config.current.testName,
                                result: result,
                                message: message,
                                actual: actual,
@@ -826,6 +833,8 @@ extend( QUnit, {
 
                var output,
                        details = {
+                               module: config.current.module,
+                               name: config.current.testName,
                                result: false,
                                message: message
                        };
@@ -916,7 +925,9 @@ QUnit.load = function() {
        runLoggingCallbacks( "begin", QUnit, {} );
 
        // Initialize the config, saving the execution queue
-       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,
+       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter,
+           numModules = 0,
+           moduleFilterHtml = "",
                urlConfigHtml = "",
                oldconfig = extend( {}, config );
 
@@ -940,6 +951,15 @@ QUnit.load = function() {
                urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
        }
 
+       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " + ( config.module === undefined  ? "selected" : "" ) + ">< All Modules ></option>";
+       for ( i in config.modules ) {
+               if ( config.modules.hasOwnProperty( i ) ) {
+                       numModules += 1;
+                       moduleFilterHtml += "<option value='" + encodeURIComponent(i) + "' " + ( config.module === i ? "selected" : "" ) + ">" + i + "</option>";
+               }
+       }
+       moduleFilterHtml += "</select>";
+
        // `userAgent` initialized at top of scope
        userAgent = id( "qunit-userAgent" );
        if ( userAgent ) {
@@ -1002,6 +1022,19 @@ QUnit.load = function() {
                        window.location = QUnit.url( params );
                });
                toolbar.appendChild( urlConfigCheckboxes );
+
+               if (numModules > 1) {
+                       moduleFilter = document.createElement( 'span' );
+                       moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
+                       moduleFilter.innerHTML = moduleFilterHtml;
+                       addEvent( moduleFilter, "change", function() {
+                               var selectBox = moduleFilter.getElementsByTagName("select")[0],
+                                   selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
+
+                               window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
+                       });
+                       toolbar.appendChild(moduleFilter);
+               }
        }
 
        // `main` initialized at top of scope
@@ -1039,9 +1072,9 @@ window.onerror = function ( error, filePath, linerNr ) {
                        }
                        QUnit.pushFailure( error, filePath + ":" + linerNr );
                } else {
-                       QUnit.test( "global failure", function() {
+                       QUnit.test( "global failure", extend( function() {
                                QUnit.pushFailure( error, filePath + ":" + linerNr );
-                       });
+                       }, { validTest: validTest } ) );
                }
                return false;
        }
@@ -1108,6 +1141,11 @@ function done() {
                }
        }
 
+       // scroll back to top to show results
+       if ( window.scrollTo ) {
+               window.scrollTo(0, 0);
+       }
+
        runLoggingCallbacks( "done", QUnit, {
                failed: config.stats.bad,
                passed: passed,
@@ -1123,6 +1161,12 @@ function validTest( test ) {
                module = config.module && config.module.toLowerCase(),
                fullName = (test.module + ": " + test.testName).toLowerCase();
 
+       // Internally-generated tests are always valid
+       if ( test.callback && test.callback.validTest === validTest ) {
+               delete test.callback.validTest;
+               return true;
+       }
+
        if ( config.testNumber ) {
                return test.testNumber === config.testNumber;
        }
@@ -1404,7 +1448,8 @@ QUnit.equiv = (function() {
                                                a.global === b.global &&
                                                // (gmi) ...
                                                a.ignoreCase === b.ignoreCase &&
-                                               a.multiline === b.multiline;
+                                               a.multiline === b.multiline &&
+                                               a.sticky === b.sticky;
                                },
 
                                // - skip when the property is a method of an instance (OOP)
index 150a51b..4a77528 100644 (file)
@@ -1,12 +1,40 @@
 .mw-spinner {
+       background-color: transparent;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+.mw-spinner-small {
        /* @embed */
-       background: transparent url(images/spinner.gif);
+       background-image: url(images/spinner.gif);
        height: 20px;
        width: 20px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 20px;
+}
+
+.mw-spinner-large {
+       /* @embed */
+       background-image: url(images/spinner-large.gif);
+       height: 32px;
+       width: 32px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 32px;
+}
+
+.mw-spinner-block {
+       display: block;
+       /* This overrides width from .mw-spinner-large / .mw-spinner-small,
+        * This is where the min-width kicks in.
+        */
+       width: 100%;
+}
+
+.mw-spinner-inline {
        display: inline-block;
        vertical-align: middle;
        
-       /* IE < 8 Hacks */
+       /* IE < 8 */
        zoom: 1;
        *display: inline;
-}
\ No newline at end of file
+}
index e8b683e..4a6ec3b 100644 (file)
@@ -5,40 +5,91 @@
  */
 ( function ( $ ) {
 
-       $.extend( {
+       // Default options for new spinners,
+       // stored outside the function to share between calls.
+       var defaults = {
+               id: undefined,
+               size: 'small',
+               type: 'inline'
+       };
+
+       $.extend({
                /**
                 * Creates a spinner element.
                 *
-                * @param id {String} id of the spinner
-                * @return {jQuery} spinner
+                * The argument is an object with options used to construct the spinner. These can be:
+                *
+                * It is a good practice to keep a reference to the created spinner to be able to remove it later.
+                * Alternatively one can use the id option and removeSpinner() (but make sure to choose an id
+                * that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
+                *
+                * CSS classes used:
+                *   .mw-spinner for every spinner
+                *   .mw-spinner-small / .mw-spinner-large for size
+                *   .mw-spinner-block / .mw-spinner-inline for display types
+                *
+                * @example
+                *   // Create a large spinner reserving all available horizontal space.
+                *   var $spinner = $.createSpinner({ size: 'large', type: 'block' });
+                *   // Insert above page content.
+                *   $( '#mw-content-text' ).prepend( $spinner );
+                * @example
+                *   // Place a small inline spinner next to the "Save" button
+                *   var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
+                *   // Alternatively, just `$.createSpinner();` as these are the default options.
+                *   $( '#wpSave' ).after( $spinner );
+                * @example
+                *   // The following two are equivalent:
+                *   $.createSpinner( 'magic' );
+                *   $.createSpinner({ id: 'magic' });
+                *
+                * @param {Object|String} opts [optional] ID string or options:
+                *  - id: If given, spinner will be given an id of "mw-spinner-<id>"
+                *  - size: 'small' (default) or 'large' for a 20-pixel or 32-pixel spinner
+                *  - type: 'inline' (default) or 'block'. Inline creates an inline-block with width and
+                *    height equal to spinner size. Block is a block-level element with width 100%, height
+                *    equal to spinner size.
+                * @return {jQuery}
                 */
-               createSpinner: function ( id ) {
-                       return $( '<div>' ).attr( {
-                               id: 'mw-spinner-' + id,
-                               'class': 'mw-spinner',
-                               title: '...'
-                       } );
+               createSpinner: function ( opts ) {
+                       if ( opts !== undefined && $.type( opts ) !== 'object' ) {
+                               opts = {
+                                       id: opts
+                               };
+                       }
+
+                       opts = $.extend( {}, defaults, opts );
+
+                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
+                       if ( opts.id !== undefined ) {
+                               $spinner.attr( 'id', 'mw-spinner-' + opts.id );
+                       }
+
+                       $spinner.addClass( opts.size === 'large' ? 'mw-spinner-large' : 'mw-spinner-small' );
+                       $spinner.addClass( opts.type === 'block' ? 'mw-spinner-block' : 'mw-spinner-inline' );
+
+                       return $spinner;
                },
 
                /**
                 * Removes a spinner element.
                 *
-                * @param id {String}
-                * @return {jQuery} spinner
+                * @param {String} id [optional] Id of the spinner, as passed to createSpinner.
+                * @return {jQuery} The (now detached) spinner.
                 */
                removeSpinner: function ( id ) {
                        return $( '#mw-spinner-' + id ).remove();
                }
-       } );
+       });
 
        /**
-        * Injects a spinner after the elements in the jQuery collection.
+        * Injects a spinner after the elements in the jQuery collection
+        * (as siblings, not children). Collection contents remain unchanged.
         *
-        * @param id String id of the spinner
+        * @param {Object} opts See createSpinner() for description.
         * @return {jQuery}
         */
-       $.fn.injectSpinner = function ( id ) {
-               return this.after( $.createSpinner( id ) );
+       $.fn.injectSpinner = function ( opts ) {
+               return this.after( $.createSpinner( opts ) );
        };
-
 }( jQuery ) );
index 583c1ed..abb0fa3 100644 (file)
                $.fn.extend({
                        focus: ( function ( jqFocus ) {
                                return function () {
+                                       var $w, state, result;
                                        if ( arguments.length === 0 ) {
-                                               var $w = $( window );
-                                               var state = {top: $w.scrollTop(), left: $w.scrollLeft()};
-                                               var result = jqFocus.apply( this, arguments );
+                                               $w = $( window );
+                                               state = {top: $w.scrollTop(), left: $w.scrollLeft()};
+                                               result = jqFocus.apply( this, arguments );
                                                window.scrollTo( state.top, state.left );
                                                return result;
                                        }
                         * in some browsers (IE/Opera)
                         */
                        getSelection: function () {
-                               var e = this.get( 0 );
-                               var retval = '';
-                               if ( $(e).is( ':hidden' ) ) {
+                               var retval, range,
+                                       el = this.get( 0 );
+
+                               if ( $(el).is( ':hidden' ) ) {
                                        // Do nothing
+                                       retval = '';
                                } else if ( document.selection && document.selection.createRange ) {
-                                       activateElementOnIE( e );
-                                       var range = document.selection.createRange();
+                                       activateElementOnIE( el );
+                                       range = document.selection.createRange();
                                        retval = range.text;
-                               } else if ( e.selectionStart || e.selectionStart === 0 ) {
-                                       retval = e.value.substring( e.selectionStart, e.selectionEnd );
+                               } else if ( el.selectionStart || el.selectionStart === 0 ) {
+                                       retval = el.value.substring( el.selectionStart, el.selectionEnd );
                                }
+
                                return retval;
                        },
                        /**
@@ -88,6 +92,7 @@
                        encapsulateSelection: function ( options ) {
                                return this.each( function () {
                                        var selText, scrollTop, insertText,
+                                               isSample, range, range2, range3, startPos, endPos,
                                                pre = options.pre,
                                                post = options.post;
 
                                         * Wrap each line of the selected text with pre and post
                                         */
                                        function doSplitLines( selText, pre, post ) {
-                                               var insertText = '';
-                                               var selTextArr = selText.split( '\n' );
-                                               for ( var i = 0; i < selTextArr.length; i++ ) {
+                                               var i,
+                                                       insertText = '',
+                                                       selTextArr = selText.split( '\n' );
+                                               for ( i = 0; i < selTextArr.length; i++ ) {
                                                        insertText += pre + selTextArr[i] + post;
                                                        if ( i !== selTextArr.length - 1 ) {
                                                                insertText += '\n';
                                                return insertText;
                                        }
 
-                                       var isSample = false;
+                                       isSample = false;
                                        if ( this.style.display === 'none' ) {
                                                // Do nothing
                                        } else if ( document.selection && document.selection.createRange ) {
 
                                                selText = $(this).textSelection( 'getSelection' );
                                                scrollTop = this.scrollTop;
-                                               var range = document.selection.createRange();
+                                               range = document.selection.createRange();
 
                                                checkSelectedText();
                                                insertText = pre + selText + post;
                                                        insertText = doSplitLines( selText, pre, post );
                                                }
                                                if ( options.ownline && range.moveStart ) {
-                                                       var range2 = document.selection.createRange();
+                                                       range2 = document.selection.createRange();
                                                        range2.collapse();
                                                        range2.moveStart( 'character', -1 );
                                                        // FIXME: Which check is correct?
                                                                insertText = "\n" + insertText;
                                                                pre += "\n";
                                                        }
-                                                       var range3 = document.selection.createRange();
+                                                       range3 = document.selection.createRange();
                                                        range3.collapse( false );
                                                        range3.moveEnd( 'character', 1 );
                                                        if ( range3.text !== "\r" && range3.text !== "\n" && range3.text !== "" ) {
                                                }
 
                                                selText = $(this).textSelection( 'getSelection' );
-                                               var startPos = this.selectionStart;
-                                               var endPos = this.selectionEnd;
+                                               startPos = this.selectionStart;
+                                               endPos = this.selectionEnd;
                                                scrollTop = this.scrollTop;
                                                checkSelectedText();
                                                if ( options.selectionStart !== undefined
                                                // whatever we do later (bug 31847).
                                                activateElementOnIE( e );
 
-                                               // IE Support
-                                               var preFinished = false;
-                                               var periFinished = false;
-                                               var postFinished = false;
-                                               var preText, rawPreText, periText;
-                                               var rawPeriText, postText, rawPostText;
-                                               // Create range containing text in the selection
-                                               var periRange = document.selection.createRange().duplicate();
-                                               // Create range containing text before the selection
-                                               var preRange = rangeForElementIE( e );
+                                               var
+                                                       preText, rawPreText, periText,
+                                                       rawPeriText, postText, rawPostText,
+
+                                                       // IE Support
+                                                       preFinished = false,
+                                                       periFinished = false,
+                                                       postFinished = false,
+                                                       // Range containing text in the selection
+                                                       periRange = document.selection.createRange().duplicate(),
+                                                       // Range containing text before the selection
+                                                       preRange,
+                                                       // Range containing text after the selection
+                                                       postRange;
+
+                                               preRange = rangeForElementIE( e ),
                                                // Move the end where we need it
                                                preRange.setEndPoint( 'EndToStart', periRange );
-                                               // Create range containing text after the selection
-                                               var postRange = rangeForElementIE( e );
+
+                                               postRange = rangeForElementIE( e );
                                                // Move the start where we need it
                                                postRange.setEndPoint( 'StartToEnd', periRange );
+
                                                // Load the text values we need to compare
                                                preText = rawPreText = preRange.text;
                                                periText = rawPeriText = periRange.text;
                                                postText = rawPostText = postRange.text;
+
                                                /*
                                                 * Check each range for trimmed newlines by shrinking the range by 1
                                                 * character and seeing if the text property has changed. If it has
                         */
                        setSelection: function ( options ) {
                                return this.each( function () {
+                                       var selection, length, newLines;
                                        if ( $(this).is( ':hidden' ) ) {
                                                // Do nothing
                                        } else if ( this.selectionStart || this.selectionStart === 0 ) {
                                                        this.selectionEnd = options.end;
                                                }
                                        } else if ( document.body.createTextRange ) {
-                                               var selection = rangeForElementIE( this );
-                                               var length = this.value.length;
+                                               selection = rangeForElementIE( this );
+                                               length = this.value.length;
                                                // IE doesn't count \n when computing the offset, so we won't either
-                                               var newLines = this.value.match( /\n/g );
+                                               newLines = this.value.match( /\n/g );
                                                if ( newLines ) {
                                                        length = length - newLines.length;
                                                }
                                                // Silence that error
                                                try {
                                                        selection.select();
-                                               } catch( e ) { }
+                                               } catch ( e ) { }
                                        }
                                });
                        },
                                        return ( $.client.profile().platform === 'mac' ? 13 : ( $.client.profile().platform === 'linux' ? 15 : 16 ) ) * row;
                                }
                                return this.each(function () {
+                                       var scroll, range, savedRange, pos, oldScrollTop;
                                        if ( $(this).is( ':hidden' ) ) {
                                                // Do nothing
                                        } else if ( this.selectionStart || this.selectionStart === 0 ) {
                                                // Mozilla
-                                               var scroll = getCaretScrollPosition( this );
+                                               scroll = getCaretScrollPosition( this );
                                                if ( options.force || scroll < $(this).scrollTop() ||
                                                                scroll > $(this).scrollTop() + $(this).height() ) {
                                                        $(this).scrollTop( scroll );
                                                 * cover that case, we'll force it to act by moving one
                                                 * character back and forth.
                                                 */
-                                               var range = document.body.createTextRange();
-                                               var savedRange = document.selection.createRange();
-                                               var pos = $(this).textSelection( 'getCaretPosition' );
-                                               var oldScrollTop = this.scrollTop;
+                                               range = document.body.createTextRange();
+                                               savedRange = document.selection.createRange();
+                                               pos = $(this).textSelection( 'getCaretPosition' );
+                                               oldScrollTop = this.scrollTop;
                                                range.moveToElementText( this );
                                                range.collapse();
                                                range.move( 'character', pos + 1);
index c8c18e6..cc6f704 100644 (file)
@@ -1,8 +1,7 @@
 /**
  * Additional mw.Api methods to assist with API calls related to categories.
  */
-
-( function( $, mw, undefined ) {
+( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
                 * @param err {Function} optional callback to run if api error
                 * @return ajax call object
                 */
-               isCategory: function( title, success, err ) {
-                       var params = {
-                                       prop: 'categoryinfo',
-                                       titles: title.toString()
-                               },
-                               ok = function( data ) {
-                                       var exists = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function( id, page ) {
-                                                       if ( page.categoryinfo ) {
-                                                               exists = true;
-                                                       }
-                                               } );
-                                       }
-                                       success( exists );
-                               };
+               isCategory: function ( title, success, err ) {
+                       var params, ok;
+                       params = {
+                               prop: 'categoryinfo',
+                               titles: title.toString()
+                       };
+                       ok = function ( data ) {
+                               var exists = false;
+                               if ( data.query && data.query.pages ) {
+                                       $.each( data.query.pages, function ( id, page ) {
+                                               if ( page.categoryinfo ) {
+                                                       exists = true;
+                                               }
+                                       } );
+                               }
+                               success( exists );
+                       };
 
                        return this.get( params, { ok: ok, err: err } );
                },
                 * @param err {Function} optional callback to run if api error
                 * @return {jqXHR}
                 */
-               getCategoriesByPrefix: function( prefix, success, err ) {
-
-                       // fetch with allpages to only get categories that have a corresponding description page.
-                       var params = {
+               getCategoriesByPrefix: function ( prefix, success, err ) {
+                       // Fetch with allpages to only get categories that have a corresponding description page.
+                       var params, ok;
+                       params = {
                                'list': 'allpages',
                                'apprefix': prefix,
                                'apnamespace': mw.config.get('wgNamespaceIds').category
                        };
-
-                       var ok = function( data ) {
+                       ok = function ( data ) {
                                var texts = [];
                                if ( data.query && data.query.allpages ) {
-                                       $.each( data.query.allpages, function( i, category ) {
+                                       $.each( data.query.allpages, function ( i, category ) {
                                                texts.push( new mw.Title( category.title ).getNameText() );
                                        } );
                                }
@@ -71,7 +70,7 @@
                 * @param async {Boolean} optional asynchronousness (default = true = async)
                 * @return {jqXHR}
                 */
-               getCategories: function( title, success, err, async ) {
+               getCategories: function ( title, success, err, async ) {
                        var params, ok;
                        params = {
                                prop: 'categories',
                        if ( async === undefined ) {
                                async = true;
                        }
-                       ok = function( data ) {
+                       ok = function ( data ) {
                                var ret = false;
                                if ( data.query && data.query.pages ) {
-                                       $.each( data.query.pages, function( id, page ) {
+                                       $.each( data.query.pages, function ( id, page ) {
                                                if ( page.categories ) {
                                                        if ( typeof ret !== 'object' ) {
                                                                ret = [];
                                                        }
-                                                       $.each( page.categories, function( i, cat ) {
+                                                       $.each( page.categories, function ( i, cat ) {
                                                                ret.push( new mw.Title( cat.title ) );
                                                        } );
                                                }
 
        } );
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 5197396..49af937 100644 (file)
@@ -1,8 +1,7 @@
 /**
  * Additional mw.Api methods to assist with API calls related to editing wiki pages.
  */
-
-( function( $, mw, undefined ) {
+( function ( mw, $ ) {
 
        // Cache token so we don't have to keep fetching new ones for every single request.
        var cachedToken = null;
                 * @param err {Function} [optional] error callback
                 * @return {jqXHR}
                 */
-               postWithEditToken: function( params, ok, err ) {
-                       var api = this, useTokenToPost, getTokenIfBad;
+               postWithEditToken: function ( params, ok, err ) {
+                       var useTokenToPost, getTokenIfBad,
+                               api = this;
                        if ( cachedToken === null ) {
                                // We don't have a valid cached token, so get a fresh one and try posting.
                                // We do not trap any 'badtoken' or 'notoken' errors, because we don't want
                                // an infinite loop. If this fresh token is bad, something else is very wrong.
-                               useTokenToPost = function( token ) {
+                               useTokenToPost = function ( token ) {
                                        params.token = token;
                                        api.post( params, ok, err );
                                };
                                // We do have a token, but it might be expired. So if it is 'bad' then
                                // start over with a new token.
                                params.token = cachedToken;
-                               getTokenIfBad = function( code, result ) {
+                               getTokenIfBad = function ( code, result ) {
                                        if ( code === 'badtoken' ) {
-                                               cachedToken = null; // force a new token
+                                               // force a new token, clear any old one
+                                               cachedToken = null;
                                                api.postWithEditToken( params, ok, err );
                                        } else {
                                                err( code, result );
                 * @param err {Function} error callback
                 * @return {jqXHR}
                 */
-               getEditToken: function( tokenCallback, err ) {
+               getEditToken: function ( tokenCallback, err ) {
                        var parameters = {
                                        action: 'tokens',
                                        type: 'edit'
                                },
-                               ok = function( data ) {
+                               ok = function ( data ) {
                                        var token;
                                        // If token type is not available for this user,
                                        // key 'edittoken' is missing or can contain Boolean false
@@ -96,7 +97,7 @@
                 * @param err {Function} error handler
                 * @return {jqXHR}
                 */
-               newSection: function( title, header, message, ok, err ) {
+               newSection: function ( title, header, message, ok, err ) {
                        var params = {
                                action: 'edit',
                                section: 'new',
 
         } );
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 080725a..a184e3c 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * mw.Api objects represent the API of a particular MediaWiki server.
  */
-( function( $, mw, undefined ) {
+( function ( mw, $ ) {
 
        /**
         * @var defaultOptions {Object}
@@ -47,7 +47,7 @@
         * @param options {Object} See defaultOptions documentation above. Ajax options can also be
         * overridden for each individual request to jQuery.ajax() later on.
         */
-       mw.Api = function( options ) {
+       mw.Api = function ( options ) {
 
                if ( options === undefined ) {
                        options = {};
@@ -91,7 +91,7 @@
                 * @param {Object|Function} [optional] ajax options
                 * @return {jQuery.Promise}
                 */
-               get: function( parameters, ajaxOptions ) {
+               get: function ( parameters, ajaxOptions ) {
                        ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
                        ajaxOptions.type = 'GET';
                        return this.ajax( parameters, ajaxOptions );
                 * @param {Object|Function} [optional] ajax options
                 * @return {jQuery.Promise}
                 */
-               post: function( parameters, ajaxOptions ) {
+               post: function ( parameters, ajaxOptions ) {
                        ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
                        ajaxOptions.type = 'POST';
                        return this.ajax( parameters, ajaxOptions );
                 * - done: API response data as first argument
                 * - fail: errorcode as first arg, details (string or object) as second arg.
                 */
-               ajax: function( parameters, ajaxOptions ) {
+               ajax: function ( parameters, ajaxOptions ) {
                        var token,
                                apiDeferred = $.Deferred();
 
                'exists'
        ];
 
-})( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index e784ef7..e8d1b3e 100644 (file)
@@ -12,7 +12,7 @@
                 * @param err {Function} [optional] deprecated (error callback)
                 * @return {jQuery.Promise}
                 */
-               parse: function( wikiText, ok, err ) {
+               parse: function ( wikiText, ok, err ) {
                        var apiDeferred = $.Deferred();
 
                        // Backwards compatibility (< MW 1.20)
@@ -39,4 +39,4 @@
                }
        } );
 
-} )( mediaWiki, jQuery );
+}( mediaWiki, jQuery ) );
index 5435945..1f7e275 100644 (file)
@@ -2,7 +2,7 @@
  * Additional mw.Api methods to assist with API calls to the API module of the TitleBlacklist extension.
  */
 
-( function( $, mw, undefined ) {
+( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
                 * @param err {Function} optional callback to run if api error
                 * @return {jqXHR}
                 */
-               isBlacklisted: function( title, success, err ) {
+               isBlacklisted: function ( title, success, err ) {
                        var     params = {
                                        action: 'titleblacklist',
                                        tbaction: 'create',
                                        tbtitle: title.toString()
                                },
-                               ok = function( data ) {
+                               ok = function ( data ) {
                                        var result;
 
                                        // this fails open (if nothing valid is returned by the api, allows the title)
@@ -48,4 +48,5 @@
                }
 
        } );
-} )( jQuery, mediaWiki );
+
+}( mediaWiki, jQuery ) );
index 302a2d3..d323442 100644 (file)
@@ -2,7 +2,7 @@
  * Additional mw.Api methods to assist with (un)watching wiki pages.
  * @since 1.19
  */
-( function( $, mw ) {
+( function ( mw, $ ) {
 
        /**
         * @context {mw.Api}
@@ -53,4 +53,4 @@
 
        } );
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 6b6e586..9e030fa 100644 (file)
        }
 
 var
+       /**
+        * Public methods (defined later)
+        */
+       fn,
+
        /**
         * Strip some illegal chars: control chars, colon, less than, greater than,
         * brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
@@ -221,7 +226,7 @@ var
 
        /* Public methods */
 
-       var fn = {
+       fn = {
                constructor: Title,
 
                /**
index 36628eb..1ad1a62 100644 (file)
@@ -94,7 +94,7 @@
                 * Constructs the HTML for the debugging toolbar
                 */
                buildHtml: function () {
-                       var $container, $bits, panes, id;
+                       var $container, $bits, panes, id, gitInfo;
 
                        $container = $( '<div id="mw-debug-toolbar" class="mw-debug"></div>' );
 
                         * @return {jQuery}
                         */
                        function bitDiv( id ) {
-                               return $( '<div>' ).attr({
+                               return $( '<div>' ).prop({
                                        id: 'mw-debug-' + id,
-                                       'class': 'mw-debug-bit'
+                                       className: 'mw-debug-bit'
                                })
                                .appendTo( $bits );
                        }
                         */
                        function paneLabel( id, text ) {
                                return $( '<a>' )
-                                       .attr({
-                                               'class': 'mw-debug-panelabel',
+                                       .prop({
+                                               className: 'mw-debug-panelabel',
                                                href: '#mw-debug-pane-' + id
                                        })
                                        .text( text );
                         * @return {jQuery}
                         */
                        function paneTriggerBitDiv( id, text, count ) {
-                               if( count ) {
+                               if ( count ) {
                                        text = text + ' (' + count + ')';
                                }
-                               return $( '<div>' ).attr({
+                               return $( '<div>' ).prop({
                                        id: 'mw-debug-' + id,
-                                       'class': 'mw-debug-bit mw-debug-panelink'
+                                       className: 'mw-debug-bit mw-debug-panelink'
                                })
                                .append( paneLabel( id, text ) )
                                .appendTo( $bits );
 
                        paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
 
-                       var gitInfo = '';
+                       gitInfo = '';
                        if ( this.data.gitRevision !== false ) {
                                gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
                                if ( this.data.gitViewUrl !== false ) {
-                                       gitInfo = $( '<a>' ).attr( 'href', this.data.gitViewUrl ).text( gitInfo );
+                                       gitInfo = $( '<a>' )
+                                               .attr( 'href', this.data.gitViewUrl )
+                                               .text( gitInfo );
                                }
                        }
 
                        bitDiv( 'mwversion' )
-                               .append( $( '<a href="//www.mediawiki.org/"></a>' ).text( 'MediaWiki' ) )
-                               .append( ': ' + this.data.mwVersion + ' ' )
+                               .append( $( '<a href="//www.mediawiki.org/">MediaWiki</a>' ) )
+                               .append( document.createTextNode( ': ' + this.data.mwVersion + ' ' ) )
                                .append( gitInfo );
 
                        if ( this.data.gitBranch !== false ) {
                                }
 
                                $( '<div>' )
-                                       .attr({
-                                               'class': 'mw-debug-pane',
+                                       .prop({
+                                               className: 'mw-debug-pane',
                                                id: 'mw-debug-pane-' + id
                                        })
                                        .append( panes[id] )
 
                        $table = $( '<table id="mw-debug-console">' );
 
-                       $('<colgroup>').css( 'width', /*padding=*/20 + ( 10 * /*fontSize*/11 ) ).appendTo( $table );
-                       $('<colgroup>').appendTo( $table );
-                       $('<colgroup>').css( 'width', 350 ).appendTo( $table );
+                       $( '<colgroup>' ).css( 'width', /* padding = */ 20 + ( 10 * /* fontSize = */ 11 ) ).appendTo( $table );
+                       $( '<colgroup>' ).appendTo( $table );
+                       $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
 
 
                        entryTypeText = function( entryType ) {
                                $( '<tr>' )
                                        .append( $( '<td>' )
                                                .text( entry.typeText )
-                                               .attr( 'class', 'mw-debug-console-' + entry.type )
+                                               .addClass( 'mw-debug-console-' + entry.type )
                                        )
                                        .append( $( '<td>' ).html( entry.msg ) )
                                        .append( $( '<td>' ).text( entry.caller ) )
                        $table = $( '<table id="mw-debug-querylist"></table>' );
 
                        $( '<tr>' )
-                               .append( $('<th>#</th>').css( 'width', '4em' )    )
-                               .append( $('<th>SQL</th>') )
-                               .append( $('<th>Time</th>').css( 'width', '8em'  ) )
-                               .append( $('<th>Call</th>').css( 'width', '18em' ) )
+                               .append( $( '<th>#</th>' ).css( 'width', '4em' )    )
+                               .append( $( '<th>SQL</th>' ) )
+                               .append( $( '<th>Time</th>' ).css( 'width', '8em'  ) )
+                               .append( $( '<th>Call</th>' ).css( 'width', '18em' ) )
                        .appendTo( $table );
 
                        for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
                        for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
                                line = this.data.debugLog[i];
                                $( '<li>' )
-                                       .html( mw.html.escape( line ).replace( /\n/g, "<br />\n" ) )
+                                       .html( mw.html.escape( line ).replace( /\n/g, '<br />\n' ) )
                                        .appendTo( $list );
                        }
 
index 9ce8305..4ea1a88 100644 (file)
@@ -33,7 +33,8 @@
                // If there is no console, use our own log box
                mw.loader.using( 'jquery.footHovzer', function () {
 
-                       var     d = new Date(),
+                       var     hovzer,
+                               d = new Date(),
                                // Create HH:MM:SS.MIL timestamp
                                time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
                                 ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
@@ -48,7 +49,7 @@
                                                backgroundColor: 'white',
                                                borderTop: 'solid 2px #ADADAD'
                                        } );
-                               var hovzer = $.getFootHovzer();
+                               hovzer = $.getFootHovzer();
                                hovzer.$.append( $log );
                                hovzer.update();
                        }
index b5f124b..5c5c87e 100644 (file)
@@ -8,11 +8,12 @@
         * User object
         */
        function User( options, tokens ) {
+               var user, callbacks;
 
                /* Private Members */
 
-               var that = this;
-               var callbacks = {};
+               user = this;
+               callbacks = {};
 
                /**
                 * Gets the current user's groups or rights.
                 * @return String: Random set of 32 alpha-numeric characters
                 */
                function generateId() {
-                       var id = '';
-                       var seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
-                       for ( var i = 0, r; i < 32; i++ ) {
+                       var i, r,
+                               id = '',
+                               seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+                       for ( i = 0; i < 32; i++ ) {
                                r = Math.floor( Math.random() * seed.length );
                                id += seed.substring( r, r + 1 );
                        }
                 * @return Boolean
                 */
                this.isAnon = function () {
-                       return that.getName() === null;
+                       return user.getName() === null;
                };
 
                /**
                 * @deprecated since 1.20 use mw.user.isAnon() instead
                 */
                this.anonymous = function () {
-                       return that.isAnon();
+                       return user.isAnon();
                };
 
                /**
                 * @return String: User name or random session ID
                 */
                this.id = function() {
-                       var name = that.getName();
+                       var id,
+                               name = user.getName();
                        if ( name ) {
                                return name;
                        }
-                       var id = $.cookie( 'mediaWiki.user.id' );
+                       id = $.cookie( 'mediaWiki.user.id' );
                        if ( typeof id === 'undefined' || id === null ) {
                                id = generateId();
                        }
                 *     } );
                 */
                this.bucket = function ( key, options ) {
+                       var cookie, parts, version, bucket,
+                               range, k, rand, total;
+
                        options = $.extend( {
-                               'buckets': {},
-                               'version': 0,
-                               'tracked': false,
-                               'expires': 30
+                               buckets: {},
+                               version: 0,
+                               tracked: false,
+                               expires: 30
                        }, options || {} );
-                       var cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
-                       var bucket = null;
-                       var version = 0;
+
+                       cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
+
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
                        if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
-                               var parts = cookie.split( ':' );
+                               parts = cookie.split( ':' );
                                if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
                                        version = Number( parts[0] );
                                        bucket = String( parts[1] );
                                }
                        }
-                       if ( bucket === null ) {
+                       if ( bucket === undefined ) {
                                if ( !$.isPlainObject( options.buckets ) ) {
                                        throw 'Invalid buckets error. Object expected for options.buckets.';
                                }
                                version = Number( options.version );
                                // Find range
-                               var     range = 0, k;
+                               range = 0;
                                for ( k in options.buckets ) {
                                        range += options.buckets[k];
                                }
                                // Select random value within range
-                               var rand = Math.random() * range;
+                               rand = Math.random() * range;
                                // Determine which bucket the value landed in
-                               var total = 0;
+                               total = 0;
                                for ( k in options.buckets ) {
                                        bucket = k;
                                        total += options.buckets[k];
index e0a3c00..c88272d 100644 (file)
 /**
  * Live preview script for MediaWiki
  */
-(function( $ ) {
-       window.doLivePreview = function( e ) {
-               var previewShowing = false;
-
+( function( mw, $ ) {
+       var doLivePreview = function( e ) {
                e.preventDefault();
 
                $( mw ).trigger( 'LivePreviewPrepare' );
 
                var $wikiPreview = $( '#wikiPreview' );
 
-               $( '#mw-content-text' ).css( 'position', 'relative' );
-
-               if ( $wikiPreview.is( ':visible' ) ) {
-                       previewShowing = true;
+               // this needs to be checked before we unconditionally show the preview
+               var overlaySpinner = false;
+               if ( $wikiPreview.is( ':visible' ) || $( '.mw-newarticletext:visible' ).length > 0 ) {
+                       overlaySpinner = true;
                }
 
-               // show #wikiPreview if it's hidden (if it is hidden, it's also empty, so nothing changes in the rendering)
-               // to be able to scroll to it
+               // show #wikiPreview if it's hidden to be able to scroll to it
+               // (if it is hidden, it's also empty, so nothing changes in the rendering)
                $wikiPreview.show();
-
-               // Jump to where the preview will appear
+               // jump to where the preview will appear
                $wikiPreview[0].scrollIntoView();
 
-               var postData = $('#editform').formToArray(); // formToArray: from jquery.form
-               postData.push( { 'name' : e.target.name, 'value' : '1' } );
-
-               // Hide active diff, used templates, old preview if shown
-               var copyElements = ['#wikiPreview', '#wikiDiff', '.templatesUsed', '.hiddencats',
-                                                       '#catlinks', '#p-lang', '.mw-summary-preview'];
-               var copySelector = copyElements.join(',');
+               // list of elements that will be loaded from the preview page
+               // elements absent in the preview page (such as .mw-newarticletext) will be cleared using .empty()
+               var copySelectors = [
+                       '#wikiPreview', '#wikiDiff', '#catlinks', '.hiddencats', '#p-lang', // the meat
+                       '.templatesUsed', '.mw-summary-preview', // editing-related
+                       '.mw-newarticletext' // it is not shown during normal preview, and looks weird with throbber overlaid
+               ];
+               var $copyElements = $( copySelectors.join( ',' ) );
 
-               $.each( copyElements, function( k, v ) {
-                       $( v ).fadeTo( 'fast', 0.4 );
-               } );
+               var $loadSpinner = $( '<div>' ).addClass( 'mw-ajax-loader' );
+               $loadSpinner.css( 'top', '0' ); // move away from header (default is -16px)
 
-               // Display a loading graphic
-               var loadSpinner = $('<div class="mw-ajax-loader"/>');
-               // Move away from header (default is -16px)
-               loadSpinner.css( 'top', '0' );
+               // If the preview is already visible, overlay the spinner on top of it.
+               if ( overlaySpinner ) {
+                       $( '#mw-content-text' ).css( 'position', 'relative' ); // FIXME this seems like a bad idea
 
-               // If the preview is already showing, overlay the spinner on top of it.
-               if ( previewShowing ) {
-                       loadSpinner.css( {
+                       $loadSpinner.css( {
                                'position': 'absolute',
                                'z-index': '3',
                                'left': '50%',
                                'margin-left': '-16px'
                        } );
                }
-               $wikiPreview.before( loadSpinner );
 
-               var page = $('<div/>');
-               var target = $('#editform').attr('action');
+               // fade out the elements and display the throbber
+               $( '#mw-content-text' ).prepend( $loadSpinner );
+               // we can't use fadeTo because it calls show(), and we might want to keep some elements hidden
+               // (e.g. empty #catlinks)
+               $copyElements.animate( { 'opacity': 0.4 }, 'fast' );
 
-               if ( !target ) {
-                       target = window.location.href;
-               }
+               var $previewDataHolder = $( '<div>' );
+               var target = $( '#editform' ).attr( 'action' ) || window.location.href;
 
-               page.load( target + ' ' + copySelector, postData,
-                       function() {
-
-                               for( var i=0; i<copyElements.length; ++i) {
-                                       // For all the specified elements, find the elements in the loaded page
-                                       //  and the real page, empty the element in the real page, and fill it
-                                       //  with the content of the loaded page
-                                       var copyContent = page.find( copyElements[i] ).contents();
-                                       $(copyElements[i]).empty().append( copyContent );
-                                       var newClasses = page.find( copyElements[i] ).prop('class');
-                                       $(copyElements[i]).prop( 'class', newClasses );
-                               }
-
-                               $.each( copyElements, function( k, v ) {
-                                       // Don't belligerently show elements that are supposed to be hidden
-                                       $( v ).fadeTo( 'fast', 1, function() {
-                                               $( this ).css( 'display', '' );
-                                       } );
-                               } );
-
-                               loadSpinner.remove();
-
-                               $( mw ).trigger( 'LivePreviewDone', [copyElements] );
-                       } );
+               // gather all the data from the form
+               var postData = $( '#editform' ).formToArray(); // formToArray: from jquery.form
+               postData.push( { 'name' : e.target.name, 'value' : '1' } );
+
+               // load new preview data
+               // FIXME this should use the action=parse API instead of loading the entire page
+               $previewDataHolder.load( target + ' ' + copySelectors.join( ',' ), postData, function() {
+                       // Copy the contents of the specified elements from the loaded page to the real page.
+                       // Also copy their class attributes.
+                       for ( var i = 0; i < copySelectors.length; i++ ) {
+                               var $from = $previewDataHolder.find( copySelectors[i] );
+                               var $to = $( copySelectors[i] );
+
+                               $to.empty().append( $from.contents() );
+                               $to.attr( 'class', $from.attr( 'class' ) );
+                       }
+
+                       $loadSpinner.remove();
+                       $copyElements.animate( { 'opacity': 1 }, 'fast' );
+
+                       $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
+               } );
        };
 
-       $(document).ready( function() {
-               // construct space for interwiki links if missing
-               // (it is usually not shown when action=edit, but shown if action=submit)
+       $( document ).ready( function() {
+               // construct the elements we need if they are missing (usually when action=edit)
+               // we don't need to hide them, because they are empty when created
+
+               // interwiki links
                if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
-                       // we need not hide this, because it's empty anyway
                        $( '#p-tb' ).after( $( '<div>' ).attr( 'id', 'p-lang' ) );
                }
 
-               // construct space for summary preview if missing
+               // summary preview
                if ( $( '.mw-summary-preview' ).length === 0 ) {
                        $( '.editCheckboxes' ).before( $( '<div>' ).addClass( 'mw-summary-preview' ) );
                }
 
-               // construct space for diff if missing. also load diff styles.
+               // diff
                if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
                        $( '#wikiPreview' ).after( $( '<div>' ).attr( 'id', 'wikiDiff' ) );
-                       // diff styles are by default only loaded when needed
-                       // if there was no diff container, we can expect the styles not to be there either
-                       mw.loader.load( 'mediawiki.action.history.diff' );
                }
 
+               // diff styles are usually only loaded during, well, diff, and we might need them
+               // (mw.loader takes care of stuff if they happen to be loaded already)
+               mw.loader.load( 'mediawiki.action.history.diff' );
+
                $( '#wpPreview, #wpDiff' ).click( doLivePreview );
        } );
-}) ( jQuery );
+} )( mediaWiki, jQuery );
index 453e88a..c418116 100644 (file)
@@ -10343,6 +10343,33 @@ abc
 </p>
 !! end
 
+!!test
+Bug 34939 - Case insensitive link parsing ([HttP://])
+!! input
+[HttP://MediaWiki.Org/]
+!! result
+<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
+</p>
+!! end
+
+!!test
+Bug 34939 - Case insensitive link parsing ([HttP:// title])
+!! input
+[HttP://MediaWiki.Org/ MediaWiki]
+!! result
+<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
+</p>
+!! end
+
+!!test
+Bug 34939 - Case insensitive link parsing (HttP://)
+!! input
+HttP://MediaWiki.Org/
+!! result
+<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
+</p>
+!! end
+
 
 TODO:
 more images
index 49c2a70..bfad334 100644 (file)
@@ -441,6 +441,25 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * Put each HTML element on its own line and then equals() the results
+        *
+        * Use for nicely formatting of PHPUnit diff output when comparing very
+        * simple HTML
+        *
+        * @since 1.20
+        *
+        * @param String $expected HTML on oneline
+        * @param String $actual HTML on oneline
+        * @param String $msg Optional message
+        */
+       protected function assertHTMLEquals( $expected, $actual, $msg='' ) {
+               $expected = str_replace( '>', ">\n", $expected );
+               $actual   = str_replace( '>', ">\n", $actual   );
+
+               $this->assertEquals( $expected, $actual, $msg );
+       }
+
        /**
         * Does an associative sort that works for objects.
         *
index 1c8be5f..f61652d 100644 (file)
@@ -77,4 +77,79 @@ class TitleTest extends MediaWikiTestCase {
        }
        
        
+       /**
+        * @dataProvider provideCasesForGetpageviewlanguage
+        */
+       function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg='' ) {
+               // Save globals
+               global $wgContLang, $wgLang, $wgAllowUserJs, $wgLanguageCode, $wgDefaultLanguageVariant;
+               $save['wgContLang']               = $wgContLang;
+               $save['wgLang']                   = $wgLang;
+               $save['wgAllowUserJs']            = $wgAllowUserJs;
+               $save['wgLanguageCode']           = $wgLanguageCode;
+               $save['wgDefaultLanguageVariant'] = $wgDefaultLanguageVariant;
+
+               // Setup test environnement:
+               $wgContLang = Language::factory( $contLang );
+               $wgLang     = Language::factory( $lang );
+               # To test out .js titles:
+               $wgAllowUserJs = true;
+               $wgLanguageCode = $contLang;
+               $wgDefaultLanguageVariant = $variant;
+
+               $title = Title::newFromText( $titleText );
+               $this->assertInstanceOf( 'Title', $title,
+                       "Test must be passed a valid title text, you gave '$titleText'"
+               );
+               $this->assertEquals( $expected,
+                       $title->getPageViewLanguage()->getCode(),
+                       $msg
+               );
+
+               // Restore globals
+               $wgContLang               = $save['wgContLang'];
+               $wgLang                   = $save['wgLang'];
+               $wgAllowUserJs            = $save['wgAllowUserJs'];
+               $wgLanguageCode           = $save['wgLanguageCode'];
+               $wgDefaultLanguageVariant = $save['wgDefaultLanguageVariant'];
+       }
+
+       function provideCasesForGetpageviewlanguage() {
+               # Format:
+               # - expected
+               # - Title name
+               # - wgContLang (expected in most case)
+               # - wgLang (on some specific pages)
+               # - wgDefaultLanguageVariant
+               # - Optional message
+               return array(
+                       array( 'fr', 'Main_page', 'fr', 'fr', false ),
+                       array( 'es', 'Main_page', 'es', 'zh-tw', false ),
+                       array( 'zh', 'Main_page', 'zh', 'zh-tw', false ),
+
+                       array( 'es',    'Main_page',                 'es', 'zh-tw', 'zh-cn' ),
+                       array( 'es',    'MediaWiki:About',           'es', 'zh-tw', 'zh-cn' ),
+                       array( 'es',    'MediaWiki:About/',          'es', 'zh-tw', 'zh-cn' ),
+                       array( 'de',    'MediaWiki:About/de',        'es', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'MediaWiki:Common.js',       'es', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'MediaWiki:Common.css',      'es', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'User:JohnDoe/Common.js',    'es', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'User:JohnDoe/Monobook.css', 'es', 'zh-tw', 'zh-cn' ),
+
+                       array( 'zh-cn', 'Main_page',                 'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'zh',    'MediaWiki:About',           'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'zh',    'MediaWiki:About/',          'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'de',    'MediaWiki:About/de',        'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'zh-cn', 'MediaWiki:About/zh-cn',     'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'zh-tw', 'MediaWiki:About/zh-tw',     'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'MediaWiki:Common.js',       'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'MediaWiki:Common.css',      'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'User:JohnDoe/Common.js',    'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'en',    'User:JohnDoe/Monobook.css', 'zh', 'zh-tw', 'zh-cn' ),
+
+                       array( 'zh-tw', 'Special:NewPages',       'es', 'zh-tw', 'zh-cn' ),
+                       array( 'zh-tw', 'Special:NewPages',       'zh', 'zh-tw', 'zh-cn' ),
+
+               );
+       }
 }
index f669b26..a0bbadf 100644 (file)
@@ -250,9 +250,9 @@ class TextPassDumperTest extends DumpTestCase {
                        $dumper->stderr = $stderr;
 
                        // The actual dump and taking time
-                       $ts_before = wfTime();
+                       $ts_before = microtime( true );
                        $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
-                       $ts_after = wfTime();
+                       $ts_after = microtime( true );
                        $lastDuration = $ts_after - $ts_before;
 
                        // Handling increasing the iteration count for the stubs
index 8307b48..8fc868d 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -205,27 +205,34 @@ function wfStreamThumb( array $params ) {
                }
        }
 
+       $thumbName = $img->thumbName( $params );
+       if ( !strlen( $thumbName ) ) { // invalid params?
+               wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+               wfProfileOut( __METHOD__ );
+               return;
+       }
+
+       $disposition = $img->getThumbDisposition( $thumbName );
+       $headers[] = "Content-Disposition: $disposition";
+
        // Stream the file if it exists already...
        try {
-               $thumbName = $img->thumbName( $params );
-               if ( strlen( $thumbName ) ) { // valid params?
-                       // For 404 handled thumbnails, we only use the the base name of the URI
-                       // for the thumb params and the parent directory for the source file name.
-                       // Check that the zone relative path matches up so squid caches won't pick
-                       // up thumbs that would not be purged on source file deletion (bug 34231).
-                       if ( isset( $params['rel404'] ) // thumbnail was handled via 404
-                               && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) )
-                       {
-                               wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
-                               wfProfileOut( __METHOD__ );
-                               return;
-                       }
-                       $thumbPath = $img->getThumbPath( $thumbName );
-                       if ( $img->getRepo()->fileExists( $thumbPath ) ) {
-                               $img->getRepo()->streamFile( $thumbPath, $headers );
-                               wfProfileOut( __METHOD__ );
-                               return;
-                       }
+               // For 404 handled thumbnails, we only use the the base name of the URI
+               // for the thumb params and the parent directory for the source file name.
+               // Check that the zone relative path matches up so squid caches won't pick
+               // up thumbs that would not be purged on source file deletion (bug 34231).
+               if ( isset( $params['rel404'] ) // thumbnail was handled via 404
+                       && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) )
+               {
+                       wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+               $thumbPath = $img->getThumbPath( $thumbName );
+               if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+                       $img->getRepo()->streamFile( $thumbPath, $headers );
+                       wfProfileOut( __METHOD__ );
+                       return;
                }
        } catch ( MWException $e ) {
                wfThumbError( 500, $e->getHTML() );